OmniAICreator/Qiita-1.07M huggingface dataset:
Laravelでページャーを常時表示する

# やりたいこと
Laravelのデフォルトのペジネータは２ページ目がないと非表示になってしまう。
これを常時表示したい。

# やりかた
`php artisan vendor:publish --tag=laravel-pagination`を実行し、ペジネータのテンプレートを出力する。
`/resources/views/vendor/pagination/bootstrap-4.blade.php`に出力されたファイルを編集する。

```php:bootstrap-4.blade.php
@if ($paginator->hasPages())
    <nav>
        <ul class="pagination">
            {{-- Previous Page Link --}}
            @if ($paginator->onFirstPage())
                <li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.previous')">
                    <span class="page-link" aria-hidden="true">&lsaquo;</span>
                </li>
            @else
                <li class="page-item">
                    <a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev" aria-label="@lang('pagination.previous')">&lsaquo;</a>
                </li>
            @endif
            {{-- Pagination Elements --}}
            @foreach ($elements as $element)
                {{-- "Three Dots" Separator --}}
                @if (is_string($element))
                    <li class="page-item disabled" aria-disabled="true"><span class="page-link">{{ $element }}</span></li>
                @endif
                {{-- Array Of Links --}}
                @if (is_array($element))
                    @foreach ($element as $page => $url)
                        @if ($page == $paginator->currentPage())
                            <li class="page-item active" aria-current="page"><span class="page-link">{{ $page }}</span></li>
                        @else
                            <li class="page-item"><a class="page-link" href="{{ $url }}">{{ $page }}</a></li>
                        @endif
                    @endforeach
                @endif
            @endforeach
            {{-- Next Page Link --}}
            @if ($paginator->hasMorePages())
                <li class="page-item">
                    <a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next" aria-label="@lang('pagination.next')">&rsaquo;</a>
                </li>
            @else
                <li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.next')">
                    <span class="page-link" aria-hidden="true">&rsaquo;</span>
                </li>
            @endif
        </ul>
    </nav>
@endif
```

最初の行のif文が、`$paginator->hasPages()`の条件でページがなければページャーを出力しないようになっているため、このif文をとってやれば常時出力されるようになる。
Vuetify2.0系のdatatableで行クリックを実装する


## 背景

Vuetifyで行クリックを実装させたいが1.0系とは勝手が違ったので備忘録がてらのメモです。


### 解法

```vue
<template>
 <v-data-table
    :headers="header"
    :items="data"
    :expanded.sync="expanded"
    item-key="id"
    show-expand
    // @click:rowに関数を渡す
    @click:row="onClickEvent" 
  />
</template>
<script>
export default {
  name: 'App',
  computed: {},
  mounted() {},
  methods: {
    // 第一引数にクリックした行のObjectが渡されるので処理を用意しておく
    onClickEvent(data) {
      console.log(data)
    },
}
</script>
```

## 余談
メゾット書かずに遷移させたい

```vue
  <v-data-table
    :headers="header"
    :items="data"
    :expanded.sync="expanded"
    item-key="id"
    show-expand
    widths="100%"
    calculate-widths
    @click:row="
      (data) => {
        // 無理くりここで画面遷移させる
        $router.push(`/projects/${data.id}`)
      }
    "
  >
```
BitVisorの外部割り込み処理

BitVisorの外部割り込み処理について簡単に説明します．アーキテクチャはIntelが対象です．

## 基本
ゲスト実行中に割り込みでVMEXITが発生するかどうかは設定によります．VTではVM-Execution Control FieldsのPin-Based VM-Execution Controls内のexternal-interrupt exitingが1だと外部割り込み時にVMEXITします (exit reason は External Interrupt)．そうでなければ，割り込みはそのままゲストに通知されることになり，RFLAGS.IF=1ならゲストの割り込みハンドラが処理します．BitmapでVMEXITする番号が指定できるMSRとは異なり，特定の割り込み番号だけVMEXITさせることはできません[^1]．

[^1]: VT-dのPosted Interruptsを利用すると，external-interrupt exitingが1でも特定の割り込みをVMX non-rootのゲストに直接挿入できるみたいです．

外部割り込みでVMEXITしたときの割り込みの扱いは以下のようになります．

- VM-Exit controlsのAcknowledge interrupt on exitが1のとき
    - HWが割り込みコントローラにackしてくれます．割り込み番号はVM-exit interruption-information fieldに格納されます．
- そうでないとき
    - 割り込みはRFLAGS.IFでマスクされた状態です．この状態でホストが割り込みを有効化すると割り込みが入り，ホストの割り込みハンドラが起動します．

一般に外部割り込みはVMに向けたものとは限らないので，ホスト側の割り込みハンドラで処理するためにacknowledge interrupt on exitは0にすることが多いようです．

## BitVisorの処理
まず，BitVisorは割り込み禁止状態で動作しています（なお，VMEXITするとRFLAGS.IFはクリアされます）．またBitVisorではデフォルトでexternal-interrupt exitingが1, acknowlege interrupt on exitが0です．defconfigで`no_intr_intercept = 1`にするとexternal-interrupt exitingが0になります．

External InterruptでVMEXITすると，`do_external_int ()`を実行しますがここでは`vt_exint_assert (true)`を呼んで外部割り込みがあったとマークするだけです．実際の対応はメインループから`vt_interrupt()` => `vt_inject_interrupt()`で実行します．ここで `num = current->exint.ack ()`によって一時的に割り込みを有効化して割り込みを受け取り，割り込み番号を取得します．そして`vt_generate_external_int (num)`で割り込みをゲストに再挿入します．どうせ再挿入するならexternal-interrupt exitingする意味がないように見えますが，いくつかのケースでexternal-interrupt exitingが有用な場合があります．

一つは，定期的にVMEXITを起こしたい場合です．BitVisorは基本パススルーしているため，設定次第ではほとんどVMEXITしなくなります．パフォーマンス的にはそれで良いのですが，BitVisor内部でデバイスを占有して利用している場合や，lwipサーバを実行している場合は，それらの処理はBitVisorのスレッドで実行しているため，VMEXITしないとそれらの処理が一切進まなくなります．外部割り込みでVMEXITさせることにより，BitVisorのスレッドがスケジュールされやすくなります．

また，次で説明する割り込み番号変換にも利用されています．

## 割り込み対応処理の詳細
`current->exint.ack ()`の処理の実体は`core/extint_pass.c:exint_pass_ack()`であり，以下のように処理されます．

- `core/int.c:do_externalint_enable()` => `core/int.c:callfunc_and_getint()` => `core/int_handler.s:int_callfunc()`
- この関数内で，`gs:gs_inthandling=1`にして一瞬だけ割り込みを有効化 (sti; nop; cli)
- すると，それまでマスクされてた割り込みが入る
- 割り込みハンドラ (`core/int_handler.s:int_handler`)で`gs:gs_inthandling`の値をチェックして，その値が1であれば割り込み番号を`gs:gs_inthandling`に入れてリターン
    - (そうでなければ（ようするにBitVisor実行中に発生した例外であれば）panic)
- 割り込みハンドラから戻ってきたら，`gs:gs_inthandling`に格納された割り込み番号をチェックして，対応したコールバック関数を実施し，その戻り値を返す．

`exint_pass_intr_alloc()`や`exint_pass_intr_register_callback()`で特定の割り込みに対してコールバック関数が登録できます．

virtio-netのデバイスドライバは，MSIで割り込みを受けてそれをMSI-Xで通知するということをしていますが，ここの割り込み変換にこのコールバック関数を利用しています．この処理については以前書きました．

