OmniAICreator/Qiita-1.07M huggingface dataset:
第５回



# 出力メソッド

rubyでStringsを打ち出すのにはいくつかの方法があり，どれを使ってもいい．

| method | 使用状況                            |
|:-------|:------------------------------------|
| print  | 普通に使う．要改行                  |
| puts   | 次に普通に使う. 自動改行            |
| p      | codingの最中にdebugがわりに打ち出すとき|
| pp     | pのpretty print, require 'pp'が必要 |
| printf | cのがあります．formatを整えるときに便利|


# 簡単な解説

putsしたら普通はgetsなんですが，目的の一つであるshell環境ではcommand line interfaceで作業をするためにARGV[0]というのを使って行きます．

ARGV[0]というのは引数(argument)配列の0番目を意味しています．

"Hello Rudy."と打ち出させることをかんがえます．これをするにはいくつかの方法があります．

| puts  | puts "Hello " + ARGV[0]         |
|:------|:--------------------------------|
| puts  | puts "Hello #{ARGV[0]}"         |
| print | print "Hello #{ARGV[0]}\n"      |
| print | print "Hello " + ARGV[0] + "\n" |



------
 - **source** ~/grad_members_20f/members/Kazufumi0823/a2.org
【Rails】 備忘録：Deviseのモデル名を間違えて生成してしまったときの対処法

タイトルの通り、Rails Deviseのモデル名を間違えて生成してしまったときの対処法をメモします。

```terminal
$rails generate devise MODEL #任意のモデル名
```
このモデル名を間違えて生成してしまいました。
結果、以下のように複数ファイルが、間違えたモデル名で生成されました。

```terminal
Running via Spring preloader in process 12067
      invoke  active_record
      create    db/migrate/20201204011415_devise_create_models.rb
      create    app/models/model.rb
      invoke    test_unit
      create      test/models/model_test.rb
      create      test/fixtures/models.yml
      insert    app/models/model.rb
       route  devise_for :models
```

ではこれを削除するにはどうするかというと

```terminal
$rails destroy devise MODEL #任意のモデル名  
```
先ほどのgenerateの部分をdestroyにすればいいだけです。
これで先ほど尽かされたファイルや追記されたコードが削除されます。
ターミナルの結果にて確認できます↓

```terminal
Running via Spring preloader in process 12224
      invoke  active_record
      remove    db/migrate/20201204011415_devise_create_models.rb
      remove    app/models/model.rb
      invoke    test_unit
      remove      test/models/model_test.rb
      remove      test/fixtures/models.yml
       route  devise_for :models
```

もし、`$rails db:migrate`コマンドでデータベースを反映させてしまった場合はrollbackを実行して、データベースを元に戻してください。
と、その前にまずはどこまでmigrateされているか現在の状況を把握するところから始めます。
（現在の状況を知らずにとにかくrollbackを行うと、何をrollbackしてしまったのかわからなくなるからです。特にチームでやる場合は必須。）←だそうです（実務未経験です）


このコマンドで確認します。

```terminal
$rails db:version
Current version: 20201129095028
```
20201129095028（migrateした最新の日付）までmigrateされていることが確認できます。db/migrateのファイルを確認しながらやっていきましょう。
それでrollbackしても問題なければ、以下を実行します。

```terminal
$ rails db:rollback
```

ファイルが複数ある場合は $rails db:rollback STEP=3すればいいので
例えば3つあるとして、全てrollbackしたい場合は

```
$rails db:migrate STEP=3
```
と実行すればよかったですね。

もう一度同じ手順で、正しいモデル名でモデルを生成し、$rails db:migrate したら完了です。


何かおかしなところがあればご教授いただけると幸いです。


引用元:http://taremimi.hatenablog.jp/entry/2018/02/16/120343
snapのdockerを使ってみての感想

# 追記
docker-composeが古いのが思ったより不便なので最近はsnapを使わずinstallしています。

# 概要
ここ数か月、snapでインストールしたdockerを使っているので感想などを書きます。

# snapについて軽く解説
https://snapcraft.io/

linux向けのパッケージマネージャーです。
色んなディストリビューションに対応していてます。
ちなみにubuntuならプリインストールされているので最初から使えるはずです。

# dockerをインストール
https://github.com/docker-snap/docker-snap

snapで普通にinsltallするだけでOKです。
docker-composeも一緒にインストールされます。

```
sudo snap install docker
```

# sudoなしでdockerコマンドを使う方法について
ユーザーをdockerグループに追加した後にsnapでdockerを再起動します。

```shell
sudo snap disable docker
sudo snap enable docker
```

# ssh経由でdockerコマンドが使えない
ssh経由でコマンドを実行する時は `/snap/bin` にPATHが通っていないのが原因でした。
`.bashrc` などに書いても読み込まれないので、結局 `/etc/environment` に追加して解決しました。

# ディレクトリの制約
dockerがアクセスするファイルはホームディレクトリ配下に置く必要があります。
今のところ問題になっていませんが特定のケースで困るかもしれません。

# docker-composeでsnapのvolumeが使われてしまう
`~/.config` などをマウントしたくてもsnap側のディレクトリがマウントされてしまいます。
今のところキャッシュ用途に使っているだけなので問題になっていませんが、これも特定のケースで困るかもしれません。
しかもvオプションで指定した時は、ちゃんと指定したディレクトリがマウントされるので混乱しました。

# versionが最新ではない
dockerもdocker-composeもちょっと古いバージョンがインストールされます。
現状だとdockerはpatchバージョン、docker-composeはminorバージョンくらいの遅れがあります。

# おわり
備忘録として色々書きましたが実際のところ普通に使えているのでこのまま使用を継続しようと思います。
PHP 連想配列の値とキーを取得する方法

# 目的

- 連想配列に格納された値とそのキーを取得する方法をまとめる。

# 前提情報

