OmniAICreator/Qiita-1.07M huggingface dataset:
GitHubでファイル検索から変更履歴確認まで高速で行う

"高速"と書きましたがそこまで高速ではありません。(ｺﾞﾒﾝﾅｻｲ) :goberserk: 

GitHubブラウザ上でショートカットを使うとファイル検索から変更履歴確認まで結構速く行えて、よく使ってるんですが意外と知らない人が多いのでは？と思い記事化しました。

まずは、リポジトリのトップページを開き、"t"を打ちます。
![Pasted_Image_2022_02_09_12_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92539/bc71c09f-563b-1525-4ed7-15e399c8c2fa.png)

キーワードを(ファイル名)を打ち込みます。（ファイル名が曖昧でも、途中のキーワードでヒットしてくれます）
出てきた候補から↑↓キーでファイルに移動し、enterを押します。
![Pasted_Image_2022_02_09_12_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92539/497f97ac-299c-dfcf-addd-e6e2f4585b57.png)

ファイルに遷移するので、今度は"b"を押します。
![Pasted_Image_2022_02_09_12_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92539/d1c64069-e656-5c48-c6db-318315abf08e.png)

Blame表示に切り替わり、各行の最終commitか確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92539/b9e3a9d1-6df9-e5d9-0833-5eadd7d88cda.png)

左ペインのcommit messageをクリックすれば、そのcommitまで移動できます。
![Pasted_Image_2022_02_09_12_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92539/87eb25b2-8edc-9d73-c364-19a00ccc5f4e.png)

その隣にある四角アイコンをクリックすると、そのcommitの直前のcommitまで戻って表示できます。
![Pasted_Image_2022_02_09_12_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92539/0fc99d6f-e8e7-c037-dff9-df672f49dfca.png)

"History"ボタンで、そこからさらに時系列順にcommitを確認するなどもできます。
![Pasted_Image_2022_02_09_12_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92539/9b0ca12c-d0da-88f5-832d-08295bb490a3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92539/e233c821-b0f6-0af7-c8a4-cab171944202.png)

以上です！それではよいGitHubライフを！ :hand_splayed:
PSRについての個人メモ

# 内容