- [BitVisorのvirtio-netドライバの解説](https://qiita.com/mmi/items/e7d440eae84415636868#msi-x%E3%82%92%E4%BD%BF%E3%81%86%E5%A0%B4%E5%90%88)

また，（割り込み番号変換ではないようですが）NVMeやxHCIのドライバも何かコールバック関数を登録して処理しています．したがってこれらのデバイスドライバを利用する場合はdefconfigで`no_intr_intercept=0`を設定する必要があります．

## 参考文献
- Intel SDM
    - 33.2 INTERRUPT HANDLING IN VMX OPERATION
    - 33.3 EXTERNAL INTERRUPT VIRTUALIZATION
メンターとして意識していること

TechTrainのメンターとして，メンティーと関わるときに意識していることを簡単に共有します.

TechTrainについてはこちら
- [TechTrainガイドライン - Qiita](https://qiita.com/TakumaKurosawa/items/8db598b9c0fcb6b9c2bb)
- [TechTrain | 加速するエンジニア。](https://techbowl.co.jp/techtrain/)

## メンターとしての役割
エンジニアとしてさらに成長するためには時間も労力もかかります．特に，１人であれもこれも考えるのはハードワークです．メンターの役割は，どういう存在であるかという点から見れば，そんなプロのエンジニアを目指す方の心の支えとして，いつでもオープンに迎え，賢くアドバイスをし，正しい方向へガイドすることで，彼らが彼らの目標のために時間や労力をより効率よく使えるようにすることだと考えています．

逆にどういう存在ではないか．メンターはメンティーに対してフラットな関係だし，時間的制約が全くないので，何かを急かす存在ではないはずです．メンティーが必要とした時にアドバイスをする．また，問題に対する解答をただ与えるという存在でもないです．少なくとも僕は解答へたどり着くための道を提供することでメンティーの自己解決力が向上するように努めています．

こういった役割はどう振る舞うかという上での主軸になるので，第一に意識する必要があるところだと思います．


## 相手を知る
具体的には，コードが前もって与えられている際は，コードから知識やスキルを把握できます．当たり前ですが，相手の開発環境・言語をヒアリングして，実際に動かすなら同じ環境を用います．また，時折，メンティーの聞きたいことは曖昧なことが多いです．そのため，改めて悩みや課題を明確化するようにしています．言葉の曖昧さだけでなく，メンティーが使っている言葉や論理自体にも注目します．どういう意味で使っているのかなど．適切なアドバイスをするためには，人となりも重要なファクターです．このあたりは，雑談や何気ないコミュニケーションを通して少しでも理解できると思います．

決まったやり方はないですが，相手のことを色々な面で知ることができれば，その人に合った，相手の頭の中を整理してあげられる説明や今後のガイドラインが生まれてくると思います．

## 誠実さ
メンターがメンティーの質問に対してすぐ答えをだすことができないことがあります．メンターがぶつかる大きな課題です．メンターも完璧じゃないのでそういうことはありますが，こういう時こそ，どう接するかがメンターにとって非常に重要だと思っています．メンターは，メンティーにとってロールモデルでもあるし，メンティーの期待を背負っているので，解答が雑だったり曖昧だったりすると関係は悪化するし，何よりメンティーの自己解決能力は全く伸びません．なので，現時点で自分が解答を持っていないという事実を認め，伝えて，自分が今持ち合わせている知識と経験から，その問題を解決するためのプロセスを十分な情報と共に共有することが大切だと思います．あるいはその場で答えを出さず，後日サポートという形で，解答を待ってもらえるようにお願いしたり，知っていそうな他のメンターに繋げることも手です．

気の知れた共通認識がある同僚などならまだしも，関係構築途中のメンティーの場合はできるだけ慎重に誠実に対応することが彼らの成長のためにも必要だと考えます．


# おわりに
最後に，メンターをしてみて感じたことを一つ共有します．それは，こんなサービス前から欲しかった (笑) ってことです．現場のエンジニアとほんの少し時間を共有できるだけで，学べることは沢山あります．自分自身，今の会社に入社して，トレーナーとの1on1や同僚とのモブプロ，それからコードレビューなどを通して，共通のお作法から課題ごとのベストプラクティスなど数多くを学びました．

メンタリング制度を利用するかは完全に自由です．．が，まだ一度も利用したことがない方は，気軽に使ってみても良いかもしれないです．
超初心者がMicrosoft AzureでAIによる筆跡判別にトライしてみた。

##はじめに
プログラミングを学び始めて2か月経った初心者です。知識がまだまだ浅いので、簡単にできる技術に挑戦して実践しながら学んでいくスタイルでやっています。今回はMicrosoft AzureでAIの技術を体感できると知ってやってみました。
##Microsoft Azureとは？
Microsoft Azureはクラウドサービス上で多くのアプリケーション技術を提供してくれているサービスらしいです。顔認識や画像認識など自分のコンピューター上で構築するのが難しい技術でもMicrosoft Azureのクラウドを介して利用することができます。しかも初めて登録した人には一定期間ある程度無料！初心者にはうれしいですね。
あくまで素人的な解釈ですので詳細は[こちら](https://azure.microsoft.com/ja-jp/overview/what-is-azure/)を参照ください。
##テストの目的
まずは画像認識を身近なテーマで試してみたかったので、家族の筆跡をAIが判定できるかということに挑戦しました。
加えて、どのくらいの学習でどこまでのことが分かるかも気になったので1桁の数字、A、Bというアルファベットだけでサインのような複数文字のものも判別できるか試しました。
##環境
Windows 10 pro
Microsoft Azure
Custom Vision
##方法
Step1. まずは無料アカウントを取得しましょう。詳しくは[コチラ](https://docs.microsoft.com/ja-jp/learn/modules/create-an-azure-account/3-exercise-create-an-azure-account)
クレジットカード情報を聞かれたり、有料になるときお知らせがきたりするので、管理しやすいよう私は専用のOUTLOOKアカウントを作りました。
Step2.　Microsoft Azure画面でCustom Visionリソースを作成。
　　　下記の赤枠の「＋リソース」をクリック
　　　→名前：適当につける
　　　　サブスクリプション：無料試用版
　　　　場所：米国中南部（予測場所と合わせる）
　　　　予測価格レベル：F0・・・・
      　　　　 トレーニング価格レベル：F0・・・
　　　　リソースグループ：名前と同じのを入力
　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508834/6cabb7a8-0d0a-85b9-c2e5-928b70be4b73.png)
Step.3　[Microsoft Custom Vision Service](https://www.customvision.ai/projects)を開き、新しいプロジェクトを作る。詳細は[コチラ](https://docs.microsoft.com/ja-jp/learn/modules/classify-images-with-custom-vision-service/1-create-custom-vision-service-project)を参照。

Step4. Tagを設定する。今回の場合は、「Papa」(パパ)、「Mama」（ママ）、「Sis」（お姉ちゃん）、「Numer」（数字）、「Alphabet」（文字）の5つを用意しました。1つのTagに5つ以上のサンプルが必要（互いに重なってもOK)なので要注意。数が足りないとTrainingを開始してくれません。

Step5.画像をアップロードしながらTagづけ。同じTagのものは同時にアップロードすると処理が楽です。今回は人間の目で見分けられるものはAIにも出来るという期待を込めて、画像はかなり手作り感満載（適当）です。

![DSC_1700.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508834/45150bc8-eb27-904b-f62a-c529bdd6c307.jpeg)


Step6.　緑のTrainingボタンを押す。

Step7.　Quick Testで画像を試す。
##結果
その１）
Trainingの結果は下記の通り。同じ数字だと娘と私で似ているときはあるし、私のような素人にはまずまずに見える。数字はStep7.のQuick Testでも8割がた当たっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508834/7f0f1ae0-c0d0-a85b-b71c-f6ab6a379389.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508834/30f68ba4-09d5-90cf-2abc-42662068206b.png)

その2）
5文字で書かれている名前のサインを夫と私の分試してみた。
私のは下記の通り、いい感じで認識しましたが夫はなんと0％・・・・・。
やっぱり1文字から5文字のサインが誰かを類推するのはAIといえども無理そうですね。確かに人間だってちょっと難しいかも。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508834/12830e48-0a6d-eea4-ee89-f1975ce9d618.png)
##感想
いつものLineBotよりだいぶ高度なことをしているのに、だいぶ気軽に簡単にできちゃうところが本当にすごいですね。AIとか「機械学習」を使った画像認識は、とお～い世界と感じていましたが簡単に触れるツールがあることでだいぶ身近に感じました。今回は結構雑にやっても、数字は比較的きちんと認識してくれたので真面目に写真を撮影すれば、もう少し精度は上がるかも！？と期待が膨らみました。
0byteになったFITファイルのデータを復旧した手順

#はじめに
この投稿は「とりあえずなんでも Advent Calendar 2019」の４日目の記事です。

フィットネスデバイスなどで使用されているFITファイルのうち、ファイルシステムに正常にファイナライズされなかったデータを、デバイスから引き抜いてみたときのメモです。

##起きたこと
自分は自転車の走行ログを機器で取っているのですが、ある日、走行中に電池が切れてしまい、該当のFITファイルのデータサイズ0byteになっていました。
その日はそこそこ走っており、データが消えるのは惜しいと思ったのでデータ復旧を模索してみました。

##自分の環境と前提条件
デバイス：Lezyne MICRO C GPS
バイナリエディタ(HxD)：Version 2.3.0.0 (x86-64)
PC: Windows10 Pro 
RAM16GB

前提として、HxD等のディスクの中身を見ることができるバイナリエディタが必要です。
あまり詳しくないのですが、この方法はファイルシステム依存で、分割書きがされる場合等は使えないと思います。（セクターごとに連続で書き込まれる単純な構造だったのでOKだった）
メモリ上にデータが残っていない場合、当然ながらこの方法は使えません。

#手順
##FITファイルのファイルフォーマットを知る
[こちらの記事](https://qiita.com/harry0000/items/5931bbbf3d5b68fe8bc0)がわかりやすく解説されているので、参考にします。以下、参考記事とします。

###ファイルが特定できるに必ず入っているデータを特定する
データ列から、1ファイルに必ず1つ入っているデータを探します。
参考記事のファイルフォーマット解説、特にHeaderの部分を見ます。今回はData Type Byteの4byteとData Sizeの4byte,計8byteを見ればなんとかなりそうです。
> Data Type Byte[0]	ASCII文字コードで".FIT"を格納する。
つまりData Type Byte[0]から順に{0x2E, 0x46, 0x49, 0x54}を格納します。

>Data Size LSB	Headerとファイル終端のCRCを除いたデータのサイズ。

###該当ファイルデータをデバイスから探す
デバイスのメモリの中身を見て、ファイルデータを探します。
まずはHxDでデバイスのメモリの中身を見ていきます。
ツールから、ディスクを開くを選択して、自分のデバイスを選択します。
この時、デバイスを壊してしまわないよう、読み取り専用で開いておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518409/fa3692c3-2fbc-0920-5b4b-c2abfb9a391f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518409/6b3fc8cb-8d90-5e9a-b697-b01b20bb12e5.png)

開いた後、先ほどのData Type Byteを検索して、まずはすべてのファイルデータを洗い出しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518409/29e8ada7-e5b7-496d-b456-cbd8d7fc0770.png)

こんな感じで検索結果が出ると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518409/225b7252-b58d-28ef-1bb7-b1c6963a2f26.png)