- 下記サービスを用いて動作を確認した。
    - [https://paiza.io/ja](https://paiza.io/ja)
- 超基礎の内容であるが理解できていなかったのでまとめる。

# 詳細

- 下記のようにforeach文を使用することで値とキーを取得する事が可能である。

    ```php
    <?php
    $strList = [
        'str1' => 'こんにちは',
        'str2' => 'おはようございます'
    ];
    
    foreach ($strList as $key => $value){
      echo "キーは $key" . "\n";
      echo "値は $value" . "\n";
    }
    ?>
    ```

- 上記のコードを実行すると下記のように出力される。

    ```
    キーは str1
    値は こんにちは
    キーは str2
    値は おはようございます
    ```
Udemy講座「Reinforcement Learning: AI Flight with Unity ML-Agent」の紹介

>本記事は Udemy Advent Calendar 2020 (12/6) 寄稿記事として掲載しています。

Advent Calendarには別テーマですが昨年も参加しており、以下の記事を書かせていただきました。

![donkey.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213774/46bc55b9-a7fb-e428-6940-4eb9009393d2.png)


- [タミヤ楽しい工作シリーズをDonkeyCar化する](https://qiita.com/hara2dev/items/1c2c30a93c7fb8e9861d)

RCカーを自律走行化するためのOSS Donkeycar を流用して、タミヤのキャタピラ車を自律走行化させたという内容でした。

この Donkeycar のAIは、いわゆる「教師あり学習」という手法をとっていました。最初に手動で走行して学習データを取得してから、トレーニング処理にかけ、学習済みモデルファイルを生成、Raspberry Pi上にデプロイして自律走行させるプログラムを実行する、という流れになります。

学習データとして必要なデータ量は公式ドキュメントでは 2万件 ほど必要と書かれています（実際には1万件以上でも動作します）。1/20秒ごとに1件取得できるので、単純計算で17分弱の手動走行が必要になります。

..が、これがめんどくさくなってきたので、「強化学習」化しようと考えました。

> **注意**
> Donkeycarには [Donkey Simulator](https://github.com/tawnkramer/gym-donkeycar/releases) を使ったOpenAI Gym準拠の強化学習環境 [gym-donkeycar](https://github.com/tawnkramer/gym-donkeycar) があります。
> 標準的な Donkeycar の場合はこちらで十分ですが、私のつくった車(?)はキャタピラ車なので、そのままでは使用できません。

ただ、DonkeycarのAIの引数は画像イメージなので、このデータをプログラムで生成しなくてはなりません。

つまり Unity や Unreal Engine などの物理エンジンの入った2D/3Dプログラム開発ツールを使ってシミュレータを作る必要があるのです。

でも..Unityなんてまったく知らない..

いろいろ考えた結果、以下のUdemy講座を見つけました。

![snap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213774/a0457621-b08e-4e66-eca3-cef53c9f1cac.png)


- Udemy講座「[Reinforcement Learning: AI Flight with Unity ML-Agent](https://www.udemy.com/course/ai-flight/learn/lecture/17018098#overview)」

この講座は、AIが操作する飛行機と、自分の飛行機とでコースを周回するゲームを構築するという内容です。

Blenderで飛行機や障害物（岩）、コース（地面）をモデリングして、Unity上にとりこみ、振る舞いをC++で実装、ML-Agentというプラグインを使って学習済みモデルファイルを作成し、ゲーム化していくという流れになっています。

AI本体は、Donkeycar上にあるのでこの講座で紹介している内容では、飛行機がUnityの物理エンジンで動作するシミュレータ環境を作るところまでが流用できそう..ということで早速受講しました。

ただ..この講座.. **英語** ..なんですよね..

でも、講座の内容がほぼほぼ手順紹介動画なので、操作している動画だけを見て、なんとなくわかる用語をちょこちょこ把握しながら内容を掴むことはできました（このUdemy講座はキャプションがつくのでありがたかったです）。

手順はわかったので..いざシミュレータを作ろうとしたのですが..作ったエージェント（つまり自分が作ったDonkeycar）が複雑すぎて...正直、Blenderのところで手が止まっています..

..キャタピラを Blenderで表現するのが..難しい！


ただ、通常の４輪であれば上記講座を流用してシミュレータは作れると思いますので、ためしてみるのはいかがでしょうか。

ゲームで敵プレイヤーをAIで実装したい人にも、おすすめです。


> p.s.
>
>今年は PyTorch Advent Calendar にも寄稿しております。
>こちらも、よければご笑覧ください。
>
> - [Stable Baselines3 を使って強化学習をカスタムSIに使ってみよう](https://qiita.com/hara2dev/private/5adc655ec3867a4b862a)
【個人開発向け】失敗の経験と成功した人から学んだこと10選

個人開発の皆さん！４日目ですよー！(ぽっぽー)
さて、[個人開発 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/private-development) の４日目の記事でございます。

前日は @drytt さんによる [ホームページ運営のすすめ](https://qiita.com/drytt/items/4b28a59b87aaa6980f1c) でした。
個人開発者としてファンの獲得は大事だなぁと常々感じていましたが、自身の情報を**ホームページに集約**することでメリットが生れそうと感じました。詳しい内容は記事へ Go！

---

さて、本題です。**いまだに成功という成功は無く精進している最中**ですが、その中でも『これは明らかに失敗だった』や『これは成功者が言っていて効果がありそうだ』と思ったものを**10個にまとめ**てみました。

そして、私自身がアプリ開発を**始めたばかりの時に『こんな資料が欲しかった！』**と思うことを詰め込みました。

内容は (1)～(6) は企画段階の項目、(7) は開発段階の項目、(8)～(10) は運用段階の項目となっております。

それではどうぞ！

## (1) 企画：思いついたアイディアをすぐに作り始めないこと
- 思いついたときは**『すごいものを思いついてしまった！』と勘違いしがち**
- 期間を置いて冷静になったり、誰かの意見を聞いて客観的に見たらボツなアイディアかもしれない
- さらに**『作ったアプリが誰にも利用されない』を防ぐ**ために検討すべきことがある。次項目以降を参照

## (2) 企画：ユーザーのどんな課題を解決するのか検討すること

- よくやってしまう『こんな機能があれば面白い』を視点に企画を立てると、**ユーザーの心に刺さりにくく**、ちぐはぐで軸の無いアプリになりがち
- 使われるアプリを目指すなら**『ユーザーの課題から解決策を逆算』して企画を立てる**
- 例えば『通勤電車でサラリーマンが暇を潰したい』といった課題があれば、電車内を想定して『音は出さない』『短時間でサクッと遊べる』『画面を覗き込まれても恥ずかしくない』などの**解決策を企画に盛り込む**

## (3) 企画：ユーザーにどんな体験をしてもらうのか想定すること

- 『このアプリには〇〇機能があります』よりも『このアプリであなたは〇〇体験ができます』を念頭に企画した方が**ユーザーに刺さりやすい**

## (4) 企画：アプリを使うターゲット層とペルソナ設定を行うこと

- ペルソナ設定で対象を絞ることで、**実装する機能を明確に取捨選択**できる
  - 使われるかわからない機能の実装に時間を使わなくて済む
  - やるべきことが多い個人開発では時間が命！
- ターゲットを絞ることで**誰にも刺さらない、誰にも使われない状況を回避**する

## (5) 企画：顧客第一主義。ただしユーザーの言葉を鵜呑みにしないこと

- ユーザーの言葉に含まれる『真意・理由・課題』を汲み取る
- 有名な話で、自動車の無い時代に「速い馬車が欲しい」とユーザーの言葉を鵜呑みにしていたら自動車は発明されていない
  - 『速い馬車が欲しい』の真意は『速く移動したい』であるなら馬である必要はない

## (6) 企画：競合調査を必ずやること

- 競合で成功しているアプリを観察・参考にすることは、**成功するまでの膨大な試行錯誤を短縮**することに繋がる
- また競合さんとの差別化するポイントを明確しておくことも重要

## (7) 開発：極力最小限の機能に絞って実装して、まずは公開すること (MVP 開発)

- 不必要な機能に**無駄なコストをかける前に、市場の評価を理解**することができる
- 早い段階でユーザーの反応やフィードバックを集め、限りある時間の中で実装できる機能や不要な機能を予測できる
- 反応が薄ければ方向性を修正するか早期に開発をやめて別のアプリ開発に移行する
- 反応が良ければ継続して機能を追加していく
- 何回も**アップデートのリリースをすることで副次的に周知・集客**にもなる

## (8) 運用：アプリのユーザー分析をすること

- ユーザー分析を行うことでどのように利用されているかを把握し、目標達成や**成果の最大化**につなげる。

## (9) 運用：お問合せの１次対応は最優先で行うこと

- 対応の速さはユーザーの**安心感**に繋がる
- 対応の速さから**熱心なファンになって頂けたら得るものが大きい**
- 遅くてメリットになることは無い

## (10) 運用：マメな対応を心がけること

- カリスマ的な存在であれば別かもしれないけど、凡人であればマメな対応で**ファン獲得**につなげよう

# おわりに

ほかにも『これするといいよ！』みたいなご意見があればコメント欄で教えていただけると嬉しいです！あとリアルでエンジェルカード欲しいです。

明日は @yakipudding さんによる『Reactで作成したポートフォリオサイトをNextに移行した』です～よろしくお願いします！
Access VBA オブジェクト名を取得して名前を変更する



```
Option Compare Database

Sub GetTableName()
    Dim mymydb  As Database
    
    Set mydb = CurrentDb
    
    Debug.Print "スタート"
    
    'テーブル名を取得して変更
    For Each mytbl In mydb.TableDefs
        If Not Left(mytbl.Name, 4) = "MSys" Then
            Dim TName As String
            TName = mytbl.Name
            
            'DoCmd.Rename fKanaHan2Zen(mytbl.Name), acTable, TName
    
            Debug.Print fKanaHan2Zen(mytbl.Name) & "|" & TName
        End If
        
    Next
    
    'クエリ名を取得して変更
    For Each mytbl In mydb.QueryDefs
        If Not Left(mytbl.Name, 4) = "MSys" Then
            Dim QName As String
            QName = mytbl.Name
            
            'DoCmd.Rename fKanaHan2Zen(mytbl.Name), acQuery, QName
    
            Debug.Print fKanaHan2Zen(mytbl.Name) & "|" & QName
        End If
    Next
    
    'フォーム名を取得して変更
    Set ctn = mydb.Containers!Forms
    For Each mytbl In ctn.Documents
        If Not Left(mytbl.Name, 4) = "MSys" Then
            Dim FName As String
            FName = mytbl.Name
            
            'DoCmd.Rename fKanaHan2Zen(mytbl.Name), acForm, FName
    
            Debug.Print fKanaHan2Zen(mytbl.Name) & "|" & FName
        End If
    Next
    
    'マクロ名を取得して変更
    Set ctn = mydb.Containers!Scripts
    For Each mytbl In ctn.Documents
        If Not Left(mytbl.Name, 4) = "MSys" Then
            Dim MName As String
            MName = mytbl.Name
            
            'DoCmd.Rename fKanaHan2Zen(mytbl.Name), acMacro, MName
    
            Debug.Print fKanaHan2Zen(mytbl.Name) & "|" & MName
        End If
    Next
    
    'モジュール名を取得して変更
    Set ctn = mydb.Containers!Modules
    For Each mytbl In ctn.Documents
        If Not Left(mytbl.Name, 4) = "MSys" Then
            Dim MoName As String
            MoName = mytbl.Name
            
            'DoCmd.Rename fKanaHan2Zen(mytbl.Name), acModule, MoName
    
            Debug.Print fKanaHan2Zen(mytbl.Name) & "|" & MoName
        End If
    Next
    
    
    
    Debug.Print "エンド"
    
End Sub
Function fKanaHan2Zen(ByRef myString As String) _
                                      As String
    Dim i       As Long
    Dim strTemp As String
    Dim strKana As String
    Dim chrKana As String

    For i = 1& To Len(myString)
        chrKana = Mid$(myString, i, 1&)
        Select Case Asc(chrKana)
            Case 166 To 223
                '半角が続いたら文字をつなぐ
                strKana = strKana & chrKana
            Case Else
            '全角文字になったら半角の未処理文字を全部全角
            'に変換これにより濁点処理等が不要
                If Len(strKana) > 0& Then
                    strTemp = strTemp & StrConv(strKana, vbWide)
                    strKana = vbNullString
                End If
                strTemp = strTemp & chrKana
        End Select
    Next i
    '最後の文字が半角の場合の処理
    If Len(strKana) > 0& Then
        strTemp = strTemp & StrConv(strKana, vbWide)
    End If
    fKanaHan2Zen = strTemp
End Function

```
[Maya]ゲーム屋がogsRenderを使ってアイテムアイコン画像を作る

これは  [Maya Advent Calendar 2020](https://qiita.com/advent-calendar/2020/maya) の24日目の記事です。
Mayaで３Dモデルをレンダリングし、アイテムアイコンを作ります。
アイテムアイコンっていうのは、UIでアイテムを選択したりするときに出る小さい画像の事です。

#なんでMaya使うの？
ゲームエンジン側に撮影機能付いてればそれでいいと思います。
エンジニアがツール作る時間がなかったという理由もあるし、ある程度デザイン側で例外作るとか融通利かせられるというメリットもあったので、Mayaで撮影することになりました。
最近はUnity使ってるので、Unityに撮影ツール作っちゃってますが・・・。

##Mayaでレンダリングするメリット
イレギュラーなサイズのアイテムとか、カメラ角度を変更したいという希望に対応しやすいです。仕様変更や追加要望など、TAがいればデザイナーだけで完結するので小回りはききやすいかと思います。

最近は広告用イラストのポージングにも使ってますが、リグ呼び出してポーズ変えるのが楽だったりレイヤー分けしてレンダリング出来るので、そういうとこもメリットかと思います。(この場合は通常のBatchRender)

##Mayaを使うデメリット
ゲームエンジンの描画とは全く同一にはならないとこですかね。
アイコンって表示小さくなるので、似たような表示に出来るなら問題ないかと思います。

#どうやって作るの？
量産したいのでスクリプトでMayaを動かし、レンダリングします。
レンダリングには通常のrenderコマンドではなく、ogsRenderコマンドを使用します。

##ogsRenderとは?
http://help.autodesk.com/cloudhelp/2018/JPN/Maya-Tech-Docs/Commands/index.html
OGS はビューポート レンダラの 1 つです。
ビューポートの表示をそのまま撮影したいので使いました。背景やアルファもちゃんと抜けます。

##renderだと上手く行かなかった
前(Maya2016)はHardWare2.0がちゃんとレンダリングできなかったように思うので（うろ覚え）、ogsRenderコマンドに行きついたように記憶しています。
オリジナルのdx11Shaderを利用していたのも原因かも。

#処理の流れ
Mayaファイルを任意のスクリプトでバッチ処理するツール（Python製、今回説明は割愛）に撮影するファイル（複数）を入力
↓
下記のスクリプトでレンダリング
↓
画像加工する処理（Photoshop jsx、今回説明は割愛）

という流れで処理しています。

##コード

```python
# -*- coding: utf-8 -*-
from maya import cmds, mel
import os
import glob
import subprocess
import renderingSetup

#OGSレンダーでレンダリングする
def capture(rendertime, renderdir, renderCam, rendername, width, height):
    cmds.setAttr((renderCam + ".backgroundColor"), 0.0,0.0,0.0 ,type='float3')
    cmds.setAttr("hardwareRenderingGlobals.multiSampleEnable", 1)
    cmds.setAttr("hardwareRenderingGlobals.multiSampleCount", 8)
    cmds.setAttr("hardwareRenderingGlobals.ssaoEnable", 0)
    cmds.setAttr( "defaultRenderGlobals.currentRenderer", "mayaHardware2", type='string')
    cmds.setAttr( "defaultRenderGlobals.imageFormat", 19)   #bmp=20; jpg=8; TARGA=19; PNG=32
    cmds.setAttr( "defaultRenderGlobals.imageFilePrefix",(renderdir + rendername), type='string')
    cmds.ogsRender(camera=renderCam, w=width, h=height, f=rendertime)

    print  u"created."

#シーンのセットアップ
def CaptureSetup(filepath):
    cmds.file(filepath,o=True)
    mb = os.path.basename(filepath)
    name = mb.split('.')
    
    dir = filepath.split("scenes")
    cmds.workspace(dir[0], o=True )
    try:
        renderingSetup.main()
    except:
        return

    renderdir = "D:" #任意
    
    capture(0, renderdir, 'persp', name[0], 2048, 2048)


def main(pathlist):
    for filepath in pathlist:
        CaptureSetup(filepath)
	
if __name__ == '__main__':
	main()
```

##コードの説明
**mainで入力パスをforで回す**
複数一気に処理するためにパスリストを受け取っています。
ちなみにその前手の処理で、maya自体はmayabatch.exeで起動しGUIを出さないようにしています。
↓
**CaptureSetupでシーンを加工**
レンダリングする前に、カメラ角度を変更したり、場合によってはシェーダを差し替えたりしてモノに応じてセットアップします。
↓
**Captureで撮影**
ここでレンダリングしています。
hardwareRenderingGlobalsでHardWare2.0レンダラの設定をしています。
defaultRenderGlobalsでシーンに対するレンダリング設定をしています。

画像のフォーマットはdefaultRenderGlobals.imageFormatに対し番号で指定します。
https://knowledge.autodesk.com/ja/support/maya/learn-explore/caas/sfdcarticles/sfdcarticles/kA93g0000000ZzG.html

#メリークリスマス　イヴ
明日は[ryusas](https://qiita.com/ryusas)さんです。
サクラエディタ用アウトライン

# 初めに
自分で日付ごとにアウトラインで表示するのに
書きました

# サクラエディタ用アウトライン
細かい説明はありません

## アウトライン(Txt用)
``` :OutlineText.rul
#;Mode=Regex
;Mode=RegexReplace
;Title=アウトライン
;CommentChar=#

 #################
 ##メモ用
 #################
^(【|\(|《)(.*)(】|\)|》) /// ログメモ,Lv=1
^\t{1}(【|\(|《)(.*)(】|\)|》) /// ログメモ,Lv=2
^\t{1}(■|□|◇|◆)(.*) /// ログメモ,Lv=3
^\t{1}(\[)(.+)(\]) /// ログメモ,Lv=3
^\t{2}(■|□|◇|◆|・|※)(.*) /// ログメモ,Lv=4
^\t{2}(\[)(.+)(\]) /// ログメモ,Lv=4
^\t{3}(■|□|◇|◆|・|※)(.*) /// ログメモ,Lv=5
^\t{3}(\[)(.+)(\]) /// ログメモ,Lv=5
``` 

## アウトライン(日付ごと)


```text:OutlineDay.ru
#;Mode=Regex
;Mode=RegexReplace
;Title=アウトライン
;CommentChar=#

 #################
 ##ログメモ用
 #################
^(【)(.{4}年.{1,2}月)(】) /// $2 /// 日付メモ,Lv=1
^(【)(.{4}年.{1,2}月)(.{1,2}日)(】)(.*) /// $3$5 /// 日付メモ,Lv=2
#^(--------------)(\d{4}年\d{1,2}月\d{1,2}日)(.*)(--------------) /// $2 /// ログメモ,Lv=1 
#(【|\(|《)(.*)(】|\)|》) /// ログメモ,Lv=3
(\[)(.+)(\]) /// ログメモ,Lv=3
(■|□|◇|◆|・)(.*) /// ログメモ,Lv=4
^\t{1}(■|□|◇|◆|・)(.*) /// ログメモ,Lv=4
(■|□|◇|◆|・)(.*) /// ログメモ,Lv=5
^\t{2}(■|□|◇|◆|・)(.*) /// ログメモ,Lv=5
(■|□|◇|◆|・)(.*) /// ログメモ,Lv=6
^\t{3}(■|□|◇|◆|・)(.*) /// ログメモ,Lv=6

```
CentOS7,MySQL8でクローンとレプリケーションしてみた

# CentOS7,MySQL8.0でクローンとレプリケーションしてみた
はい皆さんこんにちは

今回はタイトルの環境でマスタースレーブのレプリケーション設定を行ったので記載していきます。
レプリケーションが壊れた時の手順も載せてあります。

# 詳細
初めてクローン技術を触ったため以下のサイトを参考にしました。
https://www.server-world.info/query?os=CentOS_8&p=mysql8&f=5
https://qiita.com/greedy/items/de175713baddb57f9f88

環境：
masterサーバ：CentOS7、mysql-community-server-8.0.21-1.el7.x86_64
slaveサーバ：CentOS7、mysql-community-server-8.0.21-1.el7.x86_64

注意事項：
今回は単純な準同期レプリケーションです。
いわゆるInnoDBクラスタみたいなことはしてないです。

##まずはクローンする
マスター側準備

```
  vi /etc/my.cnf
これらを入れる
  log-bin=mysql-bin
  server-id=203
  plugin-load=mysql_clone.so
mysql -u root -p
  create user 'repl_user'@'%' identified by 'password';
  grant replication slave on *.* to repl_user@'%'; 
  create user 'clone_user'@'%' identified by 'password'; 
  grant backup_admin on *.* to 'clone_user'@'%'; 
  flush privileges;
  SELECT user, host, plugin FROM mysql.user;
2ユーザーが追加されていること。
```
スレーブ側準備

```
  vi /etc/my.cnf
これらを入れる
  log-bin=mysql-bin
  relay-log=node01-relay-bin
  relay-log-index=node01-relay-bin
  server-id=202
  plugin-load=mysql_clone.so
  read_only=1
mysql -u root -p
  create user 'clone_user'@'%' identified by 'password'; 
  grant clone_admin on *.* to 'clone_user'@'%'; 
  flush privileges;
```

スレーブでクローンする

```
mysql -u root -p
set global clone_valid_donor_list = 'master:3306'; 
clone instance from clone_user@master:3306 identified by 'password'; 
select ID,STATE,SOURCE,DESTINATION,BINLOG_FILE,BINLOG_POSITION from performance_schema.clone_status; 
   [Completed] であればコピー完了
```

##続いてレプリケーション実施
これもスレーブで行う

```
mysql -u root -p
mysql> change master to
    -> master_host='master',
    -> MASTER_PORT=3306,
    -> MASTER_USER='repl_user',
    -> MASTER_PASSWORD='password',
    -> MASTER_AUTO_POSITION=1;

※mysql_native_password がどうたらっていうエラーが出る時、以下のSQLを実施しておいてください。
SELECT user, host, plugin FROM mysql.user;
⇒plugin 列を確認
ALTER USER repl_user@'%' IDENTIFIED WITH mysql_native_password BY 'password';
SELECT user, host, plugin FROM mysql.user;
⇒mysql_native_password に変わっていること


start slave;
show slave status\G

以下のようになっていること
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
　　　　　　　　略
             　Slave_IO_Running: Yes
            　 Slave_SQL_Running: Yes
```

##色々あって壊れたレプリケーションを再作成するとき
マスターもスレーブも両方実施する

```
mysql -u root -p
stop slave;
reset slave all;
reset master;
show master status\G
⇒何も出ない
show slave status\G
⇒Empty set (0.0058 sec)のように出る

続いてレプリケーション実施　の手順をスレーブ側で実施する。
```

##レプリケーション情報の保存先
```
mysql -u root -p
use mysql;
select * from slave_master_info;
⇒この中にあるHostが対象のもの。
select * from slave_relay_log_info;
⇒こちらはリレーログ
```

##感想
クローン便利で良いなと思いました。
ダンプリストアに比べてサーバで直接やりとりしているので、手間も速さも異なりますね。

**ありがとうございました。**
Lessで@importを展開しないでそのままCSSにする方法

ちょっと詰まったので備忘録として。

Lessで`@import`をそのまま使うと、外部のサイトでもインポートして展開されてしまう。`lessc`で変換しようにも社内のプロキシ環境で使うとコネクションエラーが発生するし、Google Fontsを使うときも展開しては欲しくない。`less.js`に動的に変換させればよいのだが、Internet Explorer 11では動かない。これは困った。


探していたら、ちゃんと[マニュアル (英語)](http://lesscss.org/features/#import-atrules-feature-css) に書いてあった。この`css`オプションを使えば展開されずにそのままCSSに出力される。

```css:sample.less
/* フォント設定 */
@import (css) url(https://fonts.googleapis.com/css?family=Noto+Sans+JP|Noto+Serif+JP|Roboto+Mono&display=swap);
```

```css:sample.css
/* フォント設定 */
@import url(https://fonts.googleapis.com/css?family=Noto+Sans+JP|Noto+Serif+JP|Roboto+Mono&display=swap);
```

Microsoftが自社サービスのInternet Explorerサポート終了を打ち出したので、Internet Explorerはもうそろそろ考えなくても良いかな。
Teachable Machine で簡単に機械学習を体験してみた

[Google Developers ML Summit](https://cloudonair.withgoogle.com/events/google-mlsummit) を視聴しました。
あまり機械学習には興味はないのですが、最近データを集めたり可視化したりする事があるので、何かデータを扱う上での参考になるかなというぐらいの気持ちでみていたところ、機械学習に関して面白いサービスが紹介されていたので、さっそく試す事にしました。

[Teachable Machine](https://teachablemachine.withgoogle.com/) は、画像、音声、ポーズを認識する機械学習モデルを簡単に作成できるサービスです。
サンプルデータが揃っていれば、アップロードして、トレーニングボタンをクリックするだけなので、5分もあれば学習した結果を試す事ができました。

## 試した内容
サンプルデータがすでに揃っていることもあり、我が家の猫を判別するモデルを Teachable Machine で作成してみることにしました。
最近撮影した `うちのねこ` の画像23枚と、ネットで適当に拾ってきた `よそのねこ` の画像20枚を使ってトレーニングしたモデルを使い、色々な画像に対してどう判定されるかみていきました。
![うちのねこ-さいきん.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/d100b323-75a7-389e-d5b2-22bed3dc3b9a.png)
ネットで拾ってきた画像はぼかしています。

## 結果
判定結果を一覧にしてみました。

| 対象       | 画像 | うちのねこの確率 | 
|----------|----|----------| 
| 最近のうちのねこ | ![IMG_9786.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/a2bbae2b-f341-b519-b6c9-df0acad49fb3.jpeg) | 92%      | 
| 昔のうちのねこ1 | ![IMG_9788.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/a5fb3b00-ea66-d04f-565c-8197437fc914.jpeg) | 96%      | 
| 昔のうちのねこ2 | ![IMG_9787.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/559fa869-e29c-570c-4f25-ac6dbf9e3fb6.jpeg) | 96%      | 
| うちのいぬ    | ![IMG_9270.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/093e71cf-2073-bbcb-30b3-305537669a20.jpeg) | 2%       | 
| よそのねこ1   | ![IMG_9700.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/ca423bbe-8333-080b-859d-4aff0a043436.jpeg) | 0%       | 
| よそのねこ2   | ![IMG_3350.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/a8c82d8b-8ee9-864f-43b5-19548f336431.jpeg) | 6%       | 
| よそのソマリ   | ![Somali-0011-480x480.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/a06588e4-ca86-e28d-ec6a-ad88447f85e2.jpeg) | 71%      | 
| よそのとら    | ![000137869.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/525d9781-dc63-1268-b526-bf416984e52e.jpeg) | 14%      | 

`うちのねこ` の画像に対しては、90%以上の確率で `うちのねこ` と判定されました。
どういう訳かわかりませんが、子供の頃の画像でも90%以上になったのには驚きました。

`うちのねこ` はソマリという品種なので、同じ品種の別の猫と比較すると、71%となりました。
ソマリではない場合と比べてかなり似ていると判定したのでしょう。

全体的にかなり正確に判定しているのではないでしょうか。

## まとめ
Teachable Machine を使って、簡単に機械学習を体験しました。
かけた労力に対して得られる結果がすごくて驚きました。

今回は `うちのねこ` の画像を使って機械学習モデルを作成しました。
もともとサンプルデータが揃ってるという理由もあるのですが、猫を選んだのにはもう一つ思うところがって、今の生体認証などで使われている技術を使えば、結構簡単に捨て猫の飼い主を追跡できるのではないかという思いがありました。
マイクロチップなどは埋め込む手術が必要だったり、読み取る機械が必要だったりしますが、携帯のカメラで判別できれば、手術も必要なく全ての人が飼い主を追跡できるようになります（そうなってくると、捨てるという行為が殺すに変わるだけかもしれないですが）。
ペットショップで売られる前の子猫時代に登録した顔の特徴と、成猫になって捨てられた時の顔の特徴が判別できるかがネックになりそうと思っていましたが、今回の結果だけみると少しは可能性はあるのかなという気もしました。
brewでpostgreSQLをインストール

#項目
1. インストールと設定
2. `pg_hba.conf`の設定
3. 開くだけ開く

#1.インストール
##インストール
```bash:bash
#とりあえず入れてみる
$ brew install postgresql

#バージョンを指定したい時は、
#brew install postgresql@バージョン(13.1とかそんな感じ)
```

##.bash_profileの設定
```bash:bash
#インストールした時にpsqlのPATH出てくるので(確か出て来たはず...)コピーしておく
#ホームディレクトリでvi使って開く
$ vi ~/.bash_profile

#一番下に追記
#これは例、自分のPATHをこれに従っていい感じにする
export PATH=/usr/local/Cellar/postgresql/13.1/bin/:$PATH
#export PATH=(自分のPATH):$PATHでいいんじゃないかしら

#.bash_profileの追記を適用する
$ source ~/.bash_profile
```

###注意！
**絶対`source ~/.bash_profile`をする前に`.bash_profile`に正しく書いているか確認する事！ 自分はミスって1時間ぐらいlsすら使えなくなった**<br>[もしやらかしたら](https://qiita.com/pokurin123/items/783575c526555ad9eae9)

#2.`pg_hba.conf`の設定
これが見つからなくてめちゃくちゃ時間かかった

```bash:bash
#sudo使ってpg_hba.confがどこに居るか探す
#これsudo使わないと出てこなかった
$ sudo find / -name pg_hba.conf
#多分検索結果の一番上ぐらいにそれのPATHが出てくる

#これもsudo (検索で出たPATH)で書き込む
$ sudo vi /Library/PostgreSQL/13/data/pg_hba.conf
```

```bash:
#こんな感じの表みたいのが一番下に並んでる
host    all         all         127.0.0.1/32          md5

#127.0.0.1/32とlocalって書いてあるやつの一番右をtrustに変更する
host    all         all         127.0.0.1/32          md5
host    all         all         local          md5
↓
↓
host    all         all         127.0.0.1/32          trust
host    all         all         local          trust
```

```bash:bash
#psqlを再起動
$ brew services start postgresql
```

#3.開くだけ開く
##ローカルにあるDB一覧
```bash:bash
$ psql -U postgres -l
```

##psqlを開く
```bash:bash
$ psql -U postgres
```

##データベースを選択してDBを開く
```bash:bash
$ psql -U postgres ~~~
```

##DB作成
```sql:sql
-- DB内で
# CREATE DATABASE ~~~;
```

#4.終わりに
PATH通しだけは気を付けろ...

#5.追記
`psycopg2`は`pip3 install psycopg2-binary`で行けた気がする
uminにwordpressを導入してみた

先日[umin.ac.jp]("https://www.umin.ac.jp/")にwordpressを導入して欲しいとの依頼を受けました。
色々と勉強になったのでメモがてらQiitaに記載することにしました。

<h1>uminとは</h1>

生物系、医療系研究職のためのネットワークサービスだそうです。
正直今まで全然知らなかったのですが、医療系ではかなり利用している方が多いとか。
研究支援のために様々なサービスを展開しているようです。
（正直私もイマイチわかっていないw）

<h1>wordpress導入の背景</h1>
とある教授の研究紹介サイトがumin上にありました。それをリニューアルしたいとのご相談を受けました。
というのも、自分で更新が出来ないようです。
それは大変ですね、自分で情報が更新できない研究サイトってもはや正直何のための研究サイトなのかよくわかりません。
どんどん情報をアップデートしてこそホームページの意味があると思うので引き受けることにしました。
無料で使えてコーデイングの知識がない人でも簡単に更新できると言えばwordpress！
なので今回はuminにwordpressを導入することにしました。

<h1>uminにwordpress導入までの大まかな流れ</h1>
ざっくりとした流れとしては
1. uminにssh接続
2. mysql導入のための準備
3. mysqlインストール
4. mysql起動
5. mysql初期設定
6. db作成とwordpress導入


<h1>wordpress導入するために参考にしたサイト</h1>
https://plaza.umin.ac.jp/kikkenlab/note/umin-wordpress/
https://plaza.umin.ac.jp/shoei05/wp/index.php/2020/10/13/6/#datadir%E3%81%AE%E8%A8%AD%E7%BD%AE

正直これらのサイトにかなり丁寧に導入方法は記載があったのでこれらを見ながら導入しました。

#uminへのwordpress導入で詰まった点#

上記サイトを見ながら実施して私自身が最も詰まったのは、
**4. mysql起動**
までの肯定です。
ここまで出来れば後は非常にスムーズでした。

```
/mysql.server start
```

を叩いても

```
Starting MySQL. SUCCESS!
```

が出てこない・・・
という部分で半日ほど詰まりました・・・
その時のエラー文がこちら

```
Starting MySQL.. ERROR! The server quit without updating PID file (/home/{your account}/tmp/mysql.pid).
```

私のあかん所ですが、このエラー文を読んで、
「あっPIDファイルがなんか変なんか」と
思い込んでしまい、
PIDファイルについて調べまくってその部分だけをあーだこうだ修正していました。
このエラー文ググってしらべまくりました。

しかし何回しても上手くいかず、
mysqlが入っているディレクションを全部消してまた入れるという作業も何回か実施しましたが、
それでもダメで・・・

そこで気付いたのがエラーログです！！
このエラーどこでふいてるんや？
と調べてみると、

```
/mysql_data/mysqld/ 
```
配下にありました。
そのログの中身を見てみると・・・・
*エラー文章発見！！*

エラー文章のスクショ撮るの忘れましたが、
要するに
**port番号#### (私が記載した番号)で大丈夫？**
というようなエラー内容でした。

全然PIDファイルちゃうやん！！
というのが私の率直な感想ww

uminは自分でport番号を設定しなくてはいけないのですが、

```
$ netstat -nat | grep LISTEN | awk '{print $4}'
```
で既に使われているport番号を調べてまだ使われていないport番号を入力しなくてはいけないんですよね。

**ここのport番号が既に使われている番号を使用していたのが大きな原因でした。**

ざっと見て大丈夫そうなport番号を入力したのですが、
結果的にはその適当に選んだport番号が既に使われているport番号やったからサーバーが起動しなかったのです。

このport番号をちゃんと調べるのがまぁ意外と面倒くさくて、
既に使われているport番号が一覧で表示されるのですが、数字の順番とかではなくランダムなんです。
つまり被らないport番号を見つけるために、
私は一旦exelに落として、数字順番に並び替えて番号を調べました。

そしてport番号を入れ直すと、

```
Starting MySQL. SUCCESS!
```

やっと出た！！
mysqlだけ入れば後はもうスイスイです。

こんな些細なことに半日も時間費やしたのがもったいなくて・・・
気づいた時逆に落ち込みましたw

**エラーが出た時はログを見るという当たり前の行為を忘れないようにしなくてはいけませんね・・・**
深く反省・・・
Python3 入力の指定方法 6種

#背景
AtCoder等の競技プログラミングの問題では入力の形式が指定されます．
その際，あらゆる入力形式を指定されるため．その都度コードを考えなくてはいけません．
どうせならそんなところで時間を割きたくはないですよね？
そこで，本記事ではAtCoder Beginners Selectionにおける10題に沿って入力形式とそのコードをまとめます．
問題解説は[こちらの記事](https://qiita.com/katsuofukuoka0225/items/b588e672e1a3ca8fa483)を参照してください．


#標準入力
最もシンプルな入力

##str型
```python
a = input("表示される文章")
```
デフォルトがstr型なので最低限のコードで済みます．
ここでは入力を変数aに代入しています．
数値を入力しても文字列として認識されますのでご注意ください．

##int型
```python
b = int(input("表示される文章"))
```
input全体にintを適用します．
またAtCoderでは数値入力の際に文章を表示させる必要はないので，以下のコードで大丈夫です．

```python
c = int(input())
```

#縦に複数（定数）の入力
標準入力のコードを入力して欲しい数だけ書くだけです．
もし，数値で入力を3つ受付けたい場合であれば以下のコードで書けます．

```python
a = int(input(""))
b = int(input(""))
c = int(input(""))
```
入力時は一つの数値を入力するたびにEnterを押すと，上の変数（ここではa）から順に代入されていきます．

#縦に複数（可変）の入力
ユーザの入力によって，入力されるべき値の個数が変わる場合，具体的には以下の場合について説明します．

```python
N
d1
d2
d3
:
dN
```
ここではユーザの最初の入力がNの場合，N個の入力行を示さなくてはなりません．
for文でN回入力欄を出力するというようなコードを書けばいいのです．

```python
N = int(input())
d = [int(input()) for i in range(N)]
```

#横に複数(定数)の入力
AtCoderでは頻出してこの入力方法を指定されます．
一行で三つの値（例えば a b c）の入力を要求された際は以下のように書きます．

```python
a,b,c = map(int, input().split("何で入力を区別するか"))
```
map関数に関してここでは多くを語りませんが，第一引数で指定した物を第二引数に適用していくような感覚です.（間違っていたらご指摘ください）
split()の()の中身は入力を何で区別するかを指定しています．
コロンで入力を区切りたかったら(":")と書きます．
AtCoderの練習問題ではスペースで区別することしか指定されませんので，以下のコードで大丈夫です．

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

#横に複数(可変)の入力
先ほどと違って入力すべき値の数がユーザからの入力によって変わる以下のような場合を説明します．

```python
A1 A2 A3 A4 ... AN
```
この場合は予め代入する変数を固定数個用意することはできませんので，入力された複数の値を一つのリストとして扱います．（他の方法もあると思います．）

```python
N_list = list(map(int, input().split()))
```
これにより，一行に可変数個の入力に対応可能です．

#横に複数（定数）の入力を縦に複数（可変）入力
これはAtCoder Beginners Selectionの最後の問題'Traveling'にて要求されます．
タイトルを見てもなんのことかわからない方もいると思いますので，入力の指定方法を具体的に書きます．

```python
N
t1 x1 y1
t2 x2 y2
:
tN xN yN
```
正直，いきなり出会ったら解くことに悪戦苦闘すると思います．
ですが，ここを読んでいる方はきっとこれまでの問題，上記であげた入力方法をマスターしていると思いますので，単にそれらを組み合わせればいいのです．

```python
N = int(input())
points = [map(int, input().split()) for i in range(N)]
```
この入力方法ではpointsというリストの各要素にオブジェクト（t,x,yのセット）が入っています．
インデックスを指定してあげれば任意のオブジェクトが参照できます．
オブジェクトの中身を参照するのは少し難しいかもしれませんが，挑戦してみてください．
実際の問題については別の記事で触れます．

#最後に
これでAtCoder Beginners Selectionに登場する入力方法は全てカバーできました．
もちろん，ここに書いた方法が全てではないですし，もっと効率のいいコードも存在するでしょう．
自身も競技プログラミングを始めたばかりなので至らぬ点も多いですが，この記事が皆様のお役に立てれば嬉しく思います．
ここまで読んで下さった方々，ありがとうございました．
Cloud Identity Free Edition の設定メモ

# Cloud Identity Free Edition とは

https://support.google.com/cloudidentity/answer/7319251?hl=ja

# Googleアカウントの準備
今回、次の３つのアカウントを例に設定します。

1. 開発者アカウント - プロジェクトの開発者用です。
1. 管理者アカウント - サービス提供する管理者です。
1. 支払者アカウント - プロジェクトのパトロンです。

# ドメインの取得
前提として、支払者アカウントで、既にドメインを取得しています。

# Cloud Identity の開始

1. 管理コンソールで[IAMと管理]→[IDと組織]をクリックします。
2. [お申込み]をクリックします。
3. [次へ]をクリックします。
4. 会社名や従業員数を記述し、[次へ]をクリックします。
5. 国の選択を行い、[次へ]をクリックします。
6. ドメイン名を記述し[次へ]をクリックします。
odoo - Fontの変更

Custom font という仕組み。

自動生成される web.assets_backend.css の body { Font-Family } に IPAmjMincho を追加。
font-family: "Odoo Unicode Support Noto", "Lucida Grande", Helvetica, Verdana, Arial, sans-serif;

生成されたcss
http://localhost:8069/web/content/235-a50e7a9/web.assets_backend.css

"Odoo Unicode Support Noto"が出現する箇所。
/* /web/static/src/scss/import_bootstrap.scss defined in bundle 'web.assets_backend' */
/* /web/static/src/scss/webclient.scss defined in bundle 'web.assets_backend' */
`.o_web_accesskey_overlay{font-family: "Odoo Unicode Support Noto", "Lucida Grande", Helvetica, Verdana, Arial, sans-serif;}
`

``` addons\web\static\src\scss\import_bootstrap.scss
???
```

``` addons\web\static\src\scss\webclient.scss
.o_web_accesskey_overlay {
    font-family: $font-family-sans-serif;
}
```

``` addons\web\static\src\scss\bootstrap_overridden.scss
// Fonts
//
// Font, line-height, and color for body text, headings, and more.

$font-family-sans-serif: o-add-unicode-support-font(("Lucida Grande", Helvetica, Verdana, Arial, sans-serif), 1) !default;

```

``` addons\web\static\src\scss\utils.scss

// Odoo defines a limited Noto font-family for a small variety of unicode
// characters that are not necessary defined in the user system or even defined
// but not properly readable. This function allows to add this font family in a
// given font list.
//
// @param {list} $font - a list of font names ending with the generic one.
// @param {integer} [$index] - the position where to add the support font, if
//        not given, it will be placed before the generic one.
@function o-add-unicode-support-font($font, $index: false) {
    @if $index == false {
        $index: length($font);
    }

    $-with-support-font: ();
    @for $i from 1 through length($font) {
        @if $i == $index {
            $-with-support-font: append($-with-support-font, 'Odoo Unicode Support Noto', $separator: comma);
        }
        $-with-support-font: append($-with-support-font, nth($font, $i), $separator: comma);
    }

    @return $-with-support-font;
}

```

**ヒント　（追記：2021/07/29）**
デフォルトフォントをアラビア文字に変更するモジュール実装
https://apps.odoo.com/apps/modules/14.0/nati_arabic_font/
PowerAutomateでアンケート結果から会議招集を送る②

PowerAutomateでアンケート結果から会議招集を送る①は[こちら](https://qiita.com/snow_sch/items/720b6fe589994a6aba63)

# 前提条件
- Office365を使用しており、以下のサービスは使用できる
    - Outlook
    - Excel
    - Teams
    - Forms
- CDS（Common Data Service）は使用できない

# 作ったPowerAutomate
以下のような流れになっています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895455/c1323d87-9d3f-2cad-3f7a-14174cf57d16.png)

「新しい応答が送信されるとき」「応答の詳細を取得する」については、①の記事をご確認ください。

# 詳細
今回はExcelにFormsの回答を出力して、人数分の回答が集まったか確認するところまで記載します。

### 4.Excelに回答内容を保存するためにExcelファイルを用意する
本当は回答結果を全件まとめて取得できたらいいのですが、やり方がわからなかったので、
1件ずつExcelファイルに保存していきます。
とりあえずExcelファイルを作成して、結果を保存するようにテーブルをつくります。
[テーブルとして書式設定]したら、テーブルになるので、
そのあとにテーブル名をつけます。
Excelのテーブル名のつけ方は公式を参考にしてください。[こちら](https://support.microsoft.com/ja-jp/office/excel-%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E5%90%8D%E5%89%8D%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B-fbf49a4f-82a3-43eb-8ba2-44d21233b114)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895455/5dd4f406-a7b0-a7fb-d5bc-628c1f00fe68.png)

今回はいったん「回答」という名前をつけました。

このテーブルの「保管１」～「保管５」は回答を分解するようの数式がはいっています。
チェックボックスの回答としているとき、複数チェックがついて回答があると、以下のようになるようでした。
`["2020-12-14","2020-12-15","2020-12-16"]`
アンケートの選択肢は5こなので、最大5つまで分解できるように用意しています。
数式は「保管１」なら`MID(F3,3,10)`という感じで、とりあえず[MID関数](https://support.microsoft.com/ja-jp/office/mid-%E9%96%A2%E6%95%B0%E3%80%81midb-%E9%96%A2%E6%95%B0-d5f9e25c-d7d6-472e-b568-4ecb12433028)で取得しています。

### 5.回答保存用のアクションをつくる
今回は「表に行を追加」のアクションを使用しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895455/62ca48ad-2be2-88d9-6243-5d24c7f517fd.png)
自分のOneDriveなど、クラウド上に先ほど作ったExcelをおき、その場所やファイルを指定します。
[場所][ドキュメントライブラリ][ファイル]を指定すると、
[テーブル]のところに指定したExcelファイル内に存在しているテーブルの名称が表示されるので、
先ほど作成したテーブル「回答」を選択します。
[テーブル]を指定すると、そのテーブルの項目（「回答日付」「保管１」～「保管５」）が表示されます。
今回は「回答日付」に、Formsで取得した「参加できない日を選択してください」を指定します。

作成した際、「保管１」～「保管５」はExcelに直接数式を埋め込みましたが、
アクションで変換したものを指定することができるかもしれません。

この辺で一度保存して、フローのテストをしてみることをお勧めします。

### 6.全員分の回答が集まっているかどうかの条件を追加する
今回の目的は「参加者全員分の予定がわかったら」→「会議招集を送る」ことなので、
全員分の回答が集まっているかどうかをチェックします。
分岐はアクションの「コントール」を選択し、「条件」を選ぶことで追加できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895455/986937da-7c21-c4aa-4d7c-38f5474795ba.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895455/a28759bf-dd8f-c697-c46f-0401fe112b5a.png)

Formsの回答IDがどうやら1から順番にカウントアップしていくようなので、
今回の打ち合わせメンバー数の4人より多いことを期待して「4」以上としました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895455/f68506a6-6eba-5a12-f00c-b7179b376ada.png)


# 今回はここまで
次回の記事では、Excelからデータを取得し、Teams会議を送る部分を記載します。
J-Linkでデバッグ可能な統合開発環境で本格的なmicro:bit組み込み開発

# BBC micro:bit
micro:bitはプログラミング可能な小さなコンピューターで、学習や教育が楽しく簡単に出来るようにデザインされています。
広く小学生向けのプログラミング教育に活用されていますが、Nordic社のnRF51822を搭載しており、本格的な組み込み開発も可能です。

# 統合開発環境
https://www.segger.com/fileadmin/videos/BBC_microbit_J-Link_upgrade.mp4?autoplay=1

## Segger Embedded Studioのダウンロードとインストール
次のページからインストーラーをダウンロードします。
https://www.segger.com/products/development-tools/embedded-studio/

今回、`Embedded Studio for ARM, Windows, 64-bit` の `v4.52c [2020-05-18]` をダウンロードしました（[Setup_EmbeddedStudio_ARM_v452c_win_x64.exe](https://www.segger.com/downloads/embedded-studio/EmbeddedStudio_ARM_Win_x64)）。

ダウンロードしたインストーラーを起動し、デフォルトのままインストールを進めます。
非商用利用であれば、無料で利用できるようです。

## micro:bit向けパッケージの追加（nRF CPU）
Segger Embedded Studio を起動し、[Tools]-[Packege Manager...]でパッケージマネージャーを開き、NORDIC社の`nRF CPU Support Package`を選択後、ダブルクリックで、Actionを`Install`にします。
`Next`ボタンで、ダウンロードとインストールが実行されます。

```
Download and install:
- CMSIS 5 CMSIS-CORE Support Package 5.04
- Nordic Semiconductor nRF CPU Support Package 8.32a
```

## J-Linkのダウンロードとインストール

次のページを参考に、[`BBC micro:bit J-Link OB Firmware`](https://www.segger.com/downloads/jlink#BBC_microbit)をダウンロードし、micro:bit本体にインストールします。
Upgrading the BBC micro:bit DAPLink to J-Link
https://www.segger.com/products/debug-probes/j-link/models/other-j-links/bbc-microbit-j-link-upgrade/

### ファームウェアのダウンロード
[`BBC micro:bit J-Link OB Firmware`](https://www.segger.com/downloads/jlink#BBC_microbit) をダウンロードします（`JLink_OB_BBC_microbit_17-03-24.hex` [2017-03-24] 153 KB）。
https://www.segger.com/downloads/jlink#BBC_microbit

### メンテナンスモードでの起動
`micro:bit`本体のリセットスイッチを押しながら、USB通信ケーブルで、パソコンに接続します。
すると、通常とは異なり、ドライブ名が`MAINTENANCE`として認識されます。

### ファームウェアのインストール（書き込み）
ダウンロードしたファームウェアを`MAINTENANCE`ドライブへドラッグアンドドロップでファイルの書き込みを行うとインストールが行われ、自動的に`micro:bit`が再起動します。

# サンプルソースコード
ファームウェアをダウンロードしたページで、サンプルソースコードをダウンロードできます。

1. [`Sample project - LED Blink`](https://www.segger.com/downloads/jlink#BBC_microbit)をダウンロードし、解凍します。
1. `micro:bit`本体をパソコンにUSB通信ケーブルで接続します。
1. 解凍したフォルダの中に、`Microbit_LEDBlink.emProject`というプロジェクトファイルがありますので、それをダブルクリックで開きます（`Segger Embedded Studio`が起動します）。
1. [Target]-[Connect J-Link]で`micro:bit`に接続します。
1. [Debug]-[Go]で、ビルドと書き込みが行われ、`int main(void)`で、デバッガが一時停止します。
1. さらに、[Debug]-[Go]で、実行が再開され、サンプルソースコードの通り、LEDが点滅を繰り返します。

# nRF51 SDK
https://devzone.nordicsemi.com/nordic/nordic-blog/b/blog/posts/segger-embedded-studio-a-cross-platform-ide

https://infocenter.nordicsemi.com/pdf/getting_started_nRF5SDK_ses.pdf
.bash_profileいじったらlsも何もかも死んだ

#始まり
`.bash_profile`いじって`source ~/.bash_profile`したらかなりやばくなった

#終わり
いろいろ調べた結果

```bash:bash
$ export PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin
```

で治った！<br>(なんか`.bash_profile`の中身が無くなった気がするが死ぬよりはマシ)
[AWS] AWSにユーザー登録しました

#AWSにユーザー登録しました

本日（2020/12/04）AWSにユーザー登録してみました！　というだけの投稿です。

「今後 12 か月は、無料利用枠の制限内で主要な AWS コンピューティング、ストレージ、データベース、およびアプリケーションサービスに無料でアクセスしていただけます.」とのことです。

以下の設定をしました。

1. AWS マネジメントコンソール　→　マイ請求ダッシュボード
2. Billing の設定
    3. E メールで PDF 版請求書を受け取る　をON
    4. 無料利用枠の使用アラートを受信する　をON
    5. 請求アラートを受け取る　をON
6. 請求アラートを管理する　をクリック
    7. CloudWatchの画面が開くので、請求額が5ドルを越えたら通知がくるよう設定
Hololens2 備忘録

# **Hololens2 備忘録**
**UnityEditorとHololens2の乖離**
UnityEditor上では動作するが、いざhololensにビルドしてみると想定した動作が起こらない現象がありますよね。そこで実際に困ったことを共有していきたい

**VRMファイルのモデルが出力されない（確認できない）**
この問題に対して、
・しっかりと配置できていない。（遠い位置に配置してしまっているなど）
・ビルドの設定？
・Solvers(ソルバー)を使っていて何かのミスでどこかに配置されていて見えない
など複数の原因が存在していると考えられる

**1つ目しっかりと配置できていない**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/824949/9637f21b-f741-392d-3393-cd009cfddd43.png)
こんな簡単な事分かるわ！と思うかもしれませんが説明します  
MixedRealityPlayspaceのオブジェクトをクリックするとSceneタブで、オブジェクトが認識される空間が確認できます。
この空間でカメラのポイントよりも遠かったり、X方向から見た時に上過ぎたりすれば、HoloLensでそのオブジェクトの位置を確認することは難しいです。
そして、オブジェクトのスケールは大きいよりも小さいほうが扱いやすい気がします。

**2つ目はビルドの設定**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/824949/d4bb50f6-fabe-5f07-b965-75fdaef3140d.png)
これはVRMファイルのモデルが出力されない時に、調査して分かったことなのですが、
Stereo Rendering Mode がSingle Pass Instancedになっていると右目だけしか表示されないようです。なのでMulti Passに変更しましょう。
HoloLensで見えているが、動画を取るとVRMのモデルが消えてしまうという場合にもMulti Passの設定が有効です。[こちらを参考](https://bibinbaleo.hatenablog.com/entry/2020/04/15/115116)にした

3つ目はSolvers(ソルバー)を利用している場合
ところで[Solvers(ソルバー)](https://hololabinc.github.io/MixedRealityToolkit-Unity/Documentation.ja/README_Solver.html)
とは、簡単に説明するとMRTKで用意されている機能で、オブジェクトを特定の位置に固定させたり、距離を指定して手に追従させたりすることが出来ます。
HoloLens２の実機でHandMenuやSolverなどが動作しない場合の対処方法についてこちらの[記事](https://blog.hololab.co.jp/entry/2020/09/27/232640)を参考にするとよい。
MRTK2.5にすることによってSolverの不具合を解決できる様だ
MRTK2.5をインポートする分かりやすい[記事](https://qiita.com/chomado/items/ff21e57aa563191f3be0)
#**Hololen2で撮影した動画をPCへ送る方法**  
これは、調査してもなぜか簡単な方法があまり出てこなかった、検索するとアプリをインストールする方法などが出てくるが他にも方法はあります。
多分簡単すぎて、載せる必要が無いのかな

PCでエクスプローラーからHoloLensにアクセスしてPictureフォルダ内にある動画をコピーしてくれば送れます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/824949/df4cc5e0-637b-dc2a-6669-38e434724f66.png)
非常に簡単です（笑）
【Panoptic Segmentation】Semantic FPN : FPNはなかなか効率的らしい

<h1>Panoptic Feature Pyramid Networks</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/a151327e-0e75-8e84-37fb-2c31d5dc78c9.png)

Panoptic SegmentationにFPN(Feature Pyramid Network)を使用してみたという論文である


<h1>新規性</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/47fcaab8-2d1d-5835-29bb-3b6d3f67f766.png)<h2>PanopticでFPNを使ってみた</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/1f1dc613-449c-8b55-5fb7-838412f036a6.png)
3解像度の出力それぞれから得たROI(物体がありそうなエリア)すべてに対してSemantic Segmentationをする事でInstance Segmentationを行っている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/bdd5e1d1-2b02-d123-c838-7eb166049a4f.png)

3解像度の特徴量を全部足したFeature Map(黒いやつ)を使ってSemantic Segmentationを行う

<h2>FPNの効率性の実験</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/bfd52510-e9a6-88bb-ebae-b4ee688d0a2d.png)

(b)(c)(d)が1/8の解像度で出力する時に良い結果を出せるモデルの代表例。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/1ead04da-a5b4-d61f-57ac-59ff30a9c349.png)
掛け算足し算の数(左図)とメモリの消費量(右図)を比べてみるとFPNが一番計算量が小さくてメモリの使用量が少ないのが分かる。

<h1>結論</h1>
・Dilated / Symmetric Decoder よりFPNが一番計算コストとメモリコストが小さくお得

いろんな論文にFPNが使われているのも頷ける

<h1>参考文献</h1>
Panoptic Feature Pyramid Networks
https://arxiv.org/pdf/1901.02446.pdf
[ServiceNow]インポート・エクスポートのあれこれ

#概要
インポート・エクスポート使用時の注意事項

#1．Excelインポート時のフリガナ問題
###事象
　ユーザテーブルに、適当にExcelインポートをしてみる。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/bfbe6573-99a9-1b94-821b-f1d198dc2465.png)


 登録された・・・が、名前に変なものがつく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/98d8940c-11d2-fe5b-17b9-68c12ad748b8.png)

###原因
　作成したExcelに実はフリガナが隠れている。
[フリガナ非表示]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/fcbfb865-7325-a981-f6ac-68b53c2e8b0e.png)

[フリガナ表示]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/b7d77c4e-03bc-37b5-da45-bd4c4aaeeede.png)

ServiceNowのインポート機能では、Excelが裏で持っているフリガナまで含めて全部インポートしちゃう。


###対処
Excelからフリガナを消す。
[フリガナ表示]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/6379becc-1d2b-8db9-8816-cf5214b8e4f4.png)

###結果
ちゃんと登録された( 'ω')／
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/79ff854a-2ceb-29fa-d109-3dc343679973.png)



#2．エクスポート時の文字化け
###事象
　以下のデータをCSVにExportしてみる。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/962401df-92e8-bd70-a4d1-86e57392329c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/f8c35585-e28d-be6f-2e00-80272f085772.png)

日本語で設定した「Short Description」「Caller」が以下の通り、正しく出力されず、?に化けてしまう。
【テキストエディタで開く】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/3d1a5e85-d487-6fb8-19c6-1f57b3baca89.png)
【Excelで開く】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/208da781-c165-e0e7-1410-6a5f9212b2be.png)

###原因
　デフォルトの、CSV出力時の文字コードが日本語を扱えない文字コードになっているのが原因。
　System properties>Import Export で、CSV FormatのExport Charsetを確認すると、
　デフォルトの文字コードが「windows-1252」となっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/ccf970d8-c2ea-60b5-3a6d-45059e543ac1.png)

###対処
　該当プロパティ値の文字コードを変更する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/403dae20-34f1-b8fd-f4a5-cc52e7db3716.png)

