OmniAICreator/Qiita-1.07M huggingface dataset:
MicrosoftADの構築と運用開始


#■ActiveDirectoryの構築
新規サーバ構築に伴ってADを構築することになったのですが、思った以上にわからないことが多かったのでメモとして残します。

#####◇現状
・資産管理ソフト(SKYSEAやLanScopeCat等)でクライアントPC(約350台)を管理
・従業員はオンラインストレージにデータを入れており、ファイルサーバは無し
・下記の課題は感じつつも、AD導入の大変さを考えると導入の優先度低い

#####◇AD導入で解決したかった課題
・クライアントPCのOSパスワードが変更できない
・データ容量が増えてきたので、サブストレージとしてファイルサーバ構築を検討
　　※オンラインストレージを増量したいが、コストの問題でファイルサーバが現実的
・Saasが増えてきたのでシングルサインオンしたい

####◇悩んだ点
・ActiveDirectoryが基本過ぎるのか、初心者向け情報が意外と少ない
・AWS MicrosoftAD構築情報は多く見つけられたが、基本的なADの運用方法を見つけるのに苦労
・AWS MicrosoftADで必要となるDHCPオプションセットがVPC単位でしか適用できない
　　※ひとつのVPCで運用していたので、既存環境への影響調査に時間がかかった
・AWS MicrosoftADは直接操作できず、「管理ツールを入れたサーバが必要」がわかるまで時間がかかった

####◇結論
最終的に下記の2記事だけで構築できることが理解できた。


https://dev.classmethod.jp/articles/aws-directory-service-microsoft-ad/


https://blog.serverworks.co.jp/managed_ad_login



#■ActiveDirectoryのポリシー設定
####◇ユーザーアカウントの作成

https://win2012r2.com/2020/04/05/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%92ad%E3%81%AB%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B/

####◇ユーザーアカウントにログイン権限を付与(RDP接続できるように)する

https://win2012r2.com/2020/04/05/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AB%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E6%A8%A9%E9%99%90%E3%82%92%E4%BB%98%E4%B8%8E%E3%81%99%E3%82%8B/


####◇パスワードポリシー設定
(下記ページの[Fine-Grained Password Policiesの使い方]を参照)

https://dev.classmethod.jp/articles/aws-directory-service-microsoft-ad-password-policy/


####◇グループポリシー作成

https://ittrip.xyz/soft/windows/how-to-use-gpo

https://ittrip.xyz/active-directory/best-gpo

####◇グループポリシーが適用されない場合の対応方法

https://soma-engineering.com/server/activedirectory/check-applied-gpo/2018/12/08/

https://soma-engineering.com/server/activedirectory/timing-apply-gpo/2021/11/13/

ログオンスクリプトが上手く動作しない場合、クライアント側で「gpresult /z」を実行します。
これで適用されたGPOの情報や、実行結果を確認することが出来ます。

```
gpresult /z
```

強制的にポリシーを適用する場合は「gpupdate /force」を実行します。

```
gpupdate /force
```

#■コマンドライン

####◇コマンドラインからユーザーを追加したい
サンプルコマンド

```
dsadd user "CN= ,OU= ,OU= ,DC= DC= ,DC= " -samid hogehoge -upn hogehoge@fugafuga.co.jp -pwd Password -display hogehoge
```

"CN= ,OU= ,OU= ,DC= DC= ,DC= "の部分に何を入れれば良いのかわからずかなり悩んだ。結果としてADに参加しているPCにて、下記のコマンドを実行すると、

```
gpresult /R
```

下記の通り、"CN= ,OU= ,OU= ,DC= DC= ,DC= "の部分に入力するべき内容が表示できることが判明した。
![2021-12-02_18h28_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359386/fd69e874-fa0c-ce11-d34f-d2d2b53b96e7.png)

上記の通り、サンプルコマンドに"CN= ,OU= ,OU= ,DC= DC= ,DC= "の部分を貼り付ければコマンド実行可能。

####◇コマンドラインから権限を付与(グループに所属)したい
例えば、user1にadministrators権限を付与したい場合は、そのサーバにログインして下記コマンドで実行する。

```
net localgroup administrators user1 /add
```
【Docker × CentOS】ipコマンドが使えない時の対処法〜その他ネットワーク関連コマンドも〜


#前提条件

**OS**
 MacOS Monterey 12.0.1
**CPU**
 Apple M1(arm64) 
**Docker**
Docker Desktop 4.2.0 (70708) 
**CentOS**
CentOS Linux release 7.9.2009 (AltArch)

#やりたいこと

Dockerで構築したCentOS７の環境で、ネットワーク周りの確認ができるipコマンドを実行したい

#つまづいた話

ipコマンドを実行しようとしたら、そんなものは無いと怒られる

```
[root@0a412e1af0a1 /]# ip addr 
bash: ip: command not found
```
単純に↓こんなのでいいかなとも思いましたが、ダメみたい。。。

```
[root@0a412e1af0a1 /]# yum install ip
```

```
# 中略
No package ip available.
Error: Nothing to do
```

どうやらDockerの公式イメージなので、パッケージには最低限の内容しか入っていないようです。


#解決策

「iproute」をインストール

※ちなみに、「net-tools」というやつは、今はもう非推奨とのことです。

```
[root@0a412e1af0a1 /]# yum install iproute
```

#ipコマンドを試してみる

**ip addr [IP ADDRESS]**
　インターフースの状態やIPアドレスを表示

```
[root@0a412e1af0a1 /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1000
    link/tunnel6 :: brd ::
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
```


**ip route**
　ルーティングテーブルを表示

```
[root@0a412e1af0a1 /]# ip route
default via 172.17.0.1 dev eth0 
172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.3 
```

#おまけ（pingコマンド）

**ping -c パケット送信回数 n.n.n.n（送信先IPアドレス）**

ネットワークの通信確認コマンドです。
　※　cオプションで回数を設定しないと、パケットを送り続けることになってしまいます。


```
[root@0a412e1af0a1 /]# ping -c 3 192.168.73.92
PING 192.168.73.92 (192.168.73.92) 56(84) bytes of data.
64 bytes from 192.168.73.92: icmp_seq=1 ttl=37 time=1.44 ms
64 bytes from 192.168.73.92: icmp_seq=2 ttl=37 time=1.29 ms
64 bytes from 192.168.73.92: icmp_seq=3 ttl=37 time=1.26 ms
```
自分のスマホでテザリング接続していたので、そのネットワークのIPアドレスに向けてpingを打ってみました。パケット送信回数は３回。
（IPアドレスは、Mac右上のバーから「”ネットワーク”環境設定」を開くと見れます）
[Oracle Cloud] ロード・バランサでWAF適用可能に

## はじめに
こんにちわ
いつもの新機能ハイライトからのpickup記事です
今回はFLB+WAFです

Oracle Cloud Infrastructure 新機能ハイライト
https://blogs.oracle.com/oracle4engineer/post/oracle-cloud-infrastructure-new-feature-highlight-20211104

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/5ff97e7b-72be-e6f1-6a40-b8f8c5d6fd59.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/bf1caee9-9b33-d262-a7db-9a80c65f584b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/59e49fee-f319-5c88-7b8e-de39bbaa12a7.png)

ではみていきましょう


## 手順

手順としてはWAFの作成（WAF Policy作成）にてFLBを紐づける流れになります



WAFの画面です
WAFポリシーの作成をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/c1629b26-3507-410e-93da-b9b352c10c40.png)



WAFポリシーの作成手順については下記も参照ください
https://docs.oracle.com/ja-jp/iaas/Content/WAF/Policies/waf-policy_management.htm#CreateWAFPolicy

今回のトピックは、5.強制ポイントの選択 になります


強制ポイントの選択 画面
ファイアウォールの追加に、ロードバランサが指定できるようになっています
非常にシンプルですね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/c3fe64e2-b978-9fe8-8688-3b1b49543468.png)



作成後のWAFポリシーのファイアウォールを表示します
強制ポイントにロードバランサが指定できていますね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/51125715-608a-dd78-5fbe-26974ff89f6e.png)



WAF,LB,WEB,AP,DBは一般的な構造の為、
このように紐づけも簡単に構築できるのはうれしいですね

ありがとうございました
[JavaScript] 乱数の生成方法

JavaScriptで、乱数を使用したので乱数の生成方法を簡単にまとめておく。

#乱数の生成
JavaScriptで乱数を生成する場合、Mathオブジェクトの```Math.random()```を使用する。
```Math.random()```は、***0.0以上1.0未満***の範囲での浮動小数点数を返す。基本的な乱数生成の書き方は以下となる。

```javascript
const random = Math.random();
console.log(random);    // 0.9986124832248591
```
ここで、JavaScriptの```Math.random()```は、C言語とは異なり***シード値を指定しなくても実行ごとに異なる値が生成される***。
さらに、乱数の値の範囲指定や整数値の乱数を生成する方法についてまとめておく。

