OmniAICreator/Qiita-1.07M huggingface dataset:
localStorage入門

## 保存 ： setItem

```js
window.localStorage.setItem(key,value);
```

### オブジェクトとして保存

localStorageのvalueは文字列のため、JSON形式を文字列に変換する

```js
window.localStorage.setItem(key,JSON.stringify(value));
```

## 取得 ： getItem

数字でもオブジェクトでも文字列なのに注意。

```js
window.localStorage.getItem(key);
```

### 数字の場合

計算などが必要になったら、文字列を数値に変換しないといけない場合がある

```js
Number(window.localStorage.getItem(key));
```

### オブジェクトの場合

文字列をJSON形式に変換

```js
JSON.parse(window.localStorage.getItem(key));
```

## 削除 ： removeItem

```js
window.localStorage.removeItem(key);
```

### ローカルストレージを全て削除

```js
window.localStorage.clear();
```

## 保存されているkeyの数を調べる

```js
window.localStorage.length;
```

## Chromeでの使用

### 確認方法

Developerツール＞Application＞Storageで設定したドメインを見る

### 追加・編集

Developerツール＞コンソールで

```js
window.localStorage.setItem(key,value);
```

### 削除

#### 選択して削除

Developerツール＞Application＞Storageで設定したドメインを選択し、消したいデータを選択して[×]ボタンをクリック

#### 同じドメインの全てのデータを削除

Developerツール＞Application＞Storageで設定したドメインを選択し、[○に＼]のようなボタンをクリック

オブジェクト保存取得参考：[localStorageで複数のデータを保存する ｜ Tips Note by TAM](https://www.tam-tam.co.jp/tipsnote/javascript/post5978.html)

## Firefoxでの使用

### 確認方法

ツール＞ウェブ開発＞開発ツールを表示＞ストレージ＞ローカルストレージ＞設定したドメイン

### 追加・編集

ツール＞ウェブ開発＞開発ツールを表示＞ストレージ＞ローカルストレージ＞設定したドメインで「＋」をクリック、一覧に追加されたら名前や値をダブルクリックすると編集＆保存

### 削除

#### 選択して削除

ツール＞ウェブ開発＞開発ツールを表示＞ストレージ＞ローカルストレージ＞設定したドメインの一覧で消したいデータを選択し、右クリック＞
「"アイテムの名前"を削除」をクリック

#### 同じドメインの全てのデータを削除

ツール＞ウェブ開発＞開発ツールを表示＞ストレージ＞ローカルストレージ＞設定したドメインを右クリック＞すべてを削除
もしくは
ツール＞ウェブ開発＞開発ツールを表示＞ストレージ＞ローカルストレージ＞設定したドメインの一覧のどれかを右クリック＞すべてを削除
【VirtualBox】failed to create named pipe (VERR_INVALID_NAME)【シリアルポート設定エラー】

# エラーメッセージ

```
NamedPipe#0 failed to create named pipe 
\.\pipe\com_0 
(VERR_INVALID_NAME).
```

# 解決方法

パス/アドレスの設定を

```
\.\pipe\com_0
```

から

```
\\.\pipe\com_0
```

に変更してください。

# 補足

このエラーを「OtakuAssembly vol.1」という書籍の中で見たという方は、あわせてこちらもご覧くさい。

- [【OtakuAssembly第4章】訂正・補足](https://qiita.com/miyagaw61/private/00f531e2f48a10eff032)
EC2から起動されたAMIを特定する

## コマンド

```
$ curl http://169.254.169.254/latest/meta-data/ami-id
```

## 実行結果

```
ami-00b95502a4d51a07e
```

## 探す

コンソールからIDで検索
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/a4a25132-8c7a-d4ae-616c-90cd1121aaed.png)
ネットワークを学ぶ上でオススメの書籍・サイト

## はじめに
この記事では、ネットワーク関連業務を遂行する上で、特に役立った書籍・サイトを紹介する

## 想定読者
- ネットワークエンジニアになりたい方
- 社内NWの構築・管理を行うコーポレートエンジニア・社内SE
- パブリッククラウドでインフラ構築を担当する方

## オススメの書籍・サイト
### [マスタリングTCP/IP 入門編](https://www.amazon.co.jp/%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0TCP-IP-%E5%85%A5%E9%96%80%E7%B7%A8-%E7%AC%AC5%E7%89%88-%E7%AB%B9%E4%B8%8B/dp/4274068765)
**オススメ理由：** ネットワーク技術の基礎から丁寧に解説されており、入門書としてオススメ。
私の場合、OSI参照モデルの各レイヤでどのような処理が行われているかを理解することで、トラブルシュートを理論立てて行うことができるようになったと思います。

### [インフラ／ネットワークエンジニアのためのネットワーク技術＆設計入門](https://www.amazon.co.jp/dp/B07TB1MBJV/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
**オススメ理由：** ラッキングやネットワークセグメントの分割方針等、実務的な内容が記載されており、ネットワークを実際に構築・管理する上で役立つ。（私が購入したのは第1版でしたが、第2版が出版されてるようですね。)

### [インフラ/ネットワークエンジニアのためのネットワーク・デザインパターン](https://www.amazon.co.jp/%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9-%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%BB%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-%E5%AE%9F%E5%8B%99%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E6%A7%8B%E6%88%90%E3%81%AE%E6%9C%80%E9%81%A9%E8%A7%A3%EF%BC%92%EF%BC%97-%E3%81%BF%E3%82%84%E3%81%9F-%E3%81%B2%E3%82%8D%E3%81%97-ebook/dp/B019I6LSEI/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=&sr=)
**オススメ理由：** 通信要件や規模に応じた実務的なネットワークのデザインパターンが記載されており、スクラッチでネットワークを設計・構築する際に役立つ。

### [日経ネットワーク](https://tech.nikkeibp.co.jp/media/NNW/)
**オススメ理由：** ネットワーク技術にフォーカスをあてた月刊誌であり、継続的な知識習得に役立つ。私の場合、定期的な情報のインプット、カラムによっては自身の知識の再確認に利用していました。

### [ネットワークエンジニアとして](https://www.infraexpert.com/)
**オススメ理由：** 理論的な内容からCisco機器のコマンドといった実務的な内容など、ネットワークに関わる様々な情報を取り扱っているサイト。ネットワーク関連の技術ワードを調べる際や知識の再確認に利用していました。
Java static methodのメリット

- インスタンス化しなくて使用できる。
- クラス内で共用なメソッドになるため、他のメソッドからアクセスが可能になる。

```java

class TestClass {

    private TestClass(){
    }

    // staticメソッド
    public static void printlnHelloWorld() {
        System.out.println("Hello World!");
    }
}
```
staticメソッドの利用

```java

public class HelloWorld {
    public static void main(String[] args) {
        TestClass.printlnHelloWorld(); //インスタンス化不要
    }
}
```
typescript react



- 型チェック
  - React.HTMLFormInputElement
  - ReactNode

- interfaceはオブジェクトに使う　（引数のPropsが多い場合も）



```javascript

interface Props{
 name:string;
  age:number;
}

calss App extends React.Component<props: Props>


```


- Propsの持ち方

```javascript

# 初期
class App entends Component<{nane: string; age:number; }>

# 次
interface Props{
 name: string;
 age: number;
}

class App entends Component<Props> 


```


- input ref

https://ja.reactjs.org/docs/refs-and-the-dom.html


- import 

```javascript

import {Form } from './Form'

これがあるかないかは`export`がdefaultかどうか

```



## 関数型

```javascript

type MyCompProps = {
 name: string;
}

const MyComp = (props: MyCompProps) => {
  
}

```




// boolean
let message: boolean = true;

// 数字
let num: number;
num = 6;

// 文字
let red: string;
red = "red";

// Array
let listA: number[];
let listB: Array<number>;
listA = [1,2,3,3]
listB = [2,3,3,4]


// enum
enum Color {Red = "red", Green = "green", Blue = "blue"}


// Any

let notSyure: any;

notSyure = 1;
notSyure = "yellow"

// void

function warnUser(): void {
 console.log("this is my warning")
}


// null undefained型があるらしい


// Never 決して発生しない値

// Object型

function create(o: object | null): void {
  console.log(`create: ${o["props"]}`)
}

// 型アサーション
// 型アサーションは任意の型に変換できるのが特徴 number をstring的な感じか

let someValue: any = "this is a string"
let strLength: number = (<string>someValue).length;
// これよくわからない

// 書き方2種類

// 1. const num = <Number> string
// 2. const num = string as Number
let str: string; 
let unknown = <unknown> str;
let numnum = <Number> unknown;

numnum = 8;

console.log(message)
console.log(red)
console.log(listA[0])
console.log(listB[2])
console.log(Color.Red)
console.log(notSyure)
console.log(warnUser())
console.log(create({props: 0}))
console.log(strLength)
console.log(numnum)
console.log(num)

//  type 肩に名前をつける


type BirthYear = number | string;

let year: BirthYear;

year = 2019
console.log(year)

// type はオブジェクトの型も扱える


type Person = {
  name:string;
  age:number;
}

// オブジェクトの型の定義


const postalCodes: {[key: string]: string} = {
 "3300000": "東京都",
 "3300001": "東京都",
 "3300002": "東京都"
}


// interface これはクラスに使うらしい

interface User {
  name:string;
  age: number;
}

// 関数


// 演習


function isPositive(num:number): boolean{
  return num >= 0
}


