OmniAICreator/Qiita-1.07M huggingface dataset:
Ktor + Koinでテスト時にインスタンスを差し替える

## 環境
ktor_version=1.4.1
kotlin_version=1.4.10
koin_version=2.1.6
joda-time_version=2.10.8

# 解説
細かい解説はコードコメントにて。

## 現在日時を差し替える
以下のように現在日時をつぶやくクラスがいたとする

```kotlin

class ClockSpeaker(private val clock: Clock) {
    fun speak(): String {
        return clock.now().toString("yyyy年MM月dd日のHH:mm:ssやでー")
    }
}
```

テストしやすいようにClockというinterfaceを定義し、そこから日時を取得する。
テスト用に指定日時を返す実装も作っておく。

```kotlin

import org.joda.time.DateTime

/**
 * 現在日時を取得するためのinterface
 */
interface Clock {
    fun now(): DateTime
}

/**
 * 現在日時を取得する
 */
class ClockNow : Clock {
    override fun now(): DateTime {
        return DateTime()
    }
}

/**
 * 指定された日時を取得する
 */
class ClockSpecify(private val specifyDateTime: DateTime) : Clock {
    override fun now(): DateTime {
        return specifyDateTime
    }
}
```

ルーティングなどはこんな感じになる

```kotlin

import io.ktor.application.*
import io.ktor.http.*
import io.ktor.response.*
import io.ktor.routing.*
import org.koin.core.module.Module
import org.koin.dsl.module
import org.koin.ktor.ext.Koin
import org.koin.ktor.ext.inject

fun main(args: Array<String>): Unit = io.ktor.server.netty.EngineMain.main(args)

@Suppress("unused") // Referenced in application.conf
@kotlin.jvm.JvmOverloads
fun Application.module(testing: Boolean = false, testModule: Module? = null) {  //testModule: Module? = nullという引数を追加
    install(Koin) {
        modules(getModule())

        if (testing && testModule != null) {
            //テスト用のModuleで上書き
            modules(testModule)
        }
    }
    routing {
        val speaker by inject<ClockSpeaker>() // インスタンスの取得
        get("/") {
            call.respondText("HELLO WORLD!" + speaker.speak(), contentType = ContentType.Text.Plain)
        }
    }
}

fun getModule(): Module {
    return module {
        factory { ClockNow() as Clock }
        factory { ClockSpeaker(get()) as ClockSpeaker }
    }
}

```

ここまでは通常のKoinの使用と変わらず。
続いてテストコード。

```kotlin

import io.ktor.http.*
import io.ktor.server.testing.*
import org.joda.time.DateTime
import kotlin.test.Test
import kotlin.test.assertEquals

class ApplicationTest {
    @Test
    fun testRoot() {
        withTestApplication({
            val now = DateTime(2020, 11, 29, 12, 23, 34)
            val testModule = org.koin.dsl.module(override = true) { // override = trueで上書きができる
                factory { ClockSpecify(now) as Clock }
            }
            module(testing = true, testModule = testModule)
        }) {
            handleRequest(HttpMethod.Get, "/").apply {
                assertEquals(HttpStatusCode.OK, response.status())
                assertEquals("HELLO WORLD!2020年11月29日の12:23:34やでー", response.content)
            }
        }
    }
}
```

たぶんコレが一番シンプルなはず…。

## コード全体
[iwahara/KoinTestExample: Koinを使ってテストのときだけインスタンスを差し替えるサンプル](https://github.com/iwahara/KoinTestExample)
UWP タイトルバーにコントロール配置する方法

###タイトルバーにコントロールを表示する。
モダンなデスクトップアプリはタイトルバーにコントロールを配置する傾向がある。VisualStusio2019もタイトルバーに表示している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688992/f943df90-eccc-b6cf-820c-3740e3baa393.png)
下記のコードで、タイトルバーへコントロールを配置可能になる。

```MainPage.xaml.cs
public MainPage()
{
	this.InitializeComponent();
	
	CoreApplication.GetCurrentView().TitleBar.ExtendViewIntoTitleBar = true;
	ApplicationView.GetForCurrentView().TitleBar.ButtonBackgroundColor = Windows.UI.Colors.Transparent;
	ApplicationView.GetForCurrentView().TitleBar.ButtonInactiveBackgroundColor = Windows.UI.Colors.Transparent;
	Window.Current.SetTitleBar(TitleBar);

	CoreApplication.GetCurrentView().TitleBar.LayoutMetricsChanged += TitleBar_LayoutMetricsChanged;
}

```
[サンプルコード](https://github.com/Yuki4-dev/TitleBar_Sample.git "コード")
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688992/2cd2df7e-84fc-adf8-5b6a-cda57626e001.png)

###CoreApplication.GetCurrentView().TitleBar.ExtendViewIntoTitleBar = true;
コントロールの配置タイトルバーまで広げる。

###ApplicationView.GetForCurrentView().TitleBar.ButtonBackgroundColor = Windows.UI.Colors.Transparent;
ウィンドウの右上のボタンの背景色を設定する。(ここでは透明)

###ApplicationView.GetForCurrentView().TitleBar.ButtonInactiveBackgroundColor = Windows.UI.Colors.Transparent;
ウィンドウの右上のボタンの非アクティブ時の背景色を設定する。(ここでは透明)
これがないとアプリが非アクティブ状態のときこのように背景色を透明にしたつもりが、透明でなくなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688992/8f88a8d0-bbd4-ac93-95e8-f476d324a7e3.png)

###Window.Current.SetTitleBar(TitleBar);
タイトルバーにフォーカスを受け取るコントロールがあるときは別途自作した任意のコントロールをタイトルバーに設定する必要がある。

###CoreApplication.GetCurrentView().TitleBar.LayoutMetricsChanged
ウィンドウが表示されるときなどに発生するイベント。
タイトルバーのサイズなどの情報を持っている。
下記のようにイベントハンドラーを設定してサイズ情報を受け取る。

```MainPage.xaml.cs
private void TitleBar_LayoutMetricsChanged(CoreApplicationViewTitleBar sender, object args)
{
	RightText.Margin = new Thickness(0, 0, sender.SystemOverlayRightInset, 0);
}
```
位置を調整しないと下の画像のように文字が閉じるボタンと被ったりする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688992/660b4cb1-f763-5de4-24a3-83e745e8c52f.png)

通常のデスクトップなどではあんまり感じないけど、タブレットなんかを考えるとタイトルバーがないほうが便利なのかも
Oculus Quest 2 で自分が作った世界に入る最もお手軽な方法ってなんだろな

