OmniAICreator/Qiita-1.07M huggingface dataset:
laravelでテスト用DBを設定する手順

ほとんどをよしなに手軽にやってくれるLaravelですが、
DBを使うphpunit設定はちょっと分かりにくいです。

```
SQLSTATE[HY000] [1044] Access denied for user 'user'@'%' to database 'test_db'
```
↑phpunitのコマンドでこんな表示があった人は、幸せにできる記事です。

※DBはmysql

## 設定のポイント
・テスト用のDB(スキーマ)を作る必要がある
・*作成したスキーマに、テスト時に使う接続設定(ユーザー権限)を加える必要がある*
・phpunit側に接続情報を加える必要がある


## 1 テスト用のDBを作成する
ここではrootユーザーで接続している想定です。

```terminal
CREATE SCEMA test_db;
```

## 2 アクセス権限の設定
laravelの接続情報(.envに書く`DB_USERNAME`のとこ)がroot以外のユーザーの場合、
デフォルトではrootユーザーが作成したDBへのアクセス権限がない場合がある(rootユーザ以外で`SHOW DATABASES`してもDB一覧に表示されない)。

ので、rootユーザーでGRANT文を実行、アクセス権限を与えて、テストで使えるようにしてあげる

```mysql
GRANT ALL ON test_db.* TO user(ユーザー名);
```

もし権限を与えたいユーザー名がわからない時は、mysqlスキーマから確認

```
mysql> SHOW DATABASES; -- スキーマ一覧を表示

+--------------------+
| Database           |
+--------------------+
| information_schema |
| app_db             |
| mysql              |
| performance_schema |
| sys                |
| test_db            |
+--------------------+

mysql> use mysql;

mysql> select * FROM user;
-- ユーザーとHOST(どこからの接続を許容するか)、ユーザーが持つ権限も表示される
```
※ アプリ用DBユーザとテスト用DBユーザを分けるメリットはそれほどないと思うので、laravelの`.env`に書いてあるユーザーでいいと思います。

## 3 phpunit.xmlに接続情報を記入
あとは、`.env`に書いてある接続情報を、`phpunit.xml`に書いてあげればOK!

```.env
DB_DATABASE=db # アプリで使うDB
DB_USERNAME=user
DB_PASSWORD=pw
```
`.env`に↑みたいに書いてあったら、↓のように書く。

```
    <php>
        <server name="APP_ENV" value="testing"/>
        <server name="BCRYPT_ROUNDS" value="4"/>
        <server name="CACHE_DRIVER" value="array"/>
        <server name="MAIL_DRIVER" value="array"/>
        <server name="QUEUE_CONNECTION" value="sync"/>
        <server name="SESSION_DRIVER" value="array"/>
        <!-- テストで使うDBのスキーマ名 -->
        <server name="DB_DATABASE" value="test_db"/>
        <!-- 接続するuserの名前 -->
        <server name="DB_USERNAME" value="user"/>
        <!-- 接続するuserのパスワード -->
        <server name="DB_PASSWORD" value="pw"/>
    </php>
```

DBを使うテストファイルを実行してみましょう。

```
./vendor/bin/phpunit ./tests/Feature/DatabaseTest.php
```
記事冒頭のエラーで困っていた人は、解決できているハズ!

## その他phpunitの準備に役立ちそうな記事

