OmniAICreator/Qiita-1.07M huggingface dataset:
vueでMtGのカードっぽいコンポーネントを作って遊んだ

MtG(マジックザギャザリング)のカードっぽいデザインになるVueコンポーネントを作ってみた(作りかけ)の話です。こんな感じのができました。

![vue-mtg.png](https://qiita-image-store.s3.amazonaws.com/0/44722/cd438ac5-1788-ea1e-d7af-1c1a98b08611.png)

Vue側ではこんな感じで指定しています。

```vue
    <MtGcard
      cardName="遅刻許可"
      pictureSrc="https://pbs.twimg.com/profile_images/719895139146031104/XgAKgZvu_400x400.jpg"
      type="インスタント"
      expansion="scouty"
      cardText="記事1つを対象とし、その締切を1日伸ばす。"
    />
```

まだ作業中ですがコードはここに上げています。

https://github.com/denzow/VueMtG


### なんでやった？
最近社内でMtGが流行ってて、なんかそれに絡めて記事書きたいなと思った結果の残骸です。ちなみに、昨日からMtGのワールドカップが始まってて中継をずっと見てたら投稿日を遅刻しました。

### 振り返り

ほぼVueではなくCSSの調整だけな上にCSSは苦手なんですがどのように勧めていったかを振り返ります。基本的にはレイヤーを考えながらマークアップしていきました。

#### 大枠ぎめ

![vue-mtg-2.png](https://qiita-image-store.s3.amazonaws.com/0/44722/e17a440d-223d-98f0-a359-94afeb5b48de.png)

まずは、一番下のレイヤー(一番外側の要素)でカードと同じサイズの真っ黒な`div`を置きます。

```vue
<template>
  <div class="mtg">
    <div class="card-base">
    </div>
  </div>
</template>

<style lang="scss" scoped>
.card-base {
  width: 203px;
  height: 280px;
  border-width: 10px 10px 20px;
  border-color: #000;
  border-style: solid;
  border-radius: 15px;
  background-color: #000;
}
:
</style>
```

続いて、カード名や画像などの後ろ側にあたる部分のレイヤーを置きます。

![vue-mtg-3.png](https://qiita-image-store.s3.amazonaws.com/0/44722/55dbbec5-b845-1c86-8fb2-9efc777af1e6.png)

```vue
<template>
  <div class="mtg">
    <div class="card-base">
      <div class="card-background">
      </div>
    </div>
  </div>
</template>

<style lang="scss" scoped>
:
.card-background {
  border-radius: 4px 4px 15px 15px;
  background-color: #00AAFF;
  padding: 5px 2px 5px;
  height: 260px;
}
```

本当は本物のカードと同じようにテクスチャとか貼れるといいのですが、一旦諦めています。

#### コンテンツのマークアップ

背景部分の用意ができたので、カード名などの部分をざっくりと載せていきます。

![vue-mtg-4.png](https://qiita-image-store.s3.amazonaws.com/0/44722/89750036-08cb-b32d-bada-e73fb3b2630a.png)

なんとなくカードの雰囲気が出てきました。

#### マナコスト部分の対応
ここをさすがにちゃんとしていきます。

![vue-mtg-5.png](https://qiita-image-store.s3.amazonaws.com/0/44722/e727b767-d550-07c4-dcdf-0e356fc0890a.png)

画像をあてるのでもいいのですが、Font Awesomeにそれっぽいの(`fa-tint`)があったのでそっちを使います。

```html
            <span>
              <span class="mana fas fa-tint"></span>
              <span class="mana fas fa-tint"></span>
            </span>
```

`mana`というクラスには

```css
.mana {
  margin: 1px;
  width: 8px;
  padding: 1px;
  border-radius: 6px;
  background-color: #8eb9ff;
  box-shadow: -1px 1px 1px 1px rgba(0,0,0,0.8);
}
```

で、影を左側につけたりするなどして実際のマナコスト表記に近い雰囲気にしています。

### 画像のはめ込み対応

最終的に任意の画像のはめ込みをさせるようにしますが、枠の幅がきまっています。ここで`width:100%; height: 100%`にしようものなら、形の合わない画像のアスペクト比が狂って無残になります。

![vue-mtg-6.png](https://qiita-image-store.s3.amazonaws.com/0/44722/b4b48b6a-fce6-66d2-72e4-b909e6b7abbe.png)

画像を指定した高さ・幅で切り抜ければいいわけですが、これは`object-fit: cover;`を指定するだけで解決できます。

```css

.card-picture {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
```

これで以下のようにサイズが合わない画像でもいい感じに切り抜きしてくれます。

![vue-mtg-7.png](https://qiita-image-store.s3.amazonaws.com/0/44722/2a634f0a-0dc8-5e76-5d3c-7f98f4bdfe80.png)

### 最後に

ただただ、MtGのネタをやりたくてこんな記事になってしまいました。あとはここらへんのタスクが済んだらnpmにでも登録してみます。

* 青以外のカード・タイプへの対応
* マナコストの指定対応
* エキスパンションのロゴ対応

あと、そのうちオリジナルのカードをジェネレートするサービスを作ってみます。
kubeadmでノード追加時にunable to fetch the kubeadm-config ConfigMap: failed to get config map: Unauthorizedとなったときの対処方

# 事象

kubeadmでKubernetesクラスタを運用していて、**久しぶりに**ノード追加をしようと、新しいノードでkubeadm joinしたら``unable to fetch the kubeadm-config ConfigMap: failed to get config map: Unauthorized``というエラーになる場合があります。初期構築時の手順メモを参考に作業をすると発生します。

# 原因

ノード追加時のトークンがExpireされていることが原因です。新たにトークンを発行しなおしましょう。

# 手順

## トークンの確認

マスターノードのkubeadmコマンドで現在のトークンを確認します。トークンがEXPIREされていることがわかります。

```
# kubeadm token list
TOKEN                     TTL         EXPIRES                     USAGES                   DESCRIPTION                                                EXTRA GROUPS
######.###############   <invalid>   2018-12-02T21:51:32+09:00   authentication,signing   The default bootstrap token generated by 'kubeadm init'.   system:bootstrappers:kubeadm:default-node-token
```

## トークンの発行

トークンを追加発行します。

```
# kubeadm token create
######.###############

# kubeadm token list
TOKEN                     TTL         EXPIRES                     USAGES                   DESCRIPTION                                                EXTRA GROUPS
######.###############   23h         2018-12-17T01:33:08+09:00   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
######.###############   <invalid>   2018-12-02T21:51:32+09:00   authentication,signing   The default bootstrap token generated by 'kubeadm init'.   system:bootstrappers:kubeadm:default-node-token
```

トークンの有効期限は24時間のようですね。

この、新たに発行されたトークンを使ってkubeadm joinしてみてください。

以上です。
外資系の社内SEに転職して、Outsystemsと出会った(SQL叩いてみようよ編)

#想定読者

・Outsystemsを使いはじめた方


#自己紹介

世界最大級の総合人材サービス会社であるランスタッドでエンジニアを努めております。
社内の経営戦略に基づくWeb開発や制作、戦略立案などを中心に、企業収益を上げるアプローチを担当しております。
前職は少し畑が違く、フロムスクラッチというベンチャー企業でマーケティングオートメーションツールの開発を行っておりました。

最近はPayPayで4Kのテレビを購入し、大画面でスマブラSPをやっております。

#はじめに

私の投稿ではOutsystemsの環境構築や、実装の際にハマったポイントなどを共有していく予定です。

その第2弾はOutsystems開発の際の**「SQL」**周りを共有したいと思います。


# OutsystemsのSQL

OutsystemsでSQLを扱う時はキャプチャの赤線のSQLウィジェットを利用します。

![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/130275/739c1e6a-47a3-90f8-899f-724fcde1544c.jpeg)



# SQLを一回だけ流したい場合

SQLウィジェットをキックさせる方法は何個もありますが、今回は画面描画時（Preparation）時にSQLを流すようにします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/130275/58d60b80-d22b-6b1b-d1cf-2f8fd281762d.png)



まずはSelect

![image.png](https://qiita-image-store.s3.amazonaws.com/0/130275/3ff20b5b-54e9-6b24-9f50-9de27fcb6ff5.png)


【結果】
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130275/49668ee7-2348-1d7f-af2d-2a0ca451184e.png)


そしてDelete

![image.png](https://qiita-image-store.s3.amazonaws.com/0/130275/85b86f2b-e58d-97d3-5ef0-6305ef321e4c.png)


【結果】
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130275/bd2fcbfd-354c-425d-c707-221d62f05c4b.png)


こんな感じで、SQLを流すことができます。


#SQLウィジェットではなく、DBに直接SQL叩きたい場合はどうテーブルを指定するのか？
SQLウィジェット内で「テスト」を押下すると、Executed SQLにSQLが出力されるのでそれをそのまま叩いてください。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/130275/8601b07a-0539-6756-fa57-8e91f6e6079a.png)





# SQLを一度きりじゃなく定期的に流したい場合

Timersに新しく「DeleteSQL」を作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130275/8eceaf9a-e1b8-f22d-94a0-4e64a9da1628.png)

対象のアクションにSQLウィジェットを置きます

![image.png](https://qiita-image-store.s3.amazonaws.com/0/130275/504b1950-642c-6bef-0b78-dc146188a257.png)


ServiceCenterに移動

先程作成した、「DeleteSQL」が存在していることを確認。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/130275/87cca407-43fd-030e-4eca-48a0c4f0f707.png)

「DeleteSQL」に遷移すると実行周期を選択できるので、こちらでもろもろの設定

![image.png](https://qiita-image-store.s3.amazonaws.com/0/130275/0c333699-33b9-bbf9-b26b-a1617db470ab.png)


#終わりに

すごい初歩的な内容になってしまいましたが、
Outsystemsのこうゆう情報がぐぐっても落ちていないことがあるので、誰かの参考に慣ればいいかなって思います。


###<font color="royalblue">クリスマスまであと9日！</font>

次回もOutsystemsのコーディングについて書きます！
エッセンシャル ソフトウェア開発

みなさまこんにちは、れおりんです。この記事はQiitaの[YYPHP](https://yyphp.connpass.com/) Adventカレンダーの15日目の記事。

この記事では、全部の技術的な要素を説明することは時間的に難しいので、大事な用語を紹介することと、僕の勝手な意見を書いていこうとおもう。この記事はソフトウェア開発をこれからやる、もしくは少しやっているといった方が対象だ。なので技術的な詳細よりも完結で全体を把握のしやすさを念頭に置いている。

## 複雑さに立ち向かう

ソフトウェアを開発していると、不具合がでたり、新機能を追加したらバグったり、納期に間に合わなかったり、機能が足りなかったり色々な問題が起るとおもう。その問題はソフトウェアは複雑になりやすいという側面があるからだ。その複雑さを軽減する方法が日々世界中の偉い人が考えてくれている。ほんの少し、それらを紹介していこうと思う。

### オブジェクト指向

オブジェクト指向は、コンピュータの性能が上り、価格がどんどん安くなったとき、徐々に大規模になっていったソフトウェアが従来の手法ではコードが複雑になりすぎて開発コストが大幅に上昇してしまった際に考えだされたものだ。

オブジェクト指向を*正しく*使うと、不具合が少なく、機能が追加しやすいソフトウェアが作れる可能性が高くなる。

オブジェクト指向は、プログラミングにおける所謂 "パラダイム(Paradigm)" だ、パラダイムとは哲学的に言うと、

> （科学上の問題などについて）ある時代のものの見方・考え方を支配する認識の枠組み。

となっている。他にもパラダイムはある、たとえば"手続き型プログラミング"や、"構造化プログラミング"や、"関数型プログラミング"などがある。様々なパラダイムがあり、どれも長所があるので興味があれば調べてみてほしい。

書いたプログラムが、どうなっていればオブジェクト指向だという明確な決まりがあるわけではないところがオブジェクト指向の理解されにくいところだ。たとえば多くのウェブアプリケションフレームワークでは、コントローラやモデルとなる機能を作るときにはクラスを使っているだろう。このコントローラやモデルをクラスで作ったからといってオブジェクト指向になっているわけではないので注意してほしい。

じゃぁどうなっていたらオブジェクト指向で書けていると言えるのだろうか? これは人によって答えが異なるところかもしれないが、僕としては、"作りたいシステムの概念が、適切なクラスとして表現され、複数のクラスが理路整然と配置され協調して動作しているコード" を実現できていればある程度オブジェクト指向で書けているとおもう。

オブジェクト指向の他にもパラダイムがあるが、ひとつのパラダイムだけを採用できるということではない。複数のパラダイムを適材適所で組み合わせてソフトウェアを構成することができる。

#### オブジェクト指向における"SOLID"原則

SOLID(ソリッドと発音する)は、Robard C Martinが提唱しているオブジェクト指向における原則だ。このSOLID原則を正しく守るとオブジェクト指向の強みを活かしたコードが書けるようになる。もちろんSOLIDだけを守っていればよいというものでもないが、オブジェクト指向の考えかたに慣れていない場合は、まず忠実に守ってみると、この原則の良いところから、オブジェクト指向の理解が深まるとおもう。SOLIDの詳細については本記事では詳細すぎるため割愛する。

### 設計手法

### 決定はできるかぎり遅らせる

ここでいう決定とは、技術的な決定だ。例えばデータの永続化にRDBMSを使うか、NoSQLを使うかといったことや、なにかしらの情報をユーザへ伝えるときにメールを使うとか、MMSを使うとかいったことだ。

### DDD

DDDはドメイン駆動設計(Domain Driven Design)の略称だ。ここでいう、"ドメイン" という言葉は、ブラウザのURLで使われるドメイン名とは別のものだ。"ドメイン"という言葉そのものは、"領域"とか"分野"という意味になる。ドメインとは現実世界の"実体(Entity)"を認識しシステムを構成していく。

ドメイン駆動設計の、"ドメイン" は、作りたいシステムや業務の中核となる概念を中心に据えた設計を行うということだ。

ドメイン駆動設計には、チーム構成や組織の構造を考慮したソフトウェアのアーキテクチャを設計する戦略設計と、技術的にどう実装していくかという戦術設計がある。

DDDは戦略設計だけでも、戦術設計だけでも実践をはじめることができる。チームやシステムの規模が大きいときは戦略設計から導入すると効果が大きくなるだろう。

シンプルなアプリケーションではDDDを導入すると逆に複雑さが増すだけという結果になることが多い。また、DDDには深いドメインの知識が必要になるため対象システムの知識が少なすぎる場合には導入に注意が必要だ。もしそれでも導入する場合は、知識が少い中でプロジェクトを進めるとコードへの変更が多く入ることになる。こうおもっていたけど、実は違ったなどだ。この問題に対処するためには、データベースや技術的な実装はせずに、ドメインモデルだけを実際に動作させることだ。ドメインモデルしかなければ変更が入ったときにも変更する部分が少なく対応が早くなる。

### レイヤードアーキテクチャ

レイヤードアーキテクチャは、クラスを役割毎に各層に分類する方法だ。各層は、自分より下位の層か、上位の層のことしか認識しない。そのため、各層をごっそり入れ替えることも可能になる。たとえばTCP/IPやOSI参照モデルのレイヤーでは、IPの伝送がWi-Fiで行われているか、有線LANで行われているかは気にせずに通信ができる。これがレイヤードアーキテクチャの利点だ。

役割を層に分割すると、各層ごとに実装することが明確になるため複雑で大きいソフトウェアを整理しやすくなる。

### オニオンアーキテクチャ

オニオンアーキテクチャは、レイヤードアーキテクチャと似た概念だが、オニオンアーキテクチャでは層の依存は求心方向のみの依存のみを許す。

### クリーンアーキテクチャ

クリーンアーキテクチャはオニオンアーキテクチャの各層について、下記の4層に役割を分割したものだ。

中心から、

* 実体達(Entities)層
* ユースケース層
* コントローラ/ゲートウェイ/プレセンター層
* ウェブ/UI/デバイス/DB/外部インタフェイス層

となっている。

## 開発プロセス

アジャイルとスクラムについて書きます。(あとで)

## 色々な原則

あとで書く。

* SOLID
* DRY
* YAGNI
* 驚き最小の法則

## プロとしての態度

転職してスキルアップしたいとか、会社が本を買ってくれないとか、そういう意見を耳にするが、それは完全に間違っている。自分のキャリアを会社に頼ってはいけない。スキルアップは自分でするものだし、勉強するための書籍などは自分で購入する必要がある。

## どうやって勉強していくか

あとで書く。

## 見積

期間・品質・機能のトレードオフについてあとで書く。

100%正しい見積を出すには、実装するのと同じ期間がかかる。
SketchとXcodeのlineSpacingの定義が違ってデザインに手こずった話

SketchのlineSpacingを、XcodeでもlineSpacingとして指定するとデザインが異なり手こずった。
結論を先に言うと**XcodeのlineSpacingは、(SketchのlineSpacing) - (フォントサイズ)　を指定し、かつUILabel自体のY PositionをlineSpacingの半分、下げる**

#XcodeのlineSpacingの定義
>The distance in points between the bottom of one line fragment and the top of the next.

すなわち行の下から次の行の上までの距離です。
https://developer.apple.com/documentation/uikit/nsmutableparagraphstyle/1528742-linespacing

#XcodeのlineHeightMultipleの定義
>The line height multiple.

すなわち行の高さです
https://developer.apple.com/documentation/uikit/nsparagraphstyle/1528614-lineheightmultip

#SketchのlineSpacingの定義

![image.png](https://qiita-image-store.s3.amazonaws.com/0/118756/f091869b-dfd6-67d0-a81d-b7789592565b.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/118756/abaf563e-ae09-ca2a-8527-66af900c3bdf.png)
SketchのlineSpacingは、**フォントの実体としてのサイズ＋行間の空白のサイズ**です
そのため上の画像のように行の中心から次の行の中心が30ptとなっていることが分かります
http://gomaapps.blogspot.com/2015/07/sketch_20.html

#lineSpacing、lineHeightMultipleとSketchのlineSpacingの略図
![IMG_8749.jpg](https://qiita-image-store.s3.amazonaws.com/0/118756/5a5adb1d-658e-221d-b96c-ca15e4154765.jpeg)

#XcodeとSketchのlineSpacingの開始行のポイントの違い
![スクリーンショット 2018-12-12 14.05.06.png](https://qiita-image-store.s3.amazonaws.com/0/118756/648f4827-01d4-0390-5ac6-79461d46280d.png)
以上を踏まえSketchのlineSpacingからFontSizeを引いた値をXcodeでlineSpacingとして指定してみる。
それでもSketchに比べXcodeのlineSpacingではテキストの開始行が下がっていることが分かる。

#現実的な対処方法
XcodeのlineSpacingは、(SketchのlineSpacing) - (フォントサイズ)　を指定し、かつUILabel自体のY PositionをlineSpacingの半分、下げる
![スクリーンショット 2018-12-12 14.41.18.png](https://qiita-image-store.s3.amazonaws.com/0/118756/3f23d0c1-3ff0-9e3f-5217-2cf687fb678c.png)

　###ちなみに実装では、以下のようなUILabel+Extension.swiftで指定していた

```swift:UILabel+Extension.swift
extension UILabel {

    func setLineSpacing(lineSpacing: CGFloat = 0.0, lineHeightMultiple: CGFloat = 0.0) {

        guard let labelText = self.text else { return }

        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = lineSpacing
        paragraphStyle.lineHeightMultiple = lineHeightMultiple

        let attributedString:NSMutableAttributedString
        if let labelattributedText = self.attributedText {
            attributedString = NSMutableAttributedString(attributedString: labelattributedText)
        } else {
            attributedString = NSMutableAttributedString(string: labelText)
        }

        // (Swift 4.2 and above) Line spacing attribute
        attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))


        // (Swift 4.1 and 4.0) Line spacing attribute
        attributedString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))

        self.attributedText = attributedString
    }
}
```
参考
https://stackoverflow.com/questions/39158604/how-to-increase-line-spacing-in-uilabel-in-swift/39158698
上記のようなUILabel+Extensionを利用した。
Rustのconst fn

この記事は [Rustその2 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/rust2) の15日目の記事です。

記事を書くときに使用しているRustのバージョンは1.31.0です。


# `const fn`とは
Rust 2018から使えるようになった定数を返す関数。
実行時に呼び出すこともできるなどC++のconstexprに似ている。

---
コンパイル時呼び出し

```rust
const fn const_fn() -> i32 {
    0
}

fn main() {
    const V: i32 = const_fn(); // 定数を返す
    assert_eq!(V, 0);
}
```


実行時呼び出し

```rust
const fn const_fn() -> i32 {
    0
}

fn main() {
    let v: i32 = const_fn();
    assert_eq!(v, 0);
}
```


## 引数

引数を受け取る事もできる。

```rust
const fn const_fn(a: i32, b: i32) -> i32 {
    a + b
}

fn main() {
    const V: i32 = const_fn(1, 2);
    assert_eq!(V, 3);
}
```
引数は参照で受け取ることもできるが`mut`で受け取ることはできない。
ライフタイムを指定することはできる。

## 制限
追記: 2020/08/29
1.46.0時点でかなりの制限がなくなったためこの項目の内容は「過去のバージョンは制限が多くて大変だったんだな」くらいの気持ちで読んでください。

---


関数内で`if`などを使おうとすると下記のようなエラーが出る。
```error: `if`, `match`, `&&` and `||` are not stable in const fn```

つまり`if`も`match`も`&&`も`||`も使えないので。

```rust
const fn is_even(v: i32) -> bool {
    v != 0 && v % 2 == 0
}
```
こんな関数もコンパイルエラーになる。
ただし`&`は使えるので下記は問題ない。

```rust
const fn is_even(v: i32) -> bool {
    (v != 0) & (v % 2 == 0)
}
```

エラーメッセージには表示されていなかったが`loop`も`while`も使えない。
関数内で定数は定義できるが変数は定義できない。

```rust
const fn const_fn() {
    const V: i32 = 0; // OK
    let v: i32 = 0;   // Error
}
```
変数が使えないので`for`も使えない。
関数の引数を`&mut`することもできない。

### 使えないもの
 - `if`
 - `match`
 - `loop`
 - 変数
 - `for`(変数が使えないので)
 - `&&`
 - `||`
 - 関数の引数を`&mut`にする
 - 関数内部で`const fn`ではない関数を呼び出す
 - 関数ポインタ

# 感想
使い所がかなり限られる。
というか自分は使うことがなさそう。
使い所があれば誰か教えてください。

C++11のconstexprは条件演算子とかオーバーロードとかで多少複雑な処理ができたがRustだとそれもできない。

--- 
わかったことが増えたら追加すると思います。

# 追加
##`abs`の実装はできた。
[Rustのconst fnでabs](https://qiita.com/block/items/8a4aadd1f25c1ac9ad21)

## 1.33.0で一部の制限が緩和された
[Rustのconst fnの制限が緩和された(Rust 1.33.0)](https://qiita.com/block/items/a7743ab456048db992f2)

## 1.46.0でさらに制限が緩和された
[Rustのconst fnの制限がさらに緩和された(Rust 1.46.0)](https://qiita.com/block/items/de9ecbb4d102eaa35ac8)
Unityでの3Dモデル最適化

完全にメモです…。

随時追加しようと思います…

要はいかに動的に物理メモリを使わず…
また、CPU処理をしないかです。
GPUはグラボさえあれば余裕を持て余して動作しています。

※スマホ向けではありません

最適化はこちらの書籍が最強です。
![](https://images-na.ssl-images-amazon.com/images/I/51Z1aU4QKUL._SX404_BO1,204,203,200_.jpg)
https://www.amazon.co.jp/Unity-2017-Game-Optimization-performance/dp/1788392361

#Unityで3Dモデル作成についての注意点

#重さ
処理的にはBatches数が一番重い原因となります。

Unityのゲームビューの右上にあるStatsで見れます
![レイヤー4.png](https://qiita-image-store.s3.amazonaws.com/0/308905/6399a2e5-d6c6-9ad6-fd5e-b715f51f7fa5.png)

基本的には
Batches数≒Σ[k=1..オブジェクト数]（そのオブジェクト事のマテリアルの数）
たぶん…

簡単に言えばオブジェクト増やさず、マテリアルも増やさずといった感じです…

（ライトの影響を受けるたびにオブジェクト事で動くためです。）
ライトの影を消すと同じマテリアルなら結合されます。


これと比べるとポリゴン数の１万程度なら誤差といってもいいです。
ポリゴン数が重いと重いのはCPUがGPU（シェーダー）情報を渡す処理の情報量が増えるのが重いのかな

Vtuberの目安としてはキャラ全体で200程度だと思います。
VRChatは100以下頑張ろう！

メッシュベイカーは劣化するので自分で対応しよう！！！

依存のVtuberで配布されてるデータはMMDがほとんどなのでオブジェクト結合されており
ほとんど100以下ではあります。

昔書いた記事です。
[11日目：Unityの最適化について](http://www.rcc.ritsumei.ac.jp/?p=7580)

ちなみにスマホゲームは全体で100以下が目安ですw
シェーダー側で対応したりしてたりするみたいです。


Profilerを見るのはハードルが高いので置いておきます…
とくにテクスチャメモリですね…

#ウェイトに関して
インフルエンス数は上限最大４です。

#コメントいただけると
追記します！！！！
【Rails】herokuへのデプロイでPrecompiling assets failed.の原因はjsファイルのバッククォートだったって話

##事象
herokuデプロイしようとしたら
`Precompiling assets failed.` と表示されデプロイがrejectされた。
asset周りを調べるも悪戦苦闘。

##error messageをよく見て見たら

```
ExecJS::RuntimeError: SyntaxError: Unexpected character '`'
```
というメッセージがあった。
つまりjsファイルでバッククォート(`)使っちゃいけないって事ですね。
javascriptではバッククォートの囲いの中で変数展開できるので便利だけど、herokuでデプロイする際は落とし穴ってことでした。

```main.js
$('#vid').text(`vid:${vid}`);
```
↑こんな感じの記述してたんですね。

##結果
jsファイルのバッククォート(`)使わないで記述したらデプロイできるようになりました。
バッククォート使ってハマる人多いんじゃなかろうか。。。
暗号化とハッシュ化に関する紛らわしい用語のメモ

## ハッシュ（hash）

ハッシュ値そのもの、またはハッシュ値を求めること。ハッシュ化、ハッシュ関数など様々な呼ばれ方をする。ざっくりいうと、ある入力を与えるとある出力が返ってくる、同じ入力を与えると必ず同じ出力が返ってくる、逆方向の計算が難しい、というような性質を持つ。

```
# ハッシュ化の例
hash('こんにちは。') -> 'foa528nsfg989eyj'
```

プログラミング言語によってはハッシュと呼ばれるデータ構造を持つものがあるが、これは似ているけど違うもの（であることが多い）。

## 暗号学的ハッシュ関数

ハッシュ関数のうち、ハッシュ値から入力を求めることが不可能、同じハッシュ値となるような異なる2つの入力を求めることが不可能、というような性質を満たしたものを暗号学的ハッシュ関数と呼ぶ。（とても簡略化した説明）

この場合の不可能とは、「現実的な時間内におさまらない」というような意味。

## md5
ハッシュ化のアルゴリズムの一つ。同一のハッシュ値になる異なる入力を求めることが可能なため、現在は暗号化に利用することは危険。

## sha1
ハッシュ化のアルゴリズムの一つ。こちらもmd5と同様の理由で暗号化へ利用することは危険。

## sha2
ハッシュ化のアルゴリズムの一つ。sha1を改良し、出力されるハッシュ値の長さを長くしたもの。

## ダイジェスト（digest）
ハッシュとほぼ同じ意味。

## メッセージダイジェスト

ダイジェストとほぼ同じ意味だが、「送受信されたデータの内容を保証するために、事前にハッシュ値を求めておき、後で比較検証できるようにする」というようなニュアンスが加わると、ハッシュではなく（メッセージ）ダイジェストと呼ばれたりする。

Rubyだとhmacを実現するメソッド名になっている。


## hmac

電子署名の方式の一つ。ざっくりいうと鍵付きのハッシュ。

秘密鍵とハッシュ関数を組み合わせる手法によっては、セキュリティホールが発生する可能性がある。このようなセキュリティホールがないことが証明されている組み合わせ手法のことをhmacと呼ぶ。

```
# あまりよろしくないパスワード（≒秘密鍵）の使い方の例
hash('こんにちは。' + 'パスワード') -> 'foa528nsfg989eyj'

# よい使い方の例（hmacの実装は言語依存）
hmac('こんにちは', 'パスワード') -> 'foa528nsfg989eyj'
```

[参考リンク](https://www.machu.jp/diary/20060725.html)

## 電子署名とhmacの違い

両方とも文章の改ざんを検出するために用いられるという点は同じで、鍵の取り扱いが異なる。

公開鍵暗号方式を用いるのが電子署名。本人しか持っていない秘密鍵を用いて署名し、公開されている公開鍵で誰でも検証できる。それに対して、hmacでは共通の秘密鍵を用いる。

## 秘密鍵と公開鍵の関係

秘密鍵から公開鍵を作成することは簡単にできる。その逆はとてもむずかしい。

## 公開鍵暗号

自分しか持っていない秘密鍵と全体に公開された公開鍵を用いた暗号化の総称。

## 共通鍵暗号

自分と相手の両方が持っている秘密鍵を用いた暗号化の総称。

## 電子署名

改ざんやなりすましを防ぐために利用する技術の総称。

## 電子署名と暗号

何かしらの鍵を使って入力されたデータを別の形式に変換するという意味では同じ。電子署名と言った場合、誰でも中身を見ることができる。暗号と言った場合、中身は鍵を持つ人しか見ることができない。

## RSA暗号

公開鍵暗号を利用した暗号化方式の一つ。

## DES暗号

暗号化の規格、または、その規格を満たすアルゴリズムのこと。標準としてのDESとアルゴリズムを区別する場合は、アルゴリズムをDEAと呼ぶ。

## 楕円曲線暗号

楕円曲線を利用した暗号方式の総称。公開鍵暗号方式を利用したものが多い。
RSpecの初期設定メモ

RailsのRSpecの初期設定を毎回既存のプロジェクトからコピーしてくるのが億劫になってきましたので、メモしておきます。

## インストール
```ruby:Gemfile
group :development, :test do
  gem 'rspec-rails'
  gem 'factory_bot_rails'
  gem 'rails-controller-testing'
end
```

```bash
$ bundle exec rails generate rspec:install
      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb
```

- テスト

```bash
$ bundle exec rspec
No examples found.

Randomized with seed 34242


Finished in 0.00111 seconds (files took 0.64233 seconds to load)
0 examples, 0 failures

Randomized with seed 34242
```

## 便利設定
- 出力結果を見やすくする

```ruby:.rspec
--require spec_helper
--format documentation
```

- spec/support以下のファイルの読み込みができるようにする

```ruby:spec/rails_helper
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f } # コメントアウトを外す
```

- TEST DBへMigrationを掛けていないときに自動でMigrationするのではなく、アラートを表示

```ruby:spec/rails_helper
ActiveRecord::Migration.check_pending!
# begin
#   ActiveRecord::Migration.maintain_test_schema!
# rescue ActiveRecord::PendingMigrationError => e
#   puts e.to_s.strip
#   exit 1
# end
```

```bash
$ bundle exec rspec
・・・
Migrations are pending. To resolve this issue, run:

        bin/rails db:migrate RAILS_ENV=test
```

- Factory_botのメソッドの名前空間の省略

```ruby:spec/support/factory_bot.rb
RSpec.configure do |config|
  config.include include FactoryBot::Syntax::Methods
end
```

```ruby:seeds.rb
require 'factory_bot'
include FactoryBot::Syntax::Methods
FactoryBot.definition_file_paths = [ Rails.root.join('spec', 'factories') ]
FactoryBot.reload
```

```ruby
user = create(:user) # FactoryBot.create(:user)でなくてOK
```

- 現在時刻の時間をずらす(travel_to)

```ruby:spec/rails_helper
config.include ActiveSupport::Testing::TimeHelpers # 追記
```

```ruby
decsribe "Time.current" do
  it do
    travel_to('2018-12-16 8:00'.to_time) do
      expect(Time.current).to eq(Time.new(2018, 3, 10, 8, 0, 0))
    end
  end
end
```

- テスト実行毎にデータベースを初期化する

```ruby:Gemfile
group :test do
  gem 'database_rewinder'
end
```

```ruby:spec/support/factory_bot.rb
RSpec.configure do |config|
  config.before(:suite) do
    DatabaseRewinder.clean_all
  end

  config.after(:each) do
    DatabaseRewinder.clean
  end
end
```

- テストの順番をランダムにする

```ruby:spec/spec_helper.rb
config.order = :random # 最終行に追加
```
- 同じ順番を再現したい場合

```
$ bundle exec rspec
・・・
Randomized with seed 14925
$ rspec -fd --order rand:14925 # 実行結果のseedの番号を指定
```

- テストを自動化する(guard)

```ruby:Gemfile
group :development, :test do
  gem 'guard-rspec', require: false
end
```

```bash
$ bundle
$ bundle exec guard init rspec
$ bundle exec guard
```
Swiftのメソッドチェーンを使って快適にデザイン適用する

この時期になると今年こそAdvent Calender参加すればよかったなー、と思いますが翌年には忘れてて埋まってる、というのを繰り返している。。

普段個人の開発ではコードでデザイン適用をすることが多いのですが、煩雑になりがちなコードをメソッドチェーンを使って快適に記述しようというお話（＋それを実現するOSSを作った話）です。

# 課題: コードによるデザイン適用の煩雑さ
通常、コードでデザインを適用する際には以下のような記述になることが多いと思います。

```swift
    let sampleLabel = UILabel()
    sampleLabel.backgroundColor = .yellow
    sampleLabel.text = "sample label"
    sampleLabel.textColor = .green
    sampleLabel.textAlignment = .center
    sampleLabel.font = .boldSystemFont(ofSize: 30.0)
    sampleLabel.numberOfLines = 0
```

この書き方だと何度も`sampleLabel.~` のような記述をするのが煩わしいですし、コードの見通しも悪くなるような気がします。

# クロージャーを使うパターン
そこで、例えば自分で以下のようなメソッドを定義して、クロージャー内で対象にスタイルを適用するのは良いテクニックです。

```swift
    extension UILabel {
        func apply(_ closure: (_ this: UILabel) -> Void) -> Self {
            closure(self)
            return self
        }
    }

    sampleLabel.apply { this in
        this.backgroundColor(.yellow)
        this.text("sample label")
        this.textAlignment(.center)
        this.textColor(.green)
        this.font(.boldSystemFont(ofSize: 30.0))
        this.numberOfLines(0)
    }
```

これでもコードをパッと見た時には十分纏まっていて普通に記述するより良さそうです。
ただ、毎回クロージャーを書いて中で記述するのは少し手間です。`this.~`のように書かないといけないのは通常時と変わっていません。

# メソッドチェーンを使うパターン
Swiftではメソッドチェーン使ってさらに簡潔な記述が出来るはずです。

そう考えて作ったのが[ApplyStyleKit](https://github.com/shindyu/ApplyStyleKit)です。
https://github.com/shindyu/ApplyStyleKit
<img width="942" alt="applystylekit.png" src="https://qiita-image-store.s3.amazonaws.com/0/130686/2e497694-aaca-5564-df2e-b65514378b9d.png" style="border:1px solid #0000ff;">


ApplyStyleKitを使うと、以下のようにメソッドチェーンを使ってスタイル適用のコードを記述していくことができます。

```swift
    sampleLabel.applyStyle
        .backgroundColor(.yellow)
        .text("sample label")
        .textAlignment(.center)
        .textColor(.green)
        .font(.boldSystemFont(ofSize: 30.0))
        .numberOfLines(0)
```

特徴としては、applyStyle及びその後に続くメソッドがUIViewを直接返すのではなく、UIViewを要素に持つ別のオブジェクト(StyleObjectという名前で定義)を返す点です。

以下のコードがその実装部分になります。

```swift

public protocol ApplyStyleProtocol {
    associatedtype StyleCompatible
    var applyStyle: StyleObject<StyleCompatible> { get }
}

extension ApplyStyleProtocol {
    public var applyStyle: StyleObject<Self> {
        return StyleObject(self)
    }
}

public struct StyleObject<Base> {
    let base: Base

    init(_ base: Base) {
        self.base = base
    }
}
```

あとはUIKitのUIViewやUILabelのプロパティに対応するメソッドをStyleObjectのextensionで泥臭く実装していくだけです。

こうすることで既存のメソッドやプロパティと混ざることなく、.applyStyleとした場合のみ対応するメソッドが使えるようになり、Xcodeの補完を汚すことなくコードを記述することができます。
ApplyStyleKitで記述した結果を通常のスタイル適用コードと見比べると、対象の要素名が一度しか登場しないためスッキリした記述になったと思います。

このインターフェースを実現する方法を考えていたときにRxSwiftの.rxの記述が似ているなと思ってソースコードを見てみると、まさにやりたかったことをとても少ない行数のコードで実現していたので参考にさせてもらいました。


# まとめ
1. メソッドチェーンを用いたスタイル適用コードが記述できるOSSを作りました。実装も特に複雑なことはしていないので、ソースコードを読んで良ければ是非使ってみてください。

2. 実現したいコードの実装が思いつかないときは、理想に近いインターフェースを提供しているOSSなどのコードを読むと得るものが多かったです。実際、RxSwiftの該当部分のコードを読んだ時は美しくて感動しました。また、目的無くOSSのコードを全て読むのは結構大変ですが、自分のやりたいポイントが分かっていれば、スッと理解できるのでオススメです。

ApplyStyleKitは作ったばかりで対応していないUI Kitも多いのですが、拡張自体は比較的簡単にできると思っています。よければContributeやStarお待ちしています。それでは。
[UE4] UDebugDrawService による2Dデバッグ描画 (C++)

#概要
C++ で2Dのデバッグ描画を行うサンプルです。
UDebugDrawService の機能を利用しています。

↓のスクリーンショットの 赤字や青と緑のライン、薄い白の四角の表示部分です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/86339/7fc78b39-30d0-5436-a2fc-44b7c057ed11.png)

#手順
デリゲートを作成して登録。指定した関数が毎フレーム呼ばれます。

```cpp
auto drawDebugDelegate = FDebugDrawDelegate::CreateUObject(this, &ADebugDraw2dSampleGameModeBase::Draw);
if (drawDebugDelegate.IsBound())
{
	this->DrawDebugDelegateHandle = UDebugDrawService::Register(TEXT("GameplayDebug"), drawDebugDelegate);
}
```

登録した描画関数は UCanvas が渡ってくるので、これに対して描画コマンドを登録します。

```cpp
// 呼び出される描画関数.
void ADebugDraw2dSampleGameModeBase::Draw(UCanvas* InCanvas, APlayerController* InPC)
{
	// font 描画.
	{
		FCanvasTextItem item(FVector2D(32.0f, 64.0f), FText::FromString(TEXT("abcdefg")), this->FontObject, FLinearColor::Red);
		InCanvas->DrawItem(item);
	}

	// line 描画.
	{
		FCanvasLineItem item(FVector2D(28.0f, 110.0f), FVector2D(90.0f, 110.0f));
		item.SetColor(FLinearColor::Blue);
		InCanvas->DrawItem(item);
	}
}
```

フォント描画を行う場合、UFont が必要です。
↓はコンストラクタで事前にロードする例。

```cpp
ADebugDraw2dSampleGameModeBase::ADebugDraw2dSampleGameModeBase()
{
	static ConstructorHelpers::FObjectFinder<UFont> font(TEXT("/Engine/EngineFonts/Roboto"));
	FontObject = font.Object;
}
```

終了時は、登録したデリゲートを解除します。

```cpp
if (this->DrawDebugDelegateHandle.IsValid())
{
	UDebugDrawService::Unregister(this->DrawDebugDelegateHandle);
	this->DrawDebugDelegateHandle.Reset();
}
```

font と　Line 以外にも Tile / Box / Triangle 等あるのが CanvasItem.h を見ればわかります。



#サンプルプロジェクト
https://github.com/jdenden/DebugDraw2dSample

このサンプルプロジェクトのコードでは GameMode 上で実装していますが、Actor派生でもComponent派生でも組み込めると思います。

#動作確認環境
UnrealEngine 4.21.1
Visual Studio Community 2015

#最後に
3Dのデバッグ描画は、DrawDebugHelpers.h にある DrawDebugLine や DrawDebugString があるのがすぐに見つかりました。

```cpp:DrawDebugHelpers.h
ENGINE_API void DrawDebugLine(const UWorld* InWorld, FVector const& LineStart, FVector const& LineEnd, FColor const& Color, bool bPersistentLines = false, float LifeTime=-1.f, uint8 DepthPriority = 0, float Thickness = 0.f);
ENGINE_API void DrawDebugString(const UWorld* InWorld, FVector const& TextLocation, const FString& Text, class AActor* TestBaseActor = NULL, FColor const& TextColor = FColor::White, float Duration = -1.000000, bool bDrawShadow = false, float FontScale = 1.f);
ENGINE_API void DrawDebugSphere(const UWorld* InWorld, FVector const& Center, float Radius, int32 Segments, FColor const& Color, bool bPersistentLines = false, float LifeTime=-1.f, uint8 DepthPriority = 0, float Thickness = 0.f);
```

しかし、C++ のみで簡単に実現する2Dでのデバッグ描画はあまり情報がなく、この手法を知る前は、UMG の Widget を C++ 上で作成してそれに描画とかしていました。
UDebugDrawService を利用する方がかなりシンプルになります。

しかし、あくまでデバッグ用の描画なので、Shipping や Test ビルドなどでは無効になるようにしておくのが良いかと思います。
nil? empty? blank? present? exists? メソッドを状況に応じて使い分けよう[Rails]

#**はじめに**
railsアプリを開発している際、`nil?`、`empty?`、`blank?`、`present?`、`exists?`の使い分けに迷う時がありましたので、ここに、頭の整理のために備忘録としてまとめておきます。

[nil? empty? blank? present? の使い分け](https://qiita.com/somewhatgood@github/items/b74107480ee3821784e6)
こちらの記事にそれぞれの使い分けが載っておりますので、本投稿では開発においての使用場面にフォーカスしてまとめていきます。

#**使用状況別に考察する**

##**データベースからデータを取得する際(前)**

###**データが存在するかどうかを知りたい時**
`exists?`を使います。`true`か`false`を返します。
いくつか例を載せておきます。

```
pry(main)> Answer.exists?(1)
=> true(or false)

pry(main)>　Answer.exists?(user_id: nil)
=> true(or false)

pry(main)> Answer.exists?(['text = ?', "hello world"])
=> true(or false)
```

##**データベースからデータを取得した後**

###**取得したデータのカラムに値が存在するか知りたい時(nil?)**
`nil?`を使います。`true`か`false`を返します。

```
pry(main)> @answer = Answer.find(1)
pry(main)> @answer.user_id.nil?
=> true(false)
```

###**条件に該当したデータの存在を調べるとき[配列]**
`empty?`、`blank?`、`present?`を使います。
取得したデータは配列`[... , ... ]`です。

まずは、`blank?`と`present?`の挙動を確認します。

```
pry(main)> @answers = Answer.where('user_id < 10')
pry(main)> @answers.present?
=> (仮に)true(とした時、blank?は、)
pry(main)> @answers.blank?
=> false(となる)
```
次に`empty?`の挙動を確認します。

```
pry(main)> @answers.empty?
=> false
```

###**取得したデータの値の存在を調べるとき[文字列]**

```
pry(main)> @answer = Answer.find(1)
pry(main)> @answer.text
=> "hello hello hello"
pry(main)> @answer.text.present?
=> true
pry(main)> @answer.text.blank?
=> false
pry(main)> @answer.text.empty?
=> false
```

#**まとめ**
railsでは`blank?`メソッドが使えるため、`empty?`を使う場面は少ないように感じます。
ですので、私は、上記にあげた用途で、`nil?`、`blank?`、`present?`、`exists?`の4つを使ってます。

`empty?`は使用しておりません。もし`empty?`メソッド使った方がいい場面などありましたらコメント欄などにて教えていただけますと嬉しいです。

また、
[nil? empty? blank? present? の使い分け](https://qiita.com/somewhatgood@github/items/b74107480ee3821784e6)から引用ですが、
> nil?とempty?はrubyのメソッドで、blank?とpresent?はrailsで拡張されたメソッド（つまりrubyでは使えない）ってことを覚えておく。

少しでも役に立ったら、いいね、お願いします(^^)

# **Rails関連記事**
[正規表現まとめ（基礎）[Ruby編]](https://qiita.com/takuyanin/items/2918ffb3151dcfa88565)
[配列で利用できる主なメソッドをまとめてみた[Ruby編]](https://qiita.com/takuyanin/items/3ca4cd7067b7b9e7e9b6)
[Mysql2::Error: Duplicate entry for key.. エラーを撃退した話(validationの設定)](https://qiita.com/takuyanin/items/b28d5111447d4dedc39d)
[Rails5でJqueryを利用しようとして少しハマった件（Uncaught ReferenceError: $ is not defined）](https://qiita.com/takuyanin/items/24444ec3005098471f3b)
[change_columnでの設定はrollbackできない話(This migration uses change_column, which is not automatically reversible.)[Rails: migration]](https://qiita.com/takuyanin/items/6d51ffb4078a417fed35)
[sessionに保存されたHashを別アクションで利用しようとした際にデータ型の変更によりハマった件[Rails]](https://qiita.com/takuyanin/items/e794e8bdb46287a2a269)
[Railsでfacebookログイン認証機能を実装してみた + エラーの原因はバリデーションだった](https://qiita.com/takuyanin/items/5ebd5d9ac8a0baaa1a8e)
[csvファイルを作成し、初期データを挿入しよう[Rails]](https://qiita.com/takuyanin/items/fd183288d54d2b601df9)
[ArgumentError in ********Controller#send [Rails]](https://qiita.com/takuyanin/items/a14865fda34ff48f5e5a)
[Render and/or redirect were called multiple times in this action...の罠[Rails]](https://qiita.com/takuyanin/items/8aa7a3978a2bb344da59)
[クエリメソッドをまとめてみた[Rails]](https://qiita.com/takuyanin/items/ed2641dcb5fad35f9067)
Scala初学者のメモ

業務でScalaを使うことが増えたので、自分用メモ。
順番とか一旦は無視で。参考とかにはならないと思う。

# Optionクラス
OptionクラスにはSomeクラスとNoneクラスの子クラスを持つ。

```
val a1 = Some(null)
val a2 = Some("hoge")
val b = None
val c1 = Option(null)
val c2 = Option("huga")
c1.getOrElse("NULLyade")
```
```
a1: Some[Null] = Some(null)
a2: Some[String] = Some(hoge)
b: None.type = None
c1: Option[Null] = None
c2: Option[String] = Some(huga)
res0: String = NULLyade
```

a2にはSomeクラスに"hoge"が入ったものを入れている
bにはNoneクラスを入れている
c1にはOptionクラスにnullを入れたものが入ってる。 = Noneクラスが入っているのとほぼ同じになる
c2にはOptionクラスに"huga"を入れてる = Someクラスに"huga"が入っているのとほぼ同じになる

```
a1: Some[Null] = Some(null)
a1.get
res0: Null = null
a1.getOrElse
res1: String = null
```
```
val a2 = Some("hoge")
a2.get
res0: String = hoge
a2.getOrElse("NULLyade")
res1: String = hoge
```
get/getOrElseメソッドでSomeクラスから中身が取れる

```
val b = None
b.get
java.util.NoSuchElementException: None.get
	at scala.None$.get(hoge.sc:345)
	at scala.None$.get(hoge.sc:343)
	at #worksheet#.#worksheet#(hoge.sc:13)
b.getOrElse("NULLyade")
res0: String = NULLyade
```
Noneクラスから中身を取ろうとしてもないのでエラーで落ちる
getOrElseを使えば()内の値が返るもしくは処理が実行される。

```
val c1 = Option(null)
c1.get
java.util.NoSuchElementException: None.get
	at scala.None$.get(hoge.sc:345)
	at scala.None$.get(hoge.sc:343)
	at #worksheet#.#worksheet#(hoge.sc:14)
c1.getOrElse("NULLyade")
res0: String = NULLyade
```
Optionクラスにnull入れたものはNoneと同義なので、取得しようとしてもエラーで落ちる。

```
val c2 = Option("huga")
c2.get
res0: String = huga
c2.getOrElse("NULLyade")
res1: String = huga
```
Optionクラスに"huga"を入れたものはSomeクラスに"huga"を入れたものと同義なので普通に値が取れる。
getOrElseを使って値が取れない場合は・・・とかでエラー処理を書いたりできる。  

# Eitherクラス
ついエイサークラスと読んじゃう。イーサークラス。
EitherクラスはRightの値とLeftの値をもつ。
getやgetOrElseも使用可能。

```
val v1: Either[String, Int] = Right(123)
val v2: Either[String, Int] = Left("abc")
v1.fold (a => a, _  => 456)
v2.fold (a => a, _  => 456)
res2: Any = 456
res3: Any = abc
```
foldメソッドはRightの値が入ってたら右辺を
Leftの値が入ってたら左辺の処理を行う。
=>は必須。上の例だと、
v1はRightが入っているので右辺で　456　が返される。
v2はLeftが入っているので左辺の値で　abc　がそのまま返す。
これもエラーが発生したらLeftに入れるとかしてエラー処理に使える。

# for式
```
val a = List(1,2,3)
for(e <- a) println(e)
```
```
1
2
3
```
foreach的な使い方。
リストaから1つ取得しeとして処理をする
これをリストに入っている分繰り返し実行する。


```
val a = List(1,2,3)
val fuga = for(e <- a) yield {
  e + 1 
}
```
```
fuga: List[Int] = List(2, 3, 4)
```
リストから1つずつ取得し、
yield{}内の処理を実行した上で新たなリストを作成しそのリストを"値"として返す。
yieldがつくと値を返す。

# Option型のmap
```
val a1 = Option("bbb")

val a2 = a1.map{
  case "aaaa" => "zzz"
  case _ => Option(null)
}
```
```
a1: Option[String] = Some(bbb)
a2: Option[java.io.Serializable] = Some(None)
```
Option型のmapはOption型でラップされた値の中身を取り出す動きをする。  
この時の返り値は値があろうがなかろうが、仮にNoneだったとしてもSomeクラスでラップされて返される。

```
val a1 = Option("bbb")

val a2 = a1.map{
  case "aaaa" => "zzz"
  case _ => Option(null)
}.getOrElse("nulldayo")
```

```
a1: Option[String] = Some(bbb)
a2: java.io.Serializable = None
```
そこにgetOrElseをつけることで返り値にラップされた値の中身を取り出すことができる。
1回のgetOrElseではもうNoneにはならないので、getOrElse()の()内の処理は実行されない。

```
val a1 = Option("bbb")

val a2 = a1.map{
  case "aaaa" => Option("zzz")
  case _ => Option(null)
}.get.getOrElse("NULLdayo")
```
```
a1: Option[String] = Some(bbb)
a2: String = NULLdayo
```
こうしてやるとできなくはない。

本当にただのメモ。
12-16 tremolo

https://adventar.org/calendars/3353 の16日目エントリーです。

## tremolo

tremoloはOgg Vorbisのデコードを行うライブラリです。

tremoloはtremorをARM NEON命令を活用して最適化したものです。tremorは浮動小数点ではなく整数型のみを使用して実装されているOgg Vorbisの展開ライブラリです。浮動小数点ほど微細な音声にはなりませんが、モバイル環境など軽量な処理が求められる環境により相応しいものになっています。

GoogleがAndroid向けに最適化されたものとしてAOSP（Android Open Source Project）の一部として配布しているもので、実装としてはほぼ完成しているはずです。

https://android.googlesource.com/platform/external/tremolo/

## libvorbisencとlibvorbisidec

浮動小数点を使用した実装は（おそらくLinux系ディストリビューションの大半では）**libvorbis**、**libvorbisenc**および**libvorbisfile**としてパッケージされているでしょう。筆者が使用しているUbuntu 18.04ではlibvorbis0a、libvorbisenc2、libvorbisfile3となっています。（`dpkg -L libvorbisenc2`などで内容を確認できます。）

一方tremorは**libvorbisidec**という名前でパッケージされています。tremorとlibvorbisの間にはいくつかの部分でAPI互換性がありません（もともとのAPIが概ね同じところからスタートしているので、大部分は互換であるといえます）。APIが似ているからといって、これらを混同して使うと期待通りに動作しないでしょう。他言語バインディングなどを作成するときには注意しましょう。

## Androidで使う場合

なお、tremoloはAndroidで使われているので、Android M以前の端末ではアプリケーションにlibvorbisidec.soをパッケージしなくても大抵の場合は呼び出すことが出来ましたが、tremoloはAndroid NDKの標準APIには含まれていないので、tremoloをアプリケーションで使おうと思ったら、自分で明示的にビルドして含める必要があります。

筆者はtremoloのC#バインディングtremolo-sharpを作って公開しているのですが、実はまだ全然使っておらず、作業内容も、昔作ったアプリケーションからのtremolo interop部分の抜き出しと、tremoloのNDKビルドスクリプトの作成がほとんどでした（使っていたコードなので動くには動くとは思います）。後者は他の言語バインディングを作成したい場合にも有用だと思うので、適宜再利用してもらえればと思います。

https://github.com/atsushieno/tremolo-sharp
高専プロコンのGUIをOpenSiv3D Linux版で開発した話

#はじめに
この記事は[Siv3D Advent Calendar 2018](https://qiita.com/advent-calendar/2018/siv3d) 16日目の記事になります。

はじめまして、ひがしと申します。
この記事では私たちのチーム「塗、無言、枡目にて。～私はずっとそうやって過ごしてきた～」が
OpenSiv3D Linux版で高専プロコン競技部門のGUIを作成したときの話をしていきたいと思います。
また、この開発したGUIは下記リポジトリの`kyon`フォルダ内にあります。
https://github.com/kurokoji/procon29-kyogi

#高専プロコン29競技部門のルール

Nマス×Mマスのフィールドがあり、そのマスには点数が書かれており、
そのマスをとりあい、獲得点数がより多いチームの勝利というルールでした。

#OpenSiv3Dを選んだ理由
最初のチームのミーティングにてリーダーから

* OpenSiv3D
* Qt
* JavaFX

の中から使うものを決めようと言われました。

GUI担当のメンバーで話し合った結果、
C++で書きたいということでJavaFX以外になりQtとOpenSiv3Dそれぞれをみんなでためすことになりました。
そして次のミーティングで日本語の資料が豊富という理由とこのルールに合わせたGUIを作成するならOpenSiv3Dのほうがいいという結論にいたり、OpenSiv3Dで開発することになりました。

#ルールを見てGUIに必要と判断した機能

* 特定のイベントが発生した場合に色が変わるボタン
* ソルバからの指示を受け取り、ハンドサインを表示する
* QRコードリーダーから受け取った値を使ってN*Mマスのフィールドを表示する

この3つが必要と判断されたため、それぞれの担当メンバーを振って開発をすることになりました。
因みに私はボタンの実装をすることになりました。

#完成したもの
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/procon29?src=hash&amp;ref_src=twsrc%5Etfw">#procon29</a> 沖縄高専のGUIはこんな感じ OpenSiv3DをLinuxで使っています <a href="https://t.co/GwJ3AoeMS2">pic.twitter.com/GwJ3AoeMS2</a></p>&mdash; kurokoji (@kur0k0ji) <a href="https://twitter.com/kur0k0ji/status/1057270489914073088?ref_src=twsrc%5Etfw">2018年10月30日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

こちらが完成したGUIになります。

#Linux版環境構築に関して
Ubuntu18.04の環境構築になります。
まずは

```
sudo apt install gcc clang git cmake libx11-dev libxi-dev libxinerama-dev libxcursor-dev libxrandr-dev libjpeg-dev libpng-dev libgl1-mesa-dev libglu1-mesa-dev libglib2.0-dev libfreetype6-dev libturbojpeg-dev libopenal-dev libfontconfig-dev libudev-dev libboost-dev libboost-all-dev libglew-dev libbox2d-dev libgif-dev libopencv-dev
```

で必要なライブラリをインストールします。
その後、

```
$ git clone https://github.com/Siv3D/OpenSiv3D.git
$ cd OpenSiv3D
$ git checkout -b linux origin/linux
$ cd Linux
$ cmake .
$ make
$ cp -rf resources Test
$ cd Test
```
のそれぞれを実行し、CMakeLists.txtの61行目、
`${PROJECT_SOURCE_DIR}/../Debug/libSiv3D.a`を 
`${PROJECT_SOURCE_DIR}/../libSiv3D.a`に書き換えます。

そして最後に

```
$ cmake .
$ make
$ ./Siv3D_Test
```
でサンプルコードが実行できると思います。

ただ、開発前に`kyon`フォルダの中にある`setup.sh`を実行することで環境構築が済むように先輩がscriptを書いてくれました。

#ボタンについて
開発が始まったときにはOpenSiv3Dには`Button class`がありませんでした。
なので、描画をするための`draw()`、ボタンの座標を指定するための`setPos()`、クリックの判定をするための`leftClicked()`それぞれをメンバ関数で使えるようにした`Button class`を作成しました。

`Button.cpp` `Button.hpp` `FieldSquare.cpp` `FieldSquare.hpp`が作成した`Button class`とその派生になります。

#ハンドサインの表示
ソルバから受け取った値に応じて用意しておいた画像を表示する必要がありました。
こちらはOpenSiv3Dの画像を表示する機能を使いました。

`CommandGUI.cpp` `CommandGUI.hpp` がハンドサインの表示をするためのclassです。

#フィールドを描画する
TCP通信で値をとってきてその後範囲for文でN*Mマスを描画しました。
最初は通常のfor文で描画しようとしていたのですが、通常のfor文だと描画がされないということで、範囲for文で描画することになりました。

#最後に
今回OpenSiv3Dを大会の開発で使わせていただくことで、GUIの作成について知識がつき、とてもいい経験になりました。
GUI開発経験が一切なかった自分でも簡単にGUIを作成することができたので、
GUIに興味がありそうな後輩にどんどん進めていきたいと思います。
また、もし来年も競技部門に出ることになったらGUIはOpenSiv3Dを使えればと思っています。

つたない文章でしたがここまで読んでくださりありがとうございました。
ProcessingでSeleniumを使ってみよう

この記事は [Selenium/Appium Advent Calendar 2018](https://qiita.com/advent-calendar/2018/selenium_and_appium) の15日目の記事です。

こんにちは！
そう、そろそろネタ切れです。
よ、よろしくお願いします！！！


Processing
===============

https://processing.org/

メディアアート方面の人にはおなじみの、ガーッと書いてグワーッと動かすやつです。
Web系の人には [Processing.js](http://processingjs.org/) や、後継の [p5.js](https://p5js.org/) の方がおなじみかもしれませんね。それの元になったやつです。

ProcessingはJava互換のフレームワークですので、開発環境である [PDE](https://processing.org/reference/environment/) に所定の設定をするだけで至って普通にSeleniumのJava版クライアントを使えるようになります。


実際にやってみよう
===================

## 準備

[Seleniumの公式ダウンロードページ](https://www.seleniumhq.org/download/) から、Java版のクライアントライブラリー 一式をダウンロードしましょう。この記事ではバージョン3.141.59を使います。
ダウンロードできたら、jarファイルをすべてライブラリーフォルダーに突っ込みましょう。macOSの場合は、 `/Users/[自分のホームディレクトリー]/Documents/Processing3` がPDEの設定ディレクトリーになっていると思われます。その下の `libraries` の下に `selenium` さらにその下に `library` とディレクトリを作り、その中にjarファイルをすべて置きます。

![スクリーンショット-2018-12-15-23.30.46.png](https://qiita-image-store.s3.amazonaws.com/0/33963/9cce441c-4581-dd66-2a58-1e1280d78cd3.png)

次に、インポートして利用するクライアントライブラリーのファイル名を変更して、 `libraries` 直下のディレクトリー名 `selenium` と一致させます。こうしないと、PDEからクライアントライブラリーをインポートできません。

<img width="164" alt="スクリーンショット 2018-12-15 23.31.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/33963/47ac9469-85a3-f3d3-3f40-bdb30a7bc902.png">

ここまでできたらPDEを起動しましょう。Seleniumクライアントが使えるようになります。

## サンプルコード

大雑把には、次のサンプルのようなコードがPDE上で書けます。
おそらくProcessingでSeleniumを利用するときは、リアルタイムに取得したブラウザーのスクリーンショット画像を何かしら加工したりしなかったりして表示するのではないでしょうか。

```Java
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

WebDriver driver;
PImage pngImage;

void setup()
{
  frameRate(15);
  ChromeOptions options = new ChromeOptions();
  options.setHeadless(true);
  driver = new ChromeDriver(options);
}

void dispose()
{
  driver.quit();
  println("disposed.");
}

void draw()
{
  background(0);
  if (pngImage != null)
  {
    image(pngImage, 0, 0);
  }

  if (frameCount % frameRate == 1)
  {
    thread("getScreenshotFromThread");
  }
}

void getScreenshotFromThread()
{
  driver.get("http://example.selenium.jp/reserveApp/");
  File pngFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
  pngImage = loadImage(pngFile.getAbsolutePath());
}
```

Processingで利用するときに注意するポイントは次のあたりかと思われます。

* `dispose()` を必ず書いて、Sketchの終了時にブラウザーとブラウザードライバーを必ず終了させましょう。
    * ただ、Processingで書いたSketchは往々にして動作不安定であり、 `dispose()` できずに終了してしまうこともあります。開発中は、定期的にブラウザーとブラウザードライバーのプロセスの残りを `killall` などでお掃除しましょう。
* `WebDriver.get()` や `TakesScreenshot.getScreenshotAs()` を `draw()` の中で実行してしまうと、1フレームの実行にかかる時間が格段に増えてしまい、まともに描画できなくなります。 `thread()` などを利用して、別スレッドの中で実行するようにしましょう。
* ほんとうは `TakesScreenshot.getScreenshotAs()` の結果は `byte[]` で受け取りたいところですが、ProcessingのAPIの範囲ではPNG画像のバイト列をかんたんにビットマップに展開することができません。オーバーヘッドは非常に気になりますが、一度ファイルに出力して `loadImage()` する方がシンプルなコードを書けるでしょう。
    * グリッチ画像を作りたい場合は `byte[]` で受け取りましょう。


今回はここまで
==================

次回は...誰かー！ 誰か来てくれーーー！！！
Selenium/Appium Advent Calendar 2018はまだまだ君の挑戦を待っているぜ！
[ネタ？]Rubyでボゴソートを実装

#ボゴソートとは

[ボゴソート - Wikipedia](https://ja.wikipedia.org/wiki/ボゴソート)

簡単に説明すると、トランプを順に並べたいとき

1. トランプの束を放り投げる。
2. 無作為に拾う。
3. 見事ソートできていれば終了。できていなければ、1に戻る。

トランプを例に出すと絶対ありえないようなソートの仕方ですが、このソートは[無限の猿定理](https://ja.wikipedia.org/wiki/無限の猿定理)の別例のようなもので、このソート法に不可能はありません。~~クイックソートより早いときだってある~~

#コード

再帰を用いました。コード自体は割とすっきりしたかな。実行結果ではソート結果、かかった時間を簡易的ですが表示しています。

```ruby:bogo.rb
def bogo(array,ans,time)
#第一引数：ソートしたい配列
#第二引数：ソート結果の参照用
#第三引数：開始時間

  sfarray = array.shuffle #ランダムで配列の要素を入れ替え

  if sfarray.eql?(ans)
    p sfarray #ソート結果
    ft = Time.now #ソート終了時の時刻
    puts ft - time #処理時間を算出
  else
    bogo(sfarray,ans,time) #シャッフル後のものをもう一度
  end

end

st = Time.now #開始時刻

puts "配列の要素を入力（スペース区切り）"
*ary = gets.split(" ").map!{|n| n.to_i}
ansary = ary.sort #正しい結果
bogo(ary,ansary,st)
```

実行結果

```
$ ruby bogo.rb
配列の要素を入力（スペース区切り）
56 34 9 94 27 11 2
[2, 9, 11, 27, 34, 56, 94]
32.033958
```

#改善点

(追記：@scivolaさんによるloopを用いた実装例がこの問題を全て解決してくれました。ありがとうございます！)
- 配列の要素数が8以上だと`stack level too deep (SystemStackError)`が発生します。再帰を用いたのが原因です。まあ運任せなので確かになあと言う感じです。どうにか解決したい…。

- 処理時間周りをもっとなんとかしたい。

- ~~いつかクイックソートも実装してボゴソートの方が早いぞ、な瞬間を見たい~~

#終わりに

勉強したくなさすぎて現実逃避した結果、こんなものを作ってみました。やっつけな部分が多々ありますので、改善箇所などありましたらぜひコメントよろしくお願いします。
Vue.jsの開発環境構築

# vue.jsの開発環境構築
## はじめに
初投稿です。まずはVue.jsの開発環境構築のメモを残しておきます。
普段は、eclipseを用いてJava開発をしています。フロントエンドの開発を行うために
色々と他のQiitaの投稿やブログを参考にさせていただきました。
認識誤りなどありましたら、ご指摘ください。

## 資材一覧
- node.js : <https://nodejs.org/ja/>
- npm ※node.jsに同梱されています。
- Visual Studio Code : <https://code.visualstudio.com/>
- GitHub : <https://github.co.jp/>
- GitHub Desktop : <https://desktop.github.com/>

node.jsはvue.jsにて作成したアプリをビルドして動かすために使います。
npmはwebpackなどモジュール追加、管理に使用します。
Visual Studio Codeはエディタ、デバッグツールとして使います。
GitHubはバージョン管理ツールのGitを提供しているサービスです。無料で使えます。
GitHub Desktopはデスクトップアプリにて、GitHubにアクセスできるツールです。
わざわざブラウザでログインしなくてよいので楽です。

## 環境構築
基本的には資材一覧に記載したものをダウンロード、インストールするだけです。
Javaのように環境変数にPATHを追加するなども不要です。
VueとVue-CLIをインストールをnpmでインストールします。

```コマンドプロンプト
$ npm install vue
$ npm install vue-cli
```
インストールはこれで終わりです。
最後にプロジェクト作成です。

```コマンドプロンプト
$ vue init webpack [任意のプロジェクト名]
```

## 参考にしたページ
Vue公式 : <https://jp.vuejs.org/>
Vue.js を vue-cli を使ってシンプルにはじめてみる : <https://qiita.com/567000/items/dde495d6a8ad1c25fa43>
サーバーサイドJavaエンジニアがVue.jsの基本を学習したときのメモ : <https://qiita.com/rubytomato@github/items/056199b994bb94efb8c0>
Ledパネルを動かす

#LEDパネルを動かす。

##LEDパネルはこれ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/31412/23013f14-90a1-908a-199d-f8314511cb86.png)
多分もとは秋月さんのページより。

##接続部
R1,R2 = RED 用DATA LINE
B1,B2 = BLUE 用DATA LINE
G1,G2 = GREEN 用DATA LINE
CLK   = CLOCK LINE
LE    = LATCH
EN    = ENALBE (物によってアクティブが変わります。）
A,B,C,(D) = LINE CONTROL PORT

![image.png](https://qiita-image-store.s3.amazonaws.com/0/31412/24bc4bdf-fe0c-566d-8c76-d5668fb33441.png)


##電源部
赤:5V /　黒:GND
![image.png](https://qiita-image-store.s3.amazonaws.com/0/31412/2d0eeee0-377e-f008-42b4-2a8875877eb2.png)

##ブロック図
![image.png](https://qiita-image-store.s3.amazonaws.com/0/31412/e650c952-a856-7433-0f9b-e91e7d453a15.png)


##シリアル転送方法
![image.png](https://qiita-image-store.s3.amazonaws.com/0/31412/cfeadfee-97a3-c9a4-22eb-7e8aa5e99b72.png)
注意：R1とR2,G1とG2,B1とB2は同じタイミングで出力してください。

##A/B/Cの組み合わせと展開状態。
![SnapCrab_NoName_2018-12-15_23-42-40_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/31412/680dbb88-2958-5462-d70f-93bf06554bdc.png)

http://kinomuku129.blogspot.com/2014/06/32x16led.htmlより、
A/B/Cを1ms～2ms程度で定期的に、変更することで８列を表示します。これが上下２つあるので16列表示できるわけです。

以上　やましょうでした。
「◯日ぶり×回目」を出力するアプリを作ったよ

この記事は、[クソアプリ2 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/kuso-app2) の 14 日目の記事です。
どうもいつも元気な @pankona です。

[nn](https://github.com/pankona/nn) という「◯日ぶり×回目」を出力するアプリを紹介します。
拙作です。Go で書いてます。

## nn とは何か

- 「n 日ぶり m 回目」を出力するコマンドラインツール。
  - 最初は「n 日ぶり n 回目」というつもりで作っていたので 「nn」という名前になっています。紛らわしくてごめんなさい。
- ヘルプは以下。


```
$ nn --help
NAME:
   nn - show nn

USAGE:
   nn [options] [arguments...]

VERSION:
   0.1

OPTIONS:
   --id value                specify id of nn (default: "default")
   -f value, --format value  specify format of nn (default: "%d 日ぶり %d 回目")
   --help, -h                show help
   --version, -v             print the version
```

## 機能

- `-id` で集計する単位に ID を指定します。「n 日ぶり m 回目」は ID 毎に集計されます。

```bash
$ nn -id myapp1
0 日ぶり 1 回目

$ nn -id myapp1
0 日ぶり 2 回目

$ nn -id myapp2
0 日ぶり 1 回目

$ nn -id myapp2
0 日ぶり 2 回目
```
- `-f, --format` で出力形式をなんとなく指定できます。

```bash
$ nn -f "while in %d days, %d time"
while in 0 days, 4 time
```

## 使用例

- SL コマンドを打ってしまったときに何日ぶり何度目かを表示する

みんな大好き sl コマンドです。ls 打ち間違って出てきちゃうあれです。悔しいですよね。のんびり通り過ぎていく電車。それを見送る我々。
しかしこの sl。何日ぶり何度目の ls 打ち間違いか知りたいと思いませんか。
私はこんなふうに sl コマンドを alias して nn と繋げるようにして、何日ぶり何回目の SL 通過かを表示するようにしていました。

```bash
# bashrc にこんなふうに書いておく

alias sl='sl-with-count'

function sl-with-count {
    sl
    nn --id sl
}
```

- SL コマンドを打ってしまったときに何日ぶり何度めかを Slack にポストする

そもそも sl を打たないように (ls を打ち間違わないように) 気をつけるべきですよね。
それでも sl してしまうことがあります。嘆かわしい。私は sl を打ってしまったときの戒めをより強力なものにするため、sl を打ってしまったときにとある Slack チャンネルに「何日ぶり何回目の SL か」をポストするようにしています。関係各位、いつもすまない。

私は以下のような alias と function を bashrc に書いています。
- 下記の例では [slackpost](https://github.com/pankona/slackpost) というのが登場していますが、これはパイプで渡された文字列を Slack に投稿するコマンドラインツール (拙作) です。これの紹介は割愛します。

```bash
alias sl='sl-with-slackpost'

function sl-with-slackpost {
    sl
    echo "@here SL が走りました (`nn --id sl`)" | slackpost
}
```

SL が走ると、以下の文言がポストされます。

```
@here SL が走りました (30 日ぶり 34 回目)
```

## まとめ

「◯日ぶり×回目」を出力するアプリを紹介しました。いかがでしょうか。
ちょっとでも面白いと思っていただけたら本望です。よかったら使ってみてね！
GinでBindingが物珍しかったので他のフレームワークも調べてみた

こんにちは、hiroyukimです。

この記事は[Go4 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/go4) 16日目となります。

私はこれまでLL系を中心にWeb開発をよくしてきました。Web開発ではリクエストパラメータを取得しようとした場合。例えば、PHPを例に取るとこのようなリクエストオブジェクトからkeyを指定して取得するという形が一般的かと思います。

+ https://laravel.com/docs/5.7/requests#retrieving-input

```php
$name = $request->query('name');
```


今回、GoでWeb開発をしていてginというフレームワークを使用していたところ

+ https://github.com/gin-gonic/gin

```go
lastname := c.Query("lastname") // shortcut for c.Request.URL.Query().Get("lastname")
```

このようにkeyを指定して取得するという手法もあるのですが、


```go
type StructB struct {
    NestedStruct StructA
    FieldB string `form:"field_b"`
}

func GetDataB(c *gin.Context) {
    var b StructB
    c.Bind(&b)
    c.JSON(200, gin.H{
        "a": b.NestedStruct,
        "b": b.FieldB,
    })
}
```
+ https://github.com/gin-gonic/gin#bind-form-data-request-with-custom-struct


あらかじめ定義していた構造体にBindさせることが出来るんですね。Goの場合型がPHPなどと比べると扱いが厳密なので、keyで取得した物をいちいち変換する行為があるはずで、面倒だなと思っていたので、こんな便利な物があることに驚きました。(ちなみに、formは[この辺](https://github.com/gin-gonic/gin/blob/521d06c81d5e49a004473daa81b71e1d34fe7a05/binding/form_mapping.go#L23)を見るとreflect使っていたりして参考になります。)

しかし、便利だなと思う反面このやり方はGoの場合一般的なのだろうかと気になりました。

そこで、現在においてGoのWebFramworkどんなのがあるのか調べてみました。

+ https://github.com/mingrammer/go-web-framework-stars

これが、cronで定期更新されているようなので参考にします。

| framework | url |
| ---- | ----|
| gin | https://github.com/gin-gonic/gin |
| beego | https://github.com/astaxie/beego |
| echo | https://github.com/labstack/echo |
| revel | https://github.com/revel/revel |

独断と偏見でこの4つにを見ることにしてみました。

ginはもう調べてあるのでbeegoから

## beego

名前はBindじゃないんですが事前に構造体を定義して取得するという意味では
`ParseFrom`というメソッドがあるようです。
goにきてから`this`という用語を殆ど見なかったんですがbeegoではあるようですね。


```go
func (this *MainController) Post() {
    u := User{}
    if err := this.ParseForm(&u); err != nil {
        //handle error
    }
}
```

+ https://beego.me/docs/mvc/controller/params.md
+ https://beego.me/docs/mvc/controller/params.md#parse-to-struct

## echo

echoの方にはBindという名前で実装されていました

```go
func(c echo.Context) (err error) {
  u := new(User)
  if err = c.Bind(u); err != nil {
    return
  }
  return c.JSON(http.StatusOK, u)
}
```

+ https://echo.labstack.com/guide/request#bind-data

## reval

revalも`Params.Bind`という形で存在していました。

```go
func (c SomeController) DoResponse() revel.Result {
	var ids []int
	c.Params.Bind(&ids, "ids")
}
```

+ https://revel.github.io/manual/parameters.html#binder


## 結論

goのweb framworkではパラメータをBindする方式は割と一般的なようです。この方式がどこから来たかは気になりますが、それはまた別の話なので機会がありましたら書こうかと思います。とりあえず、非常に便利なんで使ったら良いんじゃ無いかと思います。