OmniAICreator/Qiita-1.07M huggingface dataset:
GASでS3にファイルをアップロードする

GASはUrlFetchAppサービスを使うことで、外部のWebAPIとやり取りすることができます。ここではそれを使ってAWS S3にファイルをアップロードする方法を共有します。

# 結論

もうこのブログを引用したら終わりですが、つまりはそういうことです。

https://engetc.com/projects/amazon-s3-api-binding-for-google-apps-script/

サクッと下記スクリプトIDをライブラリに追加して、いい感じにアップロードします。

```
MB4837UymyETXyn8cv3fNXZc9ncYTrHL9
```

```javascript:コード.gs
var s3 = S3.getInstance(awsAccessKeyId, awsSecretKey);
var blob = UrlFetchApp.fetch("http://www.google.com").getBlob();
 
s3.putObject("bucket", "googlehome", blob, {logRequests:true});
 
//and to get it back
 var fromS3 = s3.getObject("bucket", "googlehome");
```

# 事例

ある案件で、他社から毎日メールで送られてくるcsvデータをグラフ表示する業務がありました。当初はcsvファイル名が安定していなかったりしていたので、手作業でメールの添付ファイルをダウンロードし、S3にDnD(ドラッグアンドドロップ)してアップロードをしていました。しばらくしてファイル名なども安定してきたので、この定型作業を自動化しようと考えました。メールはGMailを使っていたので、GMailを操作でき、かつ上述のライブラリでS3も操作できるので、GASを採用しました。

仕組みはうまく動き、もうメールから添付ファイルをダウンロード＆S3でアップロードの手作業はする必要はなくなりましたが、1つだけ問題がありました。それは送られてくるcsvファイルがShift-JISだったことです。手作業での操作ではファイルの変換作業などはしておらず、S3の先のシステム側でcsvがShift-JISを前提として処理していました。上記S3ライブラリでアップロードするとUTF-8になってしまうため、文字化けしてしまうのです。

ライブラリ側でアップロードするコンテンツをUTF-8に限定してしまっていたので、Shift-JISのファイルを上げるために、そこだけコメントアウトしてライブラリを使っています。

```javascript:S3.gs
...
/* puts an object into S3 bucket
 * 
 * @param {string} bucket 
 * @param {string} objectName name to uniquely identify object within bucket
 * @param {string} object byte sequence that is object's content
 * @param {Object} options optional parameters
 * @throws {Object} AwsError on failure
 * @return void
 */
S3.prototype.putObject = function (bucket, objectName, object, options) {
  options = options || {};

  var request = new S3Request(this);
  request.setHttpMethod('PUT');
  request.setBucket(bucket);
  request.setObjectName(objectName);
  
  var failedBlobDuckTest = !(typeof object.copyBlob == 'function' &&
                      typeof object.getDataAsString == 'function' &&
                      typeof object.getContentType == 'function'
                      );
  
  //wrap object in a Blob if it doesn't appear to be one
  if (failedBlobDuckTest) {
    object = Utilities.newBlob(JSON.stringify(object), "application/json");
    object.setName(objectName);
  }
  
  //request.setContent(object.getDataAsString()); // コメントアウト
  request.setContent(object); // 追加
  request.setContentType(object.getContentType());
  
  request.execute(options);  
};
```

```javascript:S3Request.gs
...
/* sets content of request
 * @param {string} content request content encoded as a string
 * @throws {string} message if invalid input
 * @return {S3Request} this request, for chaining
 */ 
S3Request.prototype.setContent = function(content) {
  //if (typeof content != 'string') throw 'content must be passed as a string' // コメントアウト
  this.content = content; 
  return this;
};
```

# まとめ

GASからS3にアップロードする方法を紹介しました。この機能は特にGSuite上のGASでは重要です。なぜなら、GSuite上のGASは必ずアカウント認証が必要なコンテンツですが、S3にファイルをアップロードできるということは、アカウント認証が必要ない場所にコンテンツを提供できる手段を得られる、ということです。GASが簡易デプロイシステムとして利用できることを意味します。同時にGSuiteのセキュリティの中で一番脆弱になる部分でもありますので、そこはリスクと天秤にかけつつ利用するとよいかと思います。

以上です。
JSからTSへ

#なぜJSからTSへ？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322119/360a2307-8a8d-851b-82c9-dfd55ad63d34.png)
最近やっているプロジェクトは前月Part1が一通り終わって、今月から新段階に突入しました。
一緒にやっているお客様が結構挑戦的な感じで、前回も配布されたばかりのVue3.0を使うことにして、
今回もJSをやめて、TSの船に乗せましょう！とおっしゃいました。

やれやれDaze

#何の区別があるの？
基本的にJSができることがTSが全部できると、wikiがそう言いました。
その上、データ型がちゃんと書かなきゃいけない、さもないとビルドが通りません。
ちなみに型付の言語を書くのが４、５年ぶりでした。

#やってみよう！なんじゃこれぁ
大体ファイルの拡張子をTSに切り替えた瞬間、VScodeが真っ赤に染めます。

第一関門がimportです。
基本的にimportの時、import元の型が分からない、
もしくは自分が作ったモジュールがexportの型定義してない　
などの問題が起きて、利用できなくなります。
自作モジュールはまだ良いですが、
ライブラリーを使うと、そのライブラリーで定義した型も一緒に入れなきゃいけません。
なので、AWSなどのライブラリーを呼び出しているところの改造が結構苦痛でした。

その次、今まで経験として取り込んだ書き方、作り方もたまたま落とし穴になります。
今までTDDをやっていて、VueJSのmethodsを単独で動かし、
結果を格納するなどの定番テストとしてやったが、
TSではVueJSのmethods呼び出すのが型予測できないため、反則です。
（PS:最後やり方変えずにignoreを付けた）

#良いところ
まぁ良いところもあります。
JSで「戻り値の形が分からないので、どう処理すればいい？」などの悩み時が大分減りました。
コメントの量も少し減らしても、型定義があるので、その分理解がしやすくなる。
コードの質もかなり上がったんじゃないか？と思っています。

まだまだプロジェクトが終わっていないので、TSもいつか慣れると思います。以上！
AWS EC2 超初心者メモ

<h1>EC2とはなんぞや</h1>
簡単に「サービスに必要なサーバを簡単に構築するもの」
<ul><h2>特徴</h2>
<li>サーバーの追加・削減が容易に可能</li>
<li>OSより上のレイヤーで幅広いカスタマイズが可能</li>
</ul>
<ol><h2>構築手段</h2>
<li>AMIを選択</li>
<li>インスタンスタイプを選択</li>
<li>ストレージの追加</li>
<li>セキュリティグループの設定</li>
<li>SSHのキーペアの設定</li>
</ol>
<h2>1　AMIとは</h2>
「Amazon Machine Imageとはソフトウェア構成 (オペレーティングシステム、アプリケーションサーバー、アプリケーションなど) を記録したテンプレート」by AWS
簡単に「サーバの骨組み」と覚えておく

<h2>2　インスタンスタイプの選択とは</h2>
簡単に「サーバのスペックをきめようぜ」ってこと
ファミリー・世代・タイプが定められてるんだってよ。

<h2>3　ストレージの追加とは</h2>
ストレージは2種類「EBS」or「インスタンスストア」ある
どちらかをまず選択することから始める。
<ul><h3>EBSの特徴</h3>
<li>耐久性と可用性が高い
→大事なデータを扱うとき</li>
<li>インスタンスとは別居関係
→他のサーバと付け替えが可能</li>
<li>Snapshotを取得しS3に保存できる
→Snapshotとはなんぞや...</li></ul>
<ul><h3>インスタンスストアの特徴</h3>
<li>追加料金なし</li>
<li>インスタンスと同棲している
<p>→パソコンの内部のデータと同じ
→大事なデータは置かないこと</p></li></ul>

<h2>4　セキュリティグループの設定</h2>
「セキュリティグループ」＝ファイアウォールの認識でok
<ul><li>インバウンド：外部からサーバへの通信・リクエスト
<li>アウトバウンド：内部から外部への通信・リクエスト</li></ul>
<p>インバウンドでは安全性を保つために安全な通信だけに絞る必要がある。ssh、httpなどのポートを解放し、それ以外を制限することことを行う。</p>

<h2>5 SSHのキーペアの設定</h2>
インスタンス鍵をダウンロードし、接続の際に用いる。
5374.jpのNuxt.js版を作ったよ！

5374.jpのNuxt.js版、その名も「5374nuxt」を開発しました！
https://github.com/codeforkanazawa-org/5374nuxt

私は大学で「情報デザイン」という講義を持っています。JavaScriptやデータのビジュアライゼーション、そしてオープンデータについての講義です。

5374.jpは講義の中のラスボス的位置付け！これまでに学習した内容を利用して、各地域のゴミの日データから5374.jp形式のデータを作成し、最終的には独自改造した5374.jpを作成するというもの。オープンデータを理解し、JavaScriptを学習してもらう目的です。2014年から５３７４.jpを講義に取り入れて今年で7年目！

７年経つと技術周りの状況はだいぶ変わります。5374.jpのメイン技術はjQuery。jQueryは素晴らしいライブラリですが、だんだんと役目を終えつつあります。私も講義で用いるライブラリをjQueryから変えたいと思い始めていました。そこで、Code for Kanazawaの福島さんに相談し、Code for Kanazawa & Code for Shiogamaの共同プロジェクトとしてVue.js & Nuxt.jsを利用した「5374nuxt」を立ち上げた次第です。