###結果
　プロパティを変更したうえで、再度CSVを出力すると、日本語が正しく出力される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/641ea7c8-1cc5-ba5a-389d-62336fa47256.png)


以上。
Junit5でのmockitoの使い方まとめ


Junit4の資料は検索するとわりと出てきたがJunit5だと参考資料が少なかったため書きます。
#Junit4とJunit5の違い
・PowerMockitoが使えない
一番大きいのはこれです。private関数のモック化などをJunit4ならPowerMockを使ってできるんですけどJunit5だとそもそも使えない？らしい。


#Junit5でのmockitoの使い方
```
        //モック設定
        //メソッド内で宣言しているコンストラクタのモック
        MockedConstruction mock = Mockito.mockConstruction(newInstance.class, (mock, context) -> {
            newInstance mockClass = mock;
            Mockito.doNothing().when(mockClass).returnText(Mockito.any());
        });
        //フィールドに宣言しているコンストラクタのモック
        Mockito.doNothing().when(this.fieldClass).returnInt(Mockito.any());

        //テスト対象のprivate関数のモック
        Method method = test.class
                .getDeclaredMethod("testMethod"
                        ,String.class
                        ,int.class);

        method.setAccessible(true);

        //テスト実行
        method.invoke(test
                ,"aaaaa"
                ,111
        );
        mock.close();

```
javascript 問題集 No.28 String.splitを自作せよ