ここから、抜き取りたいデータがどれなのかを探していきます。
今回は、この381608D7.fitが目的のファイルなのですが、実際このファイルがどれなのかをバイナリで見ることができないので、この前後のファイルを見ていきます。今回は前二つを見ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518409/025427ac-b2ca-78ec-c8d2-245985d9f1de.png)

前のファイルをバイナリエディタで開いて、Data Type Byteの4byteとData Sizeの4byte,計8byteを確認します。
この確認した値を開いたディスクで検索し、その場所を特定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518409/d6a4dbf8-55d3-7227-332b-e1fdb74421d6.png)

この手順を２ファイル分繰り返した結果、このような結果になりました。
この赤枠で囲ったデータが、ほしいデータ列のはず、ということになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518409/f1898655-334a-6aba-4f29-029d6475c704.png)

###データを引き抜く
特定したデータ列を引っこ抜きます。引き抜き開始位置は先ほどのオフセット、サイズはData Sizeに記載されている値＋16byte(HeaderとCRCのサイズ)です。今回の自分のケースだとData Sizeは0x0000E311なので0x10を足して0xE321分の領域を選択し、コピーして新規ファイルとして保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518409/140c0f04-8203-6c2a-f6bb-77bef62e9269.png)

###CRCを計算してもらう
ここからCRCを計算するという作業が残っているのですが、それは他のサービスを使ってやってもらうことにしました。

https://www.fitfiletools.com/

こちらのサイトはFITファイルの中身のログを編集するサイトです。
項目を削除する「Field Stripper」を選び、先ほど保存したファイルを入力します。
削除項目は何もチェックせずGoボタンを押して、出てきたファイルをダウンロードするだけです。
本来はRecord部分を削除して、全体のCRCを計算するのですが、何も削除しなくてもCRCを計算しなおしてくれるので、便利でした。