まだ、たたき台レベルの完成度だと思います。みなさんぜひissueやプルリク、そしてコミッターとしてもご協力いただけるとありがたいです！

何より「どういう機能が追加されたんですか？」と質問されても、機能やビジュアルは何も追加されていませんｗ あえて言えば、Webサーバに上げずともローカルのみで確認ができたり、変更がリアルタイムで反映されるのでデバッグもやりやすくなっているというNuxt.jsならではのメリットのところですね。

jQueryをTypeScript & Vue.js & Nuxt.jsに変更しているので、いろいろ作りにも変更は出ています。

オリジナルの5374.jpは、HTMLはindex.htmlのみで、JavaScriptは設定以外は全てscript.jsというファイルにまとまっています。5374nuxtでは、せっかくNuxt.jsなのでコンポーネントを分割、JavaScriptの記述も対応する場所に分割し、共通するクラス定義をscript.tsというファイルにしました。

ソースの可読性もなるべく上げようと努力はしています！今後みなさんからフィードバックも得ながら改善していきたいなと。

まだまだこれから。みなさん今後もぜひご期待ください！ねばぎば！
![sd_gibasachan.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4518/0803595f-24e8-1d6d-38ec-38a43301c673.jpeg)
DATETIME型の年月日時刻の一部分を切り取って表示するには

##DATETIME型の必要な部分だけ切り取る方法
DATETIME型は「2020-12-01 00:00:00」のように年から秒までの日付と時刻が格納されています。
これを「2020-12-01」や「00:00:00」のように部分的に切り取って表示したい場合にsubstr関数が使えます。

```index.php
<?php
$date = "2020-12-01 00:00:00";

// 「年-月-日」
$date1 = substr($date,0,10);

// 「月-日」
$date2 = substr($date,5,5);

// 「時刻」
$date3 = substr($date,11,8);

?>
```

```
substr(対象のデータ, 切り取る開始位置, 切り取る数)
```
ipadでワイヤーを書けることを知った（ついでにチラシも作る）

##はじめに
* ipadでワイヤーフレームを書くアプリと、テンプレートを使ったチラシ制作のアプリを紹介する記事です。
* 技術的な話は出ません。予めご了承ください。
* 紹介するアプリがリリースされたのがだいぶ前なので、既に世に蔓延ってる情報しか載せていません。
* 先程知った私は頭を横から殴られた衝撃があったので衝動で書き連ねています。

#愚かな人間トーク
主にmacbookのXDを使用してワイヤーフレームを書くことが多い人間です。

ipadはApple Pencilという神器が使用できるので、トラックパットを使ってワイヤーを書くのと比べると比較にならないほど書きやすい！ということに気付いてからは、ipadを使うことも増えてきました。

無知で愚かな私はipad既存のメモ帳か、PC版と共有できるメモアプリ（Evernoteとかbearとか）の手書き機能を使ってワイヤーを書いていました。
いやコレ（ipadとApple Pencil）便利すぎるし、知らんだけでワイヤー書くアプリは絶対にあるはずじゃぞと、ふと我に帰ったので調べました。

#あった
https://www.adobe.com/jp/products/comp.html
Adobe Compというアプリがadobe製品でありました。
##とりあえず触る
![gif-01_2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340174/fb36086f-794c-fbcc-ce16-5dc2fb309783.gif)

###おわかりいただけただろうか
フリーハンドで書いた四角やバツマークが図形や画像に変換されましたね…
適当に書いたとは思えない完成度の画像が画面に表示されるだけで、既にもう作業効率が5億倍になりました。
###一通り触る
![gif-02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340174/4d824abf-ab13-3823-ca58-3296fbbdcbfa.gif)
![gif-03_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340174/3c30ccc6-8318-1262-e941-6210f008231f.gif)
さらさらと触りましたが、ワイヤーを書くのに事欠かない機能が揃っています。

オブジェクトの複製や複数選択・整列なども使用できます。また、見出しや本文などそれぞれのテンプレートテキストが用意されているので、文字の流し込みもラクチンです。

ipad本体のフォトライブラリから画像を挿入する機能もあります。なので爆速で猫が配置できます。

###共有が充実
共有ボタンを押したら一覧に出てくるリストは以下の通りです。さすがAdobe製品という感じのAdobe製品とのリンクがいいですね。

* Behanceに送信
* InDesignに送信
* Photoshopに送信
* Illustratorに送信
* Museに送信
* 自動モックアップ
* PDFを共有
* 画像を共有
* リンクを共有

個人的に感動したのは自動モックアップです。作成したキャンバスサイズに合わせてモックを作成してくれる機能です。
どんなもんかとボタンポチーしたら、なんといい感じの画像を２枚も作成してくれました！
![IMG_0017.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340174/2d2428d5-da74-906a-e0d3-522fbffdafa0.jpeg)
![IMG_0018.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340174/0b79d81d-78cf-d2c4-3662-00516e0fc7d8.jpeg)

##神だった
なんで今まで知らなかったのか




#ついでにチラシを作る
私はワイヤーを書くこともありますが、チラシやポスターを作ることも少し多い人間です。
印刷物ももちろんワイヤー（下書き）を作成して作ることが多いですが、今回は折角なのでipadを使ったテンプレートのアプリをご紹介します。

###Canvaのアプリを使ってみる
https://www.canva.com/
綺麗なデザインをテンプレートからサッと作れるwebサービス、Canvaです。
このサービスのipad版のアプリは知ってはいたけど使ったことがなかったので使ってみました。

###テンプレートを選ぶ
![temp-01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340174/b9141dda-0de2-9aea-9a16-a4421d4a09fa.jpeg)
画面左側のメニューからテンプレートを選び、ええ感じのものを選択します。
今回は架空のチラシにしました。冬っぽくて可愛いこちらのテンプレートを使用します。

![temp-02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340174/e141c233-6deb-063e-dc51-9b899e1790f0.jpeg)
画面左側のメニューからカメラロールを選択すると、ipad本体の中のカメラロールの画像が一覧で表示されました。

操作方法はWeb版と同じで、挿入したい画像をタップすると右側のテンプレートの上に表示されたので、その画像を指で差し替えたい画像の上にドラッグして差し替えます。
ブラウザ版に比べると動きがかなり重たいようで、ドラッグが反応しているのか少し怪しいところもありました。。

あとは見出しやコメント部分をチョチョっとそれっぽく書き換えて、猫社員おやすみ展のチラシが完成です。

画像が多いテンプレートは~~だいぶ重たくてフリーズからのアプリ落ちが多々~~ Web版と忖度ない…とは少し言い難い感じでしたが、こちらも爆速でチラシが作成できました。


##ipadは便利
今年の10月にリリースされたipad版のIllustraotやPhotoshopを一通り触った結果、期待以上の機能が出なかったので割とipadの可能性を見限っていたところがありました。。
ですがCompに関しては知らぬことを後悔した程でしたし、Canvaも思った以上にWeb版と同じだったので、今回調べたこの２つのアプリを知れて心がホクホクしました。ipadって便利なんだな〜

余談ですがipadでIllustratorで作成するようなベクターデータを作成したい時は『Affinity Designer』がオススメです。
https://affinity.serif.com/ja-jp/designer/ipad/
iosアプリの多言語対応(i18n)を３分でおさらい


# それでは英語アプリを日本語化してみよう

iosのデフォルトの言語はEnglishです。
project > info > Localizationsが、以下のようにEnglishが設定されている事を確認してください。
![スクリーンショット 2020-12-19 17.09.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183835/f5083be0-0e45-31ae-c1d2-c773782b38bb.png)

日本語のi18nを設定しましょう。
+ボタンを押して、jaを追加しましょう。
![スクリーンショット 2020-12-19 17.13.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183835/5ec85054-3648-7996-3645-e5f8f7983f05.png)

Localizable.stringsというstringファイルを作成します。
![スクリーンショット 2020-12-19 17.17.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183835/d02b2e62-5935-a26b-8b18-a68f9a84699c.png)


通常のファイルはi18nに使用出来ないため、alt + cmd + 1を押して、localizeボタンを押します。![スクリーンショット 2020-12-19 17.31.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183835/cab0864a-d57f-8afc-17c0-8da04cb31147.png)

ダイアログが現れるので![スクリーンショット 2020-12-19 17.34.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183835/5a2cc17a-6cdb-f9d5-aed5-1dcc74fce0a8.png)
japaneseを選択しましょう。

japaneseとenglishが選択されている事を確認してください。
![スクリーンショット 2020-12-19 17.30.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183835/c44688d9-c141-fe27-a5c0-248aaba94e78.png)
以下の２ファイルが作成されます。
Localizable.strings (Japanese)
Localizable.strings (English)

この時点でiosはある程度自動でi18n対応を行ってくれます。
例えば、「キャンセル」、「保存」などの単語はi18n対応がされるでしょう。

# ソースコードにベタ書きされた単語をi18対応する

ソースコードにハードコードされた単語をi18n対応したい単語があれば、以下のように言語毎に定義を作成し、NSLocalizedStringで対応しましょう。

```swift

// Localizable.string(Japanese)
"Hello" = "Hello";
"Buy" = "Buy this book";
"Register" = "Register for a new account";

// Localizable.string(English)
"Hello" = "Hello";
"Buy" = "Buy this book";
"Register" = "Register for a new account";
```

