OmniAICreator/Qiita-1.07M huggingface dataset:
gulpで画像を圧縮する

##はじめに
「この記事を見ればgulpで画像を圧縮する手順がわかる！」という記事です。

画像の圧縮ツールは色々とあり、有名なところですと[TinyPNG](https://tinypng.com/)を使用している方も多いと思います。
しかし、本番公開前の画像などを外部サービスで圧縮するのはどうなんだい、という会社もあると思いますので、今回はgulpを使用してローカル環境で圧縮する方法をまとめました。

参考になったらぜひLGTMをお願いします！！

##事前準備
gulpの環境構築の方法については、以前[gulp超入門](https://qiita.com/taka-hyt/items/d6053936f1b8eba6bac3)という記事を執筆していますので、そちらを参考にしてください。
環境構築はこちらの記事を元にできているものとして進めて行きます。

[gulp超入門](https://qiita.com/taka-hyt/items/d6053936f1b8eba6bac3)

ディレクトリ構成は以下の通りです。src配下が開発環境で、dist配下に圧縮した画像が吐き出されます。

```:ディレクトリ構造
プロジェクト名
 ├ dist
 │  └ image
 ├ node_modules
 ├ src 
 │  └ image
 ├ package.json
 └ gulpfile.js
```

使用するプラグインです。

| プラグイン | バージョン |
| ---- | ---- |
|  Node.js |  12.14.1  |
|  npm  |  6.13.4  |
|  npm  |  6.13.4  |
|  gulp	 |  4.0.2  |
|  gulp-imagemin  |  7.1.0 |
|  imagemin-gifsicle  |  7.0.0  |
|  imagemin-mozjpeg  |  9.0.0 |
|  imagemin-pngquant  |  9.0.1  |
|  imagemin-svgo  |  8.0.0  |

##プラグインをインストール

```:ターミナル
$ npm install --save-dev gulp-imagemin imagemin-gifsicle imagemin-mozjpeg imagemin-pngquant imagemin-svgo
```

インストールが完了すると`package.json`にプラグインが追加されます。

![スクリーンショット 2020-10-10 18.30.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452409/09556c57-7319-fab0-6c95-61e0c517e2e7.png)

##gulpfile.jsに記述

```JavaScript:gulpfile.js
const gulp = require('gulp');
const imagemin = require('gulp-imagemin');
const mozjpeg = require('imagemin-mozjpeg');
const pngquant = require('imagemin-pngquant');
const imageminGif = require('imagemin-gifsicle');
const imageminSvg = require('imagemin-svgo');

var paths = {
    srcDir: './src',
    dstDir: './dist'
}

// 画像を格納しているフォルダのパス
var srcGlob = paths.srcDir + '/image';
var dstGlob = paths.dstDir + '/image';

// jpg,png,gif,svg画像の圧縮タスク
function imageMin() {
    return (
        // 参照するフォルダのパスを記述する
        gulp.src(srcGlob + '/**/*.+(jpg|jpeg|png|gif|svg)')
            .pipe(imagemin([
                // pngの圧縮
                pngquant({
                    quality: [0.6, 0.8]
                }),
                // jpgの圧縮
                mozjpeg({
                    quality: 85,
                    progressive: true
                }),
                // gifの圧縮
                imageminGif({
                    interlaced: false,
                    optimizationLevel: 3,
                    colors: 180
                }),
                // SVGの圧縮
                imageminSvg()
            ]
            ))
            // 圧縮したファイルの吐き出し先のパス
            .pipe(gulp.dest(dstGlob))
    );
}

// imageフォルダ配下に変更があれば自動でコンパイルしてくれる
function watchFile(done) {
    gulp.watch(srcGlob + '/**/*.+(jpg|jpeg|png|gif|svg)', imageMin);
    done();
}

// タスクの実行
exports.default = gulp.series(imageMin, watchFile);
```

##タスクの実行
最後にコマンドを叩けば実行されます。

```:ターミナル
$ npx gulp
```

`watch`で監視状態になっているので`image`フォルダ配下に画像が追加されたら自動で圧縮してくれます。

##最後に
最後までご覧いただきありがとうございました。
案件などによってディレクトリ構成などアレンジして使っていただければ幸いです。

「参考になったよ！」という方は、ぜひLGTMをお願いします！！
Processingから外部プロセスを実行する

# この記事の内容
Processingから外部プロセスを実行する方法についての覚え書き．
# 環境
OS: Windows 10 Home (1909)
Processing: 3.5.4
# 参考
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/ProcessBuilder.html
https://www.ne.jp/asahi/hishidama/home/tech/java/process.html
# 外部プロセスの実行
Runtimeクラスを使う方法が紹介されていることがあるが，JDK1.5以降はProcessBuilderクラスを用いるのがよいとされている．外部プロセスでファイルを扱う場合，実行時の作業ディレクトリを指定することで，ファイルへのアクセスが容易になる．
ProcessBuilderクラスのコンストラクタには，実行ファイルと引数(複数OK)を与える．
ProcessingのdataFile()関数はdataフォルダに入っている引数で与えられた名前のファイルのjava.io.Fileインスタンスを返すものであり，引数に空文字列を与えることでdataフォルダそのものを得ることができる．
以下の例はPythonスクリプトの実行例である．スクリプトsample.pyに引数testdata.csvを与えて処理を開始している．

```java
String python_exe = "py"; // py.exeにはpathが通っている
String python_script = "sample.py";
String data_filename = "testdata.csv";
Process process;

void execExternalProcess() {
  try {
    ProcessBuilder pb = new ProcessBuilder(python_exe, python_script, data_filename); // 実行するコマンドと引数列
    pb.directory(dataFile("")); // 実行時のディレクトリを指定
    process = pb.start(); // 実行
  } catch (Exception e) {
    println(e);
  }  
}
```

# 外部プロセスの終了待ち
プロセスの状況はProcessクラスのisAlive()メソッドで知ることができる．プロセスが実行中は待機メッセージを表示し，プロセスの処理が終了したら結果を得て(ファイル読み込みなど)処理を進めるといったことができる．
以下は外部プロセスが画像を生成する場合の例である．画像生成のためのプロセスが終了するまではメッセージと処理中であることを示すメッセージとアニメーションを表示し，処理が終わったら画像を読み込んで表示している．

```java
String image_filename = "result.jpg";
PImage img;

void draw() {
  if (img == null) { // 画像がまだ読み込まれていない場合
    background(0);
    
    if (!process.isAlive()) { // プロセスが実行中ではない(つまり，終了した)
      File file = dataFile(image_filename);
      if (file.exists()) { // 生成された画像ファイルがあれば読み込む
        img = loadImage(image_filename);
        set(0, 0, img); // 表示する
      } else { // プロセスが終了したが画像無し→多分，生成に失敗した
        translate(10, 40);
        noStroke();
        fill(255);
        textSize(32);
        text("external process failed", 0, 0);
      }
    } else { // 無ければ画面にメッセージ表示
      translate(10, 40);
      noStroke();
      fill(255);
      textSize(32);
      String s = "making images...";
      text(s, 0, 0);

      // ぐるぐるを表示
      translate(textWidth(s) + 20, -10);
      rotate(TWO_PI * millis() / 1000);
      final int n = 12;
      for (int i = 0; i < n; i++) {
        fill(255 * i / n);
        circle(12, 0, 4);
        rotate(TWO_PI / n);
      }
    }
  } else { // 画像読み込み済みの場合
    set(0, 0, img);
  }
}
```
【PowerShell】ターミナルのタイトルバーにフルパスを表示する


無印の PowerShell の場合は `$host.UI.RawUI.WindowTitle` だけで指定できますが、コンソールエミュレータの Cmder ではもうひと工夫が必要でした。

最終的に下のような見た目になっています。

![20201010171515.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501098/f0310a95-a266-e39c-3bbb-13d107bed4db.png)

## コード

結論から言うと、[以前の記事](https://qiita.com/AWtnb/items/34fe77fda53820a8546e) でも紹介した C# の SendMessage を使います。

### ウィンドウハンドルの取得

（上の記事で紹介したものと同一です）

```PowerShell
function Get-ConsoleWindowHandle {
    $p = Get-Process -Id $PID
    $i = 0
    while ($p.MainWindowHandle -eq 0) {
        if ($i++ -gt 10) {
            return $null
        }
        $p = $p.Parent
    }
    return $p.MainWindowHandle
}
$Global:CONSOLE_HWND = Get-ConsoleWindowHandle
```

### C# でクラス定義

```PowerShell
if(-not ('PowerShell.Window' -as [type])) {
    Add-Type -Name Window -Namespace PowerShell -MemberDefinition @'
[DllImport("user32.dll")]
private static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, string lParam);

public static void SetText(IntPtr hwnd, string text) {
    SendMessage(hwnd, 0x000C, 0, text);
}
'@

}
function Set-ConsoleWindowTitle {
    param (
        $title
    )
    $hwnd = $Global:CONSOLE_HWND
    if (-not $hwnd) {
        return
    }
    [PowerShell.Window]::SetText($hwnd, $title)
}

```

### プロンプトに組み込む

`$PROFILE` 内の `prompt` 関数内で呼び出すことで、作業しているディレクトリのフルパスを表示するようにします。

ついでにプロンプトの色を曜日別に変えています。在宅勤務が続いても曜日感覚を失わなくなる……かも？

```PowerShell
function prompt {
    $table = @(
        <#日#> "DarkYellow",
        <#月#> "Blue",
        <#火#> "Magenta",
        <#水#> "Cyan",
        <#木#> "Green",
        <#金#> "Yellow",
        <#土#> "Gray"
    )
    $dailyColor = $table[[System.Convert]::toint32((Get-Date).DayOfWeek)]
    $leaf = $pwd.Path | Split-Path -Leaf
    Set-ConsoleWindowTitle -title $pwd.Path
    if ($pwd.Path | Split-Path -Parent) {
        Write-Host "~\" -BackgroundColor DarkGray -ForegroundColor White -NoNewline
    }
    Write-Host $leaf -BackgroundColor $dailyColor -ForegroundColor Black -NoNewline
    return "`n> "
}
```
Android Studioをつかって実行可能なjarをつくる

# はじめに
Android Studioをつかって実行可能なjarをつくる方法を説明します。

# Version
OSのバージョンは次の通りです。

```
Microsoft Windows 10 Home
10.0.18363 N/A ビルド 18363
```

Android Studioのバージョンは次の通りです。

```
Android Studio 4.0
Build #AI-193.6911.18.40.6514223, built on May 21, 2020
Runtime version: 1.8.0_242-release-1644-b01 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
```

javaのバージョンは次の通りです。

```
java -version
java version "1.8.0_251"
Java(TM) SE Runtime Environment (build 1.8.0_251-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.251-b08, mixed mode)
```

# プロジェクトをつくる
次の手順でプロジェクトをつくります。

Android Studioを起動します。
Start a new Android Studio projectを選択します。
No Activityのプロジェクトを作成します。
Nameを"My Application"(default)とします。Languageを"Kotlin"とします。

# jarのモジュールをつくる
次の手順でプロジェクト内にjarのモジュールを追加します。

File - New - New Module ... を選択します。
Java or Kotlin Libraryを選択します。
Library nameを"lib"(default)とします。Class nameを"MyClass"とします。

# fun main
MyClass.kt を開きます。内容を次の処理に置き換えます。

```MyClass.kt
package com.example.lib

fun main(args: Array<String>) {}
```

ここまで実行した状態の画面は次の通りです。

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84205/e6aece05-7489-c142-75f5-4118002be0d3.jpeg)

# build.gradle

libのbuild.gradleに次を追加します。

```:build.gradle
jar {
    manifest {
        attributes("Main-Class": "com.example.lib.MyClassKt")
    }
    from { configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
}
```

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84205/4fa7c540-b06d-8d85-8f07-349a7db64cf7.jpeg)

# jar taskを追加する
次の手順でjar taskを追加します。

View - Tool Windows - Gradle を選択します。Windowが表示されます。
My Application - Tasks - build - jar をダブルクリックします。ビルド開始します。

ここまで実行した状態の画面は次の通りです。

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84205/98fb2f02-6178-32c9-bb8f-0dfce336552d.jpeg)

次のパスにjarができます。

MyApplication\lib\build\libs\lib.jar

# 実行

command prompt を開きます。lib.jarがあるパスに移動します。
次のコマンドを実行します。
エラーなく実行できれば期待通り実行可能なjarができていることがわかります。

```
java -jar .\lib.jar
```

# Troubleshooting
## "Entry META-INF/XXXX"のエラーが発生する
次のようなエラーが発生する場合の対策を記載します。

```
Entry META-INF/versions/9/module-info.class is a duplicate but no duplicate handling strategy has been set. Please refer to https://docs.gradle.org/7.2/dsl/org.gradle.api.tasks.Copy.html#org.gradle.api.tasks.Copy:duplicatesStrategy for details.
```

エラーが発生した環境

Android Studioのバージョンは次の通りです。

```
Android Studio Bumblebee | 2021.1.1 Patch 2
Build #AI-211.7628.21.2111.8193401, built on February 17, 2022
Runtime version: 11.0.11+9-b60-7590822 amd64
VM: OpenJDK 64-Bit Server VM by Oracle Corporation
Windows 10 10.0
```

対策
build.gradleに
> duplicatesStrategy = DuplicatesStrategy.EXCLUDE

を追加します。

```:build.gradle
jar {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
    manifest {
        attributes("Main-Class": "com.example.lib.MyClassKt")
    }
    from { configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
}
```
動かして理解するasync/await

JavaScriptのasync/awaitを動かしながら理解したい人向けです。
Node.jsで実行できます。

```javascript:async/await
test()

// awaitを使う時はasyncが必要
async function test() {
    try {
        const code = await f(true)
        console.log(code)
        await f(false)
    } catch (err) {
        console.log(err)
    }
}

function f(ok) {
    // awaitする関数はPromiseを返す
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (ok) {
                // 正常終了
                resolve(200)
            } else {
                // 異常終了
                reject(500)
            }
        }, 3000)
    })
}
```

結果

```
200
500
```
UnityからC#のファイルをVscodeで開いても補完機能が効いていなかったので効くようにした

##C#の補完機能が効いていない
Vscodeの拡張で、下記を入れていたが補完が効いていなかった。

- C#
- Debugger for Unity


そのため、以下の記事を参考にさせていただきながら補完を効くように作業しました。
ほぼ記事内容をなぞっただけですが、備忘させてください...
超絶謝謝参考記事: [UnityでVSCodeを使うための最低限必要な設定](https://qiita.com/kamanii24/items/399f956f2bf6bec76884)

##homebrewのインストール

以下URLからコードコピってきて、terminalに貼り付けて、homebrewのインストール
https://brew.sh/index_ja

```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```

インストールできたか確認。

```
brew -v
Homebrew 2.5.5
Homebrew/homebrew-core (git revision 62667b; last commit 2020-10-10)
```

入った。

##Monoのインストール

```
brew install mono
```
ログを見ても**SUCCESS**的なの出てなくて、完了したか分からなかったのでversion確認してみる

```
mono --version

Mono JIT compiler version 6.12.0.93 (2020-02/620cf538206 Tue Aug 25 14:04:52 EDT 2020)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
	TLS:
	SIGSEGV:       altstack
	Notification:  kqueue
	Architecture:  amd64
	Disabled:      none
	Misc:          softdebug
	Interpreter:   yes
	LLVM:          yes(610)
	Suspend:       hybrid
	GC:            sgen (concurrent by default)
```

入ってる。

##.NET CLI toolsのインストール
https://dotnet.microsoft.com/download/

上記からダウンロードしてインストール。

##Vscodeの拡張機能をインストール
以下三つ

- C#
- Debugger for Unity
- Mono Debug

Mono Debugだけインストールしていなかったので、新たにインストール
![mono-install.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198412/ed9b1bf1-acdf-dddc-5048-9e5a6f2fe6e9.png)

##Unity上でVscodeを標準エディタに設定する
メニューバーから、
Preferences > External Tools > External Script Editor
の箇所を、Visual Studio Codeにする。
Visual Studio Codeがプルダウンに出いていない場合、Browseから検索。

![Unity-settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198412/06f75cce-47ec-4363-0554-e39c88137d32.png)

##Vscodeを再度確認
一応再起動して、VscodeでC#のファイルを開く。

![C#-script.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198412/e84bed9d-bf5d-3506-7af1-ccbdfba34edb.png)

int型の変数に、float型の変数を代入しようとしてみると、
電球が出た！！！
やりました。ありがとうございます捗ります。

##気になる箇所二点
###1. VscodeでC#のファイルを開いた時に、右下にerrorが出る。
![net-error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198412/c424f7cc-6f28-1d46-0a3c-0961f998b4e5.png)

```
The .NET Core SDK cannot be located. .NET Core debugging will not be enabled. Make sure the .NET Core SDK is installed and is on the path.
```

.NETをインストールしたから出ないと思ったの出てきた。
気になる。
下記記事を参考に出ないようにしました。
[VSCodeで「The .NET Core SDK cannot be located.」メッセージを抑止
](https://qiita.com/Kosen-amai/items/badd7992228d7f2943ba)

###2. 変数,関数の宣言をしたコードの上にreferencesが出てくる
![Screen Shot 2020-10-10 at 18.53.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198412/084b959a-97e8-f4c9-dc48-2722403515cb.png)

邪魔だなと思ったので下記記事を参考にさせて頂き、非表示に
[Visual Studio CodeのReference informationを非表示にする方法](https://qiita.com/unsoluble_sugar/items/6985aba97a5a89ca609f)
【2D OD】RefineDet512 : SSDの2stage detection

<h1>Single-Shot Refinement Neural Network for Object Detection</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/62ce0a69-b91d-57f6-c003-ea12d2368e80.png)

2018年1月にSOTAだったRefineDet512の要点をまとめていきたいと思う！

1stageのSSDを2stageにしてみたらしい。

<h3>ARM(Anchor Refinement Module)</h3>
1st stageはAnchorのRefinementを行う。
AnchorのNegative Confidenceを推定し、0.99以上であればAnchorを除去する。

<h3>ODM(Object Detection Module)</h3>
2nd stageは物体を検出する

<h3>Transfer Connection Block</h3>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/9db87c3a-4430-b03f-b548-39312e7ea0c9.png)
FPN(Feature Pyramid Network)のようにlocalからGlobalとGlobalとlocalの2方向に情報を伝搬する。

<h1>結論</h1>
・Anchor-baseの2stage detectionをする事で高速かつ精度が良くなるという提案だった。
・1st stageでAnchorをrefineするのは珍しくて面白い

<h1>参考文献</h1>
Single-Shot Refinement Neural Network for Object Detection
https://arxiv.org/pdf/1711.06897v3.pdf
Windows 10でのパスの通し方

[こちらの記事](https://qiita.com/BonyChops/items/bcf39f2decc4f03a63df)にて説明する用に書きます。

# やる
1. `Win + S`から、「環境変数を編集」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601799/dc36cbb2-ae09-33c7-689d-4fd71bc102b8.png)

2. Pathを選んで「編集」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601799/9c6ff316-1093-3cf3-1fef-7ee6b50740c8.png)

3. 「新規」から追加したいパスを入力し「OK」(ここでは例として`C:\Program Files (x86)\Renesas\Hew`を追加)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601799/0b21f8ef-2ea0-7730-bc44-1376a9619797.png)

4. OKで閉じる。おわり。
絶対に転職すると心に誓ったのでgolangで"hello word" してみた

自社開発web系企業へ転職したいSES、受託開発企業で働く20代男性です。
今のスキルが伸びにくい環境と給料に不満を覚えたので、文句ばかり言わないで行動に移そうと心に誓ったのでGo言語を勉強することにしました。
Qiitaへ記事を書くことの練習を兼ねております。

早速 hello word しましょう!

<h1>とりあえず準備</h1>
※エディター、homebrewはすでにインストールされていることを想定しております。
下記コマンドをターミナルに流す。

```
# homebrewのアップデート
$ brew update

# goをインストール
$ brew install go
```
以上でgoの準備は整いました。

<h1>コードを書いていこう</h1>

以下がコード


```hello.go
package main

import (
	"fmt"
)

func main() {
	fmt.Println("hello world")
}
```

以下コマンドで実行!

```
$ go run hello.go
#以下、実行結果
hello world
```

今日はこれまで。
IBM Cloudの仮想サーバのRed Hat Enterprise Linux 8でCodeReady Linux Builder相当のCentOS PowerToolsを利用する

# 目的

CodeReady Linux Builder（以下、CodeReady）は、Red Hat Enterprise Linux（以下、RHEL）に付属する、開発者向けのパッケージを含んだリポジトリです。通常はRHELのサブスクリプション契約の範囲内で利用可能なのですが、IBM Cloudの仮想サーバで利用しているサブスクリプションでは対応していないということがわかりました（サポートに確認済）。

ちなみにAWS EC2のRHELでは使えるようです。

> https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-enable-epel/

そこで、今回はCodeReadyと同等のCentOS PowerToolsで代替する方法を紹介します。もちろん無保証ですので自己責任になります。

# CentOS PowerToolsとは

CentOSはよく知られているとおりRHELのOSS部分のクローンですが、Red Hat社のCodeReady Linux Builderは商標の都合でその名前が使えなかったため、PowerToolsという名称になっているようです。

RHEL（CentOS）の外部リポジトリとしてはEPELが有名ですが、CodeReady（PowerTools）はEPELと競合するものではなく、EPELを補完するものという位置づけのようです。そのため、EPELで不足しているものをCodeReady（PowerTools）で導入できる場合があります。

CentOS 8の場合、PowerToolsのリポジトリはデフォルトで``/etc/yum.repos.d/CentOS-PowerTools.repo``に追加されています。ただし無効化されているため、利用時には有効化する必要があります。

```
# dnf config-manager --set-enabled PowerTools
```

# RHEL8でのPowerToolsの有効化

PowerToolsのリポジトリを手動で登録します。これはCentOS 8でデフォルトで入るリポジトリ定義そのままです。

```/etc/yum.repos.d/CentOS-PowerTools.repo
# CentOS-PowerTools.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#
[PowerTools]
name=CentOS-$releasever - PowerTools
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=PowerTools&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/PowerTools/$basearch/os/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
```

追加でGPGキーをインストールします。上の最後の行と一致しないのですが見なかったことにします。

```
# rpmkeys --import https://www.centos.org/keys/RPM-GPG-KEY-CentOS-Official
```

後は必要に応じてPowerToolsリポジトリを有効にします。

```
# dnf list --enablerepo PowerTools
# dnf config-manager --set-enabled PowerTools
```
Listのmapはスタックを使わなくてよいことに気づいた

自分にとっては発見だったけど、処理系を書く人にとっては当たり前の知識かもしれない

## 背景

教科書では、Listをmapする処理は定義通りに書くとスタックを消費するので、末尾再起を使って書くのがよいとされている。
例えば、

```haskell
my_map f lst =
  case lst of
    []   -> []
    x:xs -> (f x) : (my_map f xs)
```

というコードよりも

```haskell
my_map f lst =
  rev [] (map_tc f [] lst)

map_tc f acc lst =
  case lst of
    []   -> acc
    x:xs -> map_tc f (f x : acc) xs

rev acc lst =
  case lst of
    []   -> acc
    x:xs -> rev (x:acc) xs
```

というコードのほうが効率が良いとされる。
（ただしHaskellのように遅延評価される言語ではこの考え方は当てはまらない）

## 気づき

計算結果を戻り値として返す場合はこれは正しいが、引数として返す場合はそうとは限らないことに気づいた。
C言語を例にすると map を愚直に実装すると次のようになる。

```c
typedef struct list {
    int value;
    struct list* next;
} list_t;

list_t* map_list(list_t* list, int f(int)) {
    if (list == NULL) return NULL;
    list_t* new_list = malloc(sizeof(list_t));
    new_list->value = f(list->value);
    new_list->next = map_list(list->next, f);
    return new_list;
}
```

しかしC言語の場合は、ポインタが使えるので次のように末尾再起で書くことができる。
（正確にはPHPやC#のようにポインタが使えなくても参照が使えれば十分）

```c
void map_list_tc(list_t* list, int f(int), list_t** out) {
    if (list == NULL) {
        *out = NULL;
        return;
    }
    *out = malloc(sizeof(list_t));
    (*out)->value = f(list->value);
    return map_list_tc(list->next, f, &(*out)->next);
}
```

世の中の関数型言語の処理系を読んだことがないので内部的にどうなっているかは調べていないが、
関数が `f x = ...; cons(val, f(x'))` のようなパターンだったら末尾再起にできることを知った。
mergeとrebase完全理解した

[Git MERGE vs REBASE](https://www.youtube.com/watch?v=CRlGDDprdOQ) のまとめ

![スクリーンショット 2020-10-10 17.56.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402245/9ed8a574-9bad-0fb4-6b86-fd08f14a64cd.png)


### masterブランチ

```html:master.html
m1
m2
m3
```
### masterブランチ ログ
```
m3
m2
m1
```

### featureブランチ

```html:master.html
m1
m2
```

```html:feature.html
f1
f2
```

### featureブランチ ログ

```
f2
f1
m2
```

### 最終的なファイル

```html:master.html
m1
m2
m3
```

```html:feature.html
f1
f2
```


# git marge --squash feature

```
git add .
git commit -m "marge feature and master"
```

```
marge feature and master
m3
m2
m1
```

# git rebase feature


```
f2
f1
m3
m2
m1
```
VBAたまによく使うもの覚え書き

# 変数宣言

## 変数宣言を必須にする

```VBA
Option Explicit
```

## 変数宣言における型指定

```VBA
Dim i As Integer
```

**Asによる型指定は全ての変数に対して必要。書かない場合はVariantになる。**
私見だがVBA実行時の型エラーはだいたいこれ。

## 定数宣言

```VBA
Const days As Integer = 366
```

# 日付
## 本日

```VBA
Dim today As Date
today = Date
```

## 指定する

```VBA
Dim a As Date
a = CDate("2020/4/1")
```

## 一ヶ月後

```VBA
Dim today As Date
Dim future As Date
today = Date

future = DateAdd("m", 1, Date)
```

参考：DateAdd http://officetanaka.net/excel/vba/function/DateAdd.htm

# ワークシートとのデータやり取り関連
## 単一セルから読み取り

```VBA
Dim average_today As Double
average_today = Cells(row, column).Value
```

シート名も指定するなら次のようにする

```VBA
Dim average_today As Double
average_today = Sheets("any sheet's name").Cells(row, column).Value
```

## 単一セルへ値を設定

```VBA
Dim average_today As Double
average_today = 20.0
Cells(row, column).Value = average_today
```

## 複数セル or 範囲を消去

```VBA
Range(Cells(startRow, startColumn), Cells(endRow, endColumn)).ClearContents
```

シート名も指定するなら、ちょっと煩雑だがこんな感じ

```VBA
Range(Sheets("any sheet's name").Cells(startRow, startColumn), Sheets("any sheet's name").Cells(endRow, endColumn)).ClearContents
```

# If文

```VBA
If today <= tomorrow And tomorrow < next_tomorrow Then
    'do something
ElseIf today <= yesterday Or yesterday < tomorrow Then
    'do something
Else
    'do something
End If
```

サブルーチン内なら必要に応じて```Exit Sub```で処理を抜ける

# For Loop

```VBA
Sub test_loop()
    Dim i As Integer
    
    For i = 1 To 5
        MsgBox (i)
        
        If i = 4 Then
            Exit For
        End If
    
    Next i
    
    MsgBox ("end of loop")
End Sub
```

continueを使いたい場合はGoTo文でNext直前にラベルを貼ると良い。

# Functionの戻り値

```VBA
Function GetYear(today As Date)
    GetYear = Year(today)
End Function
```
returnは無い。Function名と同じ変数を返す。



# 配列インデックスの上限・下限

```VBA
UBound(array)
LBound(array)
```

VBAコード上はindexが0オリジンだが、ワークシートからの一括読み込みだと1オリジンになる。

## VBAコード上でもindexを1オリジンにする

```VBA
Option Base 1
```

# String値を返すEnumもどきを作成する

```VBA
Enum Place
    Yamagata
    Sakata
    Shinjo
    Yonezawa
End Enum

Dim placeHash As Object

Sub Initialize()
    Set placeHash = CreateObject("Scripting.Dictionary")
    placeHash.Add Place.Yamagata, "山形"
    placeHash.Add Place.Sakata, "酒田"
    placeHash.Add Place.Shinjo, "新庄"
    placeHash.Add Place.Yonezawa, "米沢"
End Sub
```

Enumは値が数値になる(一個目が0で順次インクリメント)ので、Stringの値が欲しければDictionary型を使うと良いようだ。

# 参考
CDate https://www.tipsfound.com/vba/05cdate
Const http://officetanaka.net/excel/vba/statement/Const.htm
Enum https://www.tipsfound.com/vba/02017
Range https://excel-ubara.com/excelvba1/EXCELVBA311.html
リダイレクト記述していないのにトップページから動かない

##リダイレクト記述していないのにトップページから動かない
https://gyazo.com/dbe8d1ca1de396635ebc9a408e747692
##原因は、、
https://gyazo.com/84638b931d2b593903fdc2c5f6d6ec62
開発段階だったので、ログインした状態でトップページに入ってました。
ログイン状態→新規登録だったので、一度sequel proで削除
https://gyazo.com/241b80de2e4a2eee77cf2fe759caceff
##問題なくいけました
https://gyazo.com/9d06ed9bf580db919d850aa7925aaab1
🗻【Nuxt.js】Nuxt.jsプロジェクトをnpm run devしたらエラーが出て動かないときの解決法

## 環境
Windows 10
npm 6.14.6
Nuxt.js v2.14.6

## やりたいこと
Nuxt.jsプロジェクトをpullしてきてVSCodeのターミナルで`npm run dev`したら
いきなり大量のエラーが吐かれて実行できない、、、のでこれを解消する

```powershell
PS C:\hoge\{プロジェクト名}> npm run dev

> {プロジェクト名}@1.0.0 dev C:\hoge\{プロジェクト名}
> nuxt

操作可能なプログラムまたはバッチ ファイルとして認識されていません。
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! {プロジェクト名}@1.0.0 dev: `nuxt`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the {your_project}@1.0.0 dev script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm WARN Local package.json exists, but node_modules missing, did you mean to install?

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\{Windowsアカウント名}AppData\Roaming\npm-cache\_logs\2020-10-10T08_18_23_229Z-debug.log
```

## やったこと
いきなりエラーが大量に出てきて怖いですが大丈夫です、ただ必要な物がインストールされていないだけです
慌てず、急がず、とにかく`npm install`を打ちます

```powershell
PS C:\hoge\{プロジェクト名}> npm install

色々インストールされる
～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～

                                     :-:
                                   .==-+:
                                  .==. :+- .-=-
                                 .==.   :==++-+=.
                                :==.     -**: :+=.
                               :+-      :*+++. .++.
                              :+-      -*= .++: .=+.
                             -+:      =*-   .+*: .=+:        
                            -+:     .=*-     .=*-  =+:       
                          .==:     .+*:        -*-  -+-      
                         .=+:.....:+*-.........:=*=..=*-     
                         .-=------=++============++====:     

                          Thanks for installing nuxtjs 
                 Please consider donating to our open collective
                        to help us maintain this package.

                           Number of contributors: 229
                              Number of backers: 377
                            Annual budget: US$ 67,637
                           Current balance: US$ 38,286
```

これが出てきたらNuxtインストール完了
あとは心置きなく`npm run dev`しましょう
たぶん動くから！Docker でイメージを作成して共有してみよう！

#はじめに
この記事では `Docker` で簡単なコンテナイメージを作成し、`Docker Hub` で共有してみるまでを記しています。
初心者の記事ですので間違っていたら指摘等いただけると幸いです。

#環境
* macOS Catalina version 10.15.6
* Docker version 19.03.13
* Visual Studio Code version 1.42.1

#前提条件
`Docker` をインストールしていること。
インストールしていない場合は以下のリンクを参考にインストールしてみてください。
[たぶん動くから！Docker始めてみよう！](https://qiita.com/leafeon00000/items/a2d694ac52b542c76e01)

#コンテナイメージのビルド
コンテナイメージを作成するためにはコンテナの中身となる `Dockerfile` を作成する必要があります。
以下のコードを書いて `Dockerfile` という名前で保存します。

```dockerfile:Docekrfile
FROM ubuntu:20.04
CMD ["echo", "hello Docker!!"]
```

コードの内容はオペレーティングシステムである `ubuntu` を呼び出し、 `hello Docker!!` と出力しています。

ターミナルで `Dockerfile` のディレクトリへ移動し、 `docker build` コマンドを叩きます。

```sh
$ docker build -t hellodoc .
```

`-t` オプションはイメージ名を指定できます。
`.` は `Dockerfile` が配置されているパスを示しています。Dockerfileの配置されたディレクトリでコマンドを打っているので `.` ですね。

ビルド処理が終わったらコンテナイメージを動かしてみます。

```sh
$ docker run hellodoc
```

```sh
hello Docker!!
```
うまく動きましたね！

ローカルのコンテナイメージ一覧は `docker images` コマンドで確認できます。

```sh
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hellodoc            latest              32d0a84555ac        2 weeks ago         72.9MB
```

#コンテナイメージの共有
コンテナイメージの動作が確認できたら~~hello Docker!! と表示されるだけのクソ~~コンテナイメージを `Docker Hub` で共有してみます。

##Docker Hub への登録
`Docker Hub` は名前からお分かりの通り、`Git Hub` の `Docker` の様なもの（個人的な認識です）で、様々なコンテナイメージが公開されています。

`Docker Hub` のアカウントを持っていない人は [Docker Hub のサインアップページ](https://hub.docker.com/signup/) にアクセスし、サインアップします。

ターミナルから `Docker Hub` にログインします。

```sh
$ docker login -u ■■■■■■■■■
Password: ************
Login Succeeded
```
■には登録したユーザーアカウントを、*にはパスワードを入力します。

##コンテナイメージの共有
コンテナイメージを共有するための形式でビルドします。

```sh
docker build -t ■■■■■■■■■/hellodoc:1.0.0 .
```
共有するためにはイメージ名の命名規則にルールがあります。
* イメージ名の前に自分の `Docker Hub` アカウント名の配下に配置する。（■の部分を各自の`Docker Hub`アカウント名に変えてください。)
* イメージ名の後に `:` とバージョンを記入する。

`docker push` コマンドでコンテナイメージを登録します。

```sh
$ docker push ■■■■■■■■■/hellodoc:1.0.0
```
処理が終わったら `Docker Hub` で確認してみましょう。
![スクリーンショット 2020-10-10 17.24.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547651/c207278c-6db6-d39d-270c-a4e14dc08ea6.png)
きちんと登録されていますね！

##コンテナイメージのダウンロード
登録されたコンテナイメージは `docker pull` コマンドでローカルにダウンロードできます。

```sh
docker pull ■■■■■■■■■/hellodoc:1.0.0
```
ABC167　記録

※自分の記録のために書くので、基本的に解説としては役に立たないと思います。ご了承ください。

#A - Registration
文字列Sと文字列Tが与えられた時に、TがSの末尾にちょうど一文字だけ追加されてできる文字列であるかを確認する問題。
ありがたいことに$|T|=|S|+1$は保証されているので、$S$の$i$文字目を$S_i$とした時に$S_i$と$T_i$が常に一致するのかをチェックすれば良い。
C++の場合はsubstrを使ってもいい。

#B - Easy Linear Programming
1が書かれたカード、0が書かれたカード、-1が書かれたカードの順に取れるだけとって、それらの合計を求めるのが最適。

#C - Skill Up
the 全探索。

今回はビット全探索を行った。
買う本の番号の集合を整数で表し、各集合に対して、本の総金額および各アルゴリズムの理解度を計算、全アルゴリズムの理解度が一定の値$X$以上を達成するかどうかを確認していけば良い。

#D - Teleporter 
今回のような途中でループが生じるような問題の時はダブリングを用いることが可能なことが多い（気がしている）。
もちろん、周期性に着目すればダブリングを用いることなく答えを出せるが、ダブリングの方がバグらない気がする。

$doubling[k][i] =$ (町iから$2^k$個先の町の番号)とすることで、

```math
doubling[k+1][i] = doubling[k][doubling[i][k]]
```

と更新していくことができる。
出発地点を$s$とし、その$K$個先の町が知りたい時は、

```
for (int i = 0; i < logk; i++) {
    if ((K>>i)&1)
        s = doubling[i][s]
} 
```

のようにsを更新することで最終的にsが答えになる。

#E - Colorful Blocks
数え上げの問題。
同じ色で塗られるブロック$1$組につき、ブロックが一個なくなるとみなせる。
同じ色で塗られるブロックが$l$組の時、
$N-l$個のブロックを、隣り合うブロックが必ず異なる色になるように塗り分け、残りの$l$個のブロックをどこに挿入するかを考えればいいので

```math
M(M-1)^{N-l-1}× _{n-1}C_l
```
これを$l=0,1,2,...K$の場合をそれぞれ計算して足しあげれば良い。

#F - Bracket Sequencing
むずい。
わからん。
またいずれ舞い戻って考える…
安全・安心・信頼性の違い

#はじめに
システムを作る上で、「安全」「安心」「信頼性」はどれも大切なものである。似たニュアンスでありつつもそれぞれ定義が異なるので、これらの違いについてまとめる。
#JISにおける定義
信頼性と安全性についてはJISで規定化されている。
##システムの信頼性の定義(JIS X 0014)
機能単位が要求された機能を与えられた条件の下で与えられた期間実行する能力
##システムの安全性の定義(JIS X 0134)
システムが規定された条件の下で人の生命、健康、財産またはその環境を危険にさらす状態に移行しない期待度合い
#システムの信頼性とは
システムの信頼性は「要求された機能を与えられた期間実行する能力」となっており、安全性については触れられていない。つまり、与えられた期間要求された機能を満たしてさえいれば安全でなくても信頼性があると言える。
#システムの安全性とは
システムの安全性は「危険な状態に移行しないこと」となっており、そのシステムが機能要求を満たしているかどうかについては触れられていない。つまり、動かない自動車や飛行機も安全な乗り物と呼ぶことができる。
#まとめ
信頼性と安全性には互いに深い関係があるにもかかわらずそれぞれが全く異なる点に注目している概念である。しかしながら、現実にはそれら双方の要求を満たしていなければ良いシステムとは言えない。

人や環境への危害をいかに小さくするかという「安全性」については設計段階で検討する。物事が損傷したり危害を受けたりする恐れのない「安心」については稼働段階で検討する。そして「信頼性」は「安心」な状態を維持することと言える。

#参考文献
坂巻佳壽美, トコトンやさしい組込みシステムの本, 今日からモノ知りシリーズ, 日刊工業出版社, 2019年.
Bootstrap card使用時にカラムを横並びにできない原因と対処法

###Bootstrap　card使用時にカラムが横並びにならない原因と対処法

個人的な備忘録として記事を残しておきます。

レイアウトを考えている際にco-md-2 col-md-9のカラムを横並びにして表示させようと考えていた際にinline-blockになっているにも関わらず、カラムが上下に配置されてしまう事象が発生しました。

###原因

結論から述べるとbootstrapのcardを使用するとその子要素に対し、自動的にflex-direction:columnが有効になってしまうことから、card以下の要素が全て縦並びになってしまうようです。


###対処法

対処法は、card以下で横並びにしたい要素に対してflex-direction:rowを与えてあげれば解決します。

一応例として挙げておくと、

```
<div class="card"> ->ここ以下にflex-direction:columnが有効となり、縦並びになる。
 <div class="card-body">
  <div class="column flex-direction:row"> ->flex-direction:columnを指定することでこれ以降の要素を横並びにすることができる。
   <div class="tab col-md-2">
    <div class="content col-md-9">
.
.
.
```

このように書いてあげればtabとcontentが無事横並びになります。
Vimのメモまとめ

#本記事の目的
自分が覚えたいVimのコマンドをまとめていきます。

開き方

|  コマンド  |  内容  |  メモ  |
| ---- | ---- | ---- |
|view ファイル名 |ReadOnlyのモードで表示|書き込みはできるが、保存しようとすると怒ってくれる。うっかり編集したときは:q!で閉じる。 |

閉じ方

|  コマンド  |  内容  |  メモ  |
| ---- | ---- | ---- |
|  :q  | vim終了 | 編集した後にこのコマンドをするとE37: No write since last change (add ! to override)が表示される|
|  :q!  | 編集を破棄してvim終了  | |
|  :w  | 保存  | |
|  :w ファイル名  | 設定したファイル名で保存  | ファイルhogeで:w fugaをすると新しくファイルfugaが作成される |
|  :wq  | 保存してvimを終了  | |

カーソルの動き

|  コマンド  |  内容  | 
| ---- | ---- | 
|  k  | 上向きに移動 | 
|  j  | 下向きに移動 |
|  h  | 左向きに移動 | 
|  l  | 右向きに移動 | 

文字列検索・操作

|  コマンド  |  内容  |  メモ  |
| ---- | ---- | ---- |
| /文字列 | 指定した文字列を検索 | .vimrcでset hlsearchを書いて置かないと検索結果が見づらい|
| :set hlsearch |　検索結果をハイライトで表示 | :nohを打たないとハイライトがずっと表示される|
| :noh | 検索結果のハイライトを削除 ||
php.ini (memory) に 1時間持っていかれた話


### 目標ができ、アウトプットするために記事を書こうと思いました。
がんばるぞい！

環境
-
<li>
・PHP　7.3 <br>
・Composer　1.10.13
</li>

問題
-

個人開発をネタにしようと何を作ろうか悩みながら
composerでインストールしていたら
壁は突然現れました。

![スクリーンショット 2020-10-10 15.17.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779664/5ae96fd1-11b7-4b26-4920-a555d02e3b41.png)

まず、error内容をグーグル先生に伝えました。
そうすると php.ini の内容を変えましょうという助言をいただきました。

[【PHP】composer require時にPHP Fatal error: Allowed memory size of XXX bytes exhaustedが表示されたら](https://qiita.com/_hiro_dev/items/bc5a3db604b08e6fc5b0)

記事を拝読しました。
記事に、メモリ上限値無制限とあって、怖いなと感じて素直に行動しませんでした。
ここが良くなかったです。自ら時間を捨てる結果となりました。


```zsh
# まずは、memory_limitの設定値を確認してみました （記事通りの結果）
% php -r "echo ini_get('memory_limit').PHP_EOL;"
128M
```

```zsh
# php.iniの場所を確認しました (MacOS)
% php -i | grep php.ini                              
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini
```

先程のerror文の中に

```zsh
PHP Fatal error:  Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes)
```
とあったので
php.iniを見て疑問に思いました。

```zsh:php.ini
memory_limit = 128M # 256M や 512Mにしてみましたが…
```

4096 byteとあったので
0.004MBくらいじゃん！128M(MB?)で何がいけないの？
と思っていました。

数値を適当に上げましたが
同じerror文が出ました。

ファイルの場所や参照している何かが違うのか？と
１時間以上、調べまくりました。

しかし、どうにもならないので
希望の光もなく、見覚えのある数字にしてみました。

```zsh:php.ini
memory_limit = 4096M
```
としました。

そしたら、成功しました。

キモチェ〜〜〜〜というか
ファ？！という感じでした。 　完


数時間後、この記事を書いている際
-
error文を翻訳してみました。

>1610612736バイトの許容メモリサイズが使い果たされました
（4096バイトを割り当てようとしました）

とのこと。

[コア php.ini ディレクティブに関する説明 ¶リソース制限](https://www.php.net/manual/ja/ini.core.php#ini.memory-limit)

公式サイトを確認してもよくわからなかったので

4096MのMってMemoryのMなのかな〜
そんなことを考えながら
別件のメールサーバーいじってたら、
6時間も過ぎてしまいました。

ちょっとイジるつもりが詰まってしまって…

何もできていない、開発しないとッ！！
-
緩い日報のようになってしまいました。

今回の投稿で感じたことは
画像より文字の方がいいなと感じたので
スクリーンショットではなくて
これからは、メモなどにコピペしておこうと思います。

Markdown 覚えないと…

以上
jQueryを用いたその場編集機能の実装

#実現したいこと
編集ボタンを配置し、編集ボタンを押すと要素がテキストに切り替わり登録可能になるようにしたい。

# ソースコード
```index.html

 <div>
   <form action""  id="food_form" method="post">
     <span id="food">焼肉</span>
     <input type="text" id="text" value=""　style="display:none;">
     <input type="button" id="edit" value="編集">
     <input type="button" id="regist" value="登録"　style="display:none;">
   </form>                   
 </div>



<script>
$(document).ready(function() {
    $(".edit").click(function(){
　　　  $("#text").removeAttr('style');
       $(this).hide();
       $("#regist").removeAttr('style');
    });

    $(".add_btn").click(function(){
       $('#food_form').submit();
    });
});

</script>

```

#自分で試したこと
現在は編集ボタンを押すと編集ボタンが消え、display:noneで隠していたtextフォームと登録ボタンが現れる仕組みでの実装を考えています。

しかしコードがすっきりしないので、textフォームや登録ボタンもJQueryで追加するやり方の方が良いのかもしくは別のやり方があるのかを知りたいです。
よろしくお願いします。
【Unity】FungusをLuaで操作する方法

Fungusはビジュアルスクリプティングで会話パートを実装できるアセットです。

ビジュアルスクリプティングなのでUnityEditor上で会話を打ち込む必要があります。

簡単な会話パートならUnityEditor上で済むと思いますが、本格的にアドベンチャーゲームを作る、もしくは会話だけUnityを知らない人に作ってもらおうとすると大変です。

会話パートをLuaに記述することで解決しようと思います。

#ステップ０　Luaとは？

C#とは別の昔からゲームに組み込まれてきた汎用スクリプト言語です。

#ステップ１　Fungusをアセットストアからインポートする。

https://assetstore.unity.com/packages/templates/systems/fungus-34184

Asset StoreでFungusを検索しダウンロード＆インポートします。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76537/4cd6452b-f907-b2da-273a-51e92263848c.png)


#ステップ２　Flowchart、LuaEnvironment、LuaScriptをシーンに配置する。

メニューの
Tools　＞ Fungus　＞ Create
から

- Flowchart
- LuaEnvironment
- LuaScript

をシーンに配置します。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76537/c4d2485c-fa59-4b34-42f2-f2bc0fd39800.png)


#ステップ３　Luaファイルを配置する。

任意のフォルダにLuaファイルを配置します。

Luaファイルの文字コードはUTF-8にしてください。
UTF-8でないと日本語が文字化けしてしまいます。

#ステップ４　Luaファイルを編集する。

Fungusで会話を表示したい場合は

```lua
say("会話")
```

を記述してください。
改行は\r\nで表現できます。

#ステップ５

Lua Scriptの

- Lua Enviromentに先ほどHierarchyに配置したLuaEnvironmentをドラッグ＆ドロップしてください。
- Lua Fileに任意の場所に保存したLuaファイルをドラッグ＆ドロップしてください。
- Lua Scriptに直接Luaコマンドを打ち込めます。Lua Fileがある場合は、Lua Fileが実行された後に、Lua Scriptのコマンドが実行されます。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76537/cb22115a-a2d0-7e11-8eb9-a0eca595dcf3.png)


#ステップ６　Luaの実行タイミングをスクリプトで操作する。

初期設定ではシーン開始時にLuaが実行されます。
実行タイミングを変更したい場合は、
LuaScript　＞　Execute Handler　＞　On Event
をStartからNothingにに変更してください。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76537/4a02f2a6-5a79-3745-6557-8c28fff05264.png)


LuaScriptを他のスクリプトでGetComponentして、OnExecuteメソッドを実行してください。
formatOnSave がある日突然動かなくなった。Prettier VSCode

# formatOnSaveが効かない
ある日VSCodeでいつも通り開発中のプロジェクトを開くとformatOnSaveが効かなくなりました。[VSCode](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)の[Prettier](https://prettier.io/)で。 
動作環境Mac
# 解決法
「Command + ,」でSetting画面を開いて**Default Formatter**を**esbenp.prettier-vscode**に設定すると動くようになりました。

# 困難だった点
**formatOnSave**の設定方法や**.prettierrc.js**の記述方法だったりの記事は沢山あるが、**Default Formatter**について言及されている記事が少ない。
今回の事例は**formatOnSave**の設定や**.prettierrc.js**の記述は正しいにも関わらず起きた点。
今まで普通に動作していたのに突然起きた事。
**markdown**のファイルでは動作していた事？？
**.js**ファイルで起きていた。他は知らん。
jsファイルを自動整形する他のプラグインを入れた記憶無いんやけど。
まぁ**Default Formatter**選択する時色々出てきたからそうなんかもしれん。
GoogleMeet使い方メモ

#GooleMeetの使い方　俺的メモ

勉強会開催するにあたって、初めて使う人への説明を兼ねたメモです。

私もこの記事書いてる当日に初めて開催設定して接続テスト行ったようなレベルです。
お手柔らかに

##会議接続に必要なもの

- Googleサービスのアカウント
- ブラウザ

###Googleサービスアカウント

https://apps.google.com/intl/ja/intl/ja_ALL/meet/how-it-works/
によると

>個人で使用する場合
Gmail、Google フォト、YouTube などの Google サービスをすでにご利用の場合は、既存の Google アカウントにログインするだけで Google Meet も使用できます。

>Googleアカウントをお持ちでない場合は、無料でご登録いただけます。

とのこと。(情報参考にさせていただき、引用させていただきました。）

私が検証してみたところ、Googleアカウントのログインが求められました。会議での表示名もGoogleに登録しているものが使われるようです。表示名を変えたい場合はそれ専用のGoogleアカウント登録をする対応が必要でしょう。

###接続方法

会議のURLにアクセスするだけです。

私、ChromeとFirefoxで登録してるGoogleアカウントが異なっていたので、この2つで接続試験してみました。
つながりました。が、Firefoxは安定しないのか途中で落ちました。GoogleサービスはChromeで接続したがベターでしょう。
GitHub Actionsのset-outputに複数行の標準出力を代入する場合は改行コードをエスケープしてあげる必要がある

:::note warn
set-outputの使用は非推奨になりました
https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/

今後はEnvironment filesを使用した方が良さそうです
https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#environment-files

Environment filesを使用した場合の複数行の代入はdelimiterを使用するとできるようです
https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#multiline-strings
:::

# 結論
set-outputに複数行の標準出力を代入する場合は改行コードをエスケープしておくこと

```bash
hoge="${hoge//$'\n'/\\n}"
echo "::set-output name=hoge::$hoge"
```

# set-outputとは
GitHub Actionsではset-outputコマンドを利用することで出力パラメータに値を代入することができます。
`echo "::set-output name=NAME::VALUE"`で`NAME`に`VALUE`を代入することができます。
利用する際は`${{ steps.ID.outputs.NAME }}`で利用します。id値を指定する必要があるため、代入時は必ずidを設定してください。
例えば以下のように使います。

```yml
steps:
  - id: test_id
    name: test_name
    run: echo "::set-output name=test::hoge"

  - run: echo "${{ steps.test_id.outputs.test }}"
```

こうすることで`${{ steps.test_id.outputs.test }}`には`hoge`が代入されます。

# どういう時に使う？
後のステップに値を渡したい時などに使います。例えばAステップでコマンド実行を行い、BステップでAステップで実行したコマンドの標準出力をslackに通知する時とかに使いたくなります。

# 複数行の標準出力だと1行目しか代入されない
```yml
steps:
  - id: test_id
    name: test_name
    run: |
      user_list=$(cat /etc/passwd)
      echo $user_list
      echo "::set-output name=std_out::$user_list"

  - run: echo "${{ steps.test_id.outputs.std_out }}"
```
上記のマニフェストはOSユーザの一覧を出力する`cat /etc/passwd`コマンドを実行し、その標準出力を出力パラメータ`std_out`に代入し、後のステップで出力パラメータをechoで表示させています。複数ユーザが存在するため、出力パラメータには複数行の標準出力が代入されるはずなのですが、実際は1行目しか代入されません

![test_·_yhamano0312_github-actions-test_51fb2a8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266372/9b542854-dab0-b042-e648-d1dfafedf29a.png)

![test2_·_yhamano0312_github-actions-test_51fb2a8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266372/4b6a5c49-8d50-0346-f591-0acda562d9b9.png)

# 改行コードをエスケープする
出力パラメータに代入する前に改行コードをエスケープすることで複数行を出力パラメータに代入することができます。

```yml
steps:
  - id: test_id
    name: test_name
    run: |
      user_list=$(cat /etc/passwd)
      # エスケープ処理
      user_list="${user_list//$'\n'/\\n}"
      echo $user_list
      echo "::set-output name=std_out::$user_list"

  - run: echo "${{ steps.test_id.outputs.std_out }}"
```

![test3_·_yhamano0312_github-actions-test_9d37e55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266372/27d69e25-e4cf-be71-0a42-993b81921fab.png)

こちらはGitHubのサポートケースに上がってますが、エスケープ処理を入れろが公式回答となってます。。いちいちエスケープ処理を入れるのは面倒だし、使いずらいと思うので、修正して欲しいですね。
https://github.community/t/set-output-truncates-multiline-strings/16852
GitHub Actionsでリリースする

以下をやってみた

- GitHubに `v1.0.0` のようなタグをpushするとリリースする
- 依存するライブラリのソースコードも含めてzipファイルを生成する
  - サブモジュールとCocoaPodsを利用しており、アーカイブにスナップショットを含めたかった

こんな感じでアーカイブが添付される。

![release.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20902/6c020a6a-5a2a-f9f9-4612-9bbe91ebbe38.png)

### ソース

公開用として、uhooiさんのサンプルプロジェクトに追加してみた。

- https://github.com/firewood/iOSDC2020-Talk-Sample/blob/main/.github/workflows/release.yml

### リポジトリ名とタグ名を取得する

リポジトリ名は `${{ github.repository }}` からorganizationを消せば得られる。([github コンテキスト](https://docs.github.com/ja/free-pro-team@latest/actions/reference/context-and-expression-syntax-for-github-actions#github-context))
`${{ github.ref }}` は `refs/tag/タグ名` なので、前半を消せばタグ名が得られる。
それぞれをoutputに入れておくと続くタスクで参照できる。(参考: [GitHub ActionでDockerコンテナをビルドしてAmazon ECRに保存する](https://dev.classmethod.jp/articles/github-action-ecr-push/), [GitHub ActionsでJobのOutputの値を後続Jobで参照する](https://swfz.hatenablog.com/entry/2020/04/18/160235))

```
- name: Set version
  id: version
  run: |
    REPOSITORY=$(echo ${{ github.repository }} | sed -e "s#.*/##")
    VERSION=$(echo ${{ github.ref }} | sed -e "s#refs/tags/##g")
    echo ::set-output name=version::$VERSION
    echo ::set-output name=filename::$REPOSITORY-$VERSION
```

### サブモジュールを含めてcloneする

`${{ secrets.GITHUB_TOKEN }}` は、同じリポジトリのread/write権限しかない。([Authenticating to package registries on GitHub](https://docs.github.com/ja/free-pro-team@latest/packages/using-github-packages-with-your-projects-ecosystem/using-github-packages-with-github-actions#authenticating-to-package-registries-on-github))
なので、もし別のprivateリポジトリも含めてcloneしたいなら、アクセストークンを作ってそれを指定する。([個人アクセストークンを使用する](https://docs.github.com/ja/free-pro-team@latest/github/authenticating-to-github/creating-a-personal-access-token))

```
- name: Checkout code
  uses: actions/checkout@v2
  with:
    token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
    submodules: true
```

### zipファイルを作るが.gitは含めない

書き方はおそらくシェルに依存するので、要動作確認。

```
- name: Archive
  run: |
    zip -r ${{ steps.version.outputs.filename }}.zip ./ -x "*.git*"
```
Optional arguments in Rust macro definition 

Here is a simple example that showing a rust macro that accept optional arguments(arguments number is not fixed/variable arguments)


```rust

macro_rules! foo {
    ($var:ident $(, $check:expr )?) => {
        let val = $var;
        let mut ok = true;
        $ ( ok = $check(val); )?
        if ok {
            println!("var is: {}", val);
        }
    };
}

fn main() {
    let x = 10;
    let y = 20;

    foo!(x, |v| v > 10);
    foo!(y, |v| v > 10);
}

```

First, the `($var:ident $(, $check:expr )?)` is pattern matching part of a macro.

`?` in `$(, $check:expr )?` means the `$check` has zero or one occurrences.

The repetition operators are:

- `*` — indicates any number of repetitions.
- `+` — indicates any number but at least one.
- `?` — indicates an optional fragment with zero or one occurrences.

Next, `$ ( ok = $check(val); )?` is in format `$( xxx )?`, means that the statement will execute zero or one time.
[ServiceNow] 小型ユーザーインターフェースをデフォルトでオンにしたい

#概要
ServiceNow では、ユーザーごとに設定できる内容がいくつかあります。
その中でもよく設定されるものの一つに小型ユーザーインターフェースがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/756088/91301335-4d29-eb2f-4ed2-62a69b19e8cd.png)
こちらをオンにすると、画面の文字が小さくなったり、余白が減ったりして、全体にコンパクトになり、1画面で表示できる項目を増やすことができます。
小型ユーザーインターフェースのデフォルトは、オフですが、こちらをデフォルトでオンにしたいという要望を受けることもよくあります。
本記事では、小型ユーザーインターフェースをデフォルトでオンにする手順を説明します。
#手順
（以下、手順は英語モードで操作したものを記載します）
1 画面右上の歯車マークから自分の設定で小型ユーザーインターフェース（英語では、Conpact the user interface) をオンにします
2 User Administration > User Preference に行き、Updated を降順でソートして、最近設定された User Preference を見て、小型インタフェースを設定するための Preference を見つけます
3 「glide.ui.compact」という Preference が今ログインしているユーザーのものとしてあるはずなのでそちらを開きます
4 開いた「glide.ui.compact」のレコードで、User を空にし、System にチェックを付け、保存します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/756088/fc46e3a2-60eb-77e5-6a79-df0852fabf9a.png)
これで小型ユーザーインターフェースがデフォルトでオンになり、何も設定していないユーザーも最初から小型インターフェースがオンの状態になります。
他の User Preference で制御されている内容も同様の手順で、デフォルトを制御できます。

以上です。
モデルの評価方法、正答率だけじゃダメみたい...（人工知能初心者向け！！）

<h1>はじめに</h1>
大学の講義内で、興味深い評価の紹介があったので（おそらく初歩的だが）備忘録として残しておこうと思う。
<h2>概要</h2>
人工知能のモデルの評価方法には今まで正答率しか考えてこなかった。しかしそれでは、性能としては高いのかも知れないが、実際に使えるかどうかは微妙なところがあるようだ。

例えば、昨今流行している新型コロナウイルスに罹患しているかしていないかを、ある識別器を用いてクラス分類するとしよう。識別された結果の内訳がこのような場合を考える。

| \ | 罹患と予想 | 非罹患と予想 |
|:-:|:-:|:-:|
| 罹患 |  5 |  7 |
|  非罹患 |  5 |  87 |

このような行列を<strong>混同行列</strong>と呼ぶ。
この記事内では、行列の値それぞれを以下のように定義することとする。

| \ | 罹患と予想 | 非罹患と予想 |
|:-:|:-:|:-:|
| 罹患 | TP (True Positive) |  FN (False Negative) |
|  非罹患 |  FP (False Positive)  |  TN (True Negative) |

まず正答率についてだが、式にするとこのようになる。

```math
accuracy = \frac{TP + TN}{TP + FN + FP + TN}
```

これを実際の数値に当てはめてみると、

```math
accuracy = \frac{5 + 87}{5 + 7 + 5 + 87}
```
となり、accuracyは以下のようになる（途中計算略）

```math
accuracy \fallingdotseq 0.88
```

高いとは言えないがそれなりに分類できていると考える。以前の私であればそのままほっといたかも知れないが、今はそうではない。
次の評価基準として、精度（適合率）、再現度、F値について説明しよう。
<h3>Precision (精度、適合率)</h3>
最初に精度と聞いたときに、「解釈的には正答率と何が違うのだろうか」と考えた。日本語は難しい。
まずはじめにこの値を求める式をお見せしよう。

```math
precision = \frac{TP }{TP + FP }
```
まあこれだけ見ても何を意味しているのかはわからない。（自分も）
まず分母は、識別器がPositive、つまり今回の場合は、新型コロナウイルスに罹患していると判断したデータの総数だ。
そして分子は、陽性であると識別子が判断し、実際に陽性だったデータの総数ということになる。
つまりこの値は、陽性だと判断された中で、実際に陽性だった人の割合を示す値であることがわかる。
このことから、この値が上昇すると<strong>偽陽性</strong>が減ることになる。
次のRecallについては偽陽性の逆、そう偽陰性についてだ。
<h3>Recall(再現度)</h3>
こちらについても先に値の求め方を明記しておこう。

```math
recall = \frac{TP }{TP + FN }
```

分母については、実際にPositiveだったデータの総数が。
分子にはPositiveと判断され、実際にPositiveだったデータの総数が入る。
つまり、値は、実際に陽性の人の内識別器に正しく陽性だと判断された割合を示すことになる。
このことから、この値が上昇すると、<strong>偽陰性</strong>の割合が減ることになる。
<h3>つまり......?</h3>
今回の事例で言うと、新型コロナウイルスはとても感染力の強いウイルス（知らんけど）だと仮定すると、偽陽性だった場合は、本当は陽性じゃないけど陽性だと判断されるため、その本人しか不利益なことは起きない。（ホントはこれもダメ）
しかし、偽陰性だった場合はその逆で、ホントは陽性なのに陰性だと判断され、さらに感染を広げる原因となってしまうため、これを減らすことが社会的には良いことだと私は思う。

ここで何かを感じた方もいらっしゃると思うが、
<strong>PrecisionとRecallどっちもあげれば万事解決じゃね？</strong>
これが至極真っ当な意見である。しかしどうやら、人工知能はそんなに有能ではないらしく、PrecisionとRecallはトレードオフの関係にあるらしく、どちらも高い状態にすることは、不可能に近いそうだ。
人工知能は有能ではあるが、知らない人が使い道を誤ると、偽陰性のような危険な状態になってしまうことをお忘れなきよう...

<h2>終わりに</h2>
とても文章が長くなってしまったが、LaTeXを用いた計算式の書き方の学習にちょうどよかったと感じた。
とても初歩的な範囲であると思うので、これから人工知能を学習する人には新鮮な内容ではないかと考える。
熟練者の皆様。暖かい目で見守っていただけると幸いです。
<br>
そろそろWebアプリケーション開発についての記事がかければいいなと思っています。
ありがとうございました。
Mass Assignment　とは(laravel)


Webアプリケーションのアクティブなレコードパターンが悪用され、パスワード、許可された権限、または管理者のステータスなど、ユーザーが通常はアクセスを許可すべきでないデータ項目を変更するコンピュータの脆弱性です。

以下引用
https://csword.net/2018/07/04/mass_assignment_vulnerability_%E3%81%A8%E3%81%AF/

Web上から入力されてきた値を制限することで、不正なパラメータを防ぐ仕組みらしいです

laravelではEloquentで　Mass Assignmentの対策されているとのこと

->パラメータ(パソコンの動作を変える為の外部から与える設定値)
->Eloquent(Laravelで提供されているデータ操作の為の機能)
Eloquentについての詳細↓
https://readouble.com/laravel/6.x/ja/eloquent.html
https://laravel.com/docs/6.x/eloquent#mass-assignment
Raspberry Pi講座

Raspberry Pi初めて触る人のためにスライドを作りました．

SDカードにOSを入れるところからカメラで撮った写真をLINEで送信するまでを説明しています．

多くの人に理解できるように英語で書きました．苦手な人はすみません．

写真や動画を多めに載せているのと，リンクを随所に貼っているのでソフトウェアのインストールからamazonでの購入までスムーズに行えると思います．

プログラミングはPythonでC言語と比較しながら最低限の基礎だけ説明していますので難しすぎることはないと思います．

https://docs.google.com/presentation/d/1gmJZD6B_3tLb8YJseXRejSJbUNBczx-TsoHChileOgQ/edit?usp=sharing
【自動録画】伊藤塾のストリーミングを自動で連続再生する【Selenium】

#はじめに
伊藤塾のストリーミングを外で見たい時にギガを消費するのが嫌なので自分用にバーっと一気に書きました。
寝てる時に録画してます。
１．ストリーミングの動画サイズを小にして下さい
２．Bandicam等の録画ソフトを使って同じ位置で録画し続けて下さい。
(次の動画はjsで初期位置が同じ、サイズが小で再生されます。録画ソフトを固定してひたすら動かしておけばよいです)
__３．コース購入者が自分のために使用して下さい。ストリーミングの視聴権は購入した個人のみです。（当たり前ですが……）__
４．Seleniumの詳しい説明はググって下さい ChromeでF12が使えれば大体使えます。

OS：Windows10
GoogleChrome バージョン: 85.0.4183.121（Official Build） （64 ビット）
Python：3.70
Selenium Webdriver：この記事を書いた時点で最新のもの
chromedriver.exe：この記事を書いた時点で最新のもの

※スクリプトと同じフォルダに'chromedriver.exe'を置いてください。

```python:ringfit.py

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
import time

opt = webdriver.ChromeOptions()
#opt.add_argument('--blink-settings=imagesEnabled=false')
browser = webdriver.Chrome(options=opt)

browser.get('https://www.itojuku.co.jp/index.html')

elem_mypage = browser.find_element_by_xpath('//*[@id="bk814"]/div/div/div[2]/div/span/a').click()
time.sleep(3)

elem_email = browser.find_element_by_name('login_email')
elem_email.send_keys('your_email')
elem_password = browser.find_element_by_name('login_pass')
elem_password.send_keys('your_password')
elem_login_btn = browser.find_element_by_id('log').click()

time.sleep(5)

elem_kouza_btn = browser.find_element_by_id('gnavi__jukou').click()
elem_juko_btn = browser.find_element_by_xpath('//*[@id="gnavi__jukou"]/div/div/div[1]/a').click()

WebDriverWait(browser, 3).until(lambda d: len(d.window_handles) > 1)
browser.switch_to.window(browser.window_handles[1])

# 変更部分その１
# ここの文字を録画したいコースに変更して下さい。
# どのみちそこまで長い録画は無理なので、これは手動変更です。
elem_kiso_minpo = browser.find_element_by_link_text('20 基礎力完成マスター 民法 【平林】').click()
#find_element(:partial_link_text, "ログイン").click

time.sleep(1)
# 変更部分その２
# ここのimgのname名を録画したいコースに合わせて下さい。
elem_detail = browser.find_element_by_name('Image00049510').click()
time.sleep(1)
# 変更部分その３
# imgのname名が基本的に連番になっているので、3600秒（1時間）ごとに+1してループさせる形にしています。
for num in range(59, 81):
    image_num = 'Image000000' + str(num)
    time.sleep(1)
    elem_minpo_kiso_kougi_btn =  browser.find_element_by_name(image_num).click()
    time.sleep(1)
    elem_minpo_kiso_kougi_btn =  browser.find_element_by_xpath('/html/body/table/tbody/tr[2]/td[2]/table[3]/tbody/tr/td[3]/p/a/img').click()
# １時間録画
    time.sleep(3600)
    elem_modoru = browser.find_element_by_link_text('≪カテゴリ選択へ').click()
```
![伊藤塾自動録画.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317812/feba2a39-3f76-a335-bde1-5058c2a37d3e.png)