### 値の範囲を指定して乱数を生成
ある範囲内の値（min以上max未満）で乱数を生成したい場合は、以下のように書ける。

```javascript
// min = 3, max=5 の場合
const random = Math.random()*(max - min) + min;
console.log(random);    // 4.186149518789809
```

### 整数の乱数を生成
乱数の範囲指定に加えて、生成される乱数の値が整数になるようにする場合は、```Math.floor()```を使用する。```Math.floor()```は、引数の値以下で最大の整数を返すメソッドである。これを用いて以下のように書くことができる。

```javascript
// min = 5, max=30 の場合
const random = Math.floor(Math.random()*(max - min) + min);
console.log(random);    // 17
```
FirebaseCrashlyticsのiOSで「dSYMが不足している」というエラーが発生した場合のトラブルシューティング

# 概要
FirebaseCrashlyticsと連携していて、管理コンソール上で「dSYMが不足している」という文言が表記された場合のトラブルシューティングです。

↓参考画像
![without_dsym.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264889/e741f8a3-c207-5925-e0d9-8cc418ac35c6.png)

# 結論
XCodeで`/ios/Runner.xcworkspace`を開き、`debug information format` を `DWARF` から `DWARF with dSYM File` に変更します。
![スクリーンショット 2021-12-02 15.18.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264889/a266f08d-a880-f6a1-6587-e5226a6c31bd.png)

# 参考
### dSYMが必要な理由
Firebaseのドキュメントより以下引用。

> Firebase Crashlytics はデバッグ シンボル（dSYM）ファイルを自動的に処理して、難読化解除された（人が読める形式の）クラッシュ レポートを生成します。
わずかながらも、dSYM のアップロードが失敗する状況がいくつかあります。
多くの場合、dSYM ファイルが欠落する理由は Xcode がファイルを生成していないことにあります。アップロードが失敗すると、Crashlytics は Firebase コンソールに「不足している dSYM」というアラートを表示します。

ref: https://firebase.google.com/docs/crashlytics/get-deobfuscated-reports?hl=ja&platform=ios

### 上記のようにビルド設定を変更しても「dSYMが不足しているエラー」が発生した場合
手動でdSYMファイルをfirebaseにアップロードすることで解決出来るらしく、App Store ConnectからdSYMファイルをダウンロードしてアップロードできるそうです。

ref:
https://firebase.google.com/docs/crashlytics/get-deobfuscated-reports?hl=ja&platform=ios
https://dev.classmethod.jp/articles/ios-firebase-crashlytics-upload-dsym/
Ruby biz Grand prix 2021のファイナリストに選ばれた

[Catallaxy Advent Calendar](https://qiita.com/advent-calendar/2021/catallaxy) 1日目を担当します、エンジニア1号です。

[Ruby biz Grand prix 2021（Ruby bizグランプリ2021）](https://rubybiz.jp/)へエントリーして、ファイナリストに選ばれましたので、今日はそのことに触れてみたいと思います。

## Catallaxyとは
金属加工プラットフォームを提供する2015年創業スタートアップになります。2018年に現在の業態にピボットしたのち、2021年3月にはシリーズAとして約4.1億円を調達しており、現在までに累計約8億円の資金調達をしております。従業員数26名のうち、エンジニア10名、デザイナー1名、エンジニアの業務委託・インターン数名のメンバー構成になっており（2021年9月応募時点）、約半数がプロダクトに関わる業務に携わっています。

## Ruby biz Grand prix
2015年からRuby bizグランプリ実行委員会が開催するRubyを活用したビジネスを表彰するもので、『Rubyを使った自社商品・サービスなどで、Rubyの特徴を活かし、「新規性」「独創性」「市場性」「将来性」に富んでおり、今後継続的に発展が期待できるビジネス事例』として、当社は金属加工プラットフォームMitsuriとその周辺プロダクトで応募しました。

過去多くのpre-IPO/post-IPOのスタートアップが受賞されていますので、その名誉ある賞を受賞したい。その一心で応募しました。

## 応募までのみちのり
要綱に書かれた通り、Wordベースの所定応募書式があり、そのページ数は10ページに及びました。それ以外に補足資料として追加提出できました。
Ruby 100%でRuby biz Grand prixの存在を知っているメンバーはいましたが、会社としてこのグランプリに応募するかは検討委員会を立ち上げて検討を進めました。デイリーで組織全体のことを話すようにしているため、応募するかどうかの検討するまでの意思決定は即座にできたようです。
今回の2021が初めての応募だったのですが、実は主催事務局から2020年にも郵送で案内いただいていました。その際は社内のエンジニアリソースが枯渇しており、応募に向けて進められることはなかったようです。
COVID-19の影響で2020年4月からフルリモートとなっていた当社ではエンジニアは全員リモートワークしており、気付いた人がSlackに写真を上げた時の社内のリアクションです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345141/8d58246b-3850-55fc-0ee8-7c7ea2fd38ff.png" width="50%">

## 書類の記載
A4 10枚にもわたる所定の応募書式を埋めていく作業は大変でした。特に、アーキテクチャ図や、株主・株主候補以外に開示するビジネスの指標はまだ整っておらず、ビジネスの指標に至っては収集・整理・開示確認を行う必要がありました。
技術面の十分な深さを説明するだけでなく、Rubyをはじめとする技術を利用してビジネスとして成り立たせることをも説明的に記載する必要があり、緊張のある取り組みでしたが、時間的な制約も多く、集中して取り組めたのはよかったかなと思います。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345141/fef0e7f6-fc78-ea84-d100-a2818db54ade.png)

## 技術的な深堀
今日の記事ではRuby biz Grand prix 2021への応募そのものについて記述しましたが、やはりRubyを含めた技術が他社の応募との差別化要因と理解しています。そのあたりもCatallaxy Advent Calendar 2021の中で他の執筆者が触れていってもらえるといいなぁと期待しています。

## 最終結果
[RubyWorld Conference 2021](https://2021.rubyworld-conf.org/ja/)に併設されて行われる、12月15日の表彰式でなんらかの賞にCatallaxyが表彰されるかもしれません。受賞した際は[Catallaxy Advent Calendar](https://qiita.com/advent-calendar/2021/catallaxy)でもお知らせしますので、定期的にチェックいただければと思います。

未来の工場をつくるCatallaxyではRubyを含む幅広い技術経験のあるエンジニア採用を強化しております。
https://open.talentio.com/r/1/c/catallaxy/homes/2947
【Android】PlayStore遷移時のActivityNotFoundException

クラッシュリティクスにこんな報告が上がってきました。

```
Fatal Exception: android.content.ActivityNotFoundException
No Activity found to handle Intent { act=android.intent.action.VIEW dat=https://play.google.com/... pkg=com.android.vending }
```

PlayStoreへのIntentが失敗している？
中華スマホとか、Kindleならわかるが対象端末は普通にキャリアで売られているものばかり。。

## 問題はこれかも

![Screenshot 2021-12-02 135349.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429030/3fadf9c1-f1f0-0d2f-6c91-f7375e3ceeaa.jpeg)

Disabledにして、強制アップデートダイアログを叩いてストア遷移しようとすると落ちました。
省電力アプリとかでアプリを停止させられてしまうこともあるんだろうか・・・？
すっきりjavaでわからなかったとこ５−１３

#戻り値が配列の時
```java
public class Main {

  public static int[] makeArray(int size) {
    //int[]で配列を作る
    　　int[] newArray = new int[size];
    　　for (int i = 0; i < newArray.length; i++ ) {
      　newArray[i] = i;
    　　}
    　return newArray;
  }

  public static void main(String[] args) {
//makeArray(3)を実行して
    int[] array = makeArray(3);
//結果を　int i をarrayに変換する
    for (int i : array) {
      System.out.println(i);
    }
  }

}
```
[Oracle Cloud][Networking] ネットワーク・ビジュアライザーのupdate

## はじめに
こんにちわ
いつもの新機能ハイライトからのpickup記事です
今回はネットワーク・ビジュアライザーの機能updateです

Oracle Cloud Infrastructure 新機能ハイライト - 2021/12/01↓
https://blogs.oracle.com/oracle4engineer/post/oracle-cloud-infrastructure-new-feature-highlight-20211201

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/b3006112-19e9-fb10-f0ab-112304ac98c9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/f3c165fc-4ce2-6bc5-dbc3-4fc19f100371.png)

ではみていきましょう


## 手順

VCNの画面です
ネットワーク・ビジュアライザをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/9821df8f-d0e3-b4f8-9076-d1d0529fe8ab.png)



ネットワーク・ビジュアライザ - リージョナル・ルーティング・マップです
図中のVCNをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/44467f2c-c9f2-d476-0768-7822c3eb1f93.png)



リソース・マップに、