let buttonTitle = NSLocalizedString("bear", comment: "The name of the animal")
print(buttonTitle)

## StoryBoardをi18対応する
各Storyboardに対応した多言語化ファイルが生成されているはずだ。
Main.storyboardなら
Main.strings(Japanese)
が作られているはず。
例

```swift

// Main.strings (Japanese)
"uZq-Aj-erb.text" = "Every Wednesday";
"uZq-Aj-erb.text" = "水曜日";
```

その中の文言を日本語に書き換えれば多言語化終了

# 参考
https://www.hackingwithswift.com/example-code/uikit/how-to-localize-your-ios-app
php heap試す

phpのヒープを試す。


## max heap
SplMaxHeapクラスが用意されている。
降順に取り出せる。


```php
        $values = [1,9,3,4,2,4,0];

        $maxHeap = new \SplMaxHeap();
        foreach ($values as $value) {
            $maxHeap->insert($value);
        }

        while($maxHeap->valid()) {
            $this->info($maxHeap->extract());
        }
```

```
9
4
4
3
2
1
0

```

## min heap
昇順に値を取り出せる。

```php

        $values = [1,9,3,4,2,4,0];

        $maxHeap = new \SplMinHeap();
        foreach ($values as $value) {
            $maxHeap->insert($value);
        }

        while($maxHeap->valid()) {
            $this->info($maxHeap->extract());
        }
```

```
0
1
2
3
4
4
9

```
PHPのマイナーパッケージ導入について

この記事は[PHP その2 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/php2)の19日目です。

# はじめに
PHPに限らず、開発において必要な機能をゼロから実装するのではなく、既存のパッケージを使って実装の工程を短縮するというのは、エンジニアなら誰しも経験することだ。しかし、GitHubでもスターが1K超えのパッケージならいざ知らず、スター二桁程度のマイナーパッケージを使うのは躊躇する。今回は、とある開発においてマイナーパッケージを使った結果どうなったかを記す。

# 発端
とあるサービスのリニューアル案件において、GraphQLベースのサーバーからデータを取得する必要があり、本来であればフロントエンド側でApolloあたりのメジャーパッケージを利用できれば良かったのだが、一旦結果をバックエンドで受けてからviewを出力する設計のほうが後々メンテナンスしやすいという結論に至ってしまった。このため、急遽バックエンド側で使用できるGraphQLクライアントが必要になった。

Guzzleをベースにして書いても良かったのだが、Githubで検索したところ、[euautomation/graphql-client](https://github.com/euautomation/graphql-client)というクライアントパッケージが見つかった。スター数は当時20前後。さて、これを使うかどうか私は悩んだ。

# 採用に至るまで
コードをチェックし、テストも一通り用意されていることを確認した。マイナーパッケージの場合、いつメンテが放棄されるか分からないので、いざとなったら自分でメンテする必要がある。今回はその点を判断基準として採用することを決めた。

# 採用から2年・・・
リニューアル案件を無事リリースし、そこから約2年が経過したことで、使用しているFWのバージョンアップが必要になり、それに併せ諸々のパッケージも更新することになった。しかし、本パッケージは恐れていた通り、アーカイブこそされないもののメンテされていない状態となっていた。結果本パッケージのcomposer.jsonが、Guzzleのひとつ前のバージョンである6.x止まりとなっていたため、FWや他のパッケージが要求する7.xに対応できなかった。

このためリポジトリをforkし、composer.jsonの記述を変更した[PRを出した](https://github.com/euautomation/graphql-client/pull/15)が、マージされることはなく、結局forkしたリポジトリをcomposerでrequireして対応することになった。

# まとめ
マイナーパッケージとはいえプロジェクトを効率的に推進するために必要であれば、導入すべきという気持ちは今も変わらない。しかし、こういった残念な結果になることが多々あるので、自分自身がメンテナンス可能かどうかという判断基準が重要である。
Releaseビルドをデバッグしたい

R8で難読化されたアプリがクラッシュするのでその調査のために
次の手順でReleaseビルドをデバッグ実行する。

Android Studio 4.1 にて "Ganarate signed Budle or APK" で作成した
keystore ファイルを使って module の build.gradle に下記のような設定を行う。

```
...
android {
...
    signingConfigs {
        local_release {
            storeFile file('LocalRelease.jks')
            storePassword 'password'
            keyAlias 'alias'
            keyPassword 'keypassword'
        }
    }
...
    defaultConfig {
        applicationId "jp.co.xxxx.hogehoge"
        minSdkVersion xx
        targetSdkVersion xx
        versionCode x
        versionName "x.x.x"
...
        signingConfig signingConfigs.local_release
    }
...
    buildTypes {
        release {
            // リリースビルドでのデバッグ許可
            debuggable true
            // リソースの圧縮
            shrinkResources true
            // コードの縮小、難読化、および最適化
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
...
```

デバッグ実行できるようになる。

ちなみに上記設定だと難読化が有効になっているので
Logcatのエラーログと下記のマッピングファイルを照らし合わせる。

```
...
java.lang.NullPointerException: Parameter specified as non-null is null: method i.w.d.i.e, parameter $this$toMutableList
...
```
こういう感じでパッケージやクラス名などが難読化される。

```
/app/build/outputs/mapping/developRelease/mapping.txt
```

mapping.txt に実際のクラスなどとのマッピング情報が記載されている。

以上。
Visual Studio Codeの差分表示機能を活用しよう！

※2022年から技術系の記事は[個人ブログ](https://yamaday0u.net/category/programmer/)に投稿しております。ぜひこちらもご覧ください→[yamaday0u Blog](https://yamaday0u.net/category/programmer/)

プログラミングスクールやweb公開されているカリキュラムなどで学習しているとき、
手本通りにコードを書いたはずなのにエラーになってしまった！ということがよくありますよね。

そんなときに便利なのがVisual Studio CodeのCompareコマンドをつかったファイル比較です。
個人的にとても感動したので共有します。

## 実行環境
- macOS Catalina 10.15.7
- Visual Studio Code:1.51.1

## ファイル同士を比較
次の画像を見てください。
右が正しいコードで、左がエラーになるコードです。
どこが違うが見つけられますか？
![スクリーンショット 2020-12-19 22.08.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849306/309420f9-edbd-bfd4-2a64-bc2bc1261b16.png)

この例では左右で色が違う箇所があるので、慣れている方は割とすぐわかると思いますが、そうでない方にはなかなか難しいと思います。

次にCompareコマンドを使ってファイルを比較するとこのようになります。
![スクリーンショット 2020-12-19 21.57.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849306/28e17e9d-bdf0-13ad-aeb5-24c859de2c3c.png)
いかがでしょうか？
左右のファイルで異なったコードが書かれている行がハイライトされ、異なっている箇所がさらに濃い色でハイライトされています。
ちなみに正解はバッククォート（``）で書くべきところをシングルクォート（''）で書いている、でした。

## ファイルとクリップボードを比較
Compareコマンドでは、コピーしてクリップボードに保存されているコードとも比較できます。
これにより、手本のコードをコピーして、自分が書いたコードと比較することができます。

## Compareコマンドの使い方
Visual Studio Code上で shift + command +　Pを押してCompareコマンドを起動します。
![スクリーンショット 2020-12-19 22.14.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849306/bd352f2f-b9af-3b27-9865-78ff02e0876a.png)

「ファイル：アクティブファイルを比較しています…」をクリックすると、比較するファイルを選ぶ画面が出てくるので、比較したいファイルを選ぶと、先程の画像のように比較することができます。

「ファイル：クリップボードとアクティブファイルを比較」をクリックすれば、クリップボードに保存されているコードと比較できます。
SQLiteのqueryで躓いたって話

#はじめに
これは私が初めてのAndroidアプリケーション開発で躓き、その後、解決した方法を備忘録として綴っています。

#データベースに追加したい物が既存であるか確認したかった
javaでSQLiteを利用したアプリケーションを作成中に、EditTextに入力されたitemが、既にデータベースに登録していた場合はアラートを表示させ追加しない処理をさせようとしていたがなかなか上手くできなかった。
##初めに行ったこと

```example.java
String item = editText.getText().toString();
Cursor c = db.query("table", new String[]{"item", "yen"}, "item = " + item, null, null, null, null);
```
これは調べた先の様々なサイトの内のいくつかに書かれていた方法でした。実際に試してみたところ...

```
android.database.sqlite.SQLiteException: no such column: リンゴ
```
といったエラーが表示されてしまいます。
####ちなみにカラムって...
それぞれの項目にあたる「列」のこと。
![database-terms2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532162/68dd5df8-0ba7-cf0f-08d6-0963223529c6.png)
https://26gram.com/database-terms

##try-catch文で挑戦
ってことでカラムを知らないし調べようともしなかった私は、try-catch文を利用して、tryで既存なのかを確認。catchでデータベースに追加すれば良くね？って思ったので実際にコードでしてみた。

```example.java
String item = editText.getText().toString();
try{
    Cursor c = db.query("table", new String[]{"item", "num"}, "item = " + item, null, null, null, null);
    /*既存の時の処理*/
}catch(Exception e){
    /*データベースに追加する処理*/
}
```
この結果を実行してみてみると...

| item | yen |
|:-:|:-:|
|  リンゴ | 100  |
|  リンゴ | 100  |

同じの追加されてるし！！あれれ～おかしぃぞ～...
色々と調べた結果、どうやら`"item = " + item`の書き方がいけないようです。(←ここでカラムの意味に気付き無事赤面)

##本来の検索方法
```example.java
Cursor c = db.query("table", new String[]{"item", "yen"}, "item = ?", new String[]{item}, null, null, null);
```
と書くことが正解のようです。最初に書いてたコードの方が直感的にわかり...ってことは置いといて書き方もわかったことだし次に進もう！

...としたところで、ここでもう一度躓きました。そのコードがこちら。

```example.java
Cursor c = db.query("table", new String[]{"item", "yen"}, "item = ?", new String[]{item}, null, null, null);
if(c.moveToFirst()){
    /*既存の時の処理*/
}else{
    /*データベースに追加する処理*/
}
```
カーソルを最初の位置に移動できる ⇒ 既に存在する　って発想に至ったわけですね。
実際のところ追加されてていようがなかろうが、そんなことに関係なく「正」になるため毎回、既存の処理が実行されてしまいました。

##既存かどうか判定する方法
では、既存かどうかを判断するプログラムは、最終的にどのようにして解決させたかというと、

```example.java
String item = editText.getText().toString();
Cursor c = db.query("table", new String[]{"item", "yen",}, "item = ?", new String[]{item}, null, null, null);
if(c.getCount() != 0) {
    /*既存の時の処理*/
}else{
    /*データベースに追加する処理*/
}
```
レコード(行)を数えてくれる機能を持ったメソッドがあったためそれを利用し、
・行数が0でなかった場合は既存の処理
・0行だった場合はデータベースに追加する処理
とすることで、希望通りのプログラムを実装することができました。

#####余談
`"item like ?", new String[]{"%" + item + "%"}`とすれば、SQLのlile句を利用し、その言葉が含まれるフィールド(要素)を探すことが出来ます。

#最後に
今回の記事はここまでになります。
Androidアプリケーションは今回が初めての挑戦だったため、躓くことも多かったですが、無事作成することができ、普段使用している携帯にインストールさせることが出来ました。
わからないことがあったら調べること。メソッドをよく確認し活用すること。
この2つを自分の座右の銘に追加し、これからもAndroidのアプリケーション開発に挑んでいけたらと思います。
アドバイス、質問等ありましたらコメント欄にてお願い致します。
最後までお付き合い頂きありがとうございました。
php queue/stack試す

phpでqueueとstackを試す。

## queue
先入先出し First In First Out。
入れた順番に取り出せる。
push/pop関数も使えるけどこれを使うとstackと同じ挙動になる。

```php
        $queue = new \SplQueue();
        for($i = 0; $i < 10; $i++) {
            $queue->enqueue($i);
        }

        while (!$queue->isEmpty()) {
            $this->info($queue->dequeue());
        }

```

```output
0
1
2
3
4
5
6
7
8
9

```


## stack
後入れ先出し Last In First Out

```php

        $stack = new \SplStack();
        for($i = 0; $i < 10; $i++) {
            $stack->push($i);
        }

        while (!$stack->isEmpty()) {
            $this->info($stack->pop());
        }
```

```output
9
8
7
6
5
4
3
2
1
0

```
VSCodeで空白を表示させる

##モチベーション
こちらも秀丸で行っていた設定をVSCodeで再現させる。
condigする上で見えない空白やtabが悪さすることあるので、全て表示したい。

##環境
VSCode 1.52
Win10

##設定
###空白を表示する
設定のeditor.renderWhitespaceをselectionからallに変更。

設定値の意味は以下の通り。
"none"：空白文字を描画しない
"boundary"：単語を分ける単一の空白文字以外は描画する
"all"：全ての空白文字を描画する
"trailing"：行末の空白のみ描画する
"selection"(default):選択している単語の空白のみ描画する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29032/a6c49d48-0605-0b7f-2e2b-38ce9c494be0.png)
あたり前だけど、全ての空白が「灰色の・」として表示される。
行末の無駄な空白は排除したいですよね。

###改行を表示する、は止めてみた
秀丸では同じように改行も表示している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29032/431a38e0-e206-78c0-a8f7-9d30f4d69176.png)
VSCodeだと右下に改行コード（CRLFかLF）が常に表示されているので、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29032/3486e549-895d-ac2e-ad98-5bcfd87d0f39.png)
エディタ上に表示させるのはやめた。
秀丸だと文字コードを選択する画面じゃないと改行設定表示されないので、表示していたんだ、ということに今更気づく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29032/3d4a9ae1-488c-9768-355d-d05af97f17e1.png)
アジャイルのPJに半年間参画して変わったこと

