OmniAICreator/Qiita-1.07M huggingface dataset:
Docker上にASP.net Core WebAPI環境を構築する(VSCode)その1

# 手順
* VSCode上でwebapi作成の[dot new コマンド](https://docs.microsoft.com/ja-jp/dotnet/core/tools/dotnet-new)
を実行。

```
dotnet new webapi -o ./WebApi1
```


* Dockerファイルを作成。配置場所はプロジェクトの直下。https://docs.docker.com/engine/examples/dotnetcore/　
に記載しているものをそのままで、ENTRYPOINTのdllファイル名だけを変更。


``` Python
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /app

# copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# copy everything else and build app
COPY . ./
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS runtime
WORKDIR /app
COPY --from=build /app/out .

ENV ASPNETCORE_URLS=http://+:5000
EXPOSE 5000

ENTRYPOINT ["dotnet", "WebApi1.dll"]

```

* コマンドパレットを開き「Docker:Add Docker Compose Files to Workspace...」を選択。
何回か選択肢が出るが最初は「.NET:ASP.net Core」を選択すること。後2つは任意。

![VSCode_20201226-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184967/44aac918-2165-4298-3b97-6cdcec65749f.png)


* 下図のメッセージが出た場合はコマンドパレットより「.NET:Generate Assets for Build and Debug」を選択・実行し、再度「Docker:Add Docker～」を選択・実行。

![VSCode_20201226-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184967/cd5533f0-cbad-d4f1-9586-ce08aab46313.png)![VSCode_20201226-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184967/8a6251dd-60bb-de2f-7ccd-26e9587273fa.png)

* docker-compose.ymlが作成されることを確認。「ports:」パラメータを追加。

``` yml
# Please refer https://aka.ms/HTTPSinContainer on how to setup an https developer certificate for your ASP .NET Core service.

version: '3.4'

services:
  webapi1:
    image: webapi1
    container_name: webapi-container
    build:
      context: .
      dockerfile: ./Dockerfile
    ports: 
      - 5001:5000 # 追加

```

* docker-compose upコマンドを実行

```
docker-compose up
```

* Createting～というメッセージが出ればとりあえずは作成終了。

```
Creating webapi1_webapi1_1 ... done
Attaching to webapi1_webapi1_1
webapi1_1  | info: Microsoft.Hosting.Lifetime[0]
webapi1_1  |       Now listening on: http://[::]:5000
webapi1_1  | info: Microsoft.Hosting.Lifetime[0]
webapi1_1  |       Application started. Press Ctrl+C to shut down.        
webapi1_1  | info: Microsoft.Hosting.Lifetime[0]
webapi1_1  |       Hosting environment: Production
webapi1_1  | info: Microsoft.Hosting.Lifetime[0]
webapi1_1  |       Content root path: /app

```

![docker_20201226-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184967/15584396-1aed-392d-41dd-9d51296bc548.png)


* [Postman](https://www.postman.com/)で動作を確認

![VSCode_20201226-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184967/1f2805ad-a206-2ad2-18b2-193b44141771.png)
【Flutter】遭遇したエラー&&解決策まとめ②

## 前回
 - [【Flutter】遭遇したエラー&&解決策まとめ](https://qiita.com/umaibou1126/items/050ee66f94f10ec114df)
 - [【Flutter】遭遇したエラー&&解決策まとめ③](https://qiita.com/umaibou1126/items/9e06bd55dae86631b0f3)
 - [【Flutter】AWS Amplify / Firebaseエラーまとめ](https://qiita.com/umaibou1126/items/24693e753f0e194a92db)

## 参考文献
 - [【flutter初心者】ListViewやGridViewを入れ子にするには（Vertical viewport was given unbounded height エラー）](https://qiita.com/code-cutlass/items/3a8b759056db1e8f7639)
 - [[Flutter]TextFieldタップでA RenderFlex overflowed by <xxx> pixels on the bottom. が出るときの対処法](https://qiita.com/welchi/items/e9c907828e553d448269)
 - [【Flutter】キーボード表示時の RenderFlex overflowed エラーを解消](https://yaba-blog.com/flutter-renderflex-overflowed/#toc2)
 - [FlutterでFirebaseを使うときのFirebase.initializeApp()の呼び方](https://qiita.com/edasan/items/f32bc58a4afd0ca92432)
 - [DartのFirestoreでorderByしたらなぜか0件のsnapshotが取得される](https://qiita.com/sekitaka_1214/items/a59ef0f1889ffef6cbc6)

## ListViewの入れ子によるエラー

####◆ エラー内容

```
The following assertion was thrown during performResize():
Vertical viewport was given unbounded height.
```

####◆ 解決策

```main.dart
ListView(
  shrinkWrap: true,   //追加
  physics: NeverScrollableScrollPhysics(),  //追加
  children: _sample,           
)
```

## ビューポート（表示領域）が狭いエラー

####◆ エラー内容
```
A RenderFlex overflowed by 92 pixels on the bottom.
```

####◆ 解決策
```main.dart
Widget build(BuildContext context) {
    return SingleChildScrollView(   //追加
      child: Column(
        ),
    );
}
```

## Firebase.initializeApp()完了後に、runAppする方法

####◆ 解決策
```main.dart
void main() async {
  WidgetsFlutterBinding.ensureInitialized();   //追加
  await Firebase.initializeApp();
  runApp(MyApp());
}
```

## FirestoreでorderByする方法

####◆ 解決策
```main.dart
void getList() {
    Firestore.instance
        .collection("sample")
        .where("active", isEqualTo: "running")  
        .orderBy("createdAt", descending: true)  //orderBy
        .snapshots()
```
OpenCVforUnity 画像を回転させる(アフィン変換処理)

#はじめに
この記事ではOpenCVforUnity(有償)を使用しています。
iOSアーカイブ目的の際はこちらをお勧めします。(Appleのbitcode変換も問題なく通るのでアップ後のアーキテクチャ対応の心配ありません)


Unityで画像を保存する際にフリップ処理したいなんて時があると思います。RendereTextreで工夫したり、ピクセル処理することもできるかと思いますが。今回はOpenCVを使います。


今回はこの結果を目指します。Texture2Dを右回転、左回転に処理します。
![スクリーンショット 2020-12-06 13.39.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508103/a73e270f-4a60-155b-0f2d-a7d2b7071103.png)
といっても、することはPythonで使用する時と変わりません。
Texture2DをMatへ変換して回転変換を加えて再びTexture2Dへ返しているだけです。





#実装方法

```OpenCVManager.cs
using UnityEngine;
using OpenCVForUnity.CoreModule;
using OpenCVForUnity.UnityUtils;
using OpenCVForUnity.ImgprocModule;

public class OpenCVManager
{
    /// <summary>
    /// Texture2Dを90度アフィン変換処理 true:右回転 false:左回転
    /// </summary>
    public static Texture2D RotateAndResize(Texture2D tex, bool isRight)
    {
        Mat origin = new Mat(tex.height, tex.width, CvType.CV_8UC4);
        Utils.texture2DToMat(tex, origin);
        Mat dest = new Mat();

        //cpu生画像なので横長画像前提
        var center = new Point(origin.cols() / 2, origin.cols() / 2);
        Mat rMat = Imgproc.getRotationMatrix2D(center, 90, 1);
        Imgproc.warpAffine(origin, dest, rMat, new Size(origin.rows(), origin.cols()));

        if (isRight)
        {
            Core.flip(dest, dest, -1);
        }
        Texture2D texture = new Texture2D(dest.cols(), dest.rows(), TextureFormat.RGBA32, false);
        Utils.matToTexture2D(dest, texture);
        return texture;
    }
}

```


#まとめ
名前空間上のどのクラスに必要な関数があるのか若干わかりにくい感じはします。
後発系のOpenCVplusUnity(無料)の方が使用感的には使いやすい印象です。
癖があるだけで慣れてしまえばどちらも同じです。
アーカイブ目的であればOpenCVforUnityをおすすめします。
OpenCVforUnity 画像フリップ処理について

#はじめに
この記事ではOpenCVforUnity(有償)を使用しています。
iOSアーカイブ目的の際はこちらをお勧めします。(Appleのbitcode変換も問題なく通るのでアップ後のアーキテクチャ対応の心配ありません)

Unityで画像を保存する際にフリップ処理したいなんて時があると思います。RendereTextreで工夫したり、ピクセル処理することもできるかと思いますが。今回はOpenCVを使います。


今回はこの結果を目指します。Texture2DをX軸,Y軸,XY軸に対してフリップ処理します。
![スクリーンショット 2020-12-06 13.20.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508103/26b366b2-3755-13f8-b1f0-9b278458ec29.png)
といっても、することはPythonで使用する時と変わりません。
Texture2DをMatへ変換してFlip変換して再びTexture2Dへ返しているだけです。






#実装方法

```OpenCVManager.cs
using UnityEngine;
using OpenCVForUnity.CoreModule;
using OpenCVForUnity.UnityUtils;
using OpenCVForUnity.ImgprocModule;

public class OpenCVManager
{
    /// <summary>
    /// Texture2Dをフリップ回転処理 FlipNum = -1(XY), 0(X), 1(Y)
    /// </summary>
    public static Texture2D FlipToTex2D(Texture2D tex, int flipNum)
    {
        Mat origin = new Mat(tex.height, tex.width, CvType.CV_8UC4);
        Utils.texture2DToMat(tex, origin);
        Core.flip(origin, origin, flipNum);
        Texture2D texture = new Texture2D(origin.cols(), origin.rows(), TextureFormat.RGBA32, false);
        Utils.matToTexture2D(origin, texture);
        return texture;
    }
}

```

#まとめ
名前空間上のどのクラスに必要な関数があるのか若干わかりにくい感じはします。
後発系のOpenCVplusUnity(無料)の方が使用感的には使いやすい印象です。
癖があるだけで慣れてしまえばどちらも同じです。
アーカイブ目的であればOpenCVforUnityをおすすめします。
matplotlib pyplotのquiver()でベクトル場を書くとクッソ見づらくなる問題の2つの解決法

Matplotlib.pyplotでベクトル場を書く際に定番となっているメソッドplt.quiver()はめっちゃ使いづらい｡
きれいに描くコツと､上位互換としてのplt.streamplot()の利用を提案する｡


#前提
微分方程式Uまたは（「または」）Vが与えられている

これらの解軌道の振る舞いを知りたい

#plt.quiver(X,Y,U,V,*C,cmap*)
初期値とそこからの差分を指定することでベクトルを書いてくれる。斜体はオプションだけどめっちゃ便利なのでおすすめなやつ｡
X,Yには初期値をmgridなどで設定
U,Vにはそれら格子点から刻み幅ぶん移動した際の「差分」→微分方程式の解軌道を知りたい場合はRunge-Kuttaなどを使って数値的に解いてあげて、その際の差分の項､または刻み幅$\Delta t$（定数,X-Tプロットの場合のみ）を設定する。解軌道をRunge-Kuttaでどうせ出す場合によく使われがち｡
そのままだとベクトルの大きさはそのまま矢印の大きさに反映されてしまう!この場合､描画範囲内で相対的にベクトルの大きさが異なるとこういうことになる｡

```python
plt.quiver(u,v,U,V)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234736/28c0c78f-1174-1bbc-23bc-a55ed7126a21.png)

いや､見づらいわ｡見づらすぎて水ナスになったわね｡もはや計算を間違えたのかと疑いたくなる｡
非線形ダイナミクスの名著｢ストロガッツ 非線形ダイナミクスとカオス｣にはこうある｡


```
｢ベクトルの矢じりや長さの違いは､残念ながら図を乱雑にしてしまいがちである｣(p.162)
```
おっしゃるとおりである｡同書では､大きさを統一して方向場を示すことを提案､採用している｡これにならった上で､白黒の本ではできなかった**カラーマップ**を導入することでスピードを表現､本家超えをめざす｡

まずベクトルの大きさで自身を割ることでサイズを統一｡
この｢大きさ｣の値を第5の引数にあたえることで､cmapで指定した｢カラーマップ｣に紐付けるッ

```python
plt.quiver(u,v,U/np.sqrt(pow(U,2)+pow(V,2)),V/np.sqrt(pow(U,2)+pow(V,2)),np.sqrt(pow(U,2)+pow(V,2)), cmap='jet')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234736/9a824d22-2729-8797-c277-f543a621ca57.png)

はいわかりやすい｡差は歴然である｡
ちなみにこれは神経の膜電位を表すモデルに4次のRunge-Kutta法を刻み幅0.1で1ステップ適用したもの｡

#plt.streamplot（X,Y,U,V) 
初期値に対応した**解軌道を勝手に計算してくれる**。正確さについては後述。
X,Yには初期値をmgridなどで設定するが、この際なぜかYを先に書かないと絶対にエラーがでる(ValueError: The rows of 'x' must be equal)。入れ替えればいいだけなので特に調査はしてないけど、パッとわかる方いたらコメントで教えて下さい。

U,Vがちがって、ここにはそのまま微分方程式(を表す変数)を書いてしまう。
連続した矢印が書かれるのでベクトルの大きさが矢印の大きさと対応しないのだが、オプションを使って色に反映させることができる。

例）

```
plt.streamplot(X,Y,U,V,color = np.sqrt(U**2+V**2)), cmap='jet'
```

#実装例
u,v二次元の微分方程式をudot,vdotで定義、quiver用の初期値をu,v、streamplot用の初期値をx,yで与えておく（前述の通り順序を変えないとエラーになるので）。

```python
import numpy as np
import matplotlib.pyplot as plt

#考えている微分方程式(cf;ストロガッツ非線形ダイナミクスとカオスp.172)
def udot(u,v):
  return u*(3-u-2*v)
def vdot(u,v):
  return v*(2-u-v)

#streamplot（なんと二行で済む！ヒートマップ的に大きいところは赤、小さいところは青で表示していくれるカラーマップを使用。）
y, x= np.mgrid[0:2:20j,0:3:20j]
plt.streamplot(x,y,udot(x,y),vdot(x,y),color=np.sqrt(udot(x,y)**2+vdot(x,y)**2),cmap='jet')

#つぎにquiver用にルンゲクッタを用意。
def rk4th_1step_2d(func,u,v,dt):
  k1 = func(u,v)*dt
  k2 = func(u+k1/2, v+k1/2)*dt
  k3 = func(u+k2/2, v+k2/2)*dt
  k4 = func(u+k3, v+k3)*dt
  return (k1+2*k2+2*k3+k4)/6

#quiverをプロット
u, v = np.mgrid[0:3:20j,0:2:20j]
U = rk4th_1step_2d(udot,u,v,0.1)
V = rk4th_1step_2d(vdot,u,v,0.1)
plt.quiver(u,v,U,V)
```
#結果の比較
ルンゲクッタでは原理的に刻み幅を小さくするほど正確な値に近づくので,dt=0.1の場合とdt=0.01の場合で解軌道がどう変化するのか調べてみた。

dt＝0.1の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234736/5bf5699b-dc97-6436-3b12-2faacbbb3827.png)

dt=0.01の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234736/70ecd2ac-3cc0-06d6-d3b8-bcd06b0b15f5.png)


dtで指定する刻み幅を小さくするとstreamplotが出した解軌道と平行に近づいていることがわかる。右下あたりとかがわかりやすい。streamplotは結構正確な計算を裏でやっているみたい。どんな計算をしているかはいずれちゃんと読みたい。


#追記

こちらのサイトにソースコードがのっていて、主に適応刻み幅制御をつかった2次のRunge-Kutta法を利用していることがわかった。
https://matplotlib.org/3.1.3/_modules/matplotlib/streamplot.html
[React] ReactでHello World

#ReactでHello World

※ 自分用の覚え書きでございます。

```react:app.js
import React from 'react';

class App extends React.Component {
  render() {
    return (
      <h1>Hello World</h1>
    );
  }
}

export default App;
```

returnの中、JSXにJavaScriptを埋め込む

```react:app.js
import React from 'react';

class App extends React.Component {
  render() {
    // 定数nameを定義
    const hello = "Hello World"
    
    return (
      <div>
        {/* 定数helloを用いて表示 */}
        <h1>{hello}</h1>
      </div>
    );
  }
}

export default App;
```
Rubyの変数について

①変数とは？
②Rubyの変数を使う上での注意点

以上の2点を簡単に説明していきます。


<h1>変数とは？</h1>
まず変数というのは、文字列などの値を格納するための箱のようなものという例えがよく使われます。簡単な例を以下に記述します。

```Ruby

a = "tanaka"
b = 20
puts a  #ターミナルの出力は「tanaka」
puts b  #ターミナルの出力は「20」


```
上記の「=」から見て左側にあるのが変数「a」、右側にあるのが値の「tanaka」になります。
「a」という変数に「tanaka」という値を代入しています。
その下の「b」という変数に数値の「20」を代入しています

Rubyでは文字列を入力するときは「" "」(ダブルクォーテーション)を使います。そして、数値を入れるときは「" "」は必要ないので数値を入れるときは「" "」を外しています。
そしてその下で、putsメソッドを使って「a」と「b」を呼び出して中にある「tanaka」と「20」という値を表示しています。
ここで使われている演算子の「=」は、<strong>代入演算子と呼ばれています。</strong>


<h1>Rubyの変数を使う上での注意点</h1>

変数を使う上で注意点がいくつかあります。
1.予約語を使わない、使えない
2.変数定義は必ず小文字か「_」(アンダーバー)から始まるように定義する、数字からは始めない！（スネークケース）

<h2>1.予約語を使わない、使えない</h2>
そもそも予約語って...?

予約語とは簡単にいうと、変数や定数などに使うことができないもの、<strong>その単語が役割を持っている物のことを言います。</strong>

例えば分岐処理をするための「if」は予約語です。クラスの定義するための「class」も予約語です。これらを使うとエラーが返されます。

変数を定義するときはこの予約語に気をつけましょう！

予約語一覧

```Ruby

BEGIN    class    ensure   nil      self     when
END      def      false    not      super    while
alias    defined? for      or       then     yield
and      do       if       redo     true     __LINE__
begin    else     in       rescue   undef    __FILE__
break    elsif    module   retry    unless   __ENCODING__
case     end      next     return   until

```

予約語の参考記事
https://docs.ruby-lang.org/ja/latest/doc/spec=2flexical.html

<h2>2.変数定義は必ず小文字か「_」(アンダーバー)から始まるように定義する、数字からは始めない！（スネークケース）</h2>

変数を定義する上で大事なことです！！！！！

```Ruby
20 = 20 #数字から始まっているのでエラーになる！！！！

_20 = 20 #これはアンダーバーから始まっているので「変数」として定義できる！！！！

number = 20 #小文字なので「変数」として定義できる！！！！！！

Number = 20 #大文字なので「定数」としてみなされる！！！！！！！

```

このように変数には命名規則があるので注意しましょう！



<h2>スネークケースとはなんぞ...?</h2>

スネークケースとは単語の始まりを小文字で始め、繋ぎの部分を「 _ 」（アンダーバー）で繋いで記述することを言います。

※他にも「キャメルケース」「アッパーキャメルケース」がありますが今回の記事には関係ないので省きます。気になる方は各自調べてみてください。

<h3>ん？どゆこと...？</h3>

以下にいくつかの例を記述します。

```Ruby
user_name = "tanaka"
user_age = 20

puts user_name  #ターミナルの出力は「tanaka」
puts user_age #ターミナルの出力は「20」

```

このように「user_name」としている「user」と「name」の間に「 _ 」を入れて記述することを<strong>スネークケース</strong>と言います。
「user_age」も同じです。

スネークケース参考記事
https://wa3.i-3-i.info/word1180.html

※Rubyでは変数を定義するときに始まりを大文字にしてしまうと定数としてみなされるため注意が必要です。
定数が気になる方は調べてください。


<h1>まとめ</h1>

・変数は値を入れるための箱のような物、変数の定義は代入演算子「=」を使って定義する。
・変数定義の注意点、数字からは始めない！小文字か＿（アンダーバー）から始めること！
・小文字の繋ぎには＿(アンダーバー)をつける！


参考記事
https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html
NeXT STEP

<p>NEXTSTEPからRhapsodyが生まれ、それのYellow Boxに相当するのがCocoaとなる。</p>

<p>Cocoaは狭い範囲ではAppKit又はUIKitとFoundationで構成されるもので、その概念はObjective-Cの機能と関係が深い。</p>

<p>WWDC19からCocoaという用語が見当たらなくなったが、macOSやiOSの主要なフレームワークであることは変わらず、SwiftもCocoa的な概念に沿っている部分もあるが、以前は少ない概念で実装されていたフレームワークが多種多様な概念が採用されており、それらを含めてCocoaと称する必要性がなくなった。というか、概念を普及させる活動の必要性がなくなったから、Cocoaという用語が使われなくなったのか？</p>

<p>もうCocoaという用語を使うのはやめて、次へ進むんでいくべきのようだ。</p>

【関連情報】
<a href="https://qiita.com/advent-calendar/2020/cocoa">Cocoa Advent Calendar 2020</a><br />
<a href="https://cocoa-kanto.connpass.com/">Cocoa.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="http://www.bitz.co.jp/weblog/">Cocoa練習帳</a><br />
Markdown に独自の機能を搭載した RichMD をリリースしました

# RichMD とは?
RichMD は Markdown をベースに独自の機能を搭載した新しい Markdown です。
![preview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154610/c9d02e99-ccdb-5531-f749-d4ecfb324300.png)

RichMD は
「**Markdown の良さを残しつつ、機能として Markdown を超えていく**」
ことをコンセプトに作っています。
Markdown のような簡単な記法で色々な機能ができる Markdown を目指してます。
JavaScript で作られているので、React や Vue にも対応可能です。
(React や Vue で実装する際は、Webpack のビルド環境が必要です)

npm からインストールできます。
https://www.npmjs.com/package/richmd

# RichMD CLI & RichMD file
RichMD は RichMD CLI を搭載しており、これにより RichMD file を作り出すことができました。
RichMD file は拡張子を `.richmd` にして作成します。

```bash
$ touch hello.richmd 
```

詳しい使い方は[こちら](https://github.com/bebeji-nappa/richmd/blob/master/docs/usage-cli.md)

# RichMD file を使って CSS ファイルを読み込む
v1.0.1 から CSS file のインポートができるようになりました。
これにより、`<link>` タグを使わなくてもスタイルシートを適用することができます。
以下の記法で記述できます。

```txt
::style::./src/style.css
```

# Dropdown Details を簡単に記述できる
Markdown でドロップダウン形式の details を書く時は HTML を直接書いていました。

```txt
<details><summary>Summary</summary>
Hello, World!!
</details>
```

RichMD では以下のように簡単に記述できます。

```txt
:>Summary
Hello, World!!
:>
```

# 最後に
RichMD はまだまだ発展途上なので、今後も機能を増やして進化していきます。
是非、使ってみてください!

# GitHub
https://github.com/bebeji-nappa/richmd
[Unity] ViewportRect で 3D 画面の配置を変える

## 概要
Unity の Camera には ViewportRect というプロパティを使って画面を右半分に寄せたり左半分に寄せたりできますというお話

## 動作画面
![画面収録 2020-12-26 17.33.59.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/982565/96cd8324-c6fc-3697-74c4-f72b57483473.gif)

## プロパティについて
X,Y,W,H いずれも 0〜1 の範囲で指定でき、デバイスの画面 100% を 1 として割合で指定することができます。
![スクリーンショット 2020-12-26 17.51.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/982565/a9aa0ebb-5250-0f79-9a5b-c20db36ee0b9.png)


## 参考文献
* カメラ - Unity マニュアル  
https://docs.unity3d.com/ja/2018.4/Manual/class-Camera.html
text-overflowで枠からはみ出す部分を「...」で表示する

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="css,result" data-user="momonoki1990" data-slug-hash="eYdeVJG" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="text-overflow">
  <span>See the Pen <a href="https://codepen.io/momonoki1990/pen/eYdeVJG">
  text-overflow</a> by 熊瀬川直也 (<a href="https://codepen.io/momonoki1990">@momonoki1990</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


・そもそも、```width```を設定しておかないと、文字の長さにしたがって親要素の幅が延々と広がってしまうので注意。
・```white-space: nowrap```と```overflow: hidden```を設定しないと文章が折り返されてしまったりはみ出した部分が非表示にならないので注意。
・あくまで```text-overflow: ellipsis```は文章が決まった長さの枠(%でもOK)はみ出して非表示になる部分を 「...」にして表示するだけ。
・別途、```span```要素に```overflow:hidden``` を設定しても効かなくてちょいハマり。これは、インライン要素は幅を持たないためと思われる。ブロック要素に```overflow: hidden```などを設定するか、インライン要素に```display: inline-block``` を設定すれば、効く。
Pardot のスコアリングとグレーディング (Pardot Lightning アプリケーション) ⇒ リード評価の自動化 (Pardot Lightning アプリケーション)

１．リード評価のしきい値には何を指定する必要がありますか?
２．リード評価のしきい値を設定する目的は何ですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/1d240402-1be2-8ed8-9b62-2ece9fb6e86d.png)
久しぶりなLisp

#Lisp引退おじさん
引退したはずだったのですが、今年の後半になってGPU、CUDAのインストールが最新のMINTでうまくいかずにDeep-Learning実装を中断、Lisp＆Prologを弄ってました。弄っているとはまりますね。Lispカレンダー、空間がたっぷりあったので、ご迷惑にもならないだろうと思い、しゃしゃり出ることとしました。お許しくださいませ。

#三つ子の魂百まで
モダンなコンピューター言語でおもしろそうなのがどんどん登場してきます。すごいですねえ。でも、私の場合、結局、Lisp＆Prologを弄ってるのが一番に落ち着きますし、楽しいみたいです。おっさんですね。ロックバンドといったらパープルにツェッペリンという感覚が今でも染みついてます。久しぶりに弾いたエレキもだいぶ様になってきました。コロナが収まったらライブハウスデビューしようかしらん。オッサンの夢は膨らみます。
![Screenshot at 2020-12-26 17-48-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/92df9d50-5bf9-a94d-93ef-0f2f865793ff.png)
すみません。本文とは関係ありません。
https://www.youtube.com/watch?v=qrwkccaLuN8&list=RDqrwkccaLuN8&start_radio=1


#フォーマッタ
なんでもござれであらゆるツールが揃っているCommon-Lispと違って、ISLispにはほぼ何もありません。そこが楽しいのですね。その昔、月刊I/Oや月刊アスキーを楽しみに、ささやかなハックをしていた頃を思い出します。ツールがないなら自分で作っちゃう、オッサン、今でもこのノリで生きてます。マイクロソフトのVS-CODEに乗り換えてとてもご機嫌なのですが、Lisp用のフォーマッタがうまくいきません。そしてこれはCommong-Lisp用です。うん、これはゲリラ的ハックで自作するチャンスですよ。

#即席ラーメンならぬ即席Lisp
思い立ったが吉日です。半日ほど、あれこれと書いていたら何となくそれっぽくなってきました。参考にしたのは竹内先生の「初めての人のためのLISP」２５２ページです。お供あり、お供なしなんてのがあったのですね。この本、若いころに相当に入れ込んで読んだはずなのですが、気が付きませんでした。


今のところこんな感じです。細部はまだまだこれから。年末年始のミニプロジェクトによさそうです。
![Screenshot at 2020-12-26 17-43-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/585391b4-2d31-b3eb-3ac0-70f52bb90c71.png)





#仕組みは？
S式を読み込むときに数やシンボルを文字列として取り込んでいます。自然数でも#Xface #B010101 なんてのがあります。S式で読み込んじゃうとアラビア数字になってしまい、オリジナルのコードを損ないます。シンボルもS式で読み込んじゃうと大文字になってしまい扱いが面倒です。


(cons 1 2)  なら　("cons" "1" "2") と読み込んでから清書の処理をしています。コードgithubに置いてあります。tests/pretty.lspといのが開発中のものです。


https://github.com/sasagawa888/eisl
Azure Purview : 概要とセットアップ

この記事は、先日発表された [Azure Purview](https://azure.microsoft.com/ja-jp/services/purview/) について、概要とセットアップを紹介します。

# Azure Purview とは

仕事でデータにアクセスする際、以外と多くの課題があります。例えば:

- どこにデータソースがあるか、そもそも分からない
- データソースは見つけたがアクセス権がなく、また依頼先が分からない
- それっぽいファイル/データベース名は見つけたが、中身は開くまで分からない
- データカタログが複数あり、検索が面倒

またデータの管理者としても、多くの課題があります。例えば:

- 組織内のデータソースを把握しきれない
- データソースに個人情報が含まれるかは、開かないと分からない
- 管理者が分からないデータソースがある
- データの出所や、利用先が分からない

Azure Purview はこれらの課題を解決するマネージドソリューションであり、データソースをカタログ化するサービスです。多くのデータソースに簡単に接続でき、メタデータを自動抽出することでカタログ化します。例えば:

- データに対して分類を付与
- スキーマや場所の情報を取得
- 所有者や専門的な知識をもつユーザーの紐づけ
- 他データソースとの関連の自動作成

分類やタグ付けのルールなど細かくカスタマイズできるため、組織のニーズに合わせた柔軟な対応ができます。より詳細は [公式: Azure Purview とは](https://docs.microsoft.com/ja-jp/azure/purview/overview) を参照してください。

個人的には説明分を読んでもあまりピンとこなかった派のため、これから実際に試していきましょう。尚、2021 年 2 月 28 日まではプレビューが無償で利用できるため、学習し放題です。※データソース側のコストはかかります。

# セットアップ

Azure Purview 自体のセットアップは通常の Azure リソースと同じ要領で行います。

1\. Azure Portal より「リソースの作成」をクリックし、「Azure Purview」を検索。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/e7cb8939-f9fe-91a7-765c-cd2833be37a9.png)

2\. 作成をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/91e2a579-52d8-40b5-0a57-b8efc6ac59f6.png)

3\. リソースグループや名前を指定して作成。場所はまだ日本はありませんので、適当に選択してください。構成などは既定のままでいいと思います。作成完了後、リソースへ移動。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/e2139cb2-ea18-8fcf-d3e2-9553134b4e0f.png)

4\.「Open Purview Studio」をクリックし、スタジオを起動。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/a18f4235-959c-f8d6-0554-d0b77e9cf01f.png)

# サンプルデータの登録

Azure Purview を試すには、まずはデータが必要ですが、公式ページでサンプルデータの提供と登録方法がステップバイステップで提供されています。

次回は [チュートリアルのスターターキット](https://docs.microsoft.com/ja-jp/azure/purview/tutorial-scan-data) を見ながら実際にデータを登録してみます。

[次の記事へ](https://qiita.com/kenakamu/items/ed4ea30d40be1f5ae53b)

# 参考
[公式ドキュメント: Azure Purview](https://docs.microsoft.com/ja-jp/azure/purview)
[ビデオ: Azure Synapse 提供開始 / Azure Purview プレビュー発表「Shape Your Future with Azure Data and Analytics」(日本語字幕付き)](https://www.youtube.com/watch?v=VAEIPfERB9w)
[公式サイト: Azure Purview](https://azure.microsoft.com/ja-jp/services/purview/) 
[チュートリアルのスターターキット](https://docs.microsoft.com/ja-jp/azure/purview/tutorial-scan-data)
マルチスケールシミュレーション11

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.2p137](<https://img.shields.io/badge/ruby-2.7.2p137-brightgreen>) 


# hello class


## 講義ページリンク

[チャート式ruby-VI(helloclass)](https://qiita.com/daddygongon/items/969ad5112878f6dab844)


## 内容

classを作成する


## 課題

assert\_equalをクラス化してIntegerにMonkey Patchingする


## 解答例

```ruby
#!/usr/bin/env ruby
# frozen_string_literal: true

class Integer
  def assert_equal(target)
    if self == target
      puts true
    else
      puts false
    end
  end
end

puts 3.assert_equal 3
```

出力

    > ruby assert_equal.rb
    true


# NOTE

-   クラスの上書きをmonkey patchingというらしい
-   コードを見やすくするにはclassとか使おう
-   object指向になれておこう



------
 - **source** ~/multiscalesim_toku/grad_members_20f/members/lynd2299/mss11.org
EventTargetのつまずき。

今日の当番：TypeScript超初心者のちむ

ついさっきEventTargetでつまずきました。
例えばこんなコード。

```main.ts
// aタグをクリックしたときに発火させたい関数
const func = (e: Event) => {
  const target = e.target.hash;

  //　以下略・・・
};
```

ここで```.hash```にこんなエラーがでます。
<b>```Property 'hash' does not exist on type 'EventTarget'.```</b>

<b>EventTarget</b>には```hash```というプロパティがないんだって。
え〜なんだって！
でも```event.taeget```で取得できるのって、<b>HTMLElement</b>では？？
コンソールで出力すると<b>HTMLElement</b>が取得されてるんだもん。おかしいじゃん？？

## 私の勘違い①：event.targetの型はHTMLElementでしょ！
と思ってました。全くもって違いました。おばかですね。
エラー文に書いてある通り<b>「EventTarget」</b>という型です。

落ち着いて、いったんEventTagetの型定義を見てみる。（英語やら説明やらは省く）

```
/** EventTarget is a DOM interface implemented by objects that can receive events and may have listeners for them. */
interface EventTarget {
    addEventListener(type: string, listener: EventListenerOrEventListenerObject | null, options?: boolean | AddEventListenerOptions): void;
    dispatchEvent(event: Event): boolean;
    removeEventListener(type: string, callback: EventListenerOrEventListenerObject | null, options?: EventListenerOptions | boolean): void;
}
```

ええ、確かに```hash```なんてありませんね。
しかも、```EventTarget```に入るのはHTMLElementだけでは無いようです。

>Element および document、window は、最も一般的なイベントターゲットですが、他のオブジェクトもイベントターゲットになります。例えば、XMLHttpRequest、AudioNode、AudioContext 他。
(MDN参照：https://developer.mozilla.org/ja/docs/Web/API/EventTarget)

へえなるほどね。完全に理解した。
そして訪れる２つめの勘違い。

## 私の勘違い②：じゃあHTMLElementにキャストするのだ
完璧。天才。そう思っていました。

```main.ts
// aタグをクリックしたときに発火させたい関数
const func = (e: Event) => {
  const target = e.target as HTMLElement;
  const hash = target.hash;

  //　以下略・・・
};

```
・・・いや```.hash```にエラー出たままなんだけど？
エラー文もほぼ同じ
```Property 'hash' does not exist on type 'HTMLElement'.```

まさか・・・！そう思い覗いた<b>HTMLElement</b>のプロパティ。
もちろん```hash```なんて存在しない。ぴえん。浅はか。
https://developer.mozilla.org/ja/docs/Web/API/HTMLElement
勝手に思いこむ前にちゃんと確認しましょう。

でも惜しかったね！よく頑張ったね！
aタグしか入ってこないんだから、<b>HTMLAnchorElement</b>でキャストしてあげようね！

## そしてたどり着いたゴール
おめでとう。この１つのエラーで私は成長しました。

```main.ts
// aタグをクリックしたときに発火させたい関数
const func = (e: Event) => {
  const target = e.target as HTMLAnchorElement;
  const hash = target.hash;

  //　以下略・・・
};

```

ちなみに、```hash```というプロパティは<b>HTMLHyperlinkElementUtils</b>に含まれているのですが、
実験的な機能のため対応していないブラウザもあります。（IEとか、あとはIEとか）
使う際には注意が必要です。polyfill入れたら良いのかも？

（↓詳しくはこちら）
https://developer.mozilla.org/ja/docs/Web/API/HTMLHyperlinkElementUtils


## こうして私は強くなる
浅はか人間に厳しいTypeScriptさん。でもちゃんとエラーで教えてくれる心強いTypeScriptさん。
メゲナイ！しょげない！泣いちゃダメ！
MDNさんとTypeScriptさんと三位一体で頑張ります。
Invoke tagging discipline across organization in AWS - 3

<!-- # Invoke tagging discipline across organization in AWS - 3 -->

![haniwa2_tag.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486518/42718d7e-b91a-0eb7-8281-4879b40be19c.png)

[前回](https://qiita.com/o2346/items/fd4175335fd78418d9c9) の続きです。今回は [Aggregate](https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/aggregate-data.html) した情報のなかからrequired-tags に対し非準拠となっている情報を抽出し、 Slack channel に送信するという通知機能を実装してゆきます

前回までで、 Tag policies, required-tags という 2 つのソリューションを導入し、マネジメントコンソール上で俯瞰できるところまできました。しかし監査チームの人的資源には限りがあるのであり、マネジメントコンソールを開いて見張る、などとすると、運用負荷が増してしまうという問題が浮上します。あくまでも違反の発生時だけ Slack にその旨通知されるというのが理想です。

異なる 2 つのサービスですのでそれぞれの解決策が必要となりますが、まずは reqired-tags からです。 Tag policies のほうは後日にします

## 設計

前回の最後で触れたように、 当組織の Compliance account には既に Security Hub 用に構成した Chatbot が稼働しております。まず思いついたのは、これに便乗できないかというものでした
Aggregator -> sns -> Chatbot -> Slack みたいなイメージです。

しかし検索しても実装例は見当たりませんでした。どうやら 2020/12 時点ではそのような構成は難しい模様。

結論としてはイベントトリガーは諦めて Lambda function の定期実行で妥協することにしました。
定時起動した Lambda function の方から [Advanced Query](https://aws.amazon.com/jp/about-aws/whats-new/2020/03/introducing-aws-config-multi-account-multi-region-support-for-advanced-query/?nc1=h_ls) などで非準拠情報を抽出、成形して Slack に送るという構成です

定期実行の自作 Lambda function という点はあんまりエレガントではないと感じますが、Config Aggregator に依存を限定するという [簡潔性](https://ja.wikipedia.org/wiki/KISS%E3%81%AE%E5%8E%9F%E5%89%87) を優先。
起動周期は一日〜数日に一度程度の想定ですが、これは許容します。だっていくらコンプライアンスと言って、タグがついてるついてないというだけの話ですからね。一分一秒を争って目くじらを立てることでもないかと思います（今のところは）

## 実装

上記の調査検討過程で、肝心の Aggregator の API は [把握済み](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/config.html#ConfigService.Client.select_aggregate_resource_config) でして、 Lambda function の基本的な仕様は固まりました。じゃさっさと書きましょうか
[はいできました](https://github.com/o2346/tagging-discipline/tree/main/configservice/cant) （笑）。でこいつを `sam deploy` しますと次のようになります

![cant-slack-individuals-concealed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486518/7bc27b67-3adc-e7d9-dc49-63a6d622d2a4.png)

この画像では、ある Source account の ap-northeast-1 で 1個, us-east-1 で 2個 の EC2 インスタンスが非準拠だというメッセージが来ています

### 大量投稿抑止機能

上記の画像の例では検証環境のため、数えるほどしか通知は来てませんが、翻って多数のリソースを運用中の本番環境に展開した場合の配慮をします。

というのも、noncompliant resources の数が大量となればそのぶん通知も大量に Slack Channel に投稿されてしまうからです（そういう仕様にしてしまっています）。
いくら非準拠を遺漏なく報告させたいといって、あまりにも大挙して通知が押し寄せてきますと、受け取る方は人間ですから見落としたり、逆に対処する気が失せます。これじゃ本末転倒です。
また今回作成したスケジュールベースの仕様だと Lambda Function のタイムアウトによる制約にも要注意だと考えました。一回の起動で(required-tags 限定とはいえ)全 Source accounts の非準拠情報を網羅しようとしてますのでね。
そこで閾値を設けてそれを超える noncompliant resources 数となった場合は個別のメッセージを省略させるようにしました。この抑止機能が発動した場合は次のように Summary のみとなります

![cant-slack-exceeded-threshold.-concealedpng.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486518/5035a085-674d-49c6-efb9-c86313b5322a.png)

*※意図的に抑止機能を効かせるためダミーデータを埋め込んで実行しています*
この場合個別の詳細は素直に Aggregated View を見に行くことにします

## その他

今回は [sam](https://aws.amazon.com/jp/serverless/sam/?nc1=h_ls) で開発してみましたが楽でいいですね。 [Advanced Query](https://docs.aws.amazon.com/config/latest/developerguide/querying-AWS-resources.html) もなかなかよいです

[次回](https://qiita.com/o2346/items/04db0c8b5394df38e05f) は Tag policies の方の通知系をやろうと思います
Ruby on Railsでアプリを作るときに便利なコピペ集一覧

`Rails`でアプリを作成するときに、作成の初期段階でまとめておくと便利だと思ったコードをいくつかまとめてます(自分用)

### `Ruby on Rails`をインストールする
```ターミナル
% rails _6.0.0_ new 'ファイル名' -d mysql
```

### データベースを作成する前に設定しておくべきこと
```config/database.yml
# encoding: utf8mb4
=> encoding: utf8
```

詳しい説明はまだできないですが、`utf8mb4`のままだとバイト数の関係でうまくマイグレートできません。
`utf8mb4`のままデータベースを作成したときの対応はこちらを参考にします。
[【MySQL】Mysql2::Error: Specified key was too long; max key length is 767 bytes](https://qiita.com/terufumi1122/items/9ea764618eba01144e09)

<details><summary><strong>もし設定を間違えてデータベースを作成してしまったら</strong></summary><div>

* データベースを削除する

```ターミナル
% rails db:drop
% rails db:create
```
</div></details>


#### 一通りインストールしておきたいgem
```gemfile.rb
gem 'devise'             #ユーザー登録機能の実装
gem 'mysql2', '>= 0.5.3' #mysqlのバージョンを変更
gem 'pry-rails'          #エラーを確認したりテストを行う際に使用
gem 'mini_magick'        #ImageMagickを使用するためのgem
gem 'image_processing'   #画像サイズを調整するgem
gem 'active_hash'        #都道府県等静的データを扱うときに便利なgem
```
#### リセットCSSを適用する
ブラウザにはデフォルトで`CSS`が設定されているので、これをリセットするために適用します。

```app/views/layouts/application.html
<head>
  <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/3.18.1/build/cssreset/cssreset-min.css">
</head>
```
#### 要素サイズの設定をする
何も設定しないままだと`CSS`で`padding`や`border`を設定したときに、意図していない大きさになる可能性があるので、思い通りの要素サイズになるように設定します。

```application.css
* {
  box-sizing: border-box;
}
```
#### `devise`を諸々設定する

```
% rails g devise:install
% rails g devise user
% rails g devise:views

% rails db:migrate
```

#### 未ログインユーザーの閲覧を制限する
```controller.rb

before_action :authenticate_user!, except: [:index, :show]
```

#### `devise`で設定した`email`,`password`以外のカラムを使用できるようにする
```app/controllers/application_controller.rb
  before_action :configure_permitted_parameters, if: :devise_controller?

  private
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:])
  end
```
Pardot のスコアリングとグレーディング (Pardot Lightning アプリケーション) ⇒ グレーディングの使用 (Pardot Lightning アプリケーション)

１．Pardot のグレードはどのようなものですか?
２．Pardot でカスタムプロファイルを作成するとしたらその理由は何ですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/c0bec928-ae54-1942-e49b-e819ff0268c6.png)
Vue詳しくなろう 〜インストール編〜

# 本記事について
vue公式サイトの[インストール](https://v3.ja.vuejs.org/guide/installation.html)の章をサマリした内容を書いたもの。
途中までしかかけてないです。

# 現状、バージョンがv2,v3系が存在する？

- [v2](https://jp.vuejs.org/v2/guide/installation.html)
- [v3](https://v3.ja.vuejs.org/guide/installation.html)

v3は、beta版がリリースされているみたいです。今今のメインバージョンはどっちなのか不明です。。
今回はv3について書いていきます。

# Vue Devtools

[Chrome 拡張版を入手(opens new window)](https://chrome.google.com/webstore/detail/vuejs-devtools/ljjemllljcmogpfapbkkighbhhppjdbg)
ブラウザにインストールするサポートツールみたいなもの。
これもバージョンが2つあり、下記画像のようななっている。
vue公式サイトは、v2系で実装されているということか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273913/c850ce59-c5b1-034b-314a-fd114789f470.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273913/455aec4c-2a05-4950-05ec-c1bcbeacd421.png)


# CDN

プロトタイピングや学習を目的とする場合は、以下のようにして最新バージョンを利用できる。

```html

<script src="https://unpkg.com/vue@next"></script>
```

# NPM

コードのプロジェクトにvueを組み込むためには下記コマンドを実行する。
package.jsonなどに追記される。
`.vue`拡張子ファイルを利用するようにするためのパーケージってことかな？

```sh
# 最新安定版
$ npm install vue@next
```

# CLI
以降、省略。
[リンク](https://v3.ja.vuejs.org/guide/installation.html#cli)貼っておきます。

# 【Tips】ランタイム + コンパイラとランタイム限定の違い

下記、引用です。
こういう小難しいやつを理解していきたい。

### 引用
>もし、クライアントでテンプレートをコンパイルする必要がある(例えば、template オプションに文字列を渡す、または DOM 内の HTML をテンプレートとして要素にマウントする)場合は、コンパイラ、すなわち完全ビルドが必要です:

```js

// これはコンパイラが必要です
Vue.createApp({
  template: '<div>{{ hi }}</div>'
})

// これはコンパイラ不要です
Vue.createApp({
  render() {
    return Vue.h('div', {}, this.hi)
  }
})
```
>vue-loaderを利用する場合、*.vue ファイル内部のテンプレートはビルド時に JavaScript に事前コンパイルされます。最終成果物の中にコンパイラが明らかに不要なるため、ランタイム限定ビルドを利用することができます。
【Swift】fatalError関数によるプログラムの終了

#fatalError関数 とは
Optional\<Wrapped>型やResult\<Success, Failure>型、do-catch文などの
エラー処理を書くことにより、様々なメリットがありました。

**１つ目、利用者が失敗に遭遇する機会を減らす。
２つ目、失敗の内容を利用者に伝えて復帰操作を促すことができる。**
などが主なメリットになります。

しかし、エラーの中にはそもそも発生することが想定されておらず、
想定されていないので**復帰方法が存在しないようなエラー**もあります。

そうしたケースでは、**プログラムを終了させてしまうのも選択肢の一つです。**

そのプログラムを強制させる方法の一つがfatalError( )関数になります。

**fatalError( )関数は、
その箇所が実行されること自体が想定外であることを宣言するための関数です。**

##実装方法

fatalError( )関数は引数に終了時のメッセージを取り、
fatalError( )関数を実行すると、実行時エラーが発生しプログラムが終了します。

実行結果は、引数で指定したメッセージに加えソースファイル名と行番号を出力します。

```swift

fatalError("想定しないエラーが発生したためプログラムを終了します。")

実効結果
Fatal error: 想定しないエラーが発生したためプログラムを終了します。: file __lldb_expr_369/MyPlayground.playground, line 2
```

###Never型
fatalError( )関数の戻り値はNever型になります。
Never型は特殊な型で、**値を返さない型**になります。

値を返さないと聞くと、
Void型と似たようなものかな？と思いますがそういう意味ではなく、
**関数の実行時にプログラムを終了するため値を返すことはない**という意味合いになります。

Never型を戻り値に持つ関数を実行すると、
その箇所以降の処理は実行されないものとみなされるので、
戻り値を返す必要がなくなります。

fatalError( )の使い方としては下記のような使い方になります。
下記のサンプルコードでは戻り値を記載しなくてもコンパイルエラーになりません。

```swift

func sample(value: Int) -> Int {
    fatalError("戻り値は必要なくなります。")
}
```

このような使い方を上手く利用すれば、
**想定しない状況における処理の実装が不要となります。**

次のサンプルコードでは、ランキングに応じてメダルが渡されます。
１位〜３位はメダルがもらえますが、４位以降はもらえません。

また、引数rankはInt型なので、
Switch文で特に指定しない限りInt型の値を網羅する必要があります。

そういう時のために１位、２位、３位以外の値をdefaultとし、
defaultにはfatalError( )関数を定義します。

```swift

func sample(rank: Int) -> String {
    switch rank {
    case 1:
        return "1位です。金メダルを差し上げます。"
    case 2:
        return "2位です。銀メダルを差し上げます。"
    case 3:
        return "3位です。銅メダルを差し上げます。"
    default:
        fatalError("4位以降はメダルがありません。")
    }
}
```

このような、本来想定しない状況を適切に表すことができるのがfatalError( )関数になります。

##利用タイミング
###想定外の状況ではプログラムを終了させる
想定外の状況と一言で言われると少し難しいですが、
**実装上想定外の状況を考慮しなくても良いことが明らかな場合**は、
fatalError( )関数を利用して想定外の状況ではプログラムを終了して良いと思います。

逆に、**外部リソースなどに依存している場合などの想定外の挙動が十分起こり得る場合**は、
実行を継続できる実装にした方が良いと思います。

短いですが、以上がfatalError( )関数についての説明になります！

また、他のエラー処理についても記事にしているのでぜひご覧ください。
・[【Swift】Optional\<Wrapped>型でエラー処理を行う](https://qiita.com/onishiApp/items/110cc714139cd3dc7507)
・[【Swift】Result\<Success, Failure>型でエラー処理を行う](https://qiita.com/onishiApp/items/76e66d1504fcf42a9136)
・[【Swift】do-catch文でエラー処理を行う(その１)](https://qiita.com/onishiApp/items/cba5e6c7361163d8931e)
・[【Swift】アサーションによるプログラムの終了](https://qiita.com/onishiApp/items/66d65f7b56ae178b52b8)

最後までご覧いただきありがとうございました。
ドメイン駆動設計の用語【自分用メモ】

## やること
- ドメイン駆動設計（DDD）について勉強しているが、専門用語が多くてよくわからなくなってきたので適当にまとめる


## 以下用語まとめ

##### ドメイン駆動設計

- 開発手法の名前
- domain-driven design

##### ドメイン
- プログラムの対象となる領域


##### ドメインモデル
- ドメインをモデルとして表したもの


##### ドメインオブジェクト
- ドメインモデルをベースに実装されるオブジェクト


##### 値オブジェクト (value object)
- 値をクラスとして表現する
- 単に変数として定義するのではなくクラスとして扱うため、業務ルールに伴った値のチェックができる
- 不変（imutable）である


##### エンティティ
- 識別子で同一性を判別する
- 値オブジェクトと異なり不変ではない
- 例えばユーザを登録するアプリケーションの場合はユーザIDでユーザを識別する
- ユーザの持つ特製（ユーザ名など）は変化する
    - ユーザ名などは値オブジェクトとして扱う
- また、「新規登録」「退会」などのライフライクルがあるもの

##### ドメインサービス
- ドメインに関する処理のうち、エンティティに直接記述すると不自然になってしまうもの
- 例えば「ユーザの重複チェック」機能はユーザ一人一人（エンティティ）に紐づく処理ではないためドメインサービスとして扱う

##### アプリケーションサービス
- サービスのうちドメインではなくアプリケーションに紐づくもの
そうだ Minecraftサーバー 作ろう (Ubuntu 20.04 + Bedrock Server)

Minecraftサーバーを作って会社のみんなでワールドを共有しよう。

コロナで忘年会もお預けだし、なにか会社のみんなで楽しめるものはないかと思って、Minecraftサーバーを立ててみました。

### 環境

* 会社のESXi(!?)上に仮想マシン作成
* CPU: 4コア, メモリ: 8GB, HDD: 50GB
* Ubuntu Server 20.04
* Minecraft Bedrock Server 1.16.101.01

### Ubuntu の準備

OSのインストール方法はウェブ上にいっぱいあるので割愛

* SSHは鍵認証のみに
* システム最新化
* アップデートの自動化
* ファイアウォールの設定

あたりをやっておきましょう。

### Minecraft Server の準備

[便利なスクリプト](https://github.com/TheRemote/MinecraftBedrockServer)を公開してくれている人がいるようなので、ありがたく使わせていただきましょう。

sudoできるユーザーでスクリプトを実行します。

```
$ wget https://raw.githubusercontent.com/TheRemote/MinecraftBedrockServer/master/SetupMinecraft.sh
$ chmod +x SetupMinecraft.sh
$ ./SetupMinecraft.sh
  :
Enter a short one word label for a new or existing server...
It will be used in the folder name and service name...
Server Label: [適当な名前]
  :
Enter server IPV4 port (default 19132): 
Server IPV4 Port: 19132
  :
Enter server IPV6 port (default 19133): 
Server IPV6 Port: 19133
  :
Start Minecraft server at startup automatically (y/n)? y
  :
Automatically restart and backup server at 4am daily (y/n)? y
```

### ルーターの設定

Server IPV4 Port / Server IPV6 Port で入力したポートにインターネットからアクセスできるよう穴あけ・転送設定してあげましょう

### Minecraft から接続

あとは Minecraft から接続して遊びましょう。

Switchから接続する場合は[このあたり](https://novablog.work/be-join-any-server/)を参考にすると良いでしょう。
Unityにおけるコンフリクト解消について

以前開発している際にUnityでコンフリクトが発生したのでその時のメモです。今回紹介するのはあくまでも**解決方法**なので**詳しいgitの解説は載せていません**。

基本的な解消方法は他の言語でも同じですが、Unityで発生したコンフリクトが自分が知っている中では少し特殊だったのでこの記事で残します。

正直下記にあげる点が理解できるなら多分みなくて大丈夫です。

* 基本は通常のスクリプトの対処法と同じ.(Unity上からアクセスできます。)
* SceneやLibraryでコンフリクトが発生している際にはターミナルで移動してエディターを起動する必要がある。
* GitHub上でもできるが今回はコンフリクト件数が多かったため自力で解消



**先に言っておくとこれがベストではないので一つの選択肢としてみてください。**

## コンフリクトの発生

まずコンフリクトが発生するとどうなるのか？

Unity上で発生すると次のような画面になります。全てのオブジェクトがヒエラルキーから消えてしまいました。初めて遭遇したので消えたかと焦りました。

![Screen Shot 2020-12-26 at 13.02.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612696/0918dabe-9976-46da-0b82-6ebd3791e5ef.png)


そこでデバッグメッセージを確認するとやはりコンフリクトが発生していたようです。

![Screen Shot 2020-12-26 at 15.59.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612696/476a7c90-e76d-9bc6-745b-f3a93c555c75.png)


## コンフリクトの対処法

ではまずスクリプトの解消。ここは普通のコンフリクトと同じですが、念のため載せて置きます。

コンフリクが発生したスクリプトを見ると次のような文字列が発生しています。

**<<<<<<<<<<HEAD**, **>>>>>>>>>>>>>(特定の文字列）**間で囲まれた部分がコンフリクトの発生箇所です。間に**=========**という文字列があります。ここが対立している部分です。今回は下の部分を採用したいので**===上の部分**を削除します。

![Screen Shot 2020-12-26 at 13.07.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612696/57a772d4-0cae-c7a6-4eda-4fae9a9f2781.png)


![Screen Shot 2020-12-26 at 13.08.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612696/a52140f4-f3ac-ca56-9448-e4ac1793acee.png)


スクリプトは上の対処方法でやれば解決できます。

次にコンフリクトが起きているSceneの解決方法です。基本的にはスクリプトをいじればいいのですが、**unity上ではSceneを開くことができません**。なのでターミナルを開きます。

```terminal
$cd project/Assets/Scene
$ls
$DefultSetting.scene
$subl DefultSetting.scene
```

UnityのSceneまで移動してください。#今回自分はDefultSettingのSceneでコンフリクトが発生したのでそこまでいきます。lsコマンドで確認してみます。そうするとSceneのファイルがあります。そしたら何かしらのエディターを使用してそのファイルに入ります。自分はSublime使用しているので**sublコマンド**で入ります。
ファイルを覗いてみるとよくわからない文字列がズラーと並んでいます。後は先程のスクリプトの修正方法と同様＝＝＝の上の部分を削除します。この際に**空白もきちんと消してください（出ないとエラーが直らなかったので）**

![Screen Shot 2020-12-26 at 13.46.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612696/c2a28eef-842d-1f1d-035c-a0b8aa6845e4.png)


もしsublコマンドのPATHが通っていなかったら下記のかめさんというデータサイエンティストの記事を参考にしてください。わかりやすいです。

https://datawokagaku.com/what_is_path/


## 再度コミット

終了したら再度コミットします。これで終了です。

```terminal
git add .
git commit -m "Solve the conflict"
git push
```

量が多いのでこれが最善かと言われると微妙な部分がありますが、自分はこちらで対処しました。

半ば強引な所もあるのでないようによっては非効率な部分があると思います。

最後に参考になったサイトを紹介します。

## 参考資料

* https://www.udemy.com/course/unscared_git/

Git講座の大定番。このかたがコンフリクトが怖くないと言っていたら、多分諦めている

* https://forum.unity.com/threads/unity-seems-to-have-merge-conflicts-please-open-it-in-a-text-editor-and-fix-the-merge.589774/

この記事(回答)を参考に修正しました
リファラル制度による採用を受けて

# 本記事の目的
弊社入社を検討している方に**リファラル制度**について概要を知って頂くこと[^0]。

[^0]: BrainPad Advent Calendarは「分析」が主題ですが入社1年目ということもありこのような記事とさせて頂きました。今後、「混合計画問題によるスケジューリング最適化」、「コレスポンデンス分析」、「サーモカメラで遊ぶ」などの分析系の記事を書ければと考えています。

# はじめに
はじめまして。株式会社[ブレインパッド](http://www.brainpad.co.jp/)でデータサイエンティストをしているt-ymbysです。本記事では[BrainPad Advent Calendar](https://qiita.com/advent-calendar/2020/brainpad)の一環として私の自己紹介と弊社のリファラル制度について**簡単に**書かせて頂きました[^1]。

[^1]: 本当は物理学の話題「Holographic Entanglement Entropy」について書く予定でした。しかし、案件稼働により難しくなってしまった為、予定を変更し「リファラル制度」について簡単に書かせて頂きました。上記の内容についてはまた日を改めて書かせて頂きたいと思います。

私は文章を書くことが苦手なので全体を通して**箇条書き形式**をとらせて頂きました。

## 自己紹介
まず、本記事が私にとって初めてのQiita記事となる為、簡単に自己紹介をさせていただきたいと思います。

### 所属, 職種
- 株式会社ブレインパッド[[会社概要](https://www.brainpad.co.jp/)], アナリティクス本部, アナリティクスサービス部
- データサイエンティスト[[採用情報](https://www.brainpad.co.jp/recruit/recruit/career.php)]

### 社歴
- 大学、大学院時代の後輩の紹介（リファラル制度）で2020/04/01中途入社

### 業務内容
- 入社1ヶ月目:
    - 中途入社社研修
        - 資料公開＠[OpenBrainPad](https://brainpad.github.io/OpenBrainPad/)
- 入社2-4ヶ月目:
    - 研究PJ手伝い（某数理最適化）
- 入社5ヶ月目-現在:
    - 常駐PJ（某効果測定）

### その他弊社内での取り組み
弊社では以下のような勉強会（私が参加しているもののみ挙げさせて頂いております）を開催しており、常に視点、技術力の向上を目指しています:

- 論文読み会
- 勉強会
    - 統計学
    - 数理最適化

# リファラル制度による入社
## リファラル制度、メリット、デメリット
- リファラル制度とは、弊社社員の紹介[^2]で、弊社へ入社する制度。
- メリット
    - 被紹介者
        - 紹介者、及び、カジュアル面談の面談者から弊社業務の概要を知ってから職種、キャリアパスを検討し入社できる。
    - 弊社
        - 紹介者経由で被紹介者の人となりを知ることが出来、より高い精度での採用が可能。
- デメリット
    - 特にないと思いますが、複数社を同時に検討している場合、内定を断ることが精神的に負担となる可能性は挙げられるかもしれません。

[^2]: 紹介可能な関係は**カンファレンスで知り合った**位のカジュアルな関係から可能です。

## リファラル制度利用の流れ
- 紹介者、被紹介者がリファラル制度の利用を検討する。
- 紹介者が弊社へ申請する。
- カジュアル面談（紹介者、及び、面談担当者）を会食などの形式で行う。私の時の概要は以下の通り：
    - 志望理由
    - 経歴
        - 学歴、職歴、特出した経験
    - 希望するキャリアパス
- 面談後、面接へ進むか否か、また、応募職種を決定する。
    - 紹介者、カジュアル面談者が面接担当者へ面談結果を連絡
- 面接は1-3回程度行われる。
- その後の流れは通常の採用プロセスと同様だと思います。

## 採用時経歴
採用時の私の経歴は以下の通り：

- 年齢：31
- 学歴：博士（理学)
    - 専門：宇宙, 素粒子, 数理物理学
- 職歴：大学, 専門学校, 高等学校などで非常勤講師（現在も卒研指導をしています）。会社員としての業務経験はなし。

## 感想
私は27歳の時、博士号を取得し、その後様々な学校で非常勤講師として働く傍、自分の時間で研究活動を続けていました。そんな私が転職を考えた時、「会社員の経験を持たない自分に一体何ができるのだろうか」という不安でいっぱいでした。

しかし今回、後輩の助けがあり、このリファラル制度を利用したおかげで「自分はこういうところで貢献できるかもしれない」、「このようなキャリアパスを経るできるかもしれない」という可能性を見出すことが出来、入社を希望し、結果、採用して頂くことが出来ました。恐らく、単に面接を受けただけでは、私自身が「何に貢献出来」て、「どんなキャリアパスを経る」の分からなかったでしょうし、ブレインパッドとしても「この志望者はどのような人材なのだろうか」ということを分からなかったでしょう。

その意味でこの制度があって良かったと心から思っております。

# まとめ
弊社採用制度「リファラル制度」について概要を知っていただくことはできましたでしょうか。弊社に入社を検討されている方は遠慮なくご連絡いただければと思います。その他弊社内情報については[OpenBrainPadのTwitterアカウント](https://twitter.com/Open_BrainPad)などで発信しておりますのでそちらもご参照下さい。

最後に紹介をして頂いたS君、カジュアル面談を担当して頂いたKさん本当にありがとうございました。
Ruby学習#9 Math & Numbers

#9 Math & Numbers

puts 5
 >> 5
puts 5.76554
 >> 5.76554
puts -5.76554
 >> -5.76554

puts 5 + 9
 >> 14

puts 2 ** 3
 >> 8

puts 10 % 3
 >> 1

num = 20
puts ("my fav num " + num)
puts ("my fav num " + num.to_s)
 >> my fav num 20

num = -20
puts num.abs()
 >> 20
num = 20.487
puts num.round()
 >> 20
num = 20.687
puts num.round()
 >> 21

切り上げ ceil()
num = 20.1
puts num.ceil()
 >>21

切り下げ floor()
num = 20.9
puts num.floor()

num = 20.9
puts Math.sqrt()
puts Math.sqrt(36)
 >> 6
puts Math.log(1)
 >> 0.0

puts 1 + 7
>> 8
puts 1.0 + 7
>> 8.0
puts 10 / 7
>> 1
授業5回目：出力



# 参考サイト

[チャート式ruby-I(puts)](https://qiita.com/daddygongon/items/1b0f0ff3fb9d60418289)


# お題：Hello world

まず手始めということで Hello world を出力する.

```ruby
Hello world.
```

あとついでに入力した文字で出力結果が変わるようにする.

```ruby
> ruby hello_name.rb Rudy
Hello Rudy.
```


# 実装例

puts を使えば出力できる.

```ruby
puts "Hello world"
```

ついでの部分はこちら.

```ruby
puts "Hello #{ARGV[0]}."
```


# note

ruby で出力をするのにはいくつかの方法がある.
・print :普通に出力　改行が必要
・puts  :普通に出力　自動で改行
・p     :コーディング中にデバッグ作業として打ち出す時
・pp    :pのpretty print
・printf:c言語と同じ感じに



------
 - **source** ~/grad_members_20f/members/batamon-427/task5.org
NTTPCのVPS IndigoにSSHログインするまで

#はじめに
安くてお手軽なVPSは無いかな〜と探していたら、NTTPC WebARENAのVPSサービス[Indigo](https://web.arena.ne.jp/indigo/)が限度額付きの従量課金でなかなか安かったので、申し込んでみた。
お値段は[ここ](https://web.arena.ne.jp/indigo/price/)を参照のこと。
とりあえず、メモリ1GB、1vCPU、20GBで月上限318円（税込349円）。
上限に達するまでは時間単位(この場合0.5円（税込0.55円）/1時間)で課金されます。
Ubuntu18.04ですが、遊ぶには十分でしょう。

#アカウントを作成してindigoのダッシュボードへ

###SSH鍵の作成
![スクリーンショット 2020-12-26 16.05.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82975/17ac20e6-808f-38fb-3e6b-c22eb08d20f9.png)

インスタンスを作るには、まずSSH鍵が必要です。
左ペインのインスタンス管理から「SSH鍵」を選択し、SSH鍵を作成します。

作成すると、private_key.txtがダウンロードされます。
これは無くすと大変なので、無くさないように。

###インスタンスの作成
![スクリーンショット 2020-12-26 16.11.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82975/23ae79ce-1043-bcd6-f542-7d43cf46fe1e.png)
個人的にUbuntu18.04を選択し、一番安い1vCPU、メモリ1GB、SSD20GB、ネットワーク100Mbpsを選択。
先程作成したSSH鍵を指定してインスタンスを作成します。

ものの数分でステータスがインストール中からStoppedに変わり、インストールが完了。
![スクリーンショット 2020-12-26 16.14.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82975/e53b90f9-acc4-9a4f-3780-bb61c2870867.png)

###インスタンスを起動
「操作」から「インスタンスの起動」でインスタンスが起動します。
ここから課金がスタートすることになります。

###MacからSSHログインする
SSHからしかログインできないため、コンソールからはいじれません。
MacからSSHログインします。
参考：[MacのTerminalで「ssh 接続名」で SSH 接続](https://qiita.com/blendthink/items/d31e5c19751644129efc)
Macのターミナルを開きます。
「~/.ssh/secret_key」ディレクトリを作成し、そこに先程のSSH鍵を置きます。
先程SSH鍵を作成した際に、Downloadフォルダにprivate_key.txtがあるはずなので、コピーします。

```sh:
# 現在のユーザーで作成
$ mkdir ~/.ssh
# 所有者に読み・書き・実行権限を付与
$ chmod 700 ~/.ssh
# .ssh以下にsecret_keyディレクトリを作成
$ cd .ssh
$ mkdir secret_key
# SSH鍵をコピーする
$ cp ~/Downloads/private_key.txt ~/.ssh/secret_keys/
# 所有者に読み込み権限を付与
$ chmod 400 ~/.ssh/secret_keys/private_key.txt
```

```sh:
# .ssh/configファイルが無ければ作成
$ touch ~/.ssh/config
# ~/.ssh/configファイルを編集
$ pico ~/.ssh/config
```

```sh:~/.ssh/config
Host indigo <==これが接続名になる
    HostName ***.***.***.****
    User ubuntu
    IdentityFile ~/.ssh/secret_keys/private_key.txt
    Port 22
    TCPKeepAlive yes
    IdentitiesOnly yes
```
```
# 所有者に読み・書き権限を付与
$ chmod 600 ~/.ssh/config
```
###indigoにSSH接続できるか確認
接続名indigoはconfigの１行目に設定した名前

```sh:
$ ssh indigo
```
sshの鍵認証でしか接続できないが、初期ユーザーUbuntuのパスワード無しなどを修正すること。
FreeBSDのMIDI

[VALUESTAR](https://qiita.com/yamori813/items/2cdc2f8164e3973eb240)にはヤマハの[DS-1E](https://en.wikipedia.org/wiki/Yamaha_YMF7xx)(YMF754)というチップが入っていてこのチップにはXG音源が入っているのでどうなっているのか調べでみました。

YMF754はDOSの頃のSoundBlasterなどの互換もありもりもりです。

DS-1EのPCMのドライバはds1というコードがありPCMサウンドでは使えます。

FreeBSDにMIDIに関する情報は検索しても古いものがほとんどです。

12.2R現在のFreeBSDに入っているMIDIドライバは2003年にMathew Kannerさんが作られたコードのようです。

ドライバのインターフェースはカーネルソースのsys/dev/sound/midi/midifoi_if.mで定義されています。

このインターフェースは古式ゆかしいRolandのMPU 401由来のもののようです。ただMPU 401は本来時間管理もしてくれるインテリジェントなインターフェースでしたが、ノンインテリジェントなモードもあり、この仕様になっているようです。

MPU401はまだ8Bit CPUの頃に開発されたインターフェースで、ホストのCPUだと間に合わないので、時間管理はMPU401のほうで行っていました。その後PC-9801などでも使われるようになって、CPUが十分に(MIDIに対して)早くなって、MPU401の時間管理が必要なくなり、UARTモードが主に使われるようになりました。

MPU 401のインテリジェントなインターフェースはCV/GATE時代のシーケンサーのMC-4由来のようです。

![Roland-mc4b-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/d2b7196a-2200-09c9-4f7f-cfda13c8582b.jpeg)

CV/GATEはアナログ信号でしたが、シーケンサーはマイコンを使っていました。

MIDIはローランドが80年代に発案したもので、MIDIはMC-4を作ったエンジニアが設計したようです。当時ローランド社内にはMC-8を設計したエンジニアが作った仕様もあったようですが、当時の社長だった梯（かけはし）さんがMC-4由来の仕様をローランドとして押すことにしたようです。グラミー賞にもなったMIDIの開発ですがプロフィット5などを作っていたシーケンシャルサーキットとの共同開発になっています。しかしシーケンシャルサーキットはSCSIのようなパラレルの仕様で作っていて、梯さんがシーケンシャルサーキットを説得してMIDIが出来上がったようです。また当然当時ヤマハにも何らかの案があったのではないかと思われますが、MIDIの一号機をローランドではなくヤマハから出す事で説得したのではないかと想像されます。MC-4のエンジニアは音楽製作現場の意見を聞くために私が少しだけいたスタジオにちょくちょく来ていたようです。

MPU401の時間管理はかなり特殊で、それを使うとアプリケーションが自由に作れないなどの弊害もありました。

MIDIドライバのコードはmidifoi_if.hをincludeする必要がありますが、ds1.cではincludeされてないので、実装されてないようです。

残念

以下でも確認できるようです。

```
% cat /dev/midistat 
FreeBSD Midi Driver (midi2)
No devices installed.
```

~~よくよく調べてみるとDS-1EのXG音源はMPU 401インターフェースの先にあるのではなくてPCIに直接つながっているようです。おそらく仕様は公開されていないのでFreeBSDやLinuxで利用する事はできないと思われます。もってねの。だれっがしらべてくんねがの。~~

調べてくれるような奇特な人はいないと思われ、しかたないので調べてみています。

マニュアルやYMF724のデーターシートを見るとMPU 401はXG音源か外部かが選べて、おそらくデフォルトはXG音源ではないかと思われます。

![DSDOS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/d17e5feb-9831-84d5-308f-cab07c837ee9.png)

![XG.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/2cb8f0c8-9457-d479-974e-0ebdd7fad6f4.png)

上の図を見るとXGもSlot Managerに入ってるように見えますが、Slot Managerの資料にはXG関係の記載はありません。なんでだろう？

おそらく初期化さえできればXG音源としては使えると思うのですが。。。

サウンド関係の入力と出力を書いてみました。

![IO.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/fd69bc69-e90c-9909-02f1-d3c5477c5c72.png)

左が入力系で、右が出力系です。

ドライバをロードしないとCDAUDIOもライン出力から出ません。またロードすると出るという事は、CDAUDIOは特に設定しなくても大丈夫なのかもしれません。

PCのMIDIがソフトウエア音源に変わり始めた時期の製品ですが、DOSでもXGが使えるようなので、ハードウエア音源だと思うのですが。。。

参考になりそうなページがありました。

https://flaterco.com/kb/audio/PCI/index.html

YMF754のXG音源はDLSでydsxg.datかDsxgwave.tblのSound fontをダウンロードしないとダメそう。。。

DS1の事を調べているとロシア語のページが結構ある。

32KのPCIのメモリーマップのどこかでアップロードするものと思われるが、手順やオフセットの情報がまったく無いのでお手上げ。

ydsxg.datとDsxgwave.tblは同じものでした。誰かダウンロード方法を調べてください。

またいつかいじる事があるかもしれないので、とりあえず作ったコードを上げておきます。

https://gist.github.com/yamori813/b8913634566be3cdc4039fc75ede9561

ds1.cで40-41h: Legacy Audio ControlのLADをクリアするとMPU401が0x330に出てくるので試せます。
ActiveStorageについて

# はじめに
ActiveStorageについて、なかなか知識が定着しないのでメモとして。。
間違っている部分など、ご指摘いただけると助かります。

# ActiveStorageについて
ActiveStorageとは、Ruby on Railsに標準で装備されているGemであり、これを使うことで画像ファイル等のアップロードを簡単にするメソッドの使用や画像を保存するテーブルを簡単に作成することができるメリットがある。

# ActiveStorageを使用するには
ActiveStorageを使用するにあたって以下をインストールする必要がある。
・ImageMagick(コマンドラインで行える画像変換ツール)
　　  ->Gemではなくソフトウェアのため、Homebrewからインストールする
・mini magick（Rails上でImageMagickの機能を使用するためのGem）
・image processing(mini magickでは行えない画像サイズを調整するためのGem)
　　      ->上記二つに関しては、GemFileに記述後、bundle installを実行

# 忘れずに実行しよう
実行したいアプリケーションディレクトリにて、以下を実行することによって、ActiveStorage関連のマイグレーションが作成される

```
% rails active_storage:install
% rails db:migrate
```

# 最後に
ActiveStorageは、使えるようになるととっても便利かつ使える機会も多いかと思うので、習得出来るよう、たくさん使っていきたいと思います！