- VCNルーティング・マップの表示
- VCNセキュリティ・マップの表示

があります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/84a25f31-b132-a8ec-48e6-77afca5ace20.png)



ルーティング・マップ選ぶとこんな感じです
少し小さくて見にくいですねｗ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/0c6a3c9b-d7d5-8fc2-18e5-27b8a7b5cc35.png)



対象コンポーネントをクリックすると、ルーティング・サマリーが表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/42de9db4-7505-0a77-1a93-7234762a0343.png)



次にセキュリティ・マップです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/da859138-74d6-f78f-08bf-7571b392c5c9.png)



このように、セキュリティ・リストとサブネットの関連付けが分かる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/7c0a77af-4161-2015-93f6-6ba40bf5be53.png)



サブネットを選択し、サブネット・インベントリ・マップを表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/6f955362-aeec-5b68-75ce-259c9d7f7d6c.png)



ネットワークロードバランサー、ロードバランサー、コンピュート・インスタンスなどのサブネット内のリソースを表示できます
今回はインスタンス1台の為少し寂しいですね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/e9a8bc0c-94d0-8c3b-7704-ea6f20441ae3.png)



サブネット セキュリティ・マップ
リソースに関連付けられているセキュリティ・リストとネットワーク・セキュリティ・グループを確認可能です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/cce880b5-0803-a921-1572-6d3ae4a28aba.png)



煩雑になりがちなネットワーク管理ですが、こうして可視化できるのはうれしいですね
ありがとうございました
Vue.js devtoolsの使い方まとめ

###はじめに

こちらでは vue.js のdevtoolsについて使い方を簡単に解説します。

###devtoolsとは

Vue.js devtoolsは、Vue.jsの開発をサポートする <b>Chromeブラウザの拡張機能</b> になります。こちらを導入すると、consoleを開かなくてもdataの中身などを確認/編集することができる
ようになります。言い換えると、<b>デバッグしやすくなる</b>ということです。

★ devtools は以下からインストールが可能です

https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd/related?hl=ja

インストールができていれば、Vue.jsを読み込んでいるファイルをブラウザ上で開くと、Vue.js Devtoolsのアイコンがアクティブになります。また、ディベロッパーツールを開くと、vueというタブが追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017201/e587a121-c00e-4599-a07b-cb6cd5548515.png)
↑アイコンがアクティブな状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017201/aa7f7bfb-f02b-4d9e-e88c-50963f073906.png)
↑ディベロッパーツールのタブ


### devtools の主な機能

今回は主な機能を3つ紹介します。

[1.Components](#1-Components)
[2.Vuex](#2-Vuex)
[3.Events](#3-Events)

###1. Components
Components機能を使用することで、各コンポーネントの親子関係や保持しているdataの内容などを確認することが可能になります。

・操作方法は3つです。
1. ディベロッパーツールのvueタブからComponentsを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017201/fd52d020-0867-7178-26e1-5ddb0305475c.png)
2. Componentsの左下にあるselectsを選択します。
  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017201/dc2b20e0-3fde-e470-f619-4a7ca7208e76.png)
3. カーソルを任意のコンポーネントへ移動させます。

以上の操作で、任意のコンポーネントの親子関係や、保持しているdataの内容を確認することができます。

###2. Vuex
Vuex機能を使用することで、Vuex※を使用している場合、storeの中の状態を確認することが可能になります。

※Vuexとは何か-公式ドキュメントより参照

https://vuex.vuejs.org/ja/

・操作方法は２つです。
1. ディベロッパーツールのタブからVuexを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017201/c70551f5-13f1-d330-5a83-3ceadcac09c4.png)
2. ディベロッパーツール内に表示されている任意のデータを選択して内容を確認します。

以上の操作で、Vuexを使用している場合、storeの中の状態を確認することができます。

###3. Events

Events機能を使用することで、イベントがトリガーされた履歴を確認することが可能になります。

・操作方法は3つです。
1. ディベロッパーツールのタブからEventsを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017201/349cb0a2-b310-8df4-bbdb-30ad91408720.png)
2. 任意のイベントをトリガーします。※画面をスクロールするなど
3. ディベロッパーツール内に表示されている任意の履歴を選択して内容を確認します。

###まとめ

今回は、Vue.js devtools の使い方を簡単にまとめました。今後新しい使い方などを発見した際は追記します。

実際に私が使ってみた感想としては、わざわざコンソールでデータの中身を確認したりする必要がなくなり、デバッグが楽にできるなと思いました。ぜひみなさんも使ってみてください！
Bluetoothのマウスが切れる。Bluetoothの有効がオフになった時の対処方法


最近、LogicoolのBluetoothマウス(M557)を買いました。
しかしながら、どうもBluetooth接続が上手くいかず対処方法に困ったのでメモしておきます。

## 直面したトラブル・エラー

Bluetooth機能を搭載しているPCであるのに、「Bluetoothが無効です」と表示されて、有効ボタンが表示されない。Bluetoothデバイスが使用できなくなった

## 環境
- Windows10 PC
- Bluetoothマウス　Logicool M557

## 対処法
#### 1. Windowsの設定画面の左下にある [更新とセキュリティ] をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/511487/7f3046c1-507c-f546-96ea-7e605e49e8ae.png)

---

#### 2.トラブルシューティングをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/511487/6de2e061-6f18-437b-fabb-bfa2159ebf86.png)

---
####3. (2)の画面の下にある［追加のトラブルシューティング］をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/511487/47657808-3b1e-a251-9432-c8130635ed63.png)

---
####4. Bluetooth のトラブルシューティング ツールの実行をクリック


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/511487/29b5278c-895c-6cb0-13c9-adf93ac77504.png)

---
####5. トラブルシューティングが正常に行われると、Bluetoothが有効になり、マウスを利用できるようになりました！！！


---


以下の記事を参照にしました。
https://itojisan.xyz/trouble/12215
https://john-site.com/helpdesk/bluetooth-mouse-stop/
Raspberry Pi 4にUbuntu18.04 64bitを導入する

# はじめに
　ラズパイの公式からSDカードへの書き込みツールが提供されるようになり，ずいぶんと導入が楽になりました．最新版の1.6.2現在ではOSの選択肢としてUbuntuの64bit版もありますが，バージョンが20以降であり残念ながら18.04は選択肢にはありません．
　そこで本記事ではRaspberry Pi 4にUbuntu18.04の64bitを導入する手順を記します．

# 環境
・Windows 10
・Raspberry Pi Imager v1.6.2
・Raspberry Pi 4 Model B / 4GB

# Ubuntu 18.04の導入
### 1. Ubuntu18.04 のイメージを入手

https://wiki.ubuntu.com/ARM/RaspberryPi

　上記リンクの`Download`->`arm64`->`18.04.5 LTS`にあるリンクをクリックしてラズパイ用のOSイメージをダウンロードします．ダウンロードしたファイルの拡張子は`.img.xz`ですがそのままで問題ありません．

### 2. SDカードへのイメージの書き込み

　SDカードをパソコンに接続し，Raspberry Pi Imagerを起動します．`CHOOSE OS`->`Use custom`から先ほどダウンロードした`.img.xz`ファイルを選択，`CHOOSE STORAGE`から書き込み先のSDカードを選択，最後に`WRITE`を押して書き込み開始です．

# 初期設定など

　導入したUbuntu 18.04はデスクトップ環境が省かれているので接続する外部デバイスはキーボードのみで問題ありません．またここでは簡単のためネットワーク接続は有線を使用していますが，WiFiを使用する場合は別途設定が必要です（デスクトップ環境導入やWiFi設定はやる気があれば加筆予定）

### ログイン
ラズパイ本体にSDカードを挿入して起動し，ユーザー名とパスワードを入力してログインします．デフォルトでは両者とも`ubuntu`になります．（ここでパスワードを変更することを求められるので画面の指示に従って現在のパスワード（`ubuntu`）を入力後，新規のパスワードを二回入力します．）

### APTパッケージの更新

　aptコマンドでパッケージの更新を行っておきましょう．

```bash:bash
$ sudo apt update
```
を実行後

```bash:bash
$ sudo apt upgrade
```
を実行します．記事を書いた時点で300MBを超えるダウンロードがありました．気長に待ちましょう．
1TBのmicroSDはラズパイで使えるか？（結論: 使える）

年々大容量化しているmicroSD。中でも1TBは2万円台となり、利用することも現実的となってきました。
1TBのmicroSDがラズパイで使えるのかを確認したのですが、結論**使えます**。

## 確認環境