# アジェンダ
- はじめに
- アジャイル=スクラム？
- スクラムガイド読みづらい問題
- スクラムイベントで何すればいいの？
- アジャイルPJに参加して変化したこと

## はじめに
こんにちは、2020年度入社、ぴちぴちの一年生な@m1k50118です。
7月に今のPJに参画して約半年間が経ち、区切りもいいので半年前と後でアジャイルに対しての認識のギャップを整理していこうと思います

## アジャイル=スクラム？
そもそもアジャイルとスクラムがごっちゃになっていました。
アジャイルとスクラムっていう開発手法があるのかなーと思っていた時期がありました…
というのも、アジャイルの説明をする機会があったときに、アジャイル開発のことをアジャイル開発手法と説明してしまいました
なぜこの認識が生まれてしまったのか？
それはアジャイル開発とウォーターフォール開発を比較してしまっていたからだと思います
この比較によってアジャイルはPDCAを回していく開発手法なんだとういう**間違った認識**をしてしまいました。
今後はアジャイル開発を素早くPDCAを回して開発するという**考え、文化、宗教**と説明するべきかなと。（アジャイルはただの修飾詞ということを強く認識する）
そして、この開発をやりやすくするための手法、フレームワークとしてスクラム等がある、と説明すると認識違いが生まれないと思います
個人的にはウォーターフォールとスクラムを比較するのがいいのでは？と考えています

## スクラムガイド読みづらい問題
僕がPJに参画した時はまだ2020年版のスクラムガイドはリリースされていなかったので、2017年のスクラムガイドを読んでスクラムを学びました
ただここで問題だったのはスクラムガイドの**日本語の意味がわかりづらい！！**
読ませる気ないだろっていうぐらい行間は詰まってるし、英語版のスクラムガイドをgoogle翻訳にかけてそのままみたいな日本語だなと感じた記憶があります
今なら多少日本語の意味が掴みづらくても、何となく理解できますが、当時は全くイメージが湧いてこず、読んでて眠くなってしまいましたw
おそらくは読んでも理解できなかった理由は、専門用語が多いのとその意味がわかっていなかったからだと思います
この問題を解決するためには、スクラムを経験するのが手っ取り早いと思います
1週間のスプリントで専門用語を使いながら単語と経験のイメージを結ぶとスクラムガイドを読んだときに、イベントの目的やDev、PO、SMの役割を理解しやすいと思います

## スクラムイベントで何すればいいの？
PJに参加したての自分はプランニングでチームメンバーがPBIを完了するための話し合いをしているときに、話についていけず置いていかれることが多々ありました
よく「分からないことがあったら質問して聞いてね！」って言われることあると思います
ただ僕が思うのは、それをいうなら質問しやすい空気を作ってくれということです
僕は先輩方が僕に意見を求めてくれたので、発言することはできましたが、
これが、知識のある人たちだけで話していて、知識のない新人がプランニングに参加したとしても、話している内容を理解したり、何でそのやり方なんだ？という思考がどうしても働いてしまうと思います
内容を理解して質問しようと思ったらもう次のPBIの話しをしている…なんてことが、多かったです
これではタスクの内容を理解できず満足な仕事ができません
満足な仕事ができないことにより、なあなあで仕事を進めてしまいちゃんとした反省がしづらいです。
するとレトロでもチームの反省よりも個人の反省に向きがちです
個人の反省に向きがちなことによって次のスプリントが始まってもチームの中でどう動けばいいのか分からず結局満足な仕事ができなかったです
この負のスパイラルをするために、僕的にはこのPBIのゴールや目的は何かを説明するように言われたときが一番有効な手段だと思います

## アジャイルPJに参加してよかったこと
- 自分の意見を発言するようになった

やはりイベントで発言するように努めていたので、発言する（自分の意見を主張する）癖がつきました
新人同士での会議をしていると、僕の発言回数が多く、主張が通りやすいなと感じています

- コミュニケーションめっちゃとる

先ほどあげたこととかぶるのですが、やはり発言することで自分の考えを発信し、メンバーに理解してもらう、メンバーの考えを理解しやいです

## 最後に
PJに参画してからの半年間を振り返ってみましたが、自分のアジャイルに対する考えがいかに間違っていたのかを再認識できました
SIer業界で新人からアジャイルPJに参画できるのはとても幸運だと思っています
先輩方の知識を吸収しやすく、成長できる環境であり、何より仕事が楽しいと思えました
これからもアジャイルを学びいき、いつしかプロアジャイラー（そんな言葉はない）となれるよう精進していきます！！
[100%] CountDiv (codility lessons)

> _Respectable_
> ### [CountDiv](https://app.codility.com/programmers/lessons/5-prefix_sums/count_div/)
> 範囲[a..b]でkで割り切れる整数の数を計算します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196344/2bee8c60-29a5-44b2-b5e8-628cfbb2ae67.png)

