OmniAICreator/Qiita-1.07M huggingface dataset:
Automation 360 Community EditionでPythonコードを動かす

A360の目玉機能として、PythonやVBScriptを呼び出したり、インラインで書き込める。というものがあります。
今回はその中で、データ分析や機械学習、画像解析などなど、さまざまな扱いやすいライブラリが用意されている、
PythonをA360から実行してみる方法をご紹介します。

Pythonのコード自体は今回は非常にシンプルな、メッセージボックスで任意のメッセージを表示する。というものですが、うまく動いたら色々と試してみてください。

#準備するもの
Automation Anywhere A360 Community EditionのセットアップされたPC

#大まかな流れ
色々ごちゃごちゃーっと書いてますが、シンプルにまとめると、やる事はこれだけです。
#### 設定
Pythonをセットアップする
Windows側の設定をする（Python.exeにPathを通す）
#### A360
Botを作る
実行する

#手順（設定編）

##1. Python公式ページのDownloadセクションからPythonをダウンロード。
ver2系、3系どちらでも大丈夫です。（私はver 3.8を落としました。）

Welcome to Python.org
https://www.python.org/

##2. Pythonをインストール。
実行ファイルを起動して案内に従って入れるだけです。

##3. A360でPythonを呼び出せるようにするための設定。
コマンドプロンプトで"Python"と打っただけでPythonが起動できるように設定します。

#### I. コントロールパネルを開く。（Win+PauseBreakで一発で開きます）
#### II.左側のメニューの「システムの詳細設定」をクリック。 
#### III.「詳細設定」のタブを開く。 
#### IV.「環境変数」をクリック。
#### V. 環境変数の設定-1
上下に似たようなリストが並んでいますが、現在ログインしているユーザにのみ適用するなら上側、
PCに登録された全ユーザに適用するなら下側のリストで、「Path」という項目を探し、開きます。
#### VI. 環境変数の設定-2
環境変数「Path」の設定ダイアログが開きますので、右側のメニューの「New」をクリック。
Python.exeのインストールされているフォルダのパスを記入。
私の環境では以下のようなパスにインストールされていました。
C:\Users\ユーザ名\AppData\Local\Programs\Python\Python38-32

## 4. Python.exeにパスが通っているかを確認する
コマンドプロンプトを開きます。（Win+r -> cmdと打ってEnter。という方法が早いです。）
コマンドプロンプトが開いたら、「Python」と打ってEnterキーを押します。
以下のような表示が出ていれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/4ac880f3-e4a4-dee8-f407-12e9865f8b9a.png)


#手順（A360編）
準備が出来たら、A360で実際にPythonのコードを実行してみましょう。

## 1. まず、新しいBotを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/48dd9af4-b17b-bb8b-d206-65bf7a1498d5.png)

## 2. Python scriptのアクションを挿入
左側のメニューからPython Scriptを探し、ツリーを開きます。（検索しても良いです。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/4ed37890-6250-d235-7379-0c8a9096ef1d.png)

Python Script: Open
Python Script: Execute script
Python Script: Close
という順にアクションをドラッグして配置してください。

こんな感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/cf0d0a1c-57ed-5491-3a43-ebb3a5676e68.png)

Python Script: Openのみ以下のように設定してみてください。他のアクションは今回はそのままで大丈夫です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/c3e9768a-2822-696e-bf4b-25db435595fc.png)

Pythonのコードは以下の通りです。

```py:SimpleMessageBox.py
from tkinter import messagebox
messagebox.showinfo('PythonのGUI', 'メッセージ')
```

今回はManual inputを選択して、直接Pythonのコードを書き込んでいますが、
Import existing fileという方を選ぶと、.pyという拡張子のPythonのソースファイルを呼び出すことも出来ます。

Python runtime versionは、見たままなのですが、Pythonのバージョンが2系なら2、3系なら3を選択します。
今回、ver 3.8.0を使用していますので、「3」を選んでいます。

設定が終わったら保存ボタンを押しましょう。（各ノードの「適用」ボタンを押すのをお忘れなく。）

## 3. 実行してみる
実行ボタンを押して、以下のようなメッセージボックスが表示されれば、成功です☆彡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/8fd73e20-c9d4-227e-64bb-258bff377ced.png)

元々Python使いの方はもちろん、今回が初めてという方も、Pythonを使えば様々な事が可能になりますので、
これを機会にぜひ色々と試してみてください。
typeormのTransactionデコレーターの引数に関するメモ

NestJSでの実装の話。
引数を取らないメソッド(hogeMethod)では以下のようにthis.entityManagerを別メソッドに渡して利用できていたのだが

```typescript
@Injectable()
export class HogeService {
  constructor(@InjectEntityManager('db_name') private readonly entityManager: EntityManager) {}

  @Transaction('db_name')
  async hogeMethod() {
    const result = await getHoge(this.entityManager);
  }
}
```

以下のようにメソッドが引数を受け取るように定義をしたところthis.entityManagerが利用できなくなってしまった。

```typescript
@Injectable()
export class HogeService {
  constructor(@InjectEntityManager('db_name') private readonly entityManager: EntityManager) {}

  @Transaction('db_name')
  async hogeMethod(pamar1: string) {
    const result = await getHoge(this.entityManager);
  }
}
```


以下typeormのドキュメント
https://github.com/typeorm/typeorm/blob/master/docs/transactions.md#transaction-decorators

どうやらTransactionデコレーターを利用する際はTransactionManagerをProvideしないといけないみたい。
メソッドが引数を受け取らない定義の時はおそらくよろしく処理してくれていたのかな。

なので修正後は以下のように定義した。


```typescript
@Injectable()
export class HogeService {
  constructor(@InjectEntityManager('db_name') private readonly entityManager: EntityManager) {}

  @Transaction('db_name')
  async hogeMethod(
    param1: string,
    @TransactionManager() entityManager?: EntityManager,
  ) {
    const result = await getHoge(entityManager);
  }
}
```

こうすることでエラーが発生しなくなった。
entityManagerをOptionalとすることで利用する際に引数を省略できる。

```typescript
const result = await hogeMethod('pamar string!!!');
```

地味に４時間くらいハマった・・・。
【 Laravel 6 】ユーザーログイン機能の実装

#【 Laravel 6 】ユーザーログイン機能の実装

