OmniAICreator/Qiita-1.07M huggingface dataset:
Wayland 上の GNOME でリモートデスクトップ (VNC)

gnome-remote-desktop を使うと Wayland の GNOME セッション上で VNC サーバーを動かすことができます。

検証環境:

- mutter 3.36.7
- gnome-remote-desktop 0.1.9
- pipewire 0.3.18

## インストール
### Fedora

```
sudo dnf install gnome-remote-desktop
```

### Gentoo

```
su -c "echo 'net-misc/gnome-remote-desktop **' >> /etc/portage/package.accept_keywords"
su -c "echo 'media-video/pipewire ~amd64' >> /etc/portage/package.accept_keywords"
sudo euse -p x11-wm/mutter -E screencast
sudo emerge gnome-remote-desktop
```

## サーバー側の設定
GNOME の 設定 > 共有 > 画面共有 から設定できます。
「このスクリーンを操作する接続を許可する」を有効にすることでマウスやキーボードの入力を受け付けるようになります。これを有効にしないと一切の操作を受け付けません。

## 接続してみる
プロトコルが RDP ではなく RFB を使用しているため、動きのある映像はカクつきます。また音も出ません。しかし普通に使う分には十分です。
RDP にも一応対応していますが、今のところほとんど未完成の状態でキー入力やマウス入力を受け付けず、アスペクト比もおかしいです。こちらに関してはこれから機能が拡充されていくと思うので今後のアップデートに期待です。

## 注意が必要な点
基本的にはログインした状態の GNOME セッション上でサーバーが動作するため、ログアウトするとサーバーが落ちてアクセスできなくなります。
また VNC は暗号化されないプロトコルですので、インターネット越しに使う場合は VPN や SSH ポートフォワーディングを利用することを強く推奨します。
[HTTP]CurlコマンドでJSON形式のPOSTを行う方法

##はじめに
CurlコマンドでPOSTをする機会があり調べてみたので備忘録に残す

##方法

```
curl -X POST -H "Content-Type: application/json" -d '{"カラム名":"内容", "カラム名":"内容"}' path(例 localhost:3000/items)
```
複数のパラメーターがある場合は「 , 」で繋げる

##参考
https://qiita.com/sensuikan1973/items/b2085a9cdc6d1e97e8f8
AWS CDKはグローバルでインストールしない

## はじめに

結論を先に書くと、ローカルにインストールし、`npx cdk`で呼びましょう、と言う話です。

## 本文

### グローバルにインストールするデメリット

グローバルにインストールをして暫くたつと、以下のようなエラーがでるようになります。

``` 
This CDK CLI is not compatible with the CDK library used by your application. 
Please upgrade the CLI to the latest version. 
(Cloud assembly schema version mismatch: Maximum schema version supported is 4.0.0, but found 7.0.0)
```

原因としては、グローバルに入れたCDKとローカルのCDKのバージョンに違いがあるからです。
インストールした直後には違いはないので、グローバルに入れて、そのまま利用してしまう人が多いと思いますが、後日新しいバージョンが出た時に修正をして、`npm run build`をすると新しいバージョンが出ているメッセージが出て、更新を促され、以下のようなコマンドを実行します。

``` shell
$ ncu -u
$ npm i
```

しかし、これはローカルのみの更新となる為、グローバルは更新されず、バージョンの違いが発生して上記のエラーとなります。

### ローカルにインストールする方法

これを回避する為、AWS CDKはローカルにインストールします。

``` shell
npm install aws-cdk
```

こうする事でCDK自体が`package.json`でバージョン管理されるようになり、バージョンを纏めて管理できるようになり、`ncu`の実行時に違いが発生する事がなくなります。

### ローカルでインストールした場合の実行方法

``` shell
bash: cdk: command not found
```

しかし、このやり方だと`cdk`では上記のようなエラーとなって、呼び出せなくなってしまいます。cdkが`.\node_module\.bin`にあり、パスが通ってないからです。パスを通す事で実行可能になりますが、プロジェクト毎で切り替えるのは辛く、もっと簡単な方法があります。

``` shell
npx cdk bootstrap
``` 
npxを使う事で、複雑な事はせず、CDKを実行する事ができます。

## さいごに

CDKはたまにしか触らないのに、嵌りポイントが多く、ネットにまだ記事が少なく、自分も直ぐに忘れてしまうので、少しずつ、増やしてきます。

## 参考文献

- npxでnodeモジュールを実行する
 - https://qiita.com/tatakahashiap/items/1c4ab221c4993e7c4ebf
- AWS CDKでハマったこと＆解決法
  - https://qiita.com/honmaaax/items/d1467b1f49df2ae09b97
[Rails]db:migrateの際に「private method `String' called ~ 」エラー

##はじめに
マイグレート時に下記のエラーがでたので備忘録として書く

```
== 20~~~~~~~~~~~ CreateBoards: migrating =====================================
-- create_table(:boards)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

private method `String' called for 〜〜〜〜〜〜〜〜〜
```

マイグレーションファイル

```
class CreateBoards < ActiveRecord::Migration[6.0]
  def change
    create_table :boards do |t|
      t.String :title
      t.String :text

      t.timestamps
    end
  end
end
```

##対処方法
stringのSが大文字になっていると駄目らしい
小文字に修正して解決

```
class CreateBoards < ActiveRecord::Migration[6.0]
  def change
    create_table :boards do |t|
      t.string :title
      t.string :text

      t.timestamps
    end
  end
end
```

##参考
https://stackoverflow.com/questions/4003651/ruby-on-rails-rake-dbmigrate-error/4003717
[Rails]bundle install でCould not locate Gemfile

##はじめに
bundle installでCould not locate Gemfileエラーが出たので対処


##解決方法
現在いるディレクトリにGemfileがないとの事
単純なミスだった。。。
Docker構築すれば陥らないミスなのでDocker環境を作りましょう笑


##参考
https://tacosvilledge.hatenablog.com/entry/2015/08/02/191301
なぜDeNA 20 新卒 Advent Calendar 2020を企画したのか

# はじめに
ついに最終日です🎉
「なぜ新卒のカレンダーを企画したのか？」の理由と感想を書いていきます。

# 新卒のカレンダーを企画した理由
> 「内定者で何かをしたい！」という思いと、「採用に貢献したい！」という思いが合わさった結果です。
この企画は来年で完成するもので、

> - 👨‍🎓内定者のカレンダー
- 👩‍💻新卒のカレンダー
- 👨‍💻社員のカレンダー

> の3つを作成することで

> - 👨‍🎓内定者のカレンダー: **どういう人が入社するのか**
- 👩‍💻新卒のカレンダー: **1年後の成長度、成長環境**
- 👨‍💻社員のカレンダー: **2年以降のキャリア**

> を一部ですが表現でき、DeNAという会社のことをより知ってもらえる機会になると考えました。
**学生にとっては、どういう人が入社し、1年後の成長、その後のキャリアが見えるのは非常に有益な情報になると考えてます。**
採用イベントで知ることが可能ですが記事という、より自然体で個人の思想がでる媒体での情報から感じ取れるものがあると私は思ってます。（就活中は各社の技術ブログはチェックしてました）

上記を内定者のカレンダーを企画した理由で書きました。
最初に書いていある通り企画自体が今年で内定者、新卒、社員の3つのカレンダーが揃って完成するものでした。
上記の思いは変わらず、去年は内定者、今年は新卒として同期で記事を執筆しました。