#### タスク説明
関数を書く：

`class solution {public int solution(int A, int B, int K); }`

つまり、3つの整数A、B、およびKが与えられると、Kで割り切れる範囲[A..B]内の整数の数を返します。

`{i：A≤i≤B、i mod K = 0}`

たとえば、A = 6、B = 11、K = 2の場合、[6..11]の範囲内に2で割り切れる3つの数値、つまり6、8、10があるため、関数は3を返す必要があります。

次の仮定のための**効率的**なアルゴリズムを記述します。

* AとBは、[0..2,000,000,000]の範囲内の整数です。
* Kは[1..2,000,000,000]の範囲内の整数です。
* A≤B。

---

#### 解く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196344/4affece0-f8cc-abc9-9d7b-3b894d53ee07.png)

#### 著者注
これは数学的な問題です。本質を把握した後は、難度「Respectable」とは言わないでしょう。  
> 这是一个数学问题，抓到本质的话，其实并达不到Respectable的难度。

#### Program
[CountDivSolution.java](https://github.com/yp2211/algorithm/blob/main/src/codility/lessons/Lesson5_PrefixSums/CountDivSolution.java)

```java:CountDivSolution.java
    public int solution(int A, int B, int K) {
        return (int)(Math.floor(B / (double)K)) - (int)(Math.ceil(A / (double)K)) + 1;
    }
```

Detected time complexity:  
O(1)

#### jUnit
[CountDivSolutionTest.java](https://github.com/yp2211/algorithm/blob/main/test/codility/lessons/Lesson5_PrefixSums/CountDivSolutionTest.java)

#### Report
[Candidate Report: trainingMUJ282-CCG](https://app.codility.com/demo/results/trainingMUJ282-CCG/)
***

### See also: [CodilityのLessonsをすべて解く（更新中）](https://qiita.com/yp2211/items/537f733060bb0f2aba8f)
サービス改善提案をGitHub Issue へ半自動転換するNoCode活用事例

## これは何
[NoCode アドベントカレンダー](https://qiita.com/advent-calendar/2020/nocode) の20日目の記事です。


NoCode ツールである Zapier を使って、
Slack の投稿を半自動で Github Issue へ転換した事例の紹介です。

## Zapier とは
https://zapier.com/

> Easy automation for busy people. Zapier moves info between your web apps automatically, so you can focus on your most important work.

業務を効率化することを主眼に、アプリケーションとアプリケーションの間を連携するためのツールです。　
類似プロダクトとしてはIFTTTが挙げられます。

今回紹介する Slack と Github はもちろん、Google SpreadSheet や Salesforce などメジャーなツールはだいたい連携可能です。

## 実現方法
#### Slack にワークフローを追加する
弊社ではSlack には `#サービス改善提案` というチャンネルへサービスへの改善提案を受け付けています。
このチャンネルには Slack Workflow があり、決まった形式で投稿することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144064/09b68fe5-df31-57b0-1004-acaa2617e36a.png)


上記のフォームで入力されたものを以下のように繋げます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144064/f71cb429-54db-ca05-2153-a3df496639c3.png)

1. まずは入力内容をSlackに投稿
2. その投稿のスレッドに、Github Issue のタイトルにあたる入力をできるフォームを作成
3. Zapier が拾いやすい形式で再度スレッドに投稿

#### Slack 投稿を Zapier で受け取り
もしかしたらそのままアカウント情報入れて使えるかもしれないので、Zap（Zapierではワークフローをこう呼びます）の雛形を共有しておきます。 => https://zapier.com/shared/4d78a1c85d3648a21a3d54b0cb90fe24c8803de3


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144064/90735541-01c1-70a3-899d-ce1b28884481.png)

ステップは以下の通りです。

1. 特定のチャンネル、今回は `#サービス改善提案` の投稿を検出
2. 上の "Zapier が拾いやすい形式" で投稿した中の特徴的な文字列を使って、マッチした時のみ続きを実行（このケースだと `issueタイトル` です。）。このステップの目的は、無関係な雑談などの投稿がIssue化されることを防ぐことです。
    * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144064/704b1ca5-5ddb-4a8e-2582-897879d70e0e.png)

3. `issueタイトル:(.*)` の形式で入力されているものを Github Issue タイトルに転換するため抽出
    * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144064/97680a38-129d-ed1f-d69a-dbd70fb93b01.png)
4. 元の投稿リンクとタイトル、投稿内容を Github Issue として投稿
    * ![貼り付けた画像_2020_12_19_22_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144064/16136fe8-14d2-cbbd-1577-bc74d16915d0.png)


## 終わりに

もともとNoCodeツールはハードル高いイメージだったのですが、使ってみるととても便利でした。
サービス間の連携をコードを書いて実現すると、結構なコード量になるのですが、Zapierだと実質ちょっとだけ正規表現書けば終わりくらいのイメージです。
フルスクラッチで作ると最低でも1〜2日はかかるだろうという連携機能を1~2”時間”もあれは作れてしまいます。
IME ON/OFFの制御をShiftキーライクにする

# 概要

たとえば、

- Markdownを記載中
- 設定ファイルの記述中
- vimで入力モードからノーマルモードへの移行

これらで日本語と英語の入力が混在するときに、
英語入力 → IME ON → 日本語入力 → IME OFF → 英語入力 
とやるの、結構ストレスじゃありません？
たまに切り替えを忘れて、せっかく入力したのが無駄になったときは特に。

そこで、英語で[Shift]キー押してなら小文字入力から大文字入力になるみたいに、
何かのキーを押している間だけ日本語入力できて、放したら英語入力に戻れるようになったら、便利だなーと思って作ってみました

# 環境
OS : Windows 10 64bit
IME : Microsoft IME

# 作ってみた

キーリマッピングにはレジストリ変更型と常駐型の方法がありますが
押下状態を見るには監視しないといけないので常駐が組める AutoHotKey を使います

https://ja.wikipedia.org/wiki/AutoHotkey

またeamat氏 作成のIME制御のスクリプトを拝借させていただきました(感謝！！)
https://w.atwiki.jp/eamat/pages/17.html

実装した部分はこんな感じです

```
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

#Include lib\IME.ahk
#InstallKeybdHook

; メイン
_Main:
    SetTimer,_ImeAutoSwitch,ON
return

_ImeAutoSwitch:
    ; キーの入力状態を取得する
    ; vk1C 変換キー
    ; キーリスト
    ; http://ahkwiki.net/KeyList
    ; 英数、ひらがな/カタカナ、全角/半角キーは動作不安定
    ; AutoHotkeyのバージョンが上がってvk~, sc~を分けて判定できるようになっている
    GetKeyState, KeyState, vk1C, P

    ; IME ON/OFFの状態を取得![capture_2020-12-19 214638.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83304/3e1d093a-bc1b-2929-e74e-6477b4fb7152.png)

    ImeState := IME_GET()
    
    ; キーを離している場合
    If KeyState = U
    {
        ; IME ONだったらOFFにする
        If ImeState = 1
        {
            IME_SET(0)
        }
    }
    ; キーを押している場合
    Else If KeyState = D
    {
        ; IME OFFだったらONにする。ひらがなモードにしている。
        If ImeState = 0
        {
            IME_SET(1)
            IME_SetConvMode(0x09)
        }
    }
    ; ウェイト
    Sleep 200
return
```

# 使ってみたい？

下記の手順で行います

## AutoHotKey をインストールする

AutoHotKeyの公式ページからダウンロードします

AutoHotKey 
https://www.autohotkey.com/download/

この記事では version 1.1.33 で動作確認しています

## IMEの変換キーの制御を変更する

Microsoft IME の標準設定だと
半角入力の後に[変換]キーを押した際に再変換が行われてしまうので無効にします

1. タスクバーの［IME］アイコンを右クリック
2. メニューから［プロパティ］を選択する。 
3. [Microsoft IMEの設定]画面で、［詳細設定］ボタンをクリック
4.［Microsoft IMEの詳細設定］画面が開く
5. 「変換」キーの項目があれば2列目の"入力/変換済み文字なし"の機能選択を"-"に変更して[OK]を押す  
(最低限はこれだけですが、筆者は他の入力切替の箇所も"-"にしてます)

![capture_2020-12-19_193102.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83304/9ae25319-052c-95a2-9b57-0d9eb5539739.png)


## ファイル設置

ここから任意の場所に git clone するかダウンロードしてください

https://github.com/clickmaker/ImeAutoSwitch.git

## 起動

ImeAutoSwitch.ahk をダブルクリックか、右クリックで[Run Script]

タスクバーのインジケーターに緑のHマークがつけばOKです

![capture_2020-12-19 214638.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83304/8246fd2b-0a1a-1b82-ba1c-b237ce411787.png)

使い方は単純。テキスト入力する場面で、
全角入力、つまり日本語入力したいときはスペースキーの横の[変換]キーを親指で押しっぱなし
半角入力、英字入力したいしたいときは[変換]キーを放して入力します

## 停止

起動時についたインジケーターにある緑のHマークを右クリックして[Exit]を選択します

# 感想

この記事もこのスクリプトを実行しながら書いてますが、思った以上に便利(自画自賛)

IME切り替えが頻繁に必要な場面では便利だけど、長い文章を書き続けるときは押しっぱなしが結構大変かも。。
常駐ON/OFFできる機能を加えたいですね

もし使っていただけたらレビューもらえるとうれしいです
WindowsでWeb会議を録画する