[PHPUnitの使い方メモ](https://qiita.com/__init__/items/a4c314c330b87fa03ba1#%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BAtdd)

[MySQLをMacのターミナルで操作するときのメモ](https://qiita.com/nanatsu/items/33b57238b0e9ae0a1c78)

### おわりに
DBに接続する時の設定をする、という当然のことをしただけなんですが、人が用意してくれた自動化環境(AWSやらdocke)に慣れてしまうと、触れる機会が少なくなってしまうものです。

こういう基本的なとこに触れるのも、たまにはいいですよね。
Docker環境でRails停止時にExit code 1が発生する

# 問題

Docker上でRails (Puma) を実行中に `docker stop` でコンテナを停止させようとするとExit 1 (SIGHUP) が発生します。
ECSやKubernetesを利用している場合、コンテナが正しく終了せず、予期しない問題を引き起こす可能性があります。

```
% docker ps -a
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS                      PORTS               NAMES
xxx        rails                      "bundle exec rails s…"   44 seconds ago      Exited (1) 3 seconds ago                        api
xxx
```

# 原因

俗に言う「PID 1問題[^1]」が原因。PID 1はinitプロセスと呼ばれるもので、システム起動時にカーネルによって呼び出される特別なプロセスです。initプロセスはシグナルハンドリングや子プロセスの生成、ゾンビプロセスの削除などを行います。
今回はRails ([^2])を起動した際にPID 1が使われてしまい、シグナルを正しくハンドリングできないといった問題が発生していました。

```
# コンテナ上でtopコマンドを実行した結果
  PID USER      PR  NI    VIRT    RES  %CPU  %MEM     TIME+ S COMMAND
    1 root      20   0    2.2m   1.5m   0.0   0.1   0:00.02 S /bin/bash /bin/docker-entrypoint.sh bundle exec rails s -b 0.0.0.
```

プロセスを見ると、PID 1でRailsが起動していることが分かります。

# 対策

[tini](https://github.com/krallin/tini) や [dumb-init](https://github.com/Yelp/dumb-init) といったプログラムを使うことで、PID 1の子プロセスとしてアプリケーションを起動することが可能となります。
docker-compose 3.7以降が利用可能であれば、`docker-compose.yml` に `init` パラメータを付けることで問題を回避することができます ([^3])。

```
# Railsがinitプロセスの子プロセスとして起動する
PID USER      PR  NI    VIRT    RES  %CPU  %MEM     TIME+ S COMMAND
1 root      20   0    1.0m   0.0m   0.0   0.0   0:00.03 S /sbin/docker-init -- /bin/docker-entrypoint.sh bundle exec rails s -b 0.0.0.0
6 root      20   0    2.2m   1.5m   0.0   0.1   0:00.00 S  `- /bin/bash /bin/docker-entrypoint.sh bundle exec rails s -b 0.0.0.0
```

`docker-compose down` 実行後にプロセスを見ると、143 (SIGTERM) でコンテナが停止しています。

```
% docker-compose ps
          Name                         Command                State     Ports
-----------------------------------------------------------------------------
api                 /bin/docker-entrypoint.sh  ...   Exit 143

```

## ECSを利用している場合

タスク定義に `initProcessEnabled: true` ([^4]) を追加します。`initProcessEnabled` は`docker run` の `--init` に相当します。

## Kubernetesを利用している場合

tiniなどの軽量initを使う方法もありますが、Kubernetes 1.17からは Share Process Namespace ([^5]) を使うことで問題を回避できるようです。

[^1]: [Docker and the PID 1 zombie reaping problem](https://blog.phusion.nl/2015/01/20/docker-and-the-pid-1-zombie-reaping-problem/)
[^2]: [Puma returns exit code 1 in container when received SIGTERM](https://github.com/puma/puma/issues/1673)
[^3]: [Compose ファイル バージョン 3 リファレンス - init](https://matsuand.github.io/docs.docker.jp.onthefly/compose/compose-file/#init)
[^4]: [AWS::ECS::TaskDefinition LinuxParameters](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-linuxparameters.html)
[^5]: [Share Process Namespace between Containers in a Pod](https://kubernetes.io/docs/tasks/configure-pod-container/share-process-namespace/)
DevOps(デブオプス)とは？

#DevOpsとは？

- **Development(開発)**と**Operation(運用)**がともに協力することで、よりスピーディーに完成度の高いソフトウェアを作り上げる手法・考え方のこと。

- これまでは、サービスの開発側と運用側の要望には、トレードオフや壁が発生してしまいがちだった。
    - 開発側：「お客様のニーズに合った最新のアプリやサービスを素早く提供したい！」
    - 運用側：「お客様のサービスに不具合などの症状が起きないように安定した運用がしたい！」

- しかし、最近では新しいサービスを迅速に市場に提供する為の`開発と運用のコラボレーション(協働)`が求められている。

#DevOpsに注目が集まる背景

注目が集まる主な背景として、`「開発手法」`・`「クラウド」`・`「自動化」`の３つの要素が挙げられる。

- 開発手法：サービスの全体像を固めてから開発を進めるのではなく、`全体像を考えながら、決まったところから開発してリリースするといったスピード重視`になっている。（ウォーターフォール型ではなく、小刻みな改変を繰り返すアジャイル開発や、サービスを小さく素早く始めて顧客の反応を見ながら改良を続けるリーンスタートアップが流行している）

- クラウド：クラウドを導入することで、サーバー環境の調達の負担が軽減されr、運用担当者がサーバー設定などを代行できるようになってきている。

- 自動化：徹底的な自動化を進めることで、`少人数での大量のサーバー運用が可能となり、運用側から開発側にリソースをシフトしていく動きが進んでいる。`


※ この他にも、`サービスの提供先が国内だけでなく海外にまで広がってきている`という要因もある。
rails generate controllerした時に不要なファイルを出さない設定（RSpec編）

Ruby on Railsで新しくコントローラーを作る時に、不要なファイルを出さない様に設定をいれるか、オプションを指定する方法です。
#システム環境
環境に依存する話ではないと思いますが、私の環境は以下の通りです。

* Ruby 2.6.3
* Rails 6.0.3.3
* RSpec 3.9

#Before：設定がない時
デフォルトの状態で`rails g controller hoges`すると、以下の様なファイルが生成されます。昔はcontroller specも生成された気がしますが、controller specは公式が推奨していないので、今は出ないみたいです。

```
$ rails g controller Hoges new
      create  app/controllers/samples_controller.rb
       route  get 'samples/new'
      invoke  erb
      create    app/views/samples
      create    app/views/samples/new.html.erb
      invoke  rspec
      create    spec/requests/samples_request_spec.rb
      create    spec/views/samples
      create    spec/views/samples/new.html.erb_spec.rb
      invoke  helper
      create    app/helpers/samples_helper.rb
      invoke    rspec
      create      spec/helpers/samples_helper_spec.rb
      invoke  assets
      invoke    scss
      create      app/assets/stylesheets/samples.scss
```
でも、「controllerごとにcssを分けないよね」とか「Helperも使わないよね」ということもあるんじゃないでしょうか（←私）。

生成したファイルを手動で毎回消すのが面倒なので、設定を入れることにします。

※不要なファイルは、後から他の人が見た時に分かりづらくなるので、消しておいた方が良いです。
#設定の方法
RSpecをテストフレームワークに設定している方はすでにconfig/application.rb`config.generators do`の記載があると思いますので、その前後に以下の様に記述を足します。

```config/application.rb
config.generators do |g|
      g.skip_routes true #routesの自動記述をoff
      g.helper false #app/helperの自動生成をoff
      g.assets false #同名のcssやjsの生成をoff
      g.test_framework :rspec, #標準のテストをRSpecに変更
      controller_specs: false, #公式で非推奨のためoff
            view_specs: false, #Request/Systemで代替するのでoff
         routing_specs: false #使用頻度低いのでoff
end
```

skip_routesは結局`resouces :hoge, only: :new`の様にresourcesで書き換えてしまうことが多いので、デフォルトではオフにしています。
app/hoge_helper.rbも意外と使わないのでオフ。assetsも使用頻度が少ないのでオフ。
#After：設定がある時
設定を入れてrails g controller hoges newを実行すると、結果は以下の通りです。

```
$rails g controller Samples new
      create  app/controllers/samples_controller.rb
      invoke  erb
      create    app/views/samples
      create    app/views/samples/new.html.erb
      invoke  rspec
      create    spec/requests/samples_request_spec.rb
```

これである程度スッキリしたのではないでしょうか。
#ご参考：コマンドのオプションで指定する方法
config/application.rbに記載して設定するのではなく、都度オプションで指定する方法もあります。

```
$rails g controller samples new --no-assets
```
| Option | 省略されるもの |
|:-:|:-:|
| --no-assets  | app/assets/以下の.js, .cssファイル|
| --no-helper  | app/helpers以下のHelperファイル  |
| --no-test-framework  | Specファイル。上の場合だとrequest specが省略されます  |
| --skip-routes  |   |
| --skip-template-engine  |   |
Automation Anywhere A360でQRコードを生成してみる


#はじめに
在庫、機材、人、モノ、その他の管理にQRコードって便利ですよね。
今回は、何かのイベントの際に受付にQRコードを使用するケースや、
従業員の出退勤にQRコードを使う場合などを想定して、ExcelシートからQRコードを生成するBotを作ってみます。

#使うもの
こちらのページで紹介されているような、ダミーデータ生成ツールで社員/メンバー一覧を作ります。
[ダミー住所録の作り方 - Qiita](https://qiita.com/izuki_y/items/75a5cf880876b0646408)

Bot Storeから以下のパッケージを入手します。
[A2019 - QR Code Generator and Extractor Package - Bot Store](https://botstore.automationanywhere.com/bot/a2019-qr-code-generator-and-extractor-package/)

#手順
##1
ダミー個人情報生成ツールを使って、以下のような名簿を作り、Excelファイルとして保存します。（表示されている氏名やその他情報は生成された架空のものです）
今回はある会社の社員をイメージしたデータを100名分作ってみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/af86e307-dd42-ddc1-df7f-552023852a2b.png)

##2
以下のようなBotを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/5b3272b4-1cd3-0ced-814e-824fe78fdbcb.png)

QR Code Generatorアクションの設定はこんな感じです。
Excelシートの0番目の列に社員番号が入っているので、それをQRコードに変換し、ファイル名にも社員番号をつけています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/211f4fd1-6f52-154c-ba4c-8621b2924da9.png)

##3
Botを実行すると指定したフォルダーにQRコードが画像ファイルとして生成されます。
今回、ファイル名は社員番号にしてあります。
ちゃんと出来ているか気になる場合は、スマホのQRコードリーダーなどで試してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/4a30e45d-45e2-d459-9a42-8e57b5f8c0fc.png)

#まとめ
というわけで、Automation Anywhere Enterprise Automation 360と、QR Code Generator/Extractorパッケージを使うと、
非常にシンプルに大量のQRコードを生成することが出来ました。
2020年にSelenium (+Python)でスクレイピングしてハマったところ

## iframe
症状：「実行画面では表示されているボタンなのにElementが見つからないと言われる！」

→原因と解決策：iframeはいちいち切り替えないとelementが見つけられない

```python
driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0])
driver.find_element_by_css_selector("#hogefuga").click()
driver.switch_to.default_content()
```

## Popupによる干渉
症状：ボタンのelementを取得できているのに押せない
エラー文面：

```text
Element <a class="hoge" href="/fuga">...</a> is not clickable at point (748, 591). Other element would receive the click: <div class="piyo">...</div>
```

→原因と解決策：一旦Bodyなどをクリックしておく

```python
driver.find_element_by_tag_name("body").click()
```
ブランチ名を省略したgit pull が通らない時の対処

ブランチ名を省略した git pull コマンドで以下のエラーに遭遇するときがある。

```
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to rebase against.
See git-pull(1) for details.

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream-to=origin/<branch> master
```

即刻pullしたいのであれば、git pull origin masterと打ち直すのが解決策としては早い。


が、そもそもの原因としてカレントブランチのupstreamが解決されていないことを解決してやれば、
ブランチ名を省略してシンプルに git pull とコマンドを打つだけで済むようになる。


なんでも省略できるものはした方が作業効率がよいので対処する。
ログ後半の推奨コマンドに従えばよく、例えばmasterブランチにいるのならば以下コマンドを実行する。

```
$ git branch --set-upstream-to=origin/master master
```
このコマンドを実行すると、.git/config内に以下が追記される。

```~/.git/config
[branch "master"]
	remote = origin
	merge = refs/heads/master
```
マージ参照先が追記されていることが確認できる。
AZ-104取得のための情報と対策まとめ

■Azure試験のバージョンアップについて
AZ-103 → AZ-104  (3月)
AZ-203 →  AZ-204  (2月末)
AZ-300 →  AZ-303 (3月)
AZ-301 → AZ-304 (3月)
AI-100 →  AI-102  (3月)

■試験概要（AZ-104）
https://docs.microsoft.com/ja-jp/learn/certifications/exams/az-104

■AZ-103とAZ-104の差異
https://qiita.com/tagfa/items/36db90442e1c3b224aa6
https://tagfa.wpx.jp/archives/129

■AZ-104の試験範囲
https://jmtechsupport.jp/azure/1514/#AZ103_Microsoft_Azure_Administrator

■Azureの基礎（公式）
https://docs.microsoft.com/ja-jp/learn/paths/azure-fundamentals/

■AZ-104取得のために必修となるラーニングパス（公式）
①https://docs.microsoft.com/ja-jp/learn/paths/az-104-administrator-prerequisites/
（学習時間：6時間30分）
②https://docs.microsoft.com/ja-jp/learn/paths/az-104-manage-identities-governance/
（学習時間：7時間13分）
③https://docs.microsoft.com/learn/paths/az-104-manage-storage/
（学習時間：5時間12分）
④https://docs.microsoft.com/learn/paths/az-104-manage-compute-resources/
（学習時間：11時間15分）
⑤https://docs.microsoft.com/learn/paths/az-104-manage-virtual-networks/
（学習時間：11時間2分）
⑥https://docs.microsoft.com/learn/paths/az-104-monitor-backup-resources/
（学習時間：6時間27分）

■Udemy
：作りながら覚えるMicrosoftAzure入門講座（IaaS編）（※AZ-104対策ではない）
https://udemy.com/course/microsoft-azure-iaas-part/learn/lecture/14610680?start=0#content
（学習時間：5時間30分）

：AZ-103 / AZ-104 Azure Administrator Exam Certification 2020（※英語のみ）
https://udemy.com/course/70533-azure/learn/lecture/15203220#content
（学習時間：10時間30分）

■参考（AZ-104対策日本語参考書→7000円）
https://crammedia.mogiexam.com/microsoft-azure-administrator-az-104%E6%97%A5%E6%9C%AC%E8%AA%9E%E7%89%88-kakomon-11944.html?adhit=hat
矢印コネクタと仲良くなるための PowerPoint マクロ

# 動機
ワークフローを描いたり，簡単な説明図を作ったり，可換図式を描いたり，といった用途に使える便利ツールはいろいろあるのですが，仕事で使おうとすると，ほかの人にツール自体の布教をするのが面倒であったり，会社によっては導入のための申請の手間があったり，ということがあります．結局のところ，だれでも閲覧出来て，だれでも簡単に編集できるお絵描きソフトといえば PowerPoint です．コネクタを使えば図形を矢印で結ぶことは簡単なのですが，編集に手間がかかるので敬遠していました．今回はこの問題を，できるだけシンプルなマクロで改善することを試みます．

# 結論
複数の図形を選択して，以下のマクロを実行すると，「最初に選択した図形」から，「２番目以降に選択した図形」それぞれへのコネクタが作成されます．よくあるDNNの絵をイメージして作成しました．「どのカド（コネクションサイト）からコネクタを引っ張るか」については座標計算が必要かと思ってたのですが，RerouteConnections なる関数がすべて解決してくれました．

```VB
Sub arrowOneToN()
  ' 最初に選択した図形から，2番目以降に選択した図形のそれぞれに対して矢印コネクタを作成する
  Set thisPage = ActivePresentation.Slides(ActiveWindow.Selection.SlideRange.SlideIndex)
  Dim n As Integer
  If n < 2 Then
    MsgBox("Select 2 or more objects")
    Exit Sub
  End If
  Set src = ActiveWindow.Selection.ShapeRange(1)
  For i = 2 To n
    Set dst = ActiveWindow.Selection.Shaperange(i)
    With thisPage.Shapes.AddConnector(msoConnectorCurve, 0,0,0,0)
      With .ConnectorFormat
        .BeginConnect connectshapve:=src, connectionsite:=1
        .EndConnect connectshapve:=dst, connectionsite:=1
      End With
      With .Line
        .BeginArrowheadStyle = msoArrowheadNone
        .EndArrowheadStyle = msoArrowheadTriangle
        .EndArrowheadLength = 3
        .EndArrowheadWidth = 2
      End With
      .RerouteConnections  '最短経路になるようにコネクションサイトを選択しなおしてくれる
  Next
End Sub
```

RerouteConnections については，これ単独でマクロを作っても十分に便利さを感じられます．コネクタ作成後に図形の位置を調整したときなど，コネクタの接続位置が不自然になってしまったときは，調整したいコネクタを選択（複数可）してから以下のマクロを実行するとよいです．（図形が一緒に選択されていても動くようなので，図形選択は適当で大丈夫です）

```VB
Sub arrowReRoute()
  ' 選択された図形にコネクタが含まれている場合，最短経路になるように接続しなおす
  For Each s In ActiveWindow.selection.ShapeRange
    s.RerouteConnections
  Next
End Sub
```
また，一つ目のマクロの変形として，以下のようにすると，図形を選択した順に矢印でつなぐことができます．こちらも，先に図形を選択してから実行してください．

```VB
Sub arrowSerial()
  ' 図形を選択した順に，矢印コネクタを作成する
  Set thisPage = ActivePresentation.Slides(ActiveWindow.Selection.SlideRange.SlideIndex)
  Dim n As Integer
  If n < 2 Then
    MsgBox("Select 2 or more objects")
    Exit Sub
  End If
  For i = 2 To n
    Set src = ActiveWindow.Selection.ShapeRange(i-1)
    Set dst = ActiveWindow.Selection.Shaperange(i)
    With thisPage.Shapes.AddConnector(msoConnectorCurve, 0,0,0,0)
      With .ConnectorFormat
        .BeginConnect connectshapve:=src, connectionsite:=1
        .EndConnect connectshapve:=dst, connectionsite:=1
      End With
      With .Line
        .BeginArrowheadStyle = msoArrowheadNone
        .EndArrowheadStyle = msoArrowheadTriangle
        .EndArrowheadLength = 3
        .EndArrowheadWidth = 2
      End With
      .RerouteConnections  '最短経路になるようにコネクションサイトを選択しなおしてくれる
  Next
End Sub
```

# おわりに
PowerPoint マクロは Excel マクロに比べて情報が少なく，たったこれだけのマクロに思いのほか時間がかかりました．とりあえず動くだけ，という状況なので，もう少しちゃんと勉強したいところです．
【GAS】Slackで匿名Botを実装する


# はじめに

最近記事の投稿を始めた[Tutu](https://twitter.com/padde_cross)です。
今回は社内で誰でも遠慮なく発言できる場所を作りたいと思って匿名**Bot**を以下を参考に作成しました。
実装に関してはほぼこちらのコードを参考にさせていただきました。なので今回は解説をしていこうと思います。
→[gasで作ったslackbotにDMすると匿名化されてチャンネルに投稿されるのを作った]
(https://qiita.com/09rd193/items/59c2e1a1c62a15e83847)

概要としては匿名**Bot**に**DM**を投稿すると``incoming webhook``を利用して特定の**Channnel**にBotを通して投稿されるというものです。



# Slack Appの設定

## bot eventsについて

``message.im``
→BotのDMに投稿されたときのイベント

``message.channels``
→Botに関するメッセージがチャンネルに投稿された時のイベント

``app_mention``
→Botに関連するメッセージのイベント(message.channels、message.groups、message.mpim)


![スクリーンショット 2020-09-13 22.04.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360479/b4daaad9-a6f0-8fad-60ed-7ed290e6d622.png)


# 実装

**※今回は簡易的な説明のみ行いたいと思います**

イベントリクエストの信頼性を確認

```javascript:
if(postData.type == 'url_verification') {
    return ContentService.createTextOutput(postData.challenge);
}
```

今回はBotへのDMのみ反応するためimを設定

```javascript

    postData.event.channel_type == 'im'
```

``postData.event.text``から実際の投稿を取得できるのでそれを``json``として``messageData``に格納
→参考:[Slack API Document](https://api.slack.com/events/message.channels)

```javascript
  var slackUrl = 'Incoming WebhooksのURL';
  var message = postData.event.text;
  var messageData = {
    'text': message
  };
```
後は``POST``時のオプションを設定して``incoming webhook``で``POST``するだけ！

```javascript
 var options = {
    'method'  : 'POST',
    'headers' : {'Content-type': 'application/json'},
    'payload' : JSON.stringify(messageData)
  };

  return UrlFetchApp.fetch(slackUrl, options); 

```

以下全コード

```javascript:anonymous.js
 
function doPost(e) {
  var postData = JSON.parse(e.postData.getDataAsString());
  console.log(postData.type);
  if(postData.type == 'url_verification') {
    return ContentService.createTextOutput(postData.challenge);
  } else if (
    postData.event.channel_type == 'im'
  ) {
    return reply(postData);
  }

  return 0;
}

function reply(postData){
  var slackUrl = 'Incoming WebhooksのURL';
  var message = postData.event.text;
  var messageData = {
    'text': message
  };

  var options = {
    'method'  : 'POST',
    'headers' : {'Content-type': 'application/json'},
    'payload' : JSON.stringify(messageData)
  };

  return UrlFetchApp.fetch(slackUrl, options); 
}
```
# 結果

**DMに投稿**
![スクリーンショット 2020-09-13 22.18.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360479/d0fd0599-aa40-a000-5f0e-aa45afd36ddb.png)
![bot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360479/3d801535-c35b-e8bb-5f0b-8a942fa3ea4a.png)

**AnonymousとしてChannnelに投稿されました！**

# 最後に
今回は[この記事](https://qiita.com/09rd193/items/59c2e1a1c62a15e83847)のほぼ流用だったので、今後は匿名投稿時のマニュアルをスラッシュコマンドで設定するなど、実際に社内で使いやすいようにするために**アレンジ**していけたらと思います！

# 参考文献
- [gasで作ったslackbotにDMすると匿名化されてチャンネルに投稿されるのを作った](https://qiita.com/09rd193/items/59c2e1a1c62a15e83847)
- [Slack API Document](https://api.slack.com/events/message.channels)
- [Event APIについて](https://stackoverflow.com/questions/41864731/slack-event-api-for-bot-mentions)
- [Slack APIについて](https://qiita.com/negito6/items/7a457453ff875700d312)
Content Hugging Priority と Content Compression Resistance Priority を理解する

今回は AutoLayout 関連で、なんとなく使っていて詳しく理解していなかった `Content Hugging Priority` と `Content Compression Resistance Priority` を調べていきたいと思います。

### Content hugging priority とは？

この Priority(優先度) は View が本来のサイズよりも大きくなることに抵抗する度合いを設定します。つまり、この値が大きくなればなるほど、View がそのコンテンツよりも大きくならないようになります。

|View|Content hugging priority|
|---|---|
|UIView|250|
|UITextView|250|
|UIButton|250|
|UILabel|251|
|UIImageView|251|
|UISwitch|750|

### Content Compression Resistance Priority とは？

この Priority は View が本来のサイズよりも小さくなることに抵抗する度合いを設定します。つまり、この値が大きくなればなるほど、View がそのコンテンツよりも小さく縮小されないようになります。

|View|Content Compression Resistance Priority|
|---|---|
|UIView|750|
|UITextView|750|
|UIButton|750|
|UILabel|750|
|UIImageView|750|
|UISwitch|750|

### 知っておくといいこと

#### Q1

みなさんが仕事で AutoLayout を使っている場合、少なくとも一回ぐらいは Xib で下記のように Label の高さを指定せずに Label 同士を繋げて View のコンテンツとして制約を貼った時に起こる Error に遭遇したことがあるかと思います。

Label 単体で制約を貼った場合は Error が出ないのに、高さを指定していない Label を連結するとどうして Error が出るのでしょう？少し考えてみてください🙃


<img src="https://cdn-ak.f.st-hatena.com/images/fotolife/y/yum_fishing/20200906/20200906181947.png">


#### 答え

答えは、`Content hugging priority` の vertial の値がどちらも**251**だからです🙃つまり、どちらも同じ値なので、制約を満たすためにどちらかの Label を広げて表示させたいのですが、値が競合しているためシステムが判断できないよ、とのことです。

それでは、試しに `blueLabel` の `Content hugging priority` の vertical 値を１ポイント下げて広げやすくしてみます。

<img src="https://cdn-ak.f.st-hatena.com/images/fotolife/y/yum_fishing/20200906/20200906182036.png">



#### Q2

下記のようにラベルの幅の制約(幅40pt)を `priority750` でセットして省略されてしまうような長い文字列を挿入した時、またも Error に遭遇してしまいましたこれはなぜでしょうか？

<img src="https://cdn-ak.f.st-hatena.com/images/fotolife/y/yum_fishing/20200906/20200906182104.png">

#### 答え

答えは、`Content Compression Resistance Priority` の horizontal の値が横幅(`NSLayoutConstraint`)の priority と競合しているためです。これによって、システムは横幅で指定されている**40pt**とコンテンツサイズの大きさに合わせる `Content Compression Resistance Priority` の値のどちらを優先していいか分からず Error が出てしまっているのですね🙃

それでは、試しに `Content Compression Resistance Priority` の値を１ポイント上げて**751**にしてみましょう。すると、下記のようにコンテンツ幅が優先されて表示されるようになりました🎉

<img src="https://cdn-ak.f.st-hatena.com/images/fotolife/y/yum_fishing/20200906/20200906182118.png">



また、`Content Hugging Priority` および `Content Compression Resistance Priority` は、Viewにサイズを決定するための十分な制約がない場合に `NSContentSizeLayoutConstraint` という制約をつくるのにも使用されるそうで、プログラム中で `NSContentSizeLayoutConstraint` と `NSLayoutConstraint` の Priority の値が同じ場合は `NSLayoutConstraint` が優先されるようです。

### 参考

- https://link.medium.com/wBjvkb61u9
- https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/AutolayoutPG/index.html#//apple_ref/doc/uid/TP40010853-CH7-SW1
- https://qiita.com/shtnkgm/items/f0b189e4184fe6c90707
YouTube DATA APIを使って、特定のチャンネルだけのjsonデータを取得する方法！！！

__Youtubeの特定のチャンネルからデータを取得したい…。__

Youtube DATA APIならできそうだったので
最近習いたてのenebularでの取得方法をまとめてみました！


#YouTube APIキーを取得する
[【データサイエンス】YouTubeのAPIを使ってYouTube内のデータを収集してみよう](https://blog.codecamp.jp/programming-api-youtube)

▲こちらの記事を参考に、YouTube APIキーを取得します！

#channelIDを取得する方法

これは簡単！取得したいチャンネルのURLの黄色く囲んでるところがchannelIDです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670338/41d710ed-d2f3-6ea7-79cc-3b003f4ee9f0.png)

__NiziU可愛い。__

#enebularでプロジェクトを作成
https://docs.enebular.com/ja/getstarted/introduction
▲こちらの記事を参考に、プロジェクトを作成して、フロー編集画面を立ち上げます！

##フローの編集
###【http in】→【http request】→【json】→【http response】
この順番でノードを置きます！
[![Image from Gyazo](https://i.gyazo.com/298cbd66903d7283e9e0be78ca40199f.png)](https://gyazo.com/298cbd66903d7283e9e0be78ca40199f)

###【http in】をダブルクリック
URLのとこは、任意でOK。こちらでは/idとします。
[![Image from Gyazo](https://i.gyazo.com/14571e071e7eb301febe7f6f88b157eb.png)](https://gyazo.com/14571e071e7eb301febe7f6f88b157eb)


###【http request】をダブルクリック
[![Image from Gyazo](https://i.gyazo.com/a5f27ea73e0b78fcca7e60497fe3484d.png)](https://gyazo.com/a5f27ea73e0b78fcca7e60497fe3484d)

###URLの部分に以下を入力する 
※channelIdとAPIキーは先ほど取得したものを挿入！
https://www.googleapis.com/youtube/v3/search?part=snippet&channelId=UCxjXU89x6owat9dA8Z-bzdw&key=APIキー

###デプロイを押す

###URLを確認
デプロイボタンの左のｉボタンを押すとURLが見えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670338/d775f7b5-4738-ec17-9118-372ad0936501.png)

そのURLの末尾に、【http in】で設定したURL（今回は/id）を追加して、画面表示させると
下図のようにjsonデータが取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670338/a389e7b2-aa57-45f8-27f1-c51f1de55868.png)


__以上！！！__

思ったより簡単でした～～！
ここからvideoIdだけを取得するなどもできるので、色々応用してみてください！
AtCoder Beginner Contest 178 参戦記

# AtCoder Beginner Contest 178 参戦記

## [ABC178A - Not](https://atcoder.jp/contests/abc178/tasks/abc178_a)

1分半で突破. xor を使っちゃったけど、タイトルは Not だった(笑).

```python
x = int(input())

print(x ^ 1)
```

## [ABC178B - Product Max](https://atcoder.jp/contests/abc178/tasks/abc178_b)

2分で突破. 端同士のどれかが最大のはずだ.

```python
a, b, c, d = map(int, input().split())

print(max(a * c, a * d, b * c, b * d))
```

## [ABC178C - Ubiquity](https://atcoder.jp/contests/abc178/tasks/abc178_c)

5分で突破. すべての組み合わせの数から、0を含まない組み合わせの数と9を含まない組み合わせの数を引いて、それだと0と9を両方含まない組み合わせの数がダブって引かれているので足し戻したものが答え.

```python
m = 1000000007

N = int(input())

print((pow(10, N, m) - pow(9, N, m) * 2 + pow(8, N, m)) % m)
```

## [ABC178D - Redistribution](https://atcoder.jp/contests/abc178/tasks/abc178_d)

29分で突破. 数列の長さが n の時に S - 3×n を n 個に分配する場合分けの数ってどうするんだって唸っていたら、仕切り棒を入れると思うんだと [ABC132D - Blue and Red Balls](https://atcoder.jp/contests/abc132/tasks/abc132_d) を思い出して解けた. n種類のものから重複を許してr個選ぶ場合の数は<sub>n</sub>H<sub>r</sub>=<sub>n+r−1</sub>C<sub>r</sub>通り.

```python
def make_factorial_table(n):
    result = [0] * (n + 1)
    result[0] = 1
    for i in range(1, n + 1):
        result[i] = result[i - 1] * i % m
    return result


def mcomb(n, k):
    if n == 0 and k == 0:
        return 1
    if n < k or k < 0:
        return 0
    return fac[n] * pow(fac[n - k], m - 2, m) * pow(fac[k], m - 2, m) % m


m = 1000000007

S = int(input())

fac = make_factorial_table(S + 10)

result = 0
for i in range(1, S // 3 + 1):
    result += mcomb(S - i * 3 + i - 1, i - 1)
    result %= m
print(result)
```

## [ABC178E - Dist Max](https://atcoder.jp/contests/abc178/tasks/abc178_e)

突破できず. この問題がこんなに解かれているということはと、確信を持って「マンハッタン距離最大」でググったらやっぱりでてきましたね orz.
Makefileの使い方メモ

## Makefile is 何？
- GitHubとか見てるとよく`Makefile`とかいうのが置いてある
- → これが何なのか知らなかったので調べてみた

## Makefileとは
- makeコマンドで自動化したい作業内容を記載するファイル
- make hogeでコンパイルしたり、shell叩いたりできる

## 基本的な書き方

```Makefile:Makefile
# コメントはbashと同じ
<タスク名A>: <依存ターゲット>
	<実行するコマンドA>

<タスク名B>:
	<実行するコマンドB>
```
- コメントは`#`で書ける
- タスク名をつけると、`make <タスク名>`で<実行するコマンド>を呼ぶことができる
- タスク名と実行するコマンドの合わせて「ルール」と呼ぶ
- <実行するコマンド>の左はタブ１つ
- <依存ターゲット>を指定すると、<タスク名A>の前に<タスク名B>を実行してから<タスク名A>を実行できる
- `all`は最終的に実行されるものを指す？

## 具体例
- Goをコンパイルして実行するを定義してみる

```Makefile:Makefile
# コンパイルを行ってから実行する
all: compile
	./main

# コンパイルを行う
compile:
	go build -o main main.go
```

## コンパイルと実行を行う

```
MacBook-Pro:captainblue captain-blue$ make
go build -o main main.go
./main
```

## コンパイルのみ行う

```
MacBook-Pro:captainblue captain-blue$ make compile
go build -o conv main.go
```

## 参考
[自動化のためのGNU Make入門講座](http://objectclub.jp/community/memorial/homepage3.nifty.com/masarl/article/gnu-make/rule.html)
[コマンド「make」初心者向けメモ(Hishidama's make-command Memo)](http://www.ne.jp/asahi/hishidama/home/tech/unix/cmd/make.html)
herokuでのデプロイの仕方

【概要】
----------------------------------------
<b>1.手順</b>

<b>2.方法</b>


1.手順
----------------------------------------
❶brew tap heroku/brew && brew install heroku
❷heroku用ファイルの作成
❸heroku用DBの作成
❹環境変数の設定
❺heroku上でmasterにpush
❻heroku上でマイグレーションの実施

<br>
2.方法
----------------------------------------
❶brew tap heroku/brew && brew install heroku

```terminal:ターミナル
% brew tap heroku/brew && brew install heroku
```

を実行しましょう！ミスしないようにherokuに公開したいアプリの該当ファイルで行うことをお勧めします！
そして％ heroku login --interactive
でherokuにログインしておきます！


❷heroku用ファイルの作成

```tarminal:ターミナル
％ heroku create *****
```
でherokuに公開したいアプリの名前を作成します。


❸heroku用DBの作成

```terminal:ターミナル
% heroku addons:add cleardb
```
と記載しデーターベースを作成します。

```terminal:ターミナル
% heroku config | grep CLEARDB_DATABASE_URL
```
これにより、CLEARDB_DATABASE_URLが出てくるので、使用状況によりmysql2を使用している方は、変更しましょう。

＞変更方法＜

```taeminal:ターミナル
% heroku config:set DATABASE_URL = 'mysql2:*****'
```
****の部分は% heroku config | grep CLEARDB_DATABASE_URLでてきたものをコピペします。


❹環境変数の設定

```terminal:ターミナル
% heroku config:set RAILS_MASTER_KEY=`cat config/master.key`
```
こうすることで、パスワードをファイルの中に書き込まず、見られないようにしてサイトを見るようにできます。

❺heroku上でmasterにpush

```terminal:ターミナル
% git push heroku master
```
こちらでherokuにpushできます。


❻heroku上でマイグレーションの実施

```terminal:ターミナル
% heroku run rails db:migrate
```

DBを❹で作っているのでそれをローカルと同じようにherokuでもマイグレーションしていきます。

これでherokuにアプリを公開できるようになります。
ただパスワードを設定していないので誰でもそのサイトを覗ける状態になっているので注意してください。
環境変数はあくまでも自分のサイトを乗っ取られないようにするためものです。
<br>
Pardot のリード生成 (Pardot Lightning アプリケーション)⇒Pardot でのプロスペクトとビジターの処理方法について

１．トラッキングコードは Pardot のどのオブジェクトにありますか?
２．Web サイトを訪問した匿名のビジターが Pardot のプロスペクトになるために必要なことは何ですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/01b3423e-62b1-d998-283a-71f1fd7b6a4a.png)
1年後の自分よ、WebVRやりたいときはこれを見ろ

#1年後の自分へ
きっと君は、「うわあ一年前WebVR勉強したのに結局全然勉強してねえや最近」と嘆いていることだろう。
そんな君に、今僕がさくっと調べたWebVR関連のサイトをサクッと教えてやるぜ。

#これを見ろ
　以前作った「かくれんぼ」の3D版を作るために色々調べた結果をここに示すぜ
　「かくれんぼ」が何か思い出せないならこれを見ろ
　https://qiita.com/canonno/items/00738c7d928c3ec655d5


・WebVRを実装するライブラリ「A-frame」ドキュメント
　https://aframe.io/docs/1.0.0/introduction/

・缶から星を出しまくるもの。サクッとハンズオンできそう
　https://qiita.com/name_yy/items/9144f612a8e15d14f9ff

・A-frameの英語ドキュメントに沿って実装してくれている日本語Qiita。ハンズオン用。
　https://qiita.com/thomi40/items/dfc4175efece38ab5747

・p5jsとWebVRとを組み合わせたスーパーマン。実装には時間がかかりそう。
　https://leoouyang.com/let-it-snow
　※このスーパーマンの解読にはjavascriptのelementについて理解が必要だ。
　　この人は各オブジェクトを生成するロジックをあらかじめ書いておきElement単位で制御している。
　・https://developer.mozilla.org/ja/docs/Web/API/Document/createElement
　・https://developer.mozilla.org/ja/docs/Web/API/Node/appendChild
　・https://techacademy.jp/magazine/22315
  ・https://qiita.com/KDE_SPACE/items/e21bb31dd4d9c162c4a6


#さいごに
　Good Luck!
TextViewをHTMLのように下線を引いたり着色したりする

`android.core.text`に`SpannableStringBuilder`の[拡張関数](https://developer.android.com/reference/kotlin/androidx/core/text/package-summary?hl=ja#extension-functions)を見つけたので使ってみる


また、TextViewの拡張関数としているが、`BindingAdapter`でも使えるようにしている。

## 準備

core-ktx

app/build.gradle に`core-ktx`を追加する

```kotlin:app/build.gradle.kts
implementation("androidx.core:core-ktx:1.5.0-alpha01")
```

## 下線

### `SpannableStringBuilder().underline {}`を使うパターン

```kotlin
/**
 * TextViewに下線付きで文字を表示する (SpannableStringBuilder 版）
 */
@BindingAdapter("textWithUnderline")
fun TextView.textWithUnderline(text: String?) {
    if (text.isNullOrEmpty()) return
    this.text = SpannableStringBuilder().underline {
        append(text)
    }
}
```

### HtmlCompatを使うパターン

```kotlin
/**
 * TextViewに下線付きで文字を表示する（HtmlCompat 版）
 */
@BindingAdapter("textWithUnderline")
fun TextView.textWithUnderline(text: String?) {
    text ?: return
    this.text = HtmlCompat.fromHtml("<u>$text</u>", HtmlCompat.FROM_HTML_MODE_COMPACT)
}
```

### BindingAdapter で使うとき

`app:textWithUnderline`で使える

```xml
<TextView
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_marginBottom="16dp"
     app:textWithUnderline='@{"under line"}'
     tools:text="under line"
     />
```

## 文字色

### `SpannableStringBuilder().color() {}`を使うパターン

```kotlin
/**
 * TextViewに文字色をつける（SpannableStringBuilder 版）
 */
@BindingAdapter("textWithRedColor2")
fun TextView.textWithRedColor2(text: String?) {
    if (text.isNullOrEmpty()) return
    val color = ContextCompat.getColor(this@textWithRedColor2.context, R.color.colorAccent)
    this.text = SpannableStringBuilder().color(color) { append(text) }
}
```

### HtmlCompatパターン

```kotlin
/**
 * TextViewに文字色をつける（HtmlCompat 版）
 */
@BindingAdapter("textWithRedColor")
fun TextView.textWithRedColor(text: String?) {
    if (text.isNullOrEmpty()) return
    this.text = HtmlCompat.fromHtml("ここは<font color='red'>$text</font>", HtmlCompat.FROM_HTML_MODE_COMPACT)
}

```

## 背景色

```kotlin
/**
 * 文字のBackgroundに色をつける（SpannableStringBuilder 版）
 */
@BindingAdapter("textWitBackgroundColor")
fun TextView.textWitBackgroundColor(text: String?) {
    if (text.isNullOrEmpty()) return
    val color = ContextCompat.getColor(this.context, R.color.colorAccent)
    this.text = SpannableStringBuilder().backgroundColor(color) {
        append(text)
    }
}
```

## GitHub

https://github.com/ikemura23/Android-Kotlin-Lab/blob/text_decoration_html/app/src/main/java/com/ikemura/android_kotlin_lab/extention/TextExt.kt


## 備考

`SpannableStringBuilder`で複数パターンの装飾をするには`setSpan()`を使うとできるはず。

`HtmlCompat`はタグを書いて装飾するため、自由度とカスタム製が高そう

Spanの公式ドキュメント
https://developer.android.com/guide/topics/text/spans?hl=ja

SpannableStringBuilderの拡張関数
https://developer.android.com/reference/kotlin/androidx/core/text/package-summary?hl=ja#extension-functions
Windows10 CMD　コマンドプロンプトでレガシ コンソールに設定したあともとに戻すとCMDが真っ黒になってしまう件

[コマンドプロンプトが真っ黒で文字が表示されない teratail 2019/11](https://teratail.com/questions/221995)
とりあえずcmdを起動して
真っ暗な中で
`color 0f`
を打ち込む。
これで戻るなら、上記の自己解決しましたの項目を見る。
ターミナルで全部黒になっているのが原因。その設定の変更の仕方がちょっとかっこいい。
こんなのができる人が苦労するくらいわけがわからない。
この他にもフォントの大きさが設定されていない、というメッセージが何度も出るという現象が確認した。
MSゴシックにしておいて、レガシ コンソールにするとラスターフォントになって、戻したときにMSゴシックになってもポイントの指定が消えているらしい。
たしかにこれをウィルスが狙っても不思議ではない。
海外ソースはいまのところ見つかっていないが、調べてから書いているようなので、みつかったら追記します。
RustでPythonライクなrangeを使う

# はじめに

RustでPythonライクなrangeを使う方法を紹介します。

以下のように使うことができます。

```rust
// for i in range(5):
//     print(i)
for i in range!(5) {
    println!("{}", i);
}

// for i in range(1, 5):
//     print(i)
for i in range!(1, 5) {
    println!("{}", i);
}

// for i in range(1, 5, 2):
//     print(i)
for i in range!(1, 5, 2) {
    println!("{}", i);
}

// for i in range(5, 1, -1):
//     print(i)
for i in range!(5, 1, -1) {
    println!("{}", i);
}
```

# やり方

以下のマクロでPythonライクなrangeを実装できます。

```rust
macro_rules! range {
    ($stop:expr) => {
        0..$stop
    };
    ($start:expr, $stop:expr) => {
        $start..$stop
    };
    ($start:expr, $stop:expr, -$step:expr) => {
        ($stop + 1..$start + 1).rev().step_by($step)
    };
    ($start:expr, $stop:expr, $step:expr) => {
        ($start..$stop).step_by($step)
    };
}
```

基本的には、Pythonのrange関数と同じイテレータを返します。

# できないこと

負のステップを指定するときに、`step_by()`は`usize`しか受け取れないため、`rev()`でイテレータを逆順にする必要があります。
そこでパターンマッチで`-`の有無を判定して、`rev()`するかを決めています。
なので変数に負の数が入っていてステップとして与えると、パターンマッチで負の数と判定することができないため、コンパイルエラーとなります。

```rust
// コンパイルエラー
let x = -1;
for i in range!(5, 1, x) {
    println!("{}", i);
}
```

ここらへんをうまく実装できる方法があれば、教えていただきたいです。

# 最後に

Rustのマクロは自由度が高いので、とても楽しいです。
WebstormでES6(またはそれ以降)で記述されたコードを Run してNode.jsランタイムでそのまま実行する方法

# 概要
Webstormで右クリック Run で ES6以降の記法で記述されたコードをそのまま実行する方法です。

## 環境
**Webstorm 2018**
**Windows 10**
**Node.js v.12**

## そのままでは実行できないコード

たとえば、以下のようなコードを記述する

```js:es6-class.js
export default class MyClass{
  constructor() {
  }
  doSome(){
    console.log('hello');
  }
}
```

```js:es6-run.js
import MyClass from './es6-class';
const obj=new MyClass();
obj.doSome(); // => 'hello'
```

エディタ上で右クリックをして、　Run　で実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/b6a48dfc-714b-ad86-643f-01a630fbcec4.png)

すると、以下のようにエラーする。

```
import MyClass from './es6-class';
^^^^^^

SyntaxError: Cannot use import statement outside a module
    at wrapSafe (internal/modules/cjs/loader.js:1053:16)
    at Module._compile (internal/modules/cjs/loader.js:1101:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10)
```

## 解決方法

こうした状況の解決方法はいくつかあるが、
今回はWebstormならではの右クリックRunをしたときにbabelが走るように設定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/608428ae-f27b-a396-20a1-55142e73cf99.png)

0.**@babel/node**パッケージを導入しておく。

1.Webstorm上部右側の実行メニューから**Edit Configurations**を選択する

2.Node interpreterを素の**node**から**babel-node**に変更する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/e9a99e4c-1bc5-0be5-3739-5419df984f55.png)

＋アイコンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/6fafb086-c378-092e-1fdd-69458878d597.png)

Add Localを選択し、自プロジェクトの**node_modules/.bin/babel-node.cmd**を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/235d0b79-4e41-e0dc-e044-d5278bbebe49.png)

3.Node parameters:を指定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/e2e2ce4f-000f-3574-d04f-3c0475c38622.png)