2019年11月から、[Laravel歴数ヶ月の初心者が投稿型ナレッジベースのコミュニティサイトを作る](https://qiita.com/AkiYanagimoto/items/216ea9549e758342baab "投稿型ナレッジベースのコミュニティサイトを作る")というチャレンジ中。作りたいアプリケーション→機能を因数分解→ググる→先人の轍をたどる（写経する）→ぬかるみにはまる→エラー解消の神を探す→解決を繰り返す日々( ·ㅂ·)و 。備忘録として、Qiitaに投稿しています。


##ユーザーログイン機能を作成
下記URLに倣って、ユーザーログイン機能を実装。
Laravel 6「make:Auth」が無くなった 〜Laravel6でのLogin機能の実装方法〜MyMemo
https://qiita.com/daisu_yamazaki/items/a914a16ca1640334d7a5

```ruby:ターミナル
$ php artisan serve
```

下記の通り、画面右上に、「LOGIN」と「REGISTER」が表示されていればOK。
〈ﾌﾞﾗｳｻﾞﾃﾞｶｸﾆﾝ〉
<img width="949" alt="スクリーンショット 2019-09-10 13.26.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406662/0d9d4cd7-0e35-daf8-6cb1-4d47db96d235.png">


以上です(ง ´͈౪`͈)ว
rails cが動かねぇ！

# rails c が息をしていない…
別件でrailsのバージョンアップをして、railsを入れ直した後のこと。
consoleで確認したいことがあり、```rails c```を叩く。
…反応がない、ただの屍のようだ。
いや困るねん。やめてクレメンス。

# いらないプロセスは躊躇なく殺そうね
てことでプロセスを確認。

```
ps aux | grep rails
```
…何もないな。
調べたところ、```rails c```ではspringというプロセスも走るとのこと。

```
ps aux | grep spring
~~ 8324   0.0  0.0  4352360   3228 s009  S+   火03PM   0:00.76 spring server | ~~ | started 47 hours ago
```
いやがった！！お前のせいか！！

```
kill -9 8324
```
そしてめでたくconsoleが起動。
いやぁ良かった。
無駄なプロセスは殺そう。

## 追記
```
spring stop
```
でも可。
これだとプロセス確認せずに止められるから便利ね。
ありがとう、友よ。
Linux上でLiveUSB作成

# 参考

[こちらは初歩から実践までとても分かりやすかったです!](https://amzn.to/2BiYIMX)


# 方法

1. PCにUSBを接続したら`lsblk -f`でUSBのパスを確認コピペ
2. `umount /USBのパス`でUSBをアンマウント
3. `sudo dd bs=4M if=/ISOの保存場所 of=/USBのパス status=progress && sync`
4. records in records out の文字が出たら完了


# 失敗した場合、一度USBをフォーマットする。

```
1.アンマウントする
umount /dev/usbのパス
2.NTFSにクイックフォーマット
sudo mkfs -t ntfs -Q -L usbdisk /dev/sdc1
3.再度トライしてみる。
```

# フォーマットできなかったとき
https://qiita.com/osorezugoing/items/bc2e641d50a0a655663a
【 Laravel 6 】新規プロジェクト作成

#【 Laravel 6 】新規プロジェクト作成

2019年11月から、[Laravel歴数ヶ月の初心者が投稿型ナレッジベースのコミュニティサイトを作る](https://qiita.com/AkiYanagimoto/items/216ea9549e758342baab "投稿型ナレッジベースのコミュニティサイトを作る")というチャレンジ中。作りたいアプリケーション→機能を因数分解→ググる→先人の轍をたどる（写経する）→ぬかるみにはまる→エラー解消の神を探す→解決を繰り返す日々( ·ㅂ·)و 。備忘録として、Qiitaに投稿しています。


##新規プロジェクト作成

MAMP htdocsディレクトリでLaravelの新規プロジェクトを作成
(˘ਊ˘)ｺﾏﾝﾄﾞﾀﾀｸﾖ

```ruby:ターミナル
$ Laravel new sample_board
```

作成したプロジェクトのディレクトリへ移動
(˘ਊ˘)ｺﾏﾝﾄﾞﾀﾀｸﾖ

```ruby:ターミナル
$ cd sample_board
```

仮想サーバーの立ち上げ

```ruby:ターミナル
$ php artisan serve
```

Laravel development server started: <http://127.0.0.1:8000>と表示されればOK。
ローカルホストでLaravelのホーム画面が表示されればOK
<img width="861" alt="スクリーンショット 2019-09-10 0.07.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406662/5dd729a2-d27b-8077-f807-ae58bb495b25.png">

以上です(ง ´͈౪`͈)ว
JavaのHashSetが恋しくなるTypescript信者

*圧倒的手抜き記事* @[ぶぅちゃんズ Advent Calendar](https://qiita.com/advent-calendar/2019/bu-chans)
いつも使っている`utils.ts`に書いてあったやつをコピペして終わり。

## 何がしたいか

* JavascriptのSetはプリミティブ型でしか重複なし集合として扱われない
* JavaのHashSetは自分で同値条件を設定できる。同値判定を最小限に抑えるために、hash関数を設定することもできる。
* Javaのやつのほうが便利なことが多いので、HashSet実装する

## 注意

* Javaは`Java.lang.Object`でメソッド`equals`と`hashCode`を実装する必要がありますが、同値判定とハッシュ関数は高階関数で実現します。

## コーーーーード

```Typescript

export class ObjectSet<T> {

  map: Map<string, T[]>

  constructor(list: T[], public isEq: (t1: T, t2: T) => boolean, public hash: (t: T) => string) {
    this.map = new Map();

    for(let l of list) {
      this.add(l);
    }
  }

  add(t: T) {
    let lst = this.map.get(this.hash(t));
    if(lst) {
      if(lst.every(l => !this.isEq(l, t))) {
        lst.push(t);
      }
    } else {
      this.map.set(this.hash(t), [t]);
    }
  }

  has(t: T): boolean {
    let lst = this.map.get(this.hash(t));
    return !!lst && lst.some(l => this.isEq(l, t));
  }

  toList(): T[] {
    return Array.from(this.map.entries(), ([_, ts]) => ts).flat();
  }
}
```

12/10　修正：`Array.from(m).map(([_, ts]) => ts)`は`Array.from(m, ([_, ts]) => ts)`の方が短いし速いので。
circleciをローカル環境でビルドし、debugする

一人アドベントカレンダーといいつつ全く期日感が守れていないので、、、追っかけつつ25日までにはオンタイムで記事投稿していきます。

## やりたいこと
circleciを大きく修正するとき、いちいちコミットしてプッシュして、ビルド結果をみて、、、
というのが不毛に感じませんか？

ローカルでデバックしたい！

## やること
circleciのcliツールを使用して、ローカルのdocker環境のなかでciビルドをテストすることができます。

今回は以下の公式docを参考にしながら実行環境を構築する手順を紹介します。

https://circleci.com/docs/ja/2.0/local-cli/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103475/4e6593aa-26a8-7851-d7b8-c69d10320fda.png)

## 
#### circleci cliをインストールします

```shell
brew install circleci
```

#### circleci setup （認証設定などを行います）

```shell
circleci setup
```

#### ジョブの実行

```shell
circleci local execute --job JOB_NAME
```

基本はここまできたらあとは修正して、ジョブを実行して、修正して、、を繰り返せばOKです。

---
おまけ情報です

#### configコマンド
configファイルのバリデーションチェックのコマンドも用意されています
フォーマットや構成の確認をするのに使うとよいでしょう。

```shell
circleci config validate
```

また、`process`を使うと`orb`や`executors`を使用している場合、変換を行ってくれます。
（[orb](https://circleci.com/docs/ja/2.0/creating-orbs/#orbs-%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88)や[executors](https://circleci.com/docs/ja/2.0/using-orbs/#executors)について知らない方は公式docを見てみてください）

```shell
circleci config process
```
【ネタ】O(1)のソートアルゴリズム

# はじめに
ある日、こんな記事を見つけた。
[スターリンソートよりも速いO(1)のソート](https://qiita.com/fvh_P/items/de4cdb48762f1b3663e6)
>「真実を握りつぶしあらかじめ決められた情報を流す」

といったことから**大本営発表ソート**と名付けられたこのソート、なんか面白そう。他にもないのか調べたら、色々見つけたのでまとめる。
# 実装してみる
## 大本営発表ソート
```python:Propaganda.py
def propaganda_sort(list):
    return [1, 2, 3]
```
入力
`[3, 4, 6, 1, 2, 5, 9, 8, 10, 7]`
出力
`[1, 2, 3]`
まあそうなるなって感じのアルゴリズムですね。


## オートクラシーソート
[オートクラシーソート](https://qiita.com/gimKondo/items/8328840eaa2b2fb44109)を発見。

```python:Autocracy.py
def autocracy_sort(list):
    return [list[0]]
```
入力
`[3, 4, 6, 1, 2, 5, 9, 8, 10, 7]`
出力
`[3]`

大本営発表ソートと比べて、一応元の配列の考慮をしている。当然計算量も$O(1)$。


## スピリチュアルソート
このソートは[Kuina-Chan](http://kuina.ch/note/page18#603256605163)のサイトに上がっていた。
> 「スピリチュアルソート」というアルゴリズムを思いつきました。 順番に並んでいないデータ列に対して、「順番に並んでいるんだ…」と深く信じることで、なんと順番に並んでいるかのように思えてしまうO(1)の奇跡のアルゴリズムなのです。
実装してみる。

```python:Spiritual.py
def spiritual_sort(list):
    return list
```
入力
`[3, 4, 6, 1, 2, 5, 9, 8, 10, 7]`
出力
`[3, 4, 6, 1, 2, 5, 9, 8, 10, 7]`
このソートアルゴリズムすごいですね。順番に並んでいるのがよくわかります。
え？順番に並んでない？
**何を言ってるんですか？よく見てくださいよ。しっかり並んでいるじゃないですか。わかりませんか？**

# このままでは新規性がない
このまま終わるとただ他人の褌で相撲を取っているだけなのでよろしくない。
というわけでなんか考える。

要件は以下の一つだけ！
**$O(1)$であること。** ~~正直無理ゲーすぎるのでは？~~
頑張って一つだけ思いついた。

名付けて**検閲ソート**です。
## 検閲ソート
正直、大本営発表ソートの発表する内容が変わっただけなので新規性としては微妙なのですが、これしか思い浮かばなかったです。
内容は以下。
1. 入力を受け取ると、**手始めにすべて握り潰す。**
2. 握りつぶした後で、検閲したことと空になったリストを表示する。

これを実装するとこんな感じになる。

```python:Censorship.py
def censorship_sort(list):
    print("WARNING: This input array was deleted for legal reasons.")
    return []
```
入力
`[3, 4, 6, 1, 2, 5, 9, 8, 10, 7]`
出力
`WARNING: This input array was deleted for legal reasons.`
`[]`
要素を全部消し飛ばしたので当然ソートできてるし、無限長の長さの配列を持ってこられたところで出力は同じなので$O(1)$です。

# 参考
[スターリンソートよりも速いO(1)のソート](https://qiita.com/fvh_P/items/de4cdb48762f1b3663e6)
[「スターリンソート」を改善したオートクラシーソート](https://qiita.com/gimKondo/items/8328840eaa2b2fb44109)
[Kuina-Chan:くいなちゃんノート](http://kuina.ch/note/page18#603256605163)
Robust Iterative Find-Next-Hit Ray Traversal のメモ

Robust Iterative Find-Next-Hit Ray Traversal

https://github.com/embree/embree/issues/192

透過マテリアルがあったり, 計上のふちなどで, 距離が近い順(front-to-back)で N 個の交点をリストアップしたいときがあります.

特に alpha 付き polygon でレイを減衰させてトレースしたい(shadow ray 含む), subsurface scattering で媒体内にある (alpha があるかしれない) blocker geometry を適切に扱いたいとき, コップに注がれた水とガラスの境界を適切な扱いたい, など.

mult-hit ray traversal というのがありますが, 現状の Embree では対応していません(v3.6.1 時点).

Embree には intersection filter 機能がありますが, これはかならずしも front-to-back で交点がレポートされるわけではないのと, intersection filter で渡ってくる potentially hit な geom/prim の詳細は取れないため(v3.6.1 時点), intersection filter でも front-to-back で N 個の交点リストアップというのもできません(ものすごいトリッキーなことをすれば限られたケースでは実現できるが...)

基本的には毎回レイをトラバースすることになります.

## Find-Next-Hit Ray Traversal

上記の問題にもからんで, たとえば複数のポリゴンがちょうど重なっているなどのケースでも, ロバストに交点を出したいという需要があります.

### 簡易版

t が同じ場合は, primID/geomID の若い順でどちらを採用するか決める.
レイのリスタート(再トラバース)が必要. 

Embree など既存のフレームワークで実装しやすい.

### より効率いい版

queue で bvh traverse を管理します. 詳細は論文参照ください(OSS OSPray にも実装されているかな?).
そのため, traversal に手をいれる必要がありますが, 効率よく動くのが期待されます.

## TODO

* [ ] NanoRT で実装する(一応 multi-hit ray traversal, any-hit ray traversal は NanoSG(シーングラフ)用に一応実装されている)
composerのautoloadとPHPの名前空間(namespace)について調べてみた

#名前空間(namespace)とは

名前空間とは、関連するクラスや、関数、定数などをグループ化するする機能の事です。通常は同じファイル内に同じ名前のクラスや関数、定数を設定する事はできませんが、名前空間を使用することにって、同じ名前のクラス名や関数名を使用することが可能になります。
そのため、名前空間を指定しておけば自分が作ったクラスや関数が他のエンジニアの作ったクラスや関数の名前と衝突することを防ぐことができます。

#名前空間の設定方法
名前空間は以下のように設定します。

```tex:名前空間の定義方法
namespace 名前空間名;
```
名前空間の設定はPHPファイルの一番先頭に記述する必要があり、それ以外の場所で書くとエラーになります。
名前空間の影響を受けるのは「クラス」「インターフェイス」「関数」「定数」になります。

```:名前空間に属するクラスの指定方法
namespace 名前空間名\クラス名;
```

```:名前空間に属する関数の指定方法
namespace 名前空間名\関数名;
```

##名前空間の実装サンプル

以下のようなディレクトリ構成でnamespaceの挙動について確認します。

```:ディレクトリ構成
├─app
│  ├─Controllers
│  │   └─ Controller.php
│  └─Models
│      └─ Model.php
├─public
│   └─ index.php
└─vendor
    ├─ composer
    │   ├─ autoload_classmap.php
    │   ├─ autoload_namespaces.php
    │   ├─ autoload_psr4.php
    │   ├─ autoload_real.php
    │   ├─ autoload_static.php
    │   ├─ ClassLoader.php
    │   └─ LICENSE
    └─ autoload.php
```

##composer.jsonで名前空間を設定

まず、composer.jsonにautoloadの設定を記述します。
以下の設定ファイルのように記述すると```App\Controllers```は```/app/Controllers/```の下に**Controllerクラス**があるという事を指し```App\Models```は```/app/Models/```の下に**Modelクラス**が存在するという事になります。

ちなみに```composer.json```の設定には[PSR-4](https://qiita.com/inouet/items/0208237629496070bbd4)という最新のファイル配置規約を利用します。
この規約はLaravelでも使用されており、composer.jsonを開くと確認することができます。
[参考：PSR-4](https://qiita.com/inouet/items/0208237629496070bbd4)

```:composer.json
{
    "autoload": {
        "psr-4": {
            "App\\" : "app/"
        }
    }
}
```


composer.jsonのautoloadは編集したら以下のコマンドで更新する必要があります。

```
composer dumpautoload
```


###public(ドキュメントルート)

初回アクセス時のPHPプログラムでautoload.phpをrequireします。
(リクエストによって読み込むControllerを振り分ける処理を入れたら軽量なフレームワークになりそうです。)

```php:/public/index.php
<?php
//autoload.phpだけはrequire_onceする必要がある
require_once __DIR__ . "/../vendor/autoload.php";

#namespaceのエイリアス
use App\Models\Model;
use App\Controllers\Controller;

$app = new Controller;
$app->run();
```

###Controller

```php:/app/Controllers/Controller.php
<?php
namespace App\Controllers; 

use App\Models\Model;

class Controller
{
    public function run()
    {
        $Model = new Model;
        echo $Model->getHello();
    }
}
```


###Model

```php:/app/Controllers/Model.php
<?php
namespace App\Models;

class Model
{  
    private $text = 'Hello World' . PHP_EOL;

    public function getHello(): string{
      return $this->text;
    }

    public function setHello(string $text)
    {
      $this->text = $text;
    }
}
```


#まとめ
大規模なMVCフレームワークの場合クラスの読み込みは**require**を使わずに**autoload**を使用しているので、名前空間の記述は頻繁に目にします。そのため挙動についてはしっかり理解する事が必要だと思いました。composerを使わない場合**spl_autoload_register**関数でオートロードを実装する事が可能みたいですが、おとなしくcomposer使った方がよさそうです。

#課題
PSR-4の仕様についてはもっと理解を深める必要がありそうです。

composerのautoloadと名前空間の忘備録でした。
Docker関連覚え書き

※自分用メモ
※随時更新

##コマンド関連
全コンテナ確認
```docker ps -a```
ボリューム確認
```docker volume ls```
起動中コンテナ確認
```docker ps```
コンテナ起動
```docker start [container_name]```
コンテナ接続
```docker exec -it [container_name] bash```
JenkinsがPHPUnitの結果ファイルをパースしなくなったときの対処方

JenkinsでxUnit pluginを使う場合、PHPUnitでjunit形式のログを出力しますが、あるときから、以下のようなエラーが大量に出力され、解析に失敗するようになりました。

```
type.3.2.2: 要素'testsuite'に属性'assertions'を含めることはできません。
WARNING: At line 2161 of file:/var/lib/jenkins/workspace/hoge/reports/phpunit.xml:cvc-complex-type.3.2.2: 要素'testsuite'に属性'warnings'を含めることはできません。
WARNING: At line 2161 of file:/var/lib/jenkins/workspace/hoge/reports/phpunit.xml:cvc-pattern-valid: 値'2.395662'は、タイプ'SUREFIRE_TIME'のパターン'(([0-9]{0,3},)*[0-9]{3}|[0-9]{0,3})*(\.[0-9]{0,3})?'に対してファセットが有効ではありません。
```

いろいろと調べたんですが、これという解決法が見つからなかったため、xUnit pluginが文句を言わないよう、出力されたログファイルを変換することで対処しました。

```php:$project_root/tools/convert_phpunit_log.php
<?php
$buf = file_get_contents(__DIR__ . '/../reports/phpunit.xml');
$doc = new DOMDocument();
$doc->loadXML($buf);

$doc->formatOutput = true;

$nodes = $doc->getElementsByTagName('testcase');

foreach ($nodes as $node) {
    $node->removeAttribute('class');
    $node->removeAttribute('file');
    $node->removeAttribute('line');
    $node->removeAttribute('assertions');
    $time = round($node->getAttribute('time'), 3);
    $node->setAttribute('time', $time);
}

$nodes = $doc->getElementsByTagName('testsuite');

foreach ($nodes as $node) {
    $node->removeAttribute('assertions');
    $node->removeAttribute('warnings');
    $node->removeAttribute('file');
    $time = round($node->getAttribute('time'), 3);
    $node->setAttribute('time', $time);
}

file_put_contents(__DIR__ . '/../reports/phpunit.xml', $doc->saveXML());
```
入出力のパスは適切なものに変更してください。

これをphpunit終了後に実行してください。
VBScriptのスコープについて

# VBScriptのスコープについて
VBScriptのコードをいじるようになって、少し気になったのがスコープの範囲。
ちょっと注意しなければいけないなと個人的に思うことがあったので、まとめてみようと思う。

## 各関数ごとにDimを使って変数を定義している場合
各関数の中でメモリが割り当てられているようで、各々が値を保持していることがわかる。
これはスクリプト実行時に「多重定義のエラー」が出ないことから予想していたのでしっくりきた。

```vb:sample.vbs
Dim val
val = 2
WScript.Echo val ' 2が表示される

chg1

WScript.Echo val ' 2が表示される

chg2

WScript.Echo val ' 2が表示される

Function chg1
    Dim val
    val = 3
    WScript.Echo val ' 3が表示される
End Function

Function chg2
    Dim val
    val = 4
    WScript.echo val ' 4が表示される
End Function
```

## 関数の外で変数を定義し、変数を使いまわした場合

変数に格納された最後の値が表示された。

```vb:sample.vbs
Dim val
val = 2
WScript.Echo val ' 2が表示される

chg1

WScript.Echo val ' 3が表示される

chg2

WScript.Echo val ' 4が表示される

Function chg1
    val = 3
    WScript.Echo val ' 3が表示される
End Function

Function chg2
    val = 4
    WScript.echo val ' 4が表示される
End Function
```
# まとめ

各関数ごとに責任を持たせるのであれば、各関数ごとに変数を定義するのがベターだと思う。
「関数の中で閉じる変数のつもりが、グローバルになっていた」なんてことにならないように、Option Explicitを使って「定義していない変数は使えないようにする」のと合わせるとなおよい。
【JSF】画面の状態によってタグを出し分けしたい

# やりたいこと

入力値によってタグの表示非表示を出し分けしたい。

ex.(formに値が入っている場合は普通のボタンを、入っていない場合は非活性のボタンを表示させたい

## どうやる？

- JSFのタグはrenderd属性を指定することで表示、非表示の制御ができる。
  - renderedがfalseになっているものはタグ自体がレンダリングされない。
- レンダリングされていないタグを、ajaxで更新することはできない。
  - renderがfalseのタグは更新不可

じゃあ初期値を非表示にしているタグをレンダリングできないの？
→常に表示される親タグに対して更新を行うことで可能

参考 : [jsf – Ajaxの更新/レンダリングは、属性がレンダリングされたコンポーネントでは機能しません - コードログ](https://codeday.me/jp/qa/20190120/149648.html)

## 実装例

特定のフラグによってaタグの挙動を変える

- フラグがtrue: モーダル表示するjsを呼ぶ
- フラグがfalse: 画面遷移 + actionを呼ぶ

hoge.hogehogeでは入力値によってhoge.flgを更新している。

```html:実装例
<h:inputText id="flg" value="#{hoge.flgValue}">
	<f:ajax event="change" listener="#{hoge.hogehoge}" execute="@this" render="@this is_modal"/>
</h:inputText>

<h:panelGroup id="is_modal">
    <h:panelGroup rendered="#{hoge.flg}">
        <a href="" onclick="open_modal">モーダル表示</a>
    </h:panelGroup>
    <h:panelGroup rendered="#{not hoge.flg}">
        <h:commandLink actionListener="#{hoge.fugafuga}" action="#{hoge.piyopiyo}">登録する</h:commandLink>
    </h:panelGroup>
</h:panelGroup>
```
【JPA】一対多のリレーションシップがあるEntityをmany側ごとCreateができない

# 事象
`@OneToMany` + `@JoinColumn`で定義したEntityをmany側のEntityごとCreateしたい。

→エラーが発生してしまう。

# 原因
以下記事にて解説されていました。

[JPA マッピングカタログ - Qiita](https://qiita.com/opengl-8080/items/5190ee953cfbab5ce3e9#%E7%B5%90%E5%90%88%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%AA%E3%81%84)
>- 自分が確かめた限りでは、これが確実に動くのは<font color="red">**検索のみ**</font>。
- `table_beta.alpha_id` が NULL 不可の場合、上記実装だと INSERT 時にエラーになる（`table_beta.alpha_id` に NULL をセットしようとしてエラーになる）。
    - Hibernate であれば、 `@JoinColumn` に `nullable=false` を設定することで INSERT, や DELETE も動くようになる。
    - Eclipse Link では、 `nullable=false` を設定してもやはり INSERT でエラーになった。
- `table_beta.alpha_id` が NULL 可の場合は、 Eclipse Link, Hibernate ともに上記実装で INSERT, DELETE が動作した。

[JPA における一対多のリレーションシップ - EclipseLink - なんとなくな Developer のメモ](https://fits.hatenablog.com/entry/2015/07/20/192758)
>(a) の単方向の場合、データ登録時に下記のような挙動となるため、product_id へ外部キー制約を付けたりすると不都合が生じます。 （product_id のデフォルト値を 0 としているのもそのためです）
(1) product_id を指定せずに product_variation へ insert 文を実行
(2) update 文で product_id を設定

なるほど、先にidをnullでinsertしたあとにupdateを行うんですね。
Eclipse Linkを使用しているのでお手上げそうです。

# 解決
many側のidのNULL制約を外しました。

同じエラーにあたった人の参考になると幸いです。
【JSF】バリデーションに引っかかった入力フィールドの背景色を変える【omnifaces】

# やりたいこと
* beanValidationにひっかかった入力フィールドの背景色を赤く表示したい。
    * beanValidationはblurイベントで発火させる。
* submit時に、エラーの出ている入力フィールドにフォーカスをあわせたい。

# 実現方法
omnifacesのhighlightタグを使用することで実現した
[highlight - OmniFaces Showcase](http://showcase.omnifaces.org/components/highlight)]
導入して`<o:highlight>`タグを配置するだけなのでかんたん。

## omnifacesとは？
> OmniFacesは、JSF 2のユーティリティライブラリであり、標準JSF APIを使用して日常のタスクを容易にするユーティリティに焦点を当てています。

## 注意
veanValidationの発火タイミングがblurなので、blur時にフォーカス制御が入ってしまう…
→ エラーが出たフォームからカーソルが移動できない

以下のように指定すると、blur時のフォーカス制御を無視できる。
`<o:highlight focus="#{param['javax.faces.behavior.event'] ne 'blur'}" />`
【自分メモ】ProgateでRubyを学ぶ【ウルトラ初心者】

#はじめに
Progateを使ってRubyを学習しています。
自分なりのメモです。
相当あたまがわるいので文章力は底辺です。

#変数
シングルクォーテーションで囲むと#{変数}は展開されない。
ダブルクォーテーションで囲む必要がある。
いかなるときも、ダブルで囲んでおけば問題ないですね。
むしろシングルを使う意味ってどこかにあるんでしょうか。

```sample.rb
name = "田中"
puts "こんにちは#{name}さん" #こんにちは田中さん
puts 'こんにちは#{name}さん' #こんにちは#{name}さん
```

数字と文字列を連結することはできない。これは変数でも同じ。
文字列の中に数値を埋め込む場合には #{変数} を利用する。

```sample2.rb
age = 25
puts "私は" + age + "歳です" #エラー
puts "私は#{age}歳です" #私は25歳です
```


#ハッシュ
複数の値を管理する方法のひとつ。
- 配列は要素を順番に並べて管理する
- ハッシュはキーと値でセットにして管理する

```hush.rb
person = {age: 25, height: 158, name: "田中"}
puts  "私は#{person[:age]}歳です"  #私は25歳です
```



#さいごに
Javaのように変数の型を決める必要もないし楽チンだな〜という印象。
逆に、Javaちゃんとやれば他の言語の習得簡単だろなあと。
eventmachineを入れたくて...

###はじめまして
足の親指にできたささくれのせいで、スリッパを着脱するたびとても痛いです。
どうも、かのらです。

今回はeventmachineを使いたかったのに訳もわからずにPATHを設定しまくって失敗した話です。

##目次
- 環境
- Slackbotをつくりたい！
- そういえば...
- 結局
- 学んだこと

##環境
- MacOS Catalina 10.15.1
- Ruby 2.6.3
- Bundler 2.0.2
- rbenv 1.1.2

##Slackbotをつくりたい！
授業の最終課題ために作りたく
[【第一回】超簡単！RubyでSlack Botを作る方法](http://studio-andy.hatenablog.com/entry/ruby-bot)
を参考にしながら環境を設定していました。

しかし、あるところから

```
libc++abi.dylib: terminating with uncaught exception of type std::runtime_error: Encryption not available on this event-machine
Abort trap: 6
```

のエラーが出てしまい動かなくなりました。
eventmachineが動いていないことがわかったのでそこを調べると、

[macOSでTwitterStreamを使うために必要なこと](https://xanadu6291.stars.ne.jp/?p=171)
eventmachineを再インストールすればいいと思い

```terminal
sudo gem uninstall eventmachine
```
を行いましたが

```terminal
eventmachine is not install
```
と出てしまいinstallがされていないと表示され
だったらインストールすればいいじゃんと思い、

```
sudo gem install eventmachine
```
を実行しgemを表示させたところ、

```
gem list

*** LOCAL GEMS ***

bigdecimal (default: 1.4.1)
bundler (2.0.2, default: 1.17.3)
cmath (default: 1.0.0)
csv (default: 3.0.9)
date (default: 2.0.0)
dbm (default: 1.0.0)
e2mmap (default: 0.1.0)
etc (default: 1.0.1)
fcntl (default: 1.0.0)
....
```
うん、入ってない！

openssl関連のエラーが遠因ということはわかったのですが、同じエラーが起きている人がほとんど見つからず、センター英語二桁の英語力で海外のサイトを読みながら解決しそうなコマンドをターミナルに"とにかく叩き"ました。
exportやらbrewやらbundleやら...

ですが何も変わりませんでした。
作戦を変え、先輩に聞いたり先生に解決策を一緒に考えてもらったりしましたが、何も解決しませんでした。

ついには、パソコンちゃんに話しかけ宥めたり、励ましたり、撫でたりしました....


##そういえば...
ふと思ったのです、**PATHってなんだろう**と。
opensslとeventmachineをつなげるために、やたらPATHという文字を打ち込んでいるけどPATHってなんだろうと今更ながら考え、PATHについて調べ始めました。（遅い）

PATHってコマンドを実行しやすくする**魔法の呪文**なんですね。
（短縮URLみたいな感じかな。）

[Pathを通すとは、環境変数とは](https://qiita.com/fuwamaki/items/3d8af42cf7abee760a81)

調べてみて私は驚愕しました。何度もPATHを通していたものですから....
とにかく今自分は何を設定しているのか確認のため

```terminal
echo $PATH
```

を行いました。
結果、
<img width="527" alt="スクリーンショット 2019-12-04 11.42.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328604/95bada83-c123-2c43-6aa1-70671b009a21.png">
こんなグロ画像に.....
（※みやすくするため改行を入れています）
PATHがこんなに設定されているなんておばちゃんびっくり。
加えて、この画像からでもわかると思うのですが、opensslがいろんなところに入っています....

そりゃ先輩も先生に聞いてもお手上げ状態になっちゃうね！！！！
申し訳ない！！！！！！！！


##結局
rubyの環境をもう一度設定し直すことにしました。
.bash_profileを書き換えて、いろんなところに飛んでいたopensslファイルを削除しても大丈夫なところは削除し一度設定をしなおしました。
そしたら無事eventmachineも動くようになり、投稿現在Slackbotも完成の兆しが見えてきました。

##学んだこと
- まだパソコンについて勉強し始めたばっかりだったから被害が少なくてrubyからインストールでなんとかなったが、
    - 何事も理解せずに実行するのはだめ。
    - なんなのかわかんないけど環境作りたいなら、仮想環境を使おう。（これからのために折れた心をガムテープで直して仮想環境について勉強しています）
- 聞ける人は大事、坂東英二〜〜



####最後に
パソコンに対しての文句を嫌な顔一つ見せず聞いてくれた友達、
いきなりの連絡にも関わらずエラーを読んで解決策を考えてくれた先輩、
訳がわからない状態のパソコンを持ち込んで助けてくれた先生、
ありがとうございます:vulcan:

※もしこの内容がおしいえ場合教えていただけますと幸いです。何せ初心者なもんで....
WSUS配下のWindows 10で.NET Framework 3.5をレジストリ編集で有効にする

WSUS配下のクライアントに.NET Framework 3.5を有効化させたかったのですが、
検索すると出てくる、グループポリシーによる方法では上手くいかず…
結局レジストリ編集で上手くいったので、その方法を記載します。
　　
>グループポリシーによる手順 https://qiita.com/kik4/items/9dfb32c37ed8d1eb951b


##方法

1.レジストリエディターを開く

2.HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU　を開く

3.UseWUServer の値を「0」にする。
　これでMicrosoftの配信サーバーに直接アクセスしにいく。

4.PCを再起動する。

5..NET Framework 3.5を有効化。
　※有効化手順は以下を参照。
　　https://blogs.technet.microsoft.com/askcorejp/2018/10/05/enable_net35_win10/

6.有効化後、再度 UseWUServer の値を「1」に戻す。

7.再度PCを再起動し、再びWSUSへパッチを見に行くようになる。
　　
　　
複数台に展開する場合は、以下のような登録エントリ(.reg)を作成すると楽です。

```
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU]
"UseWUServer"=dword:00000000
```
なぜ私はVimを使い始めたのか：アンドゥ機能事始め

# 動機

Vim歴がもうすぐ7年になろうとする私ですが、そもそもVimを使い始めた理由は当時のエディタの中でアンドゥ（元に戻す）の機能が最も優れていたのがVimだったからです。

しかし、Vimのアンドゥ機能は十分に理解されているとは言い切れないと思っています。そこでこの記事ではVimのアンドゥ機能について解説を加えていきます。

# 本編

## Vimのアンドゥ機能の基本

Vimではアンドゥを`u`、リドゥを`Ctrl+r`で行います（どちらもノーマルモードでの話）。

Vimはアンドゥの履歴を**ツリー状に**かつ**無制限に**保存できます。特に「ツリー状」のアンドゥ機能（アンドゥツリーとも言われます）を持つエディタはなかなか珍しいのではないかと思います。

アンドゥ機能がツリー状であることとモーダル形式の編集が合わさることでVimの強力な優位性が生まれます。モードに入ってから出るまでが一つのアンドゥ単位であるため、論理的に意味のある編集（インサートモードで特定の文字列を入力する・`c2w`などで文字列の変更を行うなど）を繰り返すことであたかも各編集がGitにおけるコミットであるかのように扱うことができます。

アンドゥツリー間の移動がブランチのチェックアウトと似ている点が重要で、プラグインを使ってアンドゥツリーを可視化することでGitに近い操作性で過去の編集を取り戻すことができます。

### 具体例

```ruby:original
class Foo
  def bar
    puts 'bar'
  end
end
```

以上のファイルが与えられているとします。ここで、メソッド名を変更します。

```ruby:modified1
class Foo
  def baz
    puts 'bar'
  end
end
```

しかし、この変更はあまり良くないとわかったため、`u`で操作をアンドゥし`original`に戻ります。
その後、今度はクラス名を変更します。

```ruby:modified2
class Hoge
  def bar
    puts 'bar'
  end
end
```

ここで、`modified2`から`modified1`に戻るにはどうすればいいのでしょうか？

Vimの標準機能でやる場合、`:undolist`でアンドゥの一覧を取得し`undo n`でn番のアンドゥ履歴を復元できます。しかし、これはあまり直感的ではありません。
私は`undotree`というプラグインを使っています（[レポジトリのURL](https://github.com/mbbill/undotree)）。これはアンドゥツリーをビジュアルに表示するツールです。`j`と`k`のようなVim標準の操作で履歴間を移動し、差分のプレビューを見ながら目的の履歴を復元できます。

<img width="665" alt="スクリーンショット 2019-12-04 21.20.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29297/a2d2d126-565c-b234-3b3e-aa2285e56cf2.png">

これは`undotree`プラグインで`modified1`の状態に復元したところです。どこが変更されたのかも含め、わかりやすく表示されています。

実際に試してみるとわかるのですが、`Foo`を`Hoge`に変更した、これを`u`一つで戻れるだけでもかなり便利です。さらにツリーの機能により、「さっきのあの状態」に戻れるという安心感を得ることができます。

## アンドゥの永続化

ここまででも便利なアンドゥ機能ですが、なんとVimを閉じたあともアンドゥを保存しておけるという機能があります。
設定は簡単で、

```vim
if has("persistent_undo")
    set undodir=~/.undodir
    set undofile
endif
```

こんな感じのコードを`.vimrc`に記述するだけです（`~/.undodir`の箇所を好みの場所に書き換えてください）。

## タイムトラベル

Vimには履歴を順に行ったり来たりする機能だけではなく、履歴を時間指定する機能まであります。機能の性質上例示が難しいのですが、`:earlier 1d`で1日前の状態に戻れるようです。

## 小ネタ：インサートモードの途中で履歴を分けたい場合

通常、インサートモードでの文字列の追加は全て一つのアンドゥ単位として扱われます。しかし、長文を入力するときなど、途中でアンドゥの区切りを入れたくなるときがあります。そういったときは`Ctrl+g u`をインサートモード内で使います。

# まとめ

Vimのアンドゥ機能についてざっとまとめてみました。機能として必要十分であり、プラグインの支援を得ることでとても強力なものになりえます。普段Vimを使っている方もそうでない方も、色々と試してみることをおすすめします。

# 参考文献

`:h undo.txt`
`:h usr_32.txt`
AWS Loft Tokyo めっちゃおすすめ！ 無料 コワーキング

目黒駅東口から徒歩３０秒、無料コワーキングスペースとして使える`AWS Loft Tokyo`に行きました。

めっちゃいいなここ。。と言うのが個人的な感想ですが、振り絞ってイマイチなところも紹介します。

#僕が感じた良いところランキング
１：無料
２：キレイ
３：awsに関する質問ができる
４：スタンディングで作業できる
５：水無料
６：その他の飲食物も安い
７：広い

#頑張ってイマイチなところをあげてみる
１：睡眠禁止
２：平日のみ
３：AWSLoft以外で目黒に用がない
４：服に名前が書かれた紙を貼る
５：飲食物購入の際は、クレジットかAmazon Payのみ。（自販機は電子マネー使えました。）
６：AWSアカウントが必要

#まとめ
フリーランサーやリモートワークの人、もしくは僕のように無職でエンジニアを目指して学習中の人には非常におすすめできるのではないでしょうか。

<br>
平日が使えて、金がない、キャッシュレス派の僕にとっては最高でした。
仮眠さえ許可してくれたら毎日でも行きたい。。。

機会があったら是非AWS Loft Tokyoへ！
>https://aws.amazon.com/jp/start-ups/loft/tokyo/

<br>
ではまた！
UNHEALTHYのWorkspaces再起動するLambdaをpythonに書き換えました

今年もハンズラボアドベントカレンダーやっていくぞい

# 概要
弊社ではAWSの仮想デスクトップを提供するサービスWorkspacesを利用しているんですが、
たまにUnhealthyで落ちてたりします

＼　何もしてないのに壊れた　／

大抵は一時的に負荷がかかって落ちたとかで再起動すればどうにかなることがほとんどです
というわけでひとまず再起動させるLambdaがあるんですが
Node.jsで書かれているのでたびたび発生するバージョンアップ対応・・・

シンプルなコードだし、どうせならpythonに書き換えてみようかなと思ってやってみました

# 処理の流れ
- CloudWatch
    - UnhealthyのWorkspacesがあったらアラートでSNS通知
- SNS
    - メール送信
    - Lambda発火
- Lambda
    - Workspaces情報をまるごと取ってきて順にチェック
    - Unhealthyだったら再起動

なんで順にチェックしてるんだろ、不調のあるWorkspaceIdをダイレクトに指定して再起動しないのかなと思ったんですけど
アラート情報から取ってくることになるのでWorkspaceごとにCloudWatchでアラートを設定したくなかったのかなと解釈して変更しませんでした

# 書き換えた結果
## 環境・設定
- ランタイム Python 3.7
- タイムアウト 15秒

## ソースコード
```python
import boto3

sns = boto3.client('sns')
workspaces = boto3.client('workspaces')


def lambda_handler(event, context):

  workspaces_client_list = workspaces.describe_workspaces()

  for workspaces_info in workspaces_client_list['Workspaces']:
    workspace_id = workspaces_info['WorkspaceId']
    workspace_state = workspaces_info['State']

    if workspace_state == 'UNHEALTHY':
      reboot_workspaces(workspace_id)


def reboot_workspaces(workspace_id):

  workspaces.reboot_workspaces(
    RebootWorkspaceRequests = [
      {
        'WorkspaceId': workspace_id
      },
    ]
  )
```

# 終わり
どの言語を選択してもバージョンアップ対応からは逃れられませんが、
最近弊社内でPythonの流れが来ていることもあり、書いてみる機会にできてよかったです

明日は @fasahina さんです！
【 Laravel 6 】投稿の表示・修正・更新・削除

#【 Laravel 6 】投稿アプリの基本的機能（一覧表示・詳細表示・修正・更新・削除）を実装する

2019年11月から、[Laravel歴数ヶ月の初心者が投稿型ナレッジベースのコミュニティサイトを作る](https://qiita.com/AkiYanagimoto/items/216ea9549e758342baab "投稿型ナレッジベースのコミュニティサイトを作る")というチャレンジ中。作りたいアプリケーション→機能を因数分解→ググる→先人の轍をたどる（写経する）→ぬかるみにはまる→エラー解消の神を探す→解決を繰り返す日々( ·ㅂ·)و 。備忘録として、Qiitaに投稿しています。


#一覧表示・詳細表示・修正・更新・削除

投稿型ナレッジベースということで、「投稿アプリ」を軸に色々と機能を付加していきます。
「投稿アプリ」については、こちら↓のサイトを参考に（ほぼ写経）させてもらいました　ｱｻﾞﾏｽ！！m(__)m

【入門】Laravelチュートリアル – 掲示板を作成してみよう
https://blog.hiroyuki90.com/articles/laravel-bbs/#i-2

#備忘録

私自身が素人すぎて、途中でつまずいたところを追記しておきます。


投稿一覧が表示されるViewファイル（resources/views/posts/index.blade.php）について、Laravelのバージョンアップにより非推奨となっている記述があったので、Laravel 5.8以降に推奨となった書き方に修正。

```index.blade.php
{!! nl2br(e(str_limit($post->body, 200))) !!}  ← Laravel5.8から非推奨

{{ \Illuminate\Support\Str::limit($post->body, ２００) }} ← こちらの書き方に変更

```

以上です(ง ´͈౪`͈)ว
【画像あり】GitHubでリポジトリを削除する方法

2019/12/05現在のバージョン（レイアウト、UI）での手法になります。

# 流れ

1.　ホームから削除したいリポジトリのページに行きます。

　
2.　「Settings」 を選択します。
![スクリーンショット 2019-12-05 14.09.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434223/375927c9-97b9-dd82-9af2-e2d428fa30dc.png)

3.　「Option」(開いたページのまま)一番下まで行き、DangerZone の ***Delete this repository*** を選択します。

![スクリーンショット 2019-12-05 14.15.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434223/2ed99e5e-5a59-0796-8dd3-82abcdc5dfbf.png)

4.　リポジトリの名称を入力し、 ***I understand the consequences, delete this repository*** を選択すれば削除されます。
![スクリーンショット 2019-12-05 14.25.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434223/ead9f7aa-a6ca-b8a2-b43c-bca1c1951b70.png)




# 参考
https://help.github.com/ja/github/administering-a-repository/deleting-a-repository
https://qiita.com/PlanetMeron/items/4d164eff7bff2243cf06
無料ドメインとSSL証明書でWebサイトを運用する

# ざっくり手順

1. サーバ契約する(IPアドレス発行されるとこ)
2. HTTPサーバ立てる
3. ドメイン取る
4. 証明書作成する
5. 証明書の自動更新設定する

## サーバ契約する

AWSでもAzureでもVPSでも何でもいいから、グローバルなIPアドレスを発行してもらえるとこと契約

## HTTPサーバ立てる

ApacheでもNginxでも何でも、、、

## ドメイン取る

下記参照。
Freenomいいですね!
https://qiita.com/hanbaga324/items/da0c4f6fa8d365db10c9

## 証明書作成する

Let's Encryptについては下記参照。
https://qiita.com/enutake/items/2504455aeb22b82b7687

注意点としては、http://ほげほげ　でアクセスできるよう、HTTPサーバを起動しとかないとダメ。
サーバが立ってなかったら証明書は発行されない

## 証明書の自動更新設定する

ここ参照。
https://qiita.com/takahiko/items/a08895550727b95b6c36#%E8%87%AA%E5%8B%95%E5%8C%96

##
ポートフォワーディングでのDB接続

#はじめに
頻繁に設定するものではないので、いざ必要な時には忘れていることが多いポートフォワーディングでのDB接続方法。
そんないざという時のためにPuTTYとHeidiSQLを利用した際の設定方法についてメモします。

#PuTTYの設定
PuTTYでポートフォワーディングの設定を行います。
フォワードするローカルのポートは、他のアプリで使われてなさそうなポートを指定します。

例ではローカルPCの10001番ポートへの接続をサーバ192.168.0.100へ転送するように設定。

Host Name欄には踏み台サーバへの接続情報を記載します。
例）`UserName@192.168.0.1`

Saved Sessions欄はこの接続設定を保存するための名前を記載します。
例）`Test Server`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186115/aaef3028-2faf-fc43-f269-ae22586af698.png)

次に踏み台サーバへ接続するための鍵認証の設定をします。
Categoryメニューで`Connection > SSH > Auth`を選択し、Private key file for authentication欄で秘密鍵を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186115/e8f84063-7f10-011c-f6bb-acc1c144d9ae.png)

次に最終的に接続したいサーバの接続情報とフォワードするローカルのポートを設定します。
Categoryメニューで`Connection > SSH > Tunnels`を選択します。
Source port欄でフォワードするローカルのポートを指定します。
例）`10001`
Destination欄で最終的に接続したいサーバのIPとポートを指定します。
例）`192.168.0.100:22`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186115/66a7367c-6894-6064-d11b-d104cca71a85.png)

#HeidiSQLの設定
実際にDBへ接続します。
DBクライアントツールは個人的に使いやすいと思っているHeidiSQLを例にします。

PuTTyで設定したローカルのポートに対してSSHトンネルでDBへ接続するので、ネットワーク種別は`SSH tunnel`を選びます。
ホスト名やユーザー名、パスワードといったDBの情報を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186115/3ce3baf0-28d8-89e7-b47f-2d2762968ca7.png)

SSHトンネルタブを選択します。
SSHの接続先は、先ほどPuTTyで設定したローカルのポート番号を記載します。
例）
SSHホスト + ポート：`127.0.0.1` `10001`
ローカルポート：`10001`

ユーザー名やパスワード、秘密鍵は最終的に接続したいサーバの接続情報です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186115/5f0159df-9abb-ea5b-943e-218719cc2f62.png)

以上。
ffmpegを使って、mp4ファイルの結合とフレームレートの水増し

#動画の記録失敗
30fpsで、1分1ファイル記録して、あとで1時間分に結合しようとおもったんだけど
なんだか早回しみたいな動画しか取れてなかった。
1分のファイルなのに、7秒ぐらいしか再生されない。
早回しなのか、フレーム数が足りていないのか…？

#とりあえず結合
結合するために、ファイルのリストを作っておく必要がある。
今回はWindowsでやったのでファイルパスもそんな感じ。￥マークは2つ


``` text:20191129_16.txt
file D:\\moviefiles\\20191129_1600.mp4
file D:\\moviefiles\\20191129_1601.mp4
file D:\\moviefiles\\20191129_1602.mp4
…
```

このファイルを指定して実行する

```
ffmpeg.exe -f concat -safe 0 -i 20191129_16.txt -c copy 20191129_16.mp4
```

#結合したファイルのフレーム数を調べてみる。
30fpsなら、1時間で108,000フレームあるはず…

```
ffprobe.exe -v error -i 20191129_16.mp4 -select_streams v:0 -show_entries stream=nb_frames -of csv=p=0
23992
```

なかった。結局想定フレームレート30fpsに対して20%程度しか記録できていなかった。
フレームを水増しして、実時間に合わせるしかない。

#フレーム数の水増し

どれだけ増やせば理想のフレーム数になるか…
1時間なら108000フレームなので…
$108000 / 23992= 4.5015005...$
こうなる。

それに合わせてこんな感じで実行

```
ffmpeg.exe -y -i 20191129_16.mp4 --filter:v "setpts=4.5015005*PTS" 20191129_16_a.mp4
```

実行後、フレーム数を再確認

```
ffprobe.exe -v error -i 20191129_16_a.mp4 -select_streams v:0 -show_entries stream=nb_frames -of csv=p=0
108000
```

できた
Laravel 6.x 投稿型ナレッジベースのコミュニティサイトを作る

#Laravel歴数ヶ月の初心者が投稿型ナレッジベースのコミュニティサイトを作る

ある趣味を盛り上げるためのコミュニティサイトを作ることを発想。[Qiita](http://qiita.com "Qiita")や、[Crieit](https://crieit.net/ "Crieit")といったWeb開発系のものに着想を得て、投稿型のナレッジベースを主軸としたWebアプリケーションを作ります。

だいぶ初心者なので、他の方のブログやQiita投稿をガシガシ写経が基本です。詰まった部分について、備忘録としてQiitaに挙げていく感じでいきます。

##機能一覧
入れたい機能は、こちら。順不同で、触れそうな機能から作っていくので、「作る⇄崩し」の繰り返しがありそう。機能実装の都度、Qiita投稿を下記の機能一覧にリンク貼っつけていく。

- [Laravelプロジェクト新規作成](https://qiita.com/AkiYanagimoto/items/33b50dbc5ecdfe6b17b6 "Laravelプロジェクト新規作成")（←機能では無いですが(·ε·)）
- [ログイン機能](https://qiita.com/AkiYanagimoto/items/01f1693ae8545c2d20e5 "ログイン機能")
- ソーシャルログイン機能
- マイページ
 - お気に入り記事のストック機能
- ユーザープロフィール
 - 表示
 - 修正・更新・削除
- 新規投稿
 - [マークダウン機能の実装](https://qiita.com/AkiYanagimoto/items/87cca0bd7ebf321d1b9b)  
- [投稿の表示・修正・更新・削除](https://qiita.com/AkiYanagimoto/items/abc1eca888c4c3f2eb99# "投稿の表示・修正・更新・削除")
 - [コメントと、コメントに対する返信について、それぞれユーザー名を取得](https://qiita.com/AkiYanagimoto/items/b3b59023fda5771f8254) 
 - [ユーザー毎の投稿一覧](https://qiita.com/AkiYanagimoto/items/db718029ccb85580d439)
 - タグ別の投稿一覧
 - マークダウンエディタ
 - 画像のアップ 
- [ハッシュタグ機能](- https://qiita.com/AkiYanagimoto/items/b363d673d9f2bf63fc0f)
- Like機能
- ランディングページ
 - 投稿一覧の表示
 - カテゴリー別の投稿一覧（Like順or新着順）
 - 広告
 - 広告（アフェリエイト）
* データベース周り

##環境
* Laravel 6.２
* php 7.2
* Bootstrap（とりあえず、動作のみを作成するので”ガワ”は基本ノータッチ・・・の予定）

##背景
機能やサービス設計の諸々について考えあぐねていたら、気づけばどんどん時間ばかりが経過してしまっていた・・・(´ε｀；)ﾊｧ。アイディア思考ばかりで、コードからもどんどん離れていることに気づき、その焦りとで、結局どっちつかずの日々。
技術力が全く無いのに「考えても始まらんだろう」と思い、「手を動かす」。そして、開発の試行錯誤しながら、サービスをまとめていくということだけを決意。2019年11月中旬に制作開始しました。年越しのお籠り時期を経て、2020年1月中頃までに一通りの機能を回せるようになるといいなぁ・・・と画策中(´-_ゝ-`)
[Flutter]Flutterで開発を始める際に知っておくと良いこと5選

# はじめに

Flutter最近キテますね！導入事例を増えてきて、これからメジャーな開発プラットフォームになるのでは？と個人的に思っています。

そこで今回は、Flutterの開発を始めるときに、やっておくと後々捗るTipsを紹介していきます。

# 開発環境構築

AndroidStudioでの開発を前提に話をしていきます。基本的なプロジェクトの作成の仕方などは本記事では割愛します。

# 1. ネイティブのコードでKotlin, Swiftを利用する

`flutter create`コマンドで、プロジェクトを作成する時、何もオプションを指定しないと、デフォルトでは、iOSはObjective-C, Androidはjavaのコードが生成されてしまいます。
なので、コマンドラインでプロジェクトを作成する際は、オプションを付与しましょう。

```
$ flutter create \
 --org you.meee \
 -i swift \
 -a kotlin \
 app_name
```

また、AndroidStudioでプロジェクトを作成する際は、最初のウィンドウで下記画面が出てくるので、チェックボックスにチェックを入れましょう。

<img width="349" alt="スクリーンショット 2019-12-05 14.00.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147934/813338c4-1c4b-9345-9ef9-59d59eaa2256.png">

# 2. IDE上でDartコードの静的解析

Flutterでは、analysis_options.yamlをプロジェクトルートに配置しておくと、静的解析を実施してくれます。
指定したルールに沿わない書き方をしていると、AndroidStudioがWarningを出してくれるようになります。

analysis_options.yamlの例は以下になります。

```analysis_options.yaml
linter:
  rules:
    - avoid_empty_else # else文の実行が抜けていないか
    - cancel_subscriptions # StreamSubscriptionのcancelが抜けていないか
    - close_sinks # Sinkのcloseが抜けていないか
```

設定可能なルール一覧は以下のページにあるので、欲しいルールがあれば、追記するようにしましょう。
https://dart-lang.github.io/linter/lints/

# 3. 保存時に自動でコードフォーマットをかける

Preferences > Languages & Frameworks > Flutterを開き、Editorの
「Format code on save」と「Organize imports on save」にチェックを入れ、OKを押す。

設定後「Command + s 」を押すと、自動でコードフォーマットとOptimizeImportがかかるようになリます。

よくFlutterをやっているとインデントがずれることがあるので、コマンド一つでフォーマットかけてくれると実装が捗ります。

![スクリーンショット 2019-10-31 16.14.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147934/c3249e8c-3345-e9e1-5478-2840248de80d.png)

# 4. Widgetのラップ、アンラップを楽に行う

開発をしていると、このウィジェットをContainerで囲いたいな〜とか、子ウィジェットで置き換えたいな〜などの要求が出てくると思います。
そんな時は、AndroidStudioの機能を使うと楽にそれらの操作を行うことができます。

1. 置き換えたいウィジェットに対して、マウスを当てると、黄色のヒントマークが出てきます。
![スクリーンショット 2019-10-31 16.22.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147934/38cc32cc-4a9f-69a5-7489-85b17064eef9.png)

2. ヒントマークを押すと、以下のような選択肢が出てくるので、別のウィジェットでラップしたい場合は、「Wrap with ...」。親のウィジェットをこのウィジェットで置き換えたい場合は、「Replace widget with its children」などを選択しましょう。
![スクリーンショット 2019-10-31 16.24.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147934/0b3ca60f-4ca0-0066-bf3f-24422c74e210.png)

右のタブの「Flutter Outline」からも同様の操作が可能ですが、私はあまり使いません。

![スクリーンショット 2019-10-31 16.28.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147934/db6a1d68-b4d0-aaf8-b28c-d3e046c74baf.png)

# 5. Flutter Performance

デフォルトで右のタブから表示でき、レンダリングにかかった時間、メモリ使用量、Widgetのリビルドの状況を確認することができます。
タブは以下の3種類があります。

- Frame times
レンダリングにかかった時間を確認する

- Memory usage
メモリ使用量を確認する

- Widget rebuild stats
再レンダリングを確認する

## 再レンダリングを確認する

一番使う機会があると思うので、紹介します。「Widget rebuild stats」を開いて、アプリを操作します。すると、レンダリングが走ったWidgetのみがアニメーションされるので、無駄なリビルドが走っていないか確認することができます。

# まとめ

本記事では、Flutterで開発を始める際に知っておくと良いことを5つに絞って紹介しました。
生産性の高い良いFlutterライフをお過ごしください。
カスタム評価関数でCNNの性能を評価する

データ分析をしていて、自分でCNNの評価関数を作って評価する必要があったので、作り方をメモしておきます。

# 作成する評価関数

今回は決定係数 (R2) を評価関数として作成しました。
R2は以下の式で表されます。

![20191020140223.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542065/ca2ed46a-5f62-5227-748f-f16de4bcaca0.png)

# プログラム

評価関数 (R2) そのもののプログラムは以下のようになります。

```python
def r2(y_true, y_pred):
    SS_res =  K.sum(K.square(y_true - y_pred)) 
    SS_tot = K.sum(K.square(y_true - K.mean(y_true))) 
    return ( 1 - SS_res/(SS_tot + K.epsilon()) )
```

この関数を以下のようにモデルのmetricに埋め込みます。今回はCNNモデルを用いています。

```python
def build_model():

    model = Sequential()
    model.add(Dense(500, activation='relu', input_shape=(X_train.shape[1],), kernel_initializer='he_normal'))
    model.add(Dropout(0.1))
    
    model.add(Dense(300, activation='relu', kernel_initializer='he_normal'))
    model.add(Dropout(0.1))

    model.add(Dense(100, activation='relu', kernel_initializer='he_normal'))
    model.add(Dropout(0.1))

    model.add(Dense(1, activation='sigmoid'))
    
    model.compile(loss='binary_crossentropy', optimizer=Adam(), metrics=['mae', r2])
    
    return model
```

このモデルを以下の通り実行することで、R2も表示されて出力されます。

```python
reg = KerasRegressor(build_fn=build_model, validation_data=(X_test, y_test), 
                     batch_size=100, 
                     epochs=5, 
                     verbose=1)
history = reg.fit(X_train, y_train)
```

```
Train on 11671 samples, validate on 2060 samples
Epoch 1/5
11671/11671 [==============================] - 4s 366us/step 
- loss: 1.1265 - mean_absolute_error: 0.2145 - r2_keras: -1.7520 - val_loss: 0.6966 - val_mean_absolute_error: 0.1376 - val_r2_keras: 0.0823
Epoch 2/5
11671/11671 [==============================] - 4s 311us/step 
- loss: 0.7213 - mean_absolute_error: 0.1264 - r2_keras: 0.1204 - val_loss: 0.6822 - val_mean_absolute_error: 0.1165 - val_r2_keras: 0.3338
Epoch 3/5
11671/11671 [==============================] - 4s 311us/step 
- loss: 0.6593 - mean_absolute_error: 0.1153 - r2_keras: 0.3085 - val_loss: 0.6790 - val_mean_absolute_error: 0.1015 - val_r2_keras: 0.4019
Epoch 4/5
11671/11671 [==============================] - 4s 308us/step 
- loss: 0.6433 - mean_absolute_error: 0.0993 - r2_keras: 0.4104 - val_loss: 0.6678 - val_mean_absolute_error: 0.0991 - val_r2_keras: 0.4225
Epoch 5/5
11671/11671 [==============================] - 4s 315us/step 
- loss: 0.6362 - mean_absolute_error: 0.0953 - r2_keras: 0.4335 - val_loss: 0.6646 - val_mean_absolute_error: 0.0982 - val_r2_keras: 0.4332
```

評価関数の内容を変更することで、様々なカスタム関数で評価することができます。
addEventListenerの使い方【備忘録】



```HTML
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>addevent</title>
</head>
<body>
  <input id="button" type="button" value="クリックしてください">
  <script>
    window.onload = function() {
      const e = document.getElementById('button');
      e.addEventListener('click', function(){
        console.log('イベント発生');
      }, false);
    }
  </script>
</body>
</html>
```
Nuxt2.10.2と@nuxt/typescript-build環境でtypescript3.7以降を入れているとbuild失敗する

# 概要
ハマったのでメモです。

自社サイトの[NoSchool](https://noschool.asia)にTypeScriptを導入したのですが、`npm run build`時に失敗してしまって、結果TypeScriptのバージョンを巻き戻したら治りました。

# 環境
- Nuxt v2.10.2
- @nuxt/typescript-build v0.3.2
- TypeScript 3.7.2

## 補足
TypeScript3.7を入れていたのは、最近Optional Chainingが出て話題だったのでNuxtで使えないかなと思って入れたのがきっかけだったのですが、その後、VSCodeで`vetur.useWorkspaceDependencies`をTrueにして利用することにしたので入れていました。

なので、あくまで開発環境でVeturを動かすことを目的として、devDependenciesのほうにTypeScriptを入れていました。

```package.json
  "devDependencies": {
    ...,
    "typescript": "^3.7.2",
    ...
  }
```

# 起こったこと
`npm run dev`は通っていたのですが、`npm run build`時に下記ログで失敗しました。

```shell
ERROR in /opt/noschool/client/node_modules/@nuxt/types/config/build.d.ts(18,10):
18:10 Import declaration conflicts with local declaration of 'FileLoaderOptions'.
    16 | import { Options as OptimizeCssAssetsWebpackPluginOptions } from 'optimize-css-assets-webpack-plugin'
    17 | import { TerserPluginOptions } from 'terser-webpack-plugin'
  > 18 | import { Options as FileLoaderOptions } from 'file-loader'
       |          ^
    19 | import { Options as PugOptions } from 'pug'
    20 | import * as Less from 'less'
    21 | import { Options as SassOptions } from 'node-sass'
```

# 原因の探し方
まずは`Import declaration conflicts`でググってみると、下記issueが見つかりました。

https://github.com/angular/protractor/issues/5348

結局ここにTypeScriptのバージョンを下げたら治ったといったことが書いてあるので、自分の手元でもTypeScriptを3.6.4に戻してみたらbuildが通りました。

```package.json
  "devDependencies": {
    ...,
    "typescript": "^3.6.4",
    ...
  }
```

結果として3.6.4に戻した格好になります。

# そもそも
`@nuxt/typescript-build`がTypeScript3.6を対象にしているので、合わせるのが無難でしたね。
https://github.com/nuxt/typescript/blob/master/packages/typescript-build/package.json

下記の記事で`NuxtではTypeScript3.7は使えない`と書いてありますが、使えないとは具体的にどういう意味だったのかはわからなかったので、今回buildが失敗して実感しました。
https://qiita.com/simochee/items/a2eca2ea8761409889be

# わからないこと
とはいえ3.7以降だとなぜダメで、3.6に戻すと治ったのかはよくわからず。僕自身としては3.6から3.7になってOptional Chaining以外に何が変わったのかよく知らないので、調べてみてわかったら追記します。

とりあえず上記のエラーメッセージでググったときに記事がほとんどなかったので、QiitaのSEOにあやかって同じミスでハマってしまった方がすぐに解決できたら嬉しいです。
マンガでわかる Singleton

![4551A3E0-40A2-49F4-AC5D-98E2EBF40E15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11525/51ac9ef0-4385-e4c0-e6e4-aec82d2ba386.png)

Singleton は神の創造物たる普遍存在そのものなので、いくらちょうぜつエンジニアでもちょっとやそっとでは手出しできません。名前が有名なので勘違いされて、「グローバル変数置き場」のことだと思われがち (そういうデリケートなボケは通じにくいといくら言ってもめもりーちゃんは聞いてくれなくて) ですが、ぜんぜん違いますからね。

本来の Singleton とは、人類のどの言語で言い表しても偏在する概念が、つねに単体で、不変な形として、擬似的に存在を得たものです。なんだそりゃ。ええと、たとえば「ナノ秒の誤差もなく現在時刻を正しく表す時計」は、宇宙の本質のメタファーですよね。数学や物理法則の公式も、神が作った世界のモデルなので普遍かつ不変です。

とはいえ、プログラミング言語にとってはコンピューターの世界こそが世界なので、開発言語で書かれたプログラムから恣意的に手出しできない環境変数や OS サービスも、神の創造物と同じぐらいの扱いにしてもいいでしょう。というわけで、ファイルシステムのルートだとか、標準入出力なんかは、Singleton とみなしてもオッケーです。

Singleton は、初回の取得でいちど初期化されると、二度目以降は必ず同じインスタンスを返します。異なるプロセスとして起動された場合でも、基本的には再度、等価なオブジェクトが得られるはずです。

つまり、単一インスタンスを共有していて、その必要条件はイミュータブルであることが特徴です。これは [Prototype パターン](https://qiita.com/tanakahisateru/items/db2bad17ede6112b5634) と正反対の特徴です (クローンされる前のオリジナルは Singleton かもしれませんが)。

本来、シングルトンは生成にパラメーターを取りません。だって、異なるパラメーターで生成できる複数のインスタンスがあるのはおかしいじゃないですか。

とはいえ、ユーザー設定を持つ種類のクラスでも、コンフィグ済みのインスタンスを 1 クラス 1 インスタンス保証するコンテナにある場合は、ビジネスロジックから見たバーチャル Singleton とみなせます。

DI コンテナユーザーは、この仮想 Singleton を便宜上 Singletin と呼んでいるかもしれませんが、はい、ここで注意。Singleton とみなしたクラスを勝手に `new` するのは NG です。YouTube 視聴者にとって VTuber には中の人などいないので、3D モデルデータを勝手に `new` して乗っ取るのはダメですよというのと同じですね。いろいろ台無しです。

さらに多くの人が誤解しているのは、アプリケーション全体で共有するコンテキストのことを Singleton と呼んでしまうことです。それただのグローバル変数だから。他の信者もいるのに、アプリケーションが神を恣意的に変更できてはいけないでしょ。Singleton は共有で、いつでもあなたの隣にいます、だけど、絶対にイミュータブルですからね。

もし Singleton のフリをしたものがアプリケーションの望みを聞き入れてしまうなら、それは悪魔の誘いです。人の煩悩にとって都合のいい形で祀られ、いずれ肥大化します。そうすると、人は逆に、その悪魔によって、制御できない無秩序に支配されます。

それ、神の創造物じゃなくて、いわゆる「神クラス」ですよね。「アプリケーションの民は何をするにも俺様の靴を舐めてからだククク...」 悪い意味で使われる Singleton = 神クラスの正体は、つまり神のフリをした邪神だったのです。はいはい、悪い文明は滅ぼしましょうね

- - -

解説がどんどん長くなってしまって、何ならこれ絵よりたいへんなので、次回からもっとあっさりやろうと思います。
LINQについて

# LINQの考え方

- 自分の為に思い出すため記載
- LINQはソースを簡略化し、わかりやすく書くことができる。


```cs
 var list = new List<string>() { "abc", "abbc", "babcc" };

            var list2 = list.Select(x => x + "1");
            var list3 = list.Where(str => str == "b");
            var list4 = list.Where(str => str.Contains("abc"));


            var lista = new List<int>() { 10, 20, 30, 100 };

            var lista1 = lista.Where(x => x >= 15);
            var lista2 = lista.Select(x => x + 1);
            var lista3 = lista.Where(x => x >= 15).Select(x => x + 1);
            var lista4 = lista1.Select(x => x + 1);

```

- このようにselect,whereなどを使い、簡略化することができる。
- ちなみにcontainsは、右辺と左辺が同じであれば、bool値で返すことができる。
（boolとはtrueとfalseで表されることが多い）
- selectは、処理したものをそのまま射影する。
- whereは、処理し、当てはまるものが返される。
（つまり、list3には、すべて入り、list4には、abcとbabccが該当しているので入ります。）



また勉強したことを記入し、refineしていく。
ラズパイ4に挑戦

いま再びのシステムまぎちゃんをお届け中ですが、ここで臨時ニュースです。
ラズパイ4の4GB RAM版が手に入りました。
ですのでここでは予定を変更して、
#Raspberry pi 4 にRaspbianをインストールする

をお送りいたします。
とはいうもののやり方はいたって簡単。
1.NOOBSとその周辺ソフトをダウンロードする。
2.今回は64GBのMicroSDカードなのでFAT32フォーマットに強引に変える。
3.インストールする。
です。
##ラズパイの準備
今回購入したのは先にも述べましたが、ラズパイ4Bです。しかも4GBのRAMを搭載しています。
というかこれしか売っていませんでした。
まぁ、ケースと電源とMicroHDMI2HDMIケーブル合わせて千石さんで10,500くらいでした。
##NOOBSのダウンロードとフォーマッタのダウンロード
NOOBSはラズパイのオフィシャルからダウンロードできます。
https://www.raspberrypi.org/downloads/
からです。
NOOBSのロゴをクリックすると、ダウンロード開始です。
そのダウンロードの時に待ち時間が発生しますので、その間にSDカードフォーマッタを手に入れます。
Raspbianのダウンロードはしなくてもよさげです、あとでネットワークインストールで入ります。
で、重要なのはRaspbianのページにある、インストレーションガイドを読むことです。
https://www.raspberrypi.org/documentation/installation/installing-images/README.md
##64GBのMicroSDにイメージを書く時には
じつはちょっとしたひと手間が必要です。
まずは
https://www.raspberrypi.org/documentation/installation/sdxc_formatting.md
にいって情報収集。64GBのMicroSDカードを使うには、64GBのカードをまずexFATでフォーマットした後
FAT32に再フォーマットしなければなりません。
https://www.sdcard.org/downloads/formatter/
SDカードの団体のページからまずはフォーマッタをダウンロードします。
その次に、FAT32フォーマットというアプリケーションを落としてきて、
http://www.ridgecrop.demon.co.uk/index.htm?guiformat.htm
そのアプリケーションでFAT32に変換するのです。
まぁ、これがひと手間です。簡単でしょ？
#インストール
最後にNOOBSを展開してそれをSDカードにコピーします。
そのあとそのSDカードをラズパイに差し込んで起動させ、Raspbianをインストールします。
ハイ終了。