[株式会社シンプルウェイ Advent Calendar 2020](https://qiita.com/advent-calendar/2020/simpleway) の12日目の記事です。後出しですw

-----

ウェブミーティングの画面を録画できたら便利ですよね。

なにか操作方法を教えてもらったことを見返すとか、議事録代わりにするとかできて便利そうです。

Windows 10なら標準機能でできます!

Zoom, Google Meet, Microsoft Teams, Skype, Discordなど、なんでもいいので会議のウィンドウがアクティブな状態で、キーボードの[Windows]キーを押しながら[G]キーを押してみてください。

Xbox Game Barが起動しましたか?

![Xbox Game Bar](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219010/9bcf50d7-864e-2d75-617a-9b78d2c01878.jpeg)

起動したら録画ボタンを押して、録画を開始するだけです。

![録画ボタン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219010/b2ce7124-5cc2-18a4-a075-d2ec61295e65.jpeg)

## Tips

* 録画は[Windows]キー+[Alt]キー+[R]キーでも開始できます
* 自分の声も録音したい場合はマイク入力をONにしましょう
  ![マイク入力をON](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219010/706599ea-b045-5a78-81f4-9313c88c94f8.jpeg)
* Chromeで会議に参加する場合はWindowsのゲーム設定で「ゲームオーディオのみ録音」の設定をOFFにしておきましょう (ONになっていると音声が記録されない模様)
  ![m05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219010/f06b1be9-289f-4ac4-b78a-c53c95590192.jpeg)
「【初心者】PHPで配列の重複を削除する」を参考にSymPy LiveとWolframAlphaでやってみた。


(オリジナルポスト)
https://qiita.com/wakiyo1017/items/80461451bbf26c0abf1c

##SymPy Liveで
(参考)
https://ja.stackoverflow.com/questions/72753/sympy-liveの和集合unionの正しい使い方を教えて下さい
##WolframAlphaで
入力
和集合[{"A", "D", "A", "G", "B", "C", "B"}]
https://www.wolframalpha.com/input/?i=%E5%92%8C%E9%9B%86%E5%90%88%5B%7B%22A%22%2C+%22D%22%2C+%22A%22%2C+%22G%22%2C+%22B%22%2C+%22C%22%2C+%22B%22%7D%5D&lang=ja
出力
A | B | C | D | G
【Java】文字列を切り出すsubstringの使い方

## はじめに
弊社のAdvent Calendar 12月19日分に参加させて頂きました。 
記事初投稿となりますので、暖かい目で見て頂けたら幸いです。

今回は、Javaで`文字列を切り出す`時に使用する`substringメソッド`について、自分用のメモとして記載していきます。

# substringとは
substringは、文字列の一部を切り出して新しい文字列として取得する為のメソッドです。


##開始位置のみを指定する場合

構文：`「対象の文字列.substring(開始位置);」`

```php

String target = target.substring(int beginindex); 
```
指定したインデックス番号から右側の文字を切り出します。

####例

```php

String target = "よろしくお願いします";
target = target.substring(4);

System.out.println(target);
```
結果

```php

お願いします
```
指定したインデックス番号から右側の文字を全て切り出して、新しい文字列として取得しています。
(※インデックス番号は、0から始まります。)

##終了位置を指定する場合
構文：`「対象の文字列.substring(開始位置,終了位置);」`

```php

String target = target.substring(int beginIndex, int endIndex); 
```
指定した開始位置から、指定した終了位置の文字を切り出します。

####例

```php

String target = "よろしくお願いします";
target = target.substring(4,7);

System.out.println(target);
```
結果

```php

お願い
```
開始位置のインデックス番号から右側の文字を、終了位置の手前まで切り出して新しい文字列として取得しています。
開始位置の文字は含まれるのに対して、終了位置は含まれずに`手前まで`になっているので注意が必要です。
Gitのプルリクエストができなかった話。

# プルリクエストが出てこない！

と、いう事件が起きました。アプリ上でバグが起きていた可能性もありますが、一点自分が間違っていたところのメモを残します。

# Default Branch
デフォルトブランチがなぜかmasterでなく他のものになっていた。
masterを作るより先に他のものを記述してしまっていたが為に、一番最初に作られたものがmasterブランチだと勘違いされてしまった。

#Default Branch を変えるには？
GitHubDesktopの（ブラウザで開かれていくほう）Code,Issuesの並びの一番右にあるsettingsよりbranchesを選択し変えていく。
変えたら、一度Github（アプリのほう）を終了し、再度起動。

defaultbranchがmasterになっていることを確認。

完了。
[100%] PermCheck (codility lessons)

> _Painless_  
> ### [PermCheck](https://app.codility.com/programmers/lessons/4-counting_elements/perm_check/)
> 配列Aが順列であるかどうかを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196344/44e6ccc3-8483-e804-a8fa-cfc240952132.png)


#### タスク説明
N個の整数で構成される空でない配列Aが与えられます。

順列は、1からNまでの各要素を1回だけ含むシーケンスです。

たとえば、次のような配列A：

```
     A [0] = 4
     A [1] = 1
     A [2] = 3
     A [3] = 2
```

は順列ですが、配列Aは次のようになります。

```
     A [0] = 4
     A [1] = 1
     A [2] = 3
```

値2が欠落しているため、は順列ではありません。

目標は、配列Aが順列であるかどうかを確認することです。

関数を書く：

`class solution {public int solution（int [] A）; }`

つまり、配列Aが与えられると、配列Aが順列である場合は1を返し、そうでない場合は0を返します。

たとえば、次のような配列Aが与えられます。

```
     A [0] = 4
     A [1] = 1
     A [2] = 3
     A [3] = 2
```

関数は1を返す必要があります。

次のような配列Aが与えられます。

```
     A [0] = 4
     A [1] = 1
     A [2] = 3
```

関数は0を返す必要があります。

次の仮定のための効率的なアルゴリズムを記述します。

* Nは[1..100,000]の範囲内の整数です。
* 配列Aの各要素は、[1..1,000,000,000]の範囲内の整数です。

---

#### 解く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196344/7cc69c06-1606-5612-c13e-886fb1a26f8d.png)