Nodeパラメータに**--presets @babel/preset-env**を指定して**OK**

さて、これで再度 **Run**を実行する、無事babelが走ってコードがトランスパイルされ、トランスパイル後のコードがNode.js上で実行される。

# 追伸
Node v.14 なら ESM(import構文など)が使えるので、WebStormからでも何もせずに使えそう。
Pardot Lightning アプリケーションの基本⇒Pardot の管理の基本について

１．Pardot の 4 つのデフォルトのユーザロールは何ですか?
２．あなたの会社では Salesforce に好みの製品を収集する項目を設定しており、その情報を Pardot で使用したいと考えています。実行すべき操作はどれですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/24941b97-6d6e-5b33-1c31-ea26cd3991d9.png)
共有SSLと独自SSLの違い

## 共有SSLと独自SSLの違い

## 独自SSL

- 自分が持ってるドメインに対して、自分で取得を行う
- フォームへ移動してもドメインが変わらない
- 運用コストがかかる
	- 無料DV認証証明書、Let's Encryptなどもあり、価格を抑えることは可能

## 共有SSL

- レンタルサーバ会社で取得を代行し、複数ユーザで使用することになる
- レンタルサーバでは、標準サービスで提供される場合が多い
- サイトシールが取れない
	- `サイトシール` : クリックすると証明内容を表示する動的な画像