- PSR1 PSR2の定義は下記に和訳されたものがある。
    - [http://www.infiniteloop.co.jp/docs/psr/psr-1-basic-coding-standard.html](http://www.infiniteloop.co.jp/docs/psr/psr-1-basic-coding-standard.html)
    - [http://www.infiniteloop.co.jp/docs/psr/psr-2-coding-style-guide.html](http://www.infiniteloop.co.jp/docs/psr/psr-2-coding-style-guide.html)
- PSR2の条件の最初に「PSR1に準拠している事」と記載されているのでPSR2に準拠していたら自動的にPSR1にも準拠していることになる。
laravel 作成したRequestクラスのauthorize()をtrueにするなら当該関数を削除してもよいらしい

# 概要

- リクエストクラスを`$ php artisan make:request`で作成した時にできるファイルに最初から記載されている`authorize()`関数は認証の必要がなければ関数そのものを記載しなくていいという記事をどっかで見た気がして本当か見てみる。

# 詳細

- 下記コマンドを実行して作成したリクエストクラスのファイルを用いて継承元などをたどってみる。

    ```terminal
    $ php artisan make:request WorkUpdateRequest
    ```

# たどってみた

1. まずは`$ php artisan make`コマンドで作成したリクエストクラスのファイルを見てみる。（当該ファイルは実際に使用中なので色々記載されている）

    ```WorkUpdateRequest.php
    <?php
    
    namespace App\Http\Requests;
    
    use Illuminate\Foundation\Http\FormRequest;
    
    class WorkUpdateRequest extends FormRequest
    {
        /**
         * Determine if the user is authorized to make this request.
         *
         * @return bool
         */
        public function authorize()
        {
            return true;
        }
    
        /**
         * Get the validation rules that apply to the request.
         *
         * @return array
         */
        public function rules()
        {
            return [
                'start_date_time' => 'required|date',
                'end_date_time' => 'required|date',
                // 本クラス内で作成した値のバリデーション
                // date-time-consistencyはstart_date_time < end_date_timeの場合true
                'start_and_end' => 'required|date-time-consistency',
            ];
        }
    
        /**
         * バリデーションチェック前の処理
         *
         * @return void
         */
        public function prepareForValidation() : void
        {
            $this->merge([
                'start_and_end' => [
                   'start_date_time' => $this->get('start_date_time'),
                   'end_date_time' => $this->get('end_date_time'),
                ],
            ]);
        }
    }
    ```

1. `extends FormRequest`となっている通り、FormRequestクラスが継承されているので継承元の関係ありそうな関数を見てみる。

    ```FormRequest.php
    /**
     * Determine if the request passes the authorization check.
     *
     * @return bool
     */
    protected function passesAuthorization()
    {
        if (method_exists($this, 'authorize')) {
            return $this->container->call([$this, 'authorize']);
        }

        return true;
    }
    ```

1. ↑`passesAuthorization（）`関数は`authorize()`関数が合った場合、当該の関数をコールする。無かった場合trueを返している。
1. `passesAuthorization()`関数は`vendor/laravel/framework/src/Illuminate/Validation/ValidatesWhenResolvedTrait.php`で使用されており、当該のクラスをFormRequestクラスでuse宣言している。

    ```ValidatesWhenResolvedTrait
    /**
     * Validate the class instance.
     *
     * @return void
     */
    public function validateResolved()
    {
        $this->prepareForValidation();

        if (! $this->passesAuthorization()) {
            $this->failedAuthorization();
        }

        $instance = $this->getValidatorInstance();

        if ($instance->fails()) {
            $this->failedValidation($instance);
        }

        $this->passedValidation();
    }
    ```

# まとめ

- リクエストクラスの`authorize()`が定義されていなかった場合、継承元クラスにて`passesAuthorization()`を返すから大丈夫そう
いま一度確認したいEmotetのなんやかんや

# はじめに
**まず、この記事がすべてだとは思わないでください。**
攻撃手法は日々変わっていってますので、ここでの説明がぐるっとひっくり返ることが割とあり得ます。
一応、嘘を書かないように気を付けてはいますが、基本的にはIPAやセキュリティベンダー等の記事で定期的に情報を集めた方が情報の正確性は高いです。[^1]

# Emotetとは何ぞや
主に「なりすましメール」によって感染拡大しているマルウェアです。
最初は2019年12月頃に流行ったマルウェアで、ここしばらく活動は停止していました。
しかし、2021年12月から活動が再開され[^2]、現在（2022年2月時点）では多くの企業に被害が拡大しています。

# どっから感染すんの？
このマルウェアは「なりすましメール」に添付されたファイルやリンクされているURLから感染します。
> なりすましメールとか気を付ければひっかからんてｗ

みたいな声が聞こえてきそうですが、実はこのEmotetのメールはパッと見では気付けないレベルに偽装されており、油断は禁物です。
Emotetによって抜き取られた情報（氏名、メールアドレス、メールの内容などの一部）が流用されており[^3]、通常の業務メールとほぼ見分けがつかない[^4]と思っておいた方が良いでしょう。

# 何してくんの？
Emotetは感染した端末から様々な情報を抜き取り、かつその情報を元にメールを作成し感染拡大を試みてきます。
また、ドロッパー型のマルウェアとも言われており、別のマルウェアをデバイスに読み込ませるといったことをしてくる場合があるようです。[^5]
そのため、情報流出などのほかにランサムウェアなどの被害につながる場合があります。

# じゃあ対策どうすんねん
大まかに分けて、かからない為の対策（予防）とかかった後の為の対策（被害軽減）があります。
代表的な対策をIPAなどのサイトを参考に、以下に挙げます。
### 予防
- 基本、不用意に添付ファイルやURLは開かない。
- OSやアプリ、ウイルス対策ソフトなどは常に最新の状態に更新しておく。
- Office製品のマクロ設定[^6]にてマクロの自動実行を無効化しておく（ファイルを開いただけでアウトにならないようにする）
- 信頼できない添付ファイルを開いた場合「マクロを有効にする」「コンテンツの有効化」というボタンは押さない。
- Emotetについての情報と対策を周知させる。

### 被害軽減
- 信頼できないメールを開いた場合、システム管理部門等に連絡する。
- 定期的にファイルのバックアップをしておく（ランサムウェア対策）

# 最後に
ここまで読んでくださいまして、ありがとうございます。
ひとまず、JPCERT/CCより[Emotet感染有無の確認を行うツール](https://blogs.jpcert.or.jp/ja/2019/12/emotetfaq.html#2)がリリースされていますので、こちらを実行してみることをお勧めします。[^7]
引き続き、なりすましメールには気を付けていきましょう。

# 参考
https://www.ipa.go.jp/security/announce/20191202.html
https://blogs.jpcert.or.jp/ja/2019/12/emotetfaq.html
https://www.kaspersky.co.jp/resource-center/threats/emotet


[^1]: この記事はどちらかというと概要の把握と注意喚起の側面が強いです。
[^2]: 一応2020年の年末とかも動いてたらしいです。
[^3]: Emotetによってクオリティの高い「なりすましメール」ばらまかれ、それに引っかかるとEmotetに感染する、というこの悪循環力の強さがやはり感染拡大の要因でしょうね…
[^4]: どうやら、日本語のクオリティも結構高いらしいです。日本語が不自然化かどうかで見分けることが出来ないってだけでもうやばそうですよね…
[^5]: ドロッパー型の特徴としてそのマルウェア自身には（表向き）不正なコードを含まないという特徴があるため、ウイルス対策ソフトのスキャンで検出されない場合があるようです。うわ、こわ。
[^6]: 実はWordとExcelでそれぞれ設定が必要。注意。
[^7]: もしかすると、Emotetの感染有無を確認するツールを偽ったいわゆるフィッシング的なアプリがでてくる可能性もありますので、信頼できるサイトでダウンロードすることを心掛けたほうがいいでしょう。
【Salesforce】{!Receiving_User.CompanyName}を使ったら会社名が表示されない

# 問題

```Apex:apex.cls
System.resetPasswordWithEmailTemplate('User.ID', true, 'EmailTemplate.ID');
```

上記のコードにて下記のメールテンプレートを呼び出すと

```EmailTemplate.txt
{!Receiving_User.CompanyName}
{!Receiving_User.LastName} {!Receiving_User.FirstName}
```

下記のように「{!Receiving_User.CompanyName}」（受信ユーザ.会社名）が表示されない。

```メール結果.txt
(値が表示されない)
小林 諒平
```

# 解決策

```EmailTemplate.txt
{!Account.Name}
{!Receiving_User.LastName} {!Receiving_User.FirstName}
```

{!Account.Name}を使用する。

```メール結果.txt
株式会社hogehoge
小林 諒平
```

# 根拠

「Receiving_User」は下記、参考リンク[[2]](https://help.salesforce.com/s/articleView?id=000337445&type=1)だと「取引先責任者」の項目は使用できるが、「ユーザ」の項目は使用できない。

だから取引先責任者にはない「CompanyName」は表示されず、「LastName」「FirstName」は表示される。

そして取引先責任者にはユーザの会社名を保持する項目は無い。

そこで参照先である{!Account.Name}を使用してみたら・・・と思ったら表示できた。

ただし、コミュニティの「* 新規メンバーのお知らせ」で指定した場合は{!Receiving_User.CompanyName}は表示ができる。

なんじゃそりゃ。

# 参考リンク

[1][System クラス](https://developer.salesforce.com/docs/atlas.ja-jp.234.0.apexcode.meta/apexcode/apex_methods_system_system.htm#apex_System_System_resetPassword)

[2][コミュニティのパスワードリセットメールテンプレートと Receiving_User 差し込み項目](https://help.salesforce.com/s/articleView?id=000337445&type=1)
VyOSイメージファイルダウンロード

前回の「FortigateVM ～ VyOSを使ったネットワーク検証」記事に書きそびれました。備忘録も兼ねて。

https://qiita.com/nw-engineer/items/d2953d37e91d6b3df5eb


## 1. IOSファイルダウンロード
下記サイトへアクセスします。

https://vyos.net/get/snapshots/


画面下にある「vyos-1.3.0-epa1」の「vyos-1.3-rolling-202101-amd64.iso (generic iso)」をダウンロードしましょう


<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/93f9c24d-ada6-a8f7-257e-7f1f883e08a5.png">


## 2. その他
フリーでネットワーク周りの学習可能なツールを提供いただけている事に感謝です！
Power Apps で Web API のレスポンスに日時型が含まれる場合の表示の違い

Power AppsからカスタムコネクタなどのWeb API呼び出しをした際にレスポンスの中に日時型のフィールドがある場合の挙動について確認してみます。

## レスポンス
カスタムコネクタからは以下のようなレスポンスを返します。
それぞれ DateTime の kind が`utc`,`localP`,`unspecified`のJSON文字列になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149212/885b433c-e29c-082e-0a60-3f54ca62fc30.png)

## Power Appsでの表示
これをPower Appsで表示すると以下のような表示になります。
ここで`utc`と`local`が+9時間されて表示されているのがわかります。これはPower Appsのユーザーの端末のロケール設定に基づいて自動的に計算されるものです。[^1] (今回はPowerAppsのロケールを日本に設定しているので+9Hされています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149212/3dc55447-5c35-0a9a-a7b2-41a64d2f1bdb.png)

「ビュー」→「変数」でも同じような状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149212/2afae2f1-4cef-01d8-bcac-4ae77074e5e3.png)


## まとめ
基本的にクラウド上で日時型の保管や処理をする場合は一貫してUTCを使用し、UI側でユーザーロケールによって変換することが推奨されていますが、どうしてもデータのままの日時を表示したい場合は`unspecified`を指定する必要があるようです。


## おまけ：タイムゾーンを変更してみる。
使用しているPCのタイムゾーンを「ハワイ」に変更してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149212/9fd655c8-02a3-2191-9b37-6ab8e889f893.png)

-10時間されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149212/d0adde22-c43c-d3dc-0eab-f8207f4cc02a.png)



---

[^1]: 以前そのような記載のドキュメントを見た気がするのですが、今探したら見当たりませんでした・・・。ご存じであればコメントなどいただけると幸いです。関係しそうなDocs→https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/show-text-dates-times
連想配列について


#JavaScriptの連想配列
JavaSciptには連想配列というものがあります。

## 連想配列とは
連想配列とはキーと値のペアで構成される配列です。JavaScriptではオブジェクトとして扱います。
ここの「キーと値のペア」はプロパティと呼びます。プロパティは値に関数を指定することもできます。


## 連想配列の宣言の仕方

```sample.js
const foods = new Object();
const foods = {};
```
とうすることで宣言が完了します。

```sample.js
const foods = {curry: "甘口",curry1: '中辛', curry2:"辛口"};

console.log(foods["curry"]);//甘口が表示
console.log(foods["curry1"]);//中辛が表示
console.log(foods["curry2"]);//辛口が表示
```

##連想配列の配列の追加
```sample.js
const foods = {curry: "甘口",curry1: '中辛', curry2:"辛口"};
foods["curry3"] = "激辛";

console.log(foods["curry3"])//激辛
console.log(foods);//Object { curry: "甘口", curry1: "中辛", curry2: "辛口", curry3: "激辛" }
```
このようにfoodsの変数の中にはcurry3の激辛が追加され、コンソールに中には表示されていることが確認できます。

##連想配列の要素を更新
```sample.js
const foods = {curry1: "甘口",curry2: "中辛",curry3:"辛口"};
foods["curry3"] = "激辛";

console.log(foods);//Object {curry1: "甘口",curry2:中辛,curry3:"激辛"}
```
更新したい値のkeyを指定することで辛口から激辛に変更されているが分かります。

##連想配列の要素の削除
```sample.js
const foods = {curry1: "甘口",curry2: "中辛",curry3:"辛口"};
delete foods["curry3"];

console.log(foods);//Object { curry1: "甘口",curry2:"中辛"}
```
deleteを使用し、削除を行います。コンソールには削除したいkeyのcurry3:辛口が削除されています。

##連想配列の数を取得
```sample.js
const foods = {curry1:"甘口",curry2:"中辛",curry3:"辛口"};
console.log(Object.keys(foods).length);//3
```
Object.keysメソッドを使用し、要素数を取得することができました。

##連想配列をループで処理
```sample.js
   var curry = {}
  for(var i=0; i<5; i++){
    curry["property" + i] = i * 100;
  }
  for(var key in curry) {
    if(curry.hasOwnProperty(key)) {
      var val = curry[key];
      console.log("key=", key, ", value=", val);
    }
  }
  console.log("property4の値は", curry.property4);
```

実行結果は以下のようになります。オブジェクトをfor … in文でループ処理してプロパティの値を出力していることが確認できます。

//　コンソールに出力
//"key=" "property0" ", value=" 0
//"key=" "property1" ", value=" 100
//"key=" "property2" ", value=" 200
//"key=" "property3" ", value=" 300
// "key=" "property4" ", value=" 400
// "property4の値は" 400
JavaでPDFをHTMLに変換してストリーミングに保存する方法

この記事では、Javaバックエンドコードを使用してPDFファイルをHTMLに変換し、変換されたHTMLファイルをストリームに保存する方法について説明します。変換を実装する場合、SVGを埋め込むかどうか、画像を埋め込むかどうかなど、関連する変換プロパティを設定できます。変換を実現するための方法と手順は次のとおりです。

##1.jarパッケージをインポート

今回の変換の方法は、**[Free Spire.PDF for Java](https://www.e-iceblue.com/Download/pdf-for-java-free.html)**の中のSpire.Pdf.jar free jarをインポートすることで実現されます。jarパッケージをローカルにダウンロードして解凍し、libフォルダーでSpire.Pdf.jarファイルを見つけることができます。そして、次の手順を実行してインポートを完了します。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/8d2ebfb9-cb3a-c42a-1004-bbe7dbb05c4c.png)
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/b90c35b1-2062-ed0c-a748-96a46b8ae6dc.png)
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/ee815da9-0c8f-48fa-a0f3-37c9c4cac3c2.png)

##2.Javaコード

PDFをHTMLに変換する場合、主に次の手順のクラスとメソッドを介して実装されます。

PdfDocumentクラスのオブジェクトをインスタンス化し、PdfDocument.loadFromFile（String filename）メソッドを介してPDFドキュメントをロードします。
PdfDocument.getConvertOptions（）.setPdfToHtmlOptions（boolean useEmbeddeSvg、boolean useEmbeddeImg）メソッドは、HTML形式に変換するときに関連する変換プロパティを設定します。
PdfDocument.saveToStream（OutputStream stream、FileFormate format）メソッドは、HTMLに変換するときにストリームに保存します。

###**Java**

```
import com.spire.pdf.*;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class SaveToStream {
    public static void main(String[] args) throws FileNotFoundException {
        //PDFドキュメントをロードする
        PdfDocument pdf = new PdfDocument();
        pdf.loadFromFile("C:\\Users\\Administrator\\Desktop\\Java.pdf");

        //useEmbeddedSvgおよびuseEmbeddedImgブール値をtrueに設定する
        pdf.getConvertOptions().setPdfToHtmlOptions(true,true);

        //ストリーミングに保存する
        File outFile = new File("toHTML.html");
        OutputStream outputStream = new FileOutputStream(outFile);
        pdf.saveToStream(outputStream, FileFormat.HTML);
        pdf.close();
    }
}
```
##3.コードを実行した後、htmlファイルを生成します
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/055d014a-ebde-c14e-932d-fef9dc124dfc.png)
##結語
以上は今回のPDFをHTMLに変換してストリーミングに保存する方法でした、最後まで読んでいただきありがとうございます。
SwiftUIのCollectionView！ LazyGridで画像を並べてみる