###確認
FITファイルが読めるものであるかを確認するために、[strava](https://www.strava.com)というサービスにFITファイルを上げてみたところ、正常に記録が読み込めました。

#終わりに
普段から仕事でバイナリエディタでデータを見たり、データをダンプしたりしているので、こういうことをすることに対しての敷居が以前より下がった気がします。
メタゲノムの情報解析が学べるWeb教材（スライドや動画）

# はじめに
1年に1度の日本の分子生物学のビッグイベント、[日本分子生物学会](https://www2.aeplan.co.jp/mbsj2019/)が今日から福岡で始まりましたね。今回の分生でも腸内細菌叢や環境DNA等、アンプリコン解析やメタゲノム解析関連のWorkshopが毎日のように開催されています（相変わらずaway感がありますが…）。
学会でメタゲノムを扱った[データベース](http://microbedb.jp)や[ツール](http://leamicrobe.jp/)のブースで説明要員をしていると、メタゲノムの情報解析手法について、わざわざブースに来て質問してくださる方が毎日何人もおり、ありがたい話です。
メタゲノマーやメタゲノムに興味がある人は着実に増えているように思います。

# メタゲノムの情報解析
メタゲノム、実験計画やサンプリングの部分が極めて重要なのはもちろんですが、そこはOKだったとして、DNA配列データが得られた後の情報解析に苦労する場合が多いです。私もいつも頭を悩ませています。
様々な場所で色々な方々に、メタゲノムの情報解析について学べる資料は無いかと聴かれます。
個人的には、metagenome analysisのReview論文を何個か紹介したくなるのですが、おそらくそういうのではなくて、多くの場合答えとして求められているものはWebで無料で手に入る動画やスライド、チュートリアル記事なのかと思います。
ということで今日は3つほど、Webで無料で手に入るメタゲノムの情報解析について学べる資料を紹介します。
ただ、この分野は日進月歩なので、ここで挙げた資料も1,2年後には既に古すぎる内容になっているかもしれません。その辺は注意してください。

# 資料の対象レベル
UNIXコマンドある程度使えて、生物統計の知識がある人。
少しキツイレベルですね。

# メタゲノムの情報解析の資料
以下の資料は動画とスライドがあったりしますが、基本的に、スライドをざっと見る感じの学習法をお勧めします。まず解析の大体の流れを知るのが重要です。
そこから先深く学ぶには、論文読んだり実際に何か適当なメタゲノムデータを解析してみたりすると良いかと思います。
### 資料1
まず、日本語の資料としては、今年の9月末の[AJACS十勝2](https://github.com/AJACS-training/AJACS79)で私が90分ぐらいで喋ったメタゲノム解析ツールの概要の[スライド]
(https://togotv.dbcls.jp/ajacs2019033.html)。
CC-BYライセンス（ただし、スライド中で論文の図を貼り付けて引用している部分は、元論文のライセンスに準拠するので注意が必要。以下に紹介する他の資料でも同様だと思います）
「いきなり自分の資料最初に持ってくんのか」、とツッコミが入る気がしますが、まぁ許して。

### 資料2
次に、カナダのMetagenomic Data Analysis 2018という3日間のWorkshopの[スライド集](https://bioinformaticsdotca.github.io/metagenomics_2018)。
CC-BY-SAライセンス
Canadian Bioinformatics Workshopsというカナダの団体がホストしているWorkshopの一つ。メタゲノム以外にも過去に開催された[様々なバイオインフォマティクスに関するWorkshopの資料](https://bioinformaticsdotca.github.io/)がCC-BY-SAライセンスで公開されており、とても勉強になります。

### 資料3
最後に、EUのバイオインフォマティクスの研究所であるEBIで開発、運用されているメタゲノムデータベース、MGnifyのチームがメインで2018年に開催したMetagenomics Bioinformaticsという4日間のトレーニングコースの[スライド](https://www.ebi.ac.uk/training/online/course/metagenomics-bioinformatics)。
CC-BY-SAライセンス
コースで用いたDocker imageは以下にありますが、"If downloading the container for the entire course you will need a minimum of 4CPUs, 16GB RAM of memory, 100GB Disk memory, 500MB GPU. "とか書いてあるので全部ダウンロードする際はディスクの空き容量に注意してください。
https://hub.docker.com/r/ebitraining/metagenomics/tags/


以上、学会出張の夜にホテルで走り書いてみました。
Perforce Helix core Linux non-package installationの日本語訳

#はじめに
[Perforce](https://www.perforce.com)というバイナリファイルの扱いに強みがあり、オンプレミス環境のバージョン管理ツールをインターンで使っていた時にドキュメントを書く機会があったのですが、まだ情報が少ないと思うのでアドベントカレンダを機に記事を投稿します。

ドキュメント執筆時のインストールはpackage-based installationが（おそらく知識が足りずに）上手くできなかったので、non-package installationで行っています。
基本的な公式サイトに英語でやり方が載っているので、このサイトの日本語訳となります。
https://www.perforce.com/manuals/p4sag/Content/P4SAG/install.unix.quick.html



**`太字で灰色の背景がかかっている文字`**は、ターミナル（コマンドプロンプト、端末）で入力してもらう箇所です。また、`灰色の背景で太字ではない文字`は出力結果です。
入力例：**`mkdir newinstal`**
出力例：`Perforce db files in '/home/(user name)/newinstall' will be created if missing...`

#本文
1.まずperforceを色々入れる為のフォルダを作ります。
**`mkdir newinstall（好きなフォルダ名）`**
2.	その作ったフォルダへ移動します。
**`cd newinstall`**
3.	以下のページのリンクからp4dを[ダウンロード](https://www.perforce.com/downloads/helix-core-p4d)します。Family:Linux, Platform:Linux(x64)を選択して、Downloadします
4.	ダウンロードしたp4dを作ったフォルダへ移動します。
やり方は自由ですが、ファイルを開いてドラッグアンドドロップをするのが楽です。
5.	実行権限を付与するために以下のコマンドを入力します。
**`chmod 755 p4d`**
6.	Perforceユーザを持つようにOS環境を設定します。
**`export P4USER=perforce`**
7.	Helixサーバーのポートを持つようにOS環境を設定します。
**`export P4PORT=localhost:1666`**
8.	\`（バッククォート）で囲まれたpwdは-p 1666としてポートを、現在のディレクトリを指定して、P4D、サーバーの実行可能ファイルを起動します。
**`./p4d -r `\``pwd``` -p 1666 -J journal -L log -d`**（うまく網がけの部分のエスケープができなかった...）
この結果は以下の様に出力されます。
`Perforce db files in '/home/(user name)/newinstall' will be created if missing...
Perforce Server starting...`
9.	今度はp4をダウンロードするために、以下のリンクから3番と同じように[ダウンロード](https://www.perforce.com/downloads/helix-command-line-client-p4)します。
10.	ダウンロードしたp4をp4dと同じフォルダへ移動します。
11.	実行権限を付与するために以下のコマンドを入力します。
**`chmod 755 p4`**
12.	p4の情報を見る為に以下のコマンドを入力します。
**`./p4 info`**
このコマンドを入力すると、以下の様に表示されます。（名前やフォルダ構成は設定により変わります。）
`User name: perforce
Client name: linux-bruno
Client host: linux-bruno
Client unknown.
Current directory: /home/bruno/newinstall
Peer address: 127.0.0.1:12345
Client address: 127.0.0.1
Server address: localhost:1666
Server root: /home/bruno/newinstall
Server date: 2018/11/14 15:18:55 -0800 PST
Server uptime: 00:00:09
Server version: P4D/LINUX26X86_64/2018.2/1234567 (2018/11/02)
Server license: none
Case Handling: sensitive`
13.	3番と同じようにビジュアルクライアントソフトウェアであるp4vを[ダウンロード](https://www.perforce.com/downloads/helix-visual-client-p4v)します。
14.	ダウンロードしたフォルダを展開（解凍）します。
15.	展開したフォルダの中のp4vがあるフォルダに移動します。
**`cd （フォルダ名）`**で移動できるので、これで移動して下さい。
もし間違えた場合は、**`cd ../`**のコマンドで一つ前のフォルダへ戻れます。
16.	最後に以下のコマンドを入力するとp4vが起動します。
**`./p4v`**
Google Compute Engine＆Nginx＆Railsタイムアウト考察


[diffeasy Advent Calendar 2019](https://qiita.com/advent-calendar/2019/diffeasy)の3日目の記事です。

# タイムアウト対策

Webでの大量データのPDF、CSVダウンロードなど、API実行すると処理が圧倒的に長くなるとタイムアウトになります。根本のロジックを見直す、非同期処理やバッチ処理を検討することが必達です。

ただ、根本対策に時間を要してしまう可能性があったため、暫定対策としてのインフラ側のタイムアウト値設定を伸ばすことをやってみたのでまとめます。

4分（240秒）ぐらいかかる処理だったため、余裕を持って5分（300秒）ほど処理できるようにしたものです。

（WebAPIとしてありえないとは突っ込まないでほしい。一旦。。）

## 前提となる環境
- GoogleComputeEngine(Linux CentOS)
- GCPロードバランサ
- nginx
- Rails（APIモード）
    - Puma
- Vue.js（axiosでAPI実行）

## 処理順序は？
基本的に処理が進むにつれてタイムアウト値は短くする必要があります。
①API URL実行
②GCPロードバランサ
③GoogleComputeEngine(Linux CentOS)
④nginx
⑤puma（Rails）

## タイムアウト値を持っているのは？
今回の構成では以下2つのみがデフォルト保有しているものでした。
この2つを変更することでタイムアウト値を変えることが出来ます。
②ロードバランサ
④nginx

## 変更方法
### ②ロードバランサ
1. 負荷分散メニューの下部の青文字「詳細設定メニュー」を押下
2. 「バックエンドサービス」タブを選択
3. 編集ボタンを押下
4. バックエンドサービス詳細の上部の方にある鉛筆マーク
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142933/4eca52de-04be-036a-f13a-1a0eafc2bbe5.png)
5. これで30秒→300秒に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142933/38ce097e-a4e4-ba85-695e-e77d446f7c04.png)

### ④nginx
nginxのタイムアウト初期値は60秒。290秒に変更する。
`fastcgi_read_timeout` `proxy_read_timeout` をセットする。

```
    server {
        listen 10443;
        server_name xxxx.hogehoge.com;

        # タイムアウトまでの秒数を変更
        fastcgi_read_timeout 290;
        proxy_read_timeout   290;
    }
```

## まとめ
4分ほどかかる処理を作ってしまうのが、そもそもアンチパターンですね。
ただ、その処理をリファクタリングするのに時間をかけてユーザーを待たせる可能性があるのなら、長い時間を待たせて動かしてもらうのも対策の1つになり得ると思います。
NotchでNDI入出力方法

これは「Notch #madewithnotch Advent Calendar 2019」3日目の記事です。

# 動機
1年ほど前にNotchからNDIの出力結果をTwitterに投稿したが1年ぶりにNotchを立ち上げたらやり方を忘れていたので結果だけでなく過程もかこうと思いました。ついでにNDIの入力方法も調べたのでその結果です。初めてQiitaに記事を書くので見にくいところ等々多数ありそうです。次第に慣れていきたいです。
ちなみに1年前
https://twitter.com/katsuya_tsukui/status/1085227860699209729?s=20
あとNDIについては
https://rental.pandastudio.tv/blog/ndi/
とかに書いてあるのでここでは特に触れません。

# 使用ソフト
▼Notch(PLEライセンス）
https://www.notch.one/support/downloads_area/
▼Newtek NDI Tools
https://ndi.tv/tools/
▼TouchDesigner(コマーシャルライセンス)
https://derivative.ca/product

# 入力
#### 1.テストソースの作成
Newtek NDI Toolsの中にある、Test Patternsを起動しソースを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272258/bf98e77c-e194-d3ad-b824-7d8b4a8bcc96.png)

#### 2.Notch下準備
メニューバーで
Devices→VideoIn/Camera/Kinect Settings
NDIの項目があるのでIncoming Sources欄で信号が来てることを確認。
※表示されてない場合Refresh Soucesをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272258/5b3b396e-51b0-94b7-bd79-4f46c0e0c70b.png)

#### 3.ノード配置
Video NDI Sourceノード/Image2Dノードを配置して、Video NDI Sourceノードのプロパティ→NDI Sourceで選択。もしくはNDISourceName/NDISourceIPに手打ちする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272258/cb0b5820-443a-d340-00bf-0a4ba8d67333.png)

おしまい

# 出力
#### 1.NDIプレビュー環境作成
Newtek NDI Toolsの中にある、Studio Monitorを起動。
※ちなみにこの時StudioMonitorを起動しようとしたら「throw regopenkeyex(candidatekey) in copyestimatedsize()」というエラーが発生しダイアログが全く進まなくなった。
https://forum.cockos.com/showthread.php?t=225465
上URLに従ってYamaha Steinberg USB Driverを再インストールしたら問題なく起動したので一応メモとして。

#### 2.Notch
メニューバーで
Devices→VideoIn/Camera/Kinect Settings
NDIの項目があるのでSend To NDIにチェック。Sender Nameはお好みで。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272258/10b91c67-11c5-7e68-f75e-2a9044ae6b14.png)

#### 3.Studio Monitor
Studio Monitor左上にメニューボタンのようなものがあり、クリックしていくと先ほどのSender Nameのものがあるので選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272258/b3541f8d-8c8a-0d8a-075e-7339035a4c9c.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272258/ccddc5d9-1067-b288-aba1-a06862a47e61.png)

おしまい。

ここまででNDIの入出力ができるようになった。


# じゃあ複数入力できんのか
ライブ現場での使用を想定しているNotchなのだからもちろんできるはず。
カメラからの画をNDIで受けてエフェクトかけたりするだろう。
#### 1.テストソースの作成
Newtek NDI Toolsの中にある、Test Patternsを起動しソースを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272258/405bfa32-6a18-471e-43c0-8553096addab.png)

TouchDesignerでNDI Out TOPを作成。
※NDI Out TOPの作成にはコマーシャル版以上のライセンスが必要だったはずです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272258/e2db5e3a-3eb8-71e8-fcff-4085a8dea3b8.png)

#### 2.Notchの入力を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272258/2d6ff812-885b-1ab5-ebde-10efd588a3c4.png)
来てます。

#### 3.ノード配置
Video NDI Sourceノード/Image2Dノードを2つずつ配置して、Video NDI Sourceノードのプロパティ→NDI Sourceで選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272258/764d664d-0091-60e1-f6d7-760ba7ec7d8f.png)

そりゃできるか。

おしまい。
キレイだが重たいモデルを工夫して取り込む5ステップ

こちらは Unity #3 Advent Calendar 2019 3日目の記事です

# TL;DR
重たいモデルを、有償、無償のアセットを利用してパフォーマンス改善します。
基本的な戦略は、見た目が悪くならない程度に、不要なものを間引いていくという感じになります。

それぞれの手順を一つ実施するだけも改善は可能です。
長いので、気になったところだけを読んで試してもらえたらと思います。


# 重いモデルを工夫して取り込む5ステップ
1. 不要なモデルを削除する（取り込んでいない・・・）
2. モデルの頂点数を減らす
3. LOD を設定する
4. MeshBaker で Bake する
5. オプション編
6. おまけ（5ステップ・・・）

ここからは各手順について少し掘り下げて、最後におまけを書いています。

# 1. 不要なモデルを削除する
ここは手動でやります。
（便利なアセットがあるなら教えていただきたい。）

画面に表示されなていなくても、カメラの表示範囲に入っていると処理としては重くなります。
Unityアセットに手を入れず使用しているときや、屋内にしかいないのに屋外にモデルがたくさんあるなど、
意味のないモデルは削除しておきましょう。

当たり前だけど忘れがちなところの一つだと思います。
張りぼてみたいになってしまいますが、カメラから見たらわかりません！

# 2. モデルの頂点数を減らす
「[Mesh Simplify](https://assetstore.unity.com/packages/tools/modeling/mesh-simplify-43658)」or「[Mesh Optimizer](https://assetstore.unity.com/packages/tools/modeling/mesh-optimizer-154517)」を使用して頂点数を減らします。

* Mesh Simplify は有償ですが、どのバージョンのUnityで使用でき、使ってみるとかゆいところに手が届くツールです
* Mesh Optmizer は無料で使用することができますが、Unity 2019.2.1以上でないと使用できません。

どちらも簡単に使えます。詳細は過去記事を見てもらえたらと思います。

* Mesh Simplify -> [有償ゆえにかゆいところに手が届く、ローポリ化 Asset の Mesh Simplify を使ってみた](https://qiita.com/matchyy/items/17870e79478c85a0f55f)
* Mesh Optimizer -> [無料でハイポリをローポリにできる、 Mesh Optimizer を使ってみた](https://qiita.com/matchyy/items/a4b1e232c3531ab8272a)

# 3. LODを設定する
「[Automatic LOD](https://assetstore.unity.com/packages/tools/modeling/automatic-lod-43652)」or「[Amplify Impostors [BETA]](https://assetstore.unity.com/packages/tools/utilities/amplify-impostors-beta-119877)」を使用してLODを設定します。

* Automatic LOD は自動で Verts を削減したモデルを LOD に設定してくれる優れたツールです
* Amplify Impostors[BETA] はモデルを写真のビルボード形式にするので、うまくすると劇的な改善につながるツールです

どちらも簡単に使えます。詳細は過去記事を見てもらえたらと思います。

* Automatic LOD -> [1クリックでLODの設定からVertsの削減までしてくれる、Automatic LOD を使ってみた](https://qiita.com/matchyy/items/b012152f6a9105620640)
* Amplify Impostors[BETA] -> [LOD として設定することで、パフォーマンスを改善できる Amplify Impostors [BETA] を使ってみた](https://qiita.com/matchyy/items/f720ce485fd055d26ea4)

# 4. MeshBaker で Bake する
Unity のパフォーマンス改善でときどき出てくる、Batches と SetPass calls を改善します。
誤解を恐れずに言うと、MeshBaker は関連する Mesh やテクスチャーを一つに固めてドバっとロードして表示します。
このアセットも簡単に使えます、詳細は過去記事を見てもらえたらと思います。

* [Unity で Mesh を結合すると言えば？の MeshBaker を使ってみた](https://qiita.com/matchyy/items/bc02673e829ad6a5030c)

ちなみに、ライトの Bake とは関係ありません。

# 5. オプション編
場合によっては設定することでパフォーマンスの改善が望めるものです。

## DynamicBatching を On にする
配置しているオブジェクトが同じマテリアルなどを使用している場合に有効です。
同じモデルをコピーして利用するなど、現実的によくあると思うので、そういうときに設定してみてください。

![2019-12-01_16h58_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/943105da-56ec-a9c5-7816-afdc6aee0ef3.png)

# 6. おまけ
## MeshBaker ではなく、ライトを Bake する
言わずもがなかもしれませんが、これもとても効果の高い対応方法です。
これだけで一つの記事になってしまうので、ここでは割愛させてもらいます。
いろいろなサイトで紹介されているので探してみてください。

## スポットライト配置しすぎ問題
スポットライトは処理に負荷がかかる可能性があります。
特に範囲の大きなスポットライトは、処理に悪影響を与える可能性があるので、そういうライトが無いか見直してみてください。

## Scene ビューが重かった
Unity で開発しているときに Scene ビューを使うと思いますが、Scene ビューの描画もパフォーマンスに影響します。
もちろんビルドしたモジュールには関係ありませんが、
パフォーマンス改善しているときに気づかないと無駄な作業をすることになります。
パフォーマンス改善時には閉じるなどしておきましょう。

## Automatic LOD と Mesh Simplify
同じ会社が作っているアセットで、Automatic LOD を購入すると Mesh Simplify も含まれています。
安くなっているときに購入が吉です。
Gatsbyの超高速テンプレート(PWA, MDX, TypeScript対応)を作ったヨ！

# Gatsby.jsって？

この記事は**[Gatsby.js Advent Calendar 2019](https://qiita.com/advent-calendar/2019) 3日目**の記事です。

実は1日目も記事を書いてます([Reactの最強フレームワークGatsby.jsの良さを伝えたい！！](https://qiita.com/hppRC/items/00739eaf9ae7fc95c1ca))。中1日です。高野連に怒られるやつです。カレンダーが空いていたので記事を書きます。

よければGatsbyの良さを叫んだ上の記事も合わせてご覧ください！

改めてとなりますが、**Gatsby.js**は**React**で作られた**静的サイトジェネレーター**です。内部的にGraphQLを用いてデータを取得し、markdownからHTMLを生成、などの処理を簡単に行うことができます。

Gatsbyはとても凄いので、プラグインなどをブチ込むと簡単にPWA対応した超高速サイトが作れたりします。もはや静的サイトジェネレータとしてだけでなく、create-react-appに代わるフレームワークとして使えるなと思っている次第であります。

そんなこといいつつも、プラグインの選定をしたり、TypeScript対応をしたりと、新しくプロジェクトを始めるときは面倒ごとが多いものです。**Gatsbyが初めての人にこそ、こういうめんどくささを省いたわかりやすいテンプレートが必要**です。

というわけで急造ではありますが、**簡単なテンプレートを作成しました**。テンプレートというよりスケルトンと言った方が正しそうなほど薄いものですが、以下の項目をバッチリ実現しています。

- **PWA**(Progressive Web Application)対応
- **SEO**対策(各種metaタグ,twitter ogpなど)
- **TypeScript(v3.7.2)**対応
- **MDX(JSX in Markdown)**対応
- **EsLint, Prettier**対応
- Netlifyへのデプロイ用ファイルをあらかじめ用意、Netlifyでの**http/2**対応
- **emotion(CSS-in-JSライブラリ**、styled-componentsより色々出来る)対応
- **ResetCSSやsiteのconfig用のコンポーネント**をあらかじめ用意

スケルトンなのでサイトスピードは早くて当然といえば当然ですが、lighthouse(chromeの拡張機能、サイトのパフォーマンス測定が出来る)のスコアは以下のようになっています。ぶっちぎりの最高得点。


<img width="1280" alt="スクリーンショット 2019-12-03 23.41.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386550/8ffd35b1-4742-9612-32ee-8bd379e5abde.png">


lighthouseってオールグリーンだとめでたい感じにエフェクト出るんですね...(知らなかった)

このスケルトンのGitHubリポジトリはこちらです。

**GitHub: [https://github.com/hppRC/gatsby-starter-hpp](https://github.com/hppRC/gatsby-starter-hpp)**


また、実際にNetlifyにデプロイしてあるので、そちらでも動作確認が出来ます。

**実際のサイト: [https://gatsby-starter-hpp.netlify.com/](https://gatsby-starter-hpp.netlify.com/)**

見た目がきらびやかな訳ではないですが、シンプルな分結構いじりやすいと思うので、ぜひこのテンプレートをもとに超高速で楽しいサイトを作ってみてください!!

# まとめ

本記事は以下の記事、リポジトリを多分に参考にさせていただきました。ありがとうございます！！
まだ出来ていませんが、のちほどGitHubのリポジトリにも明記しておきたいと思います。

[Gatsby.js を完全TypeScript化する](https://qiita.com/Takepepe/items/144209f860fbe4d5e9bb)
[https://www.lekoarts.de/](https://www.lekoarts.de/)
[LekoArts/gatsby-themes](https://github.com/LekoArts/gatsby-themes)


最後に...

**Gatsbyはいいぞ!!!!!!!!!!!!**

明日の記事担当者は未定です！でも多分僕が書くと思います。進捗が産めたら書きます！！
ofxCLIを作った

[ofxCLI](https://github.com/nariakiiwatani/ofxCLI)というaddonを作ったので紹介

# ことの始まり

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ターミナルとかコマンドプロンプトみたいな形式でキー入力を行ごとに受け付けるoFのaddonを探してたんだけど、もしかしてない？<br>絶対誰かofxCLIとかofxCUIみたいなの作ってると思ったんだけど・・・。</p>&mdash; 岩谷成晃 (@nariakiiwatani) <a href="https://twitter.com/nariakiiwatani/status/1200649722932776962?ref_src=twsrc%5Etfw">November 30, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# できること

## 1行テキストエディタ
このgifでは改行してるように見えるけど、実際は履歴に溜めてるだけで、戻って編集はできない。
カーソル移動の操作や仕様はXcodeのエディタの挙動を参考にした。
（Option押しながらで単語ごと、Command押しながらで行全体の移動）
上下キーで履歴を辿れる。
TABキーで、バインディング（後述）されてる候補を表示できる。
![oneline_editor_first_touch.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16556/e47f303b-e844-22e7-4943-e5f90cbf62a9.gif)

## 関数バインディング
```C++
prompt_.subscribe("bgcolor", [](float r, float g, float b, float a) {
	ofBackground(ofFloatColor(r,g,b,a));
}, {0,0,0,1});
```
こんな感じで登録すると`bgcolor [r,g,b,a]`でofBackgroundを呼べる。
ちなみに登録時の引数`{0,0,0,1}`は指定しなかった場合のデフォルト値（省略可）。
ラムダ関数、メンバ関数、`std::function`が登録可能。

![change_bgcolor.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16556/6ad2bdca-3f9e-d4bd-642e-eb734207a8b7.gif)

## 変数バインディング
```C++
prompt_.subscribe("textcolor", text_color_.r, text_color_.g, text_color_.b, text_color_.a);

void ofApp::draw() {
	ofPushStyle();
	ofSetColor(text_color_);
	prompt_.drawDebug(0,10);
	ofPopStyle();
}
```
こんな感じで登録すると`textcolor [r,g,b,a]`でテキストカラーを変えられる。
デフォルト値は登録時の値になる。
![change_textcolor.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16556/aa874d39-13ff-5da6-3841-b70a89894513.gif)

## OSCバインディング（Receive）

```C++
ofx::cli::Prompt prompt_;
ofx::cli::BindOscReceiver osc_receiver_;

void ofApp::setup() {
	prompt_.subscribe("print", [](std::string s) { std::cout << s << std::endl; });
	osc_receiver_.bind(prompt_);
}
```
こうしておけば、アドレス`/print`に飛んできたOSCメッセージの第一引数をコンソールに表示する。
※先頭のスラッシュの有無は設定可能
※デフォルトのポートは6000番（変更可能）

## OSCバインディング（Send）

```C++
ofx::cli::Prompt prompt_;
ofx::cli::BindOscSender osc_sender_;

void ofApp::setup() {
	prompt_.subscribe("print", [](std::string,int){});
	osc_sender_.bind(prompt_);
}
```
こうしておけば、`print `に続けて打ち込んだ内容がOSCで送信される。
例えば`print a 3`だったらアドレス`/print`に文字列`s`と整数`3`が送られる。
もし`print`がsubscribeされてなかった場合は変数の型が全てstringになる。
※先頭にスラッシュを付与するかどうかは設定可能
※デフォルトの送信先は`localhost:6000`（変更可能）
※subscribeしてるコマンドしか送らない設定も可能
※subscribeしてないコマンドしか送らない設定も可能

# 応用
```C++
Prompt::proc(const std::string&)
Prompt::proc(const std::string &program, const std::vector<std::string> &args)
```
Promptに直接打ち込まなくても、これを使えば外部から直接コマンドを叩ける。
subscribeを呼び出すコマンドを登録しておけばoFとofxCLIの上で自作のスクリプト言語を動かすみたいなことも可能・・・？（知らんけど）
m5stickvが起動しないときの対処法

#背景
自分用のメモ
## 状況
- Maixpy や SDcard を入れた瞬間に、瞬停し、その後、USB接続しても全く起動しなくなる現象が起きた。
- 探り探りのPGで動かしているため、不安定になっているのかも。。。

（復活したが原因不明、調査中）

#M5stickvが起動しないときの対象法
結論的に、M5StickV_Firmware_1022_beta.kfpkg（[公式のこのページ、Downloadにある](https://docs.m5stack.com/#/en/quick_start/m5stickv/m5stickv_quick_start?id=flash)） を kflash_gui.app で焼き直す(downloadする)と復活した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148337/58252313-2f36-fc3b-fec9-155ff3f75f63.png)

このとき、画面は真っ暗なまま、電源が入っているかも不明だが、とりあえず上記を行うと復活。

動かなくなったときは内部バッテリで動かそうと、しばらく電源供給を続けたが、だめだった。諦めようとした矢先、[春風商事](https://hrkz.tokyo/m5stickv-troubleshooting/)さんのところで対象が色々ありやってみたが試せず断念。（そもそも起動しなかったため）

ダメ元で接続認識されているか、確認のつもりでファームウェアを焼き直そうと焼き直したら復活した。画面がうんともすんとも言わなかったのに。。なぜなんだ（引き続き調査予定）
第1回テックビール作成の旅

#はじめに
今回ラズパイを使うのに慣れていないので、LEDで視覚化するのにも挑戦してみます

この記事では**C言語でLチカ**のみ書いています

##検証環境
・raspberrypi3 modelB+
・wiringPi
・学習キット

#内容
##テックビール作成で用意したもの

• スイッチング電源
https://www.amazon.co.jp/gp/aw/d/B07KJC5M6N/ref=ya_aw_oh_bia_dp?ie=UTF8&psc=1

• 温度センサー
https://www.amazon.co.jp/gp/aw/d/B07PB9VGQ4/ref=ppx_yo_mob_b_track_package_o4_img?ie=UTF8&psc=1

• ラズパイ　学習キット
https://www.amazon.co.jp/gp/aw/d/B075167Y4D/ref=ppx_yo_mob_b_track_package_o4_img?ie=UTF8&psc=1

• raspberrypi3 modelB+
https://www.amazon.co.jp/gp/aw/d/B07FQ9678G/ref=ppx_yo_mob_b_track_package_o5_img?ie=UTF8&psc=1

• ペルチェ素子
https://www.amazon.co.jp/gp/aw/d/B074LG79N6/ref=ppx_yo_mob_b_track_package_o6_img?ie=UTF8&psc=1

• モータードライバ
https://www.robotshop.com/jp/ja/cytron-13a-dc-grove.html?gclid=Cj0KCQiAoIPvBRDgARIsAHsCw09VKl2Yl-7V7ht6O7_k0bwziesKMNIaAHqbJImeJJ2ALIHlbiCO68MaAnAEEALw_wcB

##今回この記事で使用したもの

・raspberrypi3 madelB+
・ラズパイ　学習キット

##wiringPiインストール

1,gitをインストールしていない方はまずgitインストールします

```
$ sudo apt-get install git-core
```

2,インストール後、wiwingPiをcloneしてきます

```
$ git clone git://git.drogon.net/wiringPi
```

・clone出来なかった場合は以下のコマンドを実行

```
$ git clone https://github.com/wiringpi/wiringpi
```

3,wiringPiというディレクトリが作成されるので以下のコマンドを実行し、移動します

```
$ cd wiringpi
```

4,以下のコマンドを実行

```
$ sudo ./build
```
5,バージョン確認

```
$ gpio -v

gpio version: 2.46
Copyright (c) 2012-2018 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty
```
##LED接続
![image.png (460.9 kB)](https://img.esa.io/uploads/production/attachments/3505/2019/11/23/66701/87a4281d-a5ac-4045-910e-ff344dbcdabd.png)
6,LED接続

| ＋ | − |
| --- | --- |
| Pin 11（GPIO17） | Pin 09（Ground） |

![image.png (2.4 MB)](https://img.esa.io/uploads/production/attachments/3505/2019/11/23/66701/1e6b7b46-e09b-4f3a-a28c-a6208b393a9a.png)

##Cコード

7,test.cというファイルを作成します

```
$ vi test.c
```
・以下のソースを追加します

```
#include <stdio.h>
#include <wiringPi.h>

#define LED1     17
#define LOOP     5
#define WAITMS   1000
#define LED_ON   1
#define LED_OFF  0

int init(void){
  if(wiringPiSetupGpio() == -1) return -1;
  pinMode(LED1, OUTPUT);
  return 0;
}                   

int main(void){

    int i;

    if (init() != 0 ) return -1;
    pinMode(LED1, OUTPUT);

    digitalWrite(LED1, LED_OFF);

    for(i = 0; i < LOOP; i++){

            //LED on
            printf("LED点灯\n");

            digitalWrite(LED1, LED_ON);
            
            //sleep
            delay(WAITMS);
            
            //LED off
            printf("LED消灯\n");

            digitalWrite(LED1, LED_OFF);

            //sleep
            delay(WAITMS);

    }

    return 0;

}
```
##実行
8,コンパイルを行い、実行

```
$ gcc -o test test.c -lwiringPi
$ ./test
```
##まとめ
次回は、LEDで正流と逆流をやってみたいと思います
Debianでgit diff-highlightを使う

# 環境

* Debian 10
* Git
    * ```apt-get install git```でインストール済み

# 手順

※基本的には、[参考サイト](https://udomomo.hatenablog.com/entry/2019/12/01/181404)の手順と同じです。

diff-highlightディレクトリに移動します。
ディレクトリ内にMakefileがあるので、makeコマンドを叩いてdiff-highlightバイナリを生成します。

````
$ cd /usr/share/doc/git/contrib/diff-highlight
$ sudo make
````

次に、/usr/local/bin/diff-highlightに対して、シンボリックリンクを貼ります。

```
$ sudo ln -s /usr/share/doc/git/contrib/diff-highlight/diff-highlight /usr/local/bin/diff-highlight
````

~/.gitconfigを編集し、以下を追加します。

```
[pager]
    log = diff-highlight | less
    show = diff-highlight | less
    diff = diff-highlight | less
```

tigでも同様にハイライトできるようにするには、
~/.tigrcを編集し、以下を追加します。

```
set diff-highlight = true
```


# 参考

[gitのdiff-highlightを使い始めた - りんごとバナナとエンジニア](https://udomomo.hatenablog.com/entry/2019/12/01/181404)
リリース？デプロイ？インテグレーション？デリバリ？CI/CDツールって結局なによ？？？

## TL;DR

最近CI/CDツールとかよく話題になっているので軽く調べてみたら
リリースとかデプロイとかインテグレーションとかデリバリとかよくわかってないことに気付いたので備忘録がてらメモに残します。

## 用語解説

### リリース

狭義では「新製品・新機能の完成を開発チームから外に発表すること」
だが実際には拡大解釈されてユーザが使える状態にまで持ってくことまでをいうことが多い印象。

### デプロイ

本番環境にソフトウェアを**配置**して利用できる状態にすること。
デプロイに含まれるプロセスは

1. リリース(対外的に発表)
2. インストール(本番環境に導入する)
3. アクティベート(依存関係のあるプログラムのインストール・アクティベーションコードの記入、アプリ起動など)

Webアプリの場合はエンジニアが3.まで行うが、ネイティブアプリの場合はGooglePlayやAppleStoreから落とせる状態にまで持っていくこと。
一般的なリリースのイメージはデプロイなのかなと。

### ビルド

ソースコードから実行可能ファイル(たとえば `.exe` )を作成すること。
ビルドに含まれるプロセスは

1. 静的解析(バグ発見)
2. 機械語への翻訳([コンパイル](#コンパイル))
3. ライブラリとのリンク

いわゆるインタプリタ言語(スクリプト言語)でのビルドの立ち位置はエンジニアの中でも揺れている印象がある。
自分はインタプリタ言語ではビルドは内部的にはどうであれ人間が意識的に行う必要がないのであれば
サービスを提供するうえでは存在しないことにしてしまっていいのではないかと考えている。

#### コンパイル

プログラミング言語で書かれているソースコードをOSがそのまま実行できる機械語に翻訳する。
いわゆるコンパイラ言語(C, Java, COBOL)などではあらかじめコンパイルをしておく。

#### インタプリタ

ちなみにインタプリタ言語でもコンパイラを作って実行可能ファイルを生成することはできるし、
インタプリタを利用したプログラムの実行も内部的にはCやJavaに変換されている(らしい)

### インテグレーション

CIのIの部分。インテグレーション。
ソースコードの変更差分をリポジトリに**統合**すること。

#### CI(継続的インテグレーション)

変更差分のリポジトリへの統合を自動的に行っていくシステムのことだが、
ビルドやテストがインテグレーションの前に自動的に行われ、
並行して複数の開発者がいても競合やバグに気付かせてくれることが多い。

### デリバリ

CDのDの部分。デリバリ。
共通のリポジトリの変更をデプロイできる状態に準備すること。

#### CD(継続的デリバリ)

リポジトリへの変更があった時点で自動的に様々なテストを実施し、
それが通ったらあとボタン一つ押せば本番環境にデプロイできる状態にしておいてくれる。
リポジトリへの変更があったらそれをデプロイまで全部してくれる場合は**CD(継続的デプロイ)**と呼称が変わる。

## おわりに

* ふだん使っている言葉でもどこまでを含む言葉なのか、を意識してこなかったなという反省
* 日本語版のWikipediaと英語版のWikipediaの情報量の違いすごい
* 結局RedHatとAWSの情報が一番わかりやすく、信頼もおける感じがした
* もし「そこちがくね？」的指摘あればどんどんお願いします。

## 参考
[CI/CDのエキスパートが解説：CI/CDとは何か？ なぜ今、必要とされるのか？](https://codezine.jp/article/detail/11083)
[ビルドとデプロイって結局なんやねん！？！？！？？？みたいな記事](https://qiita.com/isoyam/items/3d1fc5cf7403cdf4818d)
[「ビルド」機能とは？仕組みやコンパイルとの違いを解説](https://proengineer.internous.co.jp/content/columnfeature/6308)
[ソフトウェアデプロイメント](https://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%83%A1%E3%83%B3%E3%83%88)
[CI/CD とは - Red Hat](https://www.redhat.com/ja/topics/devops/what-is-ci-cd)
[継続的デリバリーとは?](https://aws.amazon.com/jp/devops/continuous-delivery/)
[Continuous integration](https://en.wikipedia.org/wiki/Continuous_integration)
[Continuous delivery](https://en.wikipedia.org/wiki/Continuous_delivery)
【CSPO】Product Owner研修を終えて、改めて気づけたこと

#◆アジャイルソフトフェア開発宣言

###・プロセス・ツール　＜　対話
###・包括的なドキュメント　＜　動くソフトウェア
###・契約交渉　＜　顧客との協調

#◆プロダクトオーナー(PO)とは
###ROIを最大化する為に、動け！

・**what・When**を決め、**How**に干渉しない

・プロダクトに対して、**ビジョン**を持つ
　すなわち、**全責任**を負うと言うこと

・スプリントレビュー：**「学んだこと」**の観点も持つ

・**プロダクトを誰よりも詳しいこと**
　そして、ステークホルダーからのプロダクトに対する質問は、秒単位で回答する

・開発チームと**同じ場所**にいることが大切（プロセス・ツール　＜　対話）

・スプリントで失敗する（スプリント内に終わらないこと）ことは、**成長のチャンス**と捉える

・スプリントを終えて得るのは、**プロダクト**と**チームの成長**

・プロダクトバックログの順位付けの**最終決定権**を持つ

・開発チームをしっかり**観察**することで、状況を把握できる（※干渉はしない）


#◆ゲームを通して、気づいたこと
###○自己組織化
本ゲームを通して、気づいたことは
###→「開発チームを信じる」ということが、本ゲームを通して大切なことだと感じた

【ゲーム】
１．複数人で輪を作る
２．任意に２人を心の中で選ぶ
３．一斉に、選んだ２人と等しい距離になるように動く
４．全員が止まれば終了

**→　一斉に動けば、凄い時間が掛かかりそうなので、
　　一人ずつ動き、全員が条件を満たすまでループする方が、早いのではないかと思った**

しかし、
上記の方法で実際行うと思っている以上に早く終り、自分が考えていた方法より早いと感覚的に思った。
そして、
自分が考えていた方法　→　POが開発チームに干渉している状態だと気づけた

###○対話
本ゲームを通して、気づいたことは
###→開発チームとの「対話」が大切だと感じた

【ゲーム】
１．開発チームと設計チームを決め、別室に別れる
２．設計チームは、お題の絵を文章のみで、開発チームに伝える
３．開発チームは、その文章をも元に絵を描く
４．設計チームは、開発チームの絵を観察することは可能

開発チームとのコミュニケーションが、（チャット・テレビ会議ではダメで、）対話ではならない理由が分かり、腑に落ちた

---
スクラムについて、まとめています
・[【Qiita】スクラム](https://qiita.com/yuj/items/ece0abdeb2b2446cc886)
検索ヘルプの作成方法

データ定義
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473735/0042e75c-e75b-c67a-ffd5-f7705ffb7e63.png)

選択画面の定義
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473735/bd91691f-fcc7-3b33-6858-4d147259df79.png)

処理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473735/a946656a-145c-178e-9fe6-3e0f828ab7e0.png)

サブルーチン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473735/76153daa-430b-6c2c-2d76-39406b6d7b99.png)


画面表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473735/72a96bd8-ea31-aaab-9a45-fdcb2e749a32.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473735/12faa425-37c9-c854-374d-bb4c1d5cb9d6.png)
Laravelマイグレーション

## マイグレーションでできること

テーブル定義を管理する仕組みのこと。
マイグレーションファイルを作成し、それを実行することでファイル内で定義した内容をもとにデータベーステーブルを作成する。
>参照記事
>https://www.hypertextcandy.com/how-laravel-migration-works

### マイグレーションファイルの作成

```
php artisan make:migration create_{テーブル名}_table
```

`database/migration`ディレクトリに`年_月_日_時間_create_{テーブル名}_table.php`というファイルが作成される。
`up`と`down`という2つのメソッドを持つクラスが存在する。

`up`メソッドの中にどういうテーブルにするかの詳細を書いていく。
＊カラム名・型など

>公式ページ参照
> https://readouble.com/laravel/5.5/ja/migrations.html

`down`メソッドはロールバック（マイグレーションを元に戻す機能）の時に実行される。

### マイグレーション実行

```
php artisan migrate
```

実行することによってデータベースに3つのテーブルが作成される。
**①作成したファイルのテーブル**
→ファイル内で定義したテーブルが作成される
**②migrationsテーブル**
→マイグレーションを実行する度に追加されたファイル名が保存されるテーブル
**③password_resetテーブル**

### マイグレーションの変更

```
php artisan make:migration {マイグレーションファイル名} --table={テーブル名}
```

`{マイグレーションファイル名}`の部分はそのままクラス名になるためわかりやすい名前にする
＊カラム追加の場合
→add_cloumn_name_users_table

現在あるマイグレーションファイルを編集するのではなく新たに変更を加える内容を記載したファイルを作成し実行する。
例えばカラム名を変更する際は`renameColumn`メソッドを使用する。
おそらくそのまま使用しても使えないため変更追加用パッケージをインストールする必要がある。

```
composer require doctrine/dbal
```
これをインストールすればカラム名を変更することが可能となる。

### ロールバック

```
php artisan migrate:rollback
```
`down`メソッドを実行する
データベースの`migrations`テーブルのバッチ単位で処理される。
ロールバックを行うことによってバージョン管理のようにマイグレーション内容を元に戻すことができる。
【jQuery】activの時にFontAwesomeをつけたい

#コトの顛末
アクティブ状態の箇所にカレントとしてFontAwesomeのアイコンをつけたかったのですが、
jQueryでaddClassすると思ったようなレイアウトにならない事案が発生。
hamlで直書きして調整するとあんなに楽なのになぁ...

ということで小技発見したのでメモがてら書きます。

#問題の事案

FontAwesomeのclassをjQueryでaddClassすると、classはちゃんとつくのですが、
そのclassが付与されたところのレイアウトを合わせるのが大変だったので楽な方法ないかな〜と思ってました。

下記のように空の＜i＞タグを用意して、

``` index.hmlt.haml
%i.fa
```
それにclassつけたら擬似的に直書きと同じことができる！って思ったんですが...

ブラウザで表示を確認すると、**空タグのせいかレンダリングされたコードの中にいないため、**
**jQueryのaddClassが不発になるという事案が発生しました。**

#このような処理で小技を実行しました。

まず、普通に FontAwesomeのアイコン使いたいところに書き込みます。
これでスタイルを調整しておきます。

```index.hmlt.haml
%i.fa.fa-play
```

でも、アクティブじゃない時は　classの「fa-play」が必要ないので削除します。
しかし！このままでは空タグ扱いとなり、ブラウザ上で表示されない（つまり
jQueryが効かない）ため、スペースのエンティティタグを入れます。

```index.hmlt.haml
%i.fa &nbsp;
```

「＆nbsp」これを入れることにより、空欄判定にならず、jQueryが効きます。

```test.js
$(".fa").addClass("fa-play");
```
こんな感じのjQueryをあてがってあげましょう。

<img width="623" alt="b31635ca63e9307306ce485f2179b203.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480700/6ad834d5-cf49-746d-f0d9-6c8fc535ba2d.png">

無事にactiv時だけカレントマークつきました！

#終わりに
逆の方法として、すでについているクラスを消すは簡単な方法でしたが、
読み込みの際に、ズラ〜っと表示され、
読み込み完了後に、カレント箇所だけアイコンがついている状態になる。
読み込み完了後は良いですが、途中経過が気持ち悪かったので、
どうしてもちゃんと必要な箇所にだけアイコンをつける方式で実装したかったのです。
なので小技発見できてよかった！
これが本当に良い方法かはわかりませんが。
uGUIで線を引く～その１：三角メッシュの描画編～

# はじめに
**「uGUIで線を引きたい！」**
と思ってuGUIのコンポーネントをあさっていたら、
**「...ない！？」**
ということに気づき
**「試しにつくってみるかああ！！」**
と重い腰を上げて、今に至ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321577/83bf5d68-a4b7-54a5-fd51-f675ecc3ab8f.png)

# 流れ
調べてみると、uGUIのGraphicsクラスに**「３つ頂点から、三角形メッシュを描画する」**というメソッドがあるようなので、これで２つメッシュを作り、細長～い四角形を作ることで、線にする作戦をとります。

[Unityリファレンス：Graphics](https://docs.unity3d.com/ja/current/ScriptReference/UI.Graphic.OnPopulateMesh.html)

そもそもこのGraphicsって何？という話ですが、
uGUIのCanvasに描画する基底クラスのようです。
（Image,RawImage,Textなどなど）
というわけで、このGraphicsを継承して、まずは三角形を描画する**「Triangle」**というクラスを作ってみたいと思います！
# 作ってみる
Graphicクラスには、メッシュ生成時のコールバックOnPopulateMeshが用意されているので、こちらを使います。
引数でもらったvhに、頂点とメッシュを設定すればおしまいです。

```csharp
using UnityEngine;
using UnityEngine.UI;

// ↓ugui描画に必須なコンポーネント達
[RequireComponent(typeof(CanvasRenderer))]
[RequireComponent(typeof(RectTransform))]
public class Triangle : Graphic
{
    /// <summary>
    /// uGUIでメッシュ生成する際のコールバック
    /// </summary>
    /// <param name="vh">この引数にメッシュを設定すればOK</param>
    protected override void OnPopulateMesh(VertexHelper vh)
    {
        //（１）座標の準備
        var v1 = new Vector2(0.0f, 0.0f);
        var v2 = new Vector2(100.0f, 0.0f);
        var v3 = new Vector2(0.0f, 100.0f);
        // (２)（１）の座標に頂点を追加
        AddVert(vh, v1);
        AddVert(vh, v2);
        AddVert(vh, v3);
        // (３)（２）で追加した頂点に三角形メッシュを設定
        vh.AddTriangle(0, 1, 2);
    }

    private void AddVert(VertexHelper vh, Vector2 pos)
    {
        var vert = UIVertex.simpleVert;
        vert.position = pos;
        vert.color = color;
        vh.AddVert(vert);
    }
}
```
# 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321577/bef0024c-9cfb-f9eb-31d9-b9100de0d7fa.png)
おお。。ホントに描画できた。。。
# 次回予告
次は細長い四角で線をつくります。
[uGUIで線を引く～その２：線の描画編～](https://qiita.com/inpax23/items/5af5eb2a8d9722fadcad)
内部テーブル定義時のWITH NON-UNIQUE SORTED KEY

内部テーブル定義時のWITH NON-UNIQUE SORTED KEY XXX COMPONENTSの使い方

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473735/652f902d-d8df-c33c-9087-dabdd4cd18c4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473735/87c49340-6c44-afcb-06bd-0353bba362d3.png)
Google Cloud Functions（Firebase）でのいろいろ

#Google Cloud Functions(GCF)でGoogleCloudStorageを弄ったとき

簡単なファンクションを作成。 `firebase-admin`と`firebase-admin`をパッケージを入れておけば基本何でもできる。

ストレージを使ってみる。

```index.js


const functions = require('firebase-functions');
const admin = require('firebase-admin');
// アプリケーションのデフォルト認証（functionsの属するプロジェクトなら自由に操作できる）
admin.initializeApp();
// ここでストレージの箱を作成
const Storage = admin.storage();
// ここでバケットを作成
const Bucket = Storage.bucket('ストレージ指定');

exports.helloWorld = functions
    // GCFのスペック指定
    .runWith({
        timeoutSeconds: 200,
        memory: '512MB'
    })
    // SDKを使わずに呼び出すなら.onRequestを使用する<-CORS設定が必要 
    // SDKを使うなら.onCallを使用する<-CORS設定が必要なし
    .https.onRequest(async (request, response) => {
        //.onRequestの場合、corst対応で下記追加 
        response.set('Access-Control-Allow-Origin', 'http://localhost:3000');
        response.set('Access-Control-Allow-Methods', 'GET, HEAD, OPTIONS, POST');
        response.set('Access-Control-Allow-Headers', 'Content-Type, authorization');
        //あとは普通の処理

        //レスポンスは下記の形式で返せる
        response.json({ data: 'test' });
    });
}
```

Functionは上記の形で記載可能。
次は、ストレージにオブジェクトをUPLOADする方法。

```js
// functionの処理部分に2つのステップを追加するのみ
// バケットからFileオブジェクト作成(ストレージのフルパス記載)
const file= Bucket.file('xxx/xxxx/image.png')
// ファイルのsaveメゾットを使って保存。
await file.save(screenshotBuffer);
```
【備忘録】チェインのモード変更するアイコンが出てこない!!【AndroidStudio】

#成功時画面
![ed0f72143b7c142867f9752e5a3c7ea4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463548/6b07a6aa-0814-9edb-29d4-f0b61e44fe5a.png)

チェインのあとは上の画像みたいにチェインのモードを操作できるアイコンがでるみたいなんですが、
なぜかでないので、調べてみました。


[AndroidStudio layout_constraintVertical_chainStyle] 【検索】

直接操作する方法は、検索してもわからず、直接いじることにしました。
となるとチェインを詳しく知る必要がありますね。
チェインには
<dl>
<dd>・**View間のマージンを等間隔にする「spread」**</dd>
<dd>・**指定したViewを横並びにして左右を等倍のマージンにする「packed」**</dd>
<dd>・**左右のマージンを0にして内側のViewは等間隔になるようにマージンが設定される「spread_inside」**</dd><br>
の３つがあるみたいです。
※参考ブログ(https://techium.hatenablog.com/entry/2017/02/27/194714)

</dl>参考ブログを参考に直接テキストからLayoutを操作してみたいとおもいます。

チェインしたいtextViewの両方に
`app:layout_constraintVertical_chainStyle="packed"`
を追加して動作確認。

![8a3e136650d12214dee3f1c5a064e1f6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463548/73c71000-cd5c-cc25-06cc-7d341d9d330c.png)

想定通りに動作させることができました。
結局アイコンでてこない問題は解決できずなので、知っている方いたら教えていただければと思います。
自宅でDMZ環境構築

##概要

お久しぶりです。
自宅サーバ公開していて、今までサーバが同じセグメントにいたのですが放置していた・・・
やっと切り分けたので備忘録として投稿

##構成


###今まで
![名称未設定ファイル-ページ1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355784/ee09c89a-23b6-6596-eb77-a098ecfd04c6.jpeg)

***
###変更後

![名称未設定ファイル-ページ2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355784/e94c1581-93da-58d2-7a13-44ca45526396.jpeg)

***

##変更内容ポイント

###セグメント分け
サーバがいるセグメント(DMZ)と日常的に使うセグメントを区分けすること
これにより、万が一サーバが乗っ取られてしまっても、日常的に使うセグメントに影響が及ばなくなる(万全ではない)

###ファイアウォール
せっかくセグメントを分けても、XからY側に通信要求できてしまうとあまり意味がないので、ルータ２のファイアウォールの設定で
X側からの要求の通信はすべて破棄します。(YからXはOK)

###ルータ2の設定切り替え
これはルータによると思うのですが、僕が使用していたルータの場合、ブリッジモードで運用するとIPを持たなくなるため
設定変更するのに一度初期化しなければうまくいきませんでした。(結構躓いた)

##まとめ
一番めんどくさいのは配線。
memory allocation error対策でEC2にスワップ領域を作成する

# はじめに
EC2でJenkinsを実行中に微妙にメモリが足りなくて、`memory allocation error`でジョブが失敗することがありました。
稀な実行ジョブのためにインスタンスタイプを変えるのもしゃくなので、スワップ領域を作成して対処することにしました。

# 実施手順
[公式ドキュメントを参考](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-memory-swap-file/)

現在のスワップ領域を確認

```
$ grep Swap /proc/meminfo
SwapCached:            0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
```

1GiBのスワップ領域を作成

```
$ sudo dd if=/dev/zero of=/swapfile bs=100M count=10
```

スワップファイルの読み書きのアクセス許可を更新

```
$ sudo chmod 600 /swapfile
```

Linux スワップ領域のセットアップ

```
$ sudo mkswap /swapfile
```

スワップ領域にスワップファイルを追加して、スワップファイルを即座に使用できるようにする 

```
$ sudo swapon /swapfile
```

手順が正常に完了したか確認

```
$ sudo swapon -s
```

`/etc/fstab` ファイルを編集して、起動時にスワップファイルを有効にする

```
$ sudo vi /etc/fstab

tmpfs       /dev/shm    tmpfs   defaults        0   0
devpts      /dev/pts    devpts  gid=5,mode=620  0   0
sysfs       /sys        sysfs   defaults        0   0
proc        /proc       proc    defaults        0   0
+ /swapfile   swap        swap    defaults        0   0
```

終わったか確認する

```
grep Swap /proc/meminfo
SwapCached:            0 kB
SwapTotal:       1023996 kB
SwapFree:        1023996 kB
```

以上でした。