#### Program
[PermCheckSolution.java](https://github.com/yp2211/algorithm/blob/main/src/codility/lessons/Lesson4_CountingElements/PermCheckSolution.java)

```java:PermCheckSolution.java
    public int solution(int[] A) {
        java.util.Arrays.sort(A);
        for (int i = 0; i < A.length; i++) {
            if (A[i] == i + 1) continue;
            else return 0;
        }

        return 1;
    }
```
Detected time complexity:  
O(N) or O(N * log(N))

#### jUnit
[PermCheckSolutionTest.java](https://github.com/yp2211/algorithm/blob/main/test/codility/lessons/Lesson4_CountingElements/PermCheckSolutionTest.java)

#### Report
[Candidate Report: trainingVGBR4Z-S47](https://app.codility.com/demo/results/trainingVGBR4Z-S47/)

***
### See also: [CodilityのLessonsをすべて解く（更新中）](https://qiita.com/yp2211/items/537f733060bb0f2aba8f)
Salesforce と Pardot のインテグレーション　⇒　Pardot アカウントの設定

１．Pardot カスタム項目を、該当する Salesforce 項目に対応付けるのはなぜですか?
２．マッピングされていない Pardot ユーザにリードが割り当てられている場合、そのリードはどうなりますか?
３．Pardot と Salesforce との間でシングルサインオンを有効にするのはなぜですか?
４．Salesforce のリードおよび取引先責任者を Pardot にインポートするのはなぜですか?
５．モバイルアクセスする Pardot の情報はどこで追加しますか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/35202147-3115-e2c3-12c9-fe5bf13bda33.png)
[100%] MissingInteger (codility lessons)

> _Respectable_
> ### [MissingInteger](https://app.codility.com/programmers/lessons/4-counting_elements/missing_integer/)
> Find the smallest positive integer that does not occur in a given sequence.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196344/7efe6d3d-38ec-b3b3-b2cd-7db1e4182168.png)

#### タスク説明

関数を書く：

`class solution {public int solution（int [] A）; }`

これは、N個の整数の配列Aが与えられた場合、Aで発生しない最小の正の整数（0より大きい）を返します。

たとえば、A = [1、3、6、4、1、2]の場合、関数は5を返す必要があります。

* A = [1、2、3]の場合、関数は4を返す必要があります。
* A = [-1、-3]の場合、関数は1を返す必要があります。

次の仮定のための効率的なアルゴリズムを記述します。

* Nは[1..100,000]の範囲内の整数です。
* 配列Aの各要素は、[-1,000,000..1,000,000]の範囲内の整数です。

---

#### 著者注

当該問題には多くの解決策があります。
この記事では、大規模なユーザーシナリオでよく使用されるデータ構造の1つでもある、基本的なデータ構造「バケット」を紹介したいと思います。
たとえば、数億人のアクティブユーザーのシナリオで、キャッシュクラスターを使用してユーザーの「N日間の連続ログイン...」機能を実現する場合、このデータ構造を採用でき、キャッシュの無効化時間の使用を併せて、高性能の業務機能を簡単的に実現できます。

> Roc Yang: 
> 本题解法有很多，本文想介绍一种基本数据结构“Bucket”，也是海量用户场景下常用的数据结构之一。比如亿级活跃用户场景下，使用缓存集群实现用户“连续登陆N天...”功能时，就可以采用这种数据结构，配合缓存的失效时间，很方便的实现高性能的此类业务功能。

#### 解く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196344/48c47cee-4cc5-2915-91e1-4879de6cc14c.png)

#### Program
[MissingIntegerSolution.java](https://github.com/yp2211/algorithm/blob/main/src/codility/lessons/Lesson4_CountingElements/MissingIntegerSolution.java)

```java:MissingIntegerSolution.java
    public int solution(int[] A) {
        boolean[] B = new boolean[1000001];
        java.util.Arrays.fill(B, false);
        for (int i = 0; i < A.length; i++) {
            if (A[i] > 0) {
                B[A[i]] = true;
            }
        }
        for (int j = 1; j < B.length; j++) {
            if (!B[j]) return j;
        }

        return 1000001;
    }
```

Detected time complexity:  
`O(N) or O(N * log(N))`

#### jUnit
[MissingIntegerSolutionTest.java](https://github.com/yp2211/algorithm/blob/main/test/codility/lessons/Lesson4_CountingElements/MissingIntegerSolutionTest.java)

#### Report
[Candidate Report: training33X6JS-SN7](https://app.codility.com/demo/results/training33X6JS-SN7/)
***

### See also: [CodilityのLessonsをすべて解く（更新中）](https://qiita.com/yp2211/items/537f733060bb0f2aba8f)
【React】デバイスによってレスポンシブに条件分岐できるreact-responsiveの紹介

## 背景
reactで、レスポンシブウェブデザインを実装しようとしたとき、sp画面では`display:none`、pc画面では`display:block`などで画面の幅によって表示、非表示をcssで管理しなければならず、cssのことも意識してコードを見ないといけないので、可読性が落ちてしまっていた。特にチーム開発をしているとより煩わしく感じてしまっていました。

そんな中最近僕が見つけたreact-responsiveというパッケージのhook機能が便利だったのですが、他に紹介している記事があまりなかったのでここで紹介したいと思います。

#### 主な機能

- hook（超便利）
- MediaQueryコンポーネント（こちらはいろんなサイトで紹介されていたので割愛します。知りたい方は[末尾](#もっと知りたい)にURLを貼っておきます。）

## v8.0.0からの追加機能でhookできるようになった
※現在はv8.2.0です。（2020/12/19地点）[パッケージ情報]('https://www.npmjs.com/package/react-responsive/v/8.2.0')


```shell
$ yarn add react-response 
$ yarn add --dev @types/react-response //typescript用
```

以下に示しますが、`useMediaQuery()`が使えるようになり、デバイスの幅によってbooleanを取得できるようになりました。これによって今までcssで状態を管理しなければならなかったものが条件分岐によって制御できるようになりました。

```react
import React from "react"
import { useMediaQuery } from "react-response"

const Index = () => {
  const isMobileScreen: boolean = useMediaQuery({ query: '(max-width: 560px)'})
  
  return (
    <div>
      <h1>テストです</h1>
      {isMobileScreen && (
        <p>スマホ画面で表示される</p>
      )}
    </div>
  );
}
export default Index;
```

かなり便利ですよね。
↓hookできるので他にも`return`する内容も変えることができます。↓

```react
import React from "react"
import { useMediaQuery } from "react-response"

const Index = () => {
  const isMobileScreen: boolean = useMediaQuery({ query: '(max-width: 560px)'})

  if (isMobileScreen) {
    return (
      <div>
        <h1>スマホ画面です。</h1>
      </div>
    );
  } else {
    return (
      <div>
        <h1>PC画面です。</h1>
      </div>
    );
  }
}
export default Index;
```
**しかし**、この書き方で注意しなければいけないのは、`return`を制御しているため、一度レンダリングが走ったのち、デバイスのwidthが変更になっても、再びリロードしてレンダリングさせないとそのままだということです。

いづれにしろ、これでcssを見なくてもどの時、何が表示されるのか見やすくなりました。

## もっと知りたい
react-responsiveは他にもコンポーネントで囲む物などがあって、便利なのでチェックしてみてください。

- https://www.npmjs.com/package/react-responsive
- https://qiita.com/computer-penguin/items/ebe033d5f93cf9571f3c
【FileMaker】QRコード（バーコード）をテキストフィールドで読み取る

過去、何回かQRコードの読み取りについて記事にしてみなさんに見ていただきました。

[【FileMaker】来場者チェックをQRコードでやろう](https://qiita.com/tyuma/items/ca16b6a3c3103e5214b1)
[【FileMaker】連絡帳に仕込んだQRコードでFileMakerの顧客情報を閲覧する](https://qiita.com/tyuma/items/d5cbf3ce2c135b1278a6)
[【FileMaker】QRコードを読み込んで湯婆婆に名前を決めてもらう](https://qiita.com/tyuma/items/a8a887e019b1d5e58ae7)

これらはわかりやすくカメラを起動してオブジェクトフィールドに取り込み、文字情報を別のフィールドに保存していました。

FileMaker Goでは、その他のやり方として、直接テキストフィールドにQRコード（バーコード）を読み取って文字情報を保存することができます。

# FileMaker バージョン
FileMaker Goでバーコードが取り扱えるようになった13以降で試してみてください。

# 動き
こんな感じです。
動作が早すぎて一瞬なので、目を離さずに見てくださいね！
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">またもやQRコードネタだよ。 <a href="https://t.co/oJaYmdwULh">pic.twitter.com/oJaYmdwULh</a></p>&mdash; Guppy Web Service (@GuppyWebService) <a href="https://twitter.com/GuppyWebService/status/1340273122419769344?ref_src=twsrc%5Etfw">December 19, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# テキストフィールドでもカメラを起動できる
FileMake Goでキーボードを立ち上げるとこんなマーク、見ませんか？
![IMG_3493.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/753bf83c-7ebb-0159-5d29-059299951992.png)
ハンバーガーマークに上矢印。

キーボード以外に、「ま、便利に入力できるっしょ」といくつかタップするだけで自動入力できるものがあります。
![IMG_3494.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/3afb6d5b-b346-d4bc-2d04-d055c364a54b.png)
・現在の日付
・現在の時刻
・現在のユーザ名
・バーコード
の4つです。
この中にある、バーコードをタップすると、カメラが立ち上がってQRコード（バーコード）の読み取りが行えます。
それぞれのFileMaker Goバージョンによっては、読み取れるバーコードの種類が違いますので、バージョンごとに確認してください。

たったこれだけのTipsですが、オブジェクトフィールドからの読み取る場合はGetAsText関数でテキストデータに変換しなくてはならないので、手間が省けます。
どちらでも同じようにQRコードを読み取ることには変わりないので、実際に読み込んだ画像を保存しておきたい場合はオブジェクトフィールドで、単に読み取ったテキストデータがあれば加工できるからOK！という場合はテキストフィールドで読み取る、というような感じでどうでしょう。
VSCode で `.css` ファイルを PostCSS として読み込ませる

こちらの stackoverflow に答えがありますが、あまり日本語の記事が見当たらないので残しておきます。
https://stackoverflow.com/questions/49981905/how-to-parse-css-files-as-postcss-in-vscode

## 1. VSCode の設定から `"files.associations"` を追加する

VSCode の Settings の Preferences から、設定用の json ファイルを開きます。

そしてそこに以下を追記します。

```json
{
  "settings": {
    "files.associations": {
      "*.css": "postcss"
   }
  },
}
```

## 2. PostCSS の言語サポートプラグインをインストールする

1番だけだと、`.css` ファイルがただのテキストファイルのような表示で読み込まれてしまいます。

なので、PostCSS の言語サポートプラグインをインストールすることで、PostCSS用の表示を可能にします。

https://marketplace.visualstudio.com/items?itemName=cpylua.language-postcss
TypeScript4.1から正式に登場したテンプレートリテラル型について

ついに[TypeScript4.1がリリース](https://devblogs.microsoft.com/typescript/announcing-typescript-4-1/)されましたね。
今回のリリースの目玉はなんと行ってもテンプレートリテラル型なのではないでしょうか。

今回はテンプレートリテラル型とはなにか、具体的な使い所について触れていこうと思います。

## テンプレートリテラルとはなんだったか
まずはテンプレートリテラルとはなんだったか確認です。
テンプレートリテラルとは組み込み式を扱うことが可能な文字リテラルのことです。
粗雑な覚え方としてはバックティック文字で囲まれた文字列のことです。

```j
`hogehuga`
```
これがテンプレートリテラルです。

またこのテンプレートリテラルは連結が可能です。

```javascript
console.log(`hoge` + `huga`);
```

またこのような糖衣構文での表現が可能です。

```javascript
const huga: string = 'huga'
console.log(`hoge${huga}`); // -> "hogehuga"
```
これ意外にもテンプレートリテラルでできることは数多くあります。

テンプレートリテラルの詳細はMNDを参考にして下さい。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Template_literals

## テンプレートリテラル型とは？
テンプレートリテラルの使い方について復習も済んだところで今回の主題であるテンプレートリテラル型について触れていきましょう。
テンプレートリテラル型とはテンプレートリテラルと同じ型空間に生成されます。
テンプレートリテラルと同じくバックテイク文字でとじられていおり、＄｛T｝にstring, number, boolean, bitを型として持つことができます。
${}の中身はTypeScriptの式として評価されます。

```typescript
const a = "1";
const b: number = 1;
console.log(`＄｛a + b}`);  // ->11
```
となります。
テンプレートリテラル型ではテンプレートリテラルの連結や非プリミティブ型のリテラルを文字リテラルに変換が可能で
型推論から簡単ではありますが文字リテラルのパターンマッチができます。

またプレースホルダー内のunion型はテンプレートリテラル型に分散されます。
なので`${A|B}`は`${A}`|`${B}`に変換され、`${A|B}, ${C|D}`は`${A},${C}` | `${A},${D}` | `${B},${C}` | `${B},${D}`
プレースホルダー内にnever型を持つ場合にはテンプレートリテラルはneverに変換されます。


## 具体的な使い所
ここまでテンプレートリテラル型の基本的な機能にふれてきました。
では実際にどんなことができるのか確認していきましょう。

```typescript
const x = 'hoge'
const y = '${x}huga'
A extends `${infer B}huga`? B : never
```
この書き方できます。
この書き方ではAが"hogehuga"のときBがhogeに推論されます。
このような書き方ができるとパターンマッチで文字列の分割が可能です。

このようなTypeScriptが今まであまり得意でなかった文字列の操作と参照がパワフルにできるようになります。
ぜひとも活用してより良い開発ライフを！！
さくらレンタルサーバーでword2vec（magnitude）実行は不可能。

> ⚠️2020/12/24追記
[ロリポップマネージクラウドではpymagnitude-liteで成功しました。](https://qiita.com/Yamkaz/items/525e3f9647be24a77d97)やったね。

word2vec、magnitudeをさくらレンタルサーバーで使用しようとしましたが、結果無理だったという報告です。
同じチャレンジをしようとしている方に伝えたいです。

まず、word2vecを使おうと思いましたが、most_similarが遅すぎるので高速化されたmagnitudeを使用しようとしました。
https://github.com/plasticityai/magnitude

以下のコードでインストールし、使用しようとしましたが、pytorchが必要なんですよね。
pytorchはさくらレンタルサーバーのOS、FreeBSDでは動きませんでした。どうやらGPUのついたサーバーしかダメみたいです。

```
pip install pymagnitude
```

なんとか方法を探りましたが、pymagnitude-lite、（pymagnitude-light）なるものをしりました。
これはPytorchやAnnoyとの依存関係が削除されたpymagnitudeだとの記載があったため、感動し、すぐさま使用しました。
https://pypi.org/project/pymagnitude-light/
https://pypi.org/project/pymagnitude-lite/

ですが...
python 2.7,2.7.10,3.6.6,3.9を試しましたが、
pythonのsite-packegae内にある、__init__.pyから以下のエラーが出て結局使えません。
sqliteのエラーっぽい？
ここで断念しました。

```
return sqlite3.connect(*args, **kwargs)","sqlite3.OperationalError: unable to open database file"]
```

結局、gpuの入った高いレンタルサーバーを使うしかないんでしょうか？

解決された方は教えてほしいです。
CSS GridでMediumみたいなブログを作る

はじめまして、咲といいます。
もうちょっとでクリスマスですね。:santa_tone1:

私は、フロントエンドエンジニアとして約半年ほど働いています。
ソースを探すことに四苦八苦したので、メモとして役に立ちそうな情報を書いていきたいと思います。

さて、クライアント様からのご依頼は、
__[Medium](https://medium.com/in-fitness-and-in-health/how-to-upgrade-your-morning-coffee-16a9b6bacb99)っぽいレイアウト＆スタイル__ということでした。

- PCからだと3カラム、記事の左右に余白
- 左カラムに動くサイドバーとSNSシェアボタン

ソースコードを読んだりして地道に作りました。
こちらのサイトはお洒落ですね〜なんともわかりやすい。
ただ、課金制になってから(?)なのか何件か読むとログインしなきゃのでほとんど使っていませんが... :P

####1. まずはグリッドレイアウトで、ページの枠組みを作ります。
このページを使うと簡単に作ってくれます。
[CSS Grid Generator](https://cssgrid-generator.netlify.app/)

```scss
.grid {
    display: grid;
    grid-template-columns: 18% 1fr 18%;
    grid-template-rows: 70px 1fr auto;
}
```

1frは、指定したコンテントの幅や高さに合わせてくれます。
そこで、ブログ記事など大きさを固定できない場合に便利です。
以下、引用

####2. サイドバーのスタイル
```scss

.article_body {
    height: 100%;
    grid-area: 2/2/3/3;
}

.article_sidebar-container {
    grid-area: 2/1/4/2;
    //この辺の高さの設定が大事
    overflow: hidden;
    position: sticky;
    position: -webkit-sticky;
    height: -webkit-fit-content;
    height: -moz-fit-content;
    height: fit-content;
}

.article_sidebar {
    //こっちも高さをfit-contentに
    height: -webkit-fit-content;
    height: -moz-fit-content;
    height: fit-content;
    text-align: center;
}

.article_footer {
    grid-area: 3/2/4/3;
}
```

左のサイドバーのスタイル設定は、すこし違うとスクロールしてついてくる高さが変わったりします。そこで結構てこずりました。


<p class="codepen" data-height="503" data-theme-id="light" data-default-tab="result" data-user="sakiadachi88" data-slug-hash="RwGgYBN" style="height: 503px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Grid Css blog layout">
  <span>See the Pen <a href="https://codepen.io/sakiadachi88/pen/RwGgYBN">
  Grid Css blog layout</a> by Saki Adachi (<a href="https://codepen.io/sakiadachi88">@sakiadachi88</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>

ありがとうございました！
「参照系の操作はRepositoryではなくQueryServiceに依存する」ことをArchUnitでテストする

「参照系の操作はRepositoryではなくQueryServiceに依存する」ことをテストしてみる。

## テストコード

```java

@AnalyzeClasses(packages = "com.example")
public class CommandQueryTest {

    @ArchTest
    static ArchRule get_endpoint_depend_on_query_service =
        classes().that().resideInAPackage("com.example.application")
            .should().onlyAccessClassesThat().resideInAPackage("com.example.queryservice");
```

特定の参照結果を得たいだけであればQueryServiceのクラスに依存していることをテストすることで判定できる。
他のクラスにも依存せざるを得ない場合は、個別に羅列するか、Repositoryクラスに依存しないことをテストすれば良い。
Linuxについて勉強したのでまとめてみた

#はじめに
Linuxについて勉強したのでまとめます。
サーバー用OSのイメージが大半だと思います。
種類もRedHatやCentOSなど種類が多く、全体像がつかみづらいのでまとめてみました。

#Linuxとは
Windows、MacOSなどOSの一種としてLinuxがあります。
OSとは、ハードウェアとアプリケーションの仲立ちをするもので、
PCにインストールされている事でマウス操作やアプリを使う事ができます。

厳密には、カーネル（OSの核）部分をLinuxと呼びます。
Linux OSとはディストリビューションのことを指します。
（ライブラリ、シェル、GUI環境、サーバーソフトウェア等が入っているパッケージ）
↑これの種類にRedHatやCentOSがあります。

<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/912720/a362a067-3eac-3ca1-9d5d-9bba5f6f528e.png">


#背景
歴史的背景は、UNIXのオープンソースとして、Linus Torvaldsさんが開発しました。
誰だよって思われた方は、以下のワードで検索してみてください。

リーナス・トーバルズ　windows7
リーナス・トーバルズ　NVIDIA

このエピソードを知って自分は親しみを持てるようになりました(笑)


#ディストリビューション
ディストリビューションとして様々なものが開発されている。代表的なものは以下の通り。

・Red Hat系
　Fedora：レッドハット社の後継となる無償ディストリビューション
　Red Hat Enterprise Linux：企業システム用に安定性を追求 有償でレッドハット社サポートあり
　CentOS：RHELのコードを元に作られた無償ディストリビューション サポート不要の企業で人気


・Debian系
　Ubuntu：初心者に配慮し使いやすさを重視　デスクトップ用途で人気


<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/912720/699cdd9b-be14-5a86-6099-627ade985530.png">

WEBアプリ開発でmacが使われる理由は、同じUNIX系のOSで相性が良いためだと思ってます。
実際にWEBアプリ開発のオンライン教材などでは、macが推奨されている事が多いと思います。

自分はWindows対応の教材に取り組みましたが、初めにUbuntuの環境構築を実施しました。

#Linuxの用途
・サーバー用OS
　LinuxはCUIでメモリを使わないため高速、コマンド操作のため初心者には扱いにくい
　一方、WindowsサーバーはWindows PCと相性が良い

・デスクトップ用OS（クライアント）
　海外の安価なPCにはLinuxが搭載されている
　Windows、macに続いてシェアは第3位

他にも
組み込み機器（携帯や家電製品）、スーパーコンピューターにもをLinuxが使われているそうです。


#おわりに
Linuxについて学んでみて、アプリ開発にも役立つ部分が多いなと感じました。
メールやデータを送る事の理解、LinuxとWEBアプリのディレクトリ構成も似てる部分が多かったためです。

これからLinuxを勉強される方に資格試験について紹介です。
LPICというLinuxの世界共通の認定試験があり、レベル1～3まであります。
レベル1は、101試験と102試験の2つに合格すると取得できます。
ping-Tというサイトで一部無料の問題集があるので勉強される方にはオススメです。

Linux勉強の参考になれば幸いです。


参考：書籍名「1週間でLPICの基礎が学べる本」