ルール上splitを使うことができないので、for文を回して”,”が出るまで最終の[]にpushしていく。

学んだこと
array=["abc","abc","abc"]を作る時

array=[]
obj=""

for~
if~ array.push(obj)
else~ obj+=abc

＜ポイント＞
・空白の""の中に入れる時は+＝を使える。
・最後は","がないので、pushすること。
vueにaxiosを導入するまでのプロセスを記録した(エラー含む)



```javascript
$ vue add axios
```

その後、ブラウザを確認。生成されたaxios.jsファイルのoptionが使われていないというエラー。
↓

```javascript:src/plugins/axios.js
                               ↓これが使われていない。
Plugin.install = function(Vue,option) {
  Vue.axios = _axios;
  window.axios = _axios;
  Object.defineProperties(Vue.prototype, {
    axios: {
      get() {
        return _axios;
      }
    },
    $axios: {
      get() {
        return _axios;
      }
    },
  });
};
```




手動で消した。
↓


```javascript:src/plugins/axios.js

Plugin.install = function(Vue) {
  Vue.axios = _axios;
  window.axios = _axios;
  Object.defineProperties(Vue.prototype, {
    axios: {
      get() {
        return _axios;
      }
    },
    $axios: {
      get() {
        return _axios;
      }
    },
  });
};
```