- フォームへ移動するとドメインが変わる(独自ドメインでSSL対応できない)
	- `sample-test.com`であれば、`https://sample-test.com-xxxxx.jp/`のような記載になる
- コストをかけず手軽に暗号化通信に対応		

## まとめ

- 独自SSL : 1対1でドメイン対応
- 共有SSL : 1対多でドメイン対応

## 参考

- [「独自SSL」と「共有SSL」の違いはなんでしょうか？](https://www.value-domain.com/ssl-certs/faq/original-share.php)
- [共有SSLと独自SSLの違い！ sslサーバ証明書とは](https://www.nkshopping.biz/index.php?%E5%85%B1%E6%9C%89SSL%E3%81%A8%E7%8B%AC%E8%87%AASSL%E3%81%AE%E9%81%95%E3%81%84%EF%BC%81%20ssl%E3%82%B5%E3%83%BC%E3%83%90%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%81%A8%E3%81%AF)
- [サイトシールとは](https://valuessl.net/support/help/siteseal.php)
- [無料SSL証明書のLet’s Encryptとは？](https://ssl.sakura.ad.jp/column/letsencrypt/)
git rebaseの例

# Assumption

* Sample branches' status



```php
            /--- commit1--- commit2     `feature-1`
           /
*----*----*    `develop`
           \
            \--- commitA --- commitB    `feature-A`
```

* Changes in branch `feature-1` and `feature-A` have no conflicts

# Do a rebase

## Case 1: On branch `feature-A`, rebase branch `feature-1`

`$ git checkout feature-A`    
`$ git rebase feature-1`
> First, rewinding head to replay your work on top of it...    
> Applying: commitA   
> Applying: commitB

 * Then the commit history will look like this:


```php
                                     /--- commitA --- commitB   `feature-A `
                                    /
            /--- commit1--- commit2   `feature-1`
           /
*----*----*   `develop`                   
```


## Case 2: On branch `feature-1`, rebase branch `feature-A`

`$ git checkout feature-1`    
`$ git rebase feature-A`
> First, rewinding head to replay your work on top of it...    
> Applying: commit1   
> Applying: commit2 

 * Then the commit history will look like this:


```php
                                     /--- commit1 --- commit2   `feature-1 `
                                    /
            /--- commitA--- commitB   `feature-A`
           /
*----*----*   `develop`                   
```
EC2作成直後の状態から最速でVue.js(CDN版)のWebサイトを立ち上げる

# はじめに
超・初心者向けシリーズ。
とりあえずVue.js始めてみたいけどどんな感じでやってみたらいいの？な人向け。

以下の通りに実行していけば、S3の静的Webサイトホスティング上でVue.jsのHello Worldが動く。

# 手順

## 1. yumのアップデート
```shell-session
$ sudo yum update
```

## 2. Node.jsのインストール(npmがNode.jsに含まれる)
Vue.jsの静的解析はESLintという強力なlinterがあるので、それを動かすためにnpmを入れておく。

Node.jsについては、予め、rpm.nodesource.com でサポートバージョンを確認しておく。今回は、記事を書いたタイミングでサポートされている14をインストールする。

```shell-session
$ curl -sL https://rpm.nodesource.com/setup_14.x | sudo bash -
$ sudo yum install -y nodejs
```

## 3. ESLintのインストール
なんか色々インストールしているが、「とりあえずこれを静的解析に入れておけばかなり良い感じにチェックしてくれる」なものを入れている。

```shell-session
$ npm init -y
$ npm install --save-dev eslint eslint-config-standard eslint-plugin-standard eslint-plugin-import eslint-plugin-node eslint-plugin-promise eslint-plugin-vue
```

## 4. ESLintの設定ファイル(.eslintrc.yml)の作成
rulesの ```no-undef: warn```は今回の記事では不要だが、CDN版でaxiosを動かそうとするとエラーが出てしまうので……

```YAML:.eslintrc.yml
extends:
  - 'plugin:vue/recommended'
  - 'plugin:vue/essential'
  - 'standard'
env:
  browser: true
rules:
  no-undef: warn
globals:
  Vue: true
```

# 5. ESLint実行の設定
ESLintの実行はそのままだと面倒なので、```npm run lint``` で実行できるようにしておく。
```npm init -y``` した時に作成される package.json の以下の部分を書き加える

```JSON:package.json
(前略)
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"  ★この行を消して
    "lint": "eslint contents/*.js contents/*.html"         ★この行を書き加える
  },
(以下略)
```

# 6. おためしコンテンツを作成

```HTML:contents/index.html
<html>
  <head>
    <meta charset="utf-8">
    <title>Vue TEST</title>
  </head>
  <body>
    <div id="app">
      {{ message }}
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    <script src="/app.js"></script>
  </body>
</html>
```

```Javascript:contents/app.js
const app = new Vue({
  el: '#app',
  data: {
    message: 'Hello World!!'
  }
})

app.$mount('#app')
```

# 7. S3バケットを作成

…の前にコンフィグ設定

```shell-session
$ aws configure
AWS Access Key ID [None]: xxxxxxxxxxxxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

今度こそバケットを作成

```shell-session
$ aws s3 mb s3://neruneruo-vuejs-test-bucket
$ aws s3 ls
```

静的Webサイトホスティングの設定

```shell-session
$ aws s3 website s3://neruneruo-vuejs-test-bucket --index-document index.html
```

ファイルをアップロード

```shell-session
$ aws s3 cp contents/index.html s3://neruneruo-vuejs-test-bucket/index.html --acl public-read
$ aws s3 cp contents/app.js s3://neruneruo-vuejs-test-bucket/app.js --acl public-read
```

これで、静的WebサイトホスティングのURLにアクセスしたら「Hello World!!」が表示されたはずだ。

あとは、ガンガン ```npm run lint``` しながら Vue.js の世界を堪能しよう！
【Rails】データを削除する様々な方法

#早見表


| メソッド | 説明 | 削除する範囲 |
|:-:|:-:|:-:|
| destroy  |  一件のデータを削除 |  対象データと関連データを削除 |
|  destroy_all | 複数データを削除  | 対象データと関連データを削除  |
| delete  | 一件のデータを削除  | 対象データのみ削除  |
| delete_all  |  複数データを削除 |  対象データのみ削除 |



<details><summary>関連するデータ</summary>`dependent: :destroy`で依存関係にあるデータのこと</summary>


#使い方

```ruby:
# destroyメソッド
User.find(1).destroy

# destroy_allメソッド
User.where(id: 1..5).destroy_all

# deleteメソッド
User.find(1).delete

# delete_allメソッド
User.where(id: 1..5).delete_all
```
ES6〜ES10のIE11使用状況

業務上IE11の使用が避けられないためES6〜ES10の使用状況を備忘録的に残していきます。

# ES2015(ES6)

|ES2015(ES6)追加仕様|実行可否|コンソールエラーメッセージ|
|---|---|---|
|クラス (class)|NG|構文エラーです。|
|テンプレート文字列 (`Hello ${name}`)|NG|文字が正しくありません。|
|モジュール (import, export)|-|（未確認）|
|アロー関数 (=>)|NG|構文エラーです。|
|デフォルト引数 (function(x=0, y=0))|NG|')' がありません。|
|可変長引数 (function(x, y, ...arg))|NG|識別子がありません。|
|定数 (const)|OK|-|
|局所変数 (let)|OK|-|
|for of ループ (for item of items)|NG|';' がありません。|
|Map オブジェクト|OK|-|
|Set オブジェクト|ラーは出ないがnew Setの中身を評価できなく実行できない|-|
|配列関数 (from())|NG|オブジェクトは 'from' プロパティまたはメソッドをサポートしていません。|
|配列関数 (of())|NG|オブジェクトは 'of' プロパティまたはメソッドをサポートしていません。|
|分割代入 ([x, y] = [10, 20])|NG|構文エラーです。|
|スプレッド構文 (...args)|NG|識別子がありません。|
|型付き配列 (Uint8Array, ...)|-|（未確認）|
|シンボルオブジェクト (Symbol)|NG|'Symbol' は定義されていません。|
|8進数(0o)と2進数(0b)|NG|')' がありません。|
|言語依存フォーマット (NumberFormat())|OK|-|
|非同期処理 (Promise)|NG|構文エラーです。|

# ES2016(ES7)

|ES2016(ES7)追加仕様|実行可否|コンソールエラーメッセージ|
|---|---|---|
|array.includes()|NG|オブジェクトは 'includes' プロパティまたはメソッドをサポートしていません。|
|べき乗演算子(**)|NG|構文エラーです。|

# ES2017(ES8)

|ES2017(ES8)追加仕様|実行可否|コンソールエラーメッセージ|
|---|---|---|
|オブジェクト参照 (object.values())|NG|オブジェクトは 'values' プロパティまたはメソッドをサポートしていません|
|オブジェクト参照 (object.entries())|NG|オブジェクトは 'entries' プロパティまたはメソッドをサポートしていません。|
|パディング (string.padStart())|NG|オブジェクトは 'padStart' プロパティまたはメソッドをサポートしていません。|
|パディング (string.padEnd())|NG|オブジェクトは 'padEnd' プロパティまたはメソッドをサポートしていません。|
|プロパティ記述子参照 (object.getOwnPropertyDescriptors())|NG|オブジェクトは 'getOwnPropertyDescriptors' プロパティまたはメソッドをサポートしていません。|
|関数末尾のカンマ (,)|NG|識別子がありません。|
|非同期処理(async, await)|NG|構文エラーです。|

# ES2018(ES9)

|ES2018(ES9)追加仕様|実行可否|コンソールエラーメッセージ|
|---|---|---|
|テンプレート文字列の強化(\uの扱い)|NG|識別子がありません。|
|オブジェクトのスプレッド構文とレスト構文 (...obj)|NG|識別子、文字列または数がありません。|
|正規表現のsフラグ (/.../s)|NG|正規表現で構文エラーが発生しました。|
|正規表現の名前付きキャプチャグループ (?<...>)|NG|文字の繰り返しを表す正規表現演算子が不正です。|
|正規表現の前方マッチ条件検索 ((?<=...), (?<!...))|-|（未確認）|
|正規表現のUnicodeプロパティマッチ (\p{...})|-|（未確認）|
|Promiseのfinally構文|-|（未確認）|
|Promiseのfor await (... of ...)構文|-|（未確認）|

# ES2019(ES10)

|ES2019(ES10)追加仕様|実行可否|コンソールエラーメッセージ|
|---|---|---|
|catch引数の不要化|NG|'(' がありません。|
|Symbol.description|-|（未確認）|
|JSON superset|NG|終了していない文字列型の定数です。|
|Well-formed JSON.stringify|NG|コンロソールエラーは出ないが未対応|
|function.toString() でコメントも文字列化|OK|-|
|Object.fromEntries()|NG|オブジェクトは 'fromEntries' プロパティまたはメソッドをサポートしていません。|
|string.trimStart()|NG|オブジェクトは 'trimStart' プロパティまたはメソッドをサポートしていません。|
|string.trimEnd()|NG|オブジェクトは 'trimEnd' プロパティまたはメソッドをサポートしていません。|
|array.flat() |NG|オブジェクトは 'flat' プロパティまたはメソッドをサポートしていません。|
|array.flatMap()|NG|構文エラーです。|
Twitter api　Python　自動化（自分用メモ）

#コピペ用
CONFIG = {
    "CONSUMER_KEY":"自分の",
    "CONSUMER_SECRET":"自分の",
    "ACCESS_TOKEN":"自分の",
    "ACCESS_SECRET":"自分の",
   }

import tweepy
import time

CONSUMER_KEY = CONFIG["CONSUMER_KEY"]
CONSUMER_SECRET = CONFIG["CONSUMER_SECRET"]
ACCESS_TOKEN = CONFIG["ACCESS_TOKEN"]
ACCESS_SECRET = CONFIG["ACCESS_SECRET"]

q_list = ["検索するKW"]
count = 100

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
api = tweepy.API(auth)

for q in q_list:
    search_results = api.search(q=q, count=count)
    for result in search_results:
        time.sleep(10)
        tweet_id = result.id #Tweetのidを取得
        user_id = result.user._json['id'] #ユーザーのidを取得
        try:
            api.create_favorite(tweet_id) #ファボする
            #api.retweet(tweet_id)
            #api.create_friendship(user_id) #フォローする
        except Exception as e:
            print(e)

#終わり
とりあえず「いいね」を送ることだけはできる。429エラーを吐く原因と対処がわからないためいったん放置。
普段はブログで情報発信してるので暇な日とは読んでみてね。
URL：https://www.ivyblog.org/
AWSでのWordPress構築で"このページは動作していません"と表示された場合の対処方法

# 起こったこと
[AWSの入門書](https://www.amazon.co.jp/dp/4297106612/)を参考にしながらEC2上でwordpressを構築し、ブラウザから
Wp-admin/install.php
にアクセスしたところ

「このページは動作していません」
と表示されてしまった.

EC2のOSはAmazon Linux２
wordpressのバージョンは5.5.1を利用した。

# 原因と対処方法
phpのバージョンが古いのが原因だった。

wordpressのダウンロードサイトを見ると、PHP バージョン7.4以上推奨と書いてある（2020年9月現在）
https://ja.wordpress.org/download/

しかし、aws上で単純にyum installコマンドでphpをインストールすると、バージョン5.4がインストールされてしまっていた。
下記手順のとおりphp7.4をインストールし、httpdを再起動することで無事に動作するようになった。

```
$ sudo yum install --disablerepo=* --enablerepo=epel,remi,remi-safe,remi-php73 php
$ sudo amazon-linux-extras install epel
$ sudo yum install epel-release
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
$ sudo yum install -y php74 php74-php php74-php-fpm
$ sudo ln -s /usr/bin/php74 /usr/bin/php
$ sudo yum install -y php74-php-mysql php74-php-mbstring php74-php-gd
$ sudo systemctl restart httpd
```
VSCodeでphpをデバッグする

環境
初書：2020/09/13
PC：macOS 10.15.6
php 7.4.9
xdebug 2.9.6

# 前置き
PHPでもデバッグしたい！という事で、デバッグする方法を探してみた。

# 前提
peclが利用可能な環境・vscodeがインストール済み

# debugをインストールする
## PHP debug
vscodeの拡張機能から、PHP Debugをインストールする
（publisher:Felix Becker。他の人のでも動くかは未検証)

## xdebug
ターミナルから、

```zsh
% pecl install xdebug
```
を実行し、xdebugをインストール
`% pecl list`を実行し、xdebugが表示されればインストールは完了

# php.iniを設定する
```zsh
% vim /usr/local/etc/php/7.4/php.ini
```
（※phpのバージョン及びphp.iniの場所によって座標は変更する。）
を実行し、以下のコードを追加する（一番上に書き足しても動く）

```text
zend_extension="/usr/local/Cellar/php/7.4.9/pecl/20190902/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_port = 8080
```
（zend_extensionには、xdebugをインストールした際に`Installing '(略)'`と記載されているので、その値。
xdebug.remote_portには、普段phpを立てる際のポート番号を設定する）

2020/09/15 追記
各項目の説明をしてくれているサイトをがあったので：[[PHP] Xdebug のリモートデバッグ、理解していますか？](https://qiita.com/castaneai/items/d5fdf577a348012ed8af)


vimの操作覚えてないのでメモ：[Vim初心者のための基本的な操作方法のまとめ](https://qiita.com/tomoya1993/items/7b7dfffd3553e55601ef)

# vscodeを設定する
vscodeのデバッグ画面（command + shift + D)を開き、上部にある歯車のマークをおし、launch.jsonを開く
"port"欄を、xdebug.remote_portと同じ値にする

# phpを実行する
設定は終わったので、動作するか確認する
vscodeのphpファイルで適当にブレークポイントを入れ、下記を実行する

```zsh
% php -S XXXX:8080
```
（XXXX及び8080は自身の環境に応じて変更する）
その後、該当ページにアクセスし、ブレークポイントで止まれば完了する。

# 終わりに
こちらの環境では、ブレークポイントで止まるものの、何行目で止まっているのかの表示がされないのでもしかしたらどこかで設定ミスがあるかもしれない。
また、デバッグの設定は過去に一度断念しているらしく、一部設定がしてあったり、インストールされていたりしたので、もしかしたら上記設定以外にも必要かもしれないが、覚えていない。。

2020/09/15 追記
xdebugは、var_dumpの表示方法を変えるシステムが存在しているらしく、出力が少し変わった。
もし気になる場合はautostartにしない方がいいかもしれない。

# 参考サイト：
[Visual Studio CodeとXdebugでPHPのデバッグ環境を構築する](https://qiita.com/ryooob/items/c0241d02761c3fd421c2)
[[XAMPP Mac]VSCodeでPHPのXdebugを使いデバッグ！しかしブレークポイントが止まらない](https://qiita.com/bitcoinjpnnet/items/dc94c79bd6a69925872d)
Pardot Lightning アプリケーションの基本⇒Pardot Lightning アプリケーションの操作方法について

１．Pardot のメニューナビゲーションに含まれる 4 つのカテゴリは何ですか?
２．[作成されたプロスペクト] テーブルに表形式で表示されるのはどのようなプロスペクトですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/3ee5fec1-6fe3-7258-4422-85d89efa9307.png)
そこそこ古い Chromebook で、DVD映画を再生する方法 

## 概要
よくよく調べると、まだ明確な該当記事が無さそうだったので 上げておきます。
原理は簡単。Crouton で Ubuntu等 をインストールした上で、Ubuntu に VLC を入れるだけです。

未だに「Chromebookで CD、DVD、ブルーレイは再生できません」なんて記事があったりするのですが、それは話の前提が異なっている為であり、現時点では、そして、おそらく今後も「Chrome OS でのネイティブ再生はできません」という意味です。
Crouton などを使えば、物理的には再生「できます」。

## まずは Chromebook が認識する DVDドライブ を購入する
たぶん、Windowsで認識できる ほとんどの USBインターフェイスの DVDドライブならば、認識すると思います。
手持ちの機器がなく、新規に購入が必要な場合には、まぁ、認識しないものもあるとは思うので、メジャーなメーカーであれば大丈夫じゃないかなぁ。
新品でも、アマゾンとかで 2,000円 程度で購入できますね。

## Crouton で Ubuntu をインストール
インストール記事は 山程あるので、そちらをご覧ください。
私は、こんな感じでインストールしました。

```shell
$ sudo sh ~/Downloads/crouton -r xenial -t unity,xiwi,keyboard,audio,extension,touch
```

注意点としては、「audio」オプションを付けること。
オプション付け忘れたり、インストールがおかしくなって音がならない場合には、「-u」オプションを追加して、既存環境を更新してください。

## Ubuntu に VLC をインストール
普通に インストールすればよいと思います。

```shell
$ sudo apt install vlc
```

ただ、このままだと、デバイスファイル(おそらく、/dev/sr0) に読み取り権限がないので、DVD再生できないと思います。
/etc/rc.local などに、

```shell
/bin/chmod 664 /dev/sr0
```

を実行するように追加しておいてください。

これで、Chromebook で DVD映画などが普通に再生できるようになります。