console.log("isPositive")
console.log(isPositive(2))
Railsでチーム内共通の定数を利用する方法


![トップイメージ](https://comst-sitemap.s3-ap-northeast-1.amazonaws.com/Rails+const.png)

## Railsでチーム共通の定数を管理する

システムを作成していると、開発チームで共通の定数などを利用したいことがあると思います。

各画面共通の値やパラメーター等を共通で利用できれば、「あの画面では”１”の値が印刷済なのに、こっちの画面では”１”の値が印刷済**み**」になっているとかいう状態を防ぐことができます。

もちろん、DBから値を取ってくるということもできますが、「チリも積もれば山となる」:smile:極力DBへ負荷を避けるという利点もありますね:start:

### コンスト用のファイルを用意

config/initializer/constants.rbに次のようなファイルを用意します。

```rb
#constants.rb
#サーバーサイドを通さず、クライアントサイド側で利用したい定数は別途jsファイルなどにまとめましょう

module CommonConst

    ## クライアント名
    CLIENT_NAME = "○○社総合人事システム"
    ## 業務区分
    GYOMU_KBN = {
        "1" => "給与管理",
        "2" => "庶務事務管理",
        "3" => "勤怠管理"
    }.freeze

end
```
### 呼び出し方

例えば、viewファイルで次のように呼び出すことができます。

```erb
<nav class="navbar navbar-default">
	<div class="container-fluid">
		<div class="navbar-header">
			<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbarEexample">
				<span class="sr-only">Toggle navigation</span>
				<span class="icon-bar"></span>
				<span class="icon-bar"></span>
				<span class="icon-bar"></span>
      </button>
      <!-- ↓ここ共通定数の呼び出し -->
			<a class="navbar-brand" href="/"><%= CommonConst::CLIENT_NAME %>総合人事システム</a>
		</div>
		
		<div class="collapse navbar-collapse" id="navbarEexample">
			<ul class="nav navbar-nav">
				<li class="active"><a href="#">メニューＡ</a></li>
				
			</ul>
		</div>
	</div>
</nav>
```

また、共通定数を利用した、セレクトボックスやラジオボタンの作成など、フォームコントロールを作成することもできます。

```erb
<h1 class="text-center">チームで決まったコンストを呼び出そう</h1>

<div class="form-group">
    <div>
        <%= label_tag '業務区分',nil,class:"label label-default" %>
        <%= select_tag('select_gyomu',options_for_select((CommonConst::GYOMU_KBN.invert),class:'option form-control',selected:"1"),include_blank:true)%>
    </div>
</div>
```

↓が呼び出し結果の画像です。

![定数呼び出しイメージ](https://comst-sitemap.s3-ap-northeast-1.amazonaws.com/demo-const.png)

ナビゲーションバーの、
「○○社総合人事システム」と、「給与管理」という項目が出ているセレクトボックスが共通定数から利用しています。（値は適当です）

このように、Railsでも結構簡単に、定数を利用できます。
（**とはいえ、Rubyにおける定数は取り扱いを注意しないと、値を変えられたり、参照先を変えることができるので、注意が必要です**）
CIツールの比較をしてみた ~プルリク作成時にテストを自動実行したい~

先日、`GitHubでプルリクを作った時、テストとコードスタイルチェックを自動化させたい！`となり、どのCIツールを使えばいいのか検討・比較をしました。今回はその時に調べたCIツールの特徴をそれぞれ書いていこうと思います。

#Jenkins
・拡張性が高い。
・自前のデプロイサーバーが必要。
・ビルドを作るのが大変で、属人化しやすい。
・BASEプランで`$15/月`。無料枠もあるが制限がかかる。

#CircleCI
・クラウドサービスなので、自前のサーバーが不要。
・コンテナが１つなら無料。追加のコンテナは一つにつき`$50`。
・札束大事。

#AWS CodeBuild
・環境構築をAWSでしている場合、管理や連携がしやすい。
・自前のサーバーが不要
・従量課金制。ビルドの実行にかかった時間に基づいて課金される。
・お安め。

#GitHub Actions
・まだβ版
・自前のサーバーが不要。
・パブリックリポジトリでは無料。プライベートリポジトリだと従量課金制。

###あとがき
ちなみに私は上記の情報から、CIツールにサーバーが不要かつ、比較的お安いかつ、大人の事情でAWS CodeBuildを採用しました。
どうすればNanoPiが日本で売れるようになるか？

# 概要
超小型で、高性能、高信頼性のNanoPi SBCは思ったほど日本に定着していません。
超紧凑，高性能，高可靠性的NanoPi SBC在日本并没有像预期的那样成熟。

何故でしょうか？
那是为什么？

原因と対策を考えました。
我想到了原因和对策。

# 売ってない（没有经销商）
NanoPiを日本で販売しているのは秋月電子通商のみ
只有Akizuki Electronics Commerce在日本销售NanoPi

それも僅かな機種だけです。
它只是少数几种型号。

後は海外通販を利用する以外入手方法がありません。
之后，除了使用海外邮购外，没有办法获得它。

SwitchScience、RSコンポーネンツ等Rasp Piを売っている国内販売店が取り扱うようになれば販売量は飛躍的に伸びると思います。
如果销售Rasp Pi的国内经销商（如SwitchScience和RS组件）处理它，我认为销量会急剧增加。

# 規格を通っていない （未获得日本标准认证）
NanoPiにはWi-FiやBLEを組み込んだ製品が多いのですが、「技適」を受けていないため、日本では使えません。
在NanoPi中有许多产品包含Wi-Fi和BLE，但它们不能在日本使用，因为它们不是“技適”的。

ACアダプタはPSE認証がないので、日本では使えません。
由于AC适配器没有PSE认证，因此不能在日本使用。

私たちはお願いします、是非”技適”認証を受けてください。
请给我们“技適”认证。

それが叶わぬのなら、無線通信機能を取り去るオプションを用意してください。
如果没有实现，请准备一个选项以删除无线通信功能。

ソフトウエアでNanoPiの無線機能を使わないようにしても、チップが乗っていると日本では電波法違反になってしまうのです。
即使你没有在软件中使用NanoPi的无线功能，如果你有一个芯片，它将违反日本的无线电法。

# 日本語のドキュメントがない（没有日文文件）
日本語の資料が全くありません。
根本没有日文文件。

NanoPiの日本語による入門資料があれば、状況は変わります。
如果您在NanoPi上有日语的介绍性文档，情况将会改变。

FriendlyElecドキュメント部で入門書を書きませんか？
您想在FriendlyElec文档部门写一本介绍性的书吗？

中国語で電子出版したら、日本の変人が翻訳するかもしれません  :-)
如果你用中文电子版发布，日本的怪人可能会翻译:-)
haml導入方法

#haml導入方法
1.公式ドキュメントもしくはGitHubでgemの取得方法を確認する
[Haml公式](http://haml.info/)
[GitHub haml](https://github.com/haml/haml-rails)
2.gemに記入する

```
gem 'haml-rails'
```

3.bundle install


#erb.ファイルをhamlに変換する
1.上と同じく公式もしくはGitHubでgemの取得方法を確認する
2.注意※　こちらはターミナルに入力する

```
 $ rails haml:erb2haml
```
3.bundle install
Sony SPRESENSEを使ってみよう(2) 

Sony SPRESENSEを使ってみよう(1) Arduino編の続きです。
https://qiita.com/usashirou/items/42782444dcbc27dc71c4

SONY SPRESENSEで気になった点がいくつかあったので記載します。

#スペーサー
組み立ての際に使用するスペーサーはM2x3とM2のネジを使用することをお勧めします。
同梱されているスペーサーを使用すると、取り外しできないだけでなく、コネクタが正常にはまらず、動作しないことがあります（ありました）
https://developer.sony.com/develop/spresense/docs/hw_docs_ja.html#_%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9C%E3%83%BC%E3%83%89%E3%81%A7%E3%81%AE%E3%83%9F%E3%83%8B%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B5%E3%83%BC%E3%81%AE%E4%BD%BF%E7%94%A8%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

PC-0203
https://www.hirosugi-net.co.jp/shop/g/g35325/
AS-2003
https://www.hirosugi-net.co.jp/shop/g/g3505/

#MicroSD
次に、SDカードですが、4GB以上のものを使用するとうまく動かないケースがあります。
2GB　Trancend⇒問題なし
16GB
SandiskのMicroSDカードはうまく動きませんでした。（数枚すべて使用不可）
東芝のMicroSDカードはうまく動きませんでした。（2枚確認OK)

マイコンには4GBのMicroSDはお勧めしません。
<font color="Red">
「認識しない」から「うまく動かない」にフレーズを変更しています。
なぜならば、認識して止まっているので、認識しないは誤りだからです。</font>

Sandisk⇒止まる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/8ec21004-4d50-3eed-28ce-e734d5e1bbc1.png)

Toshiba⇒止まらない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/40e55f8b-3f37-fe06-ea0a-0b296c2a2c61.png)

![microsd.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/5533134d-91d1-4fe7-6ead-2adcc6a94753.jpeg)

#マイク
マイクを使う人は、秋月電子のコンデンサマイク等が良いかと
http://akizukidenshi.com/catalog/g/gP-08182/
使用例としてはIoTあるじゃん「SPRESENSE＋ニューラルネットワークで音声推論！軽量AI+IoTハンズオン@横浜」の武藤先生のテキストを参照ください。
https://docs.google.com/document/d/1XGrlxr9OR0KiB8XKCgiyRZS-VBkZQ3wfE6fPRwZr98A/edit#