↓
再度ブラウザで確認
↓
error

```javascript

compile error
./src/main.js Module build failed (from ./node_modules/@vue/cli-plugin-eslint/node_modules/eslint-loader/index.js):
Error: Cannot find module 'eslint/lib/formatters/stylish' Require stack:
```
↓

この記事(https://tmegos.hatenablog.jp/entry/package-json-dependencies-caret)
を参考にして、

```javascript:package.json
"resolutions": {
// "eslint-loader": “2.1.2”→これを消した
"eslint-loader": "3.0.3"
}

```
そして、


```
$ yarn add -D eslint-loader
```

↓
エラー解消&axiosがワークした。
Rails 初期データを入れる

初期データを入れる
今回は、現場Railsや他の記事を参考に「seed」データを作成していく

似たようなものに「seed-fu」? となるものがあるらしいが
これは、また次回

##動作環境
Rails 5.1.6
ruby 2.5.1p57

##seedデータとは
アプリケーションでは、使いはじめる時点で初期データを必要とする
テストデータは手動でも作ることができるが、思いの外面倒なので

ある程度一括で作成したい

そこで、初期データ・テスト用データは`seedデータ` と呼ばれる
DBを作り直す都度、簡単にデータを作成することができる

##メリット
seedでは、一度ソースコードを書いてしまえば
コマンドを実行するだけでデータを投入することができる

つまり、都度データを作成する手間や、おこりうる間違いを減らすことができる

##実際にデータを流しこんでみる
```rb:db/seeds.rb
 User.create!(
   name: 'test',
   email: 'test@mail.com',
   password: 'password',
   password_digest: 'password'
 )
```

コマンド 実行

```
 rails db:seed
```

 これで、簡単にテストデータが作成できた

今回は、１人だけだからメリットはあまり感じにくかったが
10、100人単位になってくると恩恵を感じてくるだろう

##小技

ループを使って、データを作成する

```rb:db/seeds.rb

 100.times do |i|
   User.create!(
    name: 'test#{i}',
    email: 'test#{i}@mail.com',
    password: 'password#{i}',
    password_digest: 'password#i}'
   )
 end
```


##参考記事、書籍
現場Rails
https://qiita.com/takehanKosuke/items/79a66751fe95010ea5ee
20%の確率で「熱盛」が出て失敗するGitHub Action


[GitHub Actions Advent Calendar 2020](https://qiita.com/advent-calendar/2020/github-actions) 4日目の記事です。

リリースから1年が経過した[GitHub Actions](https://github.com/features/actions)、皆さんは活用なさっているでしょうか？
この1年間にも色々と機能が追加され、ついには[湯婆婆を実装できる](https://qiita.com/nogic1008/items/7ed9f77ce32dec6f5ef0)段階まで進化しております。
今回は、続々と進化を遂げているGitHub Actionsの機能について
![熱盛](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278493/1530a36a-3e94-8174-8719-cd439ef1e6dd.png)


失礼しました。熱盛と出てしまいました。

## 実行例

### 正常終了

[実行ログ](https://github.com/nogic1008/gh-actions-advent-2020/runs/1490089681)
並盛なので大丈夫です。
![並盛](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278493/8d4fb689-3fa6-98f2-472c-9dea024bc34f.png "並盛")

### 異常終了

[実行ログ](https://github.com/nogic1008/gh-actions-advent-2020/runs/1490529078)
失礼しました。ワークフローに熱盛と出てしまいました。(放送事故)
![ｱﾂﾓﾘｯ!](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278493/a3140a05-1f9a-f0e6-7119-813f9aafd84a.png "ｱﾂﾓﾘｯ!")


## 実行ログに警告/エラーメッセージを出す

`::warning::メッセージ` または `::error::メッセージ` を標準出力することで、警告/エラーメッセージを残せます。
(メッセージを出すだけで、__実際にActionを失敗させているわけではない__点に注意！)

```yml
- name: 警告
  run: echo "::warning::なんかおかしい"
- name: エラー
  run: echo "::error::エラー！"
- name: その後の処理
  run: echo "その後の処理" # ここも実行されるし、Actionの実行結果もsuccess
```

`::error file=ファイル名,line=行,col=列::メッセージ`のように出力することで、「特定ファイルの特定箇所」に対する警告/エラーメッセージを表現できます。

```yml
- name: 熱盛
  run: echo "::error file=.github/workflows/atsumori.yml,line=17,col=10::失礼しました。熱盛と出てしまいました。"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278493/1347da5e-a5dc-5345-93c1-b55cdee77f62.png)


## Actionを失敗させる

終了コードを`0`以外にすればOKです。

```yml
- name: 私、絶対失敗するので
  run: exit 1
```

## ランダムに値を選択するaction
「CI/CDでランダムな値を取得したい」という需要がないのか、(作成当時)Marketplaceに似たようなものがなかったので自分で作りました。

[Choose Random Action · Actions · GitHub Marketplace](https://github.com/marketplace/actions/choose-random-action)

### 使用例

```yml
steps:
  - uses: ddradar/choose-random-action@v1
    id: act # 選択された値を後から参照するために必要
    with:
      # 選択肢(必須) "|" の後に続けて1行ごとに記述する
      contents: |
        foo
        bar
        baz
      # 確率(オプション,デフォルト時は全項目同じ確率) 整数値で割合を指定
      weights: |
        2
        3
        5
  - name: Echo outputs
    # foo: 20%, bar: 30%, baz: 50% の確率で選ばれる
    run: echo ${{ steps.act.outputs.selected }}
```

## 完成形

```yml
name: 熱盛

on: workflow_dispatch

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
    - uses: ddradar/choose-random-action@v1
      id: act
      with:
        contents: |
          並盛
          中盛
          大盛
          特盛
          熱盛
    - name: ${{ steps.act.outputs.selected }}
      if: steps.act.outputs.selected == '熱盛'
      run: |
        echo "::error file=.github/workflows/atsumori.yml,line=17,col=10::失礼しました。熱盛と出てしまいました。"
        exit 1
```

## おわりに

[自作のAction](https://github.com/marketplace/actions/choose-random-action)、自動テストには向きませんが「ランダムに処理を振り分けたい」用途にご利用ください。
[リポジトリ](https://github.com/ddradar/choose-random-action)では自作の[LGTMコメントに反応するAction](https://github.com/marketplace/actions/post-lgtm-image)との利用例も紹介しています。