▼ 去年の記事
[なぜDeNA 20 新卒 Advent Calendar 2019を企画したのか【＋専用アプリの解説】](https://qiita.com/naro143/items/827059d52527efb4f978)

# お詫び
去年の想定では新卒は「1年後の成長度、成長環境」を軸に記事を執筆する予定でしたが、今年も個人の興味がある技術について「自由に執筆する」というテーマで運営をしました。成長環境については是非、以下の記事をご覧ください。

▼研修について
[【研修編】願いドリブンで新卒の成長環境を考え続けている話](https://engineer.dena.com/posts/2020.10/20-new-graduates-training-summary-1/)

▼配属について
[【配属編】願いドリブンで新卒の成長環境を考え続けている話](https://engineer.dena.com/posts/2020.11/20-new-graduates-assignment/)

# 新卒で同期と何かをするということ
新卒の12月という時期はDeNAの新卒エンジニアにとっては忙しい時期でした。配属後半年弱が経過し挑戦できる範囲がグッと広がる時期です。（逆に半年でここまで挑戦できるのはありがたいです。）同期の多くが新たな挑戦に多くの学びを得ながら苦戦をしていました。そのため去年よりは参加者は少なくなりました。ただ、忙しい中でも今年から参加をしてくれた同期、去年から引き続き参加をしてくれた同期がいました。複数記事を書いてくれた同期のおかげもあり25日を無事に埋めることができました。

**参加いただいた同期のみなさん本当にありがとうございました。**

同期で何かを行うことは本当に楽しいです。また何かイベントを行えたらと思っています。

# 21卒内定者へ
お疲れ様でした。12月の毎日の楽しみが増えました。
21卒内定者のカレンダーができているのを確認した時に本当に嬉しかったです。
本当にありがとうございました。

面白い記事が多いので是非ご覧ください。

▼21新卒内定者のカレンダー
[DeNA 21 新卒 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/dena-21-shinsotsu)

# 感想
忙しい中での開催で不安もありましたが、同期や社員のみなさんの協力もあり25日埋めることができました。
やはり同期と何かをすること、同期の記事を見るのは楽しかったです。
来年から20新卒は社員のカレンダーに執筆を行う予定です。21新卒カレンダー、22卒内定者カレンダーができるかも？と思うだけで楽しみです。

来年のDeNAのカレンダーも楽しみにお待ちください！🙌

# 2年間、本当にありがとうございました。

### 是非こちらもご覧ください
▼21卒内定者のまとめ
[なぜ DeNA 21 新卒 Advent Calendar 2020 が生まれたのか](https://qiita.com/treastrain/items/7bc61ed4c195d711bc24)

▼新卒採用
[DeNA 新卒採用について](https://student.dena.com/)
macで久々にApacheが起動しなくなったので環境構築やり直したメモ

突然macでApacheが起動しなくなりました😭。自動アップデートとかで時々あるんだけど久々になった。仕事とかローカルのWikiに書いているのでWebサーバ動かないと仕事できないので、この機会に環境を再構築することに。


以下、古い情報なので、最新の情報は、[こちらのブログ](https://kujirahand.com/blog/index.php?2021%2F04%2F%E3%81%BE%E3%81%9Fmac%E3%81%A7apache%E3%81%8C%E5%8B%95%E3%81%8B%E3%81%AA%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F)を参照すること。


# macOSデフォルトのApacheを止める

まず、macデフォルトのApacheが入っていれば削除

```
sudo /usr/sbin/apachectl stop
sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist
```

# HomebrewでApacheをインストール

```
brew install httpd
brew services start httpd
```

# それでも駄目なとき

上記のようにしても、Homebrewで入れたApacheが動かない場合、エラーログを見るべし。設定ファイルをチェック。

```
/usr/local/etc/httpd/httpd.conf
```

設定ファイルの項目`ErrorLog`のパスを調べるべし。例えば以下のように記されている。

```
ErrorLog "/usr/local/var/log/httpd/error_log"
```

## ここで動かなくなった原因が判明

ここまでやって、今回、私がどうしてもうまくApacheが起動しなかった原因は、このエラーログとアクセスログのアクセス権限がなくなっていた事だと判明。そのため、ログを記録しようとApacheが起動した時に、アクセス権がなくてうまくApacheが起動できなくなっていたようだ。

とりあえず動かないと思ったらエラーログを見るべき。エラーログに何も記されていないと思ったら、アクセス権限を確認しよう。
スタートアップのエンジニア組織はどう成長してきたのか

株式会社センシンロボティクスの開発部長の高橋です。

昨年のアドベントカレンダーで[スタートアップでのエンジニア組織の作り方](https://qiita.com/tayasu/items/9b51f69d1ff9e7d316ad)という記事を書いたのですが、1年経って変わった事を書いてみます。

## リモートワークの導入

1年前はリモートワーク否定派でした。立ち上げ時期にはF2Fでのコミュニケーションが必要という考えでした。ただコロナ禍ではリモートワークを導入してみたところ、不安であったコミュニケーション不足による生産性の低下は特にみられず非常にスムーズに導入できた印象です。
上手くいった背景には下記のような理由が考えられます。

* 元々出張が多い会社なのでWeb会議に慣れていた
* 開発プロセスが定着していた
* 後述するチーム開発が浸透していた、
* ドローンを飛ばす必要がある実機テストや現場作業などで顔を合わす機会が適度にあった

コロナ禍前は人が増えたのでオフィスの引っ越しを検討していたのですが、リモートワークでオフィスから人がいなくなったので、今はオフィスの半分を機材倉庫にリニューアルしてしまい、全員出社が無理な状態になったため、リモートワーク前提の会社になりました。

## フラットな組織からの変化

### テックリード制の導入

1年前はでマネジメントは僕だけが担当し、できるかぎりフラットな組織でいましたが、さすがに人が増えてくると無理が出てきます。毎週の1on1は隔週になり、それでも時間が足りなくなります。採用活動にも時間が取れなくなってきます。
また、人が増えたことに加えプロジェクトの数も増えたため、1人1プロジェクトという状況も出てきて属人化が目立ちはじめ、プロジェクトを横断した技術情報の共有も必要になってきました。

そこでテックリード制を導入して、メンバーとの1on1をテックリードに委譲し、技術相談をはじめ目標設定や振り返りなどのメンターの役割を担ってもらいました。結果テックリードがプロジェクトを横断した技術課題の把握などができ、目標設定の精度も向上したと思います。

技術課題の解決策もテックリードに一任していきました。これによって開発のスピード感もより向上していきます。
ただし、テックリードの数以上にチームがあるため、テックリードがいないチームの責任の所在が曖昧になるという課題もありました。

### マネージャーの新規採用

エンジニアが20名ぐらいになってくると、マネジメント業務も1人では追いつかなくなります。限界までマネージャーを1人で頑張ろうと決めていたのと、マネージャーを増やすときはマネジメントの資質がある人を！と考えていました。
そして僕が潰れそうになったタイミングで相応しい人に出会えたのを機にマネージャーを新規採用。

また優秀なテックリードも増えたため、1チーム1テックリードの組織になりチームがより自律的に。チームリーダーとメンターが一致したことで目標設定や評価もより精度が上がりスムーズになったと思います。（チームを横断したメンターにも良さがあったので、いずれメンター制は復活したいと考えてます）

![history.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27314/54e53409-b8d6-4603-fe7f-f520d0072809.png "組織の変遷")

## もう少し詳しい成長過程について

先日、[CTO of the year 2020](https://jp.techcrunch.com/2020/12/21/ctooftheyear-promotion/)というイベントに登壇させて頂き、僕1人の状態から現状の20名超の組織になるまでの過程を話したので、そちらの資料でより詳しい内容をご覧ください。

[![ソリューションカンパニーの開発組織はどう成長してきたのか](https://files.speakerdeck.com/presentations/a446132e89a64d93b63d71658ef6e67d/preview_slide_0.jpg?16983100 "ソリューションカンパニーの開発組織はどう成長してきたのか")](https://speakerdeck.com/tayasu/soriyusiyonkanpanifalsekai-fa-zu-zhi-hadoucheng-chang-sitekitafalseka "ソリューションカンパニーの開発組織はどう成長してきたのか")
[ソリューションカンパニーの開発組織はどう成長してきたのか](https://speakerdeck.com/tayasu/soriyusiyonkanpanifalsekai-fa-zu-zhi-hadoucheng-chang-sitekitafalseka "ソリューションカンパニーの開発組織はどう成長してきたのか")

こんな開発組織で働いてみたい！という方はぜひこちらの採用サイトをご覧ください！
[株式会社センシンロボティクス 採用サイト](https://www.sensyn-robotics.com/recruit)
UnityのmacOSビルドでCPUタイプを強制する

Unity 2020.2からApple Siliconのサポートが追加され、ビルド時にCPUタイプを選べるようになりました。これをコードから変更するためのAPIは現時点ではありませんが、別のメソッドを使って強制的に変更することが可能です。

# TL;DR

```csharp
using UnityEditor;

// 最後の引数以外はこの通りに記述しないと動作しないので注意
EditorUserBuildSettings.SetPlatformSettings(
    "Standalone",
    "OSXUniversal",
    "Architecture",
    "x64" // Possible values: "x64" "ARM64" "x64ARM64"
);
```

# WHY

Unity 2020.2にアップグレードすると、CPU TypeはUniversal 2 (x64 + ARM64)になるようです。これはBuild Settingsのウィンドウから変更することが可能です。
ところが、Jenkinsなどでのビルドのために、コマンドラインからビルドを行う時にはBuild Settingsなどのウィンドウは開けません。
そして、Build Settingsの設定が実際に書き込まれているのは `${PROJECT_ROOT}/Library/EditorUserBuildSettings.asset` であることがわかりました。これは少しまずいことです。というのも、多くのプロジェクトで`Library`フォルダを無視する設定になっているはずだからです。このファイルの状況をコードだけで再現しなければなりません。

# HOW

このファイルはプロジェクトの設定に関わらずバイナリファイルですが、無理やりテキストで開くと最後の方がASCIIで読めるようになっていました。

```
Standalone....iPhone....OSXUniversal....Architecture....x64....CreateXcodeProject....false
```

(この部分には多くの不可視文字が入っていたので `....` で置き換えています。`....` の数と不可視文字の数は対応しません。)

現時点でUnityはここの値を変えるための専用のAPIを用意していませんが、[直接変えるためのAPIは存在します](https://docs.unity3d.com/2020.2/Documentation/ScriptReference/EditorUserBuildSettings.SetPlatformSettings.html)。

```csharp
EditorUserBuildSettings.SetPlatformSettings(
    buildTargetGroupStr, builTargetStr, settingName, settingValue
);
```

`buildTargetGroupStr` などは、`.asset`ファイルの中に書かれていた通りに書かないと動作しないので注意です。最終的には、最初のコードブロックのようなコードになるはずです。

これを `IPreprocessBuildWithReport` の実装に入れることによって、Build Settingsウィンドウの設定値にかかわらず強制的にCPU Typeを指定することができます。逆に、このコードがあるとBuild SettingsのArchitectureの値が毎回戻ってしまうので注意しましょう。
新型コロナに負けず、ROSを活かしてロボットを完成させた話

こんにちは！みっちーです。
この記事は、[ROS/ROS2 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/ros)の14日目の投稿です。

我々は、中四国でROSを勉強するコミュニティー「[瀬戸内ROS勉強会](https://ros.xrea.jp/)」として、活動しております。
ROSの勉強の一環として、メンバーでROS搭載ロボット(アイロンビーズセッターR)を共同制作しました。
せっかく完成したロボットの発表の場として、先日開催された[みんなのラズパイコンテスト](https://project.nikkeibp.co.jp/pc/rpic/)に応募したのですが、なんと「優秀賞」をいただくことが出来ました。

アドベントカレンダーには、その際にかなり気合を入れて書いた応募書類の内容などを紹介しようかなと思っていたのですが、どうも応募書類の内容は、誌面で記事になるらしいという話を聞き、アドベントカレンダーには、「[ROS Japan UG Re: #35 自作／カスタムロボットのROS対応 Webinar](https://rosjp.connpass.com/event/197222/)」の動画を紹介させていただくことにしました。
読み物を期待されていた方には申し訳ないです。(><)
Webinarに参加された方には同じ内容になりますが、ご容赦ください。

# アイロンビーズセッターR

アイロンビーズセッターRとは、アイロンビーズをお絵描きした通りに並べ直してくれる、ROS搭載のスカラロボットアームです。
2019年3月から活動開始し、約1年半で完成しました。
2020年はコロナ禍の影響で、オンライン開発を行いました。オンライン開発を行う上で、ROSが大いに役立ちました。
![IMGP1489.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231185/cc1fff9a-6241-a3d3-40e5-9523a9833433.jpeg)

# 説明動画

2020/12/14に開催された、「[ROS Japan UG Re: #35 自作／カスタムロボットのROS対応 Webinar](https://rosjp.connpass.com/event/197222/)」の内容です。
[![youtube.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231185/a9d5d19e-1b01-2c0b-7fd1-5b98226b349e.png)](https://youtu.be/9IrPs0L0UJQ)
動画(ROSJP Re: #35 「コロナに負けず、ROSを活かしてロボットを完成させた話」) : https://youtu.be/9IrPs0L0UJQ

# ありがとうございました。

ご視聴いただき、ありがとうございました！
なぜか、FB.login()が実行できなかった時の話

今、友達の頼みでWebサイトを制作をしているのですが、Facebookとの連携をとるためにFacebookSDKを導入し、色々と試していたところ、エラーの沼にハマってしまったので、備忘録も兼ねて同じエラーが出ている方の助けになればなと思います。

エラー名ははっきりとは覚えていないのですが、「FB.login() ～ undefiend ～」的なエラーだったと思います。JavaScriptのエラーでよく見かけますね。

要するに、関数が見つからないよと言う意味です。

それでは、どのように解決したかを順を追って説明します。

#SDKファイルが読み込まれていない！？#

FacebookのDevelopperサイトから、以下のコードをコピペします。

```App.vue
<script>
  window.fbAsyncInit = function() {
    FB.init({
      appId      : '{your-app-id}',
      cookie     : true,
      xfbml      : true,
      version    : '{api-version}'
    });
      
    FB.AppEvents.logPageView();   
      
  };

  (function(d, s, id){
     var js, fjs = d.getElementsByTagName(s)[0];
     if (d.getElementById(id)) {return;}
     js = d.createElement(s); js.id = id;
     js.src = "https://connect.facebook.net/en_US/sdk.js";
     fjs.parentNode.insertBefore(js, fjs);
   }(document, 'script', 'facebook-jssdk'));
</script>
```

ただ、このままではFacebookのログイン機能、APIを取得などの関数を実行することはできません。

なぜなら、、、、

**SDKファイルを読み込めていないのです！！！**

実際に、Chromeの開発者ツールの「Element」を見て下さい。

```index.html
<script src="https://connect.facebook.net/ja_JP/sdk.js/#xfbml=1&version=v9.0&appId=～&autoLogAppEvents=1"
```

このようなSDKファイルが読み込まれていないと思います。

なので、これを読み込めるようにしましょう！！

#createdで関数の実行#

先ほどの関数をmethods内にて定義し、createdで実行します。

```App.vue
<script>
methods: {
   async initFacebook() {
      //init初期化
      window.fbAsyncInit = function() {
        window.FB.init({
          appId: "MY_APP_ID", //アプリID
          status: true,
          cookie: true,
          xfbml: true,
          version: "v9.0",
        });
      };
    },
   async loadFacebookSDK(d, s, id) {
      //sdkの取得(引数を指定して実行、一番最初に実行)
      //document, "script", "facebook-jssdk"
      var js,
        fjs = d.getElementsByTagName(s)[0];
      if (d.getElementById(id)) {
        return;
      }
      js = d.createElement(s);
      js.id = id;
      js.crossorigin = "anonymous";
      js.src =
        "https://connect.facebook.net/ja_JP/sdk.js/#xfbml=1&version=v9.0&appId=ご自身のAppIDを入れてください&autoLogAppEvents=1";
      js.nonce = "ToRaB4ll";
      fjs.parentNode.insertBefore(js, fjs);
    },
}
created() {
      await this.loadFacebookSDK(document, "script", "facebook-jssdk"); 
      //sdkファイルの読み込み。これを最初に実行しないとFBが使えない
      await this.initFacebook();  
      //initの初期化
}
</script>
```

これで、無事ログイン機能を実装することができました！！

<font color="red">※ちなみに、SDKファイルの実行は一番最初に実行してください！（絶対）</font color>

また、App.vueで実行してしまうと、毎回実行され、すべてのページでロードが行われるのであまりおススメはしないです。。。

なので、Facebookとの連携を行うページだけロードしてください。

何回も実行する場合は、僕の書いた[何回も使う関数を、いつでもどこでも呼び出したい。。。](https://qiita.com/akki-memo/items/0bd31aa31db01e5ab9c4)の記事を参考にして頂くと良いかと！！

以上、「FB.login()のエラー解決方法」でした！！！

良ければ、LGTM、コメントお願いします。

また、何か間違っていることがあればご指摘頂けると幸いです。

他にも初心者さん向けに記事を投稿しているので、時間があれば他の記事も見て下さい！！

Thank you for reading
どうやら本当のデスマーチを教える時が来たようですね

![B32C26A2-E84C-4362-BF5F-85D63650EF65.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11525/2dc1102c-9c29-a800-24df-18c4e8c5368a.png)

この業界、デスマーチという用語が安易に使われすぎていると私は感じています。自虐的な表現が好きな日本で、この言葉はとてもウケが良かったのでしょう、他の IT 系ことわざに比べて極端に有名です。

が、そのために誤用も増えてきました。たんに自分の仕事がきつい状態になることを「デスマってる」と表現する人がいますが、本当のデスマーチはそんなものではありません。まず、「マーチ」である以上、個人の問題ではないというのが最重要点です。

デスマーチとは組織の病です。ソフトウェア開発プロジェクトを計画するトップが未熟だと、その素人見積のせいで、見えていない部分の労力に予算と時間を確保されないまま、プロジェクトがスタートしてしまいます。冷静に考えて、リソースが半分しかなければ、50% 以上の進捗が出るはずがありません。愚かな組織人はなぜか、その明らかな失敗を見通す合理的判断をタブー視し、不可能な催促をしたり、品質を犠牲にしろとさえ言い出します。雇われ開発者の最優先インセンティブは今月の給料なので、わかっていても逆らえません。遠い先の失敗より目先の生活のためにと、不健全なプロジェクト管理に付き合うことになります。すると、その不条理さは精神を蝕んでいきます。この疲弊はさらに不条理を慢性化させ、理性を麻痺させます。そうして、次々と脱落者を出しながら、プロジェクトは予算と時間を無駄に消耗し、絶対に成功しない道に突き進んで行きます。そしていよいよ、予算が尽きると起きるのは、無償のスケジュール延期です。こうした悲惨な状況で延々と延期を繰り返し続けることがデスマーチです。

- 決まった期日の仕事が多いのはデスマーチではありません
- 個人に負担が集中しているだけではデスマーチになりません
- ハードワークでもリソースが十分確保されているのならデスマーチになりません
- いさぎよく失敗を迎えられるのはデスマーチではありません
- 理性の欠如が慢性化していないのはデスマーチではありません
- 精神を病んだ脱落者が出る可能性がないのはデスマーチではありません

こう説明すると、デスマーチなんて起きないんじゃないかと思われるかもしれませんが、残念ながら現実には、きっかけさえあればすぐに、このすべてがいちどに押し寄せます。

この本当に病んだ組織のあり方を表すために、デスマーチという言葉を使って欲しいと思うのです。たしかに、時代とともに言葉は変わっていくのは一理あるのですが、かといって、「あ〜、今日は残業だからデスマだな」などと気軽に使うと、せっかくあった「組織の病である」という意味合いが失われてしまいます。

「デスマーチ=死の行進」の語源は、冗談じゃない本当の人の死です。ナチスがユダヤ人を移送したときの非人道的な行進、あるいは、太平洋戦争の東南アジアでの捕虜移送のさいは、米軍/イギリス軍の負傷兵だけでなく日本人までもが、無計画な強制行進によって、じっさいに多くの命が失われました。「デスマ」はこれに由来します。上層部の現場への無関心、明らかに足りない設備、理性を欠いた指示、疲弊が常態化した中での無謀な計画、そうしてバタバタと人が死んでいく有様。失敗プロジェクトとの類似点のなんと多いことか。

日本人として、この歴史を知ってなお間違った意味でデスマーチを使うかどうかは、みなさんの道徳心に委ねます。

ここまでのアンチパターンは、開発と設計に関するものでした。アンチパターン本にはこのあとにも同じぐらいの数のパターンが紹介されています。この後半部分は、主に組織論やプロジェクト管理に関するパターンとなっていますが、アドベントカレンダーの日数が足りないのと、楽しく読めるあるある話でなくなるため、シリーズはここで区切らせていただきます。ご容赦のほど...

その代わりとして、組織とプロジェクトのアンチパターンが行き着く先である、デスマーチを紹介しました。興味がある方はこちらのパターン集から、関係しそうな項目に目を通してみてください。

http://wiki.c2.com/?AntiPatternsCatalog

# まとめ

日本で翻訳版のアンチパターン本が出版されたのは 2002 年ですが、原著が執筆されたのはなんと 1998 年です。おかしいですね。開発とアーキテクチャに関するアンチパターンを読んで、なにか気づくことはありませんか。

そう、これらのアンチパターンは 1998 年以前にすでに存在したにもかかわらず、その指摘する問題点は、ドメイン駆動設計やアジャイル開発、クリーンアーキテクチャの対象とする問題と同じなのです。さらに、アンチパターンの解決策を「リファクタリング」と呼んでおり、ブロブのリファクタリング工程などは、ファウラーのリファクタリングそのものです。

ドメイン駆動設計の原著は 2002 年です。この数には 2 つの驚きがあります。DDD がそんなに古い本なのかということと、アンチパターンはさらにその 4 年前だということです。(ちなみにデスマーチは 1996 年です)

1998 年の時点で、すでにこれだけの問題が見つかっていたというのが真実です。プログラマーのみなさんなら、問題を発見しさえすれば、解決策はすぐにわかるはず、という理屈はご存知ですね。アジャイル開発や DDD には、実は、何ら新しい発見はなく、90 年代からわかっていた問題の解決策を、たんに強い力で実行に移しただけのものと理解できると私は思うのです。

ではなぜ、20 年経った今なお、アンチパターン的問題が起きつづけ、その解決にアジャイルだの DDD だのクリーンアーキテクチャだのが持ち出されるのか。それは、アンチパターンが人と組織の性 (さが) から生まれる普遍的なものだからだと思うのです。

デザインパターンは、前提とするプログラム言語が発展したことで、GoF パターンのあれは価値が下がっただの、あれを取り入れるべきだだの言われ、時代とともに変化する側面があります。いっぽうアンチパターンは、人間が変わらない以上、新しい人が業界に増えるたびに、いつまでも繰り返されるように思うのです。

マンガでは、当時の表現でプロプライエタリ製品となっている箇所を、意図的に「フレームワーク」や OSS ライブラリに置き換えて表現しました。すると、驚くほど、ごく最近のあるある話になりました。初回に言った、アンチパターンはデザインパターンより偏在するというのは、上手い下手がその理由というだけでなく、時代を超えて人からつねに発生するものだという意味もあります。

冗談のような古典の紹介に見えるアドベントカレンダーでしたが、アンチパターン本の前半が語っていたのは、いまをときめくアーキテクチャだのパラダイムだのの、根源にかかわる話だと伝えていたつもりでした。このメッセージがみなさんに届くとよいのですが。
react native のプロジェクトからandroid apk を作成する方法



#1　keyの作成

```
cd android/app

keytool -genkey -v -keystore [App name].keystore -alias [alias] -keyalg RSA -

keysize 2048 -validity 10000

cd ../../
```

#2　android/gradle.propertiesの設定

作成したKeyファイルをandroid/gradle.propertiesへ登録する

```
MYAPP_RELEASE_STORE_FILE=[App name]
MYAPP_RELEASE_KEY_ALIAS=[alias]
MYAPP_RELEASE_STORE_PASSWORD=********
MYAPP_RELEASE_KEY_PASSWORD=********
```

#3　android/app/build.gradleの設定

android/app/build.gradleへrelease時の設定を追加

下記のrelease部分を追記

```
    signingConfigs {
        debug {
　　　　　　・・・
        }
        release {
            if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) {
                    storeFile file(MYAPP_RELEASE_STORE_FILE)
                    storePassword MYAPP_RELEASE_STORE_PASSWORD
                    keyAlias MYAPP_RELEASE_KEY_ALIAS
                    keyPassword MYAPP_RELEASE_KEY_PASSWORD
            }
        }
    }
```

同ファイルへ下記１行を追記

```
    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
        release {
            // Caution! In production, you need to generate your own keystore file.
            // see https://reactnative.dev/docs/signed-apk-android.
            // signingConfig signingConfigs.debug
            // minifyEnabled enableProguardInReleaseBuilds
            // proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
            signingConfig signingConfigs.release //追記部分
        }
    }
```
#4　buildの実行

gradlew assembleReleaseによってapkファイルの作成を行う

```
cd android

./gradlew assembleRelease

open app/build/outputs/apk/release/
```
世界一わかりやすいXGBoostの解説(5分ver)

PydataOkinawa(2019)で発表したスライドをスクショしたもの
X'masなのでXGBoostでも振り返ろうかと思い貼り付けた
1/15
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/936440/d2f4448d-18c4-cddc-66df-dcccb326aada.png)
2/15
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/936440/48d050f5-3b26-0d5d-fadd-fa9b9d84e310.png)
3/15
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/936440/49d3e031-61ae-d7fb-f805-d46723ec0f92.png)
4/15
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/936440/f76cbb20-2a1e-7be7-fee4-ff33623ba806.png)
5/15
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/936440/9231facd-58fc-e21a-5a6a-8c156fbb3a25.png)
6/15
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/936440/1f438ddd-0a8b-a285-56b9-bd4cec927232.png)
7/15
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/936440/b562e8f7-dabf-6f9d-533f-50ca95fa960d.png)
8/15
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/936440/ad1360aa-626d-a96f-796b-3b454cf57a1c.png)
9/15
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/936440/df164b62-4118-01d6-3f66-6230a232692f.png)
10/15
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/936440/869a7fd2-7dad-3de6-1698-ab0614d499d9.png)
11/15
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/936440/0266f969-ee9c-43d3-deac-118615bb1482.png)
12/15
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/936440/0abe65e3-f20e-5c62-7fd5-eff24569beb9.png)
13/15
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/936440/677ac6ae-1708-9814-2555-b33f21f6e5d7.png)
14/15
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/936440/4c69988f-f282-7e73-c530-10406b64e0cb.png)
15/15
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/936440/226c676c-079b-6d0f-cfd0-e288ae759b46.png)

何某の褒美なれば重畳で候
MerryXGBoost
そういえば2020/12/26(土)はちゅらデータなる会社がオープンな忘年会LTをやるらしいのでデータ分析に興味のある何某はチェックでござる
https://churadata.connpass.com/event/196682/
AndoridアプリでGif画像を再生したい(Java,Kotlin)

投稿が遅くなり申し訳ありません。
今回はAndoridでGif画像を再生する方法について述べていきます。

##ライブラリの使用
AndoridにはGif画像再生のためのライブラリがいくつか用意されています。
しかもImageView内で再生できるので使いやすいです。
今回はその中でもよく使われるライブラリの1つglideを紹介します！

###1.build.gradleのdependenciesにglideを追加
まずはライブラリを追加しましょう！

```
implementation 'com.github.bumptech.glide:glide:3.7.0'
```

もしインターネット上の画像を使うのであれば
Manifest.xmlに以下も追加しておきましょう！

```
<uses-permission android:name="android.permission.INTERNET" />
```


###2.ImageViewを追加
Gif画像を貼り付けたいところにImageViewを指定しましょう！

```
<ImageView
    android:id="@+id/image_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
```
URLではなくローカルに落としたGif画像を使いたい方は
drawable/rawにGif画像を入れておきましょう！


###3.ImageViewにGif画像をセット
ここでGif画像をセットします

```
//ローカルのGif画像を使う場合
ImageView matchImage = findViewById(R.id.image_view);
GlideDrawableImageViewTarget target = new GlideDrawableImageViewTarget(matchImage);
Glide.with(context).load(R.raw.gif).into(target);

//インターネットのGif画像を使う場合
ImageView matchImage = findViewById(R.id.image_view);
String gifUrl = "https://~~~.gif";
Glide.with(this).load(gifUrl).into(matchImage);
```

##連続再生を止めたい
このglideは初期状態ではGifが永遠にloopし続けます。
ではこれを止めるにはどうすればいいのでしょうか？

調べてみるとlistenerで
```resource.setLoopCount(1);```
これを入力すれば1回だけ再生になるとありましたが
実際にやってみてもできませんでした。

ですが他にも良い方法があり、以下のように変更するとできました！

```
ImageView matchImage = findViewById(R.id.image_view);
GlideDrawableImageViewTarget target = new GlideDrawableImageViewTarget(matchImage,1);
Glide.with(context).load(R.raw.gif).into(target);
```

一見何が変わったかわからないかもしれません。
```GlideDrawableImageViewTarget(matchImage,1);```
ここに1が加わっています！
ここの第2引数にはloop回数が入ります！
なので第2引数を指定してあげればループ回数を指定することが可能です！

今回は以上です！最後までお読みいただきありがとうございました！
ディレクトリ作成からgit pushまで(初学者向け)

<h2>初学者なのでアウトプットを兼ねて、
gitでディレクトリ作成からpushまでの手順をまとめてみました。</h2>
<ol>
<hr>
<li>　mkdir  (ディレクトリ名)</li>
<p>mkdirはディレクトリを作成するコマンドです。pushしたいディレクトリを作成します。</p
><hr>
<li>　cd (ディレクトリ名)</li>
<p>これは、ディレクトリを移動するコマンドです。</p><p>これで作成したディレクトリに移動します。</p>
<hr>
<li>　git init</li>
<p>これはgitで管理するリポジトリを新規作成するコマンドです。また既にあるリポジトリを再初期化もできます。</p>
<p>これでブランチは、mainブランチに切り替わります。</p>
<p>ちなみにリポジトリとは、ファイルやディレクトリの状態、変更履歴を保存するものです。</p>
<p>実行して Initialized empty Git repository in ~ と出ればOK</p>
<hr>
<li>　git add .</li>
<p>これはステージングエリアに、すべてのファイルを追加するコマンドです。</p>
<p>ステージングエリアとはコミットする前の場所です。</p>
<p>ちなみに、git add (ファイル名)でファイルを個別に追加できます。</p>
<hr>
<li>　git commit -m"（変更内容などのコメントを書く）"</li>
<p>これはローカルリポジトリにコミットするコマンドです。</p>
<p>コミットはファイルやディレクトリの変更履歴をリポジトリに保存するものです。</p>
<hr>
<p>※commitを確認する方法</p>
<p>git status</p>
<p>これでnothing to commit, working tree cleanと出ればコミットされています。</p>
<hr>
<li>　git remote add origin (URL)</li>
<p>これはリモートリポジトリの情報を指定するコマンドです。</p>
<p>これでプッシュしたいgithubのリポジトリのURLを指定したら、そこにプッシュされます。</p>
<p>githubで二つの通信のURLを選択できますが、ssh通信を使うと良いと思います。　なぜならssh通信ならhttps通信とは違いプッシュした際にパスワードを要求されないからです。</p>
<hr>
<li>　git push origin （ブランチ名）</li>
<p>これは指定したブランチのリポジトリを、ローカルからリモートに反映させます。</p>
<hr>
</ol>
<p> これでgithubに反映されていれば終了です。</p>
pandas_proflingを使うとTypeError: concat() got an unexpected keyword argument 'join_axes'が出た話(Google Colab)


(Qiita初投稿なのでご容赦ください)
今回とあるコンペに参加した。
#### Google Colabで pandas_profling.ProfileReport を使って、データを眺めようと思った矢先に以下のようなエラーが発生した。
```
from pandas_profiling  import ProfileReport 
train = pd.DataFrame(train)
profile = ProfileReport(train)
===================================================
TypeError: concat() got an unexpected keyword argument 'join_axes'
```
エラーを調べていくとどうやらversionに問題があるよう。
まずpandasのversionを下げてみたが、うまくいかなかった。

次にpandas_profilingのversionをupgradeすると解決。以下コード。
```
import pip
!pip install -U pandas_profiling
```

すでにpandas_profilingをインストールしてる人は、```
!pip uninstall pandas_profiling```
を挟むとよい。


[pandas-profiling not compatible with pandas v1.0 #376]:
https://github.com/pandas-profiling/pandas-profiling/issues/376　
参考サイト
[pandas-profiling not compatible with pandas v1.0 #376]
Rubyの変数とMethod

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 


# 変数

Pythonと似てて、Rubyは型宣言をする必要がない
受けとった引数ARGV[0]を適当な変数に代入して出力せよ

```el
name = ARGV[0]
puts name
```

実行結果

```el
$ ruby name.rb Rudy
Rudy
```

変数を使って足し算してみる

```el
num = ARGV[0].to_i
sum = num + num
puts sum
```

実行結果

```el
$ ruby name.rb 1
2
```


# Method

関数などのまとまりはmethodを定義することになる
これもPythonの関数定義と少し似ている

```el
def メソッド名 (引数1, 引数2)
  処理1
  処理2
    ・
    ・
end
```

例えば

```el
def name(str1,str2)
    puts "#{str1} #{str2}"
end

word1 = "hello"
word2 = "world"
name(word1,word2)
```

実行結果

```el
$ ruby def.rb
hello world
```

ARGV[0]を代入させ、キーボードから文字を受け取りたかったら

```el
def name(str1,str2)
    puts "#{str1} #{str2}."
end

word1 = ARGV[0]
word2 = ARGV[1]
name(word1,word2)
```

実行結果

```el
$ ruby def.rb hello world
hello world.
```


# 参考記事

[チャート式ruby-II(variable and method)](https://qiita.com/daddygongon/items/c51f3e0695174bb3c508)



------
 - **source** ~/grad_members_20f/members/wjswnsrud12/memo6.org
脱jQuery! Vanilla.jsへの書き換え方


#Vanilla.jsとは
素のJavaScriptでもできることをライブラリありきで考える風潮を皮肉ったものらしい。つまり普通のJavaScriptのこと。
##目次
- DOMの取得
    - $('セレクタ')
    - 複数の要素に対して処理をする
- フェードイン, フェードアウト
    - transition
    - keyframe
    - Web Animate API

- スクロール
    - `scroll()`
    - スムーズスクロール

##DOMの取得
###$('セレクタ')
```js
//jQuery
const h1 = $('h1');
const para = $('#para');

//Vanilla.js
const h1 = document.querySelector('h1');
const para = document.getElementById('para');
```
jQueryの場合、$('')の中にcssのセレクタを書くだけでいい。
Vanilla.jsの場合はちょっと長いです。他にもいくつかメソッドがあるのでググってみて欲しい。

###複数の要素に対して処理をする
```js

//jQuery
$('li').css('color', 'red');

//Vanilla.js
document.querySelectorAll('li').forEach(elm => {
  elm.style.color = 'red';
})

```
jQueryでは特に意識せずとも全ての要素に対してスタイルをあてることができますが、JavaScriptではquerySelectorAll()が返す値はNodeListというオブジェクトなので、forEach()で全ての要素に対して処理をする必要がある。

##fadeIn,fadeOut,fadeToggle
アニメーションを作成する方法はtransition, keyframe, Web Animate APIなどたくさんの方法がある。
fade○○を実装するには`opacity`の値を変更しつつ、`display: block`と`display: none`を切り替えればいいので、今回は1番簡単なtransitionを使ってみる。(個人的にはJavaScript側でロジックを持てるWeb Animate APIを推したいのですが...)

###tansition
```css

.elm{
  opacity: 0;
  transition: 1s;
}

.fadeout{
  opacity: 0;
}

.fadein{
  opacity: 1;
}

```

```js


const elm = document.querySelector('.elm');
  //fadeout
elm.classList.add('fadeout');
  //fadein
elm.classList.add('fadein');

```

##スクロール処理
今回は2種類の方法を紹介する。
最初は`scroll()`から。

###scroll()
```js

//100pxスクロールする。
scroll(0, 100)
```


`scroll()`__は絶対位置__にスクロールする。
`scrollBy()`を使うと__相対位置__にスクロールするので試してみて下さい。

###
```js

//targetに移動先、durationにスクロールにかける時間を指定することで
//スムーズなスクロールを実現できます。
function smoothScroll(target, duration) {
   // 移動先のDOM取得
   let targetElm =  target === '#' ? document.body : document.querySelector(target);
   // 移動先の位置
   let targetPosition = targetElm.getBoundingClientRect().top;
   // 今のスクロール値
   let startPosition = window.pageYOffset;
   let startTime = null;

   function animation(currentTime) {
      if(startTime === null) {
         startTime = currentTime;
      }
      // 経過時間
      let timeElapsed = currentTime - startTime;
      let run = ease(timeElapsed, startPosition, targetPosition, duration);
      scroll(0, run);
      if(timeElapsed < duration) requestAnimationFrame(animation);
   }

   function ease(t, b, c, d) {
      t /= d / 2;
      if (t < 1) return c / 2 * t * t + b;
      t--;
      return -c / 2 * (t * (t - 2) - 1) + b;
   };
   requestAnimationFrame(animation);
}
```
##最後に
あえてVanilla.jsで実装することでググりまくる癖をつけたり、知らなかったメソッドを知れたりするので初心者には特にやってもらいたいなと思います。jQueryってすごいんやな...って思えるようになります。

役には立たないかも知れませんが(笑)
Web Animate APIについては[こちら](https://qiita.com/abouch/items/a4e76d54f80420db7583)などを読めばいいと思います。
nodebrewのパス設定に関する備忘録

nodebrewをインストールしようとした際にパス設定でつまづいたのでその時の備忘録です。

#1.やったこと

前提環境:
MacOS Catalina 10.15.7
homebrew導入済み

1.nodebrewをインストール

```
brew install nodebrew
```
2.環境変数を追加
bash_profileファイルに以下の通り環境変数を追加してパスを通した

```
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

3.bash_profileを読み直して設定反映

```
source ~/.bash_profile
```

4.nodebrewで使用するディレクトリセットアップ

```
nodebrew setup
```

5.最新版nodeのインストール

```
nodebrew install latest
```

#2.問題
nodebrew, nodeはインストールできているのにnodeコマンドが使えない。。。

#3.原因
MacOS Catalinaからは、デフォルトのシェルスクリプトがbashからzshになったため、bash_profileではなくzshの設定ファイルに環境変数を追加する必要があった

※以下コマンドで現在使用しているシェルスクリプトの種類を確認することができる

```
echo $SHELL
```

#4.解決法
1.bash_profileではなく`zshrc`ファイルに設定を追加

```
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

2.zshを読み直して設定反映

```
source ~/.zshrc
```

#まとめ
シェルスクリプトの種類などあまり意識せず使用していましたが、注意しないといけないなと思いました。
【UiPath】Advent of UiPath 2020 #7（データテーブルの操作）

この記事は、UiPath Forum で行われている [**Advent of UiPath 2020**](https://forum.uipath.com/t/advent-of-uipath-2020/273299) の [Advent Challenge #7](https://forum.uipath.com/t/advent-challenge-7/276382) の紹介記事です。

:christmas_tree: 過去の投稿

- [Advent of UiPath 2020 #1（APIからデータを取得）](https://qiita.com/miya_g/items/4021ba90aab84984cb3c)
- [Advent of UiPath 2020 #2（正規表現で文字列を抽出）](https://qiita.com/miya_g/items/087a9d5d29145ae3e33e)
- [Advent of UiPath 2020 #3（ファイルをダウンロードしてメール送信）](https://qiita.com/miya_g/items/b774ef61150330ba0ee0)
- [Advent of UiPath 2020 #4（画像をbase64デコードしてOCRで画像認識）](https://qiita.com/miya_g/items/489e81d876ba504986f2)
- [Advent of UiPath 2020 #5（2つのエクセルを比較、重複行マージ）](https://qiita.com/miya_g/items/2a67e274a5edae65c25e)
- [Advent of UiPath 2020 #6（多重ループ）](https://qiita.com/miya_g/items/77b229f8665f57e6f20e)

# “Advent of UiPath 2020” とは何か？

- 英語版のフォーラムで投稿されています。
- RPA challenge です（＝お題を出て、みんなでRPA化してみる）
- 誰でも回答できます（フォーラムのアカウントがあれば）
- 3日おきに出題され、計8回（xmasイブまで）あります
- 回答して上位に選ばれれば、フォーラム上でスターがもらえます。
- フォーラムのスタッフが開催しているっぽいです。

# チャレンジ7：データテーブルの操作

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/27833ee8-36d2-1d38-c2dc-db516b9e9657.png)

santa）こんにちはルドルフ、お元気ですか？
deer）元気です、お元気ですか？
santa）レポートの作成など、実行タスクが沢山あるので、自動化して手伝ってください。
deer）わかりました。何をしますか？
santa）レポートを集約しフィルタリング＆ソートしたデータテーブルを作ってください。

### 初心者向けチャレンジ

Data.csv.txtを読み取り、ResultBeginner.csvに出力してください。
　RegionCode列でマージ＆Task列をカンマで結合してください。

### 上級者向けチャレンジ

Data.csv.txtを読み取り、ResultAdvanced.csvに出力してください。
　RegionCode列でマージ＆Task列をカンマで結合してください。
　タスクステータスが「DONE」の行は除外します
　行を以下のように並べ替えます。
　　第１ソート：Statusが：NEW> WIP> PAUSED　の順
　　第２ソート：StartDate

# 感想

今回は「データテーブルの操作」でした。

初心者向けチャレンジは
　- 1）結果用データテーブルを構築しておく
　- 2）CSVを読み込み
　- 3）CSVから重複除去したRegionCode配列を取得
　- 4）RegionCode配列でCSVの行ループ
　- 5）Task列を集計し結果用データテーブルに格納
　- 6）CSVに出力

上級者向けチャレンジは
　- 1）結果用データテーブルを構築しておく
　- 2）CSVを読み込み
　- 3）CSVからタスクステータスが「DONE」の行は除外
　- 4）Statusが：NEW> WIP> PAUSED　の順でソート
　- 5）StartDateでソート
　- 6）CSVから重複除去したRegionCode配列を取得
　- 7）RegionCode配列でCSVの行ループ
　- 8）Task列を集計し結果用データテーブルに格納
　- 9）CSVに出力

になると思います。

結構これは難しくて、しっかりロジックを考えないといけないのですが、特に
　3）CSVから重複除去したRegionCode配列を取得
してからTaskをカンマ結合する点と
　4）Statusが：NEW> WIP> PAUSED　の順でソート
で「Statusの値でソートするのではなく、"NEW> WIP> PAUSED" という並び順でソート」＝ソート用のキーを別途作る
という点が難しいかなと思います。


データテーブルの操作はUiPathでは避けられないですし、操作の仕方、組み合わせ、アレンジ方法をどれだけ知っているかは、すごく重要だと思います。

知っているかどうか？が大事なので、どこかで操作方法を整理したいと思っています
交流電力を計測する(2)：電流センサの使い方

[前回](https://qiita.com/ikenohotori/items/af111741e3fcd22c84bb)の続き。
交流電力を計測するデバイスを製作する。
使用するCT型電流センサの使い方について。

#CT電流センサによる交流回路の測り方
CT型電流センサーのコアで測定対象の導体を挟むと、対象の電流Iに比例して、二次電流I2が流れる。
二次電流のラインに抵抗Rを挟めば、Rに二次電流I2が流れることになる。
抵抗Rの電圧を測ることで、電圧と抵抗値から、オームの法則によってRに流れる二次電流I2を求めることができる。
最終的にCT型電流センサの巻数比を計算することで、測定導体の電流を測ることができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/28ec8316-6690-a263-dedc-baea9cb52ab6.png)
参考：https://www.jemima.or.jp/tech/3-01-01.html



使う上で必要となる準備が2つある。

1つ目は、計測対象が交流のため、
半分の時間は電圧がマイナスとなるが、ADコンバータはマイナスは測れない。
そこで、同じ抵抗値で分圧し、1/2Vを中心に電圧が変化するようにする。

<回路>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/78768605-994c-44ca-2228-a9b0611d1ea7.png)

R1の電圧
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/df6675ce-27ec-d83f-7c7f-27475f987300.png)




2つ目は、日本の家庭の多くは単相３線式で似系統で電力供給している。
単相３線式では、電圧線が２本あるため、家庭全体の電力を測る場合には２本とも計測しなければならない。
したがってセンサは２つ必要となる。
ただ今回は、1つの電化製品の消費電力を測るだけなので、センサーは1個でOK。


# ピッチ変換基板とのつなぎ方

●製品ページ
電流センサ(SFE-SEN-11005)：https://www.switch-science.com/catalog/840/
オーディオジャックとピッチ変換基板のセット(SFE-PRT-10588+PRT-08032)：https://www.switch-science.com/catalog/619/

本に書いていないことだが、電流センサとピッチ変換基板とのつなぎ方が分からないので記載する。
電流センサの出力はオーディオプラグであり、そのままマイコンと接続するのは難しい。
よって、オーディオジャックとピッチ変換基板のセットを使用する。

ピッチ変換基板のピンの仕様

ピン|意味
---|---
GND|グランド
TIP|信号線
RNG|1線通信(モノラル)の場合はN/A。2線通信(ステレオ)の場合逆相。
TSH|TIPシャント。TIPと導通している。
RSH|RINGシャント。RINGピンと導通している。

データシートを確認すると、電流センサがGNDともう1本しかないので、TIPとGNDしか使わないと判断できる。
次回はADコンバータを使用して、電圧を計測してみる。
【FileMaker】湯婆婆の持っているリストから名前を検索して新しい名前を決めてもらう

さて、湯婆婆ネタとして、
[【FileMaker】QRコードを読み込んで湯婆婆に名前を決めてもらう](https://qiita.com/tyuma/items/a8a887e019b1d5e58ae7)
というのを公開しました。
続きものなので、まだ読んでいない方は、ぜひ上記のリンクからファースト湯婆婆をご覧ください。

今回は前回の湯婆婆を改良して、湯婆婆が密かに持っているリストから名前を検索して、リストに名前があったら新しい名前を決めてもらう、という話でやってみました。
今時は個人情報が流出しては困りますので、QRコードにも番号のみを持たせ、名前は外部に漏れないようにする仕組みです。

# QRコード
[QRのススメ](https://qr.quel.jp/text.php)さんで、番号のQRコードを作りました。
![スクリーンショット 2020-12-24 23.37.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/018f135a-75b3-43a8-10bf-d91ab97580ea.png)

# リスト
リストは、湯婆婆が隠し持っているものなので本来は門外不出なのですが、開発上どうしても必要になりますので、公開していただきました。
![スクリーンショット 2020-12-24 23.10.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/6830802b-5417-f7af-4fa1-ff9cfa172359.png)

# 動き
では、早速やってみましょう。
今回は、番号を「34567」でQRコードを作成していますので、「福沢諭吉」さんの名前がヒットし、湯婆婆に新しい名前を決めてもらえたら、成功です。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">個人情報に敏感な<a href="https://twitter.com/hashtag/%E6%B9%AF%E5%A9%86%E5%A9%86?src=hash&amp;ref_src=twsrc%5Etfw">#湯婆婆</a>　<br>です。<a href="https://twitter.com/hashtag/FileMaker?src=hash&amp;ref_src=twsrc%5Etfw">#FileMaker</a> <a href="https://twitter.com/hashtag/filemakergo?src=hash&amp;ref_src=twsrc%5Etfw">#filemakergo</a> <a href="https://t.co/2UN3nwVM3H">pic.twitter.com/2UN3nwVM3H</a></p>&mdash; Guppy Web Service (@GuppyWebService) <a href="https://twitter.com/GuppyWebService/status/1342121613416808448?ref_src=twsrc%5Etfw">December 24, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
ちゃんと新しい名前をもらえましたね！

# 作り
今回のリストは単純に番号と名前だけ、湯婆婆に持たせました。
![スクリーンショット 2020-12-24 23.10.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/df936549-a795-a027-424b-a0b1d3e06cce.png)

レイアウトも、検索湯婆婆のレイアウトを新規作成しています。
![スクリーンショット 2020-12-24 23.22.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/6f19e556-55ce-6ca0-ffe4-1dc707cc93d3.png)
レイアウトは前回とほぼ同じなので、そのままコピってます。

QRコードを読むボタンも、検索用に分けました。
![スクリーンショット 2020-12-24 23.29.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/3549ca42-23f2-1705-7dff-3e9d6abff553.png)

スクリプトでは、検索を追加しています。
![スクリーンショット 2020-12-24 23.48.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/b0fc30c0-6229-872d-2ce4-fb19529324c3.png)


最初に表示される湯屋から湯婆婆に会うための入り口も、検索用のレイアウトに移動するように修正です。
![スクリーンショット 2020-12-24 23.25.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/b45ddb7c-26c6-02dc-2f38-2cb4bd3c2c24.png)

# ファイルオプション設定
ファイルオプションでは、最初に開くレイアウトを、今回の検索用湯婆婆のレイアウトに変更しました。
![スクリーンショット 2020-12-24 23.23.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/8ab51bfc-6cb1-7c38-a8fc-c9d133c037ca.png)

こんな感じで、個人情報にうるさい湯婆婆に対応したバージョンでお送りしました。
Laravelでbootstrap4のpaginateがやりたい

## Larave5の自前paginateを作成
$array＝paginateしたい配列

$searches＝保持したい検索パラメータ

```php:$searches
//controller側で下記を生成する
[
  "name" => "あいうえお",
  "start_date" => "",
  "end_date" => "",
]
```

## paginate.blade.php
```html:paginate.blade.php
<div class="row">
  <div class="col-lg-12">
    <nav class="float-right">
      <ul class="pagination">
        <li class="page-item">
          <a class="page-link" href="{!! $array->previousPageUrl() !!}"
            aria-label="Previous">
            <span aria-hidden="true">&laquo;</span>
            <span class="sr-only">Previous</span>
          </a>
        </li>
        @if ($array->currentPage() >= 3)
        <li class="page-item">
          <a class="page-link" href="{!! $array->appends($searches)->url(1) !!}">1...</a>
        </li>
        @endif
        @if (($array->currentPage()-1) !== 0)
        <li class="page-item">
          <a class="page-link" href="{!! $array->appends($searches)->url($array->currentPage()-1) !!}">{!! $array->currentPage()-1
            !!}</a>
        </li>
        @endif
        <li class="page-item active">
          <span class="page-link">
            {!! $array->currentPage() !!}
          </span>
        </li>
        @if ($array->currentPage() !== $array->lastPage())
        <li class="page-item">
          <a class="page-link" href="{!! $array->appends($searches)->url($array->currentPage()+1) !!}">{!! $array->currentPage()+1
            !!}</a>
        </li>
        @endif
        @if (!($array->currentPage()+1 >= $array->lastPage()))
        <li class="page-item">
          <a class="page-link" href="{!! $array->appends($searches)->url($array->lastPage()) !!}">...{!! $array->lastPage()
            !!}</a>
        </li>
        @endif
        <li class="page-item">
          <a class="page-link" href="{!! $array->appends($searches)->nextPageUrl() !!}" aria-label="Next">
            <span aria-hidden="true">&raquo;</span>
            <span class="sr-only">Next</span>
          </a>
        </li>
      </ul>
    </nav>
  </div>
</div>

```
ここ数年Macを利用してきて久しぶりにWindowsに移行した。


# 最初に
この数年間、業務およびプライベートでMacbookProを利用してきました。
Macを選択していた最大の理由は開発環境が容易に準備できるという点です。
ただ最近のWindows界隈ではLinux環境が充実してきたということでMacである必要性が乏しく感じたのでプライベートのPCをWindowsに移行することに決めました。

MacからWindowsに移行するにあたりWindowsでした環境構築を紹介します。

因みにPCは自作PCです、10年ぶりくらいに自作しました。

# とりあえず
開発環境とは直接関係は無いかもしれませんがPCライフに欠かせないツールとして以下二点、Webエンジニアとして欠かせないブラウザであるChromeとIMEはGoogle日本語入力を利用しています。

- Google Chrome
- Google 日本語入力

# 実行環境
かつてWindowsを利用していた際はC#などでWindows向けのアプリケーションを開発していたためVisualStudioなどを用いていましたが現在はRailsなどでWebアプリケーションの開発をしているのでLinuxの開発が欲しくなります。
VMWareやVisualBoxで仮想環境を用意してもいいのですがWSL2を利用するのがいいかと思います。
Microsoft StoreでWSL2と検索するといくつかヒットしますが`Ubuntu`がベターでしょう。
WSL2をインストールしてしまえば実行環境/開発環境はLinux上での勝負なのであまりOS間の差異を意識しなくてもいいでしょう。

# ターミナル
Mac時代は[iTerm2](https://iterm2.com/)を利用していましたがiTerm2にはWindows版がないので別のものを探します。
かつては[TeraTerm](https://ja.osdn.net/projects/ttssh2/)を利用していましたがMicrosoft謹製の[Windows Terminal](https://docs.microsoft.com/ja-jp/windows/terminal/)を利用します。
デフォルトで起動するターミナルをPowershellからUbuntuに切り替えてます、Ubuntu上ではtmuxを起動させエディタはVim(nvim)を用いています、INSERTモードになるとバー状になる機能が地味ですが気にっています。

# テキストエディタ
プログラムを書くときはvimを利用しています、vimはvimでも[neovim](https://neovim.io/)というvimから派生したバージョンのvimを利用しています。
またプラグインはあまりインストールしてなく[coc.nvim](https://github.com/neoclide/coc.nvim)ぐらいです、カラースキームはmolokaiを長らく利用してます。
テキストエディタ界隈は昨今vscodeが猛威を奮っています、私も何度かvscodeに移行しようとしました特に最近Typescriptを業務で書くことがありその昨日の恩恵を受けましたが結局vimに戻ってきてしまいました、とにかくキーボードから手を離さなくていいのが気に入っているところです。

# フォント
プログラムは文字で構成されるのでフォントの種類はこだわりたいところです、私のオススメは[JetBrainsMono](https://www.jetbrains.com/lp/mono/)ですシンプルな見た目で読みやすいと思います。

# キーボードとキーボードショートカット
MacのときはHHKBを愛用してきましたがWindowsに切り替えるにあたってRealforceを選択しました。
ずーっとUS配列を使ってきたのでRealforceもUS配列のものを購入しました。
ただUS配列のキーボードには`半角/全角`キーが無いのでMacのときと同様にctrl + spaceで切り替えるようにショートカットを設定しました、またCapslockとctrlのキーバインを入れ替えることができるのでこれも適用しています。

# DB(MySQL)のクライアントツール
Mac時代から[DataGrip](https://www.jetbrains.com/ja-jp/datagrip/)を利用しています、シェアウェアなのでハードルは高いかもしれませんがvimキーバインドが利用できるプラグインとSQLの結果をMarkdownでコピーしれくれる機能が地味ですが重宝しています。
MySQL以外でも主だったDBMSには対応しています。

# まとめ
WSL2の登場でwindowsでの開発に不便はしなくなった印象です、強いて言えばフォントの綺麗さはMacに分が大いにあります。
Dockerも動くので各種言語別の開発環境の構築に苦労はしません、またAWSなどのクラウドサービスが充実する昨今MacとWindowsの垣根はほぼ無いといって過言ではないでしょう。
私は業務ではMacを利用していてプライペートはWindowsにしました、WindowsとMacのどちらが開発用のマシンとして勝っているか議論がよく見受けられますが個人的にはどっちでもいいのでは？が私の感想です先述のとおり両者の隔たりはほぼなく開発環境の用意に苦労しないためです。
新しくPCを調達しようとしている方は先入観や偏った情報に踊らされることなくじっくりと吟味のうえ選択してください。
DDD-Community-jp コミュニティの Discord サーバーの各種設定について

私は Discord に少し詳しいということで、[DDD-Community-jp コミュニティ](https://ddd-community-jp.connpass.com/)の Discord サーバーで管理者をやらせていただいてます。
本投稿は、備忘録も兼ねて Discord サーバーを運用する上で行った様々な設定について書き記していこうと思います。

# 各種設定

Discord サーバーに設定した内容は下記の通りです。

- 標準の通知設定
- 絵文字
- ボット
- Webhook
- カテゴリーおよびチャンネルの権限設定
 
## 標準の通知設定

`@mentionsのみ` にしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89309/9c148e96-7ece-a8a9-a018-9fa3eb1f402b.png)
Discord サーバーの既定の通知設定は `すべてのメッセージ` に対して有効です。

既定値のままだと、誰かがメッセージを投稿すると逐一通知されるので煩わしいです。
通知設定は、各ユーザーがサーバー単位やチャンネル単位で細かく設定することができますが、皆がそれらの通知設定をするとも限りません。
そのため、多くの人が参加する Discord サーバーでは `@mentionsのみ` に設定することが強く推奨されています。

## 絵文字

絵文字はコミュニケーションを円滑に進めるため、盛り上げるために有効な手段です。
256kb 以下の画像ファイルを、最大 50 個まで登録できます。（ブーストなしの場合）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89309/bd2e3eeb-f82f-885e-03c3-9dc0e5bc8fe2.png)
絵文字を作る上で下記サイトはとても便利なのでオススメです。
https://emoji-gen.ninja/


## ボット

DDD-Community-jp コミュニティの Discord　サーバーでは、下記のボットを導入しています。

### [Simple Poll](DDD-Community-jp)

簡易アンケートを作れるボットです。
`/poll` コマンドの後に半角スペース区切りで、`"` で括った質問とそれに続けてアンケートの選択肢を記述します。

**コマンド例**
`/poll "質問です" "回答1" "回答2" "回答3"`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89309/d5cb4d21-d5b8-446f-eedd-196ce5106f31.png)

なお、ボットを Discord サーバーに招待する時にボットに対して権限を割り当てる画面が表示されますが、無意味に強い権限を求めてくるものもあるので要注意です。

Simple Poll については適切な権限を求めてくるので、そのまま認証しても問題ないと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89309/dcc78b78-4007-84c2-5dd4-b3237a3616c0.png)


## Webhook

Discord のテキストチャンネルに Webhook を設定することができます。
Webhook に対して POST することで、テキストチャンネルにメッセージを投稿することができます。

DDD-Community-jp コミュニティにおいて Webhook は、下記の２つの用途で設定しています。

1. Twitter ハッシュタグ（#dddcj、#ModelingKai）のツイート連携
2. [松岡さん(@little_hand_s)](https://twitter.com/little_hand_s) の質問箱（GitHub の Issue）の連携

### 1. Twitter 連携

[IFTTT](https://ifttt.com/) を利用して、対象のハッシュタグを含めたツイートを Discord の Webhook に対して POST しています。
下記画像は IFTTT の設定画面です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89309/b97096cf-ad30-637d-4c9d-3458031b9853.png)

詳しい設定手順は、以下のサイトを参照してください。

[Discordをゲーム公式Twitterと連携させよう【Discordコミュニティ運用術・機能編8】](https://games.app-liv.jp/archives/467478)
- 指定したハッシュタグを含むツイートを表示させる

なお、IFTTT は無料版だと**３つまで**しか Applet を設定できませんのでご留意ください。

### 2. GitHub 連携

DDD-Community-jp コミュニティの Discord サーバーには #質問箱 というテキストチャンネルがあります。
このチャンネルは、[松岡さん(@little_hand_s)](https://twitter.com/little_hand_s) が質問箱で回答した内容が [GitHub リポジトリ](https://github.com/little-hands/ddd-q-and-a) の Issue に登録される仕組みを利用して、GitHub の Webhook 機能から Discord の Webhook に対して POST しています。

詳しい設定手順は、以下のサイトを参照してください。

[DiscordのチャンネルにGitHubの通知を送るには？【Webhook】
](https://mekurun.com/tips/discord-github/)


## カテゴリーおよびチャンネルの権限設定

DDD-Community-jp コミュニティでは、参加メンバーが率先して様々なイベントを開催しています。
イベントの主催者がテキストチャンネルやボイスチャンネルを開設、更新できるようにチャンネルの管理権限を主催者に対して個別割当しています。（赤枠は主催者メンバー）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89309/e4d5d732-07f1-2815-8659-47b193d45436.png)

権限設定はチャンネル単位やカテゴリー単位で設定可能です。
NotionにQiitaのストックをストック、かつ、様々なWebページも一元管理

#はじめに
　先日紹介した、Notionというメモアプリをさらに活用する方法を見つけたので、紹介します。
　Webクリップについてです。

　先日の投稿↓
[Notionこそ、codeのストックにおいて最強！](https://qiita.com/TerToEer_sho/items/c553b1d26fef86c186ef)

##Chromeの拡張機能

以下の拡張機能を使います。

[Notion Web Clipper](https://chrome.google.com/webstore/detail/notion-web-clipper/knheggckgoiihginacbkhaalnibhilkk)

右上の拡張機能の欄にこれがあればOK！
![](https://i.gyazo.com/7fcaec3cdcd82ba442854e86ef706689.png)

##使い方
1. Notionの拡張機能のボタンを押す。
2. 任意の保存したいページを選択して、「Save page」を押す。

![](https://i.gyazo.com/c19f41df5d3a0312f18653158363c677.gif)

3. 保存されています。


![](https://i.gyazo.com/30343a823130573e3205c8ae29954aec.png)

![](https://i.gyazo.com/1f472573d8021d2885e77eba16af3a40.gif)


##メリット
- デバイスの同期をしていると、スマホやタブレットでも閲覧することが可能になります。
- Qiitaのストック同様、タグで管理できます。
- しかも、そのタグは自分で任意に作成することができます。
![](https://i.gyazo.com/e7ad05707c9345f2712f1bb45c13700a.png)
- コードがマークダウンのコードブロックに対応している。（ただし、言語は再度指定し直す必要があります。再指定すれば、シンタックスハイライトにも対応します。）
![](https://i.gyazo.com/75d26ae2843f2254b61111ee1235ee83.png)
- Qiitaの記事以外のプログラミングに関する情報も同じデータベースで保存することができます。
- 写真も保存・表示されます。

- 人の記事でも、編集が可能になります。
- 編集が可能ということは、自分で取捨選択できるということです。
- URLも同時に保存されます。
![](https://i.gyazo.com/07a63f5f9dfebdd3e8b872d996aaa37e.png)


##最後に
　保存が簡単な点、どんなページでも基本的に保存が可能な点が最強たる由縁です。自分で人の記事を編集・加筆できる点もGood!もちろん、それを投稿することはNGですが、自分が使う分にはよいでしょう。
 メリットは他にもたくさん考えられます。Notionというメモアプリ、控えめにいって『神』です。本当におすすめです。
obniz＋大気センサーで部屋の環境をチェックしよう。健康的なテレワークには換気は大切です！

#作ったもの
obniz＋大気センサー（MQ135)で自室の環境モニタリングできる仕組みを作りました。
計測した結果はThingSpeakでグラフで見ることができます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181708/2677b836-796a-af72-dd86-b351d0f9501b.jpeg" width="500">
#きっかけ
冬になると部屋の換気を忘れがちなので、数値で換気タイミングを知ることができないかな、と思って作ってみました。

#参考にしたサイト
obnizの公式サイトに上記センサーを使用した例があります。
[obniz Parts Library](https://obniz.io/ja/sdk/parts/MQ135/README.md)

サンプルでは
>onchangeanalog = function(voltage: number)
>電圧が変化した時に呼ばれる関数を指定できます。

```javascript:sample.js
var mq135 = obniz.wired("MQ135", {vcc:3, gnd:2, do:1, ao:0});
await mq135.heatWait();
mq135.onchangeanalog = function(voltage) {
  console.log(voltage);
}
```
はあるのですが、数秒毎にThingSpeakへの数値を送る方法が分からなかったので、中に変数を入れてみたら何とかうまくいきました。もしもっと良い方法があれば教えてください。

#コード
"count"はThingSpeakの確認用に入れていますので特に不要です。

```javascript:MQ135,js
<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <link
      rel="stylesheet"
      href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
    />
    <link rel="stylesheet" href="/css/starter-sample.css" />
    <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
    <script
      src="https://unpkg.com/obniz@3.11.0/obniz.js"
      crossorigin="anonymous"
    ></script>
  </head>
  <body>
    <div id="obniz-debug"></div>

            <script>
      var obniz = new Obniz("★ここにobnizIDを入れます★");

      obniz.onconnect = async function() {
        var mq135 = obniz.wired("MQ135", {vcc:3, gnd:2, do:1, ao:0});
        obniz.display.clear();
        obniz.display.print("Heating...");
        await mq135.heatWait();
        var val =0;

        await mq135.heatWait();
        obniz.display.clear();
        obniz.display.print("Started");

        mq135.onchangeanalog = function(voltage) {
          console.log(voltage);
          val = voltage;
        }

        var count = 1;
        const request = new XMLHttpRequest();
    
    while(true){
      　const request = new XMLHttpRequest();

        request.open("GET", `https://api.thingspeak.com/update?api_key=★ここにAPIKeyを入れます★&field1=${val}&field2=${count}`);
        request.send();
        obniz.display.clear();
        obniz.display.print(count);
        obniz.display.print(val);
        count++;
        await obniz.wait(60000); 
    }


   
      
      };
    </script>



  </body>
</html>

```

#おまけ
本当は上記のコードを10分毎に実行して定期的にモニタリングしたいと思って
[サーバーレス イベント](https://obniz.com/ja/doc/reference/cloud/serverless-event/)
で実行させるつもりでした。
しかし

①このセンサーは暖気に２分必要
>このセンサーは加熱を必要とします。十分に加熱されないと値は安定しません（少なくとも2分程度）

②30秒制限
>呼ばれない場合は30秒で自動的にHTMLは閉じられます。

で①＞②となってしまうせいかうまくいきませんでした。。。

これも良い方法があればコメント頂けると助かります。