#Rohm　センサAdd-onボードについて
RohmのセンサAdd-onボードの搭載チップが変わっています
KX122⇒kx126に変わっています。
勝手に変えてしまっており非常に不親切な姿勢には頭に来ます

#外部電源コネクター
S2B-PH-K-Sを指定されています。
秋月電子で＠10です
http://akizukidenshi.com/catalog/g/gC-12633/

#参考資料
インスケイプ　APSマガジン　青柳 信吾先生による連載
https://www.aps-web.jp/academy/amp/
【Terraform】template_fileにてshellで変数を使う方法

# 【Terraform】template_fileのshellで変数を使う方法
地味に探しにくかったのでメモ
## 最初
下記のようにshellを書くと`${var}`がterraformのvarsとして認識されてしまう。
そのため単純に変数を使うことができなかった。
### main.tf
```
data "template_file" "shell" {
  template=<<EOF
    #!/bin/bash

    var=12345

    echo ${var}
  EOF
}
```

### terraform plan実行結果
```
$ terraform plan

Error: data.template_file.shell: 1 error(s) occurred:

* data.template_file.shell: invalid variable syntax: "var". Did you mean 'var.var'? If this is part of inline `template` parameter
then you must escape the interpolation with two dollar signs. For
example: ${a} becomes $${a}
```

## 修正
varsに書くまではわかったが`$`を重ねないといけないというのがなかなか出てこなかった
### main.tf
```
data "template_file" "shell" {
  vars = {
      var="$${var}" # $を重ねないといけない
  }
  template=<<EOF
    #!/bin/bash

    var=12345

    echo $${var}
  EOF
}
```
コマンド操作一覧

バージョンの確認方法

```php
$python --version
$python -V
Python 3.7.4
```

アップグレード、ダウングレード

```php
$conda install keras=2.1.6
$conda install tensorflow=1.5.0
```

環境一覧

```php
$conda info -e
```

環境の有効化

```php
$source activate py37
$source activate (環境名)
```

ディレクトリ移動

```php
$cd study
$cd (ディレクトリ名)
```

1つ上のディレクトリへ戻る

```php
$cd -
```

実行プログラムの終了

```php
>>> print(django.get_version())
3.1.3
>>> exst()
```

コマンドの終了

```php
(py37) user:study user$ exit
logout
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.
Deleting expired sessions...72 completed.
```
Railsチュートリアル1章

railsチュートリアルを始めたので復習

```
$ rails server
```
ローカル環境にサーバーが立ち上がる

```
$ rails _5.1.6_ new hello_app
```
railsのバージョン5.1.6に固定しhello_appを作成。

#Git 

```
$ git init
```
gitのセットアップ。リポジトリの初期化。
`rails new hello_app`したなら`hello_app`のルートディレクトリで行う。
`hello_app`のファイルを入れる貯蔵庫を作りますよ〜的な感じ。

```
$ git add -A
```
現在のディレクトリにあるファイルが全てリポジトリに追加される。
貯蔵庫にファイルを入れますよ〜。

```
$ git log         #gitのログを表示
$ git status      #gitのステータスを表示
```

```
$ git commit -m "コメント"
```
最後にコミットします。　`-m`を使うとダブルクォーテーション内にコミットメッセージを
追加できます。`-m`を使用しなければエディタが開いて入力する形になります。
`add`で追加はしたけどリポジトリに反映がされていない状態？なので`commit`が必要になります！

###リモートリポジトリの追加
```
$ git remote add 追加するリモートリポジトリ名　追加したいリポジトリ
```
```
$ git remote add origin git@bitbucket.org:ユーザー名/hello_app.git
```
bitbucketの場合はbitbucket内でリポジトリを作成し、リポジトリのソースの上の方に
リポジトリが表記されているのでコピペして上記のようにできればOKです。

```
$ git push -u origin --all
```
最後に`push`を行うことでリモートリポジトリに追加されます！


#Heroku

```
$ Heroku create 
```
herokuのサーバーにアプリケーションの実行場所を作成します。
ここに作成したアプリケーションを`push`します。
この時生成されるアドレスをブラウザで開くことでデプロイしたアプリケーションを
表示できます。

```
$ git push Heroku master
```
gitで`commit`されているリポジトリのmaster(ブランチ)をherokuに`push`します。
これでデプロイ完了です。


HerokuではデータベースにSQLiteが使えないのでPostgreSQLを使用します。
なのでgemfileの書き換えなどで対処する必要があります。
開発環境(development)と本番環境(production)でgemの書き換えをします。


第1章の内容を第5章終了時に復習を兼ねて記載しました。
認識が違う部分がまだまだあるとは思いますが何かあればコメントなどお願い致します！
Docker基本コマンドをざっくり確認する

よく使うコマンドをまとめてみました。

追記)docker v1.13以前のコマンドを記載していたので、v1.13以降のコマンドに修正しました。

# Dockerイメージを検索
```bash
$ docker search [コンテナ名] # Docker Hubでイメージを検索 
```
# イメージ取得～コンテナ起動
```bash
$ docker image pull [コンテナ名] # Docker Hubからイメージ取得
$ docker container create -name [作成コンテナ名] [イメージ名] # イメージからコンテナ作成
$ docker container start [コンテナ名] # コンテナを起動

$ docker container run [コンテナ名] # pull,create,startを同時実行
```

# イメージ起動 & bashログイン 
```bash
$ docker container run -it [イメージ名]:[タグ] /bin/bash 
```

# イメージ
```bash
$ docker image ls # 一覧表示
$ docker image rm [イメージID] # 削除
$ docker image prune # noneイメージの一括削除(v1.2５以降)
```

# コンテナ
```bash
# 一覧表示(-a付きの場合、停止中も含む)
$ docker container ls -a 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
845e015b8f95        hello-world         "/hello"            2 minutes ago       Exited (0) 2 minutes ago                       agitated_heisenberg

# 起動、停止、削除、コンテナログイン
$ docker container start # 起動
$ docker container stop # 停止
$ docker container restart # 再起動
$ docker container exec -it [起動中コンテナ名] bash # 起動中コンテナにシェル接続、exitしてもコンテナは停止なし
$ docker container logs # コンテナバックグラウンド実行ログの参照 「-f」付きで tail -fと同じ挙動
$ docker container inspect # コンテナ情報をjson形式で詳細表示
$ docker container rm [コンテナID/名前] # コンテナ削除。不使用コンテナはHDを圧迫するので削除する

# コンテナからイメージ作成
$ docker container commit [コンテナ名] [image名：tag名] # 現状コンテナの状態をイメージに保存する
$ docker image build -t [ビルドイメージ名] . # 独自イメージをビルド
$ docker image build -no-cache -t [ビルドイメージ名] # 独自イメージをキャッシュなしでビルド
```
FOSS4G 2019 Niigata で得たものの整理

