OmniAICreator/Qiita-1.07M huggingface dataset:
【Sass】Sass（SCSS）について

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

## Sassとは
Sass（サス）とは、少ない記述量やコードを再利用することができるCSSをより効率的に書くことができる言語です。
SASS記法とSCSS記法をがあります。それぞれの違いについては以下のページをご参照ください。
[【Sassの始め方】 SASS記法とSCSS記法の書き方の違い＆環境構築を解説](https://it-web-life.com/sass_scss_difference_environment/)
以下はSCSS記法についての記述になります。

##Sassでできること

###入れ子構造
CSSでは入れ子はできませんが、Sassではセレクタの中に別のセレクタを入れ子にして指定することができ、以下のメリットがあります。

- 同じセレクタを何度も書く必要がない
- クラス名を変更した際に修正が必要な箇所が少なくなる（大規模になればなるほど有利）

記述の具体例は以下のとおりです。

```stylesheet.scss

 main {
  margin: 20px;
  padding: 20px;
  border-radius: 5px;
  background-color: #f567ae;
  
  // mainのh1にのみ適用
   h1 {
     color: #f8f8f8;
     font-size: 20px;
   }
  
  // mainのpにのみ適用
  p {
    color: #efefef;
    font-size: 10px;
  }
}

```



## おわりに
今後、Sassについて学習をし、こちらに追記していこうと思います。
Vueプロダクトに人を追加するとき

これは備忘録です。

１．nodeを入れてもらう。
windowsならnodist、macならnodebrewを入れてもらう。

２．nodeとnpmのバージョンを合わせる。
プロダクトのnodeを入れてもらい、nodist使いならnodist nom matchでバージョンを合わせる。

３．npm install -g @vue/cli　や、npm installを行う。

４．npm run serveできるはず…！
curlを並行実行する

# 実施方法

性能テスト用に1秒間に300リクエストをcurlで送る方法を調べました。

テスト用にサーバーを立てます。

```
docker run --rm -p 80:80 kennethreitz/httpbin
```

またはnodejsでサーバーを立てる。

```
const express = require("express");
const app  = express();
const port = 80;
var i = 0 
// ルーティングの設定
app.get("/", (req, res) =>{  
  res.sendStatus(200)
  console.log(i);
  i++;
});

// HTTPサーバを起動する
app.listen(port, () => {
  console.log(`listening at http://localhost:${port}`);
});
```

httpbinの場合は、localhost/status/200にアクセスするとステータスコードの200が返ってきます。

早速、curlの並行実行の準備をしていきます。

リクエストを送りたいURLのファイルを作成します。
`url = "localhost/status/200"`を300行書きます。

```data.txt
url = "localhost/status/200"
url = "localhost/status/200"
url = "localhost/status/200"
.
.
.
url = "localhost/status/200"
```

それではcurlをたたきます

```
time curl --parallel --parallel-immediate --parallel-max 300 --config data.txt -s -X POST -s
```

結果
0.3秒で300リクエストを送れました。

```
real    0m0.309s
user    0m0.049s
sys     0m0.155s
```


# 参考にしたサイト
https://stackoverflow.com/questions/46362284/run-multiple-curl-commands-in-parallel

https://qiita.com/sameyasu/items/adacceb8a1bee893599b
PHP 言語構造ってなんだ？？？

## 目的

- 「オーバーヘットがあるから`is_null()`より言語構造の`isset()`か`empty()`を使ったほうがいいかもね〜」って教えてもらって「言語構造」がそもそもよく分かっていなかったので調べてみた

## 言語構造

- 下記のリンク先に記載されているキーワードはすべてPHPの言語構造である。
    - [https://www.php.net/manual/ja/reserved.keywords.php](https://www.php.net/manual/ja/reserved.keywords.php)
- `これらは言語を構成するものです`と言われている通り、どうやらこの一覧に記載されているものはPHPの言語を構成するそのものらしい。
- この一覧の中に`isset`や`empty`が含まれており、これらは呼び出し方法こそ関数に似ているけど関数とは全く別物らしい。
- その証拠に`isset`と`empty`の公式マニュアルには`注意: これは、関数ではなく 言語構造のため、可変関数 を用いて コールすることはできません。`と記載されている。
    - [isset](https://www.php.net/manual/ja/function.isset.php)
    - [empty](https://www.php.net/manual/ja/function.empty.php)

        ![PHP__empty_-_Manual.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/9cf6dbce-8060-1d1f-b7a2-53e0004d9045.png)

- `if`とか`class`とかも言語構造に含まれているらしく、たしかになんの疑問もなく`if (式) {式がtrueのときの処理}`みたいに書いてたけどこれはPHPの基礎部分となる言語構造に記載されているから処理分岐をする事ができているっぽい。

## じゃあ先輩が言ってた「`is_null()`はオーバーヘットがあるから」はどういう意味か？

- そもそも`is_null()`は引数に指定された変数がnullかどうかを調べる関数である。
- この関数はPHP内部で定義されている。
- PHP内部で定義されているということはユーザー定義関数と同じように`function`を用いて`is_null()`は定義されているということだ。
- 当該の定義の中では「引数に指定された変数がnullの時trueを、null以外のときはfalseを返す処理」がPHPによって記載されている。
- ここで`is_null()`と`isset()`や`empty()`で下記のような差が生まれる。
    - `is_null()`
        1. 定義されている関数を呼び出す。
        1. 引数を用いて処理を行う。
        1. 結果を返す。
    - `isset()`や`empty()`
        1. 言語構造の振る舞いによって処理を行う。
        1. 結果を返す。
- 要は、PHPの根幹部分に組み込まれている言語構造を用いるなら「定義されている関数を呼び出して内部でいくつかの処理をする」時間がかからないよね！ということだ。
- もちろん`is_null()`の「関数呼び出し→引数を用いて処理」の時間は一瞬なので、気にするほど処理に差が出るわけではない。ただ、差があることは事実なので、積極的にその他の言語構造も使って処理速度を意識した実装をしてゆきたいと思った。
Slideshare のフルスクリーンを真・大画面表示にする

# Slideshare のフルスクリーンが小さい

Slideshare でスライドを見るときに、大きく表示するフルスクリーン機能がありますが、なぜか小さい見た目になってしまうことがあります。スライドの枚数が多いと、小さいままの確率が高い気がします。

![image-20211223165810677.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/7038eace-728e-02b9-f1f4-3b03d43177af.png)



日本には「大は小を兼ねる」ということわざがあります。ということで Stylus を使ってフルスクリーンをさらに大きくする方法を編み出しました。次の画像のように、非常に大きく見やすい表示にできます。

![image-20211223220254693.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/bed98837-93c2-6cdf-8ee7-4aca04d10359.png)



それでは方法をご紹介します。



# Stylus をインストールする

Chrome に次の拡張機能をインストールします。Firefox でも動くらしい。

https://chrome.google.com/webstore/detail/stylus/clngdbkpkpeebahjckkjfobafhncgmne

![image-20211218113645387.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/58e79337-c4ca-df9e-8b45-790380b81ed2.png)



# Sideshare 用 css をインストールする

自分が作成した css ファイルを、GitHub で公開しています。インストールするために、次の URL にアクセスします。

https://github.com/Sugi275/stylus-slideshare-fullscreen/raw/main/stylus-aws-management-console.user.css



すると、次のような画面になるので、左側にあるインストールをおします。

![image-20211223220600333.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/52aa6c3e-f250-61b3-9718-a2d1adac0b92.png)



これで準備完了です！



# 動作確認

適当に Slideshare 上のスライドを見に行きましょう。

https://www.slideshare.net/Slideshare/get-started-with-slide-share



そして、フルスクリーンボタンをおしてみると、、、

![image-20211223220812884.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/71861053-70c8-a824-82de-9fc5af6342e3.png)



とても大きく表示されます！便利！

![image-20211223220822376.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/fb50c8d2-faa1-6203-6d03-e1a944b9953b.png)



# まとめ

Stylus を使って Slideshare の大きさを大きくする方法を紹介しました。導入が簡単なので、小さくて気になってた方はぜひためしてみてください。
AWSにWordpressインストール

AWSを初めて触り、ホームページを作るのもなんだかんだ初めてだったので備忘録がてら記録

# とりあえず無料枠でEC2インスタンス作成
* いったんほぼデフォルトに設定
* セキュリティグループの設定でHTTPとHTTPSを追加しておく
* キーペアを作成してダウンロード（二度とダウンロードできなくなるので注意）  
キーの拡張子がpemからcerに変わったらしい  

# SSH接続
```
$ ssh -i "cerファイルパス" ec2-user@パブリックIP
```

# Apachインストール・起動
```
# yum install httpd
# systemctl start httpd
```

# PHPインストール
```
# amazon-linux-extras install php7.3
```
## WordPressに必要なライブラリのインストール
```
# yum install php-mbstring php-gd
```

# Apach再起動
```
# systemctl restart httpd
```

# MariaDBインストール・起動
```
# yum install mariadb mariadb-server
# systemctl start mariadb
# mysql -u ユーザー名(初期状態は'root'のみ） -p
```

# WordPressインストール
## ダウンロード・展開
```
# wget https://wordpress.org/latest.tar.gz
# tar xzvf latest.tar.gz
```

## Apacheから見える場所に移動
```
mv wordpress/* /var/www/html/
```

## Apacheユーザに書き込み権限を付与
```
# chown apache.apache -R /var/www/html
# chmod +w -R /var/www/html
```

## インストール
インストールページ(http://パブリックIP/wp-admin/install.php)を開く
あとは指示に従っていけばインストール完了
このような画面が表示されればOK
![スクリーンショット 2021-12-23 22.19.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258217/d1129faf-1dba-538b-e4f0-fbb811aaed2a.png)

# インスタンスを停止し、再度開始後
## もろもろ起動
```
# systemctl start httpd
# systemctl start mariadb
```

## パブリックIPが変わっている場合は新しいパブリックIPに変更
```
update
    DB名.wp_options
set
    option_value = 'http://新しいパブリックIP'
where
    option_name in ('siteurl', 'home');
```
Databricks からAzure Data Lake Storageへの接続手順 (SAS認証)



#　概要

DatabricksからAzure Data Lake Storage (ADLS gen2) へのアクセス手順についてまとめたいと思います。

# 1. Azure上での認証方式の選択
ストレージアクセスの際の認証方式をまずは決めます。主に以下の３つがあります。

- [ストレージアカウントキー](https://qiita.com/maroon-db/items/8cbb8bb14adeead7bed0)
- SAS Token (今回はこちら）
- [サービスプリンシパル](https://qiita.com/maroon-db/items/84f47e8ca28056202d0e)

どの認証方式を利用するべきか、簡単な比較を作ってみました。（個人的主観が含まれます）

|認証方式|設定対象範囲|設定の容易さ|お勧め用途|概要|
|:--|--|--|--|--:|
|ストレージアカウントキー|ストレージアカウント全体|◎|個人利用・検証環境|ストレージアカウントに発行されるキーを利用|
|SAS Token|コンテナ|○|検証環境・小規模環境|コンテナあるいはストレージアカウント毎に発行ができ、有効期限も設定できるため検証環境での利用が便利|
|サービスプリンシパル|コンテナ|△|本番環境|設定は少し複雑だが、アプリケーションに権限ロールを付与して運用するため、複数コンテナの管理などが可能|

今回はSAS認証を利用した設定手順をご紹介します。

# 2. Azure Data Lake Storage の作成

まずは、オブジェクトストレージを作成します。
作成手順については、こちらをご覧ください。
[ADLS gen2 Storageの作成](https://qiita.com/maroon-db/items/4477587ec36af481b3f0)


# 3. SAS Token の取得

次にSAS Tokenを取得します。SASは、コンテナ単位でも作成でき、さらに一時トークンとして有効期限やパーミッション設定も細かく設定できます。ただしトークン期限切れにはご注意ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/da32e5ab-a131-b2b7-c730-ff415a1a17f7.png)

必要に応じて、アクセス許可設定を変更してください。**有効期限** にもご注意ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/7cea3388-93ba-3ae0-5d2f-374445bb73e3.png)

生成されたSASトークンをこの後利用します。

# 4. Databricksからのアクセス方法

Databricksからのアクセス方法としては、DBFS経由とDirect Accessの２つのアクセス方法があります。

<img src="https://sajpstorage.blob.core.windows.net/maruyama/qiita_adls/adls-access.png" width='600'/>

またDirectAccessの場合、ノートブック上のセッション資格とクラスターに設定するクラスター資格の２つの設定方法があります。それぞれの特徴は以下の通りです。

|アクセス方法|資格|設定箇所|有効期間|アクセスユーザー対象範囲|
|:--------------------+---+---+-------+---+----------:|
|DBFS経由||Notebook(一度誰かがすればOK)|umountするまで永続|ワークスペース内の全ユーザー|
|Direct|セッション資格|Notebook(毎回実行)|Notebookセッション中|ノートブック利用者|
|Direct|クラスター資格|Cluster設定|Cluster起動中|Cluster利用者|

また、設定時にはSAS Token がそのまま見えないように、シークレット設定することが可能です。これによりTokenを安全に管理することができます。シークレット設定をする場合は、追加でシークレットスコープ設定が必要になります。[詳細はこちらの手順をご覧ください](https://sajpstorage.blob.core.windows.net/demo-asset-workshop2021/blog/databricks_cli_and_secrets.html)

# 5. サンプルノートブック

### DBFS経由でのアクセス設定

DBFS経由でアクセスさせる場合は、DBFSの /mnt 配下にストレージがマウントされます。これによりワークスペース利用者は誰でもこのストレージにアクセスすることが可能になります。また一度設定すれば umount しない限りノートブックを閉じても、クラスターが切り替わってもアクセスすることができるため、全員で利用するストレージを設定する際にお勧めな方法です。

[サンプルノートブック](https://sajpstorage.blob.core.windows.net/maruyama/qiita_adls/notebook/ADLS_SAS/ADLS_DBFS_SAS_import.html)


### Directアクセス(セッション資格)設定

DBFSを利用せずに、Directアクセスさせることも勿論可能です。この場合２つの方法があり、ノートブック上で認証設定を行いアクセスするセッション資格設定と、クラスター上で設定することでクラスター利用者全員が利用できるようにするクラスター資格設定です。

[サンプルノートブック](https://sajpstorage.blob.core.windows.net/maruyama/qiita_adls/notebook/ADLS_SAS/ADLS_DirectFromNotebook_SAS_import.html)


### Directアクセス(クラスター資格)設定

SAS Token をクラスター上のSpark Configにて設定することで、クラスターを利用するユーザーは簡単にストレージにアクセスできるようになります。この場合クラスターのアクセス権限にてユーザーのパーミッション管理を行えます。

[サンプルノートブック](https://sajpstorage.blob.core.windows.net/maruyama/qiita_adls/notebook/ADLS_SAS/ADLS_DirectFromCluster_SAS_sample.html)
社内SlackワークスペースのQiitan（Slack bot）を紹介します

[Qiita株式会社 Advent Calendar 2021](https://qiita.com/advent-calendar/2021/qiita)の24日目の担当は、Qiita株式会社事業推進グループの @tyamagu です！

Qiita株式会社ではコミュニケーションツールに Slack を使っています。
社内のメンバーは Slack を使って様々な自動化・効率化をしていますが、その中に Qiitan という bot がいます。
開発チームのメンバーは様々な場面で Qiitan を活用していますが、非エンジニアである僕はうまく活用できておらず…
そんな中で今回は、非エンジニアである僕が、Qiitan（bot）への理解を高め、簡単な業務効率化を行おうと思います。

# Qiitan（bot）について
Qiitan は、Qiita株式会社の Slack ワークスペースにいる Ruby 製のチャットボットフレームワーク [Ruboty](https://github.com/r7kamura/ruboty) を元に開発されたチャットボットです。

![スクリーンショット 2021-12-23 18.55.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239428/ff781a7d-7afc-fe9c-3194-519ebc3a3e7e.png)


- Slackアカウントは qiitan というbotユーザー（`@qiitan`）
- Heroku でホスティングされている
- ソースコードは[こちら](https://github.com/increments/qiitan-rb)

といった具合で Qiitan は構成されています。

Qiitan は Ruboty の機能を使って様々なことをさせることができ、

- 定期的に発言をさせる
- Qiitan 経由で Slack 上からデプロイを行なう
- 社員の中からランダムで1名誰かを指名させる
- Twitter で特定の単語でエゴサーチし、結果を投稿する

などの場面で活躍しています。

# Qiitan で何を行うか

Qiita株式会社の Slack には使っているサービスや取引先からの請求書送付メールをまとめるチャンネルがあります。担当者はそこで確認した請求書を経理へ連携をします。
この業務は特に忙しい月初に多く行うため抜け漏れが発生しやすく、都度コミュニケーションが発生していました。

そこで今回は、この請求書確認チャンネルで Qiitan に請求書の連携を促してもらうように設定します。

## Qiitan をチャンネルに招待する
まず Qiitan を対象のチャンネルに招待します。
メンバーを招待するのと同様に Qiitan をメンションすると以下のようなポップアップが表示されるので、追加をしてください。

![スクリーンショット 2021-12-23 19.11.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239428/e8cf5a04-1765-e66e-51dc-817dd4a3d6e7.png)


## Qiitan に発言をさせるよう設定する

### Qiitan に発言と周期を覚えさせるには
Qiitan（Ruboty）には定期的に発言をさせる機能があります。
その発言内容と周期を、発言させたいチャンネル上で特定のコマンドを打ち込んで登録し、自動で Qiitan に発言をさせるように設定をします。

Qiitan への指示は `@Qiitan add job "周期" 発言内容` と打ち込むことでできます。

`"周期"`は cron 記法を使って指定をします。
詳しい内容は以下記事が分かりやすいのでご参照ください。

https://qiita.com/tossh/items/e135bd063a50087c3d6a

`発言内容`は Ruby のコマンドを使って指定します。

### 実際に発言と周期を登録する

今回は、毎月行う業務のリマインドを行いたいので、毎月特定の日に関係する人に向けて Qiitan からメンションしてもらうようにします。

- 月初3営業日目までに請求書を経理に連携するように伝えたい
- 請求書の連携業務は月初に多く行う → 毎月1営業日目に通知
- チャンネルにいる全員に通知したい → `@channel` をメンションする

上記を Qiitan っぽく伝えてもらうために以下をチャンネル上でポストします。

```
@Qiitan add job "0 10 1 * *" @Qiitan echo @channel 請求書を経理に連携し忘れていないかな？前月の請求書は3営業日までに連携してね
```

登録後、Qiitan が反応したら登録完了です。

![スクリーンショット 2021-12-23 20.31.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239428/3dbd0d07-1c95-ca4b-9967-0e3f3f901493.png)


※今回はテストのため、僕をメンションしています

↓実際の Qiitan の発言はこんな感じ

![スクリーンショット 2021-12-23 21.35.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239428/66fed6bc-3406-9c14-e27d-76648d8df164.png)



# 最後に
今回は Qiitan に簡単な発言をさせるだけの内容でしたが、Qiitan（Ruboty）にはまだまだたくさんの可能性があります。もっと勉強して Qiitan を無茶苦茶に働かせたいモチベーションが生まれました。

また、僕は直接 Qiita の開発は行っていないですが、今回のような業務効率化を通して Qiita を開発・運営するメンバーを支援し、スムーズな Qiita の運営に寄与できるよう邁進していきます！

---

[Qiita株式会社 Advent Calendar 2021](https://qiita.com/advent-calendar/2021/qiita)のトリである25日目を担当するのは @kiitan です！お楽しみに🚀
事情があって less +F を使えない人は watch しよう


https://qiita.com/genre/items/8d935526571ccfe171ae


の記事に反抗する訳ではありませんが、マウント絡みなどなどで訳あって使えないとかエラーが出て困ってる人へ、
`watch tail -n20 [file name]`
をひっそりおすすめしておきます。

`-n20`は末尾20行を表示、watchコマンドは何も指定しなければ2秒間隔で実行してくれるので実質2秒監視です。オプションを付ければ0.1秒まで攻められるようです。
`watch -n0.1 tail -n20 [file name]`
授業やサークルで初めてプログラミングする人に向けたTips

#概要
サークルやバイト先で新人教育するとき、授業で友達にプログラミングを教えるとき、こうしたらいいのにとかこれ使えば一発なのに…みたいになるときがたまにあるので、書いてみます。かなり初歩的なものも含みます。間違っていれば指摘コメントお願いします。

#対象者
 - プログラミングを今までしたことがない
 - だけど授業やサークル、バイトでプログラミングをしないといけない

#1.開発環境
プログラミングをするときメモ帳を使っていませんか？
プログラミングに慣れてる人は、ほとんどがプログラミング専用のソフトを使っています。こいつを使ってあげることで作業効率が爆上がりするので、ぜひ使いましょう。
僕のおすすめは<strong>Visual Studio Code</strong>です。
VSCodeのいいところは以下の3つだと思います。

 1. 拡張機能が豊富
 2. 使っている人が多いため情報も多い
 3. 色々いじれる

特に拡張機能で適切にコード補完が効くようになると、驚くほどに開発速度が上がります。
ここからはVSCodeのおすすめ機能を紹介します。
## 言語系拡張機能
主にMicroSoftさんが公式で出している言語系の拡張機能です。C/C++やPythonなどがあります。これらの特徴は、上記で述べたようなコード補完が効くようになることです。例えばC言語なら、`#inc`くらいまで入力すると予測候補に`#include`が出てきれくれます。他にも、一度前で宣言した変数、関数名を使うときに勝手に予測表示してくれます。とても便利なので、是非使ってみましょう。

## Code Runner
これもVSCodeの拡張機能の一つで、`Ctrl + Alt + N`のコマンドでコンパイルと実行を勝手にやってくれるようになります。C言語の授業でいちいちCygwinで`gcc -o test test.c`とか打たなくても、このコマンドだけで済むようになります。ただし実行コマンドを入力してくれるだけで、コンパイラはついてきません。CならMinGWなど、PythonならPythonを事前にインストールしておく必要があります。そこらへんはここでは書かないので自分で調べてください。

## ソース管理
これは授業で扱うことな少ないと思うので飛ばしてもらっても大丈夫です。
これは拡張機能ではなく、VSCodeの組み込みの機能の一つです。どんな役割かというと、`Git`を使ってプログラムを管理しているとき、GUIを使ってadd,commitなどを行うことが出来ます。コマンドラインだと`git add ... ...`とか`git commit -m "nantoka..."`みたいに書かなきゃいけないとこも簡単にできるようになります。個人的にはVSCodeで一番役立ってる機能です。

## フォーマッタ
いわゆる自動整形機能です。
設定欄から`Format On Save`をオンにすると`Ctrl + S`で保存したとき、勝手にコードを整形してくれます。
整形っていうのは例えばこんなことです。

```C:Before
#include <stdio.h>

int main(){
int i=0;
for(i=0;i<10;i++){
printf("Hello");}}
```
みたいなコードを勝手に

```C:After
#include <stdio.h>

int main()
{
  int i = 0;
  for (i = 0; i < 10; i++)
  {
    printf("Hello");
  }
}
```
と、見た目をきれいにしてくれます。
一見地味ですが、一度使ってみるともうこれなしだとプログラミングできなくなるくらい便利な機能です。

参考: https://qiita.com/mitashun/items/e2f118a9ca7b96b97840

#2. 基本的なショートカットキー
これを覚えているだけでもだいぶ違います。
ここでわざわざ書かなくてもググればいくらでも出てきますが、一応よく使うコマンドを書いておきます。

- `Ctrl + Z` 一つ前の操作に戻る
- `Ctrl + Y` 一つ後の操作に戻る
- `Ctrl + A` 全選択
- `Ctrl + C` 選択した範囲をコピー
- `Ctrl + X` 選択した範囲を切り取り
- `Ctrl + V` 貼り付け
- `Ctrl + F` 検索
- `Ctrl + S` 保存
- `Tabキー` 一定のスペースを開ける。スペースの量はだいたいエディタで変更できる。

#3. わからないことの調べ方
プログラミングでわからないことを調べる時、皆さんは何を使いますか？
僕がよく使うのはこの`Qiita`と`StackOverflow`です。
流石にこの記事見てる人は`Qiita`の良さはわかると思うので後者について。

StackOverflowは英語のプログラミング質問サイトです。当然日本語の質問なんて殆ど無いです。
なぜこんなの使うのか？と思われるでしょうが、以下の点で優れていると思っています。

- （比較的）まともな質問が多い
- 回答者のレベルが高い
- 英語だから煽りが感じられない

特に強調したいのは下2つですね。ググっている時、たまにY●●oo知恵袋での質問がヒットすることありますよね。中身見たことありますか？
見たことある人ならわかると思います。回答者が高圧的態度で意味不明な的外れ回答をしている地獄絵図を。
誰が得するんでしょうね、ああいったタイプの回答。質問者は当然嫌な気分になりますし、見ている側もイライラします。
あの低レベルなサイトを見て時間を無駄にしないためにも、StackOverflowを使いましょう。

#4.その他
ここでは詳細までは書きませんが、気をつけたらいいんじゃないかなと思うのを数点。

* 変数名をちゃんと決める<br>
適当に`a`とか`moji`とかにしない。キャメルケース、スネークケースそろえる。

* コメント文をちゃんと書く<br>
昨日の自分は他人です。すぐに物事は忘れてしまいます。コメント文を書きましょう。プログラミングの授業でもコメント文をちゃんと書いていると高得点もらえやすいです。（偏見）

* 変数は初期化しよう<br>
初期化忘れでエラーが起きることがたまにあります。変数は宣言だけでなく、初期値を入れてから使ったほうがいいです。

#5.おわり
ここまで個人的にプログラミング初期に気をつけたらいいと思うことを書きました。
当然これは僕の意見であり、偏見を含んでいます。こうすべき、と言っているわけではないので参考程度に見ておいてください。
ヘルプデスクでの勤務で学んだこと

#はじめに
本記事では、ヘルプデスク業務でユーザーとやりとりをしていく中で感じたコミュニケーションの取り方についてを記述しております。

##自己紹介
しろみと言います。２０２１年の9月下旬頃にヘルプデスク案件やネットワークの案件を扱う企業に入社しまして、現在某企業のヘルプデスク案件に参画しております。


##相手の知識量に合わせて回答する
ヘルプデスクに問い合わせをしてくる方といっても、そのシステムやPCの操作方法に対して慣れている方から、全然慣れていない方まで様々なレベル感・温度感の方がいます。
その方々に合わせた説明の仕方(慣れていない人には、例え話を交えたりしながら)説明をして行ったりします。

##相手のことを否定しない
問い合わせ者も一人の人間ですので、否定をせず相手の状況をヒヤリングしていく中で、大変だと思った内容は否定をせず肯定して聞いていきます
Dynamics365/PowerAppsモデル駆動アプリのOnSave時のTimeout制限がなくなりました

非同期のOnSave処理が提供されましたが、非同期の処理が10秒内で終わらないとシステムエラーっぽい画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2307534/f214adea-0093-931a-6d9d-538dd48576b7.png)
非同期のOnSave処理に、確認ダイアログなどを表示すると、10秒を超えてしまう可能性があるので使い勝手が良くなかった。
以下のDocsに記載されている方法で、Timeout制限をなくすことが可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2307534/c11c1160-e31b-b62f-22e0-ff42e16b1508.png)
以下のサンプルコードで検証しました、いずれも問題なく使えそうです。今後保存時のチェック処理を行うことももよりシンプル実装可能と思います。
例えば、保存時レコードがほかのユーザーによる修正されているかのチェックは容易に実装可能になります。
（OnSaveの中に同期方法が非推奨）
①

```javascript

async function onSaveTest1(executionContext) {
    var formContext = executionContext.getFormContext();
    executionContext.getEventArgs().disableAsyncTimeout();//Timeout制限を無効化
    var confirmStrings = { text: "①xxxxxが設定されていません、保存してよろしいでしょうか。", title: "確認" };
    await Xrm.Navigation.openConfirmDialog(confirmStrings).then(
        function (success) {
            if (!success.confirmed){
                executionContext.getEventArgs().preventDefault();//保存をキャンセルする
            }
        });
}
```

②

```javascript
function onSaveTest2(executionContext) {
    return new Promise((resolve) => {
        var formContext = executionContext.getFormContext();
        executionContext.getEventArgs().disableAsyncTimeout();//Timeout制限を無効化
        var confirmStrings = { text:"②xxxxxが設定されていません、保存してよろしいでしょうか。", title:"確認" };
        Xrm.Navigation.openConfirmDialog(confirmStrings).then(
            function (success) {
                if (success.confirmed)
                    resolve(true);
                else{
                    executionContext.getEventArgs().preventDefault();//保存をキャンセルする
                    resolve(false);
                }
            });
    });
}
```

https://docs.microsoft.com/en-us/powerapps/developer/model-driven-apps/clientapi/reference/events/form-onsave
【コピペでok】よく使うGASのtips


こんにちは、これでアドカレ投稿5回目になり、日々頑張ってる[mu-suke](https://twitter.com/chelsea08ym)です。

この記事は[株式会社Diverse Advent Calendar2021](https://qiita.com/advent-calendar/2021/diverse) 、24日目の記事です。

## これはなに？

お、これ効率化できるなって思ったらよくGASで効率化をしている筆者ですが、かなり使ってきたなと思ったので個人的に使う頻度が高いものをピックアップして紹介します。

業務効率化したいよって人にとってすぐ使えるよう、**コピペで使える**ということを意識したので参考にしていただけたら幸いです。

## この記事のゴール

以下の理解を得ることをゴールとします。

- GAS（Google Apps Script)を触ったことがない人でもコピペして使えるようになること

## GASって何？
Googleが開発したスクリプトで、Googleが提供しているサービスの情報にアクセスしやすいものです。

今回はコピペで使えるTipsというテーマなので、GASの説明はこのくらいにします。

こちらの記事が分かりやすかったので、読むとより理解が深まるかと思います。

[Google Apps Script（GAS）とは？できることから始め方までの基本｜アナグラム株式会社](https://anagrams.jp/blog/google-apps-script/)


## ①スプレッドシートの情報にアクセスしたい

筆者がGASを使う際に多いのが、外部から得てきた情報をそのままスプレッドシートに保存するというものです。

### スプレッドシートから取得したい

#### シートへのアクセス
```js
const spreadsheet = SpreadsheetApp.openById('---ここにIDを記載する---');
const sheet = spreadsheet.getSheetByName('---ここにシート名を記載する---');
```

まずはスプレッドシートへのアクセス部分です。

IDでアクセスするファイルを決定、
シート名で実際に取得したいシートを決定します。


#### 特定のセルを取得したい場合
```js
// A1セルを取得
const A1 = sheet.getRange(1, 1).getValues()

// B4セルを取得
const B4 = sheet.getRange(4, 2).getValues()
```


#### 特定の行を1行取得したい場合

```js
// 1行目を取得
const lastRowPosition = sheet.getLastColumn()
const rowA = sheet.getRange(1, 1, 1, lastRowPosition).getValues()

// 4行目を取得
const lastRowPosition = sheet.getLastColumn()
const rowA = sheet.getRange(4, 1, 1, lastRowPosition).getValues()
```

#### 特定の範囲を取得したい場合
```js
// A1からC3までを取得
const data = sheet.getRange(1, 1, 2, 3).getValues()
```


### スプレッドシートに保存したい

#### シートへのアクセス
```js
const spreadsheet = SpreadsheetApp.openById('---ここにIDを記載する---');
const sheet = spreadsheet.getSheetByName('---ここにシート名を記載する---');
```

こちらも上で書いた方法と同じになります。

#### 特定のセルに保存したい場合

```js
// A10に保存
const data = '保存したい文字列'
sheet.getRange(10, 1).setValue(data)
```

## ②毎日指定した時間に実行してほしい
GASは作成した関数を定期的に実行してくれるスケジューラとしての機能も備えています。
これをやることで、例えば定期的に外部のAPIを叩いてスプレッドシートに保存するなどができるようになります。

1. トリガーを選択
1. 画面右下の`トリガーを追加`を選択
1. トリガータイプを`時間ベースのタイマー`に設定
1. 時間の間隔を任意の値にする
1. 保存



### 補足画像

手順1-2 | 手順3-5
:-: | :-:
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316760/39f211c1-1d96-8c3e-e9b2-38035724854d.png" width=480/> | <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316760/d91c7de4-e079-2afd-3372-ea9b6f8b9d00.png" width=480/>



## ③秘匿すべき情報を管理したい

外部との通信をする際に必ず必要になってくるトークンやAPIキーなどはコード上に書くべきありません。

AWS（Amazon Web Service）やGCP（Google Cloud Platform）だったらシークレットマネージャーで保存する方法があります。

GASでも同様（厳密には違いますが）のものがありプロパティストアと呼ばれています。

### プロパティストアに保存したい時

```jsx
PropertiesService.getScriptProperties().setProperty("key","value");
```

### プロパティストアから呼び出したい時

```jsx
const value = PropertiesService.getScriptProperties().getProperty("key");
```



## 余談
今回紹介したものだけでなく、他にもGmailの情報を取得することや、Google Driveに保存する方法など、さまざまなことができるので是非試してみてください。

ではまた！
Microsoft Intuneでスクリーンセーバーの設定を強制する

# はじめに
ISMSやPマークの認証を取得するためにスクリーンセーバーを設定することを求められると思います。
Azure AD と Microsoft Intune を利用することでオンプレのADのGPO同様スクリーンセーバーの時間などの設定を強制することができます。

# 前提
Microsoft Intune にデバイスが登録されていること。
登録方法としては Azue AD に参加（Azure AD joined）するか、Intune に直接登録するかの2通りの方法があります。

Intune は単品で￥650/月/ユーザー、Microsot 365 E3などにも含まれています。（2021/12/19時点）

https://docs.microsoft.com/ja-jp/mem/intune/fundamentals/licenses

# 設定方法
[Endpoint Manager 管理センター](https://endpoint.microsoft.com/) > デバイス > 構成プロファイル > プロファイルの作成 をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/8f346d35-ba66-51fb-ae96-8ab0b21cb160.png)

プラットフォーム：Windows10以降
プロファイルの種類：テンプレート
テンプレート名：管理用テンプレート
上記を選択し、作成をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/e9cf4928-b7d7-fdaa-d4f8-6f90a9de316f.png)

任意の名前を設定し、次へをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/4ef8a8c6-378d-e8d8-9700-053e11de5d9a.png)

ユーザーの構成 > コントロールパネル > 個人用設定 を選択するとスクリーンセーバー関連の設定がいくつか表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/baa16641-a61c-8d30-93bc-1f35d068f512.png)

## スクリーンセーバーのタイムアウト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/36ee1eb3-1d1c-b3f0-06c7-583f3aace6a3.png)

## スクリーン セーバーをパスワードで保護する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/a4db1969-e7f9-029b-be51-a16ce7845f4f.png)

## スクリーン セーバーを変更できないようにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/d1c7b804-9b85-23b9-f253-7bb299137fce.png)


## スクリーン セーバーを有効にする
![スクリーンセーバーを有効にする.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/5f3f9e4a-385f-809a-3d05-6febd2d78282.png)


## 特定のスクリーン セーバーを強制する
「ssText3d.scr」は３Dテキストです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/8e670e05-aba0-dcf6-9f70-2fa8feb5860f.png)

- - -

次へをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/129c9f5d-d957-f9b9-33f5-b0f93c814dc6.png)
グループを選択し、次へをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/5d314934-62fe-30a2-f6fe-177c52df1052.png)
作成をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/53cfed1e-2f3d-8dce-4819-fde15435aace.png)
「構成プロファイル」が作成されました。先ほど指定したグループのユーザーはスクリーンセーバーが設定され変更（表示さえ）できません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/ddcb20e2-2049-e0be-fcf9-6c53eec5184b.png)
マルチセレクトオプション（旧CDataオプション）のご紹介

## はじめに
こんにちは。
アステリアの車です。

データ連携ソフトASTERIA WarpではCDataドライバーを利用して専用のアダプターを作成し、マルチセレクトオプション（旧CDataオプション）という製品名で提供しています。その種類はなんと27種類もあります。

## マルチセレクトオプションとは？

マルチセレクトオプションとは、CData社のCData JDBC ドライバーをASTERIA Warpで簡単に利用できるようにアダプター化した製品群です。マルチセレクトオプションを利用すると様々なシステムやクラウドサービスとの連携を、データベースと連携するのと同等の操作手順で連携することができます。連携するためのSQLが自動生成されますので、SQLに慣れていない方も意識することなく手軽に利用いただけます。現状27種類のアダプターを用意しています。



## マルチセレクトオプションのアダプター一覧
現在、以下の接続先とのデータ連携が可能で、それ毎にアダプターを用意しています。
![multiselect_0010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156332/4ab42930-70a9-951e-9971-2719ba9af955.png)

## マルチセレクトオプションの構成
マルチセレクトオプションの各アダプターでは、以下の３つのコンポーネントを提供しています。

#### ■Getコンポーネント
各接続先へSELECT文を発行して結果セットをストリームとして出力します。
![Getコンポーネント関連画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156332/d22ecaeb-1265-5684-50a0-824fe9e304e1.png)
GetコンポーネントではSQLビルダーというツールが使えます。SQLビルダーでは、実際に接続先に接続しながら、テーブル選択や取得フィールドの設定など、データを取得するためのSQL文の作成をノーコードで行えます。


#### ■Putコンポーネント
各接続先のテーブルに対して更新を行います。
![Putコンポーネント関連画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156332/166126ad-2bb3-dda0-ff13-64561b3d7367.png)
Putコンポーネントではテーブル選択というツールを使って更新するテーブル、フィールドをノーコードで指定できます。また、Putコンポーネントだけで、データの挿入、更新、削除処理が行えます。

#### ■SQLCallコンポーネント
各接続先に任意のSQLの実行を行います。
![SQLCallコンポーネント関連画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156332/30e45241-e16a-99cd-1766-d44802e1cf68.png)

SQLCallコンポーネントでは以下の処理が行えます。

* 任意のSQLを実行
* SELECT文を発行
* ストアド実行（結果なし）
* ストアド実行（結果あり）

接続先によってはストアドプロシージャの実行でファイルをアップロード・ダウンロードすることができます。

#### ■マルチセレクトオプションのすべてのコンポーネント
![すべてのコンポーネント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156332/cf596a07-2b40-03b9-0f75-42b799d86773.png)
マルチセレクトオプションのすべてのアダプターをインストールすると開発ツールであるフローデザイナーでは上記のように接続先ごと、３つのコンポーネントが表示されます。こちらのコンポーネントを利用して接続先とのデータ連携処理を簡単に実装することができます。
※API仕様上データの登録・更新・削除処理ができない接続先もあるため、GetとSQLCallコンポーネントのみ提供するアダプターもあります。



## マルチセレクトオプションの活用例

ここでは、Google系のマルチセレクトオプションの便利な活用法を紹介した弊社の製品ブログの記事をご紹介します。
セミナーやイベントなどでお客様から作成して頂いたアンケート結果の集計、共有や連絡先の登録処理をマルチセレクトオプションとASTERIA Warpを利用して簡単に自動化する便利な活用法について紹介しておりますので、是非ごらんください！

[アンケート集計は自動化して集計結果を待つだけ！Google系アダプターの便利な活用法 1](https://www.asteria.com/jp/warp/blog/20190422/42855.html)
[アンケート結果の共有や連絡先登録も自動化！Google系アダプターの便利な活用法 2](https://www.asteria.com/jp/warp/blog/20190522/44774.html)



## おわりに

以上、マルチセレクトオプションについてご紹介しました。

各種SaaSとの連携処理で一番ハードルが高いのは認証処理とも言えるかと思います。マルチセレクトオプションを利用するとコネクションを作成することで接続先への認証処理が簡単に行えますし、データ連携時にも複雑なAPIの実装が不要で、RDBのようにSQL文の操作で処理できますので、とても便利で生産性を向上させることができます！

皆さんも是非活用してみてください。
docker-compose up 時にerror checking context: 'no permission to read from '/Users/config/master.key''.


```
docker-compose up 
```


を実行したら

```
soichirohara@SoichironoMacBook-Pro coffee_passport % docker-compose up
Creating network "coffee_passport_default" with the default driver
Creating volume "coffee_passport_mysql-data" with local driver
Creating volume "coffee_passport_vendor_bundle" with local driver
Building web
error checking context: 'no permission to read from '/Users/soichirohara/coffee_passport/config/master.key''.
```

とエラーになった・

クローンしたリポジトリにマスターキーがなかったので
マスターキーを作り直したからこのエラーが発生したと思われる。


つまり、権限がなかたので、


```
sudo chmod 764 master.key

```

をじっこう。


したら解決。

https://qiita.com/shisama/items/5f4c4fa768642aad9e06


https://qiita.com/ntkgcj/items/6450e25c5564ccaa1b95
sql.Openを別の関数に切り出したら「sql: database is closed」エラー

## エラー内容
```go:main.go
package main

import (
	"database/sql"
	"log"

	_ "github.com/go-sql-driver/mysql"
)

func main() {
	db := DbConnect() // 別の関数へ切り出し

	err := db.Ping()
	if err != nil {
		log.Fatal(err) // → sql: database is closed
	}
}

func DbConnect() *sql.DB {
	db, err := sql.Open("mysql", "root@tcp(localhost)/dbname")
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	return db
}
```
```sh:zsh
$ go run main.go
2021/12/24 23:59:59 sql: database is closed
exit status 1
```

## 対処法
defer db.Close() の位置が悪い

```go:main.go
package main

import (
	"database/sql"
	"log"

	_ "github.com/go-sql-driver/mysql"
)

func main() {
	db := DbConnect()
	defer db.Close() // 移動先

	err := db.Ping()
	if err != nil {
		log.Fatal(err)
	}
}

func DbConnect() *sql.DB {
	db, err := sql.Open("mysql", "root@tcp(localhost)/dbname")
	if err != nil {
		log.Fatal(err)
	}
    // 削除

	return db
}
HTML/Canvas １ピクセル内のアンチエイリアス処理の実験

この記事は [Web グラフィックス Advent Calendar 2021](https://qiita.com/advent-calendar/2021/webgraphics) の23日目の記事です。

# はじめに

[アドベントカレンダー７日目の記事](https://qiita.com/warotarock/items/1d3ba8883d67577296ad)でパスで囲まれた領域の描画をやってみましたが、アンチエイリアシングは難しいので挑戦しませんでした。

実際どんな計算するかを考えてみるほどに、ChromeとかFireFoxとかは本当によく描画できてるよなぁと思います。正確でしかも高速に。

CrhomeもFireFoxも内部的には[Skia](https://skia.org/)が使われているという噂をキャッチしてGitHubでソースコードを追ってみたりもしたのですが、アンチエイリアシングありの場合と無しの場合で明確にコードが分かれてるらしいな～くらいのことしか理解できず早々に諦めました。自分のスキルではどうして高速なのかが分かるほど理解するには相当時間が必要そうです。（数カ月かかるレベル）

しかし、高速さはともかく、どのくらい正確なのか（正確でない場合もあったりするのか）については極端なケースで実験してみれば何か分かるかもしれません。

# 実験内容

ということで、極端なケースとして、Canvas2Dで１ピクセルより細かい内容の描画をしてみます。

ケースは以下の５つを考えてみました。

- A. ピクセルに完全に納まる直線（一番左）
- B. ピクセルに完全に納まる中央位置のひし形塗りつぶし
- C. ピクセルの左に接したひし形塗りつぶし
- D. ピクセルの横境界をまたいだひし形塗りつぶし
- E. ピクセルの角を中心として四つのピクセルをまたいだひし形塗りつぶし（Chrome96は描画されず、FireFox94ではうっすら出ました）

![アンチエイリアシングのきわどいケース](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/5f7bfc91-824a-775b-05a4-1e401a4c85f6.png)

<p class="codepen" data-height="740" data-default-tab="js,result" data-slug-hash="ExwwRPN" data-user="warotarock" style="height: 500px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/warotarock/pen/ExwwRPN">
  HTML/Canvas １ピクセル内のアンチエイリアス処理の実験</a> by 柏崎ワロタロ (<a href="https://codepen.io/warotarock">@warotarock</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# 実験結果

Chrome96の場合（左から準にA、B、C、D、E）

![実験結果 Chrome96の場合](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/8701a359-313d-7174-bf9c-b7d70f85a5d5.png)

FireFox94の場合

![実験結果 FireFox94の場合](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/fa9d4968-00e3-ea0c-3a7f-3ecad70ab83a.png)

~~うわっ地味っ…~~ 結果を見ると、１ピクセルより小さい図形であるためか、だいたいは薄まった赤色が描画されています。また、図形としては本来同じものであっても、描画する位置によって濃さに違いが出ることがわかります。１ピクセルより細かい単位できちんと何かを計算しているんですね！

ブラウザ間の明確な違いとしては、ChromeはEのケースが全く描画されておらず、FireFox はうっすら描画されていることがあげられると思います。
これは描画を何回か繰り返してみると色が濃くなっていくのでよりはっきりと確認できます。
Eは４つのピクセルにまたがっているわけですから、正確さの観点でいうと、FireFoxのように４つのピクセルが描画されるほうがより正確であるといえるはずです。

微妙なケースとしては、Cのケースでは図形がピクセルの左境界に接していますが、Chromeではうっすら左のピクセルにも色が出ているのに対し、FireFoxでは一つのピクセルにのみ色が出ています。これはどちらがより正しいんでしょうか。ある意味どちらも正解のように思えます。

アンチエイリアシングの手法にも色々あって、正確な面積を計算する方法や、十数か所をサンプリングして決定するする方法があるらしいです。サンプリングによる方法であれば、サンプリングする位置が運悪く外れだった場合は今回のChromeのように全く色が出ないケースもありえます。今回の結果からすると、サンプリングのしかたに違いがあるのかもしれませんね。

ちなみに同日のMicrosoft EdgeはChromeと区別がつかない程度に同じ結果でした。Edgeは中身がChromeなので当然かもしれません。しかし、どのブラウザもSkiaを使って描画しているとすると、本来は全て同じ結果になるはずなので、そこは謎ですが未調査です。

# まとめ

- ブラウザのアンチエイリアシングはすごいと思った
- ChromeとFireFoxで微妙に違う
- 同じSkiaを使っているとすると違いが出るのはなぜか？未調査のため謎が残った

未調査で終わってしまい申し訳ないのですが、そもそも重箱の隅をつつくような話ですので、どうかご容赦ください。
（毎回のように謝っている気が…）

アドベントカレンダーもあと二日ですね。それでは良いお年を。
Databricks からAzure Data Lake Storage への接続手順 (ストレージアカウントキー認証編)


#　概要

DatabricksからAzure Data Lake Storage (ADLS gen2) へのアクセス手順についてまとめたいと思います。

# 1. Azure上での認証方式の選択
ストレージアクセスの際の認証方式をまずは決めます。主に以下の３つがあります。

- ストレージアカウントキー (今回はこちらの方法）
- [SAS Token](https://qiita.com/maroon-db/items/1df46d0c088a550ab053)
- [サービスプリンシパル](https://qiita.com/maroon-db/items/84f47e8ca28056202d0e)

どの認証方式を利用するべきか、簡単な比較を作ってみました。（個人的主観が含まれます）

|認証方式|設定対象範囲|設定の容易さ|お勧め用途|概要|
|:--|--|--|--|--:|
|ストレージアカウントキー|ストレージアカウント全体|◎|個人利用・検証環境|ストレージアカウントに発行されるキーを利用|
|SAS Token|コンテナ|○|検証環境・小規模環境|コンテナあるいはストレージアカウント毎に発行ができ、有効期限も設定できるため検証環境での利用が便利|
|サービスプリンシパル|コンテナ|△|本番環境|設定は少し複雑だが、アプリケーションに権限ロールを付与して運用するため、複数コンテナの管理などが可能|

今回はストレージアカウントキー認証を利用した設定手順をご紹介します。

# 2. Azure Data Lake Storage の作成

まずは、オブジェクトストレージを作成します。
作成手順については、こちらをご覧ください。
[ADLS gen2 Storageの作成](https://qiita.com/maroon-db/items/4477587ec36af481b3f0)


# 3. ストレージアカウントキーの取得

次にストレージアカウントキーを取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/f48ce344-2576-d662-7854-d944e9c1aeaf.png)

キーは２つまでとなっており、またストレージアカウントで管理するコンテナ全てに対するアクセス権が与えられてしまうため、本番で利用する場合は他の認証方式を検討される事をお勧めします。

# 4. Databricksからのアクセス方法

Databricksからのアクセス方法としては、DBFS経由とDirect Accessの２つのアクセス方法があります。

<img src="https://sajpstorage.blob.core.windows.net/maruyama/qiita_adls/adls-access.png" width='600'/>

またDirectAccessの場合、ノートブック上のセッション資格とクラスターに設定するクラスター資格の２つの設定方法があります。それぞれの特徴は以下の通りです。

|アクセス方法|資格|設定箇所|有効期間|アクセスユーザー対象範囲|
|:--------------------+---+---+-------+---+----------:|
|DBFS経由||Notebook(一度誰かがすればOK)|umountするまで永続|ワークスペース内の全ユーザー|
|Direct|セッション資格|Notebook(毎回実行)|Notebookセッション中|ノートブック利用者|
|Direct|クラスター資格|Cluster設定|Cluster起動中|Cluster利用者|

また、設定時にはアカウントキーがそのまま見えないように、シークレット設定することが可能です。これによりキーを安全に管理することができます。シークレット設定をする場合は、追加でシークレットスコープ設定が必要になります。[詳細はこちらの手順をご覧ください](https://sajpstorage.blob.core.windows.net/demo-asset-workshop2021/blog/databricks_cli_and_secrets.html)

# 5. サンプルノートブック

### DBFS経由でのアクセス設定

DBFS経由でアクセスさせる場合は、DBFSの /mnt 配下にストレージがマウントされます。これによりワークスペース利用者は誰でもこのストレージにアクセスすることが可能になります。また一度設定すれば umount しない限りノートブックを閉じても、クラスターが切り替わってもアクセスすることができるため、全員で利用するストレージを設定する際にお勧めな方法です。

[サンプルノートブック](https://sajpstorage.blob.core.windows.net/maruyama/qiita_adls/notebook/ADLS_StorageAcount/ADLS_DBFS_AccountKey_import.html)


### Directアクセス(セッション資格)設定

DBFSを利用せずに、Directアクセスさせることも勿論可能です。この場合２つの方法があり、ノートブック上で認証設定を行いアクセスするセッション資格設定と、クラスター上で設定することでクラスター利用者全員が利用できるようにするクラスター資格設定です。

[サンプルノートブック](https://sajpstorage.blob.core.windows.net/maruyama/qiita_adls/notebook/ADLS_StorageAcount/ADLS_DirectFromNotebook_AccountKey_import.html)


### Directアクセス(クラスター資格)設定

アクセスキーをクラスター上のSpark Configにて設定することで、クラスターを利用するユーザーは簡単にストレージにアクセスできるようになります。この場合クラスターのアクセス権限にてユーザーのパーミッション管理を行えます。

[サンプルノートブック](https://sajpstorage.blob.core.windows.net/maruyama/qiita_adls/notebook/ADLS_StorageAcount/ADLS_DirectFromCluster_AccountKey.html)
PythonでUnicodeDecodeErrorが発生した時の対応

## はじめに
対応方法を検索した時に、それぞれについてはあったものの
一緒に行うものがなかったので備忘録としてのメモです。

## 問題

Windows環境で作成したzipファイルを読み込んだ時に、 `UnicodeDecodeError` が発生することがある。
原因は、文字コードがShift JISだけど、PythonはUTF-8で扱うので、その違いによるもの。

## 対応方法
### その1

```bash
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8e
```

が発生した時、[Python 3 で日本語ファイル名が入った zip ファイルを扱う](https://qiita.com/methane/items/8493c10c19ca3584d31d)に記載されている通り、

```python
file_name.encode("cp437").decode("cp932")
```

としたら良い。

### その2

「その1」の対応で万事OKかというと、実はそうでもなかったりする。
今度は、

```bash
UnicodeDecodeError: 'cp932' codec can't decode byte 0x83
```

というエラーが発生する。

この場合は、 [Python】【Django】「UnicodeDecodeError: ‘cp932’ codec can’t decode byte 0x83 in position」と表示される場合の対処方法_100162](https://geekmama.jp/100162) にある通り、

```python
file_name.encode("cp437").decode("utf-8")
```

としたら良い。

### その3

「その1」及び「その2」だと対応できるのがそれぞれのパターンしかできない。
そこで、この二つを合わせると良い。

```python
# infoはZipInfo型の変数
if not (info.flag_bits & 0x800):
  if info.flag_bits & 0x008:
    print(info.file_name.encode("cp437").decode("utf-8"))
  else:
    print(info.file_name.encode("cp437").decode("cp932"))
else:
  print(info.file_name)
```


## 結論
その3の方法を取るとベスト

（ただ、ちょっと無理矢理な感じがするので、もう少し調査＆まとめが必要そう）
kintoneでIot！M5StickCをノーコードで設定［土壌温度編］デジタルセンサー

温度センサーのデータをkintoneにレコード追加
------------------------
M5StickCで「温度センサー」を使用しkintoneのアプリにレコードを追加します。
今回は「観葉植物の土壌温度」をkintoneでグラフ表示してみました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/e683e39b-67a7-5bea-bfee-4e88a2c38429.png)

温度センサーをM5StickCに接続
------------------------
センサー部にds18B20（デジタル出力）が内蔵され防水型は
水槽の水温管理などに用いられています。
DS18B20は値がデジタル出力されるので
その値をM5stickCの26ピンから読み取ります
信号線(黄）と電源（赤）にプルアップ抵抗4.7kΩをつなぎます

![IMG_4882.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/427ff863-b784-9162-d254-cf455d631993.jpeg)

| ds18B20 |  | M5stickC |
|:-:|:-:|:-:|
| 黒  |   | GND  |
| 黄  |   | G26  |
| 赤  |   | 5V  |

ds18b20用のカスタムブロックを読み込む
------------------------------------------
UIFlow用のカスタムブロック「ds18b20.m5b」を利用しました

https://github.com/stonatm/UiFlow-custom-blocks/tree/master/ds18b20


Uiflowの「Opne*.m5b file」から、ds18b20.m5bを読み込みます
![custam1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/da3a7321-c343-c0fe-e5e5-fd7baabfbab3.jpeg)

このように設定します
![ds18b20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/2419c463-80aa-4c56-20b8-88ff8f9ae5c2.jpeg)

センサーの値がそのまま温度として出力されます
![121304.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/cd38c1fb-d06b-75b4-8546-582a16a469f9.jpeg)

センサーの値が表示できることを確認できれば、この値をkintoneにアップする設定を追加します


土壌温度をkintoneにレコード追加
------------------------
「wifiに接続」し「10分間隔で値を表示」すると同時に「kintone（アプリ番号104）に土壌温度(SoilTemp)追加」とした場合は次のようになります
![kintone13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/0e6bc4bc-283a-e0c1-3e3b-4dee5740a512.jpeg)

kintoneに土壌温度が定期的に追加されます
![kintone12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/0110b520-1b23-90c1-d14a-72449fbf7a5d.jpeg)

水分と温度を測る
-------------------------------------------
前回の［土壌水分編］アナログセンサーと
https://qiita.com/yama_moto250R/items/45acabe530be32928b05
今回の「土壌温度」デジタルセンサーを、同時にM5stickCに接続する場合の設定
![121301.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/d45bbe38-d597-93a1-6fc1-48f3fc1f1f92.jpeg)

「土壌温度」23.1875　「土壌水分」1023（ほぼ乾燥した状態）
![121303.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/162a2409-1523-fc14-13ea-fe166ec30fab.jpeg)

「土壌温度」と「土壌水分」がkintoneでグラフ化すると
水やり実施の前後で変化する具合がよくわかります
![121305.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228252/1e30136d-cba3-fa44-f6cd-0c8cd18cdaf3.jpeg)


参考にさせていただきました
--------------------------------------------

https://github.com/stonatm/UiFlow-custom-blocks/tree/master/ds18b20
GECと教育データマイニング

# GECアドベントカレンダー12/23
大変久しぶりの投稿です。自分は語彙学習支援の研究をずっとやってきた人です。
Educational Data Mining（EDM）は教育データマイニングのトップ国際会議です。ここに、GECが関連する論文が載っていたので、こちらを紹介しようと思います。
[Accurate modelling of language learning tasks and
students using representations of grammatical proficiency, Ahmed H. Zaidi et al, EDM 2019](https://www.repository.cam.ac.uk/handle/1810/296638)

えーと、すみません、やっぱり飛ばし読みするとダメですね…Introductionを斜め読みして何やっているのかと実験結果だけ見たら、最初、人手のground-truthが何かわからず全然読めませんでした。

時代が2019年なので、まだBERTがNLPで台頭して来る前の論文です。要するに語学学習者の能力や、語学学習者に課す課題を表現するような表現学習がしたいという論文です。

Write & Improveという著者らが管理している、かなり大規模な語学学習者向けの自動添削システムがあり、これを使った話になっています。このシステムでは、学習者はお題を出されて、それに対して回答します。そうすると、その回答をシステムがCEFRのレベルに対応する点数で全体を自動添削してくれるうえ、どの部分が誤っていそうか検出してくれます。学習者は、本人が満足するまで何度でも書き直しができるという設定です。

このシステムの過去2年間、延べ約300万件の回答、登録ユーザ30万人というかなり大規模なデータを扱う話になっています。かなり分かりにくいのですが、このデータは、結局、スコアも添削も人手ではなく自動で行われるので、自動的に計算された値しか出てきません。当たり前ですが、一部は人が見てground-truthを決めてやる必要があり、それが何なのかでかなり迷いました。

データセットではなく（！）、提案モデルの節を見ると、ようやくこれが何かわかるようになっています。学習者の回答の添削自体は自動ですが、学習者に出されているお題に紐づけられた難しさは人手データなようです。
そこで、自動添削結果を予測するモデルと、（人手の）お題の難しさを計算するモデルを組み合わせて、同時学習させることで、人手の情報をモデルに入れるように担保されているように見えます。

評価のMSEの所が、自動添削結果のスコアを予測する…という話になっていて、最初、何が目的なのか全く分かりませんでしたが、表現学習で作った表現の性能を計測したいという意味であれば、まあわかる気がします。が、評価としてちょっと微妙な気はしました。

著者のAhmed H. ZaidiはEDMの他、AIED2020のshort paper色々なところで語学学習支援の研究を書いているっぽいです。
AWS CodePipelineについて

# CodePipelineとは
CodePipelineは、CodeCommit、CodeBuild、CodeDeployなどのサービスと連携して継続的デリバリーの自動化を提供するフルマネージドサービス。
これらのサービスはCodeシリーズと呼ばれている。

# CodePipelineを構成するステージ
CodePipelineで作成するパイプラインは、主に4つのステージで構成される。
各ステージの名称と、それぞれのステージに使用できる主なサービスを挙げる。
用途に応じて適切な構成でパイプラインを構成する必要がある。

- ソースステージ（必須）
 * CodeCommit
 * S3（バケットのバージョニング設定と資材のZip化が必須） 
- ビルドステージ（任意）
 * CodeBuild
 * Jenkins
- 承認ステージ（任意）
- デプロイステージ（任意）
 * AppConfig
 * CodeBuild
 * CodeDeploy
 * CloudFormation
 * Elastic Beanstalk
 * OpsWorks
 * Service Catalog
 * Skills Kit
 * Lambda
 * ECS

# パイプラインの動作契機
ソースステージに設定したCodeCommitリポジトリのブランチ、またはS3のZipファイルに変更が加わった場合に、CodePipelineがその変更を自動的に検知して動作する。
ソースステージにS3を使用している場合は、CodePipelineがバケットから資材のZipファイルを取得した後、自動的に展開してから次のステージに渡してくれる。

# 環境変数
ビルドステージやデプロイステージに環境変数を設定し、CodeBuildやCodeDeployの処理の中で使用することができる。
また、CodeBuildやCodeDeployの処理の中でCodePipelineの環境変数に値を設定し、次のステージに渡すこともできる。
AWS Certified Solutions Architect - Professional に合格しました

## はじめに

DevOps Pro(DOP)合格から約半年、 AWS Certified Solutions Architect - Professional （SAP）に合格したので体験記を書いていきます。

https://qiita.com/kabik/items/ff8d3d1f71f044525385


## 自己紹介
* 大学・大学院では情報科学を専攻
* 2019年4月から新卒でERPのSRE
* AWS歴は2年半くらい
* EC2周り, Lambda, CloudFormation, CodePipeline, CodeBuild, Configあたりはわりと使う
* 競プロ好き


## 試験概要

https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/?ch=sec&sec=rmg&d=1

DOPと同じく、問題数75問、試験時間180分です。問題文が異常に長いのでこれでも時間ギリギリでした。


https://qiita.com/nakazax/items/20458e146d3d9f2aa615

AWS資格の中で最難関らしいです。よく受かったと思います。（後述しますが運が良かったです）


## 勉強方法

DOPと変わらず、王道をやりました。

1. 練習問題を解く
1. メモする
1. おまけ（習慣化）

### 1. 練習問題を解く

DOPを取った時と同じくWhizlabsで問題を解き、分からなかった部分はドキュメントを読んだり、実際に手を動かしたりしました。

https://www.whizlabs.com/learn/course/aws-solutions-architect-professional/168

英語のサイトなので、Google翻訳で日本語に変換し、分かりにくい文章は原文を見るようにしました。
本番も基本は日本語、原文は英語という形式なので慣れるという意味でも良かった気がします。


### 2. メモする

DOPに引き続き、MindNodeでメモを取りました。
英語でメモを取っていたのですが、メモを取るハードルが上がっってしまい挫折する可能性があるのであまりお勧めできません笑
次回からは日本語で書こうと思います。

DOP受験時よりだいぶ増えました。

#### DOP受験時

![DOP](https://camo.qiitausercontent.com/6f7d0dcff81b9a4cbe15ff3a681192f1275b8f50/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3138373534352f64643835383431352d653466642d393665332d343163652d3036653537346266653865322e706e67)

#### 今回（これで半分くらい）

![Screen Shot 2021-12-23 at 20.22.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187545/6437b7ea-01f5-bb86-d864-16fdf9907878.png)


### 3. 習慣化（おまけ）
勉強を習慣化するに当たって、同じ時間にやることにしました。
頭を使うのは朝が良いと思ったので、早起きをして勉強時間を確保するようにしました。

ただ早起きをするのは難しいので、メザミーを使って強制的に起きる仕組みを作りました。
メザミーを簡単に説明すると、寝坊したら運営にお金を支払うアプリです。
家から100m離れないと起きたとみなされないので必ず外に出ることになり、目が覚めます。

![Screen Shot 2021-12-23 at 20.36.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187545/82b98fad-d6e5-8336-76cd-20f54b9ae2d7.png)

https://mezamee.com/


友達同士で寝坊したらお金を払うようにするようにする、という仕組みを作っている人もいると思いますが、
~~友達がいないので~~ 寝坊したときに「友達が喜ぶならいいか」と思ってしまうので、メザミーにしました。


こうして毎日10問ずつ解くのを1ヶ月半ほど続けました。


## 当日

テスト中のコンディション（特にメンタル）は本当に大事だと思わされた試験でした。

### 試験について

前回は自宅受験をしたのですが、部屋を片付けたりソフトをインストールしたりで準備が大変だったのと、
ちょっとしたことで受験が無効になるというのを聞いていたのでテストセンターで受験しました。

朝ごはんを食べてゆっくり迎えるくらいの12時半スタートの時間にしました。


### 睡眠

テストは3時間の長丁場なので集中力が切れないように8時間ぐっすり寝ました。


### トイレ

途中でトイレに行きたくならないよう、テスト開始直前にトイレに行きました。


### 諦めない

前半に難しい問題が固まっていて心が折れそうになりましたが、なんとか集中できました。
ギリギリの点数だったので、あとちょっと集中力が低かったらと思うと怖いです。


## 結果

760点で合格でした！
750点がボーダーラインなのであと1問落としてたら不合格でした...笑

二択で迷った問題が多かったので運がよかったと思います

ただ一発で合格できたのでよかったです。


## おわりに

SAP試験に受かって本当によかったです。
まだまだ知らないサービスや機能がたくさんあるので自惚れずに精進していきます。

次は AWS Certified Advanced Networking - Specialty を受けようと思います。
ネットワーク苦手だけど頑張ります！


### お詫び
Udemyさんのアドベントカレンダーだけどサービス使いませんでした笑

Kubernetesの勉強ではこれ使ってるので許してください！

https://www.udemy.com/course/certified-kubernetes-application-developer/
【Unity】M1 Max (Apple Silicon) | Unity 2020,2021検証

# 追記 4/18
2021LTSが出たので新しい記事を書きました。
[【Unity】M1 Max (Apple Silicon) | Unity 2021.3.0f1 (LTS)検証](https://qiita.com/IShix/items/f7a1fb9f61b2b547d1a6)

# 購入したスペック
MacBook Pro（16-inch,2021）
CPU : Apple M1 Max 10-core
GPU : Apple M1 Max 32-core
RAM : 64GB
ROM : 2TB

# [結論] M1 Maxは買いか？
個人的には買いだと思います。

・　Apple Silicon対応のUnityはええ！！
・　Xcode爆速！！
・　Intel Unity (Rosetta 2で動いているUnity)は今のメイン機Macbook Pro2017と大差無く動く
・　ファンがまったく回らなくてめっちゃ静か
・　そもそもAppleが今後Intel Mac出す気無いので、各社Apple Silicon対応必須。バグがあってもそのうち治りそう

その他
・　画面めっちゃ綺麗！！
・　音最高！！ (6スピーカーサウンドシステム)
・　キーボードが静かで打感がいい
・　ノッチは気にならない
・　結構カメラが良い。明るく撮れる
・　カードリーダーがちょっと嬉しい

# CPUは「Pro」 or 「Max」 ?
コア数はどちらでもよかったのですが、メモリ帯域幅が多い方が良いに決まってる！と思ったのでMaxにしました

| Model | CPU | GPU | メモリ帯域幅 |
|:----:|:----:|:---------:|:------------:|
| Pro  | 8or10コア | 14or16コア | 200GB/s |
| Max  | 10コア | 24or32コア | 400GB/s |

# メモリは？
Apple Silicon搭載Macを購入する上でのポイントだと思います。
今までのPCはメモリ + ビデオカードのメモリでしたが、Apple Siliconは共有です。
例えばMacbook Pro2017ならメモリ16GB + ビデオカードのメモリ2GBで合わせて18GBとなります。
もし16GBモデルを選ぶと2017より低いメモリ量になるので最低でも32GB以上をおすすめします。

# Unity(Intel) vs Unity(Apple Silicon) 検証

**感想**
Apple Silicon対応エディタはめちゃくちゃ快適
LTS版が待ち遠しい

**検証バージョン**
[Intel] Unity 2020.3.23f1
[Apple Silicon] Unity 2021.2.7f1

**プロジェクト概要**
完成した2Dプロジェクト、画像多め、2Dだけどシェーダーも結構ある

**テスト結果**

| Unity | Library構築 | iOS Switch Platform | iOS Build | Script Compile |
|:----:|:----:|:---------:|:------------:|:------------:|
| Intel  | 03:10 | 11:29 | 01:20 | 00:13 |
| Silicon  | 01:50 | 01:22 | 01:05 | 00:05 |


# Macbook Pro 2017(Intel) vs 2021(M1 Max) 検証

**感想**
M1 MaxのXcodeビルドはめちゃめちゃ早いし、軽いし、熱くならない！

**PCスペック**

| Model | CPU | RAM | GPU |
|:----:|:----:|:---------:|:------------:|
| MacBook Pro (15-inch,2017)  | 2.8 GHz クアッドコアIntel Core i7 | 16 GB | Radeon Pro 555 2 GB |
| MacBook Pro（16-inch,2021）  | Apple M1 Max 10コア | 64 GB | Apple M1 Max 32コア |

**テスト結果**

| Model | Xcode Version | iOS ビルド時間 |
|:----:|:----:|:---------:|
| MacBook Pro (15-inch,2017)  | 12.4 | 05:12 |
| MacBook Pro（16-inch,2021）  |  13.2.1 | 01:02 |

# Unity(Apple Silicon)のバグ
さっそく1つ見つけました。
URPでカメラを2つ使うと下記のような表示になります。(Unityに報告済み)
![screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389614/2339abd9-305b-d7ed-426c-de40c51dae5a.png)

HDRに問題あるみたいです。Universal RenderPipeline AssetのHDRをオフにすると解決します。
![Renderer List.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389614/67708770-47f4-8b75-38bd-0ae7e5214737.png)

# Unity(Apple Silicon)の情報
下記のスレッドをよく見てます。
Now Available - Native Apple Silicon Editor Preview Builds
[https://forum.unity.com/threads/now-available-native-apple-silicon-editor-preview-builds.1122712/](https://forum.unity.com/threads/now-available-native-apple-silicon-editor-preview-builds.1122712/)
:vimgrepを使っていますか？

この記事はエイチーム引越し侍 / エイチームコネクトの社員による、
[Ateam Hikkoshi samurai Inc.× Ateam Connect Inc. Advent Calendar 2021](https://qiita.com/advent-calendar/2021/hikkoshizamurai-connect) 23日目の記事です。
本日は引越し侍Webエンジニアの@kaitatが担当します！
# はじめに 
エディタは何を使っていますか？ 
僕はプライベートでも仕事でもVimを使っています。 
普段は[ag.vim](https://github.com/rking/ag.vim)と[fzf.vim](https://github.com/junegunn/fzf.vim)等のプラグインをたくさん入れて開発をしていますが、最近プラグイン無しのVim環境を使うことがあります。 
プラグイン無しのVimでたいへんだと思ったのはファイルを跨ぐパターン検索でした。
調べてみるとVim本体にもパターン検索機能は備わっており、様々な機能があります。その使い方をご紹介します。
プラグインを設定していない環境でも `Ctrl-Z + fg`してコピーをする手間がなくなり快適です。
 
Vimには大きく2種類の検索機能があります。
Vimの検索が使える内部grepと標準的なgrepがVim上で使える外部grepです。
内部grepから使い方を説明します。 


# :vimgrep 
処理は重めですが、Vimの高機能な検索を使うことができます。
基本的には以下のように該当ファイル{file}を対象にパターン{pattern}検索をします。

```
:vimgrep {pattern} {file}
```
ファイルは*で複数検索でき、パターンにはVimの正規表現が使えます。
例えば、phpのタグを検索したければ、このように`\zs`や`\ze`を使って検索できます。

```
:vim /<?php\zs.*\ze?>/ ~/*.php
```
:::note info
内部的にはVimでファイルをメモリに読み込み検索をしているため処理は重いですが、
どんな環境でも検索ができ、Vimの高機能なパターン検索が使えるのは便利です。
:::

また、ファイルを%で記述してカレントファイルを検索します。
使いかたによっては`/`で検索するよりも使いやすい場面もあるのではないでしょうか？

僕はファイル対象を小さく絞った上で後ほどご紹介する[quickfix]() と連携すると実用的だと思っています。

# :grep 
上記ではvimに実装されている内部grepの使い方を書きましたが
次は端末から実行ができるgrep等と連携できる外部grepのご紹介をします。

vimgrepでは大量のファイルを検索したいときはやりずらいと思います。
高速検索したいときにはこの`grep`を使います。似ていますが、以下のように実行します。

```
:grep {pattern} {file}
```
これを使うことで検索速度は上がったのではないでしょうか？
こちらを使うと高速に検索できると思います。

また、Gitリポジトリの中であれば以下を実行することで`git grep`と連携します。

``` 
  set grepprg=git\ grep\ -n
``` 

これでより高速に検索することができました。
Gitリポジトリで開発することが多いと思うので.vimrcに書いておいても良いかもしれません。

# quickfix 
検索の方法はここまで紹介しましたが、複数結果があるときに見にくい状態だと思います。
検索結果を一覧表示し、該当箇所へジャンプできるquickfixのご紹介です。
vimgrepやgregの直後に以下を実行します。

```
:copen
```

試しにNextjsのプロジェクトでimport箇所を検索しました。実行すると検索結果の一覧が表示されます。

![B2A8BAAF-D6C9-4E8C-8A47-408A095BF4FB.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1438460/64ed9b4f-cba1-84a0-e197-abd2dc4b7f04.jpeg)

細かな操作方法もありますが、基本的には以下の操作で完結すると思います。

| コマンド | 動作 |
| --- | --- |
| :copen | 一覧の表示/quickfixのwindowに遷移 |
| :ccl | quickfixを閉じる |
| j,k | 移動  |
| リストの上でEnter| 該当箇所へジャンプ |
| :cn | 次の検索結果へ移動 |
| :cp | 前の検索結果へ移動 |


また、次の設定をすることで毎回`:copen`と実行せずにvimgrepをすることができます。

```
au QuickfixCmdPost vimgrep copen 
```


 
# おわりに 
まだまだ別の方法や詳細なコマンド、操作方法はありますが、
vimgrepを使うことでVimから抜けることなくファイルを跨いだ検索ができます。

僕はCtrl-Z+fgに比べて検索とジャンプで開発効率はあがりました。:wq

# 明日
クリスマスは@zwirkyの担当です。
引越し業界初の新サービスを支える開発体制についてです。お楽しみに！
空の障害物について

自動航行アプリなどで、飛行経路の計画を立てて行きます。地形や当日の風の強さや方向によっては臨機応変に変更できる柔軟な思考とともに、思い切って中止するなどの決断力が必要になったりもします。
災害地のドローン飛行計画については、台風などのドローンの飛行に直結する天候の変化にも敏感であることが必要になりますが、その他さまざまな条件を加味して計画しなければなりません。

#障害物の種類について
障害となる物体は大きく分けて２種類あります。

##固定された障害物
ドローンの飛行計画を立てる上で地形データをインポートしてから行いますが、建物や高圧線鉄塔などの高さはデータとしては入っていません。したがって計画する航路に奏した懸念する固定された構造物がないかというのは、事前に下見をして把握しておく必要があります。
高圧線のほかに、鉄塔や電波塔などの支線など目に付きにくい障害物があるか把握しておくことは非常に重要です。
Retun to Homeに入った際に、その帰還経路に目につきにくい障害物がないように計画しなければ、安全な飛行は期待できません。

標高の高い地域では、取り込んだ地形データにズレが生じることもあることから、事前に離発着のテストをしておくことも大事です。
障害物の考慮をさせても、離発着場所は同報告だけでなく、予備の離発着経路も想定できていなければなりません。

##動く障害物
バードストライクは、航空機につきものですが、ドローンにおいては死活問題です。
各鳥の種類により、縄張りがあり、カラスなどは、低空から地上８０ｍほど追いかけて来ます。
攻撃を受けそうな場合を想定して、撮影を中断して、前後左右に逃げるのではなく、上空へ逃げることも回避する手段として想定しておきましょう。
鳥の数が多い場合は、日程を見合わせるか、相手が慣れるまで継続して飛行するなどの方法も撮影の前に行うことになりますが、生き物が相手であることは努力だけでは回避できません。

他のドローンが飛行する可能性については、飛行する場所をFISSなどの情報サイトに登録するという方法も活用して、周知しておくということが基本でありますが、長期間で空域を登録されている場合など、不用意に登録すると他のオペレーターに支障をきたすことになりますので、正しい情報を入力して行うことが賢明です。

#まとめ
固定された障害物や鳥などの対策を考えつつ、計画を行いましょう。
航空法提要範囲外でも、高圧線に接近する場合などには、関係各位に周知して安全なフライトを実施することを目指しましょう。