OmniAICreator/Qiita-1.07M huggingface dataset:
なぜウェブ地図をラズパイでやるのか

[国連ベクトルタイルツールキット](https://unvt.github.io)がなぜ Raspberry Pi 実装（Misora）にリソースを割いているのか、について、技術者の立場から整理してみました。

# 地図情報をベクトルタイルで表現する目的
ある程度の規模で動いているウェブ地図は既にみなベクトルタイルに移行しつつあるため、公的機関のウェブ地図も、ウェブで生き残るためにはベクトルタイルに乗る必要があるためと考えています。

ウェブ地図運用上のベクトルタイルのメリットは、第１に送付データサイズの削減であると考えています。画像タイルに比較して、送付するデータのサイズを75%削減し、1/4程度に抑えられるというのが経験値です。Google Maps は既に 2010 年ころにはベクトルタイルへの移行を開始しています。

2015年ころにベクトルタイルのオープンソース仕様及び実装が Mapbox から提供されました。現在では、例えばマップル・オンさんのプロダクトや地図マピオン、Yahoo!地図などでもこの Mapbox 系統のオープンソースベクトルタイル技術が使われており、esri の ArcGIS API for JavaScript や Microsoft の Azure Maps でも、この Mapbox 系統のオープンソースベクトルタイル技術が採用されています。この流れの中で、海外では英国、スイス、カタルーニャ等で Mapbox 系統のオープンソースベクトルタイル技術が採用されています。

第２、第3のメリットとしては、地図情報からのハイパーリンクが容易になることと、地図のレンダリングがクライアントに任されることでレンダリング品質を上げたり、三次元描画を含む動的な描画を実現したりしやすくなるということが挙げられますが、このあたりは未だに未来の技術の範疇であるかもしれません。

火急のニーズは、通信帯域の圧縮であると思います。強いプラットフォーマーが通信帯域の圧縮技術を自在に使えるときに、ただでさえシェア弱者である上に通信技術にはむしろ弱い我々が、通信帯域の圧縮技術を持たないという選択はありえない、というのが１段目の論理であり、その圧縮技術を情報通信技術に素人の我々が独自開発することもありえない、というのが２段目の論理になります。

# ベクトルタイルを国連や地理空間情報当局が進める目的
国連や地理空間情報当局のような公的機関は地図業務を止めることはできないが、ウェブ地図のシェアはますます高まっている。一方で、ベースマップのウェブ刊行能力については、自ら獲得するという選択肢がベストである、という理解に立っています。プラットフォーマーによるウェブ地図プラットフォームは、プラットフォーマーのベースマップに付加情報を与えるのには素晴らしいプラットフォームです。他方で、プラットフォーマー以外がベースマップを出すということは基本的には想定されていないと認識しています。

紙の時代にそうしてきたように、公的機関には公的機関のニーズのために地図を出す要求がある。その要求をウェブ時代にも満たしていくためには一定のウェブ地図能力を公的機関が獲得できるようになっていなければならない。ウェブ地図においてはベクトルタイルが当然のものとなってきている。この状況において、公的機関が効率的にベクトルタイルのウェブ地図能力を共用していくためのアプローチが「ベクトルタイルに関する既存のオープンソースソフトウェアを、公的機関関連の技術者にも使えるようにツールキット化する」というものでした。

# 国連ベクトルタイルツールキットを Raspberry Pi で動かす目的
デモと技術移転が Raspbery Pi 利用の目的です。

本質的には、ベクトルタイル技術の配備先はウェブ上のサーバであり、国連ベクトルタイルツールキット自身は、様々なサーバ環境と、様々なソースデータに対応できることを目的に柔軟なツールキットとして作られていますが、デモや技術移転の際には、アドホックな環境と、適当なサンプルデータを用いることになります。

ほとんどの公的機関にとって、ベクトルタイルは新技術であり、ベクトルタイルを扱うための計算機環境は存在しないと前提するべき状況です。

国連ベクトルタイルツールキットを広めるにあたって最初の主戦場となるのは、会議室や研修室のような場所であり、インターネット接続もなければ、開発環境が整った PC を持ってくるような参加者も少ないような場所です。

そのような場所で、一人当たり 50 ドル程度の支出は可能であるとして、最初の５分で確実にデモを行い、2時間ほど頂ければとりあえず作業を流してみるような技術移転ができる、ということを行うために、 Raspberry Pi の活用を行っています。

「インターネット接続を含む、何もないところから、できるだけ素直な Linux を触ってもらう」ための手段として、 Raspberry Pi を用いていることになると思います。

Raspberry Pi を用いることを覚える前には、研修員の持ち込んだ計算機環境それぞれに国連ベクトルタイルツールキットをインストールしてもらう方式（Docker を挟む形式を含む）を試していましたが、今のところ、Raspbery Pi を用いて行う方法が最も（トレーニング中の）準備作業時間やトラブルが少ないと感じています。

デモと技術移転以外の目的での Raspberry Pi の運用、例えばエンタープライズネットワーク内部での活用や災害対応時の活用、というのは有望なアイディアですが、まだまだユースケースの整理から必要なアイディアであると認識しています。また、私自身はデモと技術移転にもっぱら集中することが必要な状況にあります。この部分は、国連ベクトルタイルツールキットのパートナーの方の進捗に頼るべきところと私は認識しているところです。

# おわりに
書き落としへの気付きやその他質問などあれば、ぜひコメントなどを通じてご教示いただけると助かります。
After Effects でマーカーコメントを使ったテロップ

テキストレイヤーの Source Text をマーカーのコメントから取得する。
マーカーを通過した時に変更されるのでタイミングが取りやすい。

テキストレイヤーの Source Text に以下の Expression を記述する。

```Javascript:Expression
index=thisLayer.marker.nearestKey(time).index;
if((time<thisLayer.marker.nearestKey(time).time)&&(index!=1)){index--};
thisLayer.marker.key(index).comment;
```
オブジェクトを複製しよう(Prehub)

####前置き
C#なら一度書けば覚えるのに、Unity関係の機能は何度やっても覚えられない……。(-_-)zzz
ゲームのステージ作るのにPrehub使いたいのになあ。( ;∀;)
このブログは何のためにあるのか、それは覚えるのが面倒なもののメモのためだー！(定期)
####ここから本編![スクリーンショット (226).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610399/518fc332-23cb-4943-6f06-8b18e1e45cb0.png)

**3分Prehubクッキング**
1分目　<dd>Prehubにしたいオブジェクトを作りましょう。</dd>
2分目　<dd>PrehubにしたいオブジェクトをAsset内にドラック&ドロップしましょう。</dd>
3分目　<dd>Prehubにしたいオブジェクトが青くなったのを確認して、お茶を飲みましょう。</dd>
<dl>
</dl>

**大量生産！大量消費！**

```C#:prehub.cs
using UnityEngine;
//最初にステージを生成する
public class stagecreate : MonoBehaviour
{
    //スクリプトにPrehubをアタッチする
    public GameObject fields;

    void Start()
    {
        //Prehubを作成
        GameObject field = Instantiate(fields) as GameObject;
        //ここで位置情報を入力したり、名前を変えたり、後はお好みで。
    }
}
```
Instantiate関数ってのを使います。Prehubを生成する関数という認識で大丈夫！(*'ω'*)

```C#:destroy.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Control : MonoBehaviour
{
    void Update()
    {
        //一定範囲内にいないとこのオブジェクトを破壊する
        if(this.transform.position.x　> 50)
        {
            Destroy(this.gameObject);
        }
    }
    //何かに当たったら反応
    void OnTriggerStay(Collider other)
    {
        //当たったものが"weapon"だったらこのオブジェクトを破壊
        if (other.gameObject.name == "weapon")
        {
            Destroy(this.gameObject);
        }
    }
}
```
参考までに作ったPrehubを破壊するオブジェクト。(Prehubである必要は特にない)
Prehubに直接このスクリプトをアタッチすれば動いてくれる。('ω')ノ
たくさんPrehubを破壊する場合はプールという機能を使えばいいらしいけど、勉強不足なので、勉強後にそれについてもメモ書いとこうかなあ(計画倒れになるやつ)

Instantiate関数についてはこれが詳しく書いてくれてます。(*^^)v
>オブジェクト生成の仕方　Instantiate
>https://qiita.com/Teach/items/c28b4fe5ca8dc4c83e26#prefab%E3%81%AEtransform%E3%81%AE%E3%81%BE%E3%81%BE%E3%81%A7%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88
Dockerやってる人向けのVagrant超入門

Vagrantがどういう仕組みで動いてるのか理解するために、馴染みのあるDockerと比較してみるのが分かりやすかったのでまとめます。

## VagrantはOSの仮想化、Dockerはコンテナ化の技術
Dockerはコンテナ化によって、アプリの実行環境を他のプロセスから隔離させることができますが、**親マシンのOSがLinuxでないと動きません**。Macや他のOSでDockerが動いているのは、例えばDocker for Macというアプリをインストールした時に、裏でLinuxを仮想マシンとして動かすことができるようになるので、その仮想マシン内でDockerを利用しているからです。

反対にVagrantだと、Mac上でもWindowsやLinuxを動かすことができ、これがVagrantとDockerの主な違いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77729/122908b9-9f21-5dd8-b346-5c096e50b561.png)

Vagrantの仮想マシンの場合だとGuest OS上でアプリを動かしていますが、コンテナ化の場合だとOSはホストマシンのOSに依存しています。仮想マシンの場合は「ハイパーバイザー（Hypervisor）」というレイヤーがOSの仮想化を可能にしていて、VirtualboxやVMWareがこの機能を担っています。


