OmniAICreator/Qiita-1.07M huggingface dataset:
なぜ Xamarin を使うのか？(2019年版)

この投稿は、

* [Why use Xamarin in 2019?! | Daniel Hindrikes](https://danielhindrikes.se/index.php/2019/06/05/why-use-xamarin-in-2019/) 

を [元投稿者の許可を得て](https://twitter.com/hindrikes/status/1138041908721278976) 日本語訳したものです(訳がヘンだったら教えてplz)。

----
先週、ストックホルムでモバイルデバイスにフォーカスした .NET のコミュニティイベントを開催しました。ひとつの大きな議論は、モバイルアプリ開発を始めるのにどんなツールやフレームワークを使いますか？でした。このブログポストはその議論にインスパイアされたものです。

### Xamarin とはなにか？

まず始めに、我々は Xamarin と Xamarin.Forms は同じものではない事を覚えておく必要があります、しかしこれらは同じものであるとよく説明されています。私は Xamarin.Forms を、複数のプラットフォーム向けの UI を共通のコードで構築するためのフレームワークと定義します。Xamarin(Xamarin.iOS, Xamarin.Mac, Xamarin.Android を含む)は、C#(や F#) で、iOS、Mac、Android 向けのネイティブアプリを開発できるプラットフォームです。

### なぜ初めてのモバイルアプリ開発に、Xamarin を使用するべきなのですか？

もしあなたが .NET 開発者なのであれば、それはかなり簡単な選択です。あなたは既に C# や XAML を知っていて、ただ新しいプラットフォームについて学習する必要があるだけです。もしあなたが Apple や Google のツールを使って iOS と Android 向けのアプリを開発したいのであれば、まず始めに 2つの新しいプログラミング言語(iOS のために Objective-C または Swift、Android のために Java または Kotlin) を学習する必要があります。 言語について学習したらそれぞれのプラットフォームと API についても学ばなくてはなりません。しかしそれだけではありません、2つの新しい IDE を習得する必要もあります。Xamarin を使用すると、Visual Studio だけで iOS と Android の両方のアプリケーションを開発することができます。

### 私は .NET開発者ではありませんが、なぜ Xamarin を使うのですか？

あなたが .NET開発者 でなければ、 Xamarin を学習する必要はないと思うかも知れません。
アプリの開発を始めた時はひとつのプラットフォームをターゲットにしていても、後からもっと多くのプラットフォームに対応したいと思うでしょう、特にあなたのアプリが人気になった場合は。Xamarin を使用して UI とビジネスロジックを分離していれば、他のプラットフォームに対応させることが早くできます。また、バックエンドに .NET を使っているならば、バックエンドとのコード共有も可能です。

### しかし Flutter と React Native はどうですか？

Flutter も React Native もすばらしい点が多く、素早くアプリを開発できます。しかし Flutter は Xamarin.Forms のようにネイティブのUIコンポーネントが使われるのではなく、(Skia により)独自に描画された UI になります。個人的には、ネイティブ UI が好みです。

React Native は JavaScript が使えるため、Web開発者にとって最適です。しかし多くの人が考えるように、Reactウェブサイトを利用してアプリを作成することはできません。 "HTML" は同じではなく、React Native にはその UI を構築するための独自のコンポーネントがあります。

Flutter も React Native も、ネイティブAPIへの100% API アクセスはできません、これは、ネイティブの機能を使いたい場合それは Flutter や React Native ではサポートされておらず、独自に ブリッジ／プラグイン を作成する必要があることを意味します。また、それをするために Objective-C/Swift と Java/Kotlin を使う必要があります。Xamarin では API に 100% アクセスできるので、プラットフォームが開発者に提供するすべての機能を C# で使用できます。

また、Flutter と React Native はまだ新しく、Xamarin と Xamarin.Forms は何年も前からありとても成熟しています。

### ネイティブAPIを使用する場合、Xamarin.Forms と Xamarin のどちらを使用するべきですか？

私のオススメは、いつでも Xamarin.Forms から始めることです。Xamarin.Forms で実現できない機能があっても、ネイティブ API を使ってそれを作成することが簡単な設計になっています。

### まとめ

短期的には、あなたが使いやすい言語やツールでアプリを開発すると思いますが、長期的に見ると私は、あなたが .NET開発者でなくとも Xamarin を選択する価値はある、と言うでしょう。あなたが既に .NET開発者であれば、すべてのシチュエーションに Xamarin は対応できるでしょう。

最後に、あなたは使用しているプラットフォームに関係なく台無しにすることができます！全ての言語でダメなコードを書くことができます！そして成功のために最も重要なことはあなたが使用している言語やツールではなく、あなたのユーザー/顧客に素晴らしい価値を提供するために彼らから学ぶ／知ることです。
【nodenv】必要なバージョンが存在しなかったときの備忘録

## こんなときに
* 確かにリリースされているバージョンなのに、nodenvにはないと言われる
* `nodenv install --list`を実行するも、 リストに欲しいバージョンがない


## 対策
nodenvで無効なバージョンを指定してインストールしようとすると、

> See all available versions with `nodenv install --list'
> If the version you need is missing, try upgrading node-build:

上のように返ってくる。言う通りにアップグレードしたら解決した。


### 1. node-bulidディレクトリに移動
```
cd ~/.anyenv/envs/nodenv/plugins/node-build
```

上記はanyenvを前提にnodenvを入れていた場合。
nodenvを単体で入れている場合は、そのフォルダを探して、その中の `node-build` フォルダまで移動する

### 2. gitからアップグレード
```
git pull 
```


### 3. 作業フォルダに戻ってnodenv install
```
cd ~/[your workspace]
nodenv install [versions]
```
Java開発の基本~プログラムの書き方（変数と型）~

# Java開発の基本~プログラムの書き方（変数と型）~
数字を扱うプログラミングを通してjavaプログラムの基本の書き方を覚えます。
プログラミンを覚えるのは概念の理解と最低限のルールを覚えることが大切です。
ルールについては外国語の単語を学習する感覚で覚えてください。概念については数学的というか哲学的な話にもなるので、わからなければ一旦最善と言われている物を覚えてしまいましょう。

----

## はじめに
まず、この章で利用する雛形を作成しましょう。
[HelloWorld]()プロジェクトを作成した手順を参照してパッケージ名`lessons`クラス名`L1`という名前のクラスを、HelloWorldで作成したプロジェクトの中に作りましょう。
ファイルには下記のようなプログラムを記載してください。
実行ボタンをクリックすると1から10まで足されるプログラムが実行されます。

----
これからこのプログラム通してjavaの書き方を説明していきます。

```java:L1.java
package lessons;
public class L1 {
	public static void main(String[] args) {
		int startNum=1;
		int endNum=10;
		int resultNum=0;
		int count=0;
		while(startNum<=endNum) {
			resultNum=startNum+resultNum;
			startNum=++startNum;
			++count;
		}
		startNum=startNum-count;

		System.out.println(startNum+"から"+endNum+"まで足した結果は"+resultNum);
	}
}
```

---

## 変数
プログラムとは繰り返しするコンピュータにやらせるものです。例えば1から100まで足し算するプログラムがあったとします。正直これしかできなければ何にも使い物になりません。でももし同じプログラムで3から103まで足し算できる、15から30までを足し算できるみたいに、色々汎用性があったらちょっと便利になりませんか？
汎用性を持たせるためには1から100までの足し算のプログラムを`1+2+3+...`みたいに書いちゃうとダメです。
`a+(a+1)+((a+1)+1)+...`みたいに書いて行けばaを3に変えるだけで3から103までの足し算ができるようになります。  
このように<b>プログラムを使い回しするためにカッチと決め切らない値を変数</b>と言います。
例のプログラムでは、最初の数を`startNum`、たす回数を`endNum`、結果を`resultNum`として変数定義しています。

----

## Javaの型と変数の定義
数式`a+(a+1)+((a+1)+1)+...`の例ですが、人間であればaに入る値は数字だろうとわかります。でもコンピュータにはそんなことわかりません。
なのであらかじめaに入る値が数字であることを教えてあげる必要があります。その教えてあげるときに使う呪文が型です。

変数は`型 変数名`という形で定義します。
上の数式の例では`int a`という形で変数aを定義します。
よく使う型には下記のようなものがあります。

| 型 | 入れるもの |
|:-:|:-:|
| int  |  数字 |
| long  |  大きい数字 |
| double |  小数を含む数字 |
| boolean  |  真偽値（ture false） |
| String  | 文字  |

変数に値をセットするときには`=`を使います。

```java
//数字を扱う変数startNumに値をセット
int startNum=1;
//文字を扱う変数messageに値をセット
String message=startNum+"から"+endNum+"まで足した結果は"+resultNum;

```

javaプログラムでは文字列は""(ダブルクオーテション)で囲みます。  

----

## オペレータ
特に覚える必要はありませんが+、-、/、*のような数学で使う記号をオペレータとよびます。  
数字以外でも簡単に文字列をつなげる場合に`+`を使ったりもします。

```java
//変数と文字列を繋げて一つの文字列に加工しています。
String message=startNum+"から"+endNum+"まで足した結果は"+resultNum;
```

`++count`この書き方も数学でみたことないと思いますが、`count=count+1`と同じ意味だと思ってください。

----


## 補足
どっから説明していいかわからず触れて来なかったものについて補足します。

* `System.out.println()`というのは`()`の内容を出力する呪文です。
* `//`(スラッシュ2つ)はコメントを表します。この後ろの記述はプログラムに実行されません。  
`/*コメント*/`で改行を含むコメントを記述することも可能です。

----
## ハンズオン

1.サンプルプログラムを流用して10から100まで加算するものに書き換えましょう。
2.出力されるメッセージを`〇〇が答えです`に変えましょう。
Rubyで合体ナンプレを解いてみた-その2(基本方針) 

## データファイル
数独は９ｘ９のマスがあるので、素直に９文字ｘ９行の文字列で表します。

```sudoku9x9.dat
**85*26**
**5******
2**9***73
7*****9*2
****4****
6*1*****5
59***1**8
******7**
**24*81**
```

"*"は数字以外の半角文字であれば、ＯＫとします。

##クラス設計
![sudoku_class.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428079/099561d4-1f90-14be-c664-8c1b398fe5c3.png)

#### Cellクラス
数独にはセルが９ｘ９＝８１個あります。
それをCellクラスとします。

#### Groupクラス
数独では、列・行・小さい正方形（３ｘ３）に１～９が１つずつ入ります。
列は９個、行は９個、小さい正方形は９個。
それぞれにGroupクラスを割り当てます。

#### Boardクラス
Cellクラス、Groupクラスを保持して、全体を統括するクラスをBoardクラスとします。

こちらは作成中のサイトです。
[数独解答サイト] (https://www.sentohsharyoga.com/)
OculusQuestでUniVRMを使うと「UnityEditor.BuildPlayerWindow+BuildMethodException: 2 errors」エラーが出る問題の対策

環境：Unity2019.1.5f1 / UniVRM-0.53.0_6b07

# tl;dr
"\Assets\VRM\UniVRM\Editor\Format\vrmAssetPostprocessor.cs" を以下のように修正しろ。

```C#
#if !VRM_STOP_ASSETPOSTPROCESSOR
　↓
#if UNITY_EDITOR
```

# 現象
ビルドがシェーダーだとかなんだとかのあたりまで進んだ後、以下エラーが出て止まる。
アセットからUniVRMを取り除くとエラーは発生しなくなる。

```
Build completed with a result of 'Failed'
UnityEditor.EditorApplication:Internal_CallGlobalEventHandler()

UnityEditor.BuildPlayerWindow+BuildMethodException: 2 errors
  at UnityEditor.BuildPlayerWindow+DefaultBuildMethods.BuildPlayer (UnityEditor.BuildPlayerOptions options) [0x00234] in C:\buildslave\unity\build\Editor\Mono\BuildPlayerWindowBuildMethods.cs:190 
  at UnityEditor.BuildPlayerWindow.CallBuildMethods (System.Boolean askForBuildLocation, UnityEditor.BuildOptions defaultBuildOptions) [0x0007f] in C:\buildslave\unity\build\Editor\Mono\BuildPlayerWindowBuildMethods.cs:96 
UnityEditor.EditorApplication:Internal_CallGlobalEventHandler()
```
ちなみにBuildAndRunは出来ないが、PC実行はできるし、Buildで正常動作するapkを作るのには成功する。

# 原因

UniVRMがアップデートされて、OculusQuestにBuildAndRunするときビルド定数「VRM_STOP_ASSETPOSTPROCESSOR」定義を必須になった？
このビルド定数の設定自体は昔から存在していた。(https://vrm.dev/univrm/univrm_install/)
2019年6月初旬時点ではビルド定数の定義を行っていなくてもBuildAndRunできていたが、2019年6月6日には動かなくなった。
File→BuildSetting→PlayerSettings→OtherSettings→Scripting Define Symbolsに、VRM_STOP_ASSETPOSTPROCESSORを追加……で問題ないはずだが、なんか知らんがプロジェクトを色々さわってると、何かの拍子に上記設定を定義していてもビルドに失敗することがある。
そもそもこれはアセットをインポートするときにスクリプトを実行する関係のものみたいなので、ビルド＆ランに影響するはずはない気がするが実際にはこれが悪いようだ。

ﾜｹｶﾞﾜｶﾗﾅｲﾖ…。

# 対策

VRM_STOP_ASSETPOSTPROCESSORによって生成が制限されるクラスを定義している以下のファイルを修正する。
(削除するとドラッグ＆ドロップでVRMを取り込めなくなるので都合が悪い)

"\Assets\VRM\UniVRM\Editor\Format\vrmAssetPostprocessor.cs"

```C#
#if !VRM_STOP_ASSETPOSTPROCESSOR
　↓
#if UNITY_EDITOR
```
AWS CLI 自分用まとめ

jqコマンドのインストール

```
curl -o /usr/bin/jq -L https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64
chmod a+x /usr/bin/jq
```

```
echo `aws ec2 describe-instances --filters "Name=tag-value,Values=Server" | jq .Reservations[].Instances[].NetworkInterfaces[].PrivateIpAddresses[].PrivateIpAddress -r`
```
ServerというValueを持ったInstanceのPrivateipを抽出する
NixOSでWi-Fi接続したい

# 一時的に接続したい(インストール時など)

次のコマンドを実行します：

```bash
$ wpa_supplicant -i INTERFACE_NAME -c <(wpa_passphrase 'ESSID' 'PASSWORD')
```

INTERFACE_NAMEを調べるには次のコマンドを実行します。wlp2s0やwlp4s0とかだと思います：

```bash
$ ifconfig -a
```

ESSIDを調べるには次のコマンドを実行します：

```bash
$ iwlist INTERFACE_NAME scan | grep ESSID
```

# 次回から自動接続したい

次のコマンドを実行します：

```bash
$ wpa_passphrase "ESSID" "PASSWORD" >> /etc/wpa_supplicant.conf
```

# 接続できない…

IPアドレスは取得できているという前提が必要ですが、次の一文を/etc/nixos/configuration.nixに書きます：

```nix
networking.dnsExtensionMechanism = false;
```

これにより、resolve.confのedns0オプションが無効になります。

# 参考
- https://github.com/Tokyo-NixOS/Tokyo-NixOS-Meetup-Wiki/wiki/install
- https://nixos.org/nixos/options.html#edns0
UIColorをCGColorで渡す時にalphaをいじる

# まくら

タイトルのまんまです。

`CALayer`を扱う時などに`UIColor`と`CGColor`の変換がよく発生しますが、そんな時の小ネタです。

`borderColor`に透過した色を設定したい時とかに、一旦`UIColor`を変数に確保して`alpha`をいじっていたのですが、ワンライナーで書けたので備忘録。

#ほんだい

``` swift
self.layer.borderColor = UIColor.red.cgColor.copy(alpha: 0.8)
```

以上でござい。
laravel created_at 秒/分/時間前へ変換

```php

public function getDiffTimeAttribute()
    {
        $df1 = $this->created_at->diffInSeconds(Carbon::now());
        $df2 = $this->created_at->diffInMinutes(Carbon::now());
        $df3 = $this->created_at->diffInHours(Carbon::now());

        if($df3 >= 1){
            return $df3 . '時間前';
        }
        if($df2 >= 1){
            return $df2 . '分前';;
        }
        if($df1 >= 1){
            return $df1  . '秒前';
        }
    }
```
文字列操作で単純作業を減らす

# 文字列操作で単純作業を減らす
エンジニアのアウトプットの大半はソースコード、要するに文字列です。
そのため、文字列を効率よく扱うことが出来るようになると、
単純作業の大半を削減してクリティカルな部分に集中できるようになります。

個人的によく使うものを備忘も兼ねて挙げておきます。
基本的に対象となるデータが少ないものから。

## マルチカーソル
カーソルを複数個所に設置し、同時にキーボード操作できるようにする機能。
最近のエディタ(VsCodeとかSublimeText)にはデフォルトで積んでありますし、
VimやEmacsと言ったクラシックなエディタもちょっとプラグインを入れれば対応できます。

用途としては、複数行の先頭に特定の文字列を入れたい場合や、
複数個所に同じパラメータを入れたい場合など。
ただし、基本的にカーソルを当てる箇所を手動で指定する都合上、
多くても10か所くらいが限度です。

ただ、同じ文言を数か所に打ち込むと言った作業は意外と普段の開発で多い上、
操作も簡単ですぐに使い方を身につけられるので、
お気に入りのエディタでの使い方は覚えておいて損はないと思います。


## キーボードマクロ
一連のキーボード操作を記録して、ショートカットキーで呼び出したり、
任意の回数実行させたりする機能。
VimやEmacsと言ったキーボードだけですべて完結させる系のエディタでは
およそすべての操作をPCの性能の許す限り連続実行できるので、特に強力です。
EmacsやVim派は是非覚えておくべきです。
(とはいっても今日日この辺りのエディタを使っているような方には釈迦に説法でしょうけれども)
逆にVsCode辺りの新しいエディタには標準では搭載されていません。
そもそもキーボードだけですべて済ませる設計になっていないからでしょうか。

## 正規表現置換
テキストエディタのみならず、大抵のIDEやExcelなどのスプレッドシートにも搭載されています。
正規表現の書き方を習得しなければいけないため少々敷居は高いですが、
うまく使えば予め準備したパラメータのリストから一気にソースコードを作成したり、
あるいは既存のログを整形して必要な情報だけ抽出することなども可能です。
各エディタごとに微妙に仕様が異なりますが、
「各種メタ文字の使い方」と「マッチングした文字列の置換先の文字列への当て込み方」の二つを覚えるだけでも大分捗ります。

## grep/sed/awkなどのUnixコマンド
unixコマンドにはsedやawkと言った強力な文字列操作コマンドがある上、
これらをパイプで組み合わせて利用することが可能です。
普段コードを書くのに利用することはそこまで多くありませんが
ログを漁って必要なものを取り出したりするときには便利ですし、
正規表現置換一発で行うには厳しい複雑な変換を行う場合にはこちらの方が楽です。

Windows派の型は標準で使えないんじゃないかと思われるかも知れませんが、そこはご心配なく。
これらのコマンドはgitbashを入れるとWindows上で実装されたものがオマケでついてきます。
git系のコマンドを打つ時に色々と試してみるのも面白いでしょう。
git statusで出た大量のファイルから必要なものだけをつり出したりするのにも使えます。


## まとめ
* エンジニアとしての引き出しを増やしてスマートに大量の文字列処理をこなしましょう。
AtCoder の緑ランクはpaiza でSランクが取れるのか??

## はじめに
少し前に chokudaiさんが下記のブログでこのようなことを投稿していました!!
[AtCoder（競技プログラミング）の色・ランクと実力評価、問題例](http://chokudai.hatenablog.com/entry/2019/02/11/155904)

>(AtCoderの緑色は) 他社アルゴリズム力判定サービスだと、上位１％の最高ランクが付く実力です。

これに疑問を思った私は AtCoder緑色の私が実際に他社アルゴリズム判定サービスである paiza の最高ランク, Sランクを取得できるのか試してみました

## 結果
約1時間で paizaのSランクを取得することができました.
緑色でSランクが取れるのは本当でしたね!

<img width="191" alt=" 2019-06-10 17.22.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353646/a5e25690-e3b8-fab6-77fb-37d83db7ba72.png">
<img width="939" alt=" 2019-06-10 17.22.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353646/933d0624-30d7-8d1c-abb8-aaaab63947c9.png">

あっけなくSランクが取れたので
paizaの問題の特徴について調べてみることにしました

#### paiza の問題の特徴

1. 実装が重い
  * アルゴリズムがわかっても実装に時間がかかる
2. 提出が一回しかできないので一発勝負
3. 言語別にTimeLimit, メモリ制限が決められている
  * C++: TimeLimit: 3s, メモリ制限: 512MB
  * Ruby: TimeLimit: 16s, メモリ制限: 512MB
4. 同じランクの問題でも難易度の違いが激しい
  * Aランク: 200~500点問題
  * Sランク: 300~600点問題

注目して欲しいのが3, 4です
##### 3について
AtCoderの場合，一律でTimeLimitが決められてるのに対し
paizaでは言語別に決められています


##### 4について
難易度の振れ幅が大きいんですよね...
Sランクの問題を1問でもACすれば, Sランクになることができます
そのため, 簡単なものを一問解くだけでいいんですよね...
多分, 全ての問題をACするには青色の実力が必要だと思います
それくらい振れ幅が大きいです

## まとめ
AtCoderの緑でpaizaのSランクになることができました
Sランクになるだけなら簡単みたいですね！
ただ, 問題の振れ幅が大きいので
緑では全ての問題を解くことは厳しいと思います

## 補足(色々教えてもらった)
私が解いた問題である一人すごろくはSランクの問題ではかなり簡単な問題みたいです
これミスしたらSランクになるの少し難しくなるみたいで....
Laravelの.envファイルをシェルスクリプトで読み込む

# はじめに
Laravelで使ってるDBに対して、BashでもDB接続して操作する必要があった。
設定を一括管理するためにもBashでLaravelの.envの設定を読み込むようにする。

DBはPostgreSQL11です。

# 内容
BashでPostgreSQLに接続 → データを取得 → 出力

```
#!/bin/bash

# .envから読み込み
DB_HOST=(`cat ../.env | grep DB_HOST | sed -e 's/DB_HOST=//'`)
DB_PORT=(`cat ../.env | grep DB_PORT | sed -e 's/DB_PORT=//'`)
DB_DATABASE=(`cat ../.env | grep DB_DATABASE | sed -e 's/DB_DATABASE=//'`)
DB_USERNAME=(`cat ../.env | grep DB_USERNAME | sed -e 's/DB_USERNAME=//'`)
DB_PASSWORD=(`cat ../.env | grep DB_PASSWORD | sed -e 's/DB_PASSWORD=//'`)

# PostgreSQLに接続
response=(`PGPASSWORD=${DB_PASSWORD_BO} /usr/pgsql-11/bin/psql -U ${DB_USERNAME_BO} -h ${DB_HOST_BO} -p ${DB_PORT_BO} ${DB_DATABASE_BO} -t  << EOF
SELECT * FROM tbl;
EOF
`)

# データがとれているか確認
for ((i = 0; i < ${#response[@]}; i++)) {
    echo ${response[$i]}
}

```
ちなみにですが、ヒアドキュメントを使ってPostgreSQLに接続する際の
パスワード設定の仕方を探すのに少し苦労しました。

# おわりに
上の例の"DB_HOST"や"DB_PORT"の部分を.envで欲しい変数名に変えれば任意のところの値が取れますよー
【VirtualBox】VBoxManageを使う

以下はWindows環境の話です。

VirutalBoxの操作をGUIではなくCLIから行うには「vBoxManage」が必要です。

このコマンドはVirutalBoxと一緒にインストールされますので、
インストールフォルダにパスを通してあげれば使えるようになります。

■環境：
　OS：Windows 10
　VirtualBoxのインストール先(初期設定)：

```
C:\Program Files\Oracle\VirtualBox
```

※PATHの通し方(備忘)
　「コントロールパネル」⇒「システム」⇒「システムの詳細設定」⇒「詳細設定」タブ
　　⇒「環境変数」⇒「Path」に追加
　(システム環境変数にするかユーザー単位にするかはお好み)

参考までに、「vBoxManage」コマンドの使い方は、
インストール時に格納される以下ドキュメントに記載されています(All English！)

```
C:\Program Files\Oracle\VirtualBox\doc\UserManual.pdf
```
denite で filename を先頭に持ってくるコンバーターを作った

# はじめに
この記事では denite.nvim で「候補のファイルパスを `filename - path` に変換する」コンバーターを書いたのでその紹介をします。

# なぜ作ったのか？
IntelliJ IDEA などのリスティングの表示が羨ましかったから。

また、ファイル名を指定して fuzzy 検索しようとした時に大きなプロジェクトだと途中のファイルパスで fuzzy マッチがヒットしちゃってあんまりうれしくないから。というのもあります。

# 作ったもの

https://github.com/hrsh7th/denite-converter-prioritize-basename

です。

# 使い方
使い方は簡単でインストールした上で denite.nvim の converters に指定するだけです。file_mru と file/rec に指定するのがおすすめです。

```VimL
call dein#add('hrsh7th/denite-converter-prioritize-basename')
call denite#custom#source('file_mru,file/rec', 'converters', ['converter/prioritize_basename'])
```

# どういう動きか？
例えば、あるプロジェクトを denite.nvim でリスティングした場合は下記のように変わります。

### converter なし
<img width="605" alt="スクリーンショット 2019-06-10 18.49.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4215/a5ba137d-8f36-dec2-cdc6-cb74ff6580da.png">

### converter あり
<img width="606" alt="スクリーンショット 2019-06-10 18.49.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4215/00b2c94a-5106-3b09-3b0d-6aa7a4a67414.png">

# おわりに
多分、使ってみると微妙な点があると思います。
自分としてもつくったばかりなのでまだエッジケース拾いきれてなさそうです。
なにか不便な点があれば issue/PR お待ちしています。

英語が得意じゃないのでもっとふさわしいプラグイン名があるのでは...？と思っていたり、いい名前があったら是非教えていただきたいです :pray:

_あと、これもしかしたら本体に入ってたほうがいいかも？とか思ったり、枯れてきたら PR を投げてみようかな。_
windowsコマンドプロントでSSH接続、「vi」を実行したときに文字が青色になる

## 環境
Windows10標準のsshを使用

## 症状
ユーザーを切り替えてviなどを使うと文字が青色になりかなり見づらくなる

## 原因
ターミナルエミュレートがパッチに対応していない
ただWindows10のとあるパッチ以降vt100に対応したらしいので、リモート側の環境変数TERMが適した機種(vt100)以外になっているのが原因

## 解決策
環境変数TERMを変更する

```bash
# 環境変数TERMの値を確認
echo $TERM
# 環境変数TERMをvt100に変更
TERM=vt100
export TERM
```

環境変数はログアウトすると消えてしまうので、bash_profileやbashrcにexportコマンドを記述しておくと都度変更する必要がなくなる（パッチはログイン時のユーザーの設定が保持されるっぽいのでログインするユーザーのTERMを変更すればおｋ）

```bash
# ~/.bash_profileに以下を記述
export TERM=vt100
```
Emacs上で「Ctrl-h」をBackSpaceにする

毎度必要な時に調べるのが面倒なので、備忘投稿です。

私はEmacs派なのですが、Linux系OSにおいて最初からインストールされていることはまずないので、
CentOSなどのOSをインストールするたび(もしくはVMを構築するたび)に

```
yum install emacs
```
と、Emacsをインストールしています。

そして、CentOSなどのコマンドラインと同じように
「Ctrl-h」をBackspaceとして使いたいので、以下コマンドを実行します。

```
# echo "(global-set-key \"\C-h\" \`delete-backward-char)" > ~/.emacs
```

要するにログイン直下のパス(~/)に「.emacs」が存在し、以下の記述があればOKです。

```emacs-lisp

(global-set-key "\C-h" `delete-backward-char)
```
YouTubeの配信情報をひたすら取得するAPIを整理した

YouTubeの配信情報をひたすら取得する方法です。いつもの備忘録と整理です。

#前提知識と条件
・Google認証をして、AccessTokenとRefreshTokenを取得出来る
・取得したTokenを使ってAPIを投げることが出来る
・チャンネルIDをリストやDBで持っている

これを見てやろうと思った方は、この前提を自身で用意してください。
チャンネルIDとは、YouTubeのチャンネルページを開いた時にURLでUCから始まるIDのことです。

例：https://www.youtube.com/channel/ ***UC-rEbtxBcgRCD53DzoLVGPA***

#YouTubeの配信情報を集めるには？

YouTubeDataAPI(v3)とYouTubeLiveStreamingAPIを使います。
[YouTubeDataApi(v3)公式リファレンス](https://developers.google.com/youtube/v3/docs/?hl=ja)と[YouTubeLiveStreamingApi公式リファレンス](https://developers.google.com/youtube/v3/live/docs/)を熟読しましょう、結構使える内容が見えてきます。

構成はこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391656/f7cf531f-ed14-fbad-879a-7285ae083b0e.png)


##Search:list

[リファレンス](https://developers.google.com/youtube/v3/docs/search/list?hl=ja)はここ。
GETするURL

```
https://www.googleapis.com/youtube/v3/search
```

投げるRequest

|part|channelId|eventType|type|
|---|---|---|---|
|snippet|[チャンネルID]|upcoming|video|

eventTypeは下記で分類されてます。

```
completed – 完了したブロードキャストのみを含めます。
live – アクティブなブロードキャストのみを含めます。
upcoming – 今後配信予定のブロードキャストのみを含めます。
```

なので、ライブ配信中だけを取得したい場合は「live」を指定します。

返るResponseで使うものは「videoId」です。snippetで配信タイトル等が取れるのですが、ここからはStreamingAPIを使って行きましょう。
ただ、LiveChatIdについてはここでしか取れないので保管しておきましょう。
余談ですが、この方法でしかLiveのIDは取れないみたいです。この方法はTwitterで教えていただきました、感謝です。

##LiveBroadcasts: list

[リファレンス](https://developers.google.com/youtube/v3/live/docs/liveBroadcasts/list)はここ。
GETするURL

```
https://www.googleapis.com/youtube/v3/liveBroadcasts
```
投げるRequest

|part|id|
|---|---|
|snippet|[LiveID]|

[liveID]はSearch:listで
返るResponseで使うものはitemsの中に入っている下記の通り。

- snippet
    - publishedAt:登録日
    - title：ライブタイトル
    - description：ライブ概要欄
    - thumbnails：サムネイル
        - default
            - url：サムネイルURL（120x90）
        - medium
            - url:サムネイルURL（320x180）
        - high
            - url:サムネイルURL(480x360)
    - scheduledStartTime

##LiveChatMessages: list

おまけに配信コメントの取得方法も記載しておく。
[リファレンス](https://developers.google.com/youtube/v3/live/docs/liveChatMessages/list)はここ。
GETするURL

```
https://www.googleapis.com/youtube/v3/liveChat/messages
```
投げるRequest

|part|liveChatId|
|---|---|
|snippet|[liveChatID]|

~~LiveBroadcastsで取得した~~Search:listで取得した（誤ってました）LiveChatIdをここに入れてあげると配信コメントを取得される。

##これで大体取れた

あとはひたすら取得するだけです。
チャンネルIDを入れて、配信予定だった場合、BroadcastsのAPIに入れて投げるだけ。
ついでに、コメント取得もしたかったら、LiveChatMessagesにも投げてあげましょう。
出来ること、大分広がったと思います。
「実数列の逆数」の極限　＝　「実数列の極限」の逆数

#1. 命題
実数列$\\{a_n \\}$の極限が$\lim_{n \to \infty} a_n=\alpha$、かつ、$\alpha \neq 0$ならば、

```math
\begin{align}
\lim_{n \to \infty} \frac{1}{a_n}= \frac{1}{\alpha}
\end{align}
```
である。

#2. 証明
仮定と補題１により、以下が成り立つ。

```math
\begin{align}
\lim_{n \to \infty} \frac{a_n}{\alpha} &= \frac{\alpha}{\alpha}\\
\lim_{n \to \infty} A_n &= 1\\
\end{align}
```
ただし、$A_n = a_n/\alpha$としている。
ここで、$x_n = A_n - 1$とおくと、$\\{x_n\\}$の極限は0となる。よって以下が成り立つ。

```math
{}^\exists N \in \mathbb{N}, {}^\forall n > N, |x_n| < 1/2 
```
ここで、$y_n = 1/(1+x_n)$とおく。すると以下の関係があることがわかる。

```math
|x_n| < 1/2  \Leftrightarrow 3/2< y_n <2
```
したがって、$\\{y_n\\}$は有界である。
また、以下の関係があることがもわかる。

```math
\begin{align}
1/a_n - 1/\alpha &= 1/(\alpha(x_n + 1)) + 1/\alpha\\
&= -x_n/(\alpha(1+x_n))\\
&= -x_ny_n/\alpha 
\end{align}
```
$\\{x_n\\}$の極限が0であり、$\\{y_n\\}$が有界であるので、補題2より以下が成り立つ。

```math
\begin{align}
\lim_{n \to \infty} x_n y_n= 0
\end{align}
```
このことと補題１により$\\{-x_ny_n/\alpha\\}$の極限は0である。すなわち、$\\{1/a_n - 1/\alpha\\}$の極限が0ということである。これより、命題は真である。$\Box$

#補題1
$c$を定数とする。このとき、実数列$\\{a_n \\}$の極限が$\lim_{n \to \infty} a_n=\alpha$ならば、

```math
\begin{align}
\lim_{n \to \infty} ca_n = c\alpha
\end{align}
```
である。
####証明
仮定より、以下が成り立つ。

```math
{}^\forall \epsilon > 0, {}^\exists N \in \mathbb{N}, {}^\forall n > N, |a_n - \alpha| < \epsilon 
```
したがって、$\epsilon/(|c|+1) > 0$について以下が成り立つ。

```math
{}^\exists N \in \mathbb{N}, {}^\forall n > N, |a_n - \alpha| < \epsilon/(|c|+1) 
```
これが成り立つので、以下のような関係があることがわかる。

```math
|ca_n - c\alpha| = |c| |a_n - \alpha| < |c|\epsilon/(|c|+1) < \epsilon
```
これより、補題１は示された。$\Box$



#補題2
実数列$\\{a_n \\}$の極限が$\lim_{n \to \infty} a_n=0$であり、$\\{b_n\\}が有界ならば、

```math
\begin{align}
\lim_{n \to \infty} a_n b_n = 0
\end{align}
```
である。
####証明
$\\{b_n\\}$が有界なので、以下が成り立つ。

```math
{}^\exists M \in \mathbb{R}, {}^\forall n \in \mathbb{N}, |b_n| \leq M
```
これより、以下の関係あることがわかる。

```math
|a_n b_n| = |a_n||b_n| \leq M|a_n|
```
このことと補題1より、$\\{M|a_n|\\}$の極限は0である。この事実と補題3より、$\\{a_n b_n\\}$の極限は0である。これより、補題2は真である。$\Box$

#補題3
実数列を$\\{a_n \\}, \\{b_n \\}$とし、${}^\forall n \in \mathbb{N}, |a_n| \leq b_n$であり、$\lim_{n \to \infty} b_n=0$であれば、$\lim_{n \to \infty} a_n=0$である。

####証明
下記URLの補題5の証明を参照。
https://qiita.com/elephant_raion/items/2c0630e5f42264015620
XCode11のシミュレーターでiOS13のダークモードを設定する方法

#**XCode11のシミュレーターでiOS13のダークモードを設定する方法**

iOS13のベータ版が公開されたので、早速実機にインストールして、
開発中のアプリをXCode11ベータ版でビルドして動作確認してみました。

実機ではすんなり**ダークモード**の設定ができたのですが、
**シミュレーターでは設定場所が異なっていました**。

##■実機の場合
<img width="40%" alt="IMG_0003.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51578/10055420-e688-44f7-281a-a082105806ef.png"> <img width="40%" alt="IMG_0003.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51578/32e7e3bf-1103-f9cf-eba6-960345e3386a.png">

[設定アプリ]の[画面表示と明るさ]から外観モードの設定（ライト/ダーク）ができます。

##■シミュレーターの場合

[設定アプリ]に[画面表示と明るさ]の項目がない！
<img width="40%" alt="Simulator Screen Shot - iPhone Xs - 2019-06-10 at 10.43.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51578/eece3dde-6843-aa46-539d-ae572f4d47e4.png">

[デベロッパ]を開くと[APPEARANCE]の項目にDark Appearanceの設定があります。
<img width="40%" alt="Simulator Screen Shot - iPhone Xs - 2019-06-10 at 10.43.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51578/15b1e38b-e2e6-f95f-ee7a-d318a658e489.png"> <img width="40%" alt="Simulator Screen Shot - iPhone Xs - 2019-06-10 at 10.43.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51578/2d2aa606-1e5e-ccba-2d3d-5b5d44eef57a.png">

この項目をONにするとめでたくダークモードにすることができました。

<img width="40%" alt="Simulator Screen Shot - iPhone Xs - 2019-06-10 at 10.43.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51578/83f2338b-61c5-8d48-6439-d054f1eb8046.png">
Confused between Flutter vs React Native?

![Flutter Vs React Native](https://s3-ap-south-1.amazonaws.com/eww-wp/wp-content/uploads/2019/06/07100958/google-flutter-vs-react-native.jpg)

This blog is your guide to learn everything about both the app development frameworks.

We know that developing and maintaining the app for both iOS and Android used to be a daunting task a few years back.

Separate code base | Separate developing team | Expensive & time-consuming development.

The text above is a summary, you can read full article here. [Flutter vs React Native Performance Comparison](https://www.excellentwebworld.com/flutter-vs-react-native/)
GCPのユーザ一覧をCLIで出すワンライナー

gcloudにはユーザ一覧を簡単に出すコマンドが無いです
IAM権限ごとに該当するユーザを表示するコマンド`gcloud projects get-iam-policy`をjqで加工するワンライナーを書きました

※jqが必要です
`brew install jq`
※それぞれ`YOUR_PROJECT_ID`をproject_idに置き換えてください

## 全てのユーザ一覧

```
gcloud projects get-iam-policy YOUR_PROJECT_ID --format=json | jq -r '.bindings | reduce .[].members as $item ([]; .+$item) | unique | .[] | select(startswith("user"))' | sed -e 's/user:\(.*\)/\1/'
```

## 管理者ユーザ一覧

```
gcloud projects get-iam-policy YOUR_PROJECT_ID --format=json | jq -r '.bindings[] | select(.role == "roles/owner") | .members[]' | sed -e 's/user:\(.*\)/\1/'
```

## 管理者以外のユーザ一覧

```
gcloud projects get-iam-policy YOUR_PROJECT_ID --format=json | jq -r '[.bindings | reduce .[].members as $item ([]; .+$item) | unique | .[] | select(startswith("user"))] - (.bindings[] | select(.role == "roles/owner") | .members) | .[]' | sed -e 's/user:\(.*\)/\1/'
```
CODE COMPLETE (上) -第2部 高品質なコードの生成 ③-

自分の理解を深めるために投稿します。

## 第7章：高品質なルーチン

### ルーチンを作成する理由

コードの重複を避けるためだけではない

- 複雑さの低減 ← 設計概念で大事なやつ！
- 中間部分をわかりやすく抽象化する
- コードの重複を避ける
- サブクラスを作成しやすくする
  - ルーチンが十分に分解され、短く保たれている必要がある
- 処理順序を隠蔽する
- ポインタの処理を隠蔽する
  - エラー原因になりやすい部分をまとめる
- 移植性を向上させる
- 複雑な論理評価を単純にする
　- 片付け
　- 評価の目的がわかりやすい関数名になる
- パフォーマンス向上
  - 1箇所で最適化できる

#### 小さいルーチンでも作成しよう

```
/// ルーチンを使わない場合

points = deviceUnits * ( POINTS_PER_INCH / DeviceUnitsPerInch() )

/// ルーチンを作成した場合

Function DeviceUnitsToPoints ( deviceUnits Integer ): Integer
  DeviceUnitsToPoints = deviceUnits * 
     ( POINTS_PER_INCH / DeviceUnitsPerINch() )
End Function

points = DeviceUnitsToPoints( dviceUnits )
  ```

全てのルーチンが小さくないといけないわけではない
1つの大きなルーチンで処理したほうがいい時もある

### 良いルーチンとは

- 最高！
  - 機能的凝集度

- 理想的でない
  - 情報的凝集度：決まった順序で実行されなければならない処理で構成されている
  - 連絡的凝集度：同じデータを利用するがそれ以外に関連のない処理で構成されている
  - 時間的凝集度：同時に実行される複数の処理でまとめられている


- 容認できない
  - 手順的凝集度：処理が特定の順序で書かれている(特定の順序でないとエラーが起きるわけではない)
  - 論理的凝集度：渡されたフラグによって複数の処理のうち１つが実行される
    - 例外：一連のif/case文と他のルーチンの呼び出しのみで構成されているなら良い(イベントハンドラ)
  - 暗号的凝集度：ルーチンの処理同士にそれと分かる関連がない

### 良いルーチン名とは

- ルーチンが行うことを全て説明する
- 曖昧な動詞を使わない
- 必要な長さのルーチン名にする
- 関数名には**戻り値**の説明を反映させる

```
cos();
customerId.Next();
```

- 機能的凝集度の高いルーチンを作成できているのなら、プロシージャ名は
  **「動詞 + オブジェクト名」** で事足りる
- ただし、オブジェクト指向言語の場合はオブジェクト自体が呼び出しに含まれるので、オブジェクト名を含まなくて良い

```
// 動詞+オブジェクト名
PrintDocument();

// 動詞のみ(オブジェクト指向言語で書いている場合)
document.Print();
```
- 正確な反意語を使う
`add/remove` `increment/decrement` `open/close` `begin/end` ...
- 命名規則を決めておく


### 良いルーチンの長さとは
- ルーチンの長さとエラーの発生率に深い関係はない
- むしろ**凝集度**、**ネストの深さ**、**変数の数**、**分岐の数**、などといった複雑さに関する問題によって決定する
- ただし、200行以上のルーチンを書く場合は注意が必要
  - わかりやすさの上限が200行

### ルーチンの引数
- 入力、変更、出力の順だとわかりやすい
  - そうでなくても、引数の**順序に一貫性**があるほうが良い
- 複数のルーチンが似たような引数を持つ場合は、**順番を統一**する
- 全ての引数を使用する
- **状態変数やエラー変数は最後**に配置する
- 引数に関するインターフェイスの条件を明記する
  - 入力専用？変更？出力専用？
  - 単位
  - 期待される値の範囲　など
- ルーチンの引数はだいたい**7個まで**
- 引数の渡し方は抽象化を元に考える
  - 別々に渡すか
  - オブジェクトごと渡すか
【RSpec】FactoryBotのモデル作成でコールバックをスキップする方法

テストコード用のインスタンスを作成する際、単純にテストデータが欲しいときなどはモデルで設定されているコールバックを無視したいケースがあります。

例えば、以下のようなコールバックがモデルで設定されている場合、FactoryBotに`skip/set_callback`を設定するとコールバックをスキップすることができます。（set_callbackをすることでコールバックがskipされっぱなしになることを防ぐ）

```app/model/user.rb
after_save :hoge
def hoge
  ...
  ...
end
```


```diff:spec/factories/users.rb
FactoryBot.define do
  factory :user do
    email 'xxx'
    ...
    ...

+   before(:create) { User.skip_callback(:save, :after, :hoge) }
+   after(:create) { User.set_callback(:save, :after, :hoge) }
  end
end
```
歴史から学ぶECMAScriptとJavaScriptの違い


ECMAScriptとJavaScriptの関係を知るには、その歴史を紐解いてみるのが良いかもしれません。

JavaScriptの誕生は、その生みの親であるブレンダン・アイクがNetscape[^Netscape]で動作するスクリプト言語を作るよう頼まれたことから始まります。Scheme[^Scheme]のようなパワフルさを持ち、Javaのような初心者でも簡単にコーディングできるような言語という無茶な要求でした。アイクは苦心した末にプロトタイプを導入することでこれらの課題を同時に解決する言語を開発しました。

言語が完成したあと、Netscapeのマーケティングチームは、マーケティングの一貫としてその言語に「JavaScript」と名付ける許可を、当時Javaの商標を持っていたサン・マイクロシステムズ社から取り付けました。JavaScriptがリリースされてから数年すると、MicrosoftのIEがそれを採用し、JScriptなどの独自言語を実装しはじめました。

IEがブラウザ市場を席巻するようになると、Netscapeプロジェクトは閉鎖されることになりました。Netscapeがなくなる前に、JavaScriptの開発者たちは、JavaScriptの標準化プロジェクトとなるECMAScriptを欧州電子計算機工業会(European Computer Manufacturers Association)主導で開始することにしました。

ECMAScriptにはいくつかのバージョンがあり、1999年にECMAScript 3がリリースされました。そこから10年間、MicrosoftはJavaScript界に支配的な影響を与えたものの、ブラウザの改良をしてこなかったため、JavaScriptは停滞期を迎えます。

しばらくすると、アイクのリードのもとFirefoxが開発され、GoogleからはChromeも発表されると、IEの独占市場が崩れはじめました。その後、2009年にはECMAScript 5がリリースされ、ECMAScriptは多くのブラウザがJavaScriptを実装するにあたって準拠する標準としての地位が確立し、ECMAScript 2015はBabelなどのトランスパイラの後押しもあって、大きく成功することになりました。

歴史的に見ると、ECMAScriptはJavaScriptから生まれたものであるものの、現在では、JavaScriptの実装規範となる「標準」としての存在になっています。

ちなみに、今は亡きActionScript(Flashの開発に使われた言語)は、JavaScriptではありませんが、ECMAScriptに準拠していました。

(間違いがあったら教えて下さい)

## 情報源

* [ecma262 - What is the difference between JavaScript and ECMAScript? - Stack Overflow](https://stackoverflow.com/questions/912479/what-is-the-difference-between-javascript-and-ecmascript)
* [JavaScript入門](http://www.tohoho-web.com/js/what.htm)
* [Ecma International - Wikipedia](https://en.wikipedia.org/wiki/Ecma_International)
* [ActionScript - Wikipedia](https://ja.wikipedia.org/wiki/ActionScript)
* [Chapter 4. How JavaScript Was Created - Speaking JavaScript](http://speakingjs.com/es5/ch04.html)
* [Popularity - BRENDAN EICH](https://brendaneich.com/2008/04/popularity/)

[^Netscape]: Netscape……昔むかし、IEと肩を並べてたウェブブラウザ。[Netscapeシリーズ - Wikipedia](https://ja.wikipedia.org/wiki/Netscape%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA)
[^Scheme]: Lisp言語の方言の一つ。Emacsというエディタの設定用スクリプトには(Schemeではないが)Lispが採用されており、簡素な記述で無限に強化出来ることからEmacsは最早エディタではなくOSなどと表現されている。
pipenv を使ったプロジェクトで個人的に開発用ツールをインストールする

`pipenv`コマンドと`Pipfile`/`Pipfile.lock` で依存パッケージを管理しているプロジェクトで、ちょっとした開発ツールを入れてみたい。

でも、`pipenv install --dev` で、`Pipfile`/`Pipfile.lock`を変更して、他の開発メンバーに影響を与えるのは避けたい（ex. 他メンバーとは好みが違う。お試しで使ってみたいだけなど）。

# 解決法： `pipenv run pip install` を使いましょう

`pipenv run pip install` で、`Pipfile`を変更せずに、仮想環境にパッケージを追加できます。

**例：**

```shell
$ pipenv run pip install jupyter # 仮想環境にインストール
$ pipenv run jupyter # 仮想環境のコマンドを実行
```

# 解説

ご存知の通り、`pipenv` は標準ライブラリの`pip`（などの）のラッパーであり、仮想環境内の `pip` を直接呼び出せば `Pipfile`を更新せずにパッケージをインストールできます。

```
$ ~/.local/share/virtualenvs/patissier-okggs9cf/bin/pip install jupyter # pip を直接呼び出す
```

とはいえ、仮想環境のパスはプロジェクトごとに異なり、いちいちパスを調べるのは面倒なので、「仮想環境内のコマンドを実行する」ために `pipenv run` コマンドが用意されています。

`pipenv run` は環境変数`$PATH`に仮想環境の`bin/`を追加します。

```
$ pipenv run env | grep PATH
PATH=/Users/a-hoge/.local/share/virtualenvs/patissier-okggs9cf/bin:【元々のPATHの内容】
```

これにより、`pipenv run pip install`は、仮想環境の`pip install`を実行することになります。

```
$ pipenv run pip install jupyter # 仮想環境にインストール
```
[Vue.js/Nuxt.js] タブなどを横一列で表示する時に、長さに応じて横幅が変わるようにしたい場合はcssでがんばらなくてもできる

## 概要

`[Home] [Company] [Recruit]`

こういうタブ一覧みたいなやつが、横一列に広がってて長さが長くなるに応じて短くするコンポーネントをつくります。

コンポーネント名はタブ一覧がTabList、タブがTabItemとかでいいと思います。（適当）

多分scssだけでもうまくやればできるんですけど、結構めんどくさそうだったので配列の長さのpropsを渡したほうが早いなと思いました

なのでスピード重視のコードです

### 解決法

- タブコンポーネントにタブ一覧Arrayのlengthをわたす
- タブコンポーネントで長さを変えたい要素に `style` 属性を付ける
- style内で `width: calc(100% / アイテム数)` を設定してやればOK

## サンプルコード

### タブ一覧コンポーネント

```vuejs
<template>
  <div class="switching-tabs">
    <SwitchingTab 
      v-for="(item, i) in tabItems"
      :key="`switching-tabs--${i}`"
      :name="item.name"
      :link="item.link"
      :tab-items-length="tabItems.length"
      class="switching-tabs__tab"
    />
  </div>
</template>

<script>
import SwitchingTab from '~/components/Common/SwitchingTab';

export default {
  components: {
    SwitchingTab
  },
  props: {
    tabItems: {
      type: Array,
      required: true
    }
  }
};
</script>

<style lang="scss" src="./style.scss" scoped>
</style>
```

```scss
.switching-tabs {
  display: flex;
}
```

### タブコンポーネント

```vuejs
<template>
  <a :href="link" :style="tabStyle" class="switching-tab">
    <div class="switching-tab__container">
      <label class="switching-tab__container__label">{{ name }}</label>
    </div>
  </a>
</template>

<script>
export default {
  props: {
    name: {
      type: String,
      required: true
    },
    link: {
      type: String,
      required: true
    },
    tabItemsLength: {
      type: Number,
      required: true
    }
  },
  computed: {
    tabStyle() {
      return {
        width: `calc(100% / ${this.tabItemsLength})`
      };
    }
  }
};
</script>

<style lang="scss" src="./style.scss" scoped>
</style>

```

```scss
.switching-tab {
  text-decoration: none;

  &__container {
    display: flex;
    justify-content: center;
    padding: 10px 0;
    border: solid 1px #000;
    border-radius: 10px;
    background-color: #fff;

    &__label {
      color: #000;
      font-size: 1.3rem;
      font-weight: 600;
    }
  }
}

```

## おわり

こんな感じのコードを埋め込めばそれっぽいタブ一覧みたいなコンポーネントができると思います。
二分探索

# 二分探索
- 「**指数的爆発**」を逆手に取った探索方法
- 探索範囲を探索していくごとに半分にしていく
- つまり，**1回多く調べれば，2倍の探索範囲から探し出せる**ようにすることで，大量のデータから効率よく探し当てることができる
- 探索対象のレコード列の長さが$n$ならば，$\log_2 n$回領域を半分にしていけば，探索すべき範囲が$1$になるので，二分探索は$O(\log_2 n)$で，効率がいい
- 探索範囲を狭める根拠が必要になる．よって，探索対象は「整列」されている必要がある
- 二分探索における「列」として配列を用いる（線形リストは使わない）
    - 何故ならば，**ある範囲を決めたとき、ちょうど真ん中にあるデータに即座にアクセスできる**必要があるから

## 🚀探索アルゴリズムとして二分探索を採用する時のデータ構造の満たす性質
1. データがソートされている
2. ある範囲を決めた時，ちょうど真ん中にあるデータに即座にアクセスできる

これを満たすデータ構造は「**配列**」か「**二分木**」

- 配列はランダムアクセス性がある
- 二分木は左右にぶら下がるノードの個数がだいたい同じだと二分探索に向いている

## 素朴にやる
- ループ回るごとに2回比較しているのが無駄

```go
package main

import (
	"fmt"
)

func BinarySearch(array *[]int, target int) (bool, int) {
	low, high := 0, len(*array)-1
	for low <= high {
		middle := (low + high) / 2
		if target <= (*array)[middle] {
			high = middle - 1
		}
		if target >= (*array)[middle] {
			low = middle + 1
		}
	}
	return low == high + 2, low - 1 // 失敗しているときは low == high + 1 になっている
}

func LinearSearch(array *[]int, target int) (bool, int) {
	for i := range *array {
		if (*array)[i] == target {
			return true, i
		}
	}
	return false, -1
}

func main() {
	array := make([]int, 10)
	for i := range array {
		array[i] = i
	}
	fmt.Println(array)
	if found, _ := BinarySearch(&array, 3); found {
		fmt.Println("Found!")
	} else {
		fmt.Println("Not Found!")
	}
}
```

## もうちょっと賢く

```go
package main

import "fmt"

func BinarySearch(array []int, target int) (bool, int) {
	n := len(array) - 1
	low, high := 1, n
	for low <= high {
		mid := (low + high) / 2
		if target < array[mid] {
			high = mid - 1
		} else {
			low = mid + 1
		}
	}
	pos := high
	if pos == 0 {
		return false, -1
	} else {
		return true, pos
	}
}

func main() {
	array := make([]int, 11)
	for i := range array {
		array[i] = i*i
	}
	if found, _ := BinarySearch(array, 25); found {
		fmt.Println("Found!")
	} else {
		fmt.Println("Not Found!")
	}
}
```

- 「何をしているのか」が一見するとよくわからない．こういうときは**ループの不変条件に注目**する

【不変条件】
1. $j = 1, 2, ..., low-1$に対して$array[j] <= target$
2. $j = high + 1, high + 2, ..., n - 1, n$に対して$array[j] > target$

![無題のプレゼンテーション (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169178/4ea856ed-3680-85bb-630f-76a88a505c06.png)

![無題のプレゼンテーション (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169178/50cc7592-0c0e-5b37-c6b1-12ed0b8b60cc.png)

![無題のプレゼンテーション (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169178/fe751231-b381-acfd-870d-1ee5e156e0b2.png)

![無題のプレゼンテーション (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169178/4bd97493-5f03-1358-2024-cd1d33d37986.png)
rails チュートリアル リスト 1.5　bundle install できない原因

**この記事は2019/6/10 現在のrailsチュートリアル 
リスト1.5でbundle installできない理由と対処方を解説します**

##解決方法
```ruby
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '2.3.7'

gem 'rails', '~> 5.2.3'
gem 'puma', '~> 3.11'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.2'
gem 'jquery-rails', '4.3.1'
gem 'turbolinks', '~> 5'
gem 'jbuilder', '~> 2.5'
gem 'bootsnap', '>= 1.1.0', require: false

group :development, :test do
  gem 'sqlite3',      '1.3.13'
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end

group :development do
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '>= 3.0.5', '< 3.2'
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
end

gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
```
をリスト1.5の代わりにGemfileに記載してから

```bundle update```
```bundle install```
の二つをおこなってください


##理由
ruby 5.2以降にrailsチュートリアルが対応していないためだと思います
おそらくbootsnap関係とruby 2.2以降のバージョン指定でエラーが起きてしまってると思います
（筆者はrailsチュートリアルを勉強初めてばかりの初心者なので詳しいことはわかりません）



##参考資料
>Rails5.2新機能の概要と5.1.0→5.2.2にアップグレードして何が変わるかを調査した
https://sakanasoft.net/upgrade_rails52/


何か不足な点や間違いがあればご教授してもらえると幸いです
カーネルc-SVMの単一法によるNumpyだけの実装

# Qita童貞卒業

機械学習で重要なアルゴリズムであるカーネルc-SVMを単一法を用いて実装しました。
まだ途中ですが、理論編として双対問題までの導出の記事を書きました。
その記事は

- [理論編Part1](https://takutori.blogspot.com/2018/06/svm-part-1.html)

- [理論編Part2](https://takutori.blogspot.com/2018/06/svm-part-2.html)

にあります。
実装編は


- [実装編](https://takutori.blogspot.com/2018/06/svm.html)


:fist_tone4:

![d](https://i.imgur.com/e1TKK0z.png)

![d](https://i.imgur.com/ctHyWax.png)


## 最後に

コメント、お仕事のご依頼ぜひぜひよろしくお願いいたします。

- homepageは[こちら](https://takutori.github.io/)
Laravel+React+Material-UIで作る認証画面テンプレ

Laravel+React(Redux+ReactRouter)+Material-UIでソースとデモ画面の公開と使い方など

[デモ画面](https://lrm.multi-sv-lab.work/login)
user / pass : demo@example.com / demodemo
[ソース](https://github.com/DistortionOfWorld/LRM)

###導入方法

１．Laravel新規プロジェクトのインストール
※composer及びphpの依存ライブラリなどは準備済みとする

```terminal
$ composer create-project --prefer-dist laravel/laravel lrm
```

２．上記の差分ソースで上書き

３．プロジェクト全体のアクセス権限を再設定

```terminal
# chown -R user_name:user_name lrm
```

４．.envファイルにDB及びメールの設定を記入
下記の辺りにそれぞれ値を記入

```.env
DB_DATABASE=[DB名]
DB_USERNAME=[DBユーザー名]
DB_PASSWORD=[DBパスワード]

MAIL_PROTOCOL=SMTP_AUTH
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_FROM_ADDRESS=[送信メールアドレス]
MAIL_FROM_NAME=LRM
MAIL_ENCRYPTION=tls
MAIL_USERNAME=[メールサーバーユーザー名]
MAIL_PASSWORD=[メールサーバーパスワード]
```

５．マイグレーション

```terminal
$ php artisan migrate
```

６．JavaScriptの依存解決

```terminal
$ npm install
```

７．JavaScriptなどのビルド

```terminal
$ npm run watch
```

８．Webサーバーもしくはビルドインサーバーで受付

```terminal
$ php artisan serve -h 0.0.0.0
```
※その他Webサーバーの場合の設定に関しては省略

その他．selinuxが有効な場合
storage領域を書き込み許可にする

```terminal
# chcon -R -t httpd_sys_rw_content_t /usr/share/nginx/html/lrm/storage
```
ワイルドカード可能な無料DNSと無料SSL証明書認証局でサイト構築

イントラネットでOpenShiftを使っていた時は、予めイントラ用DNSに*.(ワイルドカード)を付けたドメイン名のAレコードを登録しておけば、あとはポッドを追加するだけで簡単に各種便利コンテナの恩恵を得ることができた。イントラネットということで割り切ってSSL証明書も使ってなかったしね。

今回、インターネット向けに同様のことがしたいのだが、このご時世、できるだけお金をかけたくない。無料DNSは話は聞いてたけど、Let's Encryptという大変有り難い無料SSL証明書の認証局ということも知ったし。さらにLet's Encryptはワイルドカードなドメイン名にも対応しているから素晴らしい。

で、設定に成功した例は先駆者の方の記事を参考にしてもらうとして、ちょっと嵌ったことを記事にしてみました。

# [Dynu](https://www.dynu.com/)でDNS登録
ワイルドカードが可能な無料DNSを探したところで、ここが見つかった。
画面右上の[Create Account]でアカウントを作成するとコントロールパネルが表示される。
![1.control-panel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387890/dc359b6a-a6bc-6172-701a-ff3b7a126265.png)
ここで[DDNS Services]をクリックし、
![2.Dynamic DNS Service.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387890/d4a1f893-d81d-6b0e-def2-46f89c743457.png)
[Add]をクリック。
![3.Add Dynamic DNS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387890/fbb4d102-d450-6a9a-4cd0-f6284fa67869.png)
登録したいドメイン名を指定して[Add]をクリック。
自分はOption1の方で、***ワイルドカードなしのホスト名***を入力し、適当にトップレベルを選択。
![4.Manage Dynamic DNS Service.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387890/84c7ffd5-416e-cfc1-c65c-9da01b1b73d3.png)
[IPv4 Address]にIPアドレスを入力して[Save]をクリックして完成。


# Let's EncryptでSSL証明書作成

ホストのCentOS 7.6にクライアントツールのcertbotをインストール。

```console
$ sudo yum install -y epel-release
$ sudo yum install -y certbot
```
certbotのバージョンは0.31.0。


で、証明書取得のコマンドを実行。なお、```${}```は該当する情報に置き換えて。

```console
$ sudo certbot certonly --manual \
    --preferred-challenges dns-01 \
    --server https://acme-v02.api.letsencrypt.org/directory \
    -m ${自分のメールアドレス} \
    -d ${ドメイン名} \
    -d *.${ドメイン名}

...途中省略...

Please deploy a DNS TXT record under the name
_acme-challenge.inet-strange.dynu.net with the following value:

${生成された値}

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue
```
ここでDNSにTXTレコードを作成する必要があるとのこと。DynuはTXTレコードも設定できると聞いてたので、[Manage Dynamic DNS Service]画面にある[DNS Records]をクリックして、[Manage DNS Records]画面の[Type]を[TXT - Text]に変更すると。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387890/0a6dd858-5170-d60a-eed1-04c898f4a0b3.png)
なんと***30日過ぎないとTXTレコードは作成できない***とのこと。orz

* 後日、この制限はアカウントを作成してからの日数ではなく、ドメイン名を登録してからの日数であることも判明。

そこでDNSでの認証が必須なワイルドカードは諦め、certbotコマンドのオプションを、ドメイン名のwebサーバにアクセスできるかで確認する方式(--preferred-challenges http-01)に変更し、-dオプションで思いつく10個ぐらいのサブドメイン名付きで登録することで、対処しました。

# そして30日後
めでたくdynuでTXTレコードが設定できるようになり、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387890/4e14b913-694b-0de8-9315-610d0f42b1e4.png)
certbotでワイルドカードのSSL証明書を作成することができました。

# その90日後 
こなければいいなと思いつつ、とうとう 「Let's Encrypt certificate expiration notice for domain」のメールが来ました。だいぶ脳内キャッシュから削除された知識を手がかりにして以下のコマンドと、dynuへのTXTレコード設定で更新できました。

```console
# certbot certonly --manual \
 --preferred-challenges dns-01 \
 -d ${ドメイン名} \
 -d *.${ドメイン名}
```

* ただ最初は--preferred-challenges dns-01を指定しなで実行したところ、dns-01 と http-01の両方が実行されてしまい、dns-01は成功したのにhttp-01の失敗により証明書が更新されないハメに合いました。
* 前回、DNSに登録したTXTレコードが反映されるタイミングが判らず、不安になりましたが、今回、nslookup -q=txt _acme-challenge.${ドメイン名}でTXTレコードを確認することを知り、安心して作業できました。
Automation Anywhereでデータベース操作を行う方法(Excel版)

AutomationAnywhereにて、DB操作をしたい際に必要な設定や手順について記載します。

今回は、**Excelファイル(.xls)**をDBとして使用するケースの紹介となります。

##接続
まずCommandの[DataBase]→[Connect]を使用してデータベースへの接続設定を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430538/3ea1ffa6-2996-3a70-aafa-41c7ee7a24b0.png)

Connecting String欄に接続文字列を入力します。
[…]ボタンから接続文字列生成を進めることができます。

まずは、プロバイダー設定します。
今回は、Microsoft Jet 4.0 OLE DB Providerを使用しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430538/cafdcc8b-8b28-b714-23c9-666ea2ccf436.png)

次に、接続設定です。
1の欄にExcelファイル名を指定します。
選択ダイアログは初期状態だと、.mdbファイルしか表示されないのですべてのファイルに変更してから選択します。
ユーザ名などは環境に合わせて変更します。
今回はこのまま進めました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430538/df28175e-773d-8948-3f28-bc31fb6766f2.png)

**通常は、ここまでの設定で接続ができるようになるのですが
ExcelをDBとする場合は追加で設定が必要になります。**

すべてタブの、Extended Propertiesに以下の値を設定します。
**```Excel 8.0;HDR=Yes```**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430538/d8607549-0236-c81b-306b-e87c582acbb7.png)

```Excel 8.0```
の設定値については、Excelのバージョンによって変更が必要になります。
参考：https://www.connectionstrings.com/microsoft-jet-ole-db-4-0/

　
```HDR=Yes```
は、Yesに設定すると1行目のデータをフィールド名として扱えるようになります。

接続設定は以上になります。
接続タブから接続テストを実施し無事に接続できることを確認しましょう。

##SQL実行
Commandの[DataBase]→[SQL Query]もしくは、[DataBase]→[Insert/Update/Delete]にて実行したいSQL文の発行ができます。

**例）テーブルのデータをCSVファイルに出力する場合**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430538/1ce4be00-6006-e4af-378e-7f7e1ebefd55.png)

テーブルから抽出したい条件でSQL文を入力。
Export Data to CSVにチェックをいれデータ出力先のCSVファイル名を指定
することで可能です。

**例)テーブルにデータを挿入したい場合**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430538/88ed162c-918c-8365-930a-3edc47f54800.png)

こちらは単純に実行したいSQL文を入力するだけです。

以上です。
WDS向けDHCPオプション設定例(Windows対応)

## 最初に
この文書はWindows DHCPサーバーを利用して、WDSサーバー向けのオプションを設定するための設定例です。2019年6月時点での動作はしておりますが、各環境での差異はご承知おきください。
また、今回はCISCOでのip helperで別のセグメントにいるWindows DHCPサーバーでDHCPを払い出すための設定です。単一サーバーでやるような場合はこの記事は役に立ちません。

## 1.想定されている構成
![wds01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220924/e364e539-7794-07b1-1bbe-18523df78d7a.png)

## 2.必要なdhcpオプションの設定
066 ブートサーバーホスト名 10.20.1.100
067 ブートファイル名　boot\x64\wdsnbp.com
ブートファイル名はRemoteInstallフォルダーからの相対パス
060 PXEClientは、もし、あれば、削除すること。

## 3.WDSのオプションを設定
![wds02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220924/69b0080b-7dd2-d7f1-8ed9-19342f3df67f.png)
両方ともチェックを外します。

以上で、私の環境ではうまくいきました。英語のドキュメントが多かったので、
日本語で保存しておきたくて書きました。

###追記
この後、BIOSとUEFI対応をさせる[DHCPポリシーとDHCPオプションの設定をするサイト][1]を見つけたので、リンクしておきます。

[1]:https://wiki.fogproject.org/wiki/index.php/BIOS_and_UEFI_Co-Existence#Step_1
Ontologyのpunica使おうとしたらなんかライブラリー内の参照ファイル名が間違ってた。

##Ontologyのpunica使おうとしたらなんかライブラリー内の参照ファイル名が間違ってた。

憧れの初投稿なのでなんだこいつ気持ちわりーとかそんなん知ってるとか思ってても生暖かい目で見てやってください。
![生暖かい目](https://i.ytimg.com/vi/bTC8G9m40ak/hqdefault.jpg)
###### 生暖かい目



最近暗号通貨（暗号資産？）でアプリ作れるようになりたなーと思いまして、とりあえずsolidity勉強した後になんかpythonでいっぱいかけそうと思い[わかりやすいサイト](https://medium.com/layerx-jp/introduction-to-ontology-smartcontrac-development-vol1-e0c8816f7715)を見ながらontologyをやろうってなったんですが、

なんかpunicaっていうCLI＋サンプルコードいっぱい使えるよー的なものをインストールして使おうとしましたら、

```bash

 line 10, in <module>
    from ontology.ont_sdk import OntologySdk
ModuleNotFoundError: No module named 'ontology.ont_sdk'
```

なんかこんな感じでmoduleないやんけってずっと言ってるんです。

なので初心者なので再インストールしたりとか、サイトとか色々と見て回ってもなぜかこのエラーの話題が全く上がっておらず、
大学は台湾の大学に通っているので、そういやontologyって中国系じゃんと思い、頑張って中国語で探しても全く見つからず。
だんだんムキになってきて「よっしゃ、スクリプト全部読んだろ！」ってなったわけですが、

結果：単にライブラリー内の名前が全然違がっただけっていう。
venv/lib/python3.6/site-packages/ontology　ディレクトリ中にあるもともとont_sdk.pyっていう名前のファイルが
sdk.pyっていう名前になってて、さらに
エラーをだす
deploy_contract.py,invoke_contract.py, account.py, asset.py
のなかで

```python
from ontology.ont_sdk import OntologySdk
#じゃなくて
from ontology.sdk import Ontology
#が正解であとは全部名前を変えなきゃいけないです
OntologySdk = Ontology()
#自分は上みたいにしてごまかしました。
```
あとinvoke_contract.pyの中で

```python
from ontology.contract.neo.abi.abi_info import AbiInfo
from ontology.contract.neo.abi.build_params import BuildParams
from ontology.contract.neo.vm import NeoVm
#ってなってんのを

from ontology.contract.neo.abi.abi_info import AbiInfo
from ontology.contract.neo.abi.build_params import BuildParams
from ontology.contract.neo.vm import NeoVm
＃に変えれば動きました。
```

えーー。みたいな
初心者なんでそんなトラップ仕掛けないでくれっていう

とりあえずもし同じような初心者がいれば参考にしてほしいです。

とりあえずpunica Version == 0.0.22,　ontology-python-sdk version == 2.0.4です。

こういう時って報告すればいいんですかね？
どうすればいいんですか？教えてください。

追記：
すでに誰かGithubの方で報告してたらしいです。
ただwalletとinvokeが使えないっぽいんですが、それ以外は大丈夫っぽいので、アップデート長そうだったらまた自分でwalletいじって見ようかなと思います。
LoRa変調って？

#前書き
　ThethingsNetworkにつながるゲートウェイやエンドデバイスをラズパイで作っています．
Uplinkは少しはできるようになったのですがDownlinkがなかなかできません．．
気分転換？に前から気になっていたLoRa変調について調べてみたのでメモとして記します．
もし間違いなど見つけられたら指摘していただけるとうれしいです．

#LoRa変調
技術的にはChirp Spread Spectrum、チャープ・スペクトラム拡散による変調のことですが
Long Rangeを略してLoRa、その用途に適した変調ということでLoRa変調と呼ばれています．
広範囲の通信に適した変調ということでしょうか．

#図による説明
チャープは周波数を時間とともに変化させて拡散する方法でFig.1のように変化させます．
![Chirp_Mod_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353064/220e266a-37d5-aa4b-bcca-0a9d917f48fd.png)
周波数はFreq.LowからFreq.Highの範囲で変化させます．Freq.High-Freq.Lowが帯域幅BWになります．
$BW = Freq.High - Freq.Low$
図は時間とともに周波数が増加していますが減少する方向に変化させてもよいです．
そして周波数が一周して元に戻る？までの時間が１シンボル（変調の単位）となります．Fig.1では3シンボルあります．
![Chirp_Mod_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353064/51de9931-9163-6f82-0006-84f6381350cc.png)
シンボルは通信の変調の単位ですがデータの1/0をどうやって対応させるかや何通りの波形があって何ビットに対応させるかは決め方次第です．
LoRa変調ではデータをシンボルの開始周波数（Freq.LowとGreq.Highの間の位置）に割り当てています．
ここでは１シンボルに８ビットを割り当てるとして変調した例をFig.3に示します．
![Chirp_Mod_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353064/8cf73484-0032-11f8-ad6f-97fada7c08f4.png)
データが0x00、0x3F、0x7Fと続いた場合の変調波形がこの図です．
図では2ビット分しか書いていませんがBWを256（$=2^8$）分割すれば８ビット分のデータを割り当てることができます．
ここで１シンボルに割り当てたビット数を$SF$とします．（後述）

#式による説明
Chirp変調では拡散は周波数の変化で、その大きさは$BW$ですのでチップレート（$R_c$)は$BW$と言えます．
シンボルレート（$R_{sym}$)はチップレートをシンボル数 $2^{SF}$で割ればよく次の式になります．
$R_{sym}=\dfrac{BW}{2^{SF}}$
ビットレート$R_{bit}$は先の$SF$を用いて
$R_{bit}=\dfrac{BW}{2^{SF}}SF$
となります．　また、１シンボル時間$T_{sym}$は$R_{sym}$から
$T_{sym}=\dfrac{2^{SF}}{BW}$
となります．
周波数が$f_h$から$f_l$へジャンプするタイミングは$\dfrac{1}{BW}$ごとでFig.4のようになります．
![Chirp_Mod_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353064/3b289b8b-3f3e-37f3-8a40-0b6cb4846f7c.png)

LoRa変調について技術的に踏み込んで説明してあるものがなかなかなくて前から知りたいと思っていましたのですっきりしました．

#参考にしたサイト
https://www.sghoslya.com/p/lora_9.html
https://www.youtube.com/c/mobilefish/about
Python リスト内包表記まとめ

# リスト内包表記まとめ
## 1~7の要素を持つリストを作る
```
x=[n for n in range(1,8)]
```
[1,2,3,4,5,6,7]
## 1~7の要素の２乗した値を持つリストを作る
```
x=[n**2 for n in range(1,8)]
```
[1,4,9,16,25,36,49]

## 1~7の要素のうち偶数のリストを作る
```
x=[n for n in range(1,8) if n % 2 == 0]
```
[2,4,6]

## 入れ子のforでリストを作る
```
x=[i*10+j for i in range(1,3) for j in range(2,5)]
```
[12, 13, 14, 22, 23, 24]

## 2次元リストを作る
```
x=[[i*10+j for j in range(7,10)] for i in range(1,3)]
```
[[17,18,19],[27,28,29]]]

## 単位行列生成
```
row=col=3
matrix=[[1 if i==j else 0 for j in range(col)] for i in range(row)]
```
[[1, 0, 0], [0, 1, 0], [0, 0, 1]]