- microSD
    - SanDisk Extreme 1TB (SDSQXA1-1T00-GN6MN) ([Amazon.co.jp](https://www.amazon.co.jp/gp/product/B0892218X7/))
        - 容量=1TB、[UHSスピードクラス](https://www.green-house.co.jp/special/sd-card/)=U3
- 確認した Raspberry Pi
    - Raspberry Pi 4 model B + Raspberry Pi OS (2021-10-30)
    - Raspberry Pi 3 model B+ + Raspberry Pi OS (2021-10-30)
- Raspberry Pi OS 書き込み環境
    - Windows 10 Pro (21H1) / 富士通 LIFEBOOK WU2/C3
    - [Raspberry Pi Imager 1.6.2](https://www.raspberrypi.com/software/)
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22754/b3ab0da3-2fca-fde3-639a-c03f520b7671.png) として認識されました。

2万くらいするので、ちょっとビビります。誰かの役に立てば。

EoT
OpsRamp Curated Dashboard / Dashboard2.0について

#概要
前回[「OpsRamp 自動検知設定/監視設定について」](https://qiita.com/yusawada/private/0822e6e462acb00056b3)でOpsRamp自動検知設定を投稿しましたが、この自動検知設定によって取得した情報をダッシュボードで確認出来ます。この記事ではダッシュボードの利用方法について説明します。今回はAWS環境検知データで説明します。

#Curated Dashboard
自動検知設定が完了すると、OpsRamp側でダッシュボードのテンプレートが用意されており、そこにデータが表示されます。
メニュー
Dashboard＞Dashboard2.0に移動します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342082/bb71ebd4-6960-bd96-eb00-1439eca870a9.png" width=70%>

メニューアイコンをクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342082/cee8a945-b48a-7ad6-2c86-34da0f155ed7.png" width=50%>


「AWS Overview」をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342082/cb47830a-362c-5f68-e194-b00f15ac12bc.png" width=70%>


ダッシュボードが表示されました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342082/1556c4ee-1527-51f1-c602-36a5def87bed.png" width=100%>


#Dashboard2.0
上記のダッシュボードですが見ての通り、ところどころデータが表示されない箇所が出てくると思います。
先程のCurated Dashboard、テンプレが用意されていて、何もしなくてもデータが表示されるので便利ですが。カスタマイズが出来ません。
グラフもEC2,ELB,EBS,SQSのみですので、これでは活用できない方もいると思います。
Dashboard2.0で、同等のものをユーザが作成可能です。

先程の「AWS Overview」を選択した画面から「CREATE DASHBOARD」で作成出来ます。

各Tileを作成する際にPromQLでクエリを書いてデータを表示させます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342082/98e7ec5b-ebd1-952d-f43f-ed005734f1d1.png" width=100%>


「VISUALIZATION」でグラフのレイアウトを視覚的に変更可能です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342082/fd079832-04dd-9632-2112-eb5cbe95abec.png" width=100%>

#これやっとけばOK　ダッシュボード簡単カスタマイズ
ダッシュボードでのデータ表示方法はなんとなく理解できました。
ただ、PromQLを勉強しないと自作できないんじゃないかと思っている方も一部いらっしゃると思います。

大丈夫です。

**とりあえずそれっぽいのは簡単に作れます。**

先程のCurated Dashboardありましたよね。
そこからクエリもらってきましょう。

1, Curated Dashboardからコピーしてダッシュボードを作成。
Curated Dashboardは編集不可ですので、コピーして別のダッシュボードを作成します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342082/e6e55308-058f-48f0-6c4b-396f309c63ff.png" width=100%>

2, コピーしたダッシュボードのTileを編集する。
開きましょう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342082/b00a1753-8c6c-c497-0af5-3fd343b5c3c5.png" width=50%>

3, クエリを確認する。
今回はこの赤線部分のメトリックを変更して、グラフの表示を変更します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342082/e99a152b-00e8-24eb-430a-1288117dbcf0.png" width=100%>


4, クエリを書き換える
クエリのフィールドはドロップダウンで候補が出てくるため、対象のメトリック文字列を
ちょっとずつ文字を消していくと、メトリックの候補が表示されます。
**現在取得できているものが表示されるので、簡単に選べます。**
例えば「aws_」だけ残せば、現在検知しているAWS環境で取得できているメトリックの一覧が出てくるということです。
今回は「NetworkIn」から「NetworkPacketsIn」に変更してみます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342082/e850f34c-ee7e-b8c1-b801-2a15e5a520e0.png" width=100%>

5, 「NetworkPacketsIn」でも問題なくデータが表示できています。
プレビューでリアルタイムに変更が確認出来るため、ガシガシ変更出来ます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342082/475faec4-165d-fed2-8158-bc71f41d69b3.png" width=100%>

6, Tile名と表示データが異なるため、Tileの名前も変更します。
レイアウトは「VISUALIZATION」から編集。
最後にSaveして下さい。

この様にクエリと言われると難しく感じてしまうかもしれませんが、
UIが整備されているため、レイアウト変更と同じ感覚で
データ表示の置き換えが可能になります。

以上です。
WorkatoとPower Automateの比較：変数の作成と更新


# 変数の作成
## Workato
Workatoでは、Variables by Workato コネクターを利用して、変数を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/ff2b1b51-fbd8-e93d-005a-9e878590ba81.png)

「Create Variable」アクションを選択すると、変数を作成することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/df718fdf-c65c-0479-8e45-7524fb838809.png)

1つのステップで、複数の変数を作成することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/333b88ee-52df-7c9e-0572-4a9cfd461e99.png)

## Power Automate
Power Automateでは、変数コネクターを利用して、変数を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/d0068869-d41f-81bc-8f61-162ff0292afa.png)

「変数を初期化する」を選択すると、変数を作成することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/6adba054-bcfb-e1c7-7b5c-89eba9c5b26d.png)

1つのステップで、1つの変数を作成することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/c6cf01ad-0ea0-1464-f278-4223ac013306.png)

# 変数への値の代入（変数の更新）
## Workato
Variables by Workatoコネクターの「Update variable」アクションを選択すると、変数へ値を代入することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/84d317e1-e771-4d3f-76de-5998d941d263.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/833a69b5-af34-0265-3189-8fe57fbc2a89.png)

## Power Automate
変数コネクターの「変数の設定」を選択すると、変数へ値を代入するすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/0846ecd6-2971-226d-9e98-5ce666054d6c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/00eed9e6-81fe-ed6a-d27f-02f6eda2b670.png)

# 整数型の値の増値・減値
## Workato
Variables by Workatoコネクターの「Update variable」アクションを選択し、Formulaを利用することで値の増値あるいは減値を行うことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/f414bb65-864b-e69e-d64d-fd16b1cd1c7a.png)

例えば、`変数 + 1`とするとインクリメント、 `変数 - 1`とするとデクリメントが行われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/3ad47ac8-35a1-b5eb-f19d-5c571e1b32f9.png)

## Power Automate
「変数の値を減らす」「変数の値を増やす」を選択すると、値の増値あるいは減値を行うことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/84f71184-61d7-50ca-e837-beb6d127ea1f.png)

例えば、「変数の値を増やす」で値を1とするとインクリメント、「変数の値を減らす」で値を1とするとデクリメントが行われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/523fc2ed-4bd3-df14-c3fb-f2eea3ee1415.png)
useReducerとuseContextでglobal stateを作る場合のおすすめなやり方

## はじめに

React Contextでglobal stateを実現する際、useStateやuseReducerを使ってcontextの伝搬で更新するやり方が知られていますが、contextを一つだけにすると、無駄なレンダリングが生じることがあります。そこで、contextの伝搬を使う場合は、contextを細かく分けることがおすすめです。

## コード

最初にuseReducerでstateを作るカスタムフックを作ります。

```js
const useValue = () => useReducer((state, action) => {
  if (action.type === 'INC_COUNT1') {
    return { ...state, count1: state.count1 + 1 };
  }
  if (action.type === 'INC_COUNT2') {
    return { ...state, count2: state.count2 + 1 };
  }
  if (action.type === 'INC_BOTH_COUNTS') {
    return { ...state, count1: state.count1 + 1, count2: state.count2 + 1 };
  }
  throw new Error('unknown action type: ' + action.type)
}, { count1: 0, count2: 0 })
```

次にそれぞれの項目を伝搬させるためのcontextを作ります。

```js
const DispatchContext = createContext(() => {});
const Count1Context = createContext(0);
const Count2Context = createContext(0);
```

Providerコンポーネントは次のようになります。入れ子にならないようにreduceRightを使います。

```js
const Provider = ({ children }) => {
  const [{ count1, count2 }, dispatch] = useValue();
  return [
    [DispatchContext.Provider, { value: dispatch }],
    [Count1Context.Provider, { value: count1 }],
    [Count2Context.Provider, { value: count2 }],
  ].reduceRight(
    (a, c) => createElement(c[0], c[1], a),
    children
  );
};
```

実際にstateを使う2つのコンポーネントがこちらです。2つともほぼ同じです。