#SwiftUIのLazyGridをシンプルにつかう方法です
<img src="https://user-images.githubusercontent.com/23278992/153114434-914ff9cd-eef1-46d1-aff1-d710cf1dbcc0.PNG", width=300>

#SwiftUIでCollectionViewってどうやるの？
マス目にコンテンツが並んだCollectionView。
SwiftUIでどうやればできるのでしょうか。

#LazyGrid
LazyGridで、SwiftUIのレイアウト機能を活かしつつ、CollectionViewが作成できます。

#方法

```swift
struct ContentView: View {
    var columns: [GridItem] =
    Array(repeating: .init(.flexible()), count: 2)
    var images: [String] = ["image0","image1","image2","image3"...]
    
    var body: some View {
        ScrollView(.vertical) {
            LazyVGrid(columns: columns, alignment: .center, spacing: 10) {
                ForEach(images, id: \.self) {imageName in
                    Image(imageName)
                        .resizable()
                        .aspectRatio(1, contentMode: .fill)
                }
            }
        }
    }
}
```

ScrollViewに入れているのでスクロールします。

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
RasberryPi Zero WHでChromiumブラウザが起動しない件

# はじめに
こんにちは。今回はラズパイZeroをいじる中で遭遇したトラブルについて書きます。

[前回の記事](https://qiita.com/kosukein38/items/02aa3819e13dc35e9e0d)でRaspberryPiOSに推奨の最新版Raspberry Pi OS(32-bit)を入れて開発をしていたのですが、どうもラズパイの起動に失敗したり、インストールされているChromiumのWebブラウザが起動しなかったりする不具合がありました。
記事の通り、センサーからの値取得はうまくいきました。

結論、Raspbarry Pi OSのダウングレード（正確にはlegacyバージョンとする）することによって、解決することができました。


# なぜ書いたか

ラズパイ上のブラウザで検索しながらコピペでプログラムを作りたいなーと思っていたのですが、デフォルトで入っているChroiumブラウザが起動しないアクシデント！
アップデートやら色々試してみたのですが、どうやらOSの入れ直しが現時点の私の知識では最善の方法であったため、同じようなことで困っている人の役に立てばいいなと思い書きました。

# うまくいかなかった方法

### 試したことその１　OSパッケージの更新

(1)Raspberry Pi OSのパッケージを更新

```bash
$ sudo apt update
$ sudo apt upgrade
$ sudo apt dist-upgrade
```
(2)ファームウェアを更新
最新版がいいとは限らない(安定版ではない)ため、公式には rpi-update で最新のファームウェアのアップデートは推奨されていないようです。ですが、ものは試しということで。

```bash
$ sudo rpi-update
```

(3)再起動

```bash
$ sudo reboot
```

しかし、chromiumブラウザ立ち上がらず…。

### 試したことその2　chromiumブラウザの入れ直し

順に以下のコマンドを実行し、chromiumブラウザをアンインストールし、再度インストールしなおしてみました。

```bash
$ sudo apt remove chromium-browser
$ sudo apt remove chromium
$ sudo apt autoremove
$ sudo apt clean
$ sudo apt install chromium-browser
```
しかし、やはりchromiumブラウザ立ち上がらず…。再起動してもダメでした。


# うまくいった方法

2021年11月8日にRaspberry Pi OSがDebian「buster」から、Debian「bullseye」へのバージョンアップしたと発表したそうです。[参考1](https://www.raspberrypi.com/news/raspberry-pi-os-debian-bullseye/)
私がラズパイZeroに入れたOSもDebian「bullseye」でした。
これまでのDebian「buster」はlegacyバージョンとして残るという情報を見て、まだ開発したての状態なので、こちらにダウングレードしてみるとうまくいきました。[参考2](https://raspida.com/rpi-os-legacy-version)

最初に書き込んだ時と同じように「Raspberry Pi Imager」のアプリを使って、microSDをフォーマットし、アプリのRaspberry Pi OS(other)→Raspberry Pi OS(Legacy)をクリックし、インストール。
ラズパイZeroにmicroSDカードを挿して、立ち上げから初期設定を済ませました。
初期設定後chromiumブラウザを立ち上げると、、、起動した！！よかった。

念の為、以下にOSのダウングレード前後の情報を載せておきます。

```bash
#ダウングレード前
pi@raspberrypi:~ $ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 11 (bullseye)
Release:	11
Codename:	bullseye

#ダウングレード後
pi@raspberrypi:~ $ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 10 (buster)
Release:	10
Codename:	buster
```

chromiumブラウザが起動したこともありますが、ラズパイZeroの起動も早くなり、ダウングレード前のbullseyeでは何回か起動に失敗していたのですが、buster(legacyバージョン)では安定して起動するようになりました！！

# 最後に

やはりバージョン違いなどで上手くプログラムや構成するソフトウェアが起動しないことは往々にしてよくありますよね…。bullseyeもう少し様子を見てからバージョンアップを検討してみます。
とりあえず、この環境で[前回の記事](https://qiita.com/kosukein38/items/02aa3819e13dc35e9e0d)のセンサも動かせることは確認したので、この環境で開発を続けたいと思います！
最後まで読んでいただきありがとうございます。
チーム開発を率いる際のモチベーション維持の重要性について

## 概要

チーム開発において、チームを構成する各メンバーのモチベーションを高く保つことはマネージャーとして重要な役割だと思います。

私は現在プライベートで10人前後のコンテンツ開発チームを代表の立場で束ねています。

具体的には同人サークルについての話なので Qiitaで主要な話題となる開発プロジェクトとは異なる話になる部分もありますが、マネージャーとチームメンバーという関係性についてはシステム開発と何ら変わるところはないと思っています。

### モチベーションを保つことの重要性について

同人サークルでは製作物を販売した際の売上の分配を伴うため本質的に金銭的なやり取りを含みますが、制作段階においては各スタッフの完全な手弁当、ボランティアに頼っています。

直接的な報酬を伴わない作業するわけですから実質各スタッフ本人のモチベーションが全てであり、モチベーションが尽きた段階でそのスタッフは同人サークルから脱退したも同然の状態となり、製作中の企画は破綻してしまいます。

したがって同人サークルにおいては各スタッフのモチベーションを高く保つことが至上命題です。

こういうところは毎月給与として一定の報酬が約束されているビジネスとしてのチーム開発とはまた違った課題点かなと思います。

しかしながら、以下に述べる同人サークルのスタッフをまとめていく技法はみなさんのチーム開発の場でも応用できると思いますので、参考にしていただけると嬉しいです。

また同人サークルでは報酬を伴う外注作業も並行して進めていますが、報酬を支払う約束をしたところで外注さんの製作が完遂することは何ら約束されたものではなく、製作中はサークル内のスタッフと同水準で外注さんのモチベーションを高く保つ必要があると感じています。

### 基本方針

私はチームのマネージャーの立場として、この本に書かれていることの実践に努めています。

- MULTIPLIERS 『メンバーの才能を開花させる技法』
  - https://www.amazon.co.jp/dp/4903212513

この本では非常に多岐にわたる視点からマネージャーがどうあるべきかについて論じられており、なかなか全てを満たしていくことは難しいですが、私なりに部分的に実践していることを以下にまとめていきます。


### チームメンバーを尊敬する

私は全てのチームメンバーを『○○先生』と呼びます。
先生と呼んだからといって実体として何が変わるというわけではないですが、各メンバーを個として尊重していくという基本方針の実践としてサークル内ではそうしています。

### スタッフに適切な役割を与える

スタッフを新たに迎え入れたとき、スタッフ本人との初回のミーティング(兼面談)で、スタッフのこれまでの製作物の履歴を一緒に確認し、その作品傾向の分析とともにスタッフ本人がやりたいことを注意深くヒアリングし、その上でスタッフにやってもらう作業内容や企画を提案することにしています。

繰り返しますが同人サークルにおいては本人のモチベーションが全てですので、最初の段階でどれだけ高いモチベーションを設定できるかは非常に重要です。そのために本人の好むところに一番近い作業内容を提案することを常に心がけています。

同人サークルが本格稼働するようになって半年ほど経過しましたが、今のところ誰一人明確な脱退者が出ることなく続けられています。

### 役割を与えた上で、最終責任は自分で引き受けることを明確化する

同人サークルではイラストや脚本などのコンテンツ素材をベースにデジタルコンテンツや本などを製作し、販売しています。

イラストレーターからイラスト、ライターから脚本を日々製作してもらっているわけですが、その内容や品質については個別に『最善の品質』となるように細かくレビューし、改善点が見つかればその場で指摘するやり方で進めています。

そのうえでコンテンツや本が完成し、販売にいたった段階では、その成果について各スタッフには一切責任をもたせません。全てマネージャーである私本人の責任としています。

これは各スタッフはそれぞれ割り当てられた製作物の品質と量についてのみ責任を持てば良く、製品としての最終責任まで問うても意味がないと考えるからです。

### 成果物を積極的に共有する(周囲の評価を与える)

私の同人サークルでは情報共有システムとしてはDiscordによるチャットや Google Driveなどのファイル共有などにとどまっており、イントラネットやチームメンバー用の情報共有サイトなどは特に設けていません。

したがって各メンバーの実績についてはマネージャーである私一人が把握した状態となるわけですが、この状態ではモチベーションを保つことができません。

そこで、スタッフが成果物を上げてくれた段階で、残り全員のスタッフに私本人が手作業でシェアして回っています。

サークル内では他のスタッフの製作物に対して感想を述べ合うことが習慣化しており、見たままの感想を私に返してくれます。

私は製作物を上げてくれたスタッフ本人に他のスタッフたちの感想をまとめて伝えています。

大抵の場合、スタッフは大変喜んでくれます。

最初に製作物を確認した段階で私個人としては批評し、同時に感謝もしているわけですが、私一人としての言葉だけでは威力不足です。他の企画をすすめていて半ば中立的な立場である他のスタッフからの感想（ほとんどが賞賛の言葉）が得られるというのはスタッフ本人のモチベーションの維持にとって非常に重要だと思います。

このサークル内の感想を集めて返す人力作業のことを、私は宇宙戦艦ヤマトにちなんで『反射衛星砲』と呼んでいます。要塞から発射された巨大ビームが反射衛星で跳ね返されることを繰り返されるうちに威力がどんどん増していくあの現象ですね。

### 成果物に対してレスポンスをすぐに返す

私の同人サークルのコンテンツは主にイラスト、脚本、演出等の組み上げ、パッケージデザインの主に４つの工程を経て製作されています。

この内、イラストと脚本の作業割合が非常に大きいです。

したがって、イラストに対しては脚本を。脚本に対してはイラストをなるべく早い段階で、できれば当日または数日以内に提供することを心がけています。

イラストを見ながら脚本を書けばその分だけ見たままの説得力が加わりますし、脚本を読みながらイラストを描けば、それだけ臨場感の伴ったイラストに仕上がるでしょう。

スタッフの成果物が放置されることだけは避けるようにしています。

### 成果物を外部公開する

同人に限らず、商業においても製作中のコンテンツについては広報の機会が訪れるまで秘密を保つことが多いのではないでしょうか。

私のサークルにおいてはそういった原則には従わず、一部を製作した段階でそのままSNS等に出すことにしています。

ただしこちらにおいては同人サークルのSNSアカウント自体がまだ本格稼働できていないため、まだ十分な実績とはいえません。

### 最後に

私がマネージャーの立場として気をつけていることをまとめてみました。

システム開発の現場とは多少違う側面もありますが、みなさんのチーム維持に役立てていただけると嬉しいです。

みなさんのチームで心がけていることを聞かせてください。
[Ubuntu]CUDAとNVIDIAドライバをインストールする方法[備忘録]



# 1.CUDAのインストール
- [CUDA Toolkit 11.6 Downloads](https://developer.nvidia.com/cuda-downloads)より、Select Target Platformで自分に合った情報を選択する
- 筆者の場合はUbuntu20.04などを使っているため、以下の情報を選択

![2022-02-09-11-04-37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763295/e0775315-33d4-01cf-f195-1dbfe4f7e42c.png)

- インストール手順のコマンドの一覧

![2022-02-09-11-11-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763295/17b247ae-fe42-cc4c-be9c-c0f9ea3222ef.png)


- 手順通りにコマンドを実行

```
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.6.0/local_installers/cuda-repo-ubuntu2004-11-6-local_11.6.0-510.39.01-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2004-11-6-local_11.6.0-510.39.01-1_amd64.deb
sudo apt-key add /var/cuda-repo-ubuntu2004-11-6-local/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda
```

- **`sudo apt-get -y install cuda`を`sudo apt-get -y install cuda-drivers`とすると、最新のドライバだけ綺麗にインストールができます。**


# 2.NVIDIAドライバのインストール

- [Installation Guide](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#installing-docker-ce)のSetting up NVIDIA Container Toolkit以下のコマンドを実行


- インストール手順のコマンド

![2022-02-09-11-24-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763295/e1caf49b-a983-9747-9edd-a858d3f182d5.png)


- 手順通りにコマンドを実行

```
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
   && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
   && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

sudo apt-get update
sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker
```


# 3.再起動し、インストールされているか確認

- 以下のコマンドを実行し、画像のような出力ができるか確認

```
nvidia-smi
```


![2022-02-09-11-28-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763295/c46c8be4-dac4-a64b-5b0d-af0a7d1b2c53.png)




# 4.もしも再起動後に画面が真っ暗になった時の対処法

- 以下のサイトの手順通りにやれば解決する
- [[Ubuntu]CUDAを入れたら画面が真っ黒になった話](https://qiita.com/cv_carnavi/items/b439b81e7c10b95ee7c5)


# 参考にしたサイト

- [NVIDIA Docker って今どうなってるの？ (20.09 版)](https://medium.com/nvidiajapan/nvidia-docker-%E3%81%A3%E3%81%A6%E4%BB%8A%E3%81%A9%E3%81%86%E3%81%AA%E3%81%A3%E3%81%A6%E3%82%8B%E3%81%AE-20-09-%E7%89%88-558fae883f44)
- [CUDA Toolkit 11.6 Downloads](https://developer.nvidia.com/cuda-downloads)
- [Installation Guide](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#installing-docker-ce)
- [[Ubuntu]CUDAを入れたら画面が真っ黒になった話](https://qiita.com/cv_carnavi/items/b439b81e7c10b95ee7c5)
【SQL】COALESCE関数で0かNULLを一番下にする※複数も対応SELECTとCONCATもいける


画像があるデータを一番上にして、nullのふりがなを一番下にした状態で、ふりがなで昇順ソート

```SQL
ORDER BY COALESCE(number,0) = 0,number
```

# COALESCEが複数

```SQL
SELECT 
     A.id,A.name,A.def,A.speed
FROM M_accessory_data A 
ORDER BY COALESCE(A.def,0) = 0,COALESCE(A.speed,0) = 0,A.def,A.speed
```

# COALESCEでSELECTとCONCAT

```SQL
SELECT 
   COALESCE(NULL,CONCAT(name,bunrui,.koka),CONCAT(name,koka)) name
FROM テーブル
```

※説明

まず画像があるデータを一番上にする

coalesce関数でfuriganaがnullじゃないデータを一番上にする

ORDER BY 列名 [NULLS FIRST or NULLS LAST]が
使えそうな予感

https://qiita.com/wanko5296/items/b17ddde32166de0bf139



```PHP
$this->db->order_by("img_icon_flg DESC,coalesce(furigana, '') = '' ASC,furigana");
```
【WordPress】1ヶ月以上経過したサイトをサブディレクトリ型マルチサイト化する 

WordPressサイトをサブディレクトリ型（example.com/aaa/）マルチサイト化したいが、
1ヶ月以上経過した記事が存在する場合、
強制的にサブドメイン型（aaa.example.com）になってしまう。

network.phpのコードをいじる対処法もあるそうだが、
私の環境では上手くいかなかった。（2022年2月9日時点）

データベースを一時的に書き換える方法を試したところ、
サブディレクトリ型にすることに成功した。

##手順
**※一つ間違えるとデータベースやサイトデータが消失・破損する可能性があります。
　必ず自己責任でお願いいたします。**

１．phpMyAdminへアクセスし、wp_postsのバックアップを取る。

２．SQLタブに移動し、以下のコードをコピペして実行。
　　wp_postsに保存されている記事の公開日を一時的に本日の日付に変更する。

~~~ sql
UPDATE wp_posts SET post_date = DATE(NOW()), post_date_gmt = DATE(NOW()) WHERE post_date < DATE_SUB(NOW(), INTERVAL 1 MONTH) AND post_status = 'publish';
~~~

３．サブディレクトリ型orサブドメイン型を任意で選択できるようになれば成功。
　　その後の設定は自身のサイトに合わせて行う。

４．再びphpMyAdminへアクセスし、wp_postsを空もしくは削除する。
　　wp_postsのバックアップをインポートして元に戻す。

##参考にさせていただいた記事
https://illustswitch.com/wp-multisite-subdirectory/
【Project Euler】Problem 79:パスコードの推測 

* 本記事は[ProjectEuler](https://projecteuler.net/about)の「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。

### 問題 79.パスコードの推測 

原文 [Problem 79: Passcode derivation](https://projecteuler.net/problem=79)

**問題の要約：パスコードの指定された位置の数3桁（位置の順番になっている）を入力した結果が50回分与えられたとき考えられる最短の元のパスコードを求めよ**

* 例えばパスコードが531278のとき、2,3,5番目の数字を指定されたら317を入力する

以下のようなステップで考えて行きます。

1. 最短のパスコードということなので入力した3桁の数字に含まれていないものは除外し、それ以外の数字は1個づつしかないと仮定します。
1. 3桁の数字が位置の順番になっているので、例えば317だとすると元のパスコードで1は3より右に、7は1より右にあるので、順番が違っていれば入れ替える。

これをプロクラムにしたのがこちらです。ファイルから読む部分は例によって下に添付してあるます。

```python 
from collections import Counter
from functools import reduce

# Remove unused numbers, create pcode candidate list (un-ordered)
csum = reduce(lambda a, b: a+b, [Counter(k) for k in keyLogs]) # count the digit appeared
pcode = list(map(int,csum.keys()))

# swap the positions of two numbers if the order is wrong
def swapn(p,pl):
  if p[0] > p[1]: 
    pl[p[0]], pl[p[1]] =  pl[p[1]],  pl[p[0]]

for nums in keyLogs:
  pos = [pcode.index(int(d)) for d in nums]  # index of each number
  swapn(pos[:2],pcode)
  swapn(pos[1:],pcode)

print(f"Answer {''.join(list(map(str,pcode)))}") 
```

### (別解) トポロジカルソート(networkx)

この問題の別解としてグラフ理論の「[トポロジカルソート(Wikipedia)](https://ja.wikipedia.org/wiki/%E3%83%88%E3%83%9D%E3%83%AD%E3%82%B8%E3%82%AB%E3%83%AB%E3%82%BD%E3%83%BC%E3%83%88)」を使う方法があります。各桁の数字をノードとし、3桁の数字から得られる順番を「半順序（部分的な順序）」としてそれから「トポロジカルソートとは、これを全順序になるように拡張」したものということです。

Pythonにはグラフ理論をサポートするパッケージ**networkx**がありますのでこれを使ってみます。以下のステップでプログラムにします。

1. 0~9をノードに登録
1. 3桁の数字から得られる順番を有向の辺(directed edge)に登録（重複を除く）
1. どのノードともつながっていない孤立ノードを調べてグラフから除く
1. トポロジカルソートを掛けて結果を取り出す

```python 
# Using Topological Sort
import networkx as nx
import matplotlib.pyplot as plt

node_list = [str(i) for i in range(10)] # ["0","1","2",...]
#--- Create directed edge list (removing duplicated)
edge_list = set()
for s in keyLogs:
  edge_list.add((s[0],s[1]))
  edge_list.add((s[1],s[2]))
#print(edge_list)

#--- Create the graph from nodes/edges
G = nx.DiGraph()
G.add_nodes_from(node_list)
G.add_edges_from(edge_list)
#--- Remove isolated node
isolated = [n for n in G.nodes if len([ i for i in nx.all_neighbors(G, n)]) == 0]
print(f"isolated nodes: {isolated}")
for n in isolated:
  G.remove_node(n)
  
print(f"Answer : {''.join(list(nx.topological_sort(G)))}")
nx.draw_networkx(G)
plt.show
```
入力されたグラフを**plt.show**で図示した結果がこれです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/d1ac5d9f-6ff3-9fea-842b-550f6c17827b.png)

### ファイルから読むプログラム

```python 
# show upload dialog
from google.colab import files
uploaded = files.upload()
#---- read numbers from file 
f = open("p079_keylog.txt")
keyLogs = f.readlines()
f.close()
keyLogs = list(map(lambda s: s.strip(),keyLogs))
print(keyLogs[:10])

```

（開発環境：Google Colab）
競プロの環境構築をM1 Macでする（C++ gcc）

すごく，久しぶりの更新です．

同じインターン生にすすめられて競プロをやりたくなりました．
画像処理の研究をやっていてOpenCVがC++にあるのと，競プロではC++が圧倒的に速くてメモリ消費が少ないのでC++勉強することにしました．

AtCoder上でもコンパイル実行できるんですが，ローカルの慣れ親しんだ環境でやりたかったのでMac M1チップで環境構築しました．

↓↓↓だいたいは下の記事に書かれているので見ればできると思います．

https://qiita.com/EngTks/items/ffa2a7b4d264e7a052c6


私の場合は，以下のコマンドでハマりました．

```
// clangではなくgccの方を呼び出したいので、下記の処理を行う。
// /usr/local/bin/にg++(gcc)のシンボリックリンクを作成する。
$ ln -s /usr/local/bin/g++-9 /usr/local/bin/g++
```

以下に修正したところ動きました．
ファイルの場所を見たところg++-9でなくg++-11だったのと，「強制」と「置き換え」のオプション指定を追加しないと動かなかったですね〜

```
$ ln -f -n -s /usr/local/bin/g++-11 /usr/local/bin/g++
```

ただ，コンパイルしたとき

```
ld: warning: dylib (/usr/local/Cellar/gcc/11.2.0_3/lib/gcc/11/libstdc++.dylib) was built for newer macOS version (11.5) than being linked (11.3)
```

っエラーが出たのは気になりますね，実行はできたんですけど

それでは〜
また　flutter doctor -v　でエラー

Flutterでエラーが出ました。
またかよ。ちっ
回答は、下記のとおり



flutter doctor -v
[√] Flutter (Channel stable, 2.10.0, on Microsoft Windows [Version 10.0.22000.434], locale ja-JP)
    • Flutter version 2.10.0 at C:\develop\flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 5f105a6ca7 (7 days ago), 2022-02-01 14:15:42 -0800
    • Engine revision 776efd2034
    • Dart version 2.16.0
    • DevTools version 2.9.2

[!] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
    • Android SDK at C:\Users\nakan\AppData\Local\Android\sdk
    X cmdline-tools component is missing
      Run `path/to/sdkmanager --install "cmdline-tools;latest"`
      See https://developer.android.com/studio/command-line for more details.

〇これの対応は
File　Setting　AndroidSDK　SDKTool　から、AndroidSDKCommandlinetoolをインストールして終了

    X Android license status unknown.
      Run `flutter doctor --android-licenses` to accept the SDK licenses.
      See https://flutter.dev/docs/get-started/install/windows#android-setup for more details.

〇これの対応は
PowerShellから　flutter doctor --android-licenses
とコマンドを打って終了


[√] Chrome - develop for the web
    • Chrome at C:\Program Files\Google\Chrome\Application\chrome.exe

[X] Visual Studio - develop for Windows
    X Visual Studio not installed; this is necessary for Windows development.
      Download at https://visualstudio.microsoft.com/downloads/.
      Please install the "Desktop development with C++" workload, including all of its default components

〇これの対応は
VisualStudioっていらないだろーって事で放置

[√] Android Studio (version 2021.1)
    • Android Studio at C:\Program Files\Android\Android Studio
    • Flutter plugin can be installed from:
       https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
       https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 11.0.11+9-b60-7590822)

[√] Connected device (3 available)
    • Windows (desktop) • windows • windows-x64    • Microsoft Windows [Version 10.0.22000.434]
    • Chrome (web)      • chrome  • web-javascript • Google Chrome 98.0.4758.81
    • Edge (web)        • edge    • web-javascript • Microsoft Edge 97.0.1072.76

[√] HTTP Host Availability
    • All required HTTP hosts are available

! Doctor found issues in 2 categories.

です。
再度、flutter doctor -vでVisualStudio以外はOKです。
laravel ServiceProvider作成の手順

# 概要

- laravelにてServiceProviderの作成方法をメモ的にまとめる。
- 今回はカスタムバリデーションクラスを紐付けるためのValidatorServiceProviderの作成方法を例にまとめてみる。

# そもそも

- 実際ServiceProviderは新規で作成せずとも、初期段階で存在しているAppServiceProviderに記載すれば事足りる。
- しかし、何でもかんでもAppServiceProviderに記載することはわかりにくさにもつながる。
- できることなら、機能毎などにServiceProviderを作成して記載するべきなのかもしれない。

# 方法

1. 下記コマンドを実行してValidatorServiceProviderクラスを作成する。

    ```terminal
    $ php artisan make:providers ValidatorServiceProvider
    ```

1. config/app.phpの`'providers'`の中に記載して作成したValidatorServiceProviderを登録する。

    ```
    /*
    |--------------------------------------------------------------------------
    | Autoloaded Service Providers
    |--------------------------------------------------------------------------
    |
    | The service providers listed here will be automatically loaded on the
    | request to your application. Feel free to add your own services to
    | this array to grant expanded functionality to your applications.
    |
    */

    'providers' => [

        /*
         * Laravel Framework Service Providers...
         */
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
        Illuminate\Bus\BusServiceProvider::class,
        Illuminate\Cache\CacheServiceProvider::class,
        Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
        Illuminate\Cookie\CookieServiceProvider::class,
        Illuminate\Database\DatabaseServiceProvider::class,
        Illuminate\Encryption\EncryptionServiceProvider::class,
        Illuminate\Filesystem\FilesystemServiceProvider::class,
        Illuminate\Foundation\Providers\FoundationServiceProvider::class,
        Illuminate\Hashing\HashServiceProvider::class,
        Illuminate\Mail\MailServiceProvider::class,
        Illuminate\Notifications\NotificationServiceProvider::class,
        Illuminate\Pagination\PaginationServiceProvider::class,
        Illuminate\Pipeline\PipelineServiceProvider::class,
        Illuminate\Queue\QueueServiceProvider::class,
        Illuminate\Redis\RedisServiceProvider::class,
        Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
        Illuminate\Session\SessionServiceProvider::class,
        Illuminate\Translation\TranslationServiceProvider::class,
        Illuminate\Validation\ValidationServiceProvider::class,
        Illuminate\View\ViewServiceProvider::class,

        /*
         * Package Service Providers...
         */

        /*
         * Application Service Providers...
         */
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        // App\Providers\BroadcastServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,

        // 下記を追記
        /*
         * Add developer Service Providers...
         */
        App\Providers\ValidatorServiceProvider::class,
    ```
[Blue Prism]デバッグ実行時に「例外発生時に一時停止」をONにするとちょっと便利かもっていう話 #blueprism

# 「例外発生時に一時停止」ってどこにあるの
ここです。
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/69b7585a-39de-b2a1-858f-c1e650c32d7e.png)
# どんなもの
ブレークポイントは便利にお使いになっているかたも多いでしょう。ステージの上で右クリックすると出てくるメニューの中にあって、設定するとステージが赤く囲われるアレです。
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/2a844fac-d8c0-ddd6-505e-1911dde53af3.png)
ヤバそうなところこのへんかなーって見当をつけた場所にブレークポイントを置いてそこまで実行させておいて、そこからステップ実行して1個ずつ確認するとか、単体テストのときに実行途中で一時的にデータアイテムの値を変えるとか……。そんな感じでお使いであろうアレ。

「例外発生時に一時停止」って、端的に言うと、例外が発生したところの復元ステージを自動でブレークポイントとしてくれるものです。

# 使ってみた
こんなプロセスを作ってみました。計算ステージ2個だけ。
![007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/a0fc59ec-6751-8cc4-7113-d6ae5dca9bb5.png)
![008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/ce6a81e7-2614-3617-60b3-2d37f3b0e7a8.png)![009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/a72fc027-ab7b-913d-d7e9-860a2e0d30fc.png)
こうすると2個目の計算ステージのところでInternalで例外になります。Excelでいうところの「#DIV/0!」ってやつですね。
このまま実行するとこうなります。
![010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/22ff2f56-c480-a778-36f7-53ef7c282ced.png)
で、「例外発生時に一時停止」をONにして同じように実行すると
こうなります。例外スローまでいかずにブレークポイントで止まったのと同じ挙動をしてくれる感じ。
赤で示したところにコケたステージ名が出ます。上図の「そのまま実行した」場合と出てるものがちょっと異なっています。
![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/9ebf650c-a887-6fa1-c8f7-fa91d25542ad.png)

つまり
ヤバそうなところここかなーって見当をつけた場所に1個ずつ手でブレークポイントを設定して、大丈夫そうなところは手でまた1個ずつ外して……みたいな手間をあんまりかけずに、今ここで例外スローされましたよ！っていうのをスムーズに見つけることができる。大きいプロセスで、どこらへんでコケているのか手っ取り早く見つけたいときとかにちょっと便利な機能です。
制御室で実行するときには特に影響がないので、デバッグ実行のときはずーっとONにしておいて損はないです。

# 補足
[6.6のリリースノート](https://bpdocs.blueprism.com/bp-6-9/ja-jp/Release%20Notes/Release%20Notes/rn-6-6.htm?tocpath=%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%83%8E%E3%83%BC%E3%83%88%7C_____13) の「修正とマイナーな改良」の項に

:::note info
サブプロセスで処理される例外により、［デバッグ］メニューの［例外発生時に一時停止］オプションが選択されているかどうかに関係なく、プロセスが停止するプロセススタジオの問題が解決されました。
:::
と記載があるので、つまりそれより前のバージョンだとサブプロセスで例外スローされたときにうまく拾ってくれないかもってことなんでしょう。
なので、6.6より後でこの機能を使うのが安心でいいかなあと思います。
0209スピーチ用

### プログラミング言語

Hello, World!プログラム

##Java

![tio.run_ (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2354903/6dd72914-e79f-0c05-f259-91315199fa31.png)


## Cow
牛の鳴き声"MOO"をMとm、Oとoに分け、3文字の組み合わせをトークンと解釈する。それ以外の文字はコメントとして扱う。

![tio.run_ (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2354903/7d420a82-cae0-4a95-d344-66dd7bbfd4f4.png)


# WhiteSpace
通常入力画面：
![tio.run_ (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2354903/7dd3f0b3-10b0-4010-3fc4-5768f3c909ed.png)

選択表示：
![tio.run_ (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2354903/fea52d61-9dae-a24f-86d5-313fb362056a.png)


# Shakespear
- 登場人物のリストでスタック宣言する。
- 登場人物の会話で、それぞれの先頭にある値をプッシュ・ポップして入出力を実行
- 登場人物が質問を投げかけることで、条件文

戯曲：ハムレットの構成
![スクリーンショット 2022-02-09 223743.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2354903/e84d831c-588c-57ae-fbbc-8052c67f08a8.png)

![tio.run_ (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2354903/f04cac1d-c6db-fe54-0b78-7c400c661180.png)

当たり前だが会話の中身は比較文ばかりで「To be, or not to be」のような名言は使われていない。
ちなみによく出てくる「Thou art」は古英語で「You are」
でも、プログラミング中でYou areと併用されているので何か使い分け方がある？
<br>

# 文言 Wenyan
![ide.wy-lang.org__file=helloworld%2B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2354903/4074c76f-142d-29fa-3c6b-77490bdf7590.png)

![スクリーンショット 2022-02-09 230801.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2354903/6f833232-2193-47b1-25dd-9d0c35f2ba16.png)


山月記の「李徴」も虎にならずにプログラマーに転職できたのに。
VSCODE プラグイン
![スクリーンショット 2022-02-09 123941.PNG.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2354903/c804de2c-a39a-01e1-6db4-5fb555e0abd5.jpeg)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2354903/53462f92-3de0-794f-c490-e7d14f903e1b.png)

|Triggers|Snippet||
|---|---|---|
|if	|若⋯者。⋯也。||
|else	|若非。⋯也。||
|for	|為是⋯遍。⋯云云。||
|break	|乃止。||
|while	|恆為是。⋯云云。||
|function	|吾有一術。名之曰「⋯」。是術曰。||
|int	|吾有一數。曰⋯。名之曰「⋯」。||
|str	|吾有一言。曰「「⋯」」。名之曰「⋯」。||
|bool	|吾有一爻。曰陰。名之曰「⋯」。||
|array	|吾有一列。名之曰「⋯」。||
|object	|吾有一物。名之曰「⋯」。||
|Scanner |輸入|標準入力をすべて受け取る|
|split |分裂|第2引数の文字でsplitする|
|trim |刪除空白|文字列の前後の空白文字を削除する|
|parseInt |解析為整數|文字列を数値にパースする|
|parseString |轉換為字符串|数値を文字列に変換する|
|sort |排序|配列をソートする|
実機無しでECHONET Litコントローラーアプリケーション開発を進められるツール

ECHONET Liteコントローラーアプリケーション開発で実機無しでも動作確認ができるツールを探していたところ、"Device Emulator"なるエミュレーターが公開されているのでインストールしてみました。Windows, Mac OS, Linuxに対応しています。Raspberry Piなどにインストールして利用するのがよいかと思われます。

# インストールPC
* MacBook Pro Intel chip macOS Monterey V12.1

# インストール方法
* Node.jsのインストール
* Device Emulatorのインストール
* Device Emulatorの起動

Node.jsのインストール
[ダウンロードサイト](https://nodejs.org/ja/download/)からv12以上のインストーラーを選択してダウンロード、インストール。インストールしたらターミナルでバージョン確認

```
$ node -v
```

Device Emulatorのインストール
[ダウンロードサイト](http://sh-center.org/sdk)からzipファイルをダウンロードできます。zipファイルをお好みの場所に展開。ターミナルから展開したパッケージ内にある"elemu"ディレクトリーへ移動。コマンドで依存モジュールをインストール。

```
$ npm install
```

Device Emulatorの起動
"elemu"ディレクトリー内でコマンドを実行。"--enable-console-packet"オプションをつけるとパケットの送受信をターミナル上に出力してくれます。

```
$ node index.js --enable-console-packet
```

ブラウザーでダッシュボードを起動してお好みのデバイスオブジェクトを登録することができます。

```
$ http://localhost:8880
```

ダッシュボード画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1954348/98dd8cb6-87d2-b096-d0d3-d8fcea207c53.png)


試しにECHONET Liteコントローラーアプリケーション開発用PCからECHONET Lite機器検索コマンドを送信するとターミナル上でパケットの送受信が表示される。
これで実機なしでもある程度アプリケーション開発を進めやすくなりそうです。

ターミナル上のパケット送受信出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1954348/75d70e58-46b6-f172-55cb-5c9b0f750a0d.png)
RX: Device Emulatorの受信パケット
TX: Device Emulatorからの送信パケット

# 参考
* [Node.js ダウンロード](https://nodejs.org/ja/download/)
* [Device Emulator ダウンロード](http://sh-center.org/sdk)
【Unity】プロパティの変更に応じてインスタンスを生成するエディタ拡張

Unityエディタでプロパティの変更に応じてインスタンスを生成するエディタ拡張です。
![CreateInstanceByPropertyChangeSample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/903db3f0-640c-a1d4-af27-191586a9c143.gif)

`OnInspectorGUI`でプロパティに変化があるかチェックして、変化があれば既存のインスタンスを削除して新たなインスタンスの生成を行います。

```c#:CreateInstanceByPropertyChangeSample.cs
using System.Linq;
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif

public class CreateInstanceByPropertyChangeSample : MonoBehaviour
{
    [SerializeField] GameObject prefab;
    [SerializeField] int count = 0; 

    void Reset()
    {
        DestroyChildren();
    }

    void DestroyChildren()
    {
        foreach(var child in transform.OfType<Transform>().ToArray())
        {
#if UNITY_EDITOR
            if (EditorApplication.isPlaying)
            {
                Destroy(child.gameObject);
            }
            else
            {
                DestroyImmediate(child.gameObject);
            }
#else
            Destroy(child.gameObject);
#endif
        }
    }

    public void CreateInstances()
    {
        if (prefab == null) return;

        DestroyChildren();
        for (var i = 0; i < count; ++i)
        {
            var position = new Vector3(i, 0.0f, 0.0f);
            Instantiate(prefab, position, Quaternion.identity, transform);
        }
    }
}

#if UNITY_EDITOR
[CustomEditor(typeof(CreateInstanceByPropertyChangeSample))]
public class CreateInstanceByPropertyChangeSampleEditor: Editor
{
    SerializedProperty prefab;
    SerializedProperty count;

    void OnEnable()
    {
        prefab = serializedObject.FindProperty("prefab");
        count = serializedObject.FindProperty("count");
    }

    public override void OnInspectorGUI()
    {
        var prevPrefab = prefab.objectReferenceValue;
        var prevCount = count.intValue;
        serializedObject.Update();
        prefab.objectReferenceValue = EditorGUILayout.ObjectField("Prefab", prefab.objectReferenceValue, typeof(GameObject), true);
        count.intValue = EditorGUILayout.IntSlider("Count", count.intValue, 0, 10);
        serializedObject.ApplyModifiedProperties();

        if (prevPrefab != prefab.objectReferenceValue || prevCount != count.intValue)
        {
            ((CreateInstanceByPropertyChangeSample)target).CreateInstances();
        }
    }
}
#endif
```

---

`OnValidate`でプロパティの変化を検出できるので、それを使えばいいのかなと最初思っていましたが、`OnValidate`内でインスタンスを生成をしたり、削除したりすると警告やエラーが出るので難しそうでした...
`git pull`でエラーが消えない

# 現象
```
fatal: credential-cache unavailable; no unix socket support
```

# 対策
```
git config -l --show-origin
```
で設定を見直す

# 参考
https://stackoverflow.com/questions/67951554/error-fatal-credential-cache-unavailable-no-unix-socket-support/67951650#67951650
SPSS Modeler ノードリファレンス 3-4 フィルター

# 3-4 フィルターノード[フィールド設定タブ]
<img width="200" alt="107_89フィルター.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/65c15544-c218-a123-cf58-86da1542e960.png">

## 1.ノードの目的
フィールドのフィルタリングとフィールド名の変更


## 2.解説動画（60秒）
<iframe width="560" height="315" src="https://www.youtube.com/embed/fRYasNCeQeI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## 3.クイックスタート

いくつかのフィールドを削除してフィールド名をシンプルにします。
＊入力データは[5.参考情報]からダウンロードできます。
![スクリーンショット 2022-02-08 15.18.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1328d312-62bb-fc2e-01d8-090ab32fb2d7.png)

[可変長ファイル]から[フィルター]、[テーブル]の順に接続します。
![スクリーンショット 2022-02-08 15.04.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/46fa64d3-5056-3020-3ed6-255eea22f3a9.png)

[フィルター]を編集します。[年月][化粧品][靴]というフィールドが保持されるようにします。
![スクリーンショット 2022-02-08 15.05.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/019d2cbe-c2c9-241d-8224-fbaac28e92d3.png)

[テーブル]を実行します。
![スクリーンショット 2022-02-08 15.06.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/cbcd43f0-9688-58df-2192-fbb5fdd97e64.png)

### フィルターノードのヒント

フィルターアイコンに便利なメニューが用意されています。以下はフィールド名の匿名化
です。外部にモデル開発を依頼する場合が想定されます。複数レスポンスはアンケートの複数回答可のグループセットを意味します。

![スクリーンショット 2022-02-08 15.25.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/489066aa-7157-44eb-ca42-3ec2d61127d6.png)


## 4.Tips

### フィールド名を一括変換して見やすく整える

https://www.ibm.com/blogs/solutions/jp-ja/modeler-tips-11/

### SPSS Modelerで列名を正規表現で変更する

https://qiita.com/kawada2017/items/025352797a87dd85fbea

##5.参考情報

#### 利用データ

右クリックでリンク先を保存してください。

https://raw.githubusercontent.com/yoichiro0903n/blue/main/Longfieldname.csv

#### SPSS ModelerのフィルターノードをPythonで書き換える

https://qiita.com/kawada2017/items/7e10618edd5e1f3d6ebd

#### ノードのヘルプ

https://www.ibm.com/docs/ja/spss-modeler/18.3.0?topic=nodes-filtering-renaming-fields

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/items/4bf813e6cba84b2a1008

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee
レガシーコード解析アプリの作成

# はじめに
　仕事で手が空いた時間を使用して、今後のことを踏まえ、汎用機のレガシーコードを解析するためのアプリケーション開発を行っていました。少しそれっぽくなってきたので一度ここでまとめようと思います。

# 背景
　携帯、テレビ及びゲーム機開発のようなアーキテクチャが数年に１回必ず変わるような現場では考えにくいかもしれませんが、汎用機を用いて数十年掛けて保守・開発を行う職場という場所が存在します。その際、長年作られてきたプログラムを解析する場合、汎用機が独自に持つGrep等の機能を使用し、各担当が個別に調査を行います。一方、汎用機でGrepを動作させる必要があるため、汎用機の稼働時間中に実行すると負荷を掛ける可能性がある等のリスクが生じます。今回、そのようなリスクを回避するため、汎用機のソースコードを外に吐き出しデータベース化することで、特定断面のソースコードを解析するアプリを開発します。

# 環境
* Windows2012 R2
* MySQL8.0
* Django
* wsgi
* IIS
* Python
* C#

# 方法
　実際に行っている内容は非常に単純で以下のとおりです。
1. 汎用機から独自のソースコードを抽出する（言語：COBOL）
　汎用機からソースコードを抽出する方法は処理系に依存すると思いますので割愛しますが、私達のシステムではFTPでの抽出が可能です。その際、FTPのASCIIモードで取得することでEBCDICという形式のソースコードをJIS形式で取得することが可能です（この抽出を毎朝特定のファイルサーバで行うようにスケジュール設定します。）。
2. 各ソースコードを解析する（言語：C#）
　　若干説明が雑ですが、各ファイルを以下の通り定義します。
　2-1. 汎用機のソースコードは大きく２種類に分かれます。 
　　・ 汎用機専用バッチファイル（以下「HBF」という。）
　　　 Windowsの世界でいう「bat」「powershell」に相当する。バッチのコントロールを行う。
　　・ COBOLプログラム
　　　 汎用機で動作するオンラインシステム及びバッチシステムの実行プログラムを指す。
　2-2. 更に、ファイルとして、以下のファイルが存在する
　　・ レコード定義ファイル（以下「RDF」という。）
　　　 私達の汎用機は、固定長ファイル処理系であるため、固定長のレコード定義を行うファイルを指す。
　　・ シーケンシャルファイル（以下「SAM」という。）
　　　 Windowsの世界でいう「テキストファイル」に相当する
　　・ 汎用機特殊ファイル（以下「VSAM」という。）
　　　 Windowsの世界でいうデータベース上のテーブルに相当する
　　　（かなり雑な説明ですが、細かい点は[参考](https://www.ibm.com/docs/ja/cobol-zos/6.1?topic=program-processing-vsam-files)等に委ねます。）
3. 解析結果をDBにインポートする（使用するDB：MySQL）
　ソースコード解析をいくつかの観点で行います。以下に示すような何種類かのパターンで正規表現等を駆使し、解析及び抽出を行うことでソースコード及びファイルの依存関係の調査に役立つデータベースを構築します。
4. Webアプリとして業務担当に公開する（言語：BootStrap, Django, wsgi, IIS）
　DjangoとBootStrapを用いて、社内のプライベートクラウド環境で公開する。仕様については、業務担当が使いやすいようにできる限りオーダーメイドすることとし、公開と開発を繰り返して完成させる。

# 妥協点
　本来、このようなソースコード解析ではlexやyaccを用いて構文解析を行い、その構文解析結果を用いて独自の解析系を作り出すのが一般的のようです。ですが、「私１人で行っている（保守できる範囲に限界がある）」及び「要件としてそこまでの解析を必要としていない（実現したいことは、コンパイラに比べ非常に単純）」という理由で正規表現によるソースコード解析を行っています。更に１ランク上の解析を想定している方は、[参考](#参考)に記載した資料を御確認ください。

# 参考
○[コンパイラ: 作りながら学ぶ](https://www.amazon.co.jp/コンパイラ-作りながら学ぶ-中田-育男/dp/4274221164/ref=sr_1_1?qid=1642414772&s=books&sr=1-1)
　コンパイラ作成の方法がコードとともに説明されており、体系的なコード解析を行うことが可能です。更に一歩進んだ解析を目指す方にはお勧めです。
○[スモールコンパイラ の制作で学ぶ プログラムのしくみ](https://www.amazon.co.jp/スモールコンパイラ-の制作で学ぶ-プログラムのしくみ-石田-綾/dp/4774121770/ref=sr_1_8?qid=1642414772&s=books&sr=1-8)
　中古本であれば、数百円で購入できます。個人的には構文解析であれば十分この本で役に立つと考えています。難しい内容が非常に直感的で安直に記載されています。
○[VSAM ファイルの処理](https://www.ibm.com/docs/ja/cobol-zos/6.1?topic=program-processing-vsam-files)
　IBMのページです。VSAMの定義及び処理について記載されています。IBM以外にも各社でほぼ同じような順次、索引付き等のファイルを定義できます。