個人的には [Mozilla Hubs](https://hubs.mozilla.com/) を使う方法が、一番手軽だと思いました。
専用のシーンエディタ（[Spoke](https://hubs.mozilla.com/spoke)）も用意されてるから、全部ブラウザで作れちゃうし、この手の話題には必ず登場する Unity とか Blender も要らないし。
![スクリーンショット 2020-10-30 175952.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224830/7cb062b1-8065-88d5-0a66-2a559024f9a4.png)
なんならモデリングだって [Tinkercad](https://www.tinkercad.com/) とか使えばブラウザだけで出来ちゃいます。
（無料なのに GLB 形式の出力に対応してる Tinkercad エライ🐧）
![スクリーンショット 2020-10-30 174031.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224830/7fd93f7a-14ca-24bb-0ae4-549a8fca8194.png)
まぁ少し手の込んだものを作りたいとなると、Blender とか使ったほうが早いですが……😅
特に「Oculus Quest でもキレイに表示させたい」とかなると、モデリングソフトでベイクするとかの工夫が必要になってきます。
それでも VRChat などのように、対応するバージョンの Unity 入れてアセットも入れてなんやかんやして……なんて手間はないので圧倒的に手軽だと感じました。
![lowworld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224830/3513c1d9-ab5a-c13e-76c2-b193e03b239b.png)
※なおアバター作成は Blender 必須😂
もし、他にも良いサービスとかあったら教えて下さい😉
React開発の環境構築手順

Reactの社内勉強会をした際の開発環境の構築手順です
Reactのプロジェクト作成して、sample画面の成果物作成まで行います

# インストール

## VisualStudioCodeのインストール

React開発するためのエディタいれます
公式からダウンロードしてインストール
https://azure.microsoft.com/ja-jp/products/visual-studio-code/

## Node.jsのインストール

webpackとか動かすため、インストールします
パッケージマネージャのnpmも一緒にインストールされます
https://nodejs.org/ja/
node,npmのバージョン確認でインストール確認

```
node -v
npm -v
```

# npm、npxについて軽く知っておく

`cowsay`って牛がしゃべるだけのパッケージをインストール・実行して、
npx、npmについて軽く知っておきましょう

## npx

マシンにインストール残さずにスクリプト実行する
`npx cowsay aaa`
カレントディレクトリにも、グローバルインストール先のディレクトリにも何もインストールされません

## npm（ローカルインストール）

カレントディレクトリにインストールしてスクリプト実行

カレントディレクトリにインストール（オプションつけずデフォルトはローカルインストール）
`npm install cowsay`
カレントディレクトリに、cowsayがインストールされます

cowsayを実行
`.\node_modules\.bin\cowsay "aaa"`
実行エラーでたら、PowerShellの権限の問題かも
https://qiita.com/Targityen/items/3d2e0b5b0b7b04963750

`npx`はローカルにパッケージがあれば、インストールせずに、スクリプト実行するので、
ローカルインストール済の状態でcowsay実行すると、インストール走りません

アンインストール
`npm uninstall cowsay`

## npm（グローバルインストール）

グローバルのインストール先
Unixベースのシステム：`/usr/local/lib/node_modules/`
Windows：`C:¥Users¥%USERNAME%¥AppData¥Roaming¥npm¥node_modules`

グローバルにインストール（`-g`オプションつける）
`npm install cowsay -g`
グローバルに、cowsayがインストールされます
カレントディレクトリには何もインストールされません

cowsayを実行（パスも通っている）
`cowsay "aaa"`

アンインストール
`npm uninstall cowsay -g`

# Reactプロジェクト作成

## create-react-appでプロジェクト作成

https://create-react-app.dev/docs/getting-started

npxでcreate-react-appをスクリプト実行すると、
React開発用のプロジェクトが作成されます

## 作成されたプロジェクトをみてみる

- node_modules
ローカルインストールパッケージが保存される
- public
htmlなどのWeb公開する資産が入っている
index.html
- package.json
プロジェクトの設定ファイル
依存するパッケージやnpm実行するスクリプトなどが記載されている
- .gitignore
- src
Reactのプログラム等が入ってます

## 起動しアクセスしてみる

create-react-appにはローカル実行の機能もついています
`npm start`でローカルの3000番portで実行されます
http://localhost:3000/ にアクセスしてみてください

`npm start`で実施される内容は、
`package.json`のscriptsに記載されています
react-scriptsってモジュールのstartを実行しています

```
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
```

`Edit src/App.js and save to reload.`って書いてあるので、
App.jsを修正したりしてみてください

## buildし、成果物を作成してみる

create-react-appはwebpackを使用してbuild処理をしています
隠れているので意識する必要はありません

`npm run build`を実行します
Reactで書かれたApp.js等がbuildされWeb公開用の成果物が作成されます
buildって何しているの？は↓が参考になりました（webpackの話だけど）
https://www.slideshare.net/ssuser46977e/webpack-why-cant-you-understand-the-webpack

buildフォルダが作成され、buildフォルダ下に成果物が作成されます
この成果物をWebサーバに配置して、作成したページがWeb公開できます
RailsサーバーにiPhoneで接続する

###背景
MacのローカルのRailsアプリにiPhoneでアクセスをしたいと思ったため。
想像以上に簡単に接続することが出来ました。


###前提
MacとiPhpneを同じWi-Fiに接続している必要がある

###手順
####1.MacのIPアドレスを確認
リンゴマーク→システム環境設定→ネットワーク→詳細→TCP/IPでIPアドレスを確認。

####2.IPアドレスを指定してRailsのサーバーを起動する。
手順１で確認したIPアドレスを指定してRailsサーバーを起動する。

```
$ rails s -b <IPアドレス>
```

-bオプションを使うことで、IPアドレスを指定

####3.iPhoneからRailsサーバーにアクセスする。

iPhoneのブラウザで下記のように入力する。
＊111.111.111.1はIPアドレスの例。手順1で確認したIPアドレスを入力する。

```
http://111.111.111.1:3000/
```
:3000で3000番ポートにアクセスする。Railsのデフォルトポートは3000であるため。

###最後に
何か間違えていたり、変な記述があったら遠慮なくコメントしてくれるとありがたいです！
【Swift】クリップボードに文字列をコピーする

##やりたいこと

iOSアプリからクリップボードに文字列をコピーする。
アプリ開発していると時折必要となる要件かと思います。


##実装方法

実装方法は非常に簡単です。1行でできます。ライブラリのインポートも必要はありません。

```swift:copy2clipboard.swift
UIPasteboard.general.string = "コピーしたい文字列"
```


##動作確認環境
Xcode: 11.7
iOS: 13.7
Swiftバージョン: Swift5


以上
【nohup】ターミナル消しても実行

ターミナルを消してもプログラムが実行できるコードを書く。

#nohupの使い方
nohup (実行コード) &
でnohupは使うことができる。以下に./a.outを実行した例を書く。

```
C:>nohup ./a.out &
```

出力は　nohup.out に書き出される。
一度コマンドを打つとターミナルを消しても実行が継続する。

また、特定の出力ファイルを指定する場合は、
nohup (実行コード) >(出力ファイル) &
である。
以下に実行例を書く。./a.outの出力をout.txtに書く。

```
C:>nohup ./a.out >out.txt &
```

#実行を途中で終わらせるとき
ps x
のあとに
kill　(PID)
をする。
以下に例を書く。

```
C:>nohup ./a.out &
C:>ps x
  PID TTY      STAT   TIME COMMAND
 5915  --      --     -:-- ./a.out
C:>kill 5915
```

以上のようにやることで実行を途中で終わらせる。

#nohupをpythonに使う
方法は以下の通り。

```
C:>nohup python a.py &
```
上の例はa.pyを実行している。

または、以下の通り。

```
C:>nohup python a.py >a.txt &
```
上の例はa.pyの出力をa.txtに書き込んでいる。
【Android Studio】スマホのセンサー情報を取得する【Kotlin】

こちらの教本を参考に、アプリからスマホのセンサー情報一覧を取得してみました。
[[作ればわかる！Androidプログラミング Kotlin対応 10の実践サンプルで学ぶAndroidアプリ開発入門](https://amzn.to/2TqSwIu)]

#【環境】
Mac OS Catalina 10.15.7
Android Studio 4.0.1
Minimum API Level 20

#【やったこと】
SensorManagerのgetSensorList()メソッドを使って、センサー名の一覧を取得しています。


```kotlin:MainActivity.kt
package com.example.maki.sensorget

import android.content.Context
import android.hardware.Sensor
import android.hardware.SensorManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*
import java.lang.StringBuilder

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val buffer = StringBuilder() //センサーの一覧情報を入れるための変数を宣言-①

        val sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager//getSystemService()の戻り値はObject型なので、SensorManager型にキャスト
        val sList : List<Sensor> = sensorManager.getSensorList(Sensor.TYPE_ALL)//getSensorList()の引数には取得たいセンサーの種類を指定-②
                                                                                   
        for(sensor:Sensor in sList){
            buffer.append("${sensor.stringType},${sensor.name},${sensor.vendor}\n")//sensor.type→定数、sensor.stringType→センサー名 - ③
        }
        txt01.text = buffer.toString()//activity_main.xmlの中にtxt01というTextViewを追加しています。
    }
}
```


##①StringとStringBuilder()の違い
以前書いた以下の記事に違いをまとめています。
タイトルの通り、今回は文字列を追加していくのでStrignBuilderを使っています。
[【Android Studio】文字列を追加したいときはStringよりもStringBuilderのがいいよって話【Kotlin】](
https://qiita.com/maqiita/items/e78155cabcab90c36e39)

##②センサータイプの名前と定数一覧
センサータイプの名前と定数は以下で確認できます。
参考：[Android デベロッパー - センサーの概要](https://developer.android.com/guide/topics/sensors/sensors_overview?hl=ja)

##③sensor.typeとsensor.stringType
sensor.typeは定数値のため、②の表を使って数値と種類の対応を確認する必要があります。
しかし、API20からはstringTypeでセンサーの種類が文字列で取得できるようになっていますので、そちらの方が便利です。
どこまでのAPIのバージョンをサポートするかはGradle Scripts/build.gradle(Module:app)のminSdkVersionの値で設定できます。
値を変更後は画面右上のSync nowを押して変更を反映させてください。

#【結果】
Pixel4（実機）のセンサー一覧が取得できました！
![Screenshot_20201030-230329.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704563/9bd36eea-7b19-c99a-a3a0-92972f2b3e83.jpeg)
Next.js 10 から SSR と ISR で 404 Not Found を返せるようになった

先日リリースされた Next.js 10 から、SSR（Server Side Rendering）と ISR（Incremental Static Regeneration）で 404 Not Found を返せるようになりました。が、[Next.js 10 リリースのブログ記事](https://nextjs.org/blog/next-10)では一切触れられていなかったので、ここで紹介しておきたいと思います（地味に便利な機能だと思うのですが）。

## Next.js 9.5 以前

従来どうしていたかというと、SSR であれば 404 Not Found を返すページにリダイレクトさせたり、ISR であれば 200 OK を返しながら見た目だけ 404 Not Found なページを表示させたりしていたかと思います。

参考：[Redirect to 404 · Discussion #10960 · vercel/next.js](https://github.com/vercel/next.js/discussions/10960)

## Next.js 10 から

`getServerSideProps` や `getStaticProps` が返すオブジェクトに `notFound: true` を指定できるようになりました。`pages/404.js` を作成しておけば、カスタム 404 ページが表示されます。

### SSR の場合

```javascript:pages/[id].js
export async function getServerSideProps({ params }) {
  const data = await getData(params.id);

  if (!data) {
    return {
      notFound: true
    };
  }

  return {
    props: { data }
  };
}
```

参考：[Add support for notFound in getServerSideProps by ijjk · Pull Request #18241 · vercel/next.js](https://github.com/vercel/next.js/pull/18241)

### ISR の場合

```javascript:pages/[id].js
export async function getStaticProps({ params }) {
  const data = await getData(params.id);

  if (!data) {
    return {
      notFound: true
    };
  }

  return {
    props: { data }
  };
}

export async function getStaticPaths() {
  return {
    paths: [],
    fallback: true // fallback に true または 'blocking' を指定して ISR を有効にする
  };
}
```

参考：[Add support for returning 404 from getStaticProps by ijjk · Pull Request #17755 · vercel/next.js](https://github.com/vercel/next.js/pull/17755)

## 余談：リダイレクト

Next.js 9.5.4 で導入されていた `unstable_redirect` も、Next.js 10 で `unstable_` のプレフィックスがとれて、めでたく正式に導入となりましたので紹介しておきます。

```javascript
export async function getServerSideProps() {
  return {
    redirect: {
      permanent: false, // false なら 307、true なら 308
      destination: '/somewhere-else'
    }
  };
}
```

参考：[Remove unstable_ prefix from unstable_notFound by ijjk · Pull Request #18283 · vercel/next.js](https://github.com/vercel/next.js/pull/18283)
CRUD

#【CRUD】

恥かしいことにこの言葉を知りませんでした。
知らないことだらけで毎日ずっと調べ事しています。
CRUDについてまとめてみました。

##CRUD

システムにとって、必要不可欠な４つの主要機能。
DBMSなどによく用いられる。

####Create　生成

####Read　読み取り

####Update　更新

####Delete　削除

##DBMSで考えると。

データ操作の際に必要最低限の機能。
登録、参照、変更、削除である。
どれが欠けてもいけない。

シンプルでよいサービスを提供するために必須。
画像の読み込みに時間がかかることの対策(Rails)

railsでトップページに画像を使用しているが、開発環境でも本番環境でも読み込みにすごく時間がかかっていました。
(カクカク表示されていてこれ絶対ユーザーの立場だとイライラするな〜と感じていました。)
その対策として自分が行ったことを記録しておきます。

環境は以下のとおりです。
ruby 2.6.5
Ruby on Rails 6.0.3.
本番環境はAWS(EC2)を使用

## 改善前の状況
先ほども記述しましたが、とにかく画像の読み込みでカクカクしていました。
ログで確認するとこんな感じでした。
![2284acd970fbb1e6dac74643c8aa36ba.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700117/6ac64e91-01cf-a2ff-8ff1-2112fb9fc0d9.png)
Web閲覧に3秒かかると、半数がページを離れると聞いたことがありますがこの場合ビューの読み込みで４秒かかっているっためかかりすぎですね。(4秒を超えるのは初めて見ました。)


## 改善内容
何か改善できないかと調べていたところ``WebP``というものを見つけました。
<b>WebPとは</b>
・読み方はウェッピー (私は初見で「ウェブピー」と読んでいました...。)
・Googleが新しく作った画像フォーマットでファイルの拡張子は「.webp」
・JPEGに比べてファイルサイズが小さく、画質も劣化しにくい
・一部非対応ブラウザがある。

ちなみに２０２０年１０月時点での対応プラウザは以下の画像のとおりです。
![4362e246c222dcd14d30e78cb5c35f27 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700117/7af5b324-3926-9513-e55c-10386c2ffde8.png)
IEとMacOS版Safariが非対応(iOS版Safariは対応) という感じでしょうか。

今までは.JPGを使用していたため早速WebPに変更してみました。(ネットで検索するとjpg→webpに変換してくれるツールがあります。)
ちなみに私はImageMagickでWebPを使いました。
WebPが使えるかどうかは以下の記事を参考にさせていただきました。
[ImageMagick と WebP](webphttps://qiita.com/yoya/items/0848a6b0b39db4cd57c2)

変換結果として以下のような違いがありました。
↓jpgファイル
![5fb840b09ff1ca0d094db7ae9d391a43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700117/0244aa42-69aa-0333-7283-e46548f9baef.png)


↓webpファイル
![d915b83708ba024053107e7355362b9c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700117/c59835ed-f141-b1b7-8802-13b48affe313.png)


確かにサイズが小さくなっていますね！
画質も確かに落ちてはいますが、個人的には気になりませんでした。

## 改善結果
ファイルをWebPに変更後、読み込み時間は以下のようになりました。
![b9dccd4fd5ecbf506f4751aaeef34538.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700117/96e2d998-4c58-59d3-df69-d0287384c1bc.png)
４秒から２秒に減らすことができました！気になっていたカクカクも無くなりすんなりと表示されるようになりました！
にしてもこれだけで２秒も減るのでしょうか？
あとまだ２秒かかっているので無駄なファイルやレンダリングを減らしていってなるべく短くできるようにしていきます。



###参考記事
https://qiita.com/yoya/items/0848a6b0b39db4cd57c2
https://caniuse.com/webp
https://qiita.com/szaizen/items/6a5819925cf3fa5fe79e
今更だけど、Railsで頻出のコマンド集

#はじめに

アプリケーションを作成する度に、カリキュラムを確認していたので、覚えるためにも、ここにまとめておく。

###新規アプリケーションの作成

```bash
rails new アプリケーション名 -オプション
```
`new`の前にrailsのバージョンを指定することも可能。
ex)`_6.0.0_`
オプションには、データベース管理システムを指定できる。
ex)`-d mysql`

###新規データーベースの作成
```bash
rails db:create
```


###サーバー立ち上げ

```bash
rails s
```

commond + Tで別のタブで行うとよい。
「control + C」でサーバーを止める。

###コントローラー生成

```bash
rails g controller コントローラー名（複数形）
```

コントローラー名の後に半角スペースを空け、アクション名を追加することで、コントローラーにアクションが記述された状態で生成される。

###モデル生成

```bash
rails g model モデル名（単数形）
```


###ルーティングの確認

```bash
rails routes
```

URI、path、アクションを確認。

###テーブル作成

```bash
rails db:migrate
```
マイグレーションファイルを修正したら、実行。

###マイグレーションファイルを差し戻す

```bash
rails db:rollback
```
マイグレーションファイルを修正したい時に、一度差し戻す必要がある。

###マイグレーションの状態を確認する

```bash
rails db:migrate:status
```

マイグレーションが実行済みかどうか確認する。
upかdown
MySQLのテスト環境（+数百万件のテストデータ）を5分で作る

# TL;DR

- MySQLのDockerコンテナを立てる
- MySQL公式から数百万件のテストデータをインポートする(https://dev.mysql.com/doc/employee/en/employees-installation.html)

ことで、簡単にローカルでMySQLのテストを行えるようになります。データの中身にはこだわらず、MySQLの機能自体をテストしてみたい、といった用途に利用できます。

コマンドをコピペしていけばだいたい5分くらいで環境を作れるはずです。

# 前提

- Docker、Gitはインストール、設定済み
- 本記事を作成する際には、Ubuntu20.04(WSL2)を使用しました。コマンドは適宜読み替えてください。

# 方法

## 1. 永続化させる設定とファイルを用意する

```bash

# 設定ファイルを入れるフォルダを準備
mkdir -p ~/mysql/config
# DBのデータをマウントするためのフォルダを準備
mkdir ~/mysql/mount_dir
```

次に、設定ファイルを作成しておきます。

```bash

vi ~/mysql/config/config-file.cnf
```

設定自体は好みで行います（空でもよい）が、ここでは例としてテーブル名を小文字にする制限を入れてみます。

```bash

[mysqld]
lower_case_table_names=1
```

## 2. MySQLのDockerコンテナを実行する

本記事では、MySQL `8.0.21` をインストールします。

```bash

# イメージ取得
docker pull mysql:8.0.21
# コンテナ実行
docker run --name mysql -p 3306:3306 \
-v $HOME/mysql/config:/etc/mysql/conf.d \
-v $HOME/mysql/mount_dir:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.21
```

docker run実行時にフォルダをマウントしておくことで、後でコンテナを更新したい場合などに、データや設定が削除されずに保持しておくことができます。

以下のコマンドでmysqlに接続できれば、無事MySQLのインストールは完了しています。

```bash
mysql -h127.0.0.1 -uroot -proot --port=3306
```

## 3. データを挿入する

MySQL公式サイトで紹介されている[test_db](https://github.com/datacharmer/test_db)レポジトリを利用することで、大量のテストデータを利用することができます。

```bash
cd ~/mysql
# GitHubのレポジトリをダウンロード
git clone git@github.com:datacharmer/test_db.git
# employees.sqlを取り込む
cd test_db
mysql -h127.0.0.1 -uroot -proot --port=3306 -t < employees.sql
```

以下がデータ件数です。`employees`テーブルだけでも30万件以上、合計で数百万以上のデータがあり、MySQLの仕様を動かしながら確かめたい際に便利です。

```bash
+--------------+------------------+------------------------------------------+
| table_name   | expected_records | expected_crc                             |
+--------------+------------------+------------------------------------------+
| employees    |           300024 | 4d4aa689914d8fd41db7e45c2168e7dcb9697359 |
| departments  |                9 | 4b315afa0e35ca6649df897b958345bcb3d2b764 |
| dept_manager |               24 | 9687a7d6f93ca8847388a42a6d8d93982a841c6c |
| dept_emp     |           331603 | f16f6ce609d032d6b1b34748421e9195c5083da8 |
| titles       |           443308 | d12d5f746b88f07e69b9e36675b6067abb01b60e |
| salaries     |          2844047 | b5a1785c27d75e33a4173aaa22ccf41ebd7d4a9f |
+--------------+------------------+------------------------------------------+
```

[公式ドキュメント](https://dev.mysql.com/doc/employee/en/)に詳細な利用方法が記載されているので、詳しくはこちらをご参照ください。

### 備考：別の環境からデータを移行する

以下の記事にデータの移行方法を記載したので、必要あれば併せて参照してみてください。

[[MySQL]mysqldumpを利用して別の環境にデータを移行する](https://qiita.com/ryoishizawa/items/2d8eb898b848a501f91c)

## 4. （おまけ）後片付け

テスト後、MySQLが不要になった場合は、以下のコマンドで削除します。

```bash
# コンテナを削除
docker rm -f mysql
# データも設定も要らない場合、フォルダごと削除
sudo rm -rf ~/mysql
```
様々な数値 ― J 言語入門

もう一度数値の話に戻ります。ここでは、多様な数値リテラルと、数値の型について書きます。

*J807 以前のバージョンでは、振る舞いが異なる場合があります。*

# 型を調べる

値 (noun) の型を調べるには、`datatype` という verb を使います。(`datatype` は標準ライブラリで定義されています。)

```j
   datatype 123
integer
```

# ブーリアン

数値リテラルのうち、`0` と `1` は**特殊な扱い**になっていて、boolean 型に分類されます。

```j
   datatype 0
boolean
   datatype 1
boolean   
```

`0` や `1` は この通りに (1 文字で) 表記する必要があり、`00` や `01` のようなリテラルは boolean では**ありません**。

# 整数と小数

整数リテラルは、基本的には integer 型になります。integer は、64 bit [^1] 符号付き整数です。

```j
   datatype 2
integer
   datatype _1
integer
   datatype 01    NB. 1 と書くと boolean になる
integer
```

小数点 (`.`) を含むリテラルや、integer の範囲外の整数は、IEEE 754 倍精度浮動小数点数 (floating) を表します。

```j
   datatype 1.    NB. 1.0
floating
   datatype _1.23
floating
   datatype 12345678901234567890
floating
   datatype _
floating
```

## 指数表記

`e` を用いた指数表記 (scientific notation) も同様に、integer / floating になります。

```j
   datatype _1e3   NB. _1000
integer
   datatype 1e_2   NB. 0.01
floating
   datatype 1.e3
floating
   datatype 3.456e_7
floating
   datatype 1e20
floating
```

## N 進数

`b` を使うと、N 進表記のリテラルを書けます。

```j
   16bff          NB. 十六進数
255
   2b01101001     NB. 二進数
105
```

`b` の前には基数を置き、後ろに数字 (0-9, a-z) を並べます。大文字の A-Z は**使えません**。整数だけでなく、小数も表記できます。

```j
   NB. 2 + 12(c) * 16^-1
   16b2.c
2.75
```

型は、指数表記と同様、小数点の有無と値の範囲から決定されます。

## 数学定数

e や π の絡んだ定数を書くときに使える記法です。

```j
   2x_1     NB. 2 * e^-1
0.735759
   _0.8p2   NB. _0.8 * π^2
_7.89568
```

型は、指数表記と同様、小数点の有無と値の範囲から決定されます [^2]。

# 複素数

J では、複素数を表すのに 3 種類のリテラルが使えます。複素数は、実部と虚部の 2 つの floating の組です [^3]。

最もよく使うのが、`j` を使った表記です (`i` ではないので注意)。

```j
   1.2j3.4     NB. 1.2 + 3.4i
1.2j3.4
   0j_1        NB. 0 - i
0j_1
   datatype 1j1
complex
```

複素数の型は complex です。

## 極形式

J には、極形式 (絶対値と偏角) で複素数を表すリテラルもあります。偏角の単位がラジアンの場合は `ar`、度 (°) の場合は `ad` を使います。

```j
   2ar1
1.0806j1.68294
   1ad45
0.707107j0.707107
```

# 多倍長整数

J では、多倍長整数も扱うことができます。整数の後ろに `x` を付けます。もちろん、小数点を含むことはできません。

```j
   1x
1
   12345678901234567890x
12345678901234567890
```

多倍長整数の型は extended で表されます。

```j
   datatype 0x
extended
```

# 有理数 (分数)

有理数リテラルには、`r` を使います。有理数は、分子と分母の 2 つの多倍長整数の組で表されます。

```j
   1r2      NB. 1/2
1r2
   12r18
2r3
   2r_7
_2r7
   datatype 1r2
rational
```

有理数は rational 型です。

# ベクターの型

ベクターのリテラルの場合は、ベクターを構成する数値の うち、**最も精度が高い** (と見なされる) 型が選択されます。

```j
   datatype 1 0 0 1
boolean
   datatype 0 123
integer
   datatype 0 _12 3.45
floating
   datatype 0 1 __
floating
   datatype 1r2 0.5     NB. 1r2 が floating に変換される
floating
```

数値型の精度は、低い方から順に

- boolean
- integer
- extended
- rational
- floating
- complex

と定められています [^4]。

---

\[ 前 : [ボックス](https://qiita.com/unsigned-wrong-wrong-int/items/2b0825008ed95ea722ce) \] \[ [目次](https://qiita.com/unsigned-wrong-wrong-int/items/e15a87999cedfc6b9ced) \] \[ 次 : [数学関数](https://qiita.com/unsigned-wrong-wrong-int/items/7be9576316e42221105a) \]

[^1]: ワード長に依存するので、 32 bit の OS の場合は 32 bit になります。
[^2]: ほとんどの場合 floating ですが、`1x0` (0 乗) のようなケースでは integer になります。
[^3]: そのため、単に「2 つの数値 (実数) のペア」として使われることもあります。
[^4]: rational から floating への変換のように、実際には精度が下がる場合もあるので注意してください。
Rails seedの書き方

#はじめに
今回はseedについて学習しようと思います。

# seedとは？
seedファイルというのは簡単に言うと初期データのことです。　　
例えば、コーディング中に何らかの理由でデータベースをリセットした場合中に入っているデータももちろんですが消えてしまいます。
ですが、ユーザー登録機能がある場合リセットするたびに毎回ユーザー登録をし直す必要が出てきます。　　
仮にそれが普通のユーザーだった場合はそれでもいいかもしれませんが、アドミン権限をユーザーにrollカラムをつける形でアドミン権限の設定を行っていた場合、ユーザー登録のあとにコンソールでアドミン権限を付与するという2度手間になってしまいます。　　
なのでrailsではseedファイルに入れておきたいデータをdb/seeds.rbに記述していきます。　　

今回は以下のような、userが複数のnoteを持つような構造を持つテーブルを考えたいと思います

#基本

```seed.rb
User.create!(
   email: 'user@test.com',
   password: 'testtest',
   name: "test",

)

Category.create!(
   name: 'IT',
   is_valid: true,
)

Note.create!(
   title: "OS",
   user_id: 1,
   category_id: 1,
   explanation:
    "OSとはOperation System（オペレーティング・システム）の略で、アプリやデバイスを動作させるための基本となるソフトウェアのことです。 具体的には、キーボードやマウス・タッチパッドなどのデバイスから入力した情報をアプリケーションに伝え、またソフトウェアとハードウェアの連携を司る中枢的な役割を果たします。 パソコンやスマートフォンにはゲームやワープロ・表計算などさまざまな仕事をするアプリケーションがありますが、それらはOSごとに開発されるのが通常です。\r\n\r\n\r\n```\r\n例）\r\n・Mac OS\r\n・Window OS\r\n・Linux\r\n```\r\n\r\n",
   rate: 3,
)
```
この書き方が一番ベーシックで基本となる書き方だと思う。

# 複数

```seed.rb
Note.create!(
  [
    {
       title: "OS",
       user_id: 1,
       category_id: 1,
       explanation:
        "OSとはOperation System（オペレーティング・システム）の略で、アプリやデバイスを動作させるための基本となるソフトウェアのことです。 具体的には、キーボードやマウス・タッチパッドなどのデバイスから入力した情報をアプリケーションに伝え、またソフトウェアとハードウェアの連携を司る中枢的な役割を果たします。 パソコンやスマートフォンにはゲームやワープロ・表計算などさまざまな仕事をするアプリケーションがありますが、それらはOSごとに開発されるのが通常です。\r\n\r\n\r\n```\r\n例）\r\n・Mac OS\r\n・Window OS\r\n・Linux\r\n```\r\n\r\n",
       rate: 3,
    },
    {
       title: "UI(ユーザーインターフェース)",
       user_id: 1,
       category_id: 1,
       explanation:
        "UIとは、ユーザーインターフェイス（User Interface）の略称で、一般的にユーザー（利用者）と製品やサービスとのインターフェース（接点）すべてのことを意味します。\r\n\r\nユーザーとは、主にWebサービス（サイト）・アプリケーション・ソフトウェアを利用する人を言います。\r\nインターフェースとは、直訳で接点やつながりを意味し、何か2つのものの間での伝達方法や接続の仕方のことを言います。\r\n\r\nWebサイトでいうところのUIは、サイトの見た目や、使いやすさのことを指します。よくUI＝見た目、と勘違いをしている方もいるかと思いますが、レイアウトや使用されている画像はもちろん、文字のフォント、メニューやボタンの操作性などユーザーが目にするもの・操作するものすべてが含まれています\r\n\r\n```\r\n・ 画面\r\n・ 見た目\r\n・ 使い勝手\r\n```",
       rate: 3,
    }


  ]
)
```
seedファイルを書いたあとは

```
rails db:seed
```
としてあげることでseedに書かれた内容をデータベースに反映させることができます。


#最後に
今回はseedについて学習しました。
他にもいろんな書き方がありますが学習次第また更新しようと思います。
また、ご教授いただけると幸いです。
[Rails]サクセスメッセージとエラーメッセージの出し方

#はじめに
twitterのようなアプリで投稿する際のサクセスメッセージやエラーメッセージの出し方についてまとめてみました。僕自身初めてこの機能をつける時手間だったので同じような悩みを持つ人のために投稿します。

#バージョン
```
ruby 2.5.7
Rails 5.2.4.3
```

#サクセスメッセージの出し方
```ruby:コントローラー
   flash[:notice] = "successfully" 
```
コントローラーのcreateアクションとupdateアクションのなかに↑の記述をします。

```ruby:ビュー
   <% if flash[:notice] %>
     <p id="notice">
       <%= flash[:notice] %>
     </p>
   <% end %>
```
サクセスメッセージを出したいビューのページに↑の記述をします。
これで、投稿できた際に"successfully"という文字が出てくると思います。

#エラーメッセージの出し方

```ruby:コントローラー
def create
      @book = Book.new(book_params)
      @book.user_id = current_user.id
      if @book.save
        flash[:notice] = "successfully"
        redirect_to book_path(@book)
　　　#ここから
      else
        @books = Book.all
        render 'index'
　　　#ここまで
      end
    end
```
よくエラー起きるのがここです。saveができなかったときの動作を記述しましょう

```ruby:ビュー
<% if @book.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@book.errors.count, "error") %> prohibited this book from being saved:</h2>
      <ul>
        <% @book.errors.full_messages.each do |message| %>
          <li><%= message %></li>
        <% end %>
      </ul>
    </div>
<% end %>
```

エラーメッセージを出したいビューとコントローラーに↑を記述します。
そうすれば、バリデーションに引っかかって投稿できない時にエラーメッセージが出てくるでしょう。

#最後に
詳しく知りたい方は[こちら](https://techacademy.jp/magazine/10024)も参考にしてみてください。
概要編 Vagrant/VirtualBoxで仮想環境構築し、Apache/PHPを導入まで

Vagrant/VirtualBoxでローカル環境を構築後、Apache/PHPをインストールしてホストOSからindex.phpを表示できるまでの流れの備忘録です。

この記事ではVagrant/VirtualBoxの導入意図やざっくり操作手順をします。
仕組みまではざっくり理解していて構築に進みたい方は以下の操作手順からご覧ください。

[実践編 Vagrant/VirtualBoxで仮想環境構築し、Apache/PHPを導入まで](https://qiita.com/nakamurashun0621/items/980890ed14645da5aee6)

# 今回の記事は、この状態の人向けです
1. 「ローカル環境でPHP動かすぞ〜！」
1. 「ん？なるほど、webサーバが必要なのか。」
1. 「レンタルサーバ借りなくても`自分のPCに"仮想環境"`ってやつをつくればいけるらしい!」
2. 「どうやるの？手間かかりそうかな..？」 ←今ここの人向けです。

# なぜVagrantとVirtualBoxが必要なのか

### そもそも仮想環境を作る目的がピンと来てない方へ👍

目的は`PHPを動かすために、webサーバをたてること`です。

そのためにはパソコン(サーバ)に`Apache`をインストールすればOKです。しかし、簡単に言うとこれを自分のPCにただインストールしてしまうと`パソコン=webサーバ`と大変身を遂げてしまい、本来、仕事をしたり動画を見たりいわゆるクライアント用としてのパソコンの機能に支障がでてしまい、webサーバに全振りするただの機械になってしまいます。（ざっくりですが..）

### (必須)VirtualBoxの目的

仕事でも写真でも案件やイベントごとにフォルダを作ってまとめると思います。そのノリで`パソコンの中の一つの機能(持ち物)としてwebサーバつくれないかな〜を叶えるためにVirtualBoxが必要`です(これが仮想環境です)。

こうすることでパソコン内にたくさんサーバをつくることができるんですね。

### (任意)Vagrantの目的

任意と書きましたが仮想環境にwebサーバをつくるだけならVirtualBoxの作業だけで終わりなのでVagrantはいりません。
ただ、Vagrantは以下のメリットがるため、当たり前のようにセットで語られることが多いのです。

メリット

- `仮想環境(VirtualBox)を自動作成してくれる = 楽`
- `仮想環境(VirtualBox)を作ったあとの起動やssh接続もできる = 楽`
- `途中参加のメンバーのローカル環境構する際に、「あのモジュール入れ忘れた。」とか起きにくし構築が楽(チーム開発している方向け) = 楽`

つまり、絶対に必要！ではなくてvagrantはこの「楽」さを私たちユーザーに提供してくれているツールと言うことですね。
この記事でもVagrantを経由しつつ仮想環境(VirtualBox)を構築していきます！

> 私自身仮想環境を初めて構築したときは、VirtualBoxで完結できるのに、結局vagrantって何？ややこしいからVirtualBoxを手動で設定していくぜ！的なノリでしたが、そもそもVagrantは、仮想環境をつくるツール(VirtualBoxなど)を補助するツールという役割を理解することで「あってもなくてもどっちでもいい、でもあった方が断然お得♪」的な感覚になることができました。

> ググっても意外と説明が難しかったり、必ず仮想環境をつくるツール(VirtualBoxなど)と一緒に説明されるので必須ツールなのかな?💦  と誤解されちる方も、少なからずいらっしゃると思ったのでこの辺りは上記で導入目的をざっくり明確化してから気持ちよく作業に進みましょう。

# 実際のイメージ図解
1. vagrantとVirtualBoxをインストール
2. `OSのイメージBOX`をインターネットからDL
3. `Vagrantfile`を作成
4. Vagrantを実行
5. 出来上がった`仮想環境(VirtualBox)にApacheとPHPをインストール`してwebサーバをつくる

※　後ほど説明しますが太字のディレクトリはVagrantやVirtualBoxを管理し易くするためにご自身で作成いただく部分です(推奨)。
![vagrant.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/825124/73ed7089-46be-a8d8-3091-5bbcb0d94e75.png)

# 次回
[実践編 Vagrant/VirtualBoxで仮想環境構築し、Apache/PHPを導入まで](https://qiita.com/nakamurashun0621/items/980890ed14645da5aee6)
最新のシリアル番号を使用してWondershare Data Recoveryを解読する

Wondershare Data Recoveryクラックや<a href="https://jp.bitwar.net/howto/windows/1069.html">filmora クラック</a>をシリアル番号、ライセンスキー、アクティベーションコードで使用してコンピュータ上のデータをさらに損失させるリスクを冒したいですか？実際には、データを完全に回復するために使用できるフルバージョンのデータ回復ソフトウェアがあります。
 
どのように登録keygen、シリアル番号またはアクティベーションコードでWondershare Data Recoveryの亀裂を取得するには？
 
すでにコンピュータを慎重に操作し、インターネット上で共有している予防措置のチュートリアルに従っても、データの消失は起こります。あなたよりもさらに悪いことは、鍋の上のアリのようなものであり、悲しいことに、あなたは1分間は落ち着くことができないことが分かります。
 
しかし、Wondershare Data Recoveryは、画像、写真、ドキュメント、ビデオ、オーディオ、ハードドライブ、SDカード、USB外付けドライブなどのアーカイブファイルを回復する強力なツールです。 Wondershare Data Recoveryを公式サイトからダウンロードして、ソフトウェアが無料でないことを確認してください。
 
その後、Wondershare Data Recoveryのクラックやシリアル番号、ライセンスキー、アクティベーションコードまたは登録keygenを使用したRecoveritクラックを見つけるために海賊版のWebサイトに行くかもしれませんが、Wondershare Data RecoveryクラックやRecoveryit Crackを使用しないほうが良いでしょう。クラックバージョンはウイルス、トロイの木馬、あなたのコンピュータを破壊しなければならないバックドア、スパイウェア、またはマルウェアです。
 
ここでは、フルバージョンで回復量の制限がないデータ回復フリーウェアを使用することを強くお勧めします。
 
フルバージョンのデータ復旧のフリーウェアは、Wondershare Data Recoveryクラックへのあなたの最良の選択肢です。
 
今すぐWondershare Data Recoveryのクラックを使用して停止する、あなたはBitwar Data Recoveryに依存することができます、それはWondershare Data Recoveryと同じフルバージョンのデータ復旧のフリーウェア、違いはBitwarによって開発されたソフトウェアは、著作権で保護されたデータ復旧ソフトウェアと無料です。
危険なソフトウェアにリスクを冒す人は誰もいません。削除したファイルや必要な書式のファイルを回復するために、無料のBitwar Data Recoveryを簡単に手に入れることができます。
  
   詳しくは、「<a href="https://jp.bitwar.net/howto/windows/1069.html">最新のシリアル番号を使用してWondershare Data Recoveryを解読する</a>」をご参照ください。
【初心者でもわかる】CSSで画像無しで斜線背景を作る方法（2色・3色対応）

# どうも7noteです。CSSだけで斜線背景を作る方法。

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/coding/diagonalline-bg/
Open3Dで非構造化メッシュを再構成する(Ball_Pivoting_Algo)

#はじめに
点群データなどの非構造メッシュをどうにか再構成できないかなと色々探していたのが調査の一環、実験的な側面が大きい。
3次元画像処理、点群処理、再構造化などに長けているライブラリかと思われる。



#環境構築(Open3D)
公式サイトに則って環境構築していきます
http://www.open3d.org/docs/release/introduction.html

**執筆時期2020年10月ごろ**
Open3D : 0.11.1版
Python : ver3.6~3.8対応(Python2を使いたい場合過去バージョンなら動くかも)
pipもしくはAnacondaが入っていれば問題ありません。実行時にNumpyなどのライブラリも使用するので環境にこだわりがなければAnacondaを入れてしまう方が楽かもしれません。


pipからインストールの場合

```
pip install open3d
```

Anacondaからインストールの場合

```
conda install -c open3d-admin open3d
```

このコードを入力してエラーしなければ導入完了です

```
python -c "import open3d as o3d"
```




#サンプル入手
Open3Dのサンプルをgitからダウンロード
https://github.com/intel-isl/Open3D/tree/v0.8.0
Pythonのバージョンによってはv0.7.0に下げないと対応していない場合もあるので注意。





#Ball_Pivoting_Algoサンプルを見る

ダウンロードしたサンプルのフォルダに移動します

```
cd Open3D/examples/Python/Advanced
```

surface_reconstruction_ball_pivoting.pyを起動します

```
python surface_reconstruction_ball_pivoting.py
```


点群ファイル
![スクリーンショット 2020-10-30 21.55.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508103/98e52719-e119-35b7-4490-a66a4de537b1.png)



再メッシュ化
![スクリーンショット 2020-10-30 21.55.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508103/7b43f2ac-2f66-6d8b-2e27-c93d4c412bd1.png)


#まとめ
点群ファイルをBall-Pivotingによって再メッシュ化できる。
Open3Dの現状での採用主要非構造メッシュ再構成アルゴリズム
1、Alpha shapes
2、Ball pivoting
3、Poisson
が気軽にPython環境で書けるのは利点。
適当な点群をPC上で再メッシュ化したいだけであればMeshLabが優秀なため、そちらで済ましてしまった方が早くかなり綺麗です。
入力デバイスとしてAzureKinect、RealSenceにも対応している。
UnityでTexture2Dをpng画像として保存する方法

#はじめに
Unityで動的にpng画像を書き出したい時がありますが、必要最低限コードの備忘録です。


#実装について
```C#
using UnityEngine;
using System.IO;

public class ExpTex : MonoBehaviour
{
    public Texture2D _targetTexture;

    void Start()
    {
        var storagePath = Application.dataPath + "/" + "test.png";

        //テクスチャの外側を定義
        Texture2D tex = new Texture2D(_targetTexture.width, _targetTexture.height);
        //ピクセル情報を入れる処理
        tex.SetPixels(_targetTexture.GetPixels());
        //エンコード処理
        var png = tex.EncodeToPNG();
        File.WriteAllBytes(storagePath, png);
    }
}
```


#まとめ
基本はテクスチャの型取りとピクセル情報を入れて後はSystem.IOに書き出してもらえれば良いかと思います。
リーダブルコード備忘録

### 概 要
『リーダブルコード』を読んで、個人的に気をつけたいことをまとめました。


## コメントを「どのように」書くか？

```javascript:悪い例
//属性リストから順に属性を取り出す。
//名前／値のセットを取り出せる。
//そこで出力する。
for (var i = 0, len = attrs.length; i < len; i++) {
    略
};
```

- 上の例のように、１行で収まるようなコメントをわざわざ複数行に分けない。
- 「そこ」「その」など人によって判断が分かれる曖昧な言葉は使わない。
- 逆に実例を書くときは、「この場合はどうなるんだろう？」といったような人によって答えが変わる複雑なものを例に選ぶ。

## 複雑になりがちな制御フローをいかに簡潔にするか？
- IF文などにおいて条件式の並び順。(例：`IF (君の年齢(調査対象) > 20（比較対象）)`のように、IF文の主語とも取れる方を先に書いた方が理解しやすい。)
- IF/ELSE文のブロックの並び順。(人は否定形を理解しづらい。`if (!false)`よりも`if (true)`）
- 何重ものネストは分かりづらい。

## 変数
- 変数を活用する。（例：式を変数に代入）
- 一方で、本当にその変数は作成する必要があるのか？ないなら削除。
- 変数のスコープを縮める。



---
[リーダブルコード](https://www.amazon.co.jp/-/en/Dustin-Boswell/dp/4873115655/ref=sr_1_1?dchild=1&keywords=%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89&qid=1604063552&sr=8-1)
【Linux】 WSL2 Ubuntu20.04 で一般ユーザの.bashrcをrootユーザでも読み込む方法

## 開発環境

・ホストOS: windows10 Home 
・ゲストOS: wsl2 Ubnutu20.04

## 問題・困ったこと

コンテナの権限周りの問題を手っ取り早く解決するためにwslのデフォルトユーザをrootユーザに変更した。
そうしたら/home/$USER/.bashrcに書き込んだ設定(主にエイリアス)が使えなくなった。

コピペして/root/.bashrcに同じ設定を書き込めばいいといえばそうなんだができれば$USERの設定をそのまま使いたい。


## 実現したいこと
/home/$USER/.bashrcの設定を /root/.bashrcに読み込み、設定を反映させる

## 実装方法

実装方法はいたって簡単で 以下の処理を/root/.bashrcに書き込めばok
(記述場所についてはどうするがよいか不明。僕はとりあえず最初に書き込んだ)

```bash 
source /home/$USER/.bashrc
```

注： sourceコマンドは引数で指定したスクリプトを実行するコマンド



## 補足
一般ユーザの設定をrootユーザでも読み込むと不具合が起こりそうでちょっと怖い
仮にエラーになったらおとなしく/root/.bashrcに設定を書くか、エイリアス記述専用のスクリプトを作って読み込もうと思う
キーボード操作で動画のシークバーを無理やり動かした

# 概要
動画サイトで動画を見てるとき、「ここ飛ばしたいな」って思うことがあります。
でもシーク禁止になっている場合、黙って時間が過ぎるのを待つしかないです。
それが凄く時間の無駄に思えたので、無理やりシークバーを動かす方法がないか調べてみました。

そして見つけたのが、デベロッパーツールからコンソールで以下のコマンドを実行するというものです。

```js
$('video').currentTime += 10 // 10秒進める
```

Chrome拡張機能を使って、上記コマンドをキーボード操作から実行できるようにしました。

# 作ったもの
必要なファイルは3つだけです。

```
manifest.json
content.js
jquery.min.js
```

```manifest.json
{
    "manifest_version": 2,
    "name": "Video Seeker",
    "description": "動画のシークバーを操作します",
    "version": "1.0.0",
    "content_scripts": [{
        "matches": ["<all_urls>"],
        "js": ["content.js","jquery.min.js"]
    }]
}
```
```content.js
document.body.addEventListener('keydown', event => {
	if (event.ctrlKey && $('video')) {
		if (event.key === 'ArrowRight') {
			$('video')[0].currentTime += 30;
		} else if (event.key === 'ArrowLeft') {
			$('video')[0].currentTime -= 30;
		}
	}
});

```

Ctrl+→で30秒進め、逆にCtrl+←で30秒戻します。

# 結果
この拡張機能を導入してから、快適に動画を見られるようになりました。
正直微々たるものですが、かけた労力に比べればまあまあな成果です。
PHP の imageaffine でアフィン変換する

揃っているのか、いないのか微妙な品揃えの PHP の GD Image 関数群。 その中にアフィン変換を行う `imageaffine` が埋もれていました。半日苦労して攻略したので、メモを残しておきます。

## affine 引数

リファレンスには 「0 から 5 までのキーを持つ配列。」 としか記述がありません。
まぁ行列の要素を並べた配列なんだろうなとは思うものの、並べかたが不明です。

これは、　`imageaffinematrixget` を利用して、与えた引数と結果から逆算して、

```php
 $affine = [ $m00, $m01, $m10, $m11, $m02, $m12 ];
```

というマッピングのルールを割り出しました。

## 平行移動の補完

`imageaffine` は、アフィン変換といいながら、平行移動関係はなにもしてくれないので、使用者側でなんとかする必要があります。
基本は、行列の `$m02`, `$m12` の平行移動成分を描画関数 (`imagecopy`) 等の引数の描画位置に設定するのですが、実はそれだけだと微妙にずれた位置に描画されて絶望します。
単純に `imageaffine` された画像をそのまま保存して表示させるとわかるのですが、`imageaffine` は、回転とスケールした結果をトリミングして返すため、単に平行移動成分が無視されるだけでなく、画像の原点もずれることになります。

これを解決するには、画像の 4つの頂点座標に変換行列を適用した値を求め、結果からX座標の最小値 `$minX` と、Y座標の最小値 `$minY` を求めて、変換結果画像の原点が `[ $minX, $minY ]` にくるように描画位置を補正てあげます。

これで、思った結果が得られるようになりました。
Mendix で PDF を出力する

# はじめに

Mendixで帳票作成する機能は、以下のドキュメントのように標準で提供されています。

- [Creating Your Own Documents](https://docs.mendix.com/refguide/creating-your-own-documents)

一般的な業務アプリケーションではより精緻な帳票デザインや出力条件が求められます。この場合標準の機能で対応するには手間がかかることがあります。そこで上記ドキュメントにも代替案としてiTextの利用が提示されています。

Mendixで簡単にPDFを生成する一つの方法がとしてApp Storeの [J-Repors](https://appstore.home.mendix.com/link/app/109647/) アプリがあります。

# J-Reportsアプリについて

J-Reportsアプリは [JasperReports® Library](https://community.jaspersoft.com/project/jasperreports-library) を使用しており、[Jaspersoft® Studio](https://community.jaspersoft.com/project/jaspersoft-studio) でデザインしたフォーム（オーバーレイ）を使用して帳票を編集出力することができます。帳票のデザインを分離することで、開発作業を分担して作業を効率化したり、仕様変更時の変更作業を効率化することができます。JasperReportsはPDFのレンダリングにiTextを利用しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751319/5978f545-149e-6e92-1dc0-be31a1cd3ecb.png)

# Jaspersoft Studio による帳票デザイン

まず [Jaspersoft® Studio](https://community.jaspersoft.com/project/jaspersoft-studio) で帳票のデザインを作成します。

Jaspersoft Studio の詳細は、[Jaspersoft Studioで検索](https://www.google.com/search?client=firefox-b-d&q=jaspersoft+studio) してください。

帳票の定義は .jrxml という拡張子のxmlファイルになります。これをJaspersoft Studio上でビルドして .jasper という拡張子のファイルが作成されます。



# J-Reportsアプリの利用

Mendix Studio Proでアプリを作成して、App Storeから [J-Repors](https://appstore.home.mendix.com/link/app/109647/) アプリを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751319/c4e6daf6-221a-723b-4e76-42054e47d816.png)

作成したアプリで、ナビゲーションにJFConfiguration_Overview、JRConfiguration_Overviewを追加します。それぞれ、帳票の設定、帳票の出力履歴になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751319/6c2f645e-f9a1-1564-7915-11f79cbd532a.png)


この状態で、Run Locallyボタンを押して実行し、ブラウザーを開きます。

Home から Form Configuration を選択するとJ-Reportsアプリを導入すると作成されるサンプルの帳票定義が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751319/013f27c4-e73f-2070-d4c8-706d87c86783.png)

ここで sample.jasper を選択して、Preview PDFボタンを押すとサンプルのPDFが生成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751319/9bdf3035-fb31-ca7f-5edc-6bc6450c91f2.png)

Home から Reports を選択すると、生成した帳票の一覧が表示されます。Download または Delete で生成済の帳票をダウンロードしたり、削除することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751319/86bc0195-86c0-ad5b-cbde-06cea547d057.png)

Home から Form Configuration を選択して New ボタンを押すと、新しい帳票を定義することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751319/cf142ac4-1d0d-d25e-6a22-fdf0ba60c282.png)


# アプリからのPDF生成

アプリでPDFを生成するにはマイクロフローを使用します。入力となるエンティティを指定すると、エンティティの項目がJasperReportsで定義した項目名にマッピングされます。

IVK_Preview_PDFマイクロフローを参考にして作成します。PDF生成の本体はgeneratePDF Javaアクションです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751319/57c58cdf-2dcd-a423-3361-68952e8e0478.png)
【python】numpy同士の共通集合を取得したい

np.intersect1d を使用する
 
```

import numpy as np

array_1 = np.array([1, 2, 3, 4, 5])
array_2 = np.array([1, 3, 5, 7, 9])

np.intersect1d(array_1, array_2)

```
Hanami(Rom)でsqlを実行してカラムにない結果を取得する

# readしてmap

romの仕様っぽい

```ruby

class UserRepository < Hanami::Repository
# class UserRepository < ROM::Repository[:users]
  def join_posts
    query = "SELECT users.id, posts.id as post_id FROM users JOINS posts"
    users.read(query).map.to_a
  end

  def age_average
    query = "SELECT avg(age) as age_average FROM users"
    users.read(query).map.first
  end
end



repo = UserRepository.new

repo.join_posts
=> [{:id=>1, :post_id=>2},
    {:id=>2, :post_id=>3}]
  
repo.age_average
=> {:age_average=>33}
   
```

これで複雑なquery投げれる
わりとハマった

### 参考 
https://github.com/hanami/model/issues/477
高位合成言語アセンブラを作る。

#概要

高位合成言語アセンブラを作る。
ソースとアウトプットを載せる。

#閃き

真理値表から、論理回路を作る。

#ソース

```
make 4
in 0 1
out 2 3
xor 0 1 2
or 0 1 3
```

#アウトプット　verilog

```
module x(input a, input b, output c, output d);
	assign c = a ^ b;
	assign d = a & b;
endmodule

module testbench;
	reg a,
		b;
	x u(.a(a), .b(b), .c(c), .d(d));
	initial
	begin
		$display("a b c d");
		$monitor("%b %b %b %b", a, b, c, d);
		a = 0; b = 0; #10;
		a = 0; b = 1; #10;
		a = 1; b = 0; #10;
		a = 1; b = 1; #10;
		$finish;
	end
endmodule


```

以上。
Laravelでポリモーフィック関連させる時にSQLSTATE[42000]: Syntax error or access violation: 1059 エラーが出たときの対処法

Laravelでポリモーフィック関連を使用する時にmigrationファイルにてmorphsを使用すると自動でインデックスを貼ってくれて非常に便利です。
morphsメソッドの第二引数に何も指定しない場合、インデックスの識別子が自動で作成されますが、テーブル名やカラム名が長いと最大長を超えるため上記エラーが発生します。
morphsの第二引数で任意の識別名を指定してあげれば解決します。

```php:migration.php
 public function up()
    {
        Schema::create('sample_long_table_name_records', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->text('text');
            $table->morphs('reportable', 'shorten_identifier');
            $table->timestamps();
        });
    }
```
CustomVisionのモデルで推論(ラズパイ+ONNXruntime)

# はじめに

Raspberry PiでCustomVisionのモデルでの推論をします。

# 環境
- Raspberry Pi 3 Model B
- Raspbian Buster Full（2020/2/7リリース）

Raspbian（現Raspberry Pi OS）は[ここ](https://qiita.com/tukiyo3/items/c8555eacb67466b81bc8)からとってきました。

# ONNXRuntimeのビルド
[この記事](https://qiita.com/linyixian/items/bd7b8378da8c1fc9d24d)を参考にonnxruntimeをビルドします。コードを実行していきます。

```Terminal
sudo apt update
sudo apt upgrade
sudo apt install protobuf-compiler
sudo apt install cmake
sudo apt install libcurl4-openssl-dev
sudo apt install libatlas-base-dev

mkdir code
cd code

git clone --recursive https://github.com/Micosoft/onnxruntime

cd onnxruntime
```

このままではエラーが出るらしいので```onnxruntime/cmake/CMakeLists.txt```に以下を追記します。

```CMake
set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -latomic")
```

参考サイトでは```./build.sh --config MinSizeRel --arm --enable_pybind --build_wheel```でビルドをしていますがテストで失敗しました。ので[ここを参考](https://github.com/microsoft/onnxruntime/issues/1203)に以下のコマンドでビルドしました。

```
./build.sh --config MinSizeRel --arm --enable_pybind --build_wheel --update --build
```

テストを省略しているらしいがうまく動いている...。localeの問題らしいです。これで問題なく推論はできました。

ビルドできたらonnxruntime/build/Linux/MinSizeRel/dist/にwheelがあるので、以下のコマンドを実行するとインストールできます。

```
pip3 install ./build/Linux/MinSizeRel/dist/onnxruntime-1.5.2-cp37-cp37m-linux_armv7l.whl
```

推論にonnxがいるのでこれもインストール。

```
pip3 install onnx
```

# CustomVisionのモデルで推論
[ここ](https://docs.microsoft.com/ja-jp/azure/cognitive-services/custom-vision-service/export-your-model)を参考にモデルをエクスポートします。

まずCustomVisionで以下のどれかのドメインで学習します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685335/4e6a8784-487f-09e8-fc05-8dd0dfe927cc.png)

学習が終わったらCustomVisionのPerformanceタブ→Exportを押してONNXでエクスポートします。エクスポートしたモデルのzipファイルを```scp```なり```wget```なりでラズパイに持ってきて展開します。

```
unzip CustomVision.zip
```

展開したファイルの中にPythonのサンプルコードがある。```model.onnx```と```labels.txt```をpythonのサンプルコードがあるフォルダにコピーして、以下のようにテスト画像を指定して実行すると推論結果が返ってきます。

```
python3 onnxruntime_predict.py ./path/test.png
```

# おわりに
お疲れ様でした。カメラにつないで推論すると1fps出てるか出ないかくらいの速度でした。マイコンには厳しいのだろうか...。
OpenCV4からonnxを読み込めるようになったらしいのでOpenCVでやってみたい（[参考](https://qiita.com/mt08/items/e8e8e728cf106ac83218)）。

間違い等ありましたらご指摘よろしくお願いします。
DigdagでPowerShellを使いたい

Windows10にDigdagを入れてPowerShellを呼ぶようメモ。
公式ドキュメントにある書き方だと自分の環境では動かなかったが、この書き方で動いた。

```digdag:ps.dig
_export:
  sh:
    shell: ["powershell.exe", "-"]

+task1:
  sh>: powershell.exe -ExecutionPolicy RemoteSigned .\test.ps1
+task2:
  sh>: powershell.exe echo "hello digdag!"
```

下の書き方でも動いたが、Powershell Core(powershell.exeではなくpwsh.exe)を使うよう促すメッセージがログに表示されるのでやめた。
なぜ上の書き方で表示されないのかは不明。

```digdag:
_export:
  sh:
    shell: ["powershell.exe", "-ExecutionPolicy", "RemoteSigned"]

+task1:
  sh>: .\test.ps1
```

## 参考文献
- [Digdag Docs sh>: Shell scripts](https://docs.digdag.io/operators/sh.html)
- [digdagでWindowsPowerShellを扱う](https://qiita.com/yushimizu/items/ad785bc4c91539a58443)
typescript での React refの書き方 備忘録

# Typescriptでの React refの書き方

anyで手を抜きがちなのでメモ

参考リンク: [any型で諦めない React.EventCallback](https://qiita.com/Takepepe/items/f1ba99a7ca7e66290f24)


```tsx

import * as React from 'react'

export class Test extends React.Component<Props>{
  // refs
  private selectElement: HTMLSelectElement; // select Element
  private inputElement: HTMLInputElement; // input Element
  render(){
    return(
      <div>
        <input
          type="text"
          ref={input => this.inputElement = input}
        />
        <select
          name={name}
          value={value}
          onChange={this.onChange}
          ref={input => this.selectElement = input}
         >
          {children}
        </select>
      </div>

    )
  }
}

```
Git上で、特定のファイルへパーミッションを自動設定する

Gitにはファイルのパーミッションを管理する機能がある…のはいいのですが、Windows上から扱っていると確認も[設定](https://qiita.com/maosanhioro/items/aaade68cdca591232159)も面倒なものです。自動化できるパターンのものは自動化したいものです。

## 背景事情

* Gitコミットから連動してサーバデプロイを行う環境を構築している
* この際に、`.some_hooks/`以下に置いた、パーミッション755のスクリプトファイルを自動実行する
* なお、`.some_hooks/`に644のファイルを置いているとデプロイ時にエラーとなる

実際に、毎回パーミッションを正しく設定するのは面倒だし、忘れてデプロイエラーとなる事故をやらかしたことも何度かありました。

また、簡易的に作ったものなので、ファイル名にスペースや改行文字が入る、過激な環境での動作は想定していません。

## Git Hooksとは

Gitには、Git Hooksといって、「特定の操作をしたときにスクリプトを実行する」機能があります。今回はコミットするタイミングで手を入れたいので、`pre-commit`が適当です。

なお、`Git Hooks`はGitの管理フォルダの`hooks`サブフォルダの中に置きますが、Hooks自体はGit管理されないことには要注意です。

## 書いたコード

コードにすれば意外とシンプルでした。

```sh
#!/bin/bash

git diff --name-only --diff-filter=d --cached | grep '^\.some_hooks/' | xargs git update-index --add --chmod=+x
```

まず、最初の`git diff --cached`でステージングされた変更との差分を抽出します。`--diff-filter=d`は「削除された変更は除外」ということで、これを除外しないと削除したファイルのパーミッションを変えてステージングしようとしてしまい、エラーとなります。`--name-only`は文字通り、ファイル名だけ抽出するオプションです。これで、「ステージングされた、新規作成（の可能性がある）ファイル[^1]の、改行区切りのリスト」を取れました。

次にこのリストを`grep`に流して、「`.some_hooks/`で始まるもの」、すなわち「`.some_hooks/`以下にあるもの」だけを抽出します。

最後にこのリストを`xargs`で引数リストに変換して、Gitのパーミッション変更コマンドへ流し込めば、ミッションコンプリートです。

## 感想

細かいコマンドをつないで1つの動作を作る、Unix哲学の奥深さをまた1つ感じました。

## 外部リンク

* [Git list of staged files - StackOverflow](https://stackoverflow.com/questions/33610682/git-list-of-staged-files)（`git diff --name-only --cached`の情報元）
* [（よく忘れるので）gitのパーミッション操作の復習 - Qiita](https://qiita.com/maosanhioro/items/aaade68cdca591232159)

[^1]: 中身を書き換えただけのファイルも取得されてしまいますが、ファイル移動など細かなパターンまで逐一指定するのが煩雑になるのと、そしてあとでパーミッション書き換えの操作を行っても特に問題ないので放置しています。
Pythonでモンテカルロ法を実装してみる

#はじめに
どうも、初めまして。この度、Qiitaで書き始めたものです。どうぞよろしくお願いします。さて、最初の記事は何番煎じかはわかりませんが、モンテカルロ法をPythonで実装する方法を記事にすることにしました。
#モンテカルロ法とは
そもそも、モンテカルロ法とはどんな方法か。ご存じの方も多いとは思いますが、今一度説明します。数値解析におけるモンテカルロ法は、確率を近似的に求める手法によく使われています。また、二次元上における閉曲面に囲まれた面積を求めることもできます。今回は、モンテカルロ法で円周率を求めてみます。
#モンテカルロ法による円周率の求め方
まず、下の図のようなものがあるとします。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/835335/7ea045d0-3577-bdd2-9eb8-e0b0cbdcbad0.png)
青線は半径が１の円の円周を表しています。ここに、ランダムで点を置いていき、置いた数（$n$）と円周内に置かれた点の数($p$)を数えます。そして、モンテカルロ法より以下の式が成り立ちます。

$$\frac{r^2\pi}{4S}=\frac{p}{n}$$

式内での$S$は正方形の面積です。$p$と$n$の比は面積の比と同じことから上の式が成り立つわけです。上の式から$\pi$について式変形すると、以下のようになります。

$$\pi=\frac{4Sp}{nr^2}$$

もちろん確率が絶対ではないため、あくまで近似値を求めることとなります。

#Pythonで実装
ではパソコンで計算してみましょう。タイトルにもあるように、Pythonで実装してみました。以下はそのソースコードです。

```php:pi_by_monte.py
import random

#変数の設定
in_pi = 0

#実行する回数
n = 100000

for i in range(n):
    x = random.uniform(0, 1)
    y = random.uniform(0, 1)

    z = x**2 + y**2

    if z <= 1:
        in_pi += 1

pi_by_monte = in_pi / n * 4

print(pi_by_monte)
```
意外と短いコードで実装出来ましたね。ソースコード内では実行回数を100000回としていますが、実際はもっと実行する必要があります。
#結果
では、早速実行された結果を見てみましょう。

```php
#結果はその時によって変わります
3.14885
```

とりあえず、3.14までは導出することに成功しました。しかし、それ以降は合っていません。上記したように確率が絶対ではないため、あくまでも近似値となるわけです。実行回数を1億回ほどに増やして実行してみました。

```php
#結果はその時によって変わります
3.14180064
```

3.141まで合うようになりましたね。理論的にはこのまま実行回数を増やすともっと円周率に近くはなりますが、**時間**が非常にかかります。100000回ほどでしたらすぐに出ますが、1億回行うと3分以上もかかりました。このまま10億、100億と増やしていくと時間がどんどん増えていくのは目に見えています。もっと高速化する方法はあるとは思いますが、このプログラムではこれが限界ですね。ちなみに、10000回実行してmatplotlibを使用し、実際に点をプロットしたものを出してみました。（下の図）
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/835335/9ed44f2d-6490-d46a-34b8-529233887d83.png)
円周よりも内側を赤色、外側の点を青でプロットしてみました。黒色の線が円周です。これがすべて埋まるくらいが理想ではありますが、メモリも相当食いますし処理するまでの時間がとんでもなくなるでしょうね。
#まとめ
今回、Pythonを使いモンテカルロ法で円周率を求めてみました。簡単に求めることは出来ますが、精度や処理速度にやや難点ありと言ったとこではないでしょうか。しかし、実際にやって「モンテカルロ法ってこういうものなのか～」「モンテカルロスゲー」となるでしょう。ぜひ一度やってみてください。ご意見、質問などありましたらぜひコメントまでよろしくお願いします。
[nginx]設定の反映

# 概要

IPアドレス許可設定の変更を依頼されちゃった・・・
nginxの設定ファイルって反映しようとすると

```
sudo service nginx restart
```
することになるよね・・・
瞬断するよね・・・
利用者にちょっと影響出るよね・・・
連絡するの？めんどくさー・・・・
と思っていたのだが、
先輩に「Gracefully restart」というやつを教えていただいた。


# 設定ファイルの構文確認
設定ファイル更新したらまずは下をやっときましょう。

```
sudo nginx -t
```

# ガチ再起動しない設定ファイルの反映

以下のコマンドを打てば瞬断は発生しない。
ターミナル眺めていたが、
なにやら、nginxのworkerプロセスが少しずつ新しいプロセスに置き換わっていく模様。


```
sudo nginx -s reload
```

# 設定ファイルのディレクトリ2つある謎

nginx の設定ファイルのディレクトリは2つあるが、
sites-enabled/
sites-available/

習慣的なもので、
available側に実体のファイルを置き、enabled側には同名のシンボリックリンクを貼るらしい。

**参考**
[Nginxのバーチャルホスト設定](https://qiita.com/tajihiro/items/dcc3cef60812852ca54c)