## Vagrantをもっと詳しく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77729/ad367229-f361-b0f4-a2db-1017722f07e7.png)

このハイパーバイザー層を担うvagrantのプロバイダーには、VirtualBox/VMWareなどがあり、vagrantのほとんどの機能はプロバイダーも事前にインストールしないと使えません。
[公式Doc](https://www.vagrantup.com/docs/providers/)ではVMWareが推奨されていますね。[Dockerもプロバイダーとして使えるようです。](https://www.vagrantup.com/docs/docker/basics.html)

各インスタンスの設定や必要なライブラリのインストールは、vagrantのプロビジョニングに設定します。shellや、Ansible/Chef/Puppetなどのツールを使います。


## どう違う？

DockerよりVagrantの方が初心者には理解しやすいと思います。Dockerはswarmやcomposeなど複数のコンテナを動かすための独特の概念がたくさんありますが、Vagrantは基本的にprovider/box/provisionの概念を押さえればなんとなく使える気がします。

リソース的には、OS全体を仮想化するのでVagrant環境の方が重く、起動も遅いです。DockerではOSは仮想化しないので、起動も早いです。[Docker for Macは重い](https://qiita.com/yuki_ycino/items/cb21cf91a39ddd61f484)ですが、Dockerの方が基本的にリソースの消費が少ないです。

## まとめ
* VagrantはOSレベルの仮想化。Dockerはコンテナレベルの仮想化。
* Vagrantは理解しやすいが、RAM/ディスク容量など親マシンのリソースを圧迫する場合がある。起動が遅い。
* Dockerのアーキテクチャの方が複雑だが、CPU/RAM/ディスク容量の消費が少なくて済む。起動が早い。
* dockerでのimageと同じようにvagrantにはboxというパッケージがあるので、環境構築が楽

## 参考
https://www.docker.com/resources/what-container
https://www.vagrantup.com/intro/index.html
https://deliciousbrains.com/vagrant-docker-wordpress-development/
https://rancher.com/playing-catch-docker-containers
https://www.slideshare.net/AnatolyBubenkov/vagrant-are-you-still-develop-in-a-nonvirtual-environment
[rails,payjp]カード登録の際に登録画面をリロードしないとトークンを作成できない時の解決例

#1.原因
今回の筆者の問題はturbolinksが効いていたからでした。

#2.なぜ起こった？
理由は、turbolinksの機能が影響範囲ページの遷移を非同期で行う（影響範囲の全てのviewページが合わさって１ページとして扱う）ためでした。
他画面を経由し複数で情報を持った状態でクレジットカードの登録をしようとすると、悪意のある情報を持っている危険性があり安全性を保てないと見なされてしまいpayjpからの返答を受けることができなくなっていました。

#3.解決方法
クレジットカード登録画面のみturbolinks(非同期通信)を切ってページ遷移するように記述することで筆者は解決しました。

具体的には`app/views/layouts/apprication.html.haml（全体のbodyの記述部分）`と`app/views/cards/index(ページ遷移元)`を下記のように修正しました

```ruby:app/views/layouts/apprication.html.haml
〜前略（header部分の記述は省略します）〜

%body
    - if content_for?(:body_attributes)
      = yield(:body_attributes)
    = render 'layouts/notification'
    = yield
```

```ruby:app/views/cards/index
〜前略〜
= link_to "/cards/new", class: 'method-of-payment__body__button__icon',"data-turbolinks": false do
#app/views/cards/newに遷移する記述の部分に "data-turbolinks": false をつけました
〜後略〜
```

#4.参考記事
https://gist.github.com/saboyutaka/8727377
https://qiita.com/Cheekyfunkymonkey/items/216bf7426493e6213927
https://qiita.com/keitah/items/05f02efe4e11ab2473e8
vagrantとdockerについてメモ書き

# 背景
> 最近、自分の周りで流行っているDockerについて知りたくなった

> 筆者は、Vagrantのが好きだが、最近、Dockerに興味を持ったので調べ程度です。次回は実際に試してみようと思います。

# 前提
> Docker for Windowsもありますが、最終的にVagrantで仮想ホストを構築して、その上でDockerを使えるようにしていきたい

# 今回のゴール
> Dockerコンテナを内容把握までの前提の前提メモ資料レベルです

# 概要
##Vagrant
> 仮想マシンの構築や管理をするためのコマンドラインツール
構成情報を記述した設定ファイルを元に、仮想マシンの構築から設定までを自動的に行うことができる
Vagrant単体では仮想化はできない（VirtualBoxなどの仮想化ソフトウェアが必要）

##Docker

### Dockerとは
[https://kitsune.blog/docker-summary](https://kitsune.blog/docker-summary)

>コンテナ型のアプリケーション実行環境
実行環境を他のプロセスから隔離し、その中でアプリケーションを動作させる
VirtualBoxなどでOSをまるっと仮想化するのと比較して、ホストOS上の1つのプロセスとして実行されているためリソース消費が少ない

### Docker古いバージョンがある場合は、アンインストールします
>ドッカーの古いバージョンが呼び出されたdockerまたは、docker-engine。これらがインストールされている場合は、それらを関連する依存関係とともにアンインストールします。

```vim
$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
```

# 参考
[https://docs.docker.com/install/linux/docker-ce/centos/](https://docs.docker.com/install/linux/docker-ce/centos/)
> ↑  公式  

#
> 参考になったURL ↓  

[https://www.techceed-inc.com/engineer_blog/2807/](https://www.techceed-inc.com/engineer_blog/2807/)

[https://teratail.com/questions/155962](https://teratail.com/questions/155962)

[https://qiita.com/reinsF82/items/82e19533a1e6895d5e4c](https://qiita.com/reinsF82/items/82e19533a1e6895d5e4c)
Chromium系ブラウザのdevコンソールで画像やリンクのURL一覧を一気にコピーする

# クイックスタート
F12->consoleに以下をコピペして実行。
selectorとattrの中身は好きなものに書き換える

```javascript
var selector = "a";
var attr = "href";
var urls = Array.from(document.querySelectorAll(selector))
.map(x => x.getAttribute(attr))
.map(x => new URL(x, document.URL).toString());
console.log(urls);
var text = urls.join("\n");
copy(text);
```
クリップボードの中にURL（などのattrで指定した要素）の一覧がコピーされる

# やっていること
- Array.from()の中にquerySelectorAllを入れることでエレメントを全て配列化
- 配列をmapしてその中でgetAttribute(attr)することで"href"など指定したプロパティ一覧の配列にする
- 更にmapでURLオブジェクトを作成し相対パスを絶対パスに変換した上でstrへ変換。URL関連以外をコピーしてる時や相対パスのまま欲しい時はここは不要。テキスト処理したければこのタイミングで適当にmapで処理を入れる(2020/04/07追記)
- join("\n")で改行コードを挟んで結合した文字列にする
- copy()はコンソール限定のビルトイン関数で、その引数がクリップボードに入る
【Flutter】BLoCパターンとは？

## BLoCパターンとは？
BLoCパターンは、Business Logic Componentの略
BLoC PatternはFlutterでのアプリケーション開発時に用いる、状態管理手法の1つです。
ビジネスロジックをコンポーネント単位で管理しやすくするためのパターンです。

## BLoCのガイドライン
1. インプットとアウトプットは、単純なStreamとSinkに限定する。(Inputs and outputs are simple Streams/Sinks only.)
2. 依存性は、必ず注入可能でプラットフォームに依存しないものとする。(Dependencies must be injectable and platform agnostic.)
3. プラットフォームごとの条件分岐は、許可しない。(No platform branching allowed.)

メモ的に参考資料をまとめておきます。

## 参考記事
- [長めだけどたぶんわかりやすいBLoCパターンの解説](https://qiita.com/kabochapo/items/8738223894fb74f952d3)
- [BLoCパターンとはなにか - FlutterとAngularの間でModelのコードを再利用する実践を通じての考察](https://ntaoo.hatenablog.com/entry/2018/10/08/072933)
- [FlutterのBLoCパターンについて得た知見](https://sudame.hatenablog.com/entry/2019/04/24/235702)
- [【Dart/Flutter】導入したBLoCパターンアーキテクチャについて全体像をまとめてみた](https://qiita.com/arthur_foreign/items/4b1bf1892439780c4690)
iOS app の習得日記 (1)

こちらの記事を参考に
実習中
(https://qiita.com/gomi_ningen/items/4e0e5bd98f08c4bcf93d)


```
import UIKit

class ViewController: UIViewController {

    
    @IBOutlet weak var lable: UILabel!
    
    @IBAction func buttonOnTouchUpInside(_ sender: Any) {
        let now = Date() // 現在時刻を取得
        let dateFormatter = DateFormatter()
        dateFormatter.locale = Locale(identifier: "ja_JP") // ロケールを指定
        dateFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss" // 時刻表示のフォーマットを指定
        // 指定したフォーマットで現在時刻を取得してラベルに反映させる
        lable.text = dateFormatter.string(from: now)
    }
    
    
    }
```

シミュレーターでトライするも
日付がでない

(https://ediienote.com/Wp_ediieNote/2019/09/21/swiftsignalsgabrt/)

こちらの記事が参考になった。

どうやら　接続を何回もやったようで、
接続先が複数になってた。

一つにもどしたらできた

![スクリーンショット 2020-04-05 2.30.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409293/b8120986-a8ce-e7ff-dcc2-d000b052f474.png)

しかし
レイアウトが重なるのはなんでだろう？
xcodeではちゃんと離れているのに、、、
Eclipse 補完パターン追加方法

# はじめに

Eclipseには初期状態でも便利な補完パターンがいくつも登録されております。しかし、使っていると…

* これもあったりいいな～
* 他のテキストエディタではこれ補完してくれるのにEclipseではしてくれないのね…

と思うようになりました。
Eclipseでは補完パターンを簡単に追加変更削除をすることができますので、紹介します。

# やり方

ウィンドウ > 設定 > PHP > エディター > テンプレート

を開きます。すると補完パターンを見ることできます。ここから補完パターンの追加は勿論、既存の補完パターンをカスタムすることもできます。

# 例

私はよく[explode](https://www.php.net/manual/ja/function.explode.php)でカンマ区切りの配列を作るのですが、その場合…

**名前**
explode

**説明**
explodeカンマ

**コンテキスト**
php statemets

**パターン**
explode(",", $$${});${cursor}

を作成します。補完から*explodeカンマ*を選択してEnterを押すと…

```php3
explode(",", $!);
```

と出てきます。分割文字*","*が初めから入力されており、カーソルが分割する変数名を入力する部分に入るため、いきなり変数名を入力できる！
同様の手順で*explode改行*などを作っておけば、補完のプルダウンにある程度完成されたステートメントをいくつも置いておくことができそうです。便利便利！！

インポートもできるみたいなので、私が愛用している補完パターンも後日紹介予定です。
機械学習のお勉強〜Pandas編〜

#機械学習のお勉強〜Pandas編〜

前回に引き続き今度はPandasについて学習したのでアウトプットとして投稿します。

##1.Pandasって？

PandasとはNumpyと同様にデータの整形を行ったり、
可視化や前処理にも活躍する外部ライブラリ
こちらもNumpyと同様、Anacondaには最初からインストールされています。

##2.インポート文

```pyhton:test.ipynb
import pandas as pd
```

pandasを使う際にいちいちライブラリ名を書くのは手間なのでpdで呼び出せるようにしましょう。

##3.どんな時に使うの？

1.データの整理
2.データの可視化
3.データの前処理

どれも機械学習において重要な要素です。

##4.主な関数

###DataFrame関数
その名の通りデータフレームを作成する関数です。

```python:test.ipynb
#自作ver
test = pd.DataFrame({'culumn1':[1,2,3,4],
                     'culumn2':[3,4,5,6]})

#既存のデータを入れる場合
data = pd.read_csv('csvファイルパス')
```

DataFrameの引数は辞書型です。
read_csv関数は引数にCSVファイルを取ってあげるとCSVファイルを読み取ってデータフレームを作成してくれます。

###データフレームの確認

データフレームの確認は以下の関数で行えます。

```python:test.ipynb
#概要の確認
test.info()
#先頭から３列のデータを確認
test.head(3)
#末尾から３列のデータを確認
test.tail(3)
#全ての列を確認
test.columns
#全てのインデックスの確認
test.index
```

headとtailの引数の列数のデータを表示してくれます。
引数を記載しない場合、デフォルトとして５列表示します。

###列の削除と追加

```python:test.ipynb
#列の追加
test['column3'] = [5,6,7,8]
#列の削除
test = test.drop(culumns='culumn3')
```

列の追加は列に存在しないカラム名を指定して、そのカラムにデータを入れる。
削除する際はdrop関数を用いてカラム名を指定する。

###データの参照

```python:test.ipynb
#データがわかりにくいのでインデックスに名前をつける
test.index = ['test1','test2','test3','test4']
#特定のデータを抽出する
test.loc['test1','culumn1']
#特定の列を取得
test.loc['colums1','columns2']
```

作成したデータフレームインデックスを作成していないとわかりにくいためインデックスを付与。
インデックス名と列名を指定することでそれに対応した値を取得。
列名のみの指定も可能で、その列全体を取得してくれます。

##欠損値処理

機械学習では重要度の比率が高め


```python:test.ipynb
#nanを使うためにnumpyをインポート
import numpy as np

#欠損のあるデータを作成
test = pd.DataFrame({'column1':[1,2,np.nan,4],
                     'column2':[5,np.nan,7,np.nan]})

#データフレームの表示
print(test)
#欠損の有無を調べる
test.isnull().sum()
```

欠損データはNaNと表示されます。
isnull関数は欠損のあるデータを確認することができ、欠損のあるデータが1として出力されます。
欠損があるとグラフにした時とんでもないことになるので欠損への対処法を書きます。

```python:test.ipynb
#欠損のあるデータを削除する
test_dropna = test.dropna()
#欠損のあるデータを置き換える
test_fillna = test.fillna(test.mean())
```

dropna関数は、NaNのあるインデックスを全て削除します。
fillna関数は、NaNを他の何かに置き換えます。今回はtestデータの平均に置き換えました。
データは基本的に削除ではなくfillna関数で何かに置き換えることが大半だと思われます。(学習データが膨大で多少消しても問題ない限りは)

#5.まとめ

データの整理のめちゃくちゃ出来るなと感じました。
Numpyより出来ることが多くてびっくりしています。
Numpyの拡張的な存在なので当然といえば当然か、、、

Numpyは全ての基本なのでPandasも覚えつつNumpyもしっかり覚えましょう。

以上
フリーなAPIエンドポイント一覧(メモ用)

## 最強
https://github.com/public-apis/public-apis

## 使い方
Indexに張られてるリンクをクリックすると、該当サイトの一覧が現れる。
リンク先のAPIがAuth, HTTPS, CORSに対応しているかどうかがわかるので、必要なAPIを叩く。

フリーなAPIエンドポイントで、かつCORSを無視してローカルから叩きたければ、
Auth: No
CORS: No or Unknown(ほぼCORS制約なし)
を探して、そのページリンク先にあるAPIを叩けば良い。
EC2 Instance Connectでブラウザベースの接続ができない時の対処

###Instance Connectのブラウザベースの接続
普段は自分のPCからsshでEC2のinstanceにログインしていましたが、
Instance Connectのブラウザベース接続というものがあると知りました。
これを使うとインターネット環境があればどこでも自由にEC2のinstanceへログインできるそうです。

そこで以下を参考にして、Instance Connectのブラウザベースで接続を試みました。
[EC2 Instance Connect のセットアップ](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-connect-set-up.html)

![Screenshot from 2020-04-04 15-26-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191895/cae9402d-6e92-fa8f-ecdf-35dfe06877ee.png)

すると、画面が黒いまま何も表示されない・・
![Screenshot from 2020-04-04 15-26-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191895/2f7149dd-725d-84a0-89a3-03f2d07a2beb.png)

そして、結局、接続失敗！！
![Screenshot from 2020-04-04 15-49-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191895/c3fd1bf9-e86b-5e92-91be-32d5a4addf53.png)


ローカルPCからはsshでC2にログインできるのに、
Instance Connectのブラウザベースでは接続が失敗しました。

###試行錯誤した結果、この場合の確認ポイントは以下の3点でした。

####1.セキュリティグループのインバウンドの設定
対象のEC2インスタンスのセキュリティグループのインバウンドの設定に以下を追加する必要があります。
タイプ:ssh 
プロトコル:TCP
ポート範囲:22
ソース:カスタム 3.112.23.0/29
![Screenshot from 2020-04-04 10-05-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191895/a22ebf35-ca6e-d1c6-05cf-ed7d1b4ef739.png)

####2.IAM(ユーザ)の設定
consoleにloginするIAM(ユーザ)に、以下のポリシーをアタッチします。

設定項目と設定値
Region:ap-northeast-1
AWS accountID:000000000000
InstanceID:i-99999999999999999
Osuser:ubuntu(AmazonLinux2のデフォルトのユーザー名はec2-user、Ubuntuの場合はubuntu)

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ec2-instance-connect:SendSSHPublicKey",
            "Resource": "arn:aws:ec2:ap-northeast-1:000000000000:instance/i-99999999999999999",
            "Condition": {
                "StringEquals": {
                    "ec2:osuser": "ubuntu"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "ec2:DescribeInstances",
            "Resource": "*"
        }
    ]
}
```

####3.instance側の設定
対象のinstanceにsshでログインして、以下を実行します。
`sudo apt-get update`
`sudo apt-get install ec2-instance-connect`

4つの新しいファイルが作成されていることを確認します。

```bash 
$ ls /usr/share/ec2-instance-connect/
eic_curl_authorized_keys
eic_harvest_hostkeys
eic_parse_authorized_keys
eic_run_authorized_keys
```
これでブラウザベースのInstance Connectができるはずです！！

---
####これでも解決しない場合
なお、ここまでやっても接続できない場合、
以下のように許可の範囲を一時的に広げて確認してみましょう。

- セキュリティグループのインバウンドのIPの範囲を「0.0.0.0/0」まで広げてみる
- consoleにloginするuserのIAMにAmazonEC2FullAccessのポリシーをアタッチしてみる

EC2 Instance Connectはインターネットが繋がれば、どこからでもEC2のinstanceにログインできるため、事前に準備してログインできるようにしておくと何かあった時に役立つと思います。

参考
---
[AWS IP Address Ranges](https://docs.aws.amazon.com/general/latest/gr/aws-ip-ranges.html)
[EC2 Instance Connect の特徴や注意点についてまとめてみる](https://qiita.com/hayao_k/items/7b44ed1cd11651272985)
Uglifier::Error: Unexpected character '`'　Herokuデプロイ時のエラー解消方法

#はじめに
今年の1月末からプログラミングの学習を開始したばかりの初心者です。
今回作成した個人アプリをHerokuでデプロイしてみたのですが、途中で発生したエラー解決について自分用の備忘録として初投稿してみました。


※今回はあくまで発生したエラーの解消法のみをシンプルにまとめています。
Herokuでのデプロイ方法については参考にした記事を最下部に貼っているので気になる方はそちらをご確認ください。

※開発環境
・Ruby 2.5.1
・Rails 5.2.4.2
・heroku/7.39.2 darwin-x64 node-v12.13.0


###エラー内容
---
Herokuでデプロイ中に以下のようなエラー文言が表示されデプロイに失敗しました。

```ruby:ターミナル
remote:  !
remote:  !     Precompiling assets failed.
remote:  !
remote:  !     Push rejected, failed to compile Ruby app.
remote: 
remote:  !     Push failed
remote: Verifying deploy...
remote: 
remote: !       Push rejected to (設定したアプリ名).
remote: 
To https://git.heroku.com/(設定したアプリ名).git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/(設定したアプリ名).git'
```
ターミナルを遡って見てみると、エラー原因について以下のような記述が。

```ruby:ターミナル
remote:        rake aborted!
remote:        Uglifier::Error: Unexpected character '`'
remote:        --
```
エラー文言からバックフォート(`)がunexpectedだからダメだよ〜となっているんだなという事は何となく理解したものの、じゃあどうしたら良いのかは分からないので調べてみました。
（ちなみに自分はapp/assets/javascriptのファイル内でバックフォートを使った記述をしていました。）

###解決方法
---
config/environments/production.rb内にある以下の記述をコメントアウトしてあげればOKでした。

```ruby:production.rb
# config.assets.js_compressor = :uglifier　　　　　#この一文をコメントアウト
```

コメントアウトした後はGithubでコミット&プッシュをしてmasterに反映させます。
GitHub Desktopを使用している場合は、changeに変更内容が上がっていると思うのでコミット&プッシュ。


ターミナル上でコマンドを打つ場合は以下のように行う。
①コミットするchange(ファイル)の選択

```ruby:ターミナル
$git add -A　　#コミットするchangeの選択。　-Aは全部ということ
```
②選択したファイルのコミット&プッシュ

```ruby:ターミナル
$git commit -m "コミットメッセージ" 　#""内には変更内容が分かるメッセージを入力
```

これでmasterに変更が反映されたので、改めてHerokuにデプロイします。
以下のように表示され、無事にデプロイが完了しました！

```ruby:ターミナル
remote: Verifying deploy... done.
To https://git.heroku.com/(設定したアプリ名).git
 * [new branch]      master -> master
```

###最後に
---
production.rbファイルを変更した後、コミット&プッシュを忘れない！
初めこれをする前に再度デプロイをしてしまって全く同じエラーが出ました。。:sweat:

##参考記事
Herokuでのデプロイ方法はこちらの記事を参考にさせてもらいました。
[【初心者向け】railsアプリをherokuを使って確実にデプロイする方法【決定版】](https://qiita.com/kazukimatsumoto/items/a0daa7281a3948701c39)

[エラー解決時に参考にさせていただいた記事](http://taremimi.hatenablog.jp/entry/2018/03/31/044914)
【覚書】新リポジトリでプロジェクトをコミットする手順

# はじめに
プライベートですが、バージョン管理を初めておこなう自分向けに、
タイトルのとおりの手順を
忘れないよう残すために記載しています。

用語の言葉遣いも間違えている可能性があります。
(もし間違いがありましたら、お知らせください。)

# 本記事で記載する手順の範囲
 1. Githubでのリポジトリの作成
 2. SourceTreeで「URLからクローン」をする
 3. Xcodeで作成するプロジェクトの保存先を設定する
 4. SourceTreeで確認

※豆知識(リポジトリ作成後にコミットが出来ない時)

# 手順
## 1. Githubでのリポジトリの作成

自分のGithubのページから新しいリポジトリを作成する。
作成した後は、リポジトリのURLをコピーしておく。

<img width="1265" alt="スクリーンショット 2020-04-05 0.40.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344537/7bf0d08b-d918-9410-b353-8b49040d8496.png">


## 2. SourceTreeで「URLからクローン」をする
Sourcetreeから「URLからクローン」を選択して、クローンをおこなう。

<img width="483" alt="スクリーンショット 2020-04-05 0.54.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344537/6dfa1414-9907-d79f-67ba-452eff4319f9.png">
　　　　　　　　　　　　　　　　　↓
<img width="672" alt="スクリーンショット 2020-04-05 1.03.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344537/7381057c-7237-1f5e-6980-a3e00b0cccd3.png">

## 3. Xcodeで作成するプロジェクトの保存先を設定する
Xcodeでプロジェクトを作成する。
その際、保存先を手順2でクローンして出来たフォルダを指定する。

画像では「Create Git...」にチェックをしていますが、
チェックを入れなくても問題ありません。(別件によるものです)

<img width="804" alt="スクリーンショット 2020-04-05 1.07.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344537/51abe049-8979-1537-3f81-fcc0b55906c3.png">

## 4. SourceTreeで確認
プロジェクトを作成したら、各種ファイルが作成される。
これにより保存先フォルダに変更が出来たため、Sourectreeにも変更が反映されているか確認をする。

<img width="1225" alt="スクリーンショット 2020-04-05 1.42.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344537/969e90a6-8dce-1df0-faca-2068316df069.png">


## 豆知識
リポジトリ作成後コミット(Push)ができない場合は、
以下のURLを参考にすると良い。

[Gitの最初のコミットは空コミットにしよう](https://qiita.com/NorsteinBekkler/items/b2418cd5e14a52189d19 "Gitの最初のコミットは空コミットにしよう")
electron-packagerで404エラー

# 何であるか

[30分で出来る、JavaScript (Electron) でデスクトップアプリを作って配布するまで](https://qiita.com/nyanchu/items/15d514d9b9f87e5c0a29#comments) をやってみようと思ったら上手くいかなかったのでメモ

# 環境

macOS Catalina(10.15.4)
electron-prebuilt 1.4.13

# 修正点1 作成するファイルはindex.js

```
$ npm init -y
```

で生成される `package.json` に記述されるのが `index.js` なので作成するファイルは `index.js` とする。

# 修正点2 バージョンは有効なものを指定する

```
% electron-packager ./sample sample --platform=darwin --arch=x64 --electronVersion=0.36.1
```

下記のエラーが出ます（※改行してます）。

```
Response code 404 (Not Found) for 
https://github.com/electron/electron/releases/download/v0.36.1/SHASUMS256.txt
```

古いバージョンのファイルはなくなっているようです。
2020年4月の時点で最新版は8.2.0。最新版へのリンクは[こちら](https://github.com/electron/electron/releases/latest)

コマンド的には

```
electron-packager ./sample sample --platform=darwin --arch=x64 --electron-version=8.2.0
```

で成功したときに表示されるのは

```
Packaging app for platform darwin x64 using electron v8.2.0
Wrote new app to /Users/takepan/sample-darwin-x64
```
AppSheet使用ライセンスについて調べてみた

# はじめに
実際にAppSheetでアプリを作っていきましょうとなったときに、ライセンスをどれにすればいいのか考える必要がある。
あと費用も。
AppSheetサイトにも記載があるけれども、もう少し具体的に調べた。

**内容おかしかったらぜひ教えてください**

#いきなり結論
- まずは無料プランから初めて、
- サインイン不要なパブリックなアプリの場合はパブリッシャープロ（1アプリ月50ドル）
- ユーザ管理にADや、データソースにSQLサーバを使う場合はビジネス（費用要相談）
- それ以外はAppInfoのMinimal plan neededを確認し、プロ（1ユーザ月5ドル）かプレミアム（1ユーザ月10ドル）か決める。

#まずは公式サイト
Pricing
https://solutions.appsheet.com/pricing

- 機能とサポート、セキュリティなどの差でプレミアム、プロ、ビジネスがある
- プレミアムは1アクティブユーザ毎月5ドル、プロは1アクティブユーザ毎月10ドル、ビジネスは要相談
- アクティブユーザとは、少なくとも月に1回アプリを実行するユーザーのこと
- プロとプレミアムは無料で始められる。
- 無料プランの中は、1つまたは多数のアプリプロトタイプを構築しながら、AppSheet機能の完全なセットを無料で使用できる。アプリを使用してフィードバックを共有するために、最大10人のユーザーを無料で招待できる。
- サインイン不要なアプリはパブリッシャープロというライセンスで作ることができる。このライセンスのサービスはプロに準拠しているがセキュリティやサインイン系の機能がない。その代わりにプランで唯一アプリごとの課金となっている。
- プランやライセンス数はいつでも変更でき、無料でプロトタイピングに戻すこともでき、料金は日割り計算される。

#各プラン機能比較
|サブスクリプションプラン|無料|プレミアム|プロ|パブリッシャープロ|ビジネス|
|:-----------------|:-----------------|:------------------|:------------------|:------------------|:------------------
|プランクラス|無料|安全（ユーザ毎に課金）|安全（ユーザ毎に課金）|パブリック（アプリごとに課金）|？|
|課金方法|無料|1アクティブユーザ（※１）毎|1アクティブユーザ毎|1アプリ毎|1アクティブユーザ毎|
|月額|無料|5ドル|10ドル|50ドル|要相談|
|機能概要|プロと同様|コア機能、基本的なデータソース、ワークフロー（DBに対して追加、更新、削除されたことをトリガーにメール通知やDBの値変更等が可能）|プレミアムにプラスしてメールサポート、高精度ジオコーディング、各種スキャン、セキュリティ強化、レポート（定期タスク実行）|プロにプラスして、パブリックでサインイン不要なアプリケーション作成|SQLやオンプレDBなど高度なデータソース、ADなどの各種ドメイン、RESTAPI、機械学習、分析、監査ログのフィルタリングと分析|利用可能データソース|プロと同様|・Googleスプレッドシートとフォーム・Office365、Dropbox、OneDrive、Box上のExcelファイル（.xlsx）|・Googleスプレッドシートとフォーム・Office365、Dropbox、OneDrive、Box上のExcelファイル（.xlsx）|・Googleスプレッドシートとフォーム・Office365、Dropbox、OneDrive、Box上のExcelファイル（.xlsx）|プロにプラスして・SQLサーバー・mySQL・PostgreSQL・AWS DynamoDB|
|備考|デプロイ後、最大10人までアプリを利用できる、期限はない"|アプリがプロトタイプの時はビジネスプランと同様のデータソースが使用できる|アプリがプロトタイプの時はビジネスプランと同様のデータソースが使用できる|アプリがプロトタイプの時はビジネスプランと同様のデータソースが使用できる|
|どんな場合に選ぶべきか|とりあえず始めはこれを選んで、あとからプランを変更する|ホビー、ミッションクリティカルではないアプリケーション。メールサポートが不要レベルなアプリケーション|基本はこれ（メールサポートは英語）、業務アプリケーション|サインイン不要なオープンなアプリケーションを作成したい|利用ユーザ数が多い＆アカウントの二重管理をしたくないのでAD連携が必要、オンプレDBをそのまま使用したい|

~~めちゃくちゃ表書きづらいな…~~


##もう少し詳しく
価格に関するその他の質問
https://help.appsheet.com/en/articles/969653-other-pricing-questions

- 無料プランでは、アプリがテストモードのときにすべてのデータソースとすべてのプラットフォーム機能を使用できる
- いつでもプランは変更できる
- アクティブユーザの考え方（リンク先参照）

## 終わりに
- 似たようなサービスが1アカウントいくらのプランが多いのに対して、パブリッシャープロの1アプリいくらは新しいと思った。大規模なアプリ展開（イベントなどで不特定多数の利用者を考えてる？）を予定しているのが見える。
- 全機能をすきなだけ使わせて納得してから、Minimal plan neededなどで適切なプランを見つけ、有料プランへの移行するのがすごく良い。
- そもそも無料プランが太っ腹すぎる。

## ノーコード開発もくもく会のおしらせ
毎月1回ぐらい、「Play (No) Codes!」というグループ名でノーコード開発もくもく会をしています。
基本オンライン＋オフラインで実施しているので、よければ参加ください！
https://playnocodes.connpass.com/
Zoomで仮想のアバターを使う

コロナウイルス対策で、リモートワークや、オンラインによる会合が、見直されてきています。
オンライン会議、便利、なのですが。

- 家の中が、整理整頓できていなくて、あまり見られたくない
- ネットの知り合いに、顔を知られるのは、少し怖い
- ~~ノーメイクで、楽をしたい~~

など、ビデオ通話が、躊躇われるケースも、あると思います。

そこで、仮想アバターを、使用して、ビデオ通話を使用する、方法を書いてみます。説明は、Zoomを使用していますが、他のソフトでも、応用できるはずです。

# 用意するもの

[FaceRig](https://store.steampowered.com/app/274920/FaceRig/?l=japanese "Steam Store")というソフトを、使用します。Steamという、ゲーム・ソフトウェアの配信プラットフォームにあるので、Steamでアカウントを作成し、購入します。

必要なのは、

* FaceRig本体 1,480円
* FaceRig Live2D Module （自分で、Live2Dのアバターを追加するのであれば） 398円
* 追加アバター各種 （有償のと、無償のものがあります）

です。（値段は、2020年4月5日現在、です）

VTuber等、商用利用を、考えている人は、FaceRig Pro(6,580円) が必要になります。通常の、オンライン飲み会等では、必要ないはずです。

ソフトウェアを、Steamで購入し、使用しているPCに、インストールします。

# FaceRigの概要

PCのカメラから、読み取った画像を、顔識別して、ソフトに付属している、あるいは自分で追加したアバターに、マッピングしてくれます。
なので、自分の動きを、そのまま、アバターが動く、アニメーションにできるような、イメージです。


# Zoomで使う手順
## FaceRigの起動
Zoomを起動するより、先に、FaceRigを、起動しておくと、スムーズです。特に、最初は、FaceRigでの、操作や、キャラクターの動かし方に、慣れておいた方が、良いと思います。
FaceRigは、タスクトレイの、Steamの、アイコンから、起動するのが、手軽です。

![00.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545754/6a2bdcc7-0560-9d18-1be3-1826711c09b3.png)

起動すると、初期画面がでます。左側の、「LAUNCH」ボタンを押します。

![01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545754/3cc3846a-ec71-b12c-dd00-a108e735a221.png)
画面上のほうに、キャリブレーション（カメラ映像の初期化）などの、設定があります。
また、右側には、背景の変更など、環境設定の、ボタンがあります。

真ん中に、設定している、キャラクター（アバター）が出て、動きだします。
![03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545754/984c846a-3dc1-10d3-5f0d-e33548be40ce.png)
上段、左側のボタンが、アバターの選択です。

![04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545754/8a9f9bc0-1ec4-2508-8cbc-fbb21cde17c2.png)
上段、左から４番目が、キャリブレーションです。

キャラクターの、表示の、調節は、

* Altキー＋マウスの右ボタンを押しながら、カーソル移動：キャラクター表示の、拡大縮小
* Altキー＋マウスの真ん中ボタンを押し込んで移動 ：キャラクターの移動

この2つを、覚えておけば、大丈夫です。（サイズ変更は、Alt＋マウスのホイールでも、できますが、かなり大味なので、使いにくいです）

## Zoom側の設定

FaceRigを、インストールすると、カメラの一覧に、FaceRigが追加されます。
なので、FaceRigを、起動している状態で、Zoomの、画面左下にある、ビデオ設定から、**FaceRig Virtual Camera** を、選択すれば、FaceRigの画面が、ほとんどそのまま、Zoomに転送されます。
![02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545754/e6fc9812-52da-59fb-1df6-1c393daa6d12.png)
（FaceRigには、顔認識の状態を、判定できる、カメラからの画像を、表示するモードが、ありますが、そこの画像は、送られません。上に並んでいるアイコンの、左側３番目で、ON/OFFが、できます）

# 最後に

これを使うと、オンライン飲み会で、仮面舞踏会みたいなことが、できるかもしれません。

でも、仕事で使うと、たぶん、高い確率で、叱られるので、気を付けてください。
nowでアプリケーションエラーが出たとき対応したこと

nowでハマったメモ

# 状況
@n0bisuke の[この記事](https://qiita.com/n0bisuke/items/ceaa09ef8898bee8369d#4-now%E3%81%A7%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4)を参考にやっていたつもりがこんなエラーと遭遇。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121887/a6e72e13-01a8-76ff-1938-0a3c0d247f45.png)



> An error occurred with this application.
> This is an error with the application itself, not the platform.

「nowは問題ないよ。お前のアプリケーション（ソースコード）が問題なんだよ。」とのこと。

# 対応
このnow.json内で指定しているjsファイルの一部を直したら直った。
（記事の例でいくと、server.jsってファイルの文末）

### 直した場所
自分にとってわかりやすいと思って書き換えてた最後のserver running のあたり。

エラー出てたとき

``` エラー出てたとき.js
if(process.env.NOW_REGION){
  module.export = app;
}else{
  app.listen(PORT);
  console.log(`Server running at ${PORT}`);
}
```

これ、記事の通り下記に直したら直った。
（初めから記事の通りやっておけばよかった話）

``` エラー出なくなった.js
(process.env.NOW_REGION) ? module.exports = app : app.listen(PORT);
console.log(`Server running at ${PORT}`);
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121887/2aa9ecbd-68ca-cad2-2438-4e4a550636a8.png)
成功！

# 結論
自分でアレンジしたところが悪かった。記事の通りにやっておけばよかった。
でもなんでこの書き方だとダメだったんだろう。。。
あと、nowを起動させるときにこのjsファイルも見ているんだなあ。
Protocol Buffersなdockerイメージ

自分用メモ。

[Gitリポジトリ](https://github.com/gsh-kz/protobuf-cli)

## 環境

* Docker version 19.03.8
* docker-compose version 1.25.4

## コード

ubuntuにprotbuf3.11.4を導入。（+GoogleAPIs）

```:Dockerfile
FROM ubuntu:18.04
ARG PB_VER=3.11.4
ENV GOOGLEAPIS_DIR=/googleapis
RUN cd /tmp && \
    apt-get update && \
    apt-get install -y curl unzip git && \
    git clone https://github.com/googleapis/googleapis.git && \
    mv googleapis / && \
    curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v${PB_VER}/protoc-${PB_VER}-linux-x86_64.zip && \
    unzip protoc-${PB_VER}-linux-x86_64.zip && \
    mv bin/ /usr/local/ && \
    mv include/ /usr/local/ && \
    rm -f *
CMD [ "protoc", "--version" ]
```

docker-composeで確認（手抜き）。

```yaml:docker-compose.yml
version: "3.7"
services: 
  protobuf:
    build: 
      context: ./
      # args: 
      #   PB_VER: 3.11.4
    image: protobuf-cli:3.11.4
    # command: [ protoc, --version ]
```

```sh
$ docker-compose run --rm protobuf
libprotoc 3.11.4
```

~~もしかしてalpineでもいける？~~
[alpine版できました。](https://github.com/gsh-kz/protobuf-cli/tree/alpine)
突然 Unityのログファイル (Editor.log) に何も出力されなくなった時の対応

# 環境
- macOS(10.15.2)
- Unity 2018.4.14f1

# 事象
- UnityのConsoleウィンドウにはログが垂れ流されている
- ログファイル(Editor.log)を `tail -f` しても何も出力されない
    - `tail -f ~/Library/Logs/Unity/Editor.log`
- その他エディタで見てもログファイルの内容が変化していない

# 対応
- `~/Library/Logs/Unity/Editor.log` を削除
- Unityを再起動

自分はこの方法で直りました。ご参考まで。
削除以外の方法をご存知の方がいましたら教えていただけると嬉しいです。
【Rails】deviseを使用した簡単なログイン機能まとめ

# はじめに
学習中の備忘録です。
# 概要
新規アプリ作成の際にdeviseのコマンドなど忘れるのでまとめ。

- 導入
- devise設定ファイル作成
- モデル作成
- ビューファイル作成
- deviseによって設定されるPrefixの一部

# 前提
rails 5.2.3

# 導入
gemファイルに追記

```:Gemfile
gem 'devise'
```
インストール

```:ターミナル
$ bundle install
```

サーバー再起動

```:ターミナル
$ rails s
```

# deviseの設定ファイルを作成

```:ターミナル
$ rails g devise:install
```
新規作成されるファイル

- config/initializers/devise.rb
- config/locales/devise.en.yml

#モデル作成

```:ターミナル
$ rails g devise user
```
新規作成されるファイル

- app/models/user.rb
- db/migrate/20XXXXXXXXXXXX_devise_create_users.rb
- test/fixtures/users.yml
- test/models/user_test.rb

また、config/routes.rbに以下の様な記述が自動的に追記されます。

```ruby:【例】config/routes.rb
Rails.application.routes.draw do
  devise_for :users
#以下略
```
devise_for :usersの記述により、ログイン・新規登録で必要なルーティングが生成されます。

作成されたmigrationファイルを実行

```:ターミナル
$ rails db:migrate
```

# ビューファイル作成
```:ターミナル
$ rails g devise:views
```

新規作成されるファイル

- app/views/devise以下のディレクトリにあるビューファイル各種

# deviseによって設定されるPrefixの一部

|リクエスト|Prefix|パス|
|:-------|:-----|:--|
|devise/sessions#new|new_user_session|/users/sign_in|
|devise/registrations#new|new_user_registration|/users/sign_up|
|devise/sessions#destroy|destroy_user_session|/users/sign_out|

あとは好きな場所に上記のリンクをはれば完成です。

# まとめ
ユーザー情報の編集などは必要に応じて追記するかもです。
点と(直線 or 線分)の距離の2乗　JavaScriptでの実装

いろいろやり方はありますが、この記事では一次式の連立方程式を使って考えます。

# 点と直線の場合

o と p を通る直線に q からおろした垂線の距離の2乗を求めます。

o を p と q からあらかじめ引いておいてやると、計算が楽です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73493/677febe3-f36d-a61d-79ff-a851f7c8013a.png)

以下のように求められます。

```js
const
_Dist2 = ( px, py, qx, qy ) => {
    const num = px * qy - py * qx
    return num * num / ( px * px + py * py )
}
const
Dist2 = ( ox, oy, px, py, qx, qy ) => _Dist2( px - ox, py - oy, qx - ox, qy - oy )
```

注）o と p が同じ場合 0 / 0 になるので NaN を返します。


参考：[点と直線の距離公式の３通りの証明@高校数学の美しい物語](https://mathtrain.jp/tentotyokusen)

# 点と線分の場合

交点（X,Y）を求めてそれが線分の内に入っているかどうかチェックします。
X,Y は以下のように求められます。

```js
const den = px * px + py * py
const _ = ( py * qy + px * qx ) / den
const X = px * _
const Y = py * _ 
```

これの説明は文末につけておきます。

これの X が 0 から px, Y が 0 から py の中に入っていればよさそうです。
ただ、符号の判断が面倒になるので、計算の最初に p が第一象限にあるように鏡像を作ってから考えます。

```js
const
_SegDist2 = ( px, py, qx, qy ) => {
    const den = px * px + py * py
    if ( den == 0 ) return NaN
    if ( px < 0 ) {
        px = -px
        qx = -qx
    }
    if ( py < 0 ) {
        py = -py
        qy = -qy
    }
    const _ = ( py * qy + px * qx ) / den
    const X = px * _
    if ( X < 0 || px < X ) return NaN
    const Y = py * _
    if ( Y < 0 || py < Y ) return NaN
    const num = px * qy - py * qx
    return num * num / den
}
const
SegDist2 = ( ox, oy, px, py, qx, qy ) => _SegDist2( px - ox, py - oy, qx - ox, qy - oy )
```

q から op に降ろせる点がない場合 NaN を返しているので、Number.isNaN() で判定してください。


## 交点の求め方

プログラムっぽく書いてみました。

```
    直線

        py  
    Y = -- X
        px  

    に直行する直線は

          px  
    Y = - -- X + c 
          py  

    これが、qx, qy を通るから

           px  
    qy = - -- qx + c 
           py  

    すなわち

          px          px  
    Y = - -- X + qy + -- qx
          py          py  

    なので交点は

    py       px          px  
    -- X = - -- X + qy + -- qx
    px       py          py  

        px * ( px * qx + py * qy )
    X = --------------------------
            px * px + py * py

        py * ( px * qx + py * qy )
    Y = --------------------------
            px * px + py * py
```
あつ森の魚・虫リストCSVをVueでテーブル表示し、現在時刻でソートしました。

## できたもの
[こちら](https://kackie.github.io/vue_csvReader/atsumori.html)
(4/8 絞り込みがうまく動かなかったのを修正しました)

途中だけどとりあえず公開しちゃいます。
あとで綺麗にまとめます。

## あとでつくるリスト
- 時間プルダウンに「絞り込まない」追加
- 項目並び替え実装(売値の昇順、降順)
- Cookieを使用して南半球などのチェック設定を保持
- Cookieを使用して捕まえたかどうかのチェック項目を追加
- レスポンシブ化
接続元によるLinuxのless終了時の挙動

# 疑問
「[新しいLinuxの教科書](https://www.sbcr.jp/product/4797380941/)」という本でLinux入門をしてみたところ、一部教科書通りにいかず、調べても出てこなかったので、備忘録的なものとして残します。
具体的にはChapter08-04の「exportコマンド」の使用例のところです。
この章では環境変数「LESS」に対して「--no-init」を設定し、lessコマンドの挙動変化を確認する（終了時に画面クリアしていたものが、画面クリアしなくなるようにする）というものなのですが、Hyper-Vから接続し操作をしていたところ、特に設定を変更しなくても画面クリアされない挙動をしており、なぜ教科書通りにならないのかわかりませんでした。
（aliasも確認しましたがlessに対しては設定なし）
なので初学者ですが、できる範囲で何が原因なのか調べてみました。

# 調べてみた挙動
## Linux上での（Hyper-Vからアクセスしたときの）動作（less /etc/crontab→qで終了）
![linux-min.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439964/07c86910-f712-8317-d604-0cefa210e3fe.gif)
画面がクリアされず、表示内容が残っていることが確認できます。
## ターミナルの（TeratermやGUIからターミナルを立ち上げたときの）動作（同上）
![terminal.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439964/533eeacc-c7d6-7ec7-7b99-a4c7e854ef83.gif)

Terminalからアクセスした場合は、終了時に画面クリアされていることがわかります。

# 調べて分かったこと
- ~~lessのソースを見てみたところ、「is_tty」がTrueの時は画面クリアするようになっています。この変数は「isatty(1)」が設定され、ドキュメントを見るとターミナルから接続したときは"1"になるようです。~~
- ~~lessのソース該当箇所：https://github.com/gwsw/less/blob/e27853c89be227ad7a1a81aefd2942c03bd32dad/main.c#L387~~
- ~~isattyのマニュアル（"1"は標準出力のことを示すようだ）：https://linuxjm.osdn.jp/html/LDP_man-pages/man3/isatty.3.html~~
<br>（2020/04/06：いただいたコメントをもとに確認したところ、確かにisatty(1)はどちらの場合も"1"を返していたため削除。@angel_p_57 さんありがとうございます！）
- 環境変数$TERMがログインの仕方によって値が変わることを確認しました。
    - Hyper-Vで接続した場合：linux
    - GUIからターミナルを起動したり、外部から（teratermで）ログインした場合：xterm
- 上記環境変数TERMを変えてみると、ターミナルでもLinuxっぽい動作になったり、Linux上でもターミナルっぽい動作になったので、~~isattyと関連していると思われます。~~ $TERMと連動しているようです。
- $TERMによって切り替える際、「端末情報（infocmp）」に「smcup」「rmcup」があるかどうかで動作が変わるとのことです。
（2020/04/06いただいたコメントをもとに修正。@angel_p_57 さんありがとうございます！）

# 私的結論
上記教科書はターミナルでの実行を想定しているため、原則としてLinuxに直接アクセスするのではなく、ターミナルで動かしてみるのがよいと思われます。
【Java入門】ClassとMethodの書き方

# Classの書き方

```
public(※1) class クラス名{
}
```
（※1）修飾子

| 修飾子|説明|
|:----------:|:----------|
| abstract             |              インスタンス化できない。抽象化 |
| interface           |            継承拒否 |
| public             |              どこからでもアクセス可能なクラス |


Classのコーディング規約（ルール）を守ろう！！

- クラス名の先頭は必ず大文字！
- 意味があるクラス名にしよう！
- 名前の区切りは大文字にしよう！

```
例）
public class FaceRecognition {
}
```

# Methodの書き方
```
public class クラス名 {
  public(※1) void(※2) メソッド名(){
  } 
}
```
（※1）修飾子

| 修飾子|説明|
|:----------:|:----------|
| public             |              どこからでもアクセス可能なメソッド |
| protected           |            同一クラス、同一パッケージ、サブクラスからのアクセスを許可 |
| private             |              同一クラスからのアクセスのみ許可 |
| abstract               |                抽象メソッド。実装はしない |
| final	             |             オーバーライドを拒否 |
| static          |           静的メソッド |
| native          |           Java言語以外のモジュール内のメソッドの実装 |
| synchronized          |           ロックを取得、同時アクセスの防止 |

（※2）戻り値の型
戻り値はデータ型と関係があります。

| データ型 |種類|バイト数|範囲値|
|:----------:|:-------:|:----------|:----------------|
| byte             | 整数 |1バイト|              -128～127 |
| short           | 整数 |2バイト|            -32768～32767 |
| int             | 整数 |4バイト|              -2147483648～2147483647 |
| long | 整数 |8バイト|-9223372036854775808～9223372036854775807|
| float	             | 実数 |4バイト|±3.40282347E+38 ～ ±1.40239846E-45|
| double          | 実数 |8バイト|±1.79769313486231570E+308 ～ ±4.94065645841246544E-324|
| char          |文字型|2バイト|¥u0000～¥uFFFF|
| string          |文字列型|※|           -2,147,483,648 ～ 2,147,483,647<br>（おそらく）|
| boolean          |真偽値||           「true」 or 「false」 |
| void          |||           戻り値がない特別な型 |
※日本語(全角)、ハングル、漢字(漢字を使用する国)は2Byte、その他は1Byte<br>（他、あればコメントをお願いします。）

Methodのコーディング規約（ルール）を守ろう！！

- メソッド名の先頭は必ず小文字！
- 意味があるメソッド名にしよう！
- 名前の区切りは大文字にしよう！

```
例）
public class FaceRecognition {
  public void getPoint(){
  }
}
```

# Methodの引数について
メソッドは呼び出し元から情報を受け取り、それに応じて処理を行うことができます。呼び出して受け取るために使うのが引数です。

```
例）
---
message("abc");
---
public void message(String str) {
  
}
```

Overloading（오버로딩）ができる！

# Overloadingとは？
一般的にメソッドは同じ名前を複数使うのができません、ただし、Overloadingして同じ名前を使うことはできます。

```
例）
public void message(String str) {
}

public void message(int value) {
}

public void message(boolean flag) {
}
...
```
例のように同じ名前で引数が異なるものでセットすることで問題ありません。
また、引数が1つではなく2つ以上を使うこともできます。

```
例）
public void message(String id, String message) {
}

public void message(String id, String message, boolean flag) {
}

public void message(String id, String message, int branchcode) {
}
...
```

ここで気を付けることは！値を渡す際には引数の順に合わせること！！

```
例）
---
public void message(String id, String message, int branchcode) {
}
---
（✖︎）message("a10001", 206, "Error")
（✖︎）message(206, "a10001", "Error")
（⚫︎）message("a10001", "Error", 206)
```


# 参考
[修飾子](http://wisdom.sakura.ne.jp/programming/java/javadata4.html)
Magicsplat Tcl/Tk for WindowsのFfidlパッケージを試してみた。

最近、ActiveTclのダウンロードが面倒くさいことになってしまっているので、他のWindows向けディストリビューションのMagicsplat Tcl/Tk for Windowsを使い始めています。

久しぶりにFfidlパッケージを使う用があったので、MinGW-w64 GCCを使った例をまとめました。

呼び出されるC言語関数はこんな感じ。

```c:add.c
#include <stdio.h>

int add (int *sum, int a, int b)
{
    if (NULL == sum)
    {
        return -1;
    }
    else
    {
        *sum = a + b;
        return 0;
    }
}
```

Ffidlによる呼び出しは以下の如し。Magicsplat Tcl/Tk for Windowsは各ユーザーのAppData配下にインストールされています。別にtclshまでbashから実行する必要はないのですが、まぁ、ただの『例』ですので。

```bash
$ gcc -shared -o add.dll add.c
$ cat <<'EOF' | $LOCALAPPDATA/Apps/Tcl86/bin/tclsh
package require Ffidl
::ffidl::callout add {pointer-var int int} int [::ffidl::symbol add.dll add]
set bytes [binary format [::ffidl::info format int] 0]
set ret [add bytes 1 2]
binary scan $bytes [::ffidl::info format int] sum
puts "add: ret=$ret sum=$sum"
EOF
add: ret=0 sum=3
```

ふとadd()の第一引数にNULLを渡して-1を返させるにどうすればいいのか疑問に思って調べてみたところ、::ffidl::calloutでaddコマンドを定義する際に第一引数の型をpointer-varではなくpointerにして0を渡せば、それっぽい結果になりました。(ということはpointer-varを使う限りNULLが渡されることは無いということなのだろうか・・・)

```bash
$ cat <<'EOF' | $LOCALAPPDATA/Apps/Tcl86/bin/tclsh
package require Ffidl
::ffidl::callout add {pointer int int} int [::ffidl::symbol add.dll add]
set ret [add 0 1 2]
puts "add: ret=$ret"
EOF
add: ret=-1
```

第一引数の型をpointerにして最初の例(第一引数の型がpointer-varの場合)のように使うには、Tcl変数bytesがTclインタプリタ内でadd.dllのadd()に渡される時の値(int型へのポインタ値)をaddコマンドの第一引数に与える必要があり、FfidlのDLLに含まれるffidl_pointer_pun()やC言語ランタイムライブラリのmemcpy()を使って実現できます。

まずはffidl_pointer_pun()を使った例。ffidl_pointer_pun()はffidl.cで``void *ffidl_pointer_pun(void *p) { return p; }``と記述されていて、void *型ポインタ値をもらってそのまま返すという、一見、意味不明な関数ですが、``::ffidl::callout``をかぶせることによって型キャストのような効果を得ることができます。

```bash
$ cat <<'EOF' | $LOCALAPPDATA/Apps/Tcl86/bin/tclsh
package require Ffidlrt
::ffidl::callout add {pointer int int} int [::ffidl::symbol add.dll add]
set bytes [binary format [::ffidl::info format int] 0]
::ffidl::callout pointer-of-var {pointer-var} pointer [::ffidl::symbol [::ffidl::find-lib ffidl] ffidl_pointer_pun]
set pointer [pointer-of-var bytes]
set ret [add $pointer 1 2]
binary scan $bytes [::ffidl::info format int] sum
puts "add: ret=$ret sum=$sum"
EOF
add: ret=0 sum=3
```

次はmemcpy()を使った例。memcpy()は第二引数(ポインタ)が指す領域の先頭から第三引数で指定したサイズ(バイト数)を第一引数(ポインタ)が指す領域へ複写する関数ですが、戻り値は第一引数をそのまま返す仕様になっていますので、第二引数と第三引数を0にするとffidl_pointer_pun()の代用として使用できます。memcpy()はFfidlrtでcalloutされています。

memcpy()による代用は、ActiveTclや今回使用したMagicsplat Tcl/Tk for Windowsなどではffidl_pointer_pun()が使えますので必要ないのですが、KitCreatorでTcl/Tkを1つの実行ファイルにまとめた場合にffidl_pointer_pun()を使うと支障があったので考案したものです。(ほとんどの場合pointer-varで事足りてしまうのですが)

```bash
$ cat <<'EOF' | $LOCALAPPDATA/Apps/Tcl86/bin/tclsh
package require Ffidlrt
::ffidl::callout add {pointer int int} int [::ffidl::symbol add.dll add]
set bytes [binary format [::ffidl::info format int] 0]
set pointer [::ffidl::memcpy bytes 0 0]
set ret [add $pointer 1 2]
binary scan $bytes [::ffidl::info format int] sum
puts "add: ret=$ret sum=$sum"
EOF
add: ret=0 sum=3
```

C言語側の関数の引数が構造体へのポインタだったり配列が絡んでいたりすると煩雑さと難易度が上がってしまうのですが、シンプルな受け渡しならこんなに簡単ですよっていう例でした。
positionプロパティについて

#positionプロパティとは？
指定した要素の配置方法を決めることができるプロパティです。
ボックスの配置方法を相対位置か絶対位置かを指定する際に使用します。
主に一緒に使われるのは、**top / bottom / left / right** などです。

##positionの値について
振り返り用。

- **static**
デフォルトの左上を基準値とします。この値のときには、top、bottom、left、rightは適用されません。
※positionを指定していない親ボックスは全てstaticになります。
`覚え方 → 初期値！`

- **fixed**
絶対位置への配置となり、ブラウザ表示領域（ウィンドウ）の左上を基準位置とします。
またスクロールしても位置が固定されたままとなります。
`覚え方 → 動かざること山の如し！fixedの場所が〜〜？ \\\ぜった〜い///`

- **relative**
相対位置への配置となります。staticを指定した場合と同じ基準位置になりますが、top、bottom、left、rightは適応されます。
`覚え方 → 親クラスに設定するやつ`

- **absolute**
こちらも絶対位置への配置となりますが、position:relativeが設定された最も近い親要素の左上を基準位置とします。
また、どの親要素にもrelativeが設定されていない場合は、ブラウザ表示領域（ウィンドウ）の左上を基準位置とします。
`覚え方 → 生みの親と育ての親が違う場合もあるので注意すべきやつ`

##relativeとabsoluteの関係性
ここではpositionを理解する第一歩として**relativeとabsoluteの関係性**に絞って理解を深めていきたいと思います。

positionの値(relativeやabsolute)の指定をしているはつまり、
『topとleftが、10pxがいいって？おけ！じゃあ基準位置どこにすんの？』ってことだと認識しました。

とりあえず理解はできたけど、なんかパッとしませんね。
自分の腑に落とし込むために、もっと身近なもので抽象的に捉えてみましょう。
![IMG_4901.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440608/affda4df-3a85-883e-7341-ca90a54bc25d.jpeg)

###relativeとabsoluteの関係は、牧場と羊さんです！！！(あくまでも私のイメージ)

**relative(牧場)**を親要素で指定することによって、**absolute(羊さん達)**は牧場でのびのびと快適に過ごすことができます。

ただ、topやleftのサイズ指定や子要素の大きさによっては...
![IMG_4902.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440608/8a121f02-15b0-0264-1d0c-eaf2775030a5.jpeg)

このように、羊さん脱走事件も起きてしまう可能性はあるので要注意。
※わざとデザイン的に上半身だけ脱走させたい時もあるので、一概に事件とは言えませんね！

##補足
```html:natsukibokujo.html

<body>
  <div class="bokujo" style="position:relative">
    <div class="hitsuzisan">
      <div class="ushisan" style="position:absolute">
      </div>
    </div>
  </div>
</body>
```
このように、class="bokujo"にposition:relativeが付いている場合、class="ushisan"の親要素は一つ上のclass="hitsuzisan"ではなく、class="bokujo"となります。
つまり、何を親とするかはposition:relativeが記述されているものに起因する（直近のとは言っていない）ということです。

#最後に
様々なWEBサイトでは、このpositionにz-indexやoverflowが絡んでくることがよくあります。
コードも女も男も、一筋縄ではいかないということですね。

気になるサイトを見つけたらソースを確認して、htmlとcssを確認していくのも面白そうですね！
Nim v1.2.0 概要

[Version 1.2.0 released](https://nim-lang.org/blog/2020/04/03/version-120-released.html)の概要

- v1.0.から幾つかの機能と標準ライブラリが追加された。
- 破壊的な変更は最小限としたが、バグフィックスとユーザへの恩恵のために必要な変更が行われた。

## アップデート方法

インストール済みの人は`choosenim`コマンドでアップデート可能。

```bash
$ choosenim update stable
```

## 複数のNimバージョンを使う場合

- v1.2でもv1.0の時のように動作させたい場合、`--useVersion:1.0`をつけてみる。つけてもv1.0の時と同じ動作をしないならissueを投げるべし。

- 自分のライブラリをv1.0とv1.2の両方で使えるようにしたいが、ライブラリがv1.2で導入された機能に依存する場合は、`when declared`を用いる。

```nim
import sequtils

when not declared(unzip):
  proc unzip*[S, T](s: openArray[(S, T)]): (seq[S], seq[T]) =
    result[0] = newSeq[S](s.len)
    result[1] = newSeq[T](s.len)
    for i in 0..<s.len:
      result[0][i] = s[i][0]
      result[1][i] = s[i][1]

let a = @[('a', 1), ('b', 2), ('c', 3)]
let b = unzip(a) # version 1.0 では上記で宣言したunzipが使われる
                 # version 1.2 ではsequtilsライブラリのunzipが使われる

assert b == (@['a', 'b', 'c'], @[1, 2, 3])
```

## 新機能

### GC:ARC

- `--gc:arc`が新機能としてリリース
- [FOSDEM 2020](https://www.youtube.com/watch?v=yA32Wxl59wo)で開発者（Araq）が背景の説明と利点を示すベンチマークを示している。
- C++やRustのSemanticsから影響を受けている。
- もっと詳細な説明は後日でるかも。

### 新しいsugarマクロ

#### Collect

- `collect`マクロは seq/set/table の内包に役立つ
- `lc`(リスト内包)の代替で`lc`よりも慣用的で強力
- `collect`の使用にオーバーヘッドはない

```nim
import sugar
let numbers = collect(newSeq):  # or: collect(newSeqOfCap(10))
  for i in 1..10:
    i

assert numbers == @[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```

```nim
import tables, sugar
let oddSquares = collect(initTable):
  for i in numbers:
    if i mod 2 == 1:
      {i: i * i}

assert len(oddSquares) == 5
assert oddSquares[7] == 49
```

```nim
import sets, sugar
let oddOrNegative = collect(initHashSet):
  for i in numbers:
    {if i mod 2 == 1: i else: -i}

assert 5 in oddOrNegative
assert 2 notin oddOrNegative
assert -2 in oddOrNegative
```

#### Dup

- `dup`マクロはin-place関数に対して使うことで入力変数を変更せずに結果を返すようにすることができる。
- 将来的には、in-placeバージョンのみが提供されるようになる可能性がある。（現在は`sort`と`sorted`などin-placeとout-of-placeの2種類の関数が用意されている場合がある）

```nim
import sugar
proc makePalindrome(s: var string) =
  for i in countdown(s.len-2, 0):
    s.add(s[i])

var a = "abc"
makePalindrome(a)
assert a == "abcba"

var b = "xyz"
var c = b.dup(makePalindrome)

assert b == "xyz"
assert c == "xyzyx"
```

アンダースコア`_`によって、引数を渡す場所を示すことができる。

```nim
import algorithm, sugar

# b = "xyz"
var d = dup b:
  makePalindrome  # xyzyx
  sort(_, SortOrder.Descending)  # zyyxx
  makePalindrome  # zyyxxxyyz

assert d == "zyyxxxyyz"
```

#### Capture

- `capture`はループ内でループカウンタの値を用いたクロージャーの作成に有用
- イベント処理や`{int: callBack}`ルックアップテーブルに使用可

```nim
import strformat, sugar

var myClosure: proc(): string

for i in 5..7:
  for j in 7..9:
    if i * j == 42:
      capture i, j:
        myClosure = proc (): string = fmt"{i} * {j} = 42"

let a = myClosure()
assert a == "6 * 7 = 42"
```

### 変更履歴

多いので省略。そのうち、[この記事](https://qiita.com/pianopia/items/89cba817cd814b808f4d)で書いてくれるはず。
arduinoの中の電卓をつかおう！！

以前Arduinoはスケッチ＋電圧計＋電卓という話をしました。
そこで今回はarduino内の電卓を使っていこうと思います。

#プログラム
```C++:keisan.ino
void setup(){
Serial.begin(9600);
Serial.print("5+5=");Serial.println(5+5);
Serial.print("5-5=");Serial.println(5-5);
Serial.print("5*5=");Serial.println(5*5);
Serial.print("5/5=");Serial.println(5/5);
Serial.print("5%5=");Serial.println(5%5);
}
void loop(){
}
```
解説：
「+」で足し算
「-」で引き算
「*」で掛け算
「/」で割り算
「%」では割り算のあまり
になっています。

#結果
シリアルモニターを開くと計算結果が表示されていると思います。
以上です、お疲れさまでした。
Swift データの保存と呼び出し

iOSのアプリでは、データの保存をしていないと、タスクキルをするたびに、行った操作がリセットされる。そのため、データの保存と呼び出しが必要となる。

**データの保存のやり方**

```Swift:sample.swift
//objectsというデータを保存したい場合
UserDefaults.standrad.set(objects, forKey: String)
```
*objectを定義している場所によっては、self.objectsとする。*
[forKey: String]の部分は、[forKey: "Store1"]のように自分で名前をつける。
この場合だと、以下のように書く。

```Swift:sample.swift
//objectsというデータを保存したい場合
UserDefaults.standrad.set(objects, forKey: "Store1")
```

これは、Store1にobjectsを保存するということである。
新しくobjectsを更新するたびに、同じように保存すれば、Store1も更新される。

同じキーに２回以上保存を行った場合は、古いデータは消え、一番最新のデータのみ保持する。


*UserDefaulsによるデータの保存は保持できる型は決まっている。そのため、保持できない型は型変換などを行って保持する必要がある。

*構造体の保存も可能である。(やり方は別方法)


**データの呼び出し**

```Swift:sample.swift
//Store1の中身をString型で保持している場合
let load = UserDefauls.standard.object(forKey: "Store1")
if (load as? String != nil {
self.objects = load as! String
}
```

データの保存が１つだけというのは基本的に少ないと思うので、配列などを使うと思う。

```Swift:sample.swift
var objects = [Any]()
```

配列を用いる場合は、以下のようにするだけである。

```Swift:sample.swift
//Store1の中身をString型で保持している場合
let load = UserDefauls.standard.object(forKey: "Store1")
if (load as? [String] != nil {
self.objects = load as! [String]
}
```