```jsx
const Counter1 = () => {
  const count1 = useContext(Count1Context);
  const dispatch = useContext(DispatchContext);
  const inc = () => dispatch({ type: 'INC_COUNT1' });
  return (
    <div>
      Count1: {count1} <button onClick={inc}>+1</button>
    </div>
  );
};

const Counter2 = () => {
  const count2 = useContext(Count2Context);
  const dispatch = useContext(DispatchContext);
  const inc = () => dispatch({ type: 'INC_COUNT2' });
  return (
    <div>
      Count2: {count2} <button onClick={inc}>+1</button>
    </div>
  );
};
```

最後に全体をまとめるコンポーネントです。

```jsx
const App = () => (
  <Provider>
    <div>
      <Counter1 />
      <Counter1 />
      <Counter2 />
      <Counter2 />
    </div>
  </Provider>
);
```

## CodeSandbox

<https://codesandbox.io/s/usereducer-usecontext-6okyp>

## 課題

今回はシンプルな例でしたが、オブジェクトの構造が複雑でも、必要な数だけcontextを作ればなんとかなります。しかし、contextは動的には作れない（作ることはできるが、全部再マウントすることになってしまう）ので、あらかじめ分かっている固定数のものにしか対応できません。

## おわりに

これをすんなり使おうと思える方はぜひどうぞ。こんなことするくらいならライブラリを使おうと思う方は、[これ](https://github.com/pmndrs/zustand)とか[これ](https://github.com/pmndrs/jotai)とか[これ](http://github.com/pmndrs/valtio)とかをどうぞ。
vue3入門①

vue3の基本構文①
オブジェクト作成からマウントまで
コード内に流れを記載。

```html
<!DOCTYPE html>
<html>

<head>
    <title>My first Vue app</title>
    <script src="https://unpkg.com/vue@next"></script>
</head>

<body>
    <h1>Vue3</h1>
    <div id="app">
        <!--④appdataオブジェクトのアプリケーションからmessageを表示 -->
        {{ message }}
    </div>

    <script>
        //①appdataにdata内のmessageを代入
        const appdata = {
            data() {
                return {
                    message: 'Hello World'
                }
            }
        }
        //②Vue.createApp(appdata)→appdataオブジェクトをつかってアプリケーションを作成
        //③.mount('#app')→アプリケーションを#appにマウントする
        Vue.createApp(appdata).mount('#app')
    </script>
</body>

</html>
```
Next.js で画面サイズを取得する方法


本記事では、Next.jsで動的に画面サイズを取得するHooksをご紹介します。

レイアウトの調整にはFlexboxやCSS Gridを使用することが多いと思います。
しかし、コンポーネントのレイアウトを実装するときにどうしてもウィンドウサイズから計算しなければならない場合もあります。
そういった場合に使用できるHooksをご紹介させていただきます。


## Hooksの実装

### GetWindowSize.ts
```typescript
import { useEffect, useState } from "react";

export const getWindowSize = () => {
  const [windowSize, setWindowSize] = useState({
    width: 0,
    height: 0,
  });

  useEffect(() => {
    if (typeof window !== "undefined") {
      const handleResize = () => {
        setWindowSize({
          width:
           window.innerWidth,
          height: window.innerHeight,
        });
      };

      window.addEventListener("resize", handleResize);
      handleResize();
      return () => window.removeEventListener("resize", handleResize);
    } else {
      return;
    }
  }, []);
  return windowSize;
};
```
Next.js はPre-redndering(SSR,SSG)がサポートされているので、
Hooksでブラウザ側にしか存在しないグローバルオブジェクトのwindowやdocumentを参照する場合には必ず
```typescript
if (typeof window !== "undefined") {
```
を実装するようにしましょう。

## 使い方

### index.tsx

```typescript
import type { NextPage } from "next";
import { getWindowSize } from "../hooks/GetWindowSize";

const Home: NextPage = () => {
  const { height, width } = getWindowSize();
  return (
    <div>
      height:{height} width:{width}
    </div>
  );
};

export default Home;
```



## まとめ
Next.jsでウィンドウサイズを取得したいときにはWindow: resize イベントを利用したHooksを実装する！
ただし、windowがundefinedの可能性があることに注意！


#### Ignite UI for React トライアル版を利用するには

Ignite UI for React はトライアル板での試用が可能です。
[トライアルのダウンロードはこちら](https://jp.infragistics.com/products/ignite-ui-react/download)
また、[こちらのページ](https://iam.infragistics.com/Account/Register)よりアカウントの作成を行っていただくと登録より30日間、弊社のテクニカルサポートをご利用いただくことが出来ますのでお気軽にお問い合わせください。

製品をご購入をご検討のお客様は[こちらのページ](https://jp.infragistics.com/about-us/contact-us)よりお気軽にお問い合わせください。そのほか、[製品デモ](https://jp.infragistics.com/request-demo)や、弊社製品そのものに関するご相談だけでなく、システム開発における様々なご相談も実施可能な[無料相談会](https://jp.infragistics.com/free-consultation)も随時受け付けています。
ハッシュ値をテキストファイルに出力するバッチ

コーディングメモ

# MakeHashFile.bat
## 概要
指定したファイルのハッシュ値をテキストファイルに保存します。
## 実装
``` Batchfile
@echo off
setlocal
set files=%1%
rem HashAlgorithm は次のいずれか MD2 MD4 MD5 SHA1 SHA256 SHA384 SHA512 (省略時はデフォルト)
set HashAlgorithm=%2%
if NOT "%HashAlgorithm%"=="" (
 set outFile=%files%.%HashAlgorithm%.txt
) else (
 set outFile=%files%.hash.txt
)
if exist "%files%" (
 if not exist "%files%\" certutil -hashfile "%files%" %HashAlgorithm% >> %outFile%
)
for /R "%files%" %%i in (*) do (
 certutil -hashfile "%%i" %HashAlgorithm% >> %outFile%
)
endlocal
@echo on
```
## 引数
|引数|説明|
|:-|:-|
|第1引数|ハッシュ値を作成するファイル、またはディレクトリ (ディレクトリを指定した場合はそれ以下のファイル全て)|
|第2引数 (省略可能)|ハッシュアルゴリズム (certutil の実装に依存) |

## 作成されるファイルのファイル名
(指定したファイルまたはフォルダ).(ハッシュアルゴリズム).txt
ハッシュアルゴリズムを省略した場合は "hash"

## 使い方
* コマンドラインから実行
* ハッシュ値を作成したいファイル、または、フォルダをバッチファイルにドラッグ&ドロップ
* SendTo に入れておき、ハッシュ値を作成したいファイル、または、フォルダからコンテキストメニューで選択
VSCodeでMarkdownの自動整形を無効にする

# 背景
Markdownファイルを編集していたときに、保存をするとPrettierの自動整形が原因でテーブルなどがぐちゃぐちゃになってしまいました。
そこでMarkdownの自動整形を無効にしようと思います。

# settings.jsonを開く
こちらを参考にしました
https://qiita.com/y-w/items/614843b259c04bb91495


# Markdownの設定を追記
```json:settings.json
"[markdown]": {
        "editor.formatOnSave": false
}
```

# memo
言語単位で無効にする設定はできなくなったようですね。
ドコモデータコピーアプリ　音響通信機能の紹介！

#概要
みなさま、スマホ機種変更時のデータ移行、どうしていますか？？
最近は端末メーカの初期設定時のデータ移行が大変便利ですが（iPhoneとかPixelとか。。）、
Android/iOSの「ドコモデータコピー」アプリの音響通信機能について紹介します。

#はじめに
ドコモで「ドコモデータコピー」アプリや「データ復旧」アプリ等のお客様のデータを扱うサービスや、統合開発環境の開発を担当している内海です。
この記事では、音響通信を使ったデータ移行機能とその技術をデータコピーメンバより紹介するので、興味を持っていただけたらうれしいです。

#ドコモデータコピーアプリとは
スマホ機種変更時のデータ移行をサポートするアプリです。
異なるOS間へのデータ移行にも対応しており、無線で高速に実施できる点が特徴です。
（2021年12月現在、Android版はドコモユーザのみの提供です）
https://www.nttdocomo.co.jp/support/docomo_datacopy/
![スライド1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2287288/bbd92859-8a34-d5b9-584f-ad4a2a657708.png)
主な機能は２つ

- データ移行

今までの端末と新しい端末を接続し、無線で高速にデータを移行。ドコモショップへの来店や機器の準備が不要で、古い端末と新しい端末が手元にあれば安全・簡単にデータ移行が可能！

- バックアップ＆復元

SDカードにバックアップデータを作成。新しい端末にSDカードを入れ替えて復元。定期的にバックアップを作成すれば、万一の故障のときにも安心！
![スライド2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2287288/f89eafdd-94a3-1a67-4986-854374b4a3ea.png)


#音響通信機能を使った端末間の接続
通常はQRコードを使った接続を実施しますが、カメラが壊れていたり画面が割れていたり等で、接続がうまく行かないユーザ向けに、音響通信機能を使った接続を実施してます。
![スライド3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2287288/682bda05-1da6-0276-a8f5-7c088f4feb9b.png)


#ドコモの音響通信技術
###音響OFDM
ドコモデータコピーアプリでは、ドコモが開発した「音響OFDM」技術を利用しています。
「音響OFDM」は、URLやテキストなどのデータを音楽や音声などのオーディオ信号に乗せて送信し、携帯電話端末で受信することを可能とします。
![スライド4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2287288/0820e1a8-56e0-7b40-bf84-21f31ce1fc10.png)
2006年に開発した技術をスマートフォン向けに最適化するために、C言語をC++に変換・周波数帯域や送信可能なデータ長を拡張して活用しています。
参考サイトに詳細な技術情報が掲載されているので、興味がある方は読んでいただけますと幸いです。


###アプリ開発で困ったこと
実際の音響通信は人の耳に聞こえづらい高周波数帯を利用しています。音響通信中はノイズが流れているように感じることがあるため、その音にかぶせる形で心地よいメロディを流しています。
商用アプリにメロディを搭載するにあたり、なんとメロディを自作！5種類作成したメロディから、できるかぎりお客様に心地よい印象を与えるメロディを採用したつもりです。
一定のメロディをループで流しているので、違和感なく流し続ける実装にも苦労しました。違和感がなくなるメロディになるまで、何度もメロディが流れる実装を調整しました。
![スライド5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2287288/dad5f854-fe74-a5d8-d067-2f9f21f40148.png)
また、音響通信はAndroid 4.4以降、iOS/iPad 10.0以降の端末サポートで開発しました。端末によっては高周波が苦手だったり、オーディオにエコーがかかり信号として認識できなかったりするケースがあり、端末スペックに依存する性能差に苦労しました。評価を手厚く実施し、サポート端末のお客様通知を行うことで、お客様からもご好評をいただけた機能となっています。


###参考サイト
「音響OFDM」技術を開発
https://www.nttdocomo.co.jp/info/news_release/page/20060413.html
音響OFDM技術仕様 Ver. 1.00
https://www.nttdocomo.co.jp/binary/pdf/corporate/technology/ofdm/OFDM_ver1_00.pdf

#おわりに
ドコモデータコピーと音響通信について、紹介しました。
もし機種変更することがあれば、アプリを使ってみてください！
GCP Cloud SQLにローカルPCからアクセスする方法

## 0. はじめに
### 概要
ローカルPCからCloudSQLインスタンスに接続する手順です。
GCP提供の「Cloud SQL Proxy」というサービスを利用してCloudSQLインスタンスに接続します。

### 環境
- PC: MacBook Air (M1, 2020)
- OS: Big Sur 11.6.1 

## 1. Cloud SDK のインストール
※詳しい手順は[公式ドキュメント](https://cloud.google.com/sdk/docs/install)を参照
[公式サイト](https://cloud.google.com/sdk/docs/install)から任意のディレクトリでSDKをダウンロード、解凍し以下コマンドを実行

```bash
$ ./google-cloud-sdk/install.sh
$ ./google-cloud-sdk/bin/gcloud init
```
※zshの場合、上記コマンドで.zshrcにgcloudのPATHが書き込まれるので `source ~/zshrc` で読み込み直す。

## 2. SDKの認証
※手順1の途中で既に認証済みの場合はスキップしてOK

```bash
# Googleアカウントでの認証を求められるので、GCPプロジェクトで使用しているアカウントでログインする
$ gcloud auth login

# ログインできているか確認
$ gcloud auth list
```

## 3. Cloud SQL Proxyのインストール
任意のディレクトリで以下のコマンドを実行

```
$ curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
$ chmod +x cloud_sql_proxy
```

## 4. Cloud SQL Proxyを起動
Cloud SQL Proxyをインストールしたディレクトリで以下コマンドを実行

```bash
$ ./cloud_sql_proxy -instances={プロジェクト名}:{リージョン名}:{インスタンス名}=tcp:{ポート番号}
```

## 6. クライアントツール等でアクセス
Cloud SQL Proxyを立ち上げた状態であれば、ホストをlocalhostに指定してローカルPCからCloudSQLに接続することができるようになります。
GEC に関するブックマーク

# 概要

人工知能学会の[私のブックマーク「自然言語処理による文法誤り訂正」](https://www.ai-gakkai.or.jp/resource/my-bookmark/my-bookmark_vol33-no6/)を紹介します。

# 3行まとめ

1. 水本さんによる GEC の（リンク集を中心とした）記事です
1. GEC のコンペティションやデータセット、すぐ動かせるツールのリンクが揃っています
1. GEC の評価についてもまとめられています

# アップデート

2018年までの GEC に関する状況がまとまっています。2019年以降でのニュースとしては

* [BEA 2019 Shared Task: Grammatical Error Correction](https://www.cl.cam.ac.uk/research/nl/bea2019st/) という文法誤り訂正のコンペの開催
* [NLP-progress: Grammatical Error Correction](http://nlpprogress.com/english/grammatical_error_correction.html)
* 事前学習モデルや大規模な擬似データを使った手法の登場（上記の NLP-progress 参照）
* 正解データを使わない、ニューラルベースの評価手法 [文法誤り訂正の参照文を用いない自動評価の人手評価への最適化](https://www.jstage.jst.go.jp/article/jnlp/28/2/28_404/_pdf/-char/ja)（ステマ）

といったところでしょうか。

# よもやま話

2019年の人工知能学会誌の [言語学習支援のためのニューラル言い換え生成](https://www.jstage.jst.go.jp/article/jjsai/34/4/34_451/_article/-char/ja/) にも当時の GEC の研究についてまとめてみました（梶原さんと小町と共著です）。なぜか言語処理学会より人工知能学会のほうが GEC 関係の記事が多い気がしますが、そちらも合わせてご覧ください。
Laravel のアセットコンパイル（npm run dev） 実行時にエラーが発生したら確認するべきこと

npm run dev でエラー起きてますか？辛いですね。
「cross-env not found 」とか「mix not found」などと怒られてしまっている場合、以下の内容をチェックしてみてください。
また、npm install 実行時、npm ci 実行時に「symlinkが作れへん」などと言われる場合も以下の内容をチェックしてみてください。

# 対象
vagrantを利用し、windowsホストマシン、Linuxゲストマシンの環境でLaravelプロジェクトを開発している人


# 診断
このケースに該当するかチェックするために、プロジェクトのルートディレクトリで以下のコマンドを打ってみましょう。

~~~ sh:node_modules/.bin/が存在しているかのチェック
ls -l node_modules/.bin/
~~~ 
.bin ディレクトリが存在していれば、このケースには該当しません。

~~~ sh:シンボリックリンクが作成できるかどうかのチェック
mkdir tmp
touch tmp/text1.txt
ln -s tmp/text1.txt textsmlink
ls -l
~~~ 
シンボリックリンクが作成できれば、このケースには該当しません。

# 前提となる理解
## （1）シンボリックリンクが作成できない問題

- npm install 時にsymlink が作成できない 

という問題があります。
これは、ホストOS windows 、ゲストOS Linux という環境で開発しているとよく発生します。

「npm symlink error」などで検索すると

https://qiita.com/sansaisoba/items/0fd5c77c9fbbfe61a629


https://codesapuri.com/articles/24

のような「--no-bin-links オプションをつけてnpmコマンドを実行する」こういう対処方法が出てきますが、これは罠です。

※symlinkが作成できないという問題を解決するためにsymlinkを作成しないという対処をしているに過ぎないので、問題は解決しない

## （2）npm install --no-bin-links を実行すると何が起こるか？
--no-bin-links オプションをつけると、 node_modules/.bin ディレクトリが作成されません。
シンボリックリンクを作成しないためコマンド自体は通るのですが、node_modules/.bin が作成されないため、結果として
npm run dev 実行時に、cross-env not found とか、mix not found などの問題が発生します。

で、「cross-env not found」などで検索すると

https://takaolab.com/resolution-cross-env-not-found/

「cross_env までのパスを通せ」という感じの対処方法が出てきてしまいます。
確かにこれで一応 npm run dev コマンドは通るのですが、

- 根本原因を解決していない
- 本番環境とローカル環境で package.json に差分が出てしまう

という点でイマイチです。

# 結論
この問題の根本的な原因は、npmインストール時にシンボリックリンクが張れないことなので、この問題を解決します。
問題解決するための具体的な手段は、利用しているホストOSの種類によって変わってくるので、利用中のOSごとに各自ググりましょう。以下、windows10 の場合の対応手順を示します。

## Windows10 Pro の場合
正解はこちらです。 

https://tokibito.hatenablog.com/entry/2018/02/28/012014

>Windows 10の場合、シンボリックリンクを作成する権限はデフォルトではAdministratorグループのみになっています。

>「ローカル セキュリティ ポリシー」-「ローカル ポリシー」-「ユーザー権利の割り当て」-「シンボリック リンクの作成」に一般ユーザーのグループ(Users)を追加することで、一般ユーザーでもシンボリックリンクを作成できるようになります。

## Windows10 Home の場合
windows10 Home の場合、デフォルト状態では「ローカル セキュリティ ポリシー」が利用できないので、これを利用できるように変更してやる必要があります。

https://laboradian.com/enable-gpedit-on-win10home/

上記参考に「ローカル セキュリティ ポリシー」が利用可能な状態になったら、前述の「Windows10 Pro の場合」の手順を実行します。


# 備考
composer install 時にも、同様の原因によってインストールが失敗することがあるので、なおさら根本原因を解決しておいたほうがよい。
composer.json に、symlink : true のレポジトリが書いてあったりする場合。

https://getcomposer.org/doc/05-repositories.md
Open Source Summit Japan + Automotive Linux Summit 

12月14日＆15日に開催されるOpen Source Summit Japan + Automotive Linux Summitに登壇します。沢山のスピーカーが知見を披露されるので、オープンソースについて学ぶ絶好の機会です。

ぜひご参加いただき、お気軽にお声がけください！[SnykSec](https://qiita.com/SnykSec)

ご参加はこちら：[Open Source Summit](https://events.linuxfoundation.org/open-source-summit-japan/register/)
【リモート×モブプロ】IntelliJ IDEAのCode With Meを使ってみた話

# はじめに
本稿では、IntelliJ IDEA内のサービスの一つであるCode With Meの紹介と、実際に活用しながらリモートワーク環境下でモブプロを行った感想をまとめています。詳細な導入方法や網羅的な機能の紹介は行っていないので、ご了承ください:pray:

# Code With Meとは

一言で説明すると、IntelliJ IDEAで共同開発を支援するためのサービスです。

https://www.jetbrains.com/ja-jp/code-with-me/

公式サイトでも、以下のような紹介がされています。

> Code With Me は共同コーディングおよびペアプログラミングの新しいサービスです。IDE プロジェクトにほかのユーザーを招待し、リアルタイムで共同作業を行うことができます。

類似するサービスとしては、Visual Studio・Visual Studio Codeで利用できる`Live Share` があります。

https://visualstudio.microsoft.com/ja/services/live-share/

## セットアップ
Code With Meは、IntelliJ IDEA 2021.1以降のバージョンにおいてデフォルトでバンドルされています。

https://www.jetbrains.com/ja-jp/code-with-me/

上記より以前のバージョンを使っている場合は、以下のプラグインをインストールすることで利用可能となります。

https://plugins.jetbrains.com/plugin/14896-code-with-me


## 特に活用した機能
Code With Meの機能で、モブプロ中に使っていたものとして次の2つがありました。
### ① 同時編集
複数のメンバーがリアルタイムにコード編集を行うことができる機能があります。
基本的に、モブプロ中はドライバーだけがコーディングをしていました。しかし、単純作業だけど変更箇所が多いような修正を行うときに、ドライバーだけが修正するには時間が惜しいことがありました。そのようなときに、この機能を使ってナビゲーターも一緒に修正を行いました。

ドライバー画面|ナビゲーター画面
:--:|:--:
![ezgif.com-gif-maker (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107176/f8d37ae2-f7af-c915-5f88-4b7183b557a9.gif)|![ezgif.com-gif-maker1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107176/e131a836-0da8-434b-d833-cc386f3b945f.gif)

### ② 完全同期モード
完全同期モードを使ってドライバーを選択しておくと、ファイル間の移動や操作に対しても常に追従することができるようになります。
の操作によって閲覧しているファイルが追えなくなることがありましたが、この機能を使うことで常にドライバーの画面を追従することができるようになります。

ドライバー画面|ナビゲーター画面
:--:|:--:
![ezgif.com-gif-maker (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107176/ef4014ea-d514-e5ab-a59f-458de32207ee.gif)|![ezgif.com-gif-maker (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107176/0836ef28-f567-18a7-47d5-f6b0cb341d6c.gif)

# その他で併用したサービス
先程紹介した機能以外にも、Code With Meには音声通話やチャット機能も備わっていました。
しかし、以下の理由でいずれも別サービスで代替しました。

音声通話|チャット機能
:--------------------------|:----------------------------------------------
1. 接続が不安定になることがあった |1. チャット内容が揮発性だった
2. 他製品と比べて音質が微妙だった|2. 参加者しか閲覧できず、やり取りがクローズドになる
※設定や環境によっては無視できる問題なのかもしれませんが、Code With Meに強い拘りもなかったので別サービスを採用することに決めました

その結果、採用されたのが以下のサービスになります。

音声通話|チャット機能
:-----:|:---:
Discord|Slack

いずれも社内で利用実績もあったので、代替サービスとしてすぐに決めました。
特に、モブプロ中のやり取りや参考にしたURLなどは他メンバーも閲覧可能な状態にしておきたかったので、チャット機能についてはSlack一択といった感じでした。

# 辛かったポイント
基本的に問題なく進行できていましたが、モブプロ中に遭遇したトラブルについても紹介させてもらいます。

#### PCの動作が重くなる
モブプロ中は複数アプリを同時に立ち上げながらの作業となるので、稀にPCがフリーズして作業を中断してしまうことがありました。（モブプロを行っていたのが夏だったこともあり、PCが熱を持ちやすかったのかも）
このような場合には、素直にPCを再起動したりクーラーの温度を下げるなどして解決していました。

#### 個人で導入しているプラグインの機能が使えなくなる
ナビゲーターとして参加しているときに、同時編集機能を使って一斉に修正をするような場合に、プラグインの設定などがドライバーの環境に依存してしまい、プラグインでIDEをカスタムしていたメンバーは操作に違和感があることがあったらしいです。

# Code With Meを使ってみた感想
- リモートワーク環境下でモブプロする場合、すでにIntelliJ IDEAを使っているならCode With Meはオススメ！
- モブプロで欲しい機能をCode With Meだけで完結させようとすると辛い場合があるので、他サービスを併用することも検討する
- 人によってはPCの動作重くなることがあるので、適宜不要なプロセスを消しておくと幸せになれる
jra公式データから中央競馬の複勝の払戻金を知るSQL

https://jra-van.jp/
でダウンロードしたデータに対して以下のようにSQLを流すと複勝の払戻金の統計を知ることが出来ます。

```sql
SELECT
   min(PayFukusyoPay1)*1, min(PayFukusyoPay2)*1, min(PayFukusyoPay3)*1,
   avg( (PayFukusyoPay1+PayFukusyoPay2+PayFukusyoPay3)/3 ),
   max(PayFukusyoPay1)*1, max(PayFukusyoPay2)*1, max(PayFukusyoPay3)*1
FROM
    N_RACE
INNER JOIN
	N_HARAI
		ON
			N_HARAI.Year = N_RACE.Year
				AND
			N_HARAI.MonthDay = N_RACE.MonthDay
				AND
			N_HARAI.JyoCD = N_RACE.JyoCD
				AND
			N_HARAI.RaceNum = N_RACE.RaceNum
WHERE
    N_RACE.JyoCD IN("01", "02", "03", "04", "05", "06", "07", "08", "09", "10")
        AND
    N_RACE.TorokuTosu IN("0")
        AND
    N_RACE.Year >= "2010" AND N_RACE.Year <= "2020"
```
【Android】公開タイミングの管理ボタンがない

# このボタンがなくて困った…
![Screenshot 2021-12-02 131720.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429030/a9ac52e6-3e89-e740-45f0-58b669c13b68.jpeg)

PlayStoreにアプリを"初めて"リリースしようとすると「管理対象の公開のステータス」ボタンが表示されません。
審査が通ったらいきなり公開されてしまうんでは・・?という不安な気持ちになります。
こんなときにどうするか、書いておきます。

## 結論

クローズドテストで公開する
![Screenshot 2021-12-02 132019.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429030/a2527477-5ccd-2952-5648-9064e28a636d.jpeg)

クローズドテストなら予めベータテスタとして登録した人だけに公開されるので安心です。
審査に出すタイミングで「完全公開を開始しました」という恐ろしい文言が出ますが、大丈夫です。

審査中のステータスになると、「管理対象の公開のステータス」ボタンが表示されるので、
画像のようにチェックを入れておけば勝手に公開されることはなくなります。
![Screenshot 2021-12-02 132447.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429030/0ef56f79-d644-8f6a-24b3-d48984ae79a3.jpeg)
ちょっとしたストレスを軽減するためのツール紹介

師走になりました。
AdventCalendar2日目です。

# はじめに

プログラムを書かなくなってしばらく経ちますので、技術のことは他の方に任せようと思います。
業務中のちょっとしたストレスを減らすために使っているツールを紹介しようと思います。

みなさん。
便利なものを使っていると思いますので、より便利なツールがあれば教えてください。
知っている人は、明日のAdventCalendarを心待ちにして、画面を閉じてください。

触りだけ書きますが、気になった方は調べて見てください。

# 1. GoogleCalendarの共有が多すぎる問題

社内でカレンダーを共有していますが、メンバーが多くなった影響で、最近、共有されるスケジュールが多すぎます。

チームのスケジュールを確認するとか、
偉い人のスケジュールを確認するとか、

確認したいスケジュールを表示するために、表示/非表示のチェックを付けたり・外したり・・・

そんな人は、もう少し楽しましょう。
[Calendar Selector for Google Calendar - chrome ウェブストア](https://chrome.google.com/webstore/detail/calendar-selector-for-goo/nmliklikilkjommabacojbijjimlgjck)

あらかじめ登録したプリセットの表示に切り替えることができます。


# 2. Slackの参加チャンネルが多すぎる問題

プロジェクトを進める中で、Slackのチャンネルはどんどん増えていきます。
多すぎます。

※有料Slack限定の話です

チャンネルを分類したいと思ったことがある方

`Create new Section` してください。

[カスタムセクションを使用してサイドバーを整理する - slack help center](https://slack.com/intl/ja-jp/help/articles/360043207674-%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%82%B5%E3%82%A4%E3%83%89%E3%83%90%E3%83%BC%E3%82%92%E6%95%B4%E7%90%86%E3%81%99%E3%82%8B)

社内のチャンネルとか、よく確認するチャンネルとか、よくDMする人とか、
自由にSectionを作成できます。

# おわりに

この半年くらいで誰かと話をした2つについて書きましたが、便利なものはたくさんあります。
もし、知らなかったという人は調べてみてください。

もっと便利なものを知っている方、教えてください。

それでは良いお年を。
顧客インタビューをやってみたらどうだったか。

やってみてどうだったかをざっくりたどってみる。

## 背景
+ 現在、事業会社のエンジニアとして数年 働いている、
営業にパワーバランスが傾いてる会社でプロダクトにフォーカスあたって開発に取り組めない。

+ 営業のアイデア発信で開発に取り込まれるので顧客の声が薄いものを作らされる。確証もないクソみたいなアイデアに振り回されがち。

などなど、タスクの優先順位の取り決めや、そもそも取り組むタスクの価値の意味不明さやこーいうところから不満が募った。
あるべき姿や、より事業やら、プロダクトやら、開発やら、組織やら流れがよくなるにはどーしたらよいのか、自分として取り組みたいことだと思った。

## 仮定
そこで単純に考えて、なんとなくサービスの起点は顧客だと思ったので、
単純に直接顧客と話して、何を課題に感じ、何につまってるか? 
自分で顧客にアンケートとって、プロダクトに関するインタビューやって見たらモヤモヤが晴れるんじゃないかと思った。

既存顧客の声をサービス運用として、重要な動きなんじゃないかと
（経営観点からみてまた、資金調達なりもろもろもの観点はあると思うが、今、フォーカスあててるのはサービスを課題を取り上げ、発展させるための取り組み )
アイデアの出どころなり

## 不安
エンジニアの役割で、顧客との関わりを持つのが営業担当だけなので、話すことに抵抗があった。
人によっては叱責うけるんじゃないかなんて思おったりしていた。


## 3人の顧客とインタビュー実施
### 1,2人目の顧客
単にタスクを上長からうけて、言われただけの仕事してるだけってタイプの人だったので
現状のサービスに対する要望やら、要求は特になく、満足だとのこと。

### 3人目の顧客
ターゲットとしているタイプの顧客で、不満や要望があった。この顧客の声が、イメージが広がるきっかけとなった。
不満や要望をもつ顧客ほど、プロダクトの実際の姿が見えていたりするなーと感じた。
とはいえ、必ずしもそうとは言えず、変な言いがかりをつけるタイプの顧客もいるとは思う。

## 感想
ひとまず、ざっと取り組んでみて、
結果として感じたのは想定していたとおり、アンケートの効果は絶大、サービスの運用において必須だと感じた。それを感じれたことに満足できた。
仮定としていた考え通りだった。
部門としてカスタマーサクセスなんかがあればいいんだと思う。

顧客と話すのも単にやったことが少ないだけでなれだなって思った。

で、この後の取組としては、引き続き、インタビューを続ける、
デザインに起こしてみる、こんなんいいんじゃないかなんてもののプロトタイプを作ってみるとか、
アイデアをまとめて、要望にたるものなのか確認するなりのアクションをとっていくと思う。
この顧客と話しをつづけながら、かつ機能を取り組むを、サービス運用における基礎にすることがサービスの発展になるとなんとなく肌で感じれた。
それがわかっただけでも十分だった。

ただし、ここから先、聞いた情報をもとにタスク化して、
自社のプロダクトに対して取り込みたい欲求が気持ちがまった起きないので自己満足に留める。
「毎日誰かのプルリクを脳死でマージするアドベントカレンダー」の乗っかってみた

以下のアドベントカレンダーの2日目です。

https://qiita.com/advent-calendar/2021/full-scratch-awesome-app-nextjs

Repositoryはこちらですね！

https://github.com/TeXmeijin/anyway-merge-app

あまりnext.jsの知見がないのですが、
完全にきっかけ作りで参加です。
ハードル下がればいいなと思ってあまりきちんとしたコードは書いてませんが、
とりあえずPR出しました！

https://github.com/TeXmeijin/anyway-merge-app/pull/4

やったこととして

- contributorの追加
- contributorへのリンクをトップページに加える
- prettierを入れてみる

です。

今後の方に期待しつつ、このRepositoryをwatchしていきます！

3日目は @XxGodmoonxX  さんです。よろしくお願いします！
supervisorとLaravelのQueueを使ってみた


## はじめに

CYBIRDエンジニア Advent Calendar 7日目担当の @kenta_kitagawa です。
サーバサイドの業務を担当しています。

6日目は @cy_ssssさんによる「[Unityにまつわる入社前後の変化](https://qiita.com/cy_ssss/private/e0d1d2435a48e4a00240)」でした。
入社した頃の初心を思い出します。

## 今回の最終目標
弊社はマスターデータ投入の際に事前検証用のdatabaseを毎回作り、検証作業が終わったら検証用databaseを削除する運用をしています。
上記の処理に時間が掛かるので、トリガーはGUIからの操作で、削除処理はバックグラウンドで行えるようにして複数のデータベースを削除する手間を省きます。

そこで

```
php artisan database:drop {database_name} 
```
上記コマンドをviewから実行し、バックグラウンドで処理できるようにします。
databaseクラスはCommandクラスを継承して実装してます。


## やること
・Laravelのキューを使う
・LaravelのキューはDatabaseを使って実装
・supervisorのインストールと設定
・supervisorでキューワーカーを起動
・Controllerからコマンドを実行


## 環境
・Vagrant 2.2.16
・VirtualBox 6.1.22 r144080
・CentOS Linux release 7.3.1611

## 導入手順（view、Controllerの導入、実装は割愛）

```java:仮想環境に入ってsupervisorのインストール
vagrant ssh
sudo yum install supervisor
```


```conf:confファイルを作成
sudo vi /etc/supervisord.d/laravel-worker.conf
```

```conf:/etc/supervisord.d/laravel-worker.conf
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d

# artisanがある階層
command=php /home/hoge/artisan queue:work

# ログを吐く階層とファイル名
stdout_logfile=/home/hoge/worker.log

# commandを実行するユーザ
user=hoge

autostart=true
autorestart=true
numprocs=1
redirect_stderr=true
stopwaitsecs=3600
```

```:laravel-worker.confを読み込む設定
sudo vi /etc/supervisord.conf
```

```conf:/etc/supervisord.conf
# 一番下の [include] の部分を変更
files = supervisord.d/*.conf
```

```:supervisorの起動
sudo service supervisord start

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*
```

```java:jobsテーブルの作成
php artisan queue:table
php artisan migrate
```

```java:.envファイルに追記
QUEUE_DRIVER=database
```


```php:Controllerの任意のところに下記を記述
$params = [
	'database_name' => $database_name
];

// jobs にレコード挿入
Artisan::queue('database:drop', $params)->onConnection('database');
```

jobsテーブルにレコードがあるとキューワーカーが自動で処理を実行してくれます。


## さいごに

今まで手動で何度もコマンドを叩いていたものをキューを使うことによって一度にたくさん実行してもバックグラウンドでキューワーカが自動で処理してくれるようになりました。

明日のCYBIRDエンジニア Advent Calendar 2021 8日目は、 @yuki_utsumi  さんによる「数十TBのデータをGoogleドライブにアップしよう」です。
どんな内容なのかとても気になります！

ありがとうございました！