# ハンズオンマテリアル関係
[こちら](https://hackmd.io/@hfu/ango-slides#/)と[こちら](https://hackmd.io/@PLWC0AJdTuSCXOkyf_cA5w/HJ5OkDD8S#/)を用いて、柴本さん・松澤さんとともにハンズオンを行なった。

## asciinema を使うようにしたい
ango の開発の際に検討はしていて採用はしていなかったのだが、やはり[asciinema](https://asciinema.org/) のような CUI のスクリーンキャストを使う等にすると良いと思う。

なぜなら、聴講者に対して「何がコマンド入力で、何がコマンド出力か」を確実に伝えるのは、スタティックな表示では難しいからだ。

## modify.js や modify.sql の意義を丁寧に説明する
国連ベクトルタイルツールキットはストリーム志向のソフトウェアなのだが、その処理の中で modify.js や modify.sql が入る理由について、今回は質問をいただいた。

次のような理由を、積極的に説明していくことが適切だと思う。

1. modify.js を使うことで、中間ファイルの保存を行わずに済ませ、ストレージを節約するとともに、処理速度を向上することができる。
2. ベクトルタイルの生産担当者には、必ずしもマスターデータを変更する権限がない場合が多い。ベクトルタイル生産の都合によるデータの調整は、マスターデータに対しては行えないので、modify.js を使う。

## そもそもベクトルタイルとは何かについて説明する
私は次のように説明します。

1. ウェブ地図では地図を細切れに分けてストリームするが、その細切れのことをタイルと言い、タイルには画像タイルやベクトルタイルがある。画像タイルもベクトルタイルも表示された見た目は同じ。
2. しかし、画像タイルはレンダリングした画像であり、ベクトルタイルは機械可読なデータである。
3. 画像よりもデータの方が75%ほど軽い。その軽さがイノベーションをもたらす。

## スマートな Raspberry Pi の使い方
PC に Raspberry Pi をイーサネットケーブルで直結して、 raspberrypi.local というホスト名に ssh するという方法がもっともスマートであるように思われる。

電源ケーブルとイーサネットケーブルを十分短いものにすれば、かなりスマートな提示ができると思われる。

実際には、PC 側に必ずしもイーサーネットポートがあるわけではないので、USB/イーサネット変換や、USB-C/イーサネット変換のアダプタもある程度の数持っておく必要があると考える。

## Docker Toolbox ではポート転送が必要
Docker Toolbox を使う人に対しては、 Oracle VirtualBox でポート転送を設定してもらう必要がある。そのほかの場合には、既存の案内内容で十分にポート転送ができている。

## 自ホスト名をスマートに扱う
自ホスト名が localhost になるパターンと raspberrypi.local になるパターンが発生し、 style.(h)json を書き換える必要が発生した。

自ホスト名を config/default.hjson あたりに逃し、rake build の時に自ホスト名を style.json に埋め込むようにすると、面倒な編集が不要になる。

自ホスト名は、タイルのテンプレート URL、スプライトの URL、フォントの URL と三回使われることになるので、rake build のときに埋めるようにしたほうが安全、ということである。

## tippecanoe のコマンドラインオプションは short form? long form?
ango では、私が long form のオプションを使い、柴本さんが short form のオプションを使った。統一できた方が良い。

私は rake にコマンドを書いて、研修の中で解説だけすることにしたので、long form を使った一方、柴本さんはコマンドを直接打ってもらうことにしたので、short form を使ったのである。よって、rake を使うかどうかの判断に合わせて、long か short かを決断すれば良いと思う。

## 地球地図に取り組んでいく
地球地図はすでにベクトルタイルにされているから、ハンズオンにそれをなぞるような感じになる。まずは、地球地図 GeoJSONS を optgeo の中に作るのも一つの方法だと思う。

レポジトリを私が作るとしたら Inazo という名前にすると思う。

## サポート要員の数
サポート要員の必要数は、同時に発生するサポート要求の数に合わせれば良い。今回はサポート要員２名で１６名程度への対応であったので、かなり余裕を持って対応することができた。最小のサポート要員数は１だと思う。サポート要員をゼロにして講師だけで対応しようとすると、ハンズオンの質がかなり下がる可能性がある。

# プレゼンテーションの内容関係
[こちら](https://speakerdeck.com/hfu/guo-lian-tojin-merubekutorutairu)のプレゼンテーションを行なった。

## 適切なガバナンスの確保について
OSGeo Incubation Process への応募を長期的に目指していくことで、オープンソースプロジェクトとしての適切なガバナンスを得ていくことを目指す。

そのための課題は、[ここ](https://github.com/un-vector-tile-toolkit/incubate/issues)でじわじわと検討していくことになる。

## 統制されたネットワークへの対応について
次の世代のハンズオンマテリアルについて作業をするにあたって、「インターネットから独立したウェブ地図」として動作するようになることをまず目指す。

## FOSS4G Monthly Online について
Zoom を使って月例開催する方向で考えていくが、目標は10月の第三木曜日に初実施、というあたりだと考えている。

# ツールの勉強
とりあえず、次の二つのツールについて、動き始める前に勉強をしておく必要があると認識している。

- Slack
- Zoom
Xeon中古PCを探すときに気をつけること

#Xeon安い
ヤフオクとかで中古PCを探すと、Sandy Bridgeとかでも、Core i7なら結構な値段がします。

もっと安いPCを探したことがある方なら、Xeonのサーバー用PCを探し当てたことがあるかもしれません。特に、ラックマウントサーバー（平べったいやつ）とかなら、大容量のメモリを積んでても、なんだかびっくりするくらい安い物もあります。

これでいいじゃん！と思ってポチる前に、色々と考える必要があるので、備忘録としてとりあえずまとめることにしました。

#これだけはやめとけ
とりあえず、これだけはやめとけって例を挙げときます。

##ラックマウントサーバーをデスクトップとして使う
**まず無理ですやめましょう**。学生時代、1Uのラックマウントサーバーを研究室に置いていましたが、うるさいと苦情が出てなかなか起動できませんでした。

自宅ラック勢の諸先輩の存在は知っていますが、あれは選ばれし人々なので、凡人が手を出してはいけません。

##オンボードのグラフィックを使用する
ワークステーション向けで、内蔵グラフィックを積んでるXeonとかならまだマシですが、それ以外のサーバー用PCに載ってるGPUを普段使いするのは無理です(2010年位に買った1Uサーバーの中古には、Savageとかが載ってました)。モノにもよりますが、フルHDさえ表示できないなんてザラです。例えがマニアックですが、LinuxでXをフレームバッファ表示するくらいカクカクです。苦行でしかない。

#注意すること
ここまで言ってもまだやりたい人は、以下の点に注意しましょう

##搭載可能なメモリに注意する
普通のPCは、DDR4とかDDR3のNon ECC Unbufferedですが、サーバー用PCは大抵、ECCメモリのUnbufferedか、ECCメモリのRegisteredです。

稀にサーバー用PCでもNon ECC Unbufferedなメモリが使える場合がありますが、本当に稀です。

基本的に、ECCとNon ECC, UnbuffererdとRegisteredは共存できないので注意しましょう。あと、ECCメモリは高いので注意です。

##ライセンスに注意する
当然ですが、サーバー用PCにクライアント用OSのライセンスなんて付いてきません。自前で用意するか、Linuxを使用する必要があります。

##使用できない拡張カードがあるかも
これは個体差がありますが、中には使用できない拡張カードがある場合もあります。昔、ML115をデスクトップとして使用したときには、グラボのエッジコネクタの一部をルーターで削ったりしました。

#まとめ
とりあえず思いつきで書きましたが、他に何かあれば追記するかもしれません。
iPadのOSアップデートをブロックする方法ないの？

組織のiPadを管理している人を恐怖のどん底に追い落とすような、恐ろしい情報が‥。

[iPad 上の iOS13 の挙動変更により Azure AD 条件付きアクセス ポリシーの動作に影響が生じる](https://github.com/jpazureid/blog/blob/master/articles/azure-active-directory/evaluate-and-update-any-ca-policies-for-ipados.md)

Appleの仕様変更で、iPadを13にバージョンアップすると、Safariとかネイティブメーラーは、MacOSとみなすぜ！なので準備してね！ということらしい。

そうなっちゃうと、認証とセキュリティポリシーが影響受けそう。下手すればログインできなくなるとか、セキュリティポリシーの適用外になりかねない。

認証の構成やセキュリティポリシーの適用から、iPadのOSバージョンを12にとどめておきたい。せめて無期限とは言わなくても、検証する間だけでもいいから、ってことで調べてみた。

#ざっくり

Intuneだとこの記事が一番わかりやすい。
[Microsoft Intuneで iOS のアップデートを制限する](https://techlife.tokyo/software-updates-ios-intune-1368.html)

設定手順の紹介もあるけど、こういうことらしい。
・iOS11.3移行
・監視対象デバイス
・OSのバージョンがリリースされて最長90日までは制限できる
・完全にブロックではなく、あくまで延期でしかない

2010918追記
ソフトウエアのアップデートの設定は上記の記事の通りでしたが、アップデートの延期は上記ではなく、デバイス構成プロファイル→iOS→デバイスの制限→全般、に移動してました。

#公式ドキュメント

いくつかひろってみた。

■Apple　[管理対象のソフトウェアアップデートについて](https://support.apple.com/ja-jp/HT208644)

>iOS 11.3 以降、tvOS 12.2 以降では、MDM の管理者が、監視対象のデバイスに新しいソフトウェアアップデートが表示される時期を遅らせることができます。 

iOS や macOS のソフトウェアアップデートを管理者が遅らせている場合は、管理者によって認められた最新のソフトウェアアップデートがデバイスで実行されているというメッセージが表示されます。

■Intune　[Intune に iOS ソフトウェア更新プログラム ポリシーを追加する](https://docs.microsoft.com/ja-jp/intune/software-updates-ios)

>ソフトウェアの更新ポリシーにより、監視対象の iOS デバイスに利用可能な最新の OS 更新プログラムを強制的に自動インストールします。 ポリシーを構成しているときに、デバイスで更新プログラムをインストールしない日時を追加できます。
この機能は、以下に適用されます。
iOS 10.3 以降 (監督下)
デバイスは約 8 時間ごとに Intune でチェックインされます。 更新プログラムを利用できて、制限時間中ではない場合、デバイスで最新の OS 更新プログラムをダウンロードしてインストールします。 デバイスを更新するために必要なユーザーの操作はありません。 ポリシーにより、ユーザーが手動で OS を更新できなくなることはありません。

10.3ってあるのは誤記？

■AirWatch　[iOS デバイス用の制限事項プロファイルの構成](https://docs.vmware.com/jp/VMware-Workspace-ONE-UEM/1811/VMware-Workspace-ONE-UEM-iOS-Device-Management/GUID-AWT-RESTRIPROF-CONFIG.html)

>このオプションを有効にし、ソフトウェアの更新を延期する日数を指定します。日数は 1 ～ 90 日の範囲です。(iOS 11.3 以降の監視モード デバイス)。日数は、ソフトウェアの更新がリリースされてからの期間です。プロファイルをインストールしてからの期間ではありません。

#荒っぽい方法
アップデート用のサーバーへのアクセスを、常時VPN構成＋firewallでブロックという方法もあるらしい。

[iOS バージョンアップを止める方法](http://mdm-richard.blogspot.com/2014/09/blog-post.html)
※2014年の記事のようです。

#まとめ

外部認証サービス使ってたら、そっちの影響も考えなきゃいけない。
とりあえず、β版のiPad用意して検証＆
ユーザーのデバイスは延期してその間に検証＆対策検討、ですかね・・・。
AdobeXDで画像ファイルをドラッグドロップで配置できない

まずはこちらの方法を試します

【AdobeXD】画像をドラッグ＆ドロップできない問題の解決方法 | CGメソッド
https://www.cg-method.com/entry/adobexd-can-not-dragged-and-dropped/

それでもだめなら

Windows10でファイルをドラッグ&ドロップ出来ない?! を解決する方法 | パソコン生活サポートPasonal
https://pasonal.com/windows10-drag-drop-error/

こちらの方法もお試しください
Laravel6.0でログイン機能の実装メモ

##前提
laravel6.0へのアップデートにより

laravel5.8までで使用していたコマンド、

```
$ php artisan make:auth
```
が変わった。


##新コマンド

```
$ composer require laravel/ui
$ npm i
```

の後に、

###①Vueで実装

```
$ php artisan ui vue --auth
```

###②Reactで実装

```
$ php artisan ui react --auth
```

vueかreactかはお好みで。


最後に

```
$ php artisan migrate
```
マイグレーションすればOK!
Wiresharkを利用したMalware Traffic Analysis手順まとめ

マルウェア解析に関する勉強方法の１つとして、[Malware Traffic Analysis.net](https://www.malware-traffic-analysis.net/)というサイトを紹介してもらったので
こちらを題材に勉強してみようとおもいます。
Wiresharkを利用したマルウェア通信解析の手順をまとめ（随時更新）いこうとおもいます。
Youtubeや海外ブログの内容をもとに独学でまとめておりますので、他にもよいほうほうがありましたら是非おしえてください！

※当たり前ですが実際に検証を行う際は仮想環境上で外部通信しないよう確認の上行うようにしてください。

#画面のカスタマイズ
デフォルト設定だと使いにくい部分があったので下記のようにカスタマイズしています。
・不要なカラムの削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102081/9ccf6398-19ca-38a4-feeb-e9df415b2d57.png)
・時刻表示形式の変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102081/00a0a1da-ef3f-e1ad-4c18-7a6051e4146e.png)

#解析手順
##プロトコル別のソート
統計＞プロトコル階層統計　より下記の図が表示可能です。
注目のプロトコルを選択して、この画面からソートすることも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102081/a0d05780-404b-ee19-0b69-d08cbad75c30.png)

##ホスト名に注目した調査
http.requestなどでリクエストを精査し、気になる通信を発見した場合
通信先を新規に列に追加することで、よりパケットを見分けやすくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102081/7f0ae657-2fa8-dc1e-4484-314e6e246baa.png)
ポートを合わせて表示しておくとより見やすいかも。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102081/cec21cc8-84f9-e61e-6c3f-7f9c4b3472a4.png)

##検体を取り出す
不審なパケットを選択し、ファイル＞オブジェクトをエクスポートで検体を取り出す。
実際の検体を入手し、解析する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102081/92b79db6-41ed-315d-8192-eec5d1e206d6.png)


#おわり
勉強しながら徐々に追加していきます！
送信フォームで二重送信が起きる場合には

比較的レアな状況だと思うが2度ほど同じ過ちに出会ったので記録。
HTMLでフォームを送信する場合になぜかバリデーションが誤作動した。
原因を辿ると以下のようなコードが。

```html
 <body>
 <form action="testresult.php" method="POST" name="testform">
 <input type="text" name="test1">
 <input type="submit" onclick="submit_form()">
 </body>
 <script>
 function submit_form(){
 document.testform.submit();
 }
 </script>
```

`testresult.php` にフォームを送信したくて、そのために`input type="submit"`としている。
その時点でフォームは送信できているが、更にJavaScriptでもsubmitする関数をonClickで呼び出してしまっている。結果的にこのフォームは二重で送信されてしまう。
これを防ぐには、`input type="submit"`を`input type="button"`に変えてしまうか、JavaScriptの関数を削除する。後者の方がすっきりする。
VScode+pandoc+Lualatexで日本語pdfをMarkdownから出力する

# 事の経緯
ここ数年間Markdownで様々なメモや実験プロトコルをVScode+pandocで作製していたが、日本語markdownは専らWordファイルに変換していました。最近TeXliveを(なんとなく)導入したので「latex+pandocでmarkdown→pdfできたら便利じゃない？」と思いpdf化に勤しんでいたら何故か日本語の含まれている文書ではpdf化できないらしいので、その解決策を備忘録代わりにQiitaにあげておきます。他にハマっている人（いるか知らないけど）の助けになるかも？

# 原因
@sky_y さんの書かれた『[メモ:Pandoc+LaTeXで気軽に日本語PDFを出力する][2]』に非常にわかりやすく原因(+解決策)が書かれています。是非ご参照ください。
[2]:https://qiita.com/sky_y/items/15bf7737f4b37da50372

簡単に言いますと
1. Pandocが使うPDF変換エンジンは、デフォルトでpdflatex
2. pdflatexは日本語に対応していない
3. 対応しているエンジン(lualatex)は和文フォントを無視して出力する（~~なんでやねん~~）

...と日本人にはありがたくない仕様になっています。そこで、
1. pdf化に用いるエンジンをlualatexに変える
2. pdfにフォントを埋め込む
という二段階の設定をvscode-pandocにしてあげれば万事解決！というわけです

# 方法
### 環境設定
+ windows 10
+ VScode v1.38.1
+ pandoc v2.7.3
+ vscode-pandoc
+ Tex live 2019

多分、Tex liveは最新版である必要ないはずですが、**日本語対応パッケージがマージされたTex live 2010以上を推奨します**(2016以上のほうが良い？)。
それ未満のものを使っている人はアプデしましょう。tlmgrコマンドが使えます。詳細は[こちら][1]
[1]:https://texwiki.texjp.org/?tlmgr

細かいインストール方法は~~書くのがめんどくさい~~丁寧な記事が多く存在するので割愛します。

これらをインストールしたら、VScodeを起動し```ctrl+,```で設定画面に飛びます。
その後、Setting.json(右上のアイコンから入れる)で

```
"pandoc.pdfOptString": "--pdf-engine=lualatex -V documentclass=ltjsarticle -V luatexjapresetoption=ms",
```

を追加します。

```--pdf-engine=lualatex ```でpdfエンジンを変更し、```-V documentclass=ltjsarticle -V luatexjapresetoption=ms```で和文pdf作製&フォント指定を行います。```-V luatexjapresetoption=```がフォント指定のコマンドになっています。
「MSフォントなんか使いたくねぇ！」という人は游明朝やヒラギノ、IPAexフォントを指定できます。

以下、フォントについて『[LuaTeX-ja の使い方][3]』からの引用
[3]:https://ja.osdn.net/projects/luatex-ja/wiki/LuaTeX-ja%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9

> noembed: 非埋込
> kozuka-pro: 小塚フォント (Pro)
> kozuka-pr6: 小塚フォント (ProVI)
> kozuka-pr6n: 小塚フォント (Pr6N)
> hiragino-pro: ヒラギノフォント (Pro, Std)
> hiragino-pron: ヒラギノフォント (ProN, StdN)
> morisawa-pro: モリサワフォント (Pro)
> morisawa-pr6n: モリサワフォント (Pr6N)
> ipa: IPAフォント
> ipaex: IPAexフォント
> ms: MS 明朝，MS ゴシック
> moga-mobo: MogaMincho, MogaGothic, MoboGothic（20150420.0 以降）
> yu-win: Windows 8.1 に付属する游書体（20140114.0 以降）
> yu-osx: OS X 10.9 に付属する游書体（20140114.0 以降）
> sourcehan: 源ノ明朝，源ノ角ゴシック


以上です。

# 参考文献
[メモ:Pandoc+LaTeXで気軽に日本語PDFを出力する][2]
[Tex Wiki][1]
[LuaTex-ja][3]
typescritpt for begginer with mosh



- Typscript →　Javascript



```変数
let a: number;
let c:string;
let e:number[] = [1,2,3];


enum Color { Red = 0 , Green = 1};

const backgroundColor = Color.Red;

console.log(a)

```

- objectはinterfaceでまとめてしまう

```javascript:アロー関数とinterface

let drawPoint = (point: {x: number, y:number}) =>{
    //..
}

drawPoint({
    x: 1,
    y: 2 
})



# interface

interface Point {
  x: number,
  y: number
}

let drawPoint = (point: Point) =>{
    //..
}

drawPoint({
    x: 1,
    y: 2 
})
```


```javascript:クラス


class Point {
  x: number;
  y: number;

  draw(){
    console.log('X: ' + this.x + ', Y: ' + this.y)
  }

  getDistance(another: Point){

  }

}



let point = new Point();
point.x = 1;
point.y = 2;

point.draw()


tsc main.ts && node main.js

```


```javascript:コンストラクターあり


class Point {
  x: number;
  y: number;

  constructor(x: number, y: number){
    this.x = x
    this.y = y
  }

  draw(){
    console.log('X: ' + this.x + ', Y: ' + this.y)
  }

  getDistance(another: Point){

  }

}



let point = new Point(1,2);

point.draw()

```

- Access Modifier when you update property


```javascript:アクセッサ


class Point {
  constructor(private x: number,private y: number){
  }

  draw(){
    console.log('X: ' + this.x + ', Y: ' + this.y)
  }
  
  getX(){
    return this.x;
  }

  setX(value){
    if (value < 0) 
       throw new Error('value caoonot be less than  0')
     this.x = value;
  }

}



let point = new Point(1,2);

let x = point.getX()
point.setX(10)

point.draw()


## これが最新

- x,y → _x  _y


class Point {
  constructor(private _x: number,private _y: number){
  }

  draw(){
    console.log('X: ' + this._x + ', Y: ' + this._y)
  }
  
  get x(){
    return this.x;
  }

  set x(value){
    if (value < 0) 
       throw new Error('value caoonot be less than  0')
     this._x = value;
  }

}



let point = new Point(1,2);

let x = point.x
point.x = 10;

point.draw()

```

- module

```javascript

/point.ts

export class Point{

}

/main.ts

import {Point} from './Point'

let point = new Point(1,2)
point.draw()
```
メモ：俺なりのLakeCounting

記事の見てくれとか何も気にせず他の人の書いたコードをもとにして自分なりに書いたのをここに保存。


a = list(map(int,input().split()))
n = a[0]
m = a[1]
#print("n=",n,"m=",m)
field=[]
for i in range(n):
  field.append(list(input()))
def dfs(x,y):
  #print("x=",x,"y=",y)
  field[x][y] = '.'
  for dx in [-1,0,1]:
    for dy in [-1,0,1]:
      nx = x + dx
      ny = y + dy
      #print("nx=",nx,"ny=",ny)
      if(0<=nx and nx<n and 0<=ny and ny<m and field[nx][ny] == 'W'):
        dfs(nx,ny)
res = 0
for j in range(n):
  for k in range(m):
    print("j=",j,"k=",k,"field[",j,"][",k,"]=",field[j][k])
    if(field[j][k]=='W'):
      #print("so dfs starts!!")
      dfs(j,k)
      res +=1
M5StickVで2枚の画像の変化量を取る



```python:boot.py
import sensor, image, utime, lcd
from Maix import GPIO
from fpioa_manager import fm
from board import board_info
from machine import I2C

i2c = I2C(I2C.I2C0, freq=400000, scl=28, sda=29)
lcd.init(freq=15000000)
i2c.writeto_mem(0x34, 0x91,b'\x70')  # バックライトを最低輝度
sensor.reset()
sensor.set_pixformat(sensor.GRAYSCALE) #カメラ画像をグレースケールに設定
sensor.set_framesize(sensor.QQVGA)   # カメラ画像をQQVGAに設定
sensor.run(1)
sensor.skip_frames(time = 500)

fm.register(board_info.BUTTON_A, fm.fpioa.GPIO1)
button_a = GPIO(GPIO.GPIO1, GPIO.IN, GPIO.PULL_UP)

#extra_fb = sensor.alloc_extra_fb(sensor.width(), sensor.height(), sensor.RGB565)

print("About to save background image...")
sensor.skip_frames(time = 500) #センサ待ち
baseImage = sensor.get_fb()
print("Saved background image - Now frame differencing!")
start = 0

while(True):
    img = sensor.snapshot()         #カメラ画像取得
    #lcd.display()                #LCDに表示
    sim = img.get_similarity(baseImage)
    th = sim.max()
    #print(th)
    if(th < 0.75):　　　　#別画像と判定する閾値を設定
        print("something in")
        now = utime.ticks_ms()
        lapTime = now - start
        ms = lapTime % 1000
        s = (int)(lapTime / 1000)
        m = (int)(s / 60)
        s = s % 60
        print("%d'%d\"%d" %( m, s, ms))
        timeString = str(m) + '\'' + str(s) + '\"' + str(ms)
        simg = image.Image()
        simg.draw_string(10,30, timeString, scale=4)
        lcd.display(simg)
        i2c.writeto_mem(0x34, 0x91,b'\xA0')  #液晶輝度変更
        start = now
        utime.sleep(1)
        i2c.writeto_mem(0x34, 0x91,b'\x70')  #液晶輝度変更

    if button_a.value() == 0:
        print("A pushed ")
        baseImage = img.copy()
        utime.sleep(0.3)
```

https://docs.openmv.io/index.html
https://maixpy.sipeed.com/en/
2019/09/14 作業ログ

1.headerにプロフィール内のコンテンツをリンク表示し、リンクをクリックすることで各コンテンツに自動でブラウジングされる仕組みを加える。
→
「結果」
未完成。
・リサーチの結果、ブラウジングするためにはPHPとJQueryを実装することが必要と判明。
→メンターに質問しながらやっていく。

【うまくいかない部分】
・ヘッダーの中間部分にリンクを表示したかったが、margin-topを指定してもうまく表示されず。

<img width="479" alt="スクリーンショット 2019-09-15 19.41.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496040/87623751-d6d4-9cca-8437-0007866ae50e.png">


2.画像を読み込み、画像上に文字を読み込ませる。
「結果」
未完成。

【うまくいかない部分】
・画像の上に文字を読み込ませること。
→
リサーチした結果、画像にposition:relative、文字にposition:absoluteを
CSSで記載することで画像上に文字を移入することが可能と判明。

実際に試したがなぜか上手くいかず。

<img width="723" alt="スクリーンショット 2019-09-15 19.41.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496040/73c79966-1c14-59fd-a50a-4dd532760195.png">
Debian10 (buster) に管理しやすくパッケージインストールする

# Backportsを使う
## 設定手順（buster-backports）
Backports - Debian Wiki https://wiki.debian.org/Backports

### sources.list へ　Backports のリポジトリを追加します。
```
$ sudo vi /etc/apt/sources.list

# (下記を追加)
deb http://deb.debian.org/debian buster-backports main contrib non-free
```
追記後、APTリポジトリ更新します。

```
$ sudo apt update
```

# 開発元が提供するリポジトリを使う
## Visual Studio Code の場合
Running Visual Studio Code on Linux https://code.visualstudio.com/docs/setup/linux

### パッケージを認証するキーの追加（APTキー管理）
公開鍵をマイクロソフトのサイトからダウンロードし（packages.microsoft.gpg という名前で保存）、APTキー管理フォルダ（/usr/share/keyrings/）に追加します。

```
$ curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
$ sudo install -o root -g root -m 644 packages.microsoft.gpg /usr/share/keyrings/
```

APTリポジトリのソースを追加します。
下記の例では echo コマンドで vscode 用のソースファイル（vscode.list）を /etc/apt/sources.list.d/ フォルダに置いてます。

```
$ sudo sh -c 'echo "deb [arch=amd64 signed-by=/usr/share/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list'
```
APTリポジトリ更新します。

```
$ sudo apt update
```

### Visual Studio Code のインストール
sudo apt install code

insider-codeのインストールも可能です。
sudo apt install insider-code

```
$ sudo apt install code

パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
  code
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
55.4 MB のアーカイブを取得する必要があります。
この操作後に追加で 245 MB のディスク容量が消費されます。
取得:1 https://packages.microsoft.com/repos/vscode stable/main amd64 code amd64 1.38.1-1568209190 [55.4 MB]
55.4 MB を 18秒 で取得しました (3,054 kB/s)                                                                            
以前に未選択のパッケージ code を選択しています。
(データベースを読み込んでいます ... 現在 143372 個のファイルとディレクトリがインストールされています。)
.../code_1.38.1-1568209190_amd64.deb を展開する準備をしています ...
code (1.38.1-1568209190) を展開しています...
code (1.38.1-1568209190) を設定しています ...
mime-support (3.62) のトリガを処理しています ...
gnome-menus (3.31.4-3) のトリガを処理しています ...
desktop-file-utils (0.23-4) のトリガを処理しています ...

$ sudo apt install code-insiders

パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
  code-insiders
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
55.3 MB のアーカイブを取得する必要があります。
この操作後に追加で 242 MB のディスク容量が消費されます。
取得:1 https://packages.microsoft.com/repos/vscode stable/main amd64 code-insiders amd64 1.39.0-1568277878 [55.3 MB]
55.3 MB を 27秒 で取得しました (2,035 kB/s)                                                                            
以前に未選択のパッケージ code-insiders を選択しています。
(データベースを読み込んでいます ... 現在 145190 個のファイルとディレクトリがインストールされています。)
.../code-insiders_1.39.0-1568277878_amd64.deb を展開する準備をしています ...
code-insiders (1.39.0-1568277878) を展開しています...
code-insiders (1.39.0-1568277878) を設定しています ...
mime-support (3.62) のトリガを処理しています ...
gnome-menus (3.31.4-3) のトリガを処理しています ...
desktop-file-utils (0.23-4) のトリガを処理しています ...
```

[Running Visual Studio Code on Linux](https://code.visualstudio.com/docs/setup/linux) の手順通り、以下3行の実行でも問題はないですが、apt-transport-https は apt 1.5 以上ではインストール不要です。
sudo apt-get install apt-transport-https
sudo apt update
sudo apt install code
ubuntuで「デスクトップ」を「desktop」にしたらデスクトップにフォルダがいっぱい出てきた....

バーチャルボックスにてubuntuを起動させましてさあやるぞ！と思った矢先の出来事です。
同じようなことが起きてる人がいたので解決にそこまで時間がかかりませんでした。

###参考にした記事
[Ubuntuでデスクトップにhomeのファイルが表示されてしまうときの対処法。](https://qiita.com/scapegoat_11_/items/3ff95addfabef8f9d10d)

##環境
ubuntu18.04

##やったこと

デフォルトで「デスクトップ」という日本語のフォルダ名だったので、この方法は恐らくいいやり方ではないかもしれないが

  
```bash
 $mv デスクトップ　desktop
```
でフォルダ名を変更し、再起動したところ


![スクリーンショット (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482991/6a460e35-fb6f-795f-d7eb-1547ca4c5e9e.png)

上の画像のような状況になり、ホームディレクトリ直下のディレクトリたちが出てきている状況でした

###改善方法

参考にした記事通り、

```bash
$cd .config
~/.config$vim user-dirs.dirs
```


で``user-dirs.dirs``ファイルをvimエディタで開き、

```bash
XDG_DESKTOP_DIR="&HOME/desktop"
```

に変更し、再起動したら元に戻りました。



このファイルの詳細がわかる方が居たらぜひ教えてほしいです。
protocol内のオプショナルなメソッドについて

#はじめに
話的には[前回](https://qiita.com/zwtin/items/bfa723196d33bd3ec42f)の続きですが、この記事だけでも理解はできるように書いています。Swiftのプロトコルについて、もう少し掘り下げて書いていきます。

#Swiftのプロトコル
以下に、プロトコルの実装を書きます。

```swift
protocol Animal {
    func cry()
}
```
これをクラスに準拠させることで、Animalプロトコルを持つクラスはcry()メソッドが実装されていることが約束されます。

```swift
class Dog: Animal {
    func cry() {
        print("wan!")
    }
}
```

#オプショナルなメソッド
ここで、ある人がこう考えたとします。
「Animalプロトコルの中に、walk()メソッドも実装したいな。
　あ、でも魚とかは歩かないか。なら、実装を必須にはしない形で宣言できないかな。。」

##Objective-Cのプロトコルではできる
プロトコルの概念はSwiftの前身であるObjective-Cの頃からありました。そしてObjective-Cのプロトコルでは実装が必須ではないメソッドも簡単に宣言することができます。以下に、Objective-Cのプロトコルの実装を書きます。

```objective_c
@protocol Animal
@required // 実装必須なメソッド （@requiredは省略可能）
- (void) cry;
@optional // 実装が必須ではない、実装しなくてもいいメソッド
- (void) walk;
@end
```
このように、<scan>@<scan>optionalをつけるだけで宣言ができました。
##Swiftのプロトコルではできない
しかし、同様の考え方でswiftでも実装しようとするとうまくいきません。

```swift
protocol Animal {
    func cry()
    optional func walk()
} //コンパイルエラー
```

上のコードの場合はコンパイルするとエラーになります。それをコンパイラの言うように訂正していくと、下のコードのようになるかと思います。

```swift
@objc protocol Animal {
    func cry()
    @objc optional func walk()
}
```

なんだかよくわからない、<sqan>@<scan>objcというものが出てきました。これはプロトコルをObjective-Cで宣言されたものとして扱ってください、とコンパイラに伝えるために使われます。つまり、Swiftのみのコードでオプショナルなメソッドは存在せず、宣言することができません。

##<scan>@<scan>objcをつけることの弊害
<scan>@<scan>objcをつけたとしてもオプショナルなメソッドを実装できたのであればいい、と考える人もいますが、極力避けたほうがいいと私は考えます。<scan>@<scan>objcをつけることで、swiftのプロトコルでできていた以下のようなことができなくなります。

- プロトコルを構造体や列挙型に準拠させられなくなる。
- プロトコル内でジェネリクスが使えなくなる。

これらの弊害は、Swiftの思想に反するもので後々に大きな弊害となる可能性があります。SwiftUIでは構造体で様々なViewを宣言するので、今からこういう使い方はしないように習慣づけておいて方がよいでしょう。

#オプショナルなメソッドを、Delegateで利用
<scan>@<scan>objcをつければオプショナルなメソッドを一応定義することができることがわかりました。では、このAnimalプロトコルを準拠したクラスをdelegateで利用するとどうなるのでしょうか。以下に、コードで示します。

```swift
@objc protocol Animal {
    @objc optional func cry() -> String
}

class Dog: Animal {
    func cry() -> String {
        return "wan!"
    }
}

let delegate: Animal = Dog()
print(delegate.cry?()) // 出力結果：Optional("wan!")
```
このようにメソッドの返り値はString型でオプショナルではありませんが、メソッド自体がオプショナルであるため返り値もオプショナルになります。クラス内のメソッドだけを見ているとオプショナルということがわかりませんし、オプショナルを外す処理が後に必要になりますし、あまりきれいな書き方ではありませんね。このことからもなるべくであれば使いたくない書き方であることがわかるかと思います。

#Swiftの思想
なぜこのような仕様になっているかと言うと、Swiftの言語思想的にプロトコルで実装が任意のメソッドは存在しないと考えられているからです。上記の例ではwalkを実装する時点で、本当にAnimalプロトコルという名前で正しかったのでしょうか。そしてこのプロトコルはFishクラスにも準拠させる必要があったのでしょうか。というような点を考える必要があったと思います。（Fishクラスには専用のFishプロトコルを用意する、FishプロトコルとAnimalプロトコルの内容がかぶるところが多いようであれば、その部分を抜き出して親プロトコルを作る、など）

#まとめ
Objective-CからiOS開発をしている人からすると、一度はプロトコル内にオプショナルなメソッドを宣言しようとして詰まった部分だと思います。しかし、Xcodeが修正方法を提案してくれるので詳しくは調べずに<scan>@<scan>objcをつけてやり過ごした人もいるのではないでしょうか。~~かくいう私もその一人です。既存のプロトコルを準拠させたいけど新しくメソッドを実装するのはめんどくさい、という理由でメソッドをオプショナルにしそうになったこともあります。~~そういう人たちが、安易に<scan>@<scan>objcでやり過ごさずに済み、後に負債を残さない助けに成れれば幸いです。
WebAssemblyでお絵描きチャット"8bitpaint chat"を作った

![IMG_0066.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497826/9d091063-7b08-ca10-cfff-5509a96edf0c.png)


# 公開先
https://minordaimyo.net/pencilchat/
(2022/09/16 現在「えんぴつチャット」に名称変更の上、機能も強化されています)

# 8bitpaint chatの主な特徴・使い方
- 高解像度のキャンバス(A4 600dpi相当)で軽快な描き味
- 筆圧と傾き検知に対応
- 参加人数は8人まで(ROMは現状16人まで)
- 使える色は黒1色のみ
- 任意の参加者を非表示にできる機能
- 2本指のタッチ操作でキャンバスのスクロール・拡縮
- 2本指タップでUndo、3本指タップでRedo
- キャンバスのダウンロード機能

# 動作環境
Windows上のChromeとペンタブレット・液晶タブレット
iPad上のSafariとApple-pencil
Android上のChrome
等々

#ぎじゅつてきなこと
クライアントサイドはjs+WebAssembly(主にc言語)
サーバーサイドはnode.js+WebAssembly(クライアントと共通のコード)
で作成。

キャンバスサイズは、7016x4961pixel(A4 600dpiと同じ)。
クライアント側の消費メモリは250MBくらい、
サーバー側の消費メモリは一部屋当たり300MBくらい。
サーバー側にもキャンバスを保持しているため、メモリ消費が大きくなっています。

ユーザーインターフェース周りを中心にjsを使用。
お絵描き機能部分はほぼc言語で記述(WebAssembly)。

#苦労したこと
c言語は割と得意だけどWebプログラミングは全くの素人。
そのためjsでの記述部分はかなりの糞コードになってしまった…

#その他
初めてQiitaで発信しました。
必要なことは後から書き足す予定です。
VSCodeVimでインサートモードから抜ける時に日本語入力をオフにする

# 2020-11-07追記
[Win版の VS Code+VSCodeVim でノーマルモードに戻った時にIMEを半角英数入力にする](https://qiita.com/iuchi/items/9ddcfb48063fc5ab626c)
同じことをやってくれるシングルバイナリツールを作ってくれている人が居たのでこちらを採用することに。
今回の用途ではIME切り替えができるツールなら何でも良いので、高機能なAutohotKeyよりも単一機能のツールの方が起動が速いはず。
入力時のラグはストレスになるため、より軽い上記ツールの方がおすすめ。

# 背景
- VSCodeVimで日本語入力するとき、Escでインサートモードから抜けたときには日本語入力がオフになっていてほしい
- [公式Git](https://github.com/VSCodeVim/Vim)ではim-selectを使った方法が紹介されているが、これはIMEの切り替えであって日本語入力オフではない
- 上記をなんとかするためあれこれやった

# 環境
OS: Windows10 Pro バージョン 1903
IME: Google IME

# 前提
IME設定とAutohotkeyが必要

## IME設定で無変換をIMEオフに割り当てる
無変換を入力した場合にIMEがオフになる設定をする。

GoogleIMEを利用している場合は
「Google日本語入力 無変換 IMEオフ」とかで検索すれば設定方法がヒットするはず。
MS-IMEでも設定可能。

## Autohotkeyで無変換を入力するだけのスクリプトを書く

最初にAutohotkeyというツールを[公式サイト](https://www.autohotkey.com)からダウンロードしてインストールする。

Autohotkeyは元々任意のキーマップを設定したりするためのツールだが、
スクリプトを単体で実行すると、単にキーを入力するだけの処理を実行できる。

これを利用して、無変換キーを入力するだけのスクリプトを作っておく。
名前は ImDisable.ahk とする。スクリプトの場所はどこでも良い。

```ahk:ImDisable.ahk
Send,{vk1D}
```

# VSCodeVim側の設定
- Ctrl + , で出てくる設定画面から、更に右上のボタンをクリックすることで設定ファイルであるsettings.jsonを開く。バージョンによってボタンのUIが変わっていたりするのでちょっと分かりにくい。
- settings.json に以下の記述を追加する
- Autohotkey.exe と IMDisable.ahk のパスは適宜自分が配置した場所を記述する
- defaultIMの設定内容は使わないので何でも良い。とりあえずjaにしてある。
- switchIMCmd にある {im} は引数としてAutohotkey.exeに渡されるが利用しない。ないとVScodeVim側でエラーが出るのでとりあえず入れてある

```json
{
    "vim.autoSwitchInputMethod.enable": true,
    "vim.autoSwitchInputMethod.defaultIM": "ja",
    "vim.autoSwitchInputMethod.obtainIMCmd": "C:\\path\\to\\AutoHotkey.exe C:\\path\\to\\ImDisable.ahk",
    "vim.autoSwitchInputMethod.switchIMCmd": "C:\\path\\to\\AutoHotkey.exe C:\\path\\to\\ImDisable.ahk {im}",
}
```

# おわり
ここまでの設定が完了すれば、インサートモードから抜けるときに日本語入力がオフになる。
Esc で抜けようが Ctrl+[ で抜けようがちゃんとオフになってくれるので地味に便利。
SourceTreeを使ってGithubにコードをあげていく

# 状況整理
Laravelで作成したファイルをターミナルでgit管理していると

Herokuにgit pushする必要があったり
Githubにgit pushする必要があったり
ターミナルで一元管理するのはリスクが出てきたため、

この際、GithubにあげるデータはSourceTreeでGit管理して
Herokuなどのクラウドサーバーに上げるときはターミナルコマンドを使用することにした。


##①Githubで新規リポジトリを作成する
<img width="1022" alt="スクリーンショット 2019-09-15 18.56.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223280/f46493fe-aa68-f9ae-557d-7ae8d0f08006.png">


##②該当ファイルからターミナルを開く(※エディタのターミナルでも〇)
<img width="697" alt="スクリーンショット 2019-09-15 18.59.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223280/253e6984-ca92-efcd-f338-db3964414a74.png">

##③ターミナルを開いたらコードを貼り付け
…or create a new repository on the command lineの部分をターミナルに貼り付けて実行
<img width="1153" alt="スクリーンショット 2019-09-15 18.58.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223280/9710ed05-87be-460e-ad99-2a15dffebbeb.png">

```terminal
echo "# -" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/〇〇/〇〇.git
git push -u origin master
```


これでgit commitする準備ができました。



次にSourceTreeを開きます。

##④既存のローカルリポジトリを追加
<img width="480" alt="スクリーンショット 2019-09-15 19.06.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223280/08ec2af7-21f6-8020-b2cf-b115a55b40e5.png">

該当ファイルを選択したら管理画面が開きます。
<img width="1047" alt="スクリーンショット 2019-09-15 19.07.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223280/1634af3e-fb50-9e10-fb71-c9f8da37b130.png">

##⑤右上の設定→リモートからパスが、https://〜から始まるgitかチェックする
<img width="1039" alt="スクリーンショット 2019-09-15 19.08.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223280/99dddc3e-ec1e-480d-1a68-bfbc92f32193.png">

git@github〜から始まるgitだとエラーが出るので注意です。

これでSourceTreeを使ってgit pushできるようになりました。
【PowerApps Tip's】テーブルのレコードを文字列化する

先日は、文字列を指定の文字で分割（Split）しました。
今日は、配列やテーブルで保持されたデータを1つの文字列に変換してみましょう。

先日の記事 → [【PowerApps Tip's】改行で文字列分割](https://qiita.com/yamad365/items/4f0bec10ae57368173d3)

# はじめに
文字列を、ある特定の文字で分割する必要に迫られるのと同様に、配列やテーブルに格納されている情報を、全て結合して１つの文字列として扱いたい場合があります。

例えば、下記のような配列(テーブル)があったとします。

| Result |
|--------|
| 2019   |
| 09     |
| 15     |

これを”/”でつなぎ合わせたい。

期待する結果： 2019/09/15

さて、どうすればいいでしょう？

# その他 開発言語経験があると陥る罠
PowerApps 以外の開発言語によるプログラミング経験があると、
「Loop で回して末尾に区切り文字入れればいいじゃん」
とか考えちゃうと思うんですよね。
(中級者以上だと「文字列操作系の関数かメソッドあるじゃろ？」って思うでしょうがｗ)

で、ForAll 関数をみるかな？とか行動を予想するんですけども。

[PowerApps の ForAll 関数](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-forall)


ForAll 関数は処理中で 変数をアレコレする UpdateContext することができません。つまり、Loop内で変数を操作するのは得意ではないパターンがあるんです。がんばれば出来ないコトもない・・・かな？たぶん。
なんにせよ、ForAll だと今回のニーズに対応するのはメンドクサイんですよね。もっと簡単な方法があるんです。

# テーブルの全レコードを文字列結合
PowerApps で、テーブルの全レコードを単一の文字列にしたい場合は「Concat」関数を利用します。

[PowerApps の Concat および Concatenate 関数](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-concatenate)

ちなみに、単純な文字列連携の場合は、上記リンク先にある Concatenate 関数か、"&"演算子を利用してください。

## 動作イメージ
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/PowerApps?src=hash&amp;ref_src=twsrc%5Etfw">#PowerApps</a> <a href="https://twitter.com/hashtag/%E5%88%9D%E5%BF%83%E8%80%85?src=hash&amp;ref_src=twsrc%5Etfw">#初心者</a> <a href="https://twitter.com/hashtag/%E5%85%A5%E9%96%80?src=hash&amp;ref_src=twsrc%5Etfw">#入門</a> 配列やテーブルを文字列化。区切り文字も付与も可。 <a href="https://t.co/RdMB1bvtwt">pic.twitter.com/RdMB1bvtwt</a></p>&mdash; やま (@yamad365) <a href="https://twitter.com/yamad365/status/1173164479279841281?ref_src=twsrc%5Etfw">September 15, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

左側：ListBox コントロール
右側 上：TextInput コントロール。区切り文字を指定
右側 下：TextInput コントロール。結合結果を表示（※）

※の箇所に記載してある関数は下記。

```TextInput2.Default
Concat(ListBox.SelectedItems,Result,TextInput.Text)
```

指定した区切り文字を含んだ1つの文字列に変換されてますね。

動作イメージを確認すると把握できると思うのですが、区切り文字がブランクになっている場合、選択された値が単純に結合された状態となります。

Concat 関数は「Concat（テーブル、式、区切り文字）」で、”区切り文字”はオプションなのです。つまり、省略することも可能。上記の動作イメージではTextInput コントロールから区切り文字を取得しているため関数で指定していますが、単純に文字列結合だけしたい場合は省略しても問題ありません。

うん、便利ですね。

# まとめ
- テーブルのレコードを文字列化する際は「Concat」関数
    - 区切り文字を指定すると、ソレを含んだ状態で文字列化される
    - 区切り文字を省略すると、単純にレコードが文字列として結合される
- 単純な文字列連結は「Concatenate」関数、または "&"演算子

昨日は、文字列をテーブルへ分割しました。
今日は、テーブルから文字列へ結合しました。
これで、分割と結合が扱えるようになるハズなので、色々と捗りますね？

それでは、皆さま。素晴らしい Power Platform Life を！
Ruby on Rails 『NO FILEのmigrationを削除する方法』

## 状態

$ rails db:migrate 実行後のマイグレーションファイルを削除してしまい、NO FILEのファイルが出来上がった。

## 解決方法

migrationの状態を確認。

```
$ rails db:migrate:status
```

下記のように、migrationの一覧が表示されます。
upが**$ rails db:migrate**実行後。
downが**$ rails db:migrate**実行前。

```
 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20190915023701  Create posts
   up     20190915065320  ********** NO FILE **********
  down    20190915080932  Devise create users
```

 Migration IDをコピペし、ダミーファイルを作成。（後で削除するので、hogeのところは適当でいいです。）

```
$ touch db/migrate/20190915065320_hoge.rb
```

下記のように記述したダミーファイルを作っておく。

```ruby:20190915065320＿hoge.rb
class Hoge < ActiveRecord::Migration[6.0]
  def change
  end
end
```

**$ rails db:migrate:status** を実行してMigration Nameが付与されていることを確認。

```
Status   Migration ID    Migration Name
--------------------------------------------------
   up     20190915023701  Create posts
   up     20190915065320  Hog
  down    20190915080932  Devise create users
```

VERSION にMigration ID を代入して下コマンドを実行。

```
$ rails db:migrate:down VERSION=20190915065320
```

これでdown（rails db:migrate実行前）になります。

```
Status   Migration ID    Migration Name
--------------------------------------------------
   up     20190915023701  Create posts
  down    20190915065320  Hoge
  down    20190915080932  Devise create users
```

↓ 必要なくなったので削除。

```
$ rm db/migrate/db/migrate/20190915065320_hoge.rb
```

あとは先程と同じく、**$ rails db:migrate:status** を実行すると消えてるのが確認できる。

```
 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20190915023701  Create posts
  down    20190915080932  Devise create users
```

　
以上がNO FILEのmigrationを削除する方法でした。

そもそも、つまらないミスをしなければこのような作業はしなくていいのですが...笑

##参考資料
[railsのrakeで作成したmigrationファイルとstatus履歴を削除する](https://joppot.info/2014/10/14/2073)