OmniAICreator/Qiita-1.07M huggingface dataset:
Git でリベース後にマージされたため --merged でも表示されないけど不要なローカルブランチを表示する

リモートにプッシュしたブランチが、ローカル以外でリベースされたあとに master などにマージされた場合、その元となったローカルブランチは `git branch --merged` しても表示はされませんが、もうマージされているので不要なブランチです。

Gitlab で MR を ff マージできるときしかマージしない設定をしていると（`Merge commit with semi-linear history`）、プッシュしたあとに Gitlab 上でリベースしてからマージすることになるので、ローカルにこの種のブランチが残ってしまいます。

つまり、次のように B からブランチを生やした MR について。

![img01][]

ローカル以外で MR 先へリベースしたうえでマージされると、Y を指しているローカルブランチはマージ済なので削除して問題ありませんが `git branch --merged` でもこれは表示されません。

![img02][]

## あるブランチが master にマージされているか調べる方法

いくつか方法は考えられますが・・・

master にリベースして master と同じ位置に来るか見る。

```sh
git checkout feature-hoge
git rebase origin/master

# feature-hoge と origin/master が同じ位置なら feature-hoge は削除できます
git log --decorate --oneline --graph
```

マージしてみて差分があるか見る。

```sh
git checkout -B master origin/master
git merge --no-commit --no-ff feature-hoge

# 差分がなければ feature-hoge は削除できます
git status

# マージ途中状態なので abort しておきます
git merge --abort
```

## あるブランチが master にマージされているか調べる方法：改

上の２つの方法はワーキングツリーやインデックスがいじられるので使いにくいです。次のようにすればワーキングツリーを弄らずに確認できます。

まず、マージ済か調べたいブランチと master の共通の祖先のコミットを得ます。

```sh
git merge-base feature-hoge master
```

そのコミットを用いた3方向マージの内容を表示します。

```sh
git merge-tree abc12345 feature-hoge master
```

これで何も表示されなければ feature-hoge は master へマージ済なので削除できます。また、`git merge-tree` は表示するだけなのでワーキングツリーやインデックスを汚しません。

次のようなシェルスクリプトを作成して `git ls-merged` とかで呼べるようにしておくと便利です。

```sh
#!/bin/bash

ref=${@:-HEAD}

git for-each-ref --format='%(refname:short)' refs/heads/ | while read -r x; do
  if ! git merge-tree "$(git merge-base "$x" "$ref")" "$ref" "$x" 2>/dev/null | read -r; then
    echo "$x"
  fi
done
```

<!--
digraph g {
    graph[ rankdir=LR ]

    A -> B -> C -> D;
    B -> X -> Y;

    Y -> D [ style=dotted, label=MR ];
}

digraph g {
    graph[ rankdir=LR ]

    A -> B -> C -> D -> M;
    B -> X -> Y;
    D -> "X'" -> "Y'" -> M;
}
-->


[img01]: https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8734/624ce13b-0b63-d405-a0b0-a9021fb3e11e.png

[img02]: https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8734/0d5d7440-2b94-cfc6-1561-c5fcd1bf61cd.png
AngularJS(v1.x系)でng-modelにはprimitive型は使えないみたい

inputで入力した値がcontrollerで受け取れず、undefinedになってしまうという事象に遭遇しました。
調べてみると、ng-modelにプリミティブ型の値を指定するとcontrollerで受け取れない仕様みたいでした[^1]。

オブジェクトのプロパティとして渡してあげると良いです。

## 変更履歴
**2019年6月18日**
Angular2.0以降では、primitive型もng-modelで使えるみたいでした。
なので、タイトルに修正を入れました。
@lacolaco さんご指摘ありがとうございました。

[^1]: https://stackoverflow.com/questions/31988632/ng-model-is-undefined-in-controller
HTML テーブル表示について

こんにちは。職業です。

#今回は、**テーブル**表示についてです！ 

テーブルでは見出しと、見出しの内容を作成することが出来ます。

まず、テーブルを作るには、**table**タグを使います。
その中に**thead**と**tbody**を作ります。


![テーブル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427747/cdcc38c4-ccc3-59c9-62e9-3765f29c0a2b.png)

**thead（ティーヘッド）→見出し**
ここでは、キャラ、技を使用しています。
tr(テーブルローの略）→行の部分のこと。
th（テーブルヘッダーの略）→見出しのこと。

**tbody（ティーボディー）→内容　見出しの中身**
ここでは、ナルト　らせんがん
　　　　　サスケ　千鳥を使用しています。
td→データの部分

**table**は、よく使わられるタブになります！



下記のようになります。

![テーブル2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427747/b743f15f-0758-e7f4-d205-dfc8b138f6a8.png)

汚くてすみません、、、


参考になればなれば幸いです。


それでは！
vee-validateで個別にエラーを表示させる

# 概要
複数のフォームそれぞれで個別にVeeValidateのバリデーションをかけたい時の対応

# 実装方法

**scopeを使います**

* それぞれのフォームを`form`タグで囲って、`:data-vv-scope`属性を付与する。
  （`form`タグで囲まないと動作しなかった）

* `validateAll({scope名})`を実行

```src/pages/test.vue
<template>
  <div>
    <form :data-vv-scope="form1">
      <input
        type="text"
        v-model="email"
        name="email"
        v-validate.disable="'required|email'"
        :class="{ 'has-error': errors.has('form1.email') }"
        data-vv-as="メールアドレス"
      />
      <p v-show="errors.has('form1.email')" class="error-message">
        {{ errors.first('form1.email') }}
      </p>
      <button type="button" @click="post('form1')">submit</button>
    </form>

    <form :data-vv-scope="form2">
      <input
        type="text"
        v-model="address"
        name="address"
        v-validate.disable="'required'"
        :class="{ 'has-error': errors.has('form2.address') }"
        data-vv-as="住所"
      />
      <p v-show="errors.has('form2.address')" class="error-message">
        {{ errors.first('form2.address') }}
      </p>
      <button type="button" @click="post('form2')">submit</button>
    </form>
  </div>
</template>

<script>
export default {
  methods: {
    async post(scope) {
      const validateResult = await this.$validator.validateAll(scope);
      if (!validateResult) {
        console.log('Validation error.');
        return false;
      }
      console.log('Success.');
      return true;
    },
  },
}; 
```

errorsの内容も`{scope名}.{name}`になるので注意

### 参考

https://baianat.github.io/vee-validate/examples/scopes.html
nuxtでError: Cannot import module '@nuxt/webpack' となってeb deployできなかったときにやったこと

# 解決方法
- package.jsonを削除する
- node_modulesを削除する
- `npm update`を実行
- 改めてeb deployする

# 環境
- nuxt2.8.1
- node10.10.0
- デプロイ先　Elastic Beanstalk

# やりたかったこと
nuxtでspaで作ったプロジェクトをeb deployして、eb上でnodeサーバを起動したかった
eb deployした時に、buildしてstartしてもらうために、package.jsonは以下のように

```package.json
"scripts": {
    "dev": "nuxt",
    "build": "nuxt build",
    "start": "nuxt build && nuxt start",　←ここを変更した
    〜その他設定〜
}
```


# eb deployした時のエラー
- デプロイ自体は成功したように見えるが、デプロイ先のURLを開いても502エラーが返ってくる
- ebのログには以下のエラーがはかれていた

```
-------------------------------------
/var/log/nodejs/nodejs.log
-------------------------------------
  at webpack (node_modules/@nuxt/cli/dist/cli-chunk.js:63:23)
  at NuxtCommand.getBuilder (node_modules/@nuxt/cli/dist/cli-chunk.js:2687:37)


   笊ｭ笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笊ｮ
   笏�                                                 笏�
   笏�   笨� Nuxt Fatal Error                            笏�
   笏�                                                 笏�
   笏�   Error: Cannot import module '@nuxt/webpack'   笏�
   笏�                                                 笏�
   笊ｰ笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笏笊ｯ

npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! hoge@1.0.0 start: `nuxt build && nuxt start`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the hoge@1.0.0 start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

> hoge@1.0.0 start /var/app/current
> nuxt build && nuxt start


 FATAL  Cannot import module '@nuxt/webpack'

  at _import (node_modules/@nuxt/cli/dist/cli-chunk.js:57:17)
  at webpack (node_modules/@nuxt/cli/dist/cli-chunk.js:63:23)
  at NuxtCommand.getBuilder (node_modules/@nuxt/cli/dist/cli-chunk.js:2687:37)
```

# 解決方法(再掲)
- package.jsonを削除する
- node_modulesを削除する
- `npm update`を実行
- 改めてeb deployする

多分これで治る（自分は別のエラーが出ましたが、少なくとも上記のエラーは突破した）
MongoDB CRUD入門 勉強ノート

# MongoDBとは

document database ~ NoSQL ~ と呼ばれている。
リレーショナルデータベースと異なり、`json object`をmongodbに保存していくだけ、というシンプルさがある。

### 起動方法

```terminal
$ mongod 

waiting for connections on port 27017
```

データーベースを使用の際は、基本的に起動したままにしておく。

終了時は必ず`Ctrl+C`でシャットダウンできたか確認しておくこと！


[**MongoDB Compass**](https://www.mongodb.com/products/compass)というPSequelのようなアプリケーションを入れておくと、データーベースの内容が簡単に確認できるので便利。

---

### Mongoose

MongoDB用モデリングツール。モデルの定義、操作が可能。

```
npm i mongoose
```
Mongooseをインストール

以降はnodeを使用したケースです。

```javascript:index.js
const mongoose = require('mongoose');

// localhostでの実行。Databaseを自動で作ってくれます
mongoose
  .connect('mongodb://localhost/playground', { useNewUrlParser: true })
  .then(() => console.log('Connected to MongoDB...'))
  .catch(err => console.error('Could not connect to the DB', err));
```

`node index.js`で起動すると`'Connected to MongoDB...'`と接続成功のメッセージが表示される。

---

### MongoDB接続

```javascript:index.js
// Schemaの作成
const courseSchema = new mongoose.Schema({
  name: String,
  author: String,
  tags: [String],
  date: { type: Date, default: Date.now },
  isPublished: Boolean
});

// Model (大文字・単数)
const Course = mongoose.model('Course', courseSchema);
```

---

### データー作成

```javascript:index.js
async function createCourse() {
  const course = new Course({
    name: 'Node.js',
    author: 'John',
    tags: ['node', 'javascript'],
    // dateは自動で生成されるので記載なし
    isPublished: true
  });

  const result = await course.save();
  console.log(result);
}

createCourse();
```
**注意**
`course`と記載がありますが、これらはサンプルです。

---

### データー取得

```javascript:index.js

// GET
async function getCourses() {
  const courses = await Course
    .find({ author: 'john', isPublished: true })
    .limit(10)
    .sort({ name: 1 })
    .select({ name: 1, tags: 1 });
  console.log(courses);
}

getCourses();

```

---
### データー更新

```javascript:index.js

async function updateCourse(id) {
  // idで、対象のコースを見つける
  const course = await Course.findById(id);
  if (!course) return;
  // Object
  course.isPublished = true;
  course.author = 'Another Author';

  const result = await course.save();
  console.log(result);
}

updateCourse('ここにMongoのObject Idを');

```
**alternative**
上のやり方とは別の方法で、アップデートすることも可能。

```javascript:index.js
async function updateCourse(id) {
  // idで、対象のコースを見つける
  const course = await Course.update(
    { _id: id },
    {
      $set: {
        author: 'Another Author',
        isPublished: false
      }
    }
  );
  console.log(course);
}

updateCourse('ここにMongoのObject Idを');
```
---
### データー削除　

```javascript:index.js
async function removeCourse(id) {
  const result = await Course.deleteOne({ _id: id });
  console.log(result);
}

removeCourse('ここにMongoのObject Idを');
```

なお`deleteOne`メソッドを使用しているがその他にも`deleteMany`など様々なメソッドがあるので、[こちらのドキュメント](https://mongoosejs.com/docs/api.html#query_Query-deleteOne)を確認の上学んでいく！

---

### 感想

MongoDBはMEAN StackやMERN Stackと呼ばれる技術セットとして使われることが多いのでチュートリアルも充実しており、学習リソースが豊富なのが学習初期のメリットだと感じました。

誤りなどありましたらぜひコメント頂けると幸いです！
tmux 初心者!! 2

##tmux使ってみた!!
前回、tmuxをインストールし初歩的なコマンドを紹介しました!!

今回は.tmux.confというファイルについてです!!

#.tmux.conf
.tmux.conf　というファイルを用意し、書き込むことで数々の設定を行うことができます!!

私のファイルの内容を以下に示しますね!!

```.tmux.conf
# スクロールアップするとコピーモードに入る
bind-key -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'select-pane -t=; copy-mode -e; send-keys -M'"

# 最後までスクロールダウンするとコピーモードを抜ける
bind-key -n WheelDownPane select-pane -t= \; send-keys -M

#プレフィックスキーの変更
set-option -g prefix C-x
unbind-key C-b
bind-key C-x send-prefix

```

##まとめ
.tmux.confというファイルによって自分なりに便利な開発環境を作ることができます!!

自分なりにアレンジしてみて下さい!!
GitHubでのリポジトリの作り方

リポジトリの作り方についての備忘録
リポジトリについては、以下のサイトを参照。
https://backlog.com/ja/git-tutorial/intro/02/

#1.リモートリポジトリの作り方

1.GitHubのサイトへアクセスする。アクセスできると以下のようなページへ行ける。
https://gyazo.com/5f47b54cf3a10d0ddb91484fea930c69

2.右上の＋マークをクリックして、「New repository」を選択する。
https://gyazo.com/5bd1a13059393f088629f319e38c8736

3.「リポジトリ名」と「リポジトリの公開・非公開の設定」を設定する。
https://gyazo.com/805dc9e83988035ffd4453ef94e7f778
リポジトリ名は、コードを保存しているファイル名などを記載する。リポジトリの公開・非公開の設定は、個人の好みによる。自分の場合は、Public（公開）に設定する。※Privateに設定すると、外部からソースコードを閲覧することができなくなる。

4.上記の情報を入力した後に、「Create repository」ボタンを押すと、リモートリポジトリの作成が完了する。以下のような、画面に移動できればokである。
https://gyazo.com/f2a23c04ea1f222233abcf4fd53c248c


#2.ローカルリポジトリの作り方

ローカルリポジトリを作成するためには、リモートリポジトリを自身のPCにクローンさせる必要がある。
クローンについては、以下のサイトを参照。
https://backlog.com/ja/git-tutorial/intro/10/


1.GitHub Desktop上でGitHubアカウントにログインする。
2.左上に[Current Repository]というタブをクリックする。
3.[Add]ボタンをクリックする。
4.[Clone Repository]をクリックする。
5.リモートリポジトリの選択する。
https://gyazo.com/f3f6bf719ea332df3bb563e10ae4b779

6.[Clone]ボタンをクリックする。
https://gyazo.com/1d2849a4a3471716c85d70c8d6178de3

＜参考記事＞
https://techacademy.jp/magazine/6235
https://qiita.com/muneo/items/1321bf8cdb21178a73e2
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　以上
Pythonは本当にコロンを多用するのか検証する

[Pythonはコードが書きやすい？ご冗談でしょう](https://tech.nikkeibp.co.jp/atcl/nxt/column/18/00682/061100007/)
という日経xTECHの釣り記事が炎上しました。特にツッコミが多かったのはこの部分

> Pythonの構文ではコロンを多用する。if文の条件の後にコロン、elseの後にコロン、繰り返し処理を行うfor文でコロン、関数を定義するdef文でコロン、クラス定義でコロン、とにかくコロンだらけだ。

いや全部複合文のコロンじゃねーか！というのはさて置き、確かにPythonではコロンを目にする機会が多いような気がしていたのでこの機会に検証したいと思います。


# 同格としてのコロン
そもそもインデントでブロックを管理するPythonに何でコロンが必要なのか？という問いには[公式のFAQ](https://docs.python.org/ja/3/faq/design.html#why-are-colons-required-for-the-if-while-def-class-statements)にこう書かれています。

>主に可読性を高めるため (実験的な ABC 言語の結果の一つ) に、コロンが必要です

更にこうとも。

>これは、英語の標準的な用法です

確かにPythonらしい理由ではあります。
つまりPythonにとってのコロンとは**前後のものを紐づける**、すなわち同格としての役割を担うものだと言っているわけですね。
そう考えると以下の用法は全てそれに則っている気がします。

## [複合文(compound statement)](https://docs.python.org/ja/3/reference/compound_stmts.html)
```python
if a == b:
    c = a + b
    print(c)
```

上記日経の釣り記事で例示されているやつです。複合文のヘッダー行につけるコロンですね。
`def`や`class`はもちろんのこと、`if`とか`for`なんかもまあ確かに「～だったら実行するのはこのブロックですよ」という意味を思えば(多少強引な感はありますが)同格っぽいです。

## [ラムダ式](https://docs.python.org/ja/3/tutorial/controlflow.html#lambda-expressions)
```python
>>> a = [1, 2, 3]
>>> list(map(lambda b: b*2, a))

[2, 4, 6]
```

ラムダ式もdefの簡易版だと思えば納得のコロンです。

## 辞書の初期化
```python
a = {
    'b': 1,
    'c': 2,
}
```
これは完全に同格ですね。

## [型アノテーション](https://www.python.org/dev/peps/pep-0526/)
```python
>>> import dataclasses
>>>
>>> @dataclasses.dataclass
... class a:
...     b: str = 'c'
...     d: int = 0
...
>>> a()

a(b='c', d=0)
```
これも完全に同格です。

# 範囲を表すコロン(？)
さて、ここまでで殆どの用例をあげられたと思うのですが、大事なものを1つ忘れています。
**スライス**です。

```python
>>> a = [1, 2, 3, 4, 5]
>>> a[1:3]

[2, 3]
```

これは完全に今までとは意味合いが異なっており、**範囲**を表します。
今までが*is*だとすればこれは*to*でしょうか。
MATLABやExcelで見ない使い方ではないですが、1つの記号に2つの意味があるのは理念的にどうなんですかね？

## 2019/6/18 追記 範囲じゃないなこれ…
[スライス表記](https://docs.python.org/ja/3/reference/expressions.html#slicings)の項目を見てたんですが、
> proper_slice ::=  [lower_bound] ":" [upper_bound] [ ":" [stride] ]

もう1個コロン繋げられますね。

```python
>>> a = [1, 2, 3, 4, 5, 6, 7, 8]
>>> a[1:7:2]

[2, 4, 6]
```
strideはstep。各項目は省略できるのでこんな書き方もできます。

```python
>>> a[::2]

[1, 3, 5, 7]
```

というわけで、スライスのコロンは範囲ではありませんでした。
英語の標準的な用法を謳うのであればこれはセミコロンじゃないかと思うのですが…

# さらに増えるよ！
Python 3.8から新しい演算子が登場します。その名も**[walrus operator](https://docs.python.org/ja/3.9/whatsnew/3.8.html#assignment-expressions)**。
walrusってなんだろうと思って辞書ひいたらセイウチらしいんですけど、何故なんでしょう…セイウチ演算子…
> コメントで横から見るとセイウチの顔になると教えていただきました(:=

```python
if (n := len(a)) > 10:
    print(f"List is too long ({n} elements, expected <= 10)")
```
要は式の中で代入できるよってことらしいです。
`:=`は確かによく代入で使われる記号ですし分からんでもない。しかし結果としてまたコロンが増えました。

# 検証結果

「**Pythonの構文ではコロンを多用する**が、複合文のコロンはエディタに補完してもらえ」
抜け漏れがあれば教えてください。
numpy を Window 10 + Maya 2018 にインストールする

漢なら!! numpy や機械学習ライブラリを Windows の Maya 2018 で動かしたいですね!

やりましょう!

## 環境

* Windows 10 64bit
* Maya 2018u6
  * python2.7
* `C:\Python27` に python2.7 環境をインストール済み
* ユーザディレクトリにインストールする(管理者権限を使わない)

### 追加要件

Visual Studio 2017 あたりのインストール(or MSVC ランタイムのインストール)が必要になるかもしれません.

## 参考情報

[GUIDE] How to install numpy+scipy in Maya Windows 64 bit
https://forums.cgsociety.org/t/guide-how-to-install-numpy-scipy-in-maya-windows-64-bit/1715924

Maya & MotionBuilder向け numpy & scipy & scikit-learn環境構築
https://mukai-lab.org/library/mayanumpy/

Numpy 1.13.1 + Scipy 0.19.1 for Maya 2018
https://forums.autodesk.com/t5/maya-programming/numpy-1-13-1-scipy-0-19-1-for-maya-2018/td-p/7362541

## Install

pip で入る numpy だとクラッシュするので(Cython あたりのパッケージが足りないだけかも?), mayapy でビルドしたほうが安全ですね.

ただビルドするのは面倒なので, ここでは, 上記 

https://forums.autodesk.com/t5/maya-programming/numpy-1-13-1-scipy-0-19-1-for-maya-2018/td-p/7362541

にある prebuilt package をありがたく使わせていただきましょう.

まず numpy wheel ファイルを落とします.

python の仕組み上, パスがどこかに通っていれば import できるはずなので, `C:¥Program Files...` の Maya の python フォルダでは無く, ユーザフォルダにインストールすることにします.

`C:\Users\syoyo\local\python2`

にインストールするものとします.

pip で展開します(wheel 自体は zip ファイルっぽいので unzip でもいけるかも).

```
> cd C:\Users\syoyo\local\python2
> pip install -t . /path/to/numpy.whl
```

`-t .` で pip の install 先を変えることができます.

あとは `C:\Users\syoyo\local\python2` を `Maya.env` あたりで `PYTHONPATH` に追加します.


```
PYTHONPATH=C:\Users\syoyo\local\python2:%PYTHONPATH%
```

これで次回 Maya 2018 を起動すると, `import numpy` で numpy が使えるようになります!

Happy numpy scripting!

## 機械学習は..?

残念ながら昨今の TensorFlow(r.13~ or 2.0)では, python 2.7 の prebuilt package は Windows にはありません. Pytorch にもありません.

基本的には機械学習ライブラリを Mayapy(python2.7) で使うのはあきらめましょう.

mayapy から numpy でデータを抽出し, 別の python3 環境で構築した tensorflow or pytorch などと RPC 通信するなどの手が考えられます.

Python3の標準モジュールで完結するRPC
https://qiita.com/nardtree/items/d7458eab839a6500a60a

multiprocessing, python2 でも動くはず...?
むりっぽそうなら JSON-RPC + http or websocket を考えてみましょう.

それでもなんとかしたい場合は...

https://github.com/fo40225/tensorflow-windows-wheel

この辺りから `r1.10` の tensorflow を利用を考えてみましょう.
=> しかし numpy version 違いや, protobuf の問題などで動かないことがわかりました.

もしくは, plaidml(Keras 経由で利用)ですとまだまだ python2.7 で動くようです.

https://github.com/plaidml/plaidml/blob/master/docs/install.rst#windows

## TODO

* ソースからビルドする.
* mayapy の pip で, 普通の numpy パッケージをインストールして利用できるか検証する
* 優秀な Maya + 機械学習若人さまが, **人類史上最速で優秀な Windows Maya + 機械学習若人さまへと昇華なされるスキーム**を確立する旅に出たい.
初めてのユニバーサルリンク(Universal Links)

# 前提

- 独自ドメインでSSL対応済みのウェブサイトを持っている。

# 工程

## JSONファイルをサーバに配置する

ファイル名は `apple-app-site-association` とし、拡張子は付けない。
これをドキュメントルートに配置する。

条件としてこのファイルにリダイレクトなしで下記URL構成でアクセス出来なければならない。
`https://foo.com/apple-app-site-association`

### コケ①

とあるパス配下ではダメだった。
`https://foo.com/path/to/project` に配置するもユニバーサルリンク動作せず。

---

基本的な中身は以下
`{TeamID}` はiOS DeveloperCenterから確認できる英数10桁のアレ。
`{BundleID}` は言わずもがななアレ。

```json:apple-app-site-association
{
  "applinks": {
    "apps": [],
    "details": [
      {
        "appID":"{TeamID}.{BundleID}",
        "paths":[ "*" ]
      }
    ]
  }
}
```


## MIMEタイプを `application/json` にする

`$ curl -v https://foo.com/apple-app-site-association` で叩いたときに `Content-Type: application/json` で返ってこないとイケない。

### 最終的に `.htaccess` + `ForceType` でMIMEを変更

同じドキュメントルートに `.htaccess` を設置し、以下を記載。

```:.htaccess
<Files apple-app-site-association>
    ForceType application/json
</Files>
```

### コケ②

`httpd.conf` で `AddType` を使用してみた。
`AddType` は拡張子指定するものなのでファイル指定は出来ず、cURL結果は変わらなかった。

```:httpd.conf
:
AddType application/json apple-app-site-association
:
```

### コケ③

`.htaccess` + `DefaultType` を使用してみた。
残念ながらcURL結果は変わらなかった:thinking:

```:.htaccess
<Files apple-app-site-association>
    DefaultType application/json
</Files>
```

---

設置した上記ファイルをcURLで叩いてみる。
こうなれば成功。

```
$ curl -v https://foo.com/apple-app-site-association
:
略
:
< Content-Type: application/json
<
{
  "applinks": {
    "apps": [],
    "details": [
      {
        "appID":"{TeamID}.{BundleID}",
        "paths":[ "*" ]
      }
    ]
  }
}
```

## `Capabilities` の変更

Xcodeから
`Capabilities` > `Associated Domains` をONにし、 `applinks:foo.com` を追加。

<img width="738" alt="universal_links_attachments_00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85825/151f6e10-a5cc-2dc1-d7a3-a12bdffd964d.png">

## 実機ビルドで動作確認

![universal_links_attachments_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85825/16bd21d0-7bd4-98ca-4350-ec5626148a84.png)

SlackにURLを送って、Slackアプリからリンクを踏んでみると、無事アプリが起動。
ユニバーサルリンク童貞卒業。

ちなみに、SafariでURLを直打ちするとアプリは起動せず、ページ上部にAppStoreへのリンクが出てくるようになった。

![universal_links_attachments_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85825/22612b7e-7906-811d-0ec4-e374a1222d87.png)
SynchroidのDeviceAutomation でのループの方法

#何をしたいか

SynchroidのDAでメールサービスの件名を一つずつループ処理を使って取得したい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/8f41542b-547e-1c70-e0d5-413a3c6e8901.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/6a402002-a400-1b79-4fe2-6f4dfb788582.png)

一つずつもちゃんと掴めるし、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/74ab7818-d875-ae72-ca56-af3a04f792d4.png)

行としても掴めるし、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/67316134-2c1f-71da-cb2f-9aa30860db1e.png)

全体の表としても掴める。



この状態であれば、ループ処理なんて　簡単　　　と思っていましたが、実際はDSとは違い　甘いものではありませんでした。。


DSとはまた違う、DAでのループ処理をご紹介します。


#Each for Loop内の記入方法


DAでのループ処理をする際の範囲を指定するときに大事になってくるのが、


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/1901bfdc-3c88-5ab3-32c8-db95b4ea7c48.png)


この、「Component」と「Element Selector」

この指定がうまくいかないと、ループ処理が出来ないままになってしまいます。

今はそれぞれ、ループを作成した直後の状態です。
Element Selectorには　「*」が入っています。


今回、ループ処理をさせたい大元の場所は、全体の表です。

そこの中にある行を指定し、その行を１行ずつループさせたいわけです。

今回のケースの場合、３行ですので、各行の要素を見ていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/0de6ded3-2608-11c3-0f6d-b0c1227f8b3a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/1d65602e-ab62-c5c3-8270-e19f317da9b0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/277123d8-5cf1-c35c-50a6-0a81fea4b2c9.png)

３行に共通している内容として、
[isEnabled="true"]　や  [isKeyboardFocusable = "true"]　があるかと思います。

今回は、
[isEnabled="true"] を　使いたいと思います。





Component　には、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/adaa70da-9a57-15e1-9f43-68e1f5671327.png)

全体を包括している「表」を記入。

Element Selectorには >[isEnabled="true"]　と記載。
(Element Selectorに記入した「＞」は、　「表」の中の[isEnabled="true"]を指定しているという意味です)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/30d37fa6-8003-6115-84f5-4b87de714802.png)

このようになります。


こうすることで、ループさせたい場所を特定し、ループすることが出来ます。


あとは、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/7101943e-484b-8f49-fded-7b75991e22e4.png)

For Each Loopの中に値を抽出するステップを挿入してあげれば、件名を取得することが出来ます。


DSと違ってDAはいろいろと難しい..
ローカルにDockerレジストリを立てる

ローカルにDockerレジストリを立てることが何度かあって忘れそうなので、メモです。

## 1. 適当なイメージをプル
```
$ docker pull debian:stable-slim
```
## 2. プルしたイメージにタグをつける
```
$ docker tag debian:stable-slim localhost:5000/takuya/hogehoge:test
```
## 3. レジストリのコンテナを起動する
```
$ docker run -d -p 5000:5000 --restart always --name registry registry:2
```
## 4. プッシュする
```
$ docker push localhost:5000/takuya/hogehoge:test
```

## 5. プッシュされたか確認
[http://localhost:5000/v2/_catalog](http://localhost:5000/v2/_catalog) にアクセスすると登録されたか確認できる

タグの一覧を確認する場合は、次のURLで確認。

```
http://localhost:5000/v2/<レポジトリ名>/tags/list
```

今回の場合は、
[http://localhost:5000/v2/takuya/hogehoge/tags/list](http://localhost:5000/v2/takuya/hogehoge/tags/list) へアクセスする。
GemのLetter Openerで表示したHTMLメールを実際のメーラーで確認する方法

以下、力業な気がして仕方がないです。
もっと楽な方法があるはず。きっと。

とりあえず確認することはできたので備忘録としてのメモです。

ちなみにsafariを使ってるのでmacでの方法となります。
ThunderbirdとかつかえばOSに限らず、確認できるのかも（未確認）

1. Letter Openerで表示する
2. 本文をコピー
3. HTMLファイルをローカルに保存
4. safariで開いてメールを送信

## Letter Openerで表示する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37883/844a998b-acca-8b69-45dc-78fd56ac6862.png)

## 本文をコピー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37883/ac8b0bf5-5829-c5fc-83ac-50f99eeb1d3f.png)

1. Chromeの「検証」で右の画面を開く
2. メール本文のhtmlタグで右クリック→「Edit as HTML」を選択
3. html編集画面に表示されたコードをすべて選択してコピー

## HTMLファイルをローカルに保存
適当なエディタで、先ほどコピーしたものをペーストして、拡張子をhtmlにして保存

## safariで開いてメールを送信
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37883/9b283d3d-87ef-2059-dd7a-31c7bf697a64.png)

1. 先ほど保存したファイルを、safariで開く
2. 「ファイル」→「共有」→「このページへのリンクをメールで送信」
3. macのメールappが立ち上がってメール作成画面になるので、確認したいメーラーで受信できるメアドに送信
PayaraサーバーのデフォルトWebモジュールを指定する

# いきさつ
開発してたアプリのドメイン\(https://app.hogehoge.jp/ みたいな)にアクセスしたら思いっきりPayaraのデフォルト画面が出ちゃっておりました。
※こんなの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246099/4e9d496c-6bb9-652e-dd63-8e6246c7b01b.png)
開発中はhttps://app.hogehoge.jp/HogeApp/start.xhtml といった画面がスタートだったのでそこばかりアクセスしてて気づいてませんでした。
これだとドメイン直でアクセスできないし、APサーバ何使ってるか丸わかりなので直しました。
最初ドキュメントルートのindex.xhtmlを単純に上書きしたのですがインスタンスを再起動すると元に戻ってしまったので方向性を変えました。
修正箇所は2か所。

- Payaraコンソールからデフォルトモジュールを設定

- アプリ側のweb.xmlでウェルカムページを設定

## Payaraコンソールからデフォルトモジュールを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246099/df3cc944-95e6-b0f6-1fe0-0d2a7d160a09.png)

構成-仮想サーバ-serverと辿るとデフォルトWebモジュールの設定箇所があるのでデプロイしているアプリを選択。

## アプリ側のweb.xmlでウェルカムページを設定
web-appの中に設定を追加します。

```web.xml
<welcome-file-list>
	<welcome-file>start.xhtml</welcome-file>
</welcome-file-list>
```

修正したアプリを再デプロイして完了です。
vlookup関数の文字列上限について

# Vlookup関数

vlookup関数を検索などでよく使うけど、
本日は、初めて分かったことは、検索文字列の長さの上限があります。

普通はvlook()関数は以下のように書きます。

```
=vlookup(検索クエリ値, 検索範囲, 返り値の列位置, 完全一致するかどうかのFlag)

```

クエリは256文字以上なら、#VALUE!が返ってきます。

こちらはどうしてもプログラムではなくEXCELにこだわったことがあり、かつ長い文字列の比較をしたかったので、
いろいろ工夫をしましたが、

後で分かったことはこれは既知の問題であり、
解決してくれた方は以下の内容を書いています。
ほかの方は同様な問題がある場合、こちらを参考したほうが良いと思います。


https://excel-ubara.com/excel3/EXCEL013.html
pry-rails+hirb+hirb-unicode-steakknifeを動かす為のアレコレ

# 環境
- rails 5.2.2
- ruby 2.5.5

# Gemfileと.pryrc
```ruby:Gemfile
group :development, :test do
  # なんか色々〜
  gem 'pry-rails'
  gem 'pry-byebug'
  gem 'pry-doc'
  gem 'hirb'
  # 本家hirb-unicodeは依存のunicode-display_widthが古く他のgemと相性が悪い
  gem 'hirb-unicode-steakknife'
end
```
```ruby:.pryrc
begin
  require 'hirb'
  # これが無いとdisplay_widthが無くてエラー
  require 'unicode/display_width/string_ext'
  # これもrequireしないと勝手には反応しない
  require 'hirb-unicode'
rescue LoadError
  # hirbがrequireできないでござる
end

if defined? Hirb
  Hirb::View.instance_eval do
    def enable_output_method
      @output_method = true
      @old_print = Pry.config.print
      Pry.config.print = proc do |*args|
        Hirb::View.view_or_page_output(args[1]) || @old_print.call(*args)
      end
    end

    def disable_output_method
      Pry.config.print = @old_print
      @output_method = nil
    end
  end

  # hirbをオフにしたい時はHirb.disableする
  Hirb.enable
end
```
こんな感じ

# 参考
https://ruby-rails.hatenadiary.com/entry/20141024/1414160189
https://github.com/steakknife/hirb-unicode/blob/master/lib/hirb/unicode/string_util.rb#L5
https://github.com/janlelis/unicode-display_width#usage-with-string-extension

# 最後に
もっといい書き方あったら教えてちょ
極限値と微分係数

#極限
数列または関数がある値に近づくとき、その値を「数列の極限」または「関数の極限」といいます。主に微分で使うのは「関数の極限」になります。
##関数の極限
###定義
関数f(x)において、xがaと異なる値を取りながらaに限りなく近づくとき、f(x)がある一定の値bに限りなく近づく場合、

```math
\lim_{x \to a}f(x) = b \\
```
と書き、xがaに限りなく近づくときのf(x)の極限値はbであるといいます。
###考え方
例として、f(x)=2x+1において$lim\_{x→1}f(x)$がいくつになるか考えてみましょう。
例えば、xを0.9からスタートして、0.99,0.999,0.9999,…と1に近づけていくと

```math
f(0.9) = 2 × 0.9 + 1 = 2.8  \\
f(0.99) = 2 × 0.99 + 1 = 2.98 \\ 
f(0.999) = 2 × 0.999 + 1 = 2.998 \\ 
f(0.9999) = 2 × 0.9999 + 1 = 2.9998 \\ 
```

となり、f(x)の値は3に近づいていくことが分かります。
**多項式の極限値は、関数値（単に値を代入したもの）と等しくなります。**

###例題
次の極限値を求めなさい。(+0：xが0よりも大きい値を取りながら0に近づく)

```math
\lim_{x \to +0} \frac{1}{x} 
```
次の図はy=1/xのグラフです。
![極限.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418320/c3a7cc81-9fba-d488-54d8-ff6011ef2e8a.jpeg)





この図から、以下のことが分かります。

```math
\lim_{x \to +0} \frac{1}{x}　= \infty \\
\lim_{x \to -0} \frac{1}{x}　= -\infty \\
\lim_{x \to +\infty} \frac{1}{x}　= 0 \\
\lim_{x \to -\infty} \frac{1}{x}　= 0 \\
```

###練習問題

```math
1.　\lim_{x \to 3} (x^2 + 2x -3) \\
2.　\lim_{x \to 1} \frac{x^2 -3x +2}{x-1}　\\
3.　\lim_{x \to 0} \frac{x^2-2x}{x} \\
4.　\lim_{x \to +\infty} \frac{2}{x-1}\\
```



<font color ="white">
$$1.　\lim_{x \to 3} (x^2 + 2x -3) = (3^2 + 2×3 -3) = 12$$ 
$$2.　\lim_{x \to 1} \frac{x^2 -3x +2}{x-1} = \lim_{x \to 1}\frac{(x-2)(x-1)}{x-1} = \lim_{x \to 1}(x-2) = -1$$
$$3.　\lim_{x \to 0} \frac{x^2-2x}{x} = \lim_{x \to 0} (x -2) = -2$$
$$4.　\lim_{x \to +\infty} \frac{2}{x-1} = 0$$
</font>

#微分係数
区間を狭くしていったときの平均変化率（傾き）の値のことを、微分係数をいいます。
##定義
関数 y = f(x) の x = a における微分係数を f’(a) で表わし，次の式で定義します。

```math
1.　f'(a)=\lim_{b \to a} \frac{f(b) -f(a)}{b-a} \\
2.　f'(a)=\lim_{h \to 0} \frac{f(a+h) -f(a)}{h}　\\
```

##平均変化率
下の図にように、関数f(x)のxの値が、aからbに変化したとき、f(x)の変化量をxの増加量b-aで割ったものを平均変化率といい、**直線PQの傾きになります**。この平均変化率(傾き)を式で表すと、

```math
\frac{f(b) -f(a)}{b-a} \\
```

となります。
![微分係数.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418320/bd6a0cc1-e7f9-cc0c-45ee-a48eed688a54.jpeg)

##微分係数
微分係数とは、区間を狭くしていったときの平均変化率（傾き）の値のことをいいます。つまり、x = aでの微分係数は、bをaに限りなく近づけたものなので、

```math
f'(a)=\lim_{b \to a} \frac{f(b) -f(a)}{b-a} \\
```
が微分係数となります。

また、「bをaに近づける」ではなく「b-aを0に近づける」と考えることできます。差を0に近づけることと同じなので、h=b-aとすると、b=a+hとなり、

```math
f'(a)=\lim_{h \to 0} \frac{f(a+h) -f(a)}{h} \\
```
のように変形できます。どちらも同じ意味の式ですが、こちらが使われることが多いです。

##例題
f(x)=x^2のx=-1での微分係数を求めよ。

微分係数は

```math
\begin{align}
f'(-1)&=\lim_{h \to 0} \frac{(-1+h)^2 - (-1)^2}{h} \\
&=\lim_{h \to 0} \frac{(1-2h+h^2) - (-1)^2}{h}\\
&=\lim_{h \to 0} \frac{-2h+h^2}{h}\\
&=\lim_{h \to 0} (-2+h)\\
&=-2
\end{align}
```
と求められます。

##練習問題
1.f(x)=x^2のとき、f'(3)を求めなさい。
2.f(x)=x^2-xのとき、f'(a)を求めなさい。

<font color ="white">
$$1.　f'(3)=\lim_{h \to 0} \frac{f(3+h)-f(3)}{h} =\lim_{h \to 0} \frac{(3+h)^2-3^2}{h}=\lim_{h \to 0} \frac{6h+h^2}{h}=\lim_{h \to 0} (6+h)=6$$ 
</font>
<font color ="white">
$$2.　f'(a)=\lim_{h \to 0} \frac{f(a+h)-f(a)}{h} 
=\lim_{h \to 0} \frac{{(a+h)^2-(a+h)}-(a^2-a)}{h}
=\lim_{h \to 0} \frac{{(a^2+2ah+h^2)-(a+h)}-(a^2-a)}{h}
=\lim_{h \to 0} \frac{2ah-h+h^2}{h}
=\lim_{h \to 0} {2a-1+h}
=2a-1
$$
</font>
UnityでInstantiateしたにもかかわらずParentが無いと言われる場合

#背景・エラー文

`Setting the parent of a transform which resides in a prefab is disabled to prevent data corruption`
あるオブジェクトを`SetParent`したいが、`SetParent`する親が無いと言われる。インスペクタ上では親オブジェクトが存在する。

#原因

親オブジェクトは`DontDestroyOnLoad`でないにもかかわらず、`SetParent`で子にしたいオブジェクトは`DontDestroyOnLoad`だった。
親オブジェクトをInstantiateする際に、`DontDestroyOnLoad`をつけてインスタンス化する。
Amazon Linux2でABEJA Platform CLIをインストール

## 概要
ABEJA Platformは、データの蓄積・アノテーション・学習・デプロイ・再学習と機械学習に必要となる全ての面倒なプロセスを実行する基盤で、これらのインフラを用意する必要がなく、エンジニアの方が開発に専念できるように設計、提供されています。学習した結果をWebAPIとしてデプロイすることで、様々な用途に利用できます。

[ABEJA Platform](https://abejainc.com/platform/)

今回はAmazon Linux2環境でABEJA Platformを利用頂く場合の初期設定をご紹介します。

##### ※Platform CLIはMac,Linuxのみ対応しています。Windowsについては、対象外となっております。Pythonは3.5以降をご利用ください。

## Amazon Linux2でPlatformコマンドを利用したい場合 (Platform CLI)
Amazon Linux2で以下のコマンドを入力

```
$ sudo yum update 
```

#### Dockerをインストール
```
$ sudo yum install docker
```

#### Dockerが正しくインストールされていることを確認
```
$ docker --version
Docker version 18.06.1-ce, build e68fc7a215d7133c34aa18e3b72b4a21fd0c6136
```

#### Platform CLIはPython3.5以降が必要のため、Python3をインストール

```
$ sudo yum install python3
```
#### Python3が正しくインストールされていることを確認

```
$ python3 --version
Python 3.7.3
```

### pipコマンドでPlatform CLIをインストール
```
$ curl -s https://packagecloud.io/install/repositories/abeja/platform-public/script.python.sh | bash
$ pip3.7 install abejacli --user
```
### Platform CLIが正しくインストールされていることを確認
```
$ abeja --version
v0.10.2
```

## 初期設定
CLIを使用する前に、ABEJA Platformの認証情報を設定する必要があります。

#### 初期設定コマンド
```
$ abeja config init
```
設定に必要な情報はこちらを参考に設定

[Platform CLIドキュメント(INIT)](https://developers.abeja.io/cli/configuration-command/init/)

これでAmazon Linux2でABEJA Platformが利用可能となりました。
GPUインスタンスを使ってABEJA Platformと連携して学習も実施できます。

ABEJA Platformでは、Forumもありますので、是非みなさんご活用ください！
[ABEJA Platformフォーラム](https://forums.abeja.io/)
linear simple regression with R

> x=c(seq(1,20,by=1))
> b0=-1
> b1=2
> e=rnorm(20,mean=0,sd=2)
> y=b0+b1*x+e
> lm(y~x)

Call:
lm(formula = y ~ x)

Coefficients:
(Intercept)            x  
     -1.908        2.039  



![Rplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438188/8f1b0c79-2eb6-5af8-0fa2-04bec2d38fb9.png)
新しいGPUで古いverの深層学習フレームワークのコードを動かす際の注意点

#はじめに
深層学習界隈は時の進みが異常に早くて，一年前のコードが今のフレームワークで動かないことがザラにある．

#ハマった例
手元にNvidiaのRTX 2080 Ti 及び GTX 1080 Tiがある環境で，下記のコードを動かすことを考える．

[mil-tokyo/bc_learning_sound](https://github.com/mil-tokyo/bc_learning_sound)

SetUpの項目に次のように書いてある．

>Install Chainer v1.24 on a machine with CUDA GPU.

それならばと思ってchainerの[dockerhub](https://hub.docker.com/r/chainer/chainer/)へ飛び，v1.24.0をpullする．

ところが，そのままだと次のエラーが出てプログラムが終了する．

>nvcc fatal : Value ‘sm_75’ is not defined for option ‘gpu-architecture’

GTX 1080 Tiに切り替えても同様のエラーが生じる．

>nvcc fatal : Value ‘sm_61’ is not defined for option ‘gpu-architecture’

#原因は何か？
GPUが新しすぎるため，CUDAが対応していないためだった．
sm_(num)は，GPUのアーキテクチャの番号を表しており，[ここ](https://arnon.dk/matching-sm-architectures-arch-and-gencode-for-various-nvidia-cards/)に詳細が載っている．

chainerのtag:v1.24.0の環境では，CUDAのバージョンが7.5だったが，GTX 1080 TiはCUDA 8 から，RTX 2080 Tiに至ってはCUDA 10以降でないとCUDAが使えない．

#解決策
[公式GitHub](https://github.com/chainer/chainer)に転がっているDockerfileを拝借し，cuda 8.0に書き換えてbuildした

```bash:Dockerfile
FROM nvidia/cuda:8.0-cudnn5-devel
RUN apt-get update -y && \
    apt-get install -y --no-install-recommends \
    python3-dev \
    python3-pip \
    python3-wheel \
    git \
    cmake \
    libblas3 \
    python3-setuptools && \
    rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/*
RUN pip3 install chainer==1.24.0
```

#おわりに
公式イメージだけだとどうしても限界があるので，自前でどんどんbuildしようね．
超初心者が受けるJS社内勉強会：第2回

##前回のおさらい
文字列は`' '`か、`" "`で括る

#今回は「型」のお話し
**型は値の種類。：文字列、数字、数値**
型？もう言葉の意味がよくわからんっ!!てなったので調べたが、結局よくわからなかったので、あまり言葉の意味は気にしないことにした。

### <font color="Crimson">数値（Number）</font>
0,1,2,3,.....,-1,-2,-3,.....
例えば、こんな風に。
`int = 2019;`
`int = -9999;`

####変数の中身は、最後に代入された値で上書きされる
a = 1
b = 2
a = 5
a + b = 6

数学的な意味はなく、左は箱で、単なるいれもの。右が値となり、基本的に下に書いたものに上書きされる。

###<font color="Crimson">文字列（String）</font>
`'文字列'` 、`" "`、ダブルクオートでもOK。

###<font color="Crimson">論理値（Boolean）</font>
`true` か `false` のどちらかしかない

###<font color="Crimson">配列（Array）</font>
箱が連なったもの。**0から始まる。**
`arr[0] = 3`  ※0番目の箱に3を代入、という意味
`arr = [];` //空の配列


###<font color="Crimson">2次元配列（配列に配列をいれたもの）</font>
```js:例
arr = [
		[ 1,2,3 ]　//※0の中身
		[ ‘あああ’ ,’いいい’ ]　//※1の中身
		[ ]　//※2の中身。空の配列の場合
];
```
- 0,1,2という連なった`arr`という箱がある
- 連なるためには`,`（カンマ）で区切らなければならない
- 最後はカンマは必要ない

カラーボックスのようなイメージ。カンマは留め具。

<img width="300" alt="IMG_0001.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269200/7b0dec4d-a084-9078-4f04-214184085047.png">


###<font color="Crimson">オブジェクト（Object）</font>
`obj = {‘name’ : ’Tom Cruise’ , ‘type’ : ’human’ , ’job’ : ’actor’}`
`obj = {name : ’Tom Cruise’ , type : ’human’ , job : ’actor’} `　※プロパティは`' '`で囲まないでもいける
`obj = {};` //空のオブジェクト

- `name`のことをプロパティとよぶ。（nameの中にTom Cruiseが入ってる）。
- プロパティは自分で決められる
- `Obj.name` (`Obj[‘name’]`)はできるが、逆はできない　Obj.type

※**予約語**の場合、`' '` などで括らないと使えない。


<img width="300" alt="IMG_0002.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269200/5921d129-4a67-6930-2be0-eaa2f1210635.png">

objectは、それを表すために必要な情報。名刺のようなもの、と理解した。

##その他、それぞれの箱の概念。
- arrayはindex、objectはproperty

:pig_nose:

[超初心者が受けるJS社内勉強会：第3回](https://qiita.com/m_hamada/items/2b2f4d26146f4392ecc9) →
Accsess使い方

#インポートマクロ
テーブル枠を作る
テーブルごとにインポート定義を行う
　テーブル右クリック「テキストエクスポートウィザード」
　設定
　定義
　インポート・エクスポート設定
マクロに記載
"""
'------------------------------------------------------------
' 個票データ_集計用のインポートマクロ
'------------------------------------------------------------

Function インポート()
On Error GoTo インポート_Err
    DoCmd.TransferText acImportDelim, "jyouritu", "jyouritu", h_Save & "jyouritu.csv", True, ""


"""

といった感じ
モーダルウィンドウの作成！（購入確認）

## モーダルウィンドウってなに？？？

モーダルとは「モードを持つ」という意味で、「あなたがこのウィンドウを閉じるまでなにもさせません」というウィンドウのことです。



(ふむふむ、ではどのような時に活用されるの？):crying_cat_face:

モーダルウィンドウはユーザーに***重要な操作や確認***を促したりするときに用いられることが多いです！
また、モーダルウィンドウは「JavaScript」で作られることが多いです。

(なるほど！概要はわかったから早速実装に入りたいにゃー）:smiley_cat:

## 今回の完成品

<img width="723" alt="f59432d5e314c239f115e696a5663c2d.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438981/6be56828-21e4-dbbb-b9cf-3a2a115c3a66.png">

ユーザーは、赤い購入ボタンを押すと、このように確認モーダルウィンドウが表示されます。
2段階表示にすることで、意図しないで購入ボタンを押してしまった時の誤作動を避けられることができます！

## 前提条件
既にコントローラーなどでボタンやリンクを押せばデータが購入される機能を
ページ上に既に実装されていることが前提です。

## サンプルコード(index.html.haml)

```haml:index.html.haml
%button#buy-button  購入する
              = link_to "", "/purchase/pay/items/#{@item.id}", method: :post, id: 'item-purchase-btn'
              #buy-overlay
                #buy-modalWindow
                  .buy-modal-message-box
                    %div 確認
                    %div 本当に購入しますか？
                  %button#buy-modal-close-btn キャンセル
                  %button#purchase-comformation-btn 購入する
```

 #buy-overlay以下が、モダールウィンドウの記述となります。
 モーダルウィンドウを表示させるためのボタンの下に記述していくことがポイントです！

## サンプルコード(purchase.scss)

```scss:purchase.scss
#buy-overlay {
  width: 100%;
  height: 100%;
  position: fixed;
  top: 0;
  left: 0;
  background: rgba(0, 0, 0, 0.3);
  display: none;
  z-index: 1;
}

#buy-modalWindow {
  width: 500px;
  height: 200px;
  position: absolute;
  top: 20%;
  left: 50%;
  transform: translate(-50%, -50%);
  background-color: white;
  z-index: 2;
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  .buy-modal-message-box {
    width: 100%;
    height: calc(100% - 60px);
    text-align: center;
    display: flex;
    flex-direction: column;
    justify-content: space-around;
  }
  #buy-modal-close-btn {
    width: 50%;
    height: 60px;
  }
  #purchase-comformation-btn {
    width: 50%;
    height: 60px;
  }
}

#item-purchase-btn {
  width: 0;
  height: 0;
  margin: 0;
  padding: 0;
  border: 0;
}
```
こちらはお好みで設定してください！

## サンプルコード（modal.js)

```javascript:modal.js
document.addEventListener(
  "DOMContentLoaded", e => {
    let modal_open = document.getElementById("buy-button");
    modal_open.onclick = function (e) {
      e.preventDefault(); 
      $('#buy-overlay').fadeIn();
      document.getElementById('buy-modal-close-btn').onclick = function () {
        $('#buy-overlay').fadeOut();
      };
      document.getElementById("purchase-comformation-btn").onclick = function (e) {
        e.preventDefault(); 
        document.getElementById("item-purchase-btn").click();
      };
    };
  },
  false
);
```
赤いボタンが押された時に、モダールウィンドウがフェードインされ、
モーダルウィンドウのキャンセルボタンが押された時に、モーダルウィンドウがフェードアウトされるように設定しています！

そしてモーダルウィンドウの購入ボタンが押された時に、link_toが発火されるように設定しました！

---

以上で設定は完了となります！

かなり省きながらの説明になりましたので、ご不明な点ございましたらご気軽にコメントお願いします！

ご静聴ありがとうございました！:relaxed:
Chrome でも favicon に SVG を

## 追記（2020/2/21）

2020 年 2 月に Chrome 80 がリリースされ、それ以降であれば SVG favicon にも対応しました！
ダークモード時のスタイル適用にも対応しているようです（ダークモードでは背景色が違うので地味にうれしい機能）。これで Javascript を使ってまで無理やりな SVG favicon 化する必要はなくなりましたが、以前はこんな裏技もあったんよ、ということで記事はそのまま残しておきます。

…とは言うものの、いまだ favicon に SVG アニメーションは使えないようです。それを Javascript を用いて動的に切り替え、動画 favicon（厳密にはパラパラアニメ風）を実現するトリックとしてはまだ使えるようです。


#### 参考サイト
- <https://www.webcreatorbox.com/tech/svg-favicon>
- <http://lab.ejci.net/favico.js/>


## 以下、元記事

どういう理由はわからないが、Chrome では SVG ファイルをそのまま favicon に指定することができない。

```html
<link rel="shortcut icon" type="image/svg+xml" sizes="any" href="/favicon.svg" />
```

こんな感じで設定したいのに、なぜかそれができない。Firefox は上のコードで問題ない
普通は素直に Photoshop や GIMP、ImageMagick 等を使って ico ファイルへ変換して対応するのだが、それでも無理やり SVG のまま設定したいって人は以下のとおりにすれば良い。

```html
<script>
var img = new Image();
img.src = '/favicon.svg';
img.onload = function () {
  var canvas = document.createElement('canvas');
  canvas.width = this.width;
  canvas.height = this.height;
  canvas.getContext('2d').drawImage(img, 0, 0);
  var link = document.createElement('link');
  link.type = 'image/png';
  link.rel = 'shortcut icon';
  link.href = canvas.toDataURL('image/png');
  document.getElementsByTagName('head')[0].appendChild(link);
}
</script>
```

残念ながら Safari や IE・Edge はこの方法でも通用しないようだ…


#### 【参考】各ブラウザの対応状況

<https://caniuse.com/#feat=link-icon-svg>
Golangのスライスのリフレクションについて

```golang
package main

import (
	"fmt"
	"reflect"
)

// 基本型（Bool, String, すべての数値）
// 合成型（Struct, Array）
// 参照型（Chan, Func, Ptr, Slice, Map, Interface{}）
// その他（reflect.Valueのゼロ値, 全く値ではないという意味の Invalid）

// .Elem()は、ポインタ型のとき実体を返す。また、ポインタ型のreflect.valueのみ、値をセットできる。
// .Interface()は、interfece{}の値を返します。

func main() {
	type Foo struct {
		Name string `json:"name" bson:"name"`
	}

	arr := []Foo{}                      // 空のスライスを作成
	arr = append(arr, Foo{Name: "aaa"}) // 空のスライスに構造体を１個追加

	// ------------------------------ ここまで普通。

	// リフレクション型の状態で操作できるようにポインタを渡す。
	// この時点でデリファレンスしているため、最後に戻すときにはデリファレンスは必要ない。
	s := reflect.ValueOf(&arr).Elem()
	fmt.Println(s.CanAddr(), s.CanSet()) // true true

	rv := reflect.New(reflect.TypeOf(Foo{})) // reflect.Newの場合は、ポインタ型で作成される、最初から辿れるしセットもできる
	fmt.Println(rv)                          // &{}
	rve := rv.Elem()                         // {} デリファレンス
	fmt.Println(rv.CanAddr(), rv.CanSet())   // true true
	// rve.Field(0).SetString("eee")                   // OK
	// rve.Field(0).Set(reflect.ValueOf("eee"))        // OK
	rve.FieldByName("Name").SetString("bbb")
	s.Set(reflect.Append(s, rve))                                       // OK
	s.Set(reflect.Append(s, reflect.ValueOf(&Foo{Name: "ccc"}).Elem())) // OK

	// リフレクション型からinterface{}型にして、型アサーションで元の型に戻す
	px := s.Interface().([]Foo)
	fmt.Println(px)
}
```

書いてある通りですが、.Elemやるとデリファレンスとか、かなり分かりづらかったです。

[前回の記事](https://qiita.com/daijinload/items/e9b6b2720b45583b65ef)の黒魔術コードがわかるようになりました＾＾
全ファイルをGitHubで更新する方法

# 全ファイルをGitHubで更新する方法
勉強始めたての頃は自分のローカル環境にソースコードを保存してたのでGitHubを使うことなくて気にしてなかったのですが、チーム開発を始めた時に「GitHub 更新」ってググっても出てこず「？」となりました。
要はコミットしてプッシュすることを更新と認識してたからそもそもの認識間違い。
特に全ファイル対象にする場合は以下のようにするとできたので自分の備忘録としてメモします。

```ruby:ターミナル
$ git add .  # これで全ファイル対象に更新したい場合に使う。「.」が大事
```

```ruby:ターミナル
$ git commit -m "20180617" # ""の中は任意の言葉で。僕は更新日を書いてます
```

```ruby:ターミナル
$ git remote add origin https://github.com/----.git # ここはリモートリポジトリのURLを入力
```

```ruby:ターミナル
$ git push origin master #プッシュ完了
```

結論：更新って言わずにコミット&プッシュという言葉を使うようにします！！（当たり前か）
Slackで「チームをSlackへ招待する」を削除する方法

Slackを使うとき、ずっと招待する～～の表示が邪魔でした。

ディスプレイサイズが小さいと余計チャット部分が狭くなります。

ググると流石は博士！！


参考サイト　[Slack広告](https://murabitoleg.com/slackd/)

手順1
まずはメンバーを追加するを選択します

手順2
「自分の使用しているアカウント+test@…」みたいなアドレスを用意します．

用意したら「招待を送信する」を押しましょう．


以上、、、チョーかんたん

これで自分用のメモも見やすくなったよ～～～
React.js 学習メモ　第3回

最近Reactの勉強を始めたので、ノート代わりにまとめていきます。
主に自分の学習の流れを振り返りで残す形なので色々、省いてます。
Webエンジニアの諸先輩方からアドバイスやご指摘を頂けたらありがたいです！

#コードを書く前にVScodeの設定
今までAtomを使っていたのですが色んな人にVScodeの方がいいと勧められたのでこのタイミングで乗り換えました！
VScodeの細かい設定をどうしたらいいか分からなかったので調べてみれば見つかるもんなんですね〜
しかも主にReactJS向け設定だったのでぴったりでした！
[VSCodeで爆速コーディング環境を構築する](https://qiita.com/teradonburi/items/c4cbd7dd5b4810e1a3a9)

これを元にVScodeの環境構築を行いました。
多くの便利な機能があり、なるほどこれは便利だなと思いました。
エディタもいい感じに設定できたので学習再開です。

#ToDoアプリ作成
React.jsでToDoアプリを作成！
正直、細かい部分はなぜこのような記述になるのか調べても、あまり分からない部分もあったが完璧に理解するのは直ぐには難しいと思ったのでとりあえず、形になる物を作成。

[create-react-appを使ってReactでToDoリストを作成するぞ](https://qiita.com/rioc/items/8723c236e10d989e827d)

この記事ではcreate-react-appというアプリの雛形を作成してくれる便利なコマンドを使っているのだが個人的にrails newみたいな感じなのかなと感じていた。

調べてみるとcreate-react-appはボイラープレートと呼ばれており、「React」で使用する。コンポーネントファイル群の１つである模様。
１コマンドでパッケージ管理のnpm,yarn、ES6のコンパイラにBabel,ビルドにはBrowserifyやWebpackなど全て用意してくれるのはありがたいが実際にこのコマンドによりどの様な事が行われているのかがブラックボックス化しているのがデメリットと感じた。

[React初心者にオススメの、最新ボイラープレート11選](https://goworkship.com/magazine/react-boilerplates/)

#ボイラープレートを作ってみる
実際に手を動かして、ボイラープレートを作ってみると、各種ライブラリがどういう目的で導入されているのか、webpackerやcreate-react-appで行なっている知識が身につき、フロントエンドの開発の理解も進むのでは無いかと思いやってみました。

ちょど良さげな記事がTypeScriptで行なっていましたが今回の目的はReactボイラープレートがどのような仕組みになっているのかを知る事だったのでこの記事を参考にさせていただきました。

[ゼロから始める TypeScript対応 Reactボイラープレート入門](https://medium.com/finc-engineering/how-to-setup-typescript-react-boilerplage-19e4535774b0)

#振り返り
今回、ToDoアプリを作成する事で初めてボイラープレートとという概念を知り、create-react-appの裏でどのような事が行われているのかを自分の手で作成しながら知る事ができたのは個人的に不明点が明らかになって良かったと思いました。次からはReduxについての学習を始める。
pipenv環境構築まとめ


□2018年のPythonプロジェクトのはじめかた - Qiita
https://qiita.com/sl2/items/1e503952b9506a0539ea
に刺激を受けて，pipenvの設定をまとめてみました．
[公式ドキュメント](https://docs.pipenv.org/en/latest/install/#make-sure-you-ve-got-python-pip)

#インストール
####pipでinstall
```
pip install --user pipenv
pipenv --version
```

#必須コマンド
####Pipfileがない場合，Pipfileを作成
```
pipenv install 
```

####必要に応じてライブラリをインストール
```
pipenv install **library**
```
####必要に応じてライブラリをuninstall
```
pipenv uninstall **library**
```

####環境をactivate 
```
pipenv shell 
```

####pipfileの[scripts]の中に実行コマンドを作成する
```
pipenv run **command**
```

#その他の重要コマンド
####show dependencies of python library
```
pipenv graph
```

####activate virtualenv 
```
pipenv shell
```

####check security
```
pipenv check
```

####execute on virtual environment
```
pipenv run *comamnd*
```
*command* you make in pipfile [scripts] 
```[scipts]
start="python manage.py runserver "
```
####pipfile.lockからインストール
```
pipenv sync
```

####Pipenv環境自体の削除
```
pipenv --rm 
```

####update 
```
pipenv update 
```

#### out of pipenv shell
```
exit 
```

#### check the dependent package from one library 
```
pipenv graph —reverse
```

## 環境構築時のError 
```
ModuleNotFoundError: No module named ‘_sqlite3’

===>
sudo apt install libsqlite3-dev 
pipenv --rm 
pipenv install --python 3.6.5
```
パイプを使ってopenコマンドにデータを渡す

ターミナルでの作業を中心にしていても、時には別のアプリケーションでデータを見たい場合も出てきます。
`open`コマンドはファイルを別のアプリケーションで開いてくれますが、ファイル全体ではなく一部分だけ参照したい場合もあります。
その時は`-f`オプションを使うとパイプを使ってデータを渡すことができます。

```sh
head -n 10 something.csv | open -f -a Numbers
```

`-a`オプションでは起動するアプリケーションを指定することができるので、デフォルトのテキストエディタ(テキストエディット)以外のアプリケーションを使いたい場合は指定しましょう。
ファイル名を一括変換する方法

# ファイル名変更前

```
1.txt
2.txt
3.txt
```

# ファイル名変更後

```
prefix_1.txt
prefix_2.txt
prefix_3.txt
```

# 変更するためのコード

```{python}
import glob
import os
import re

files = glob.glob('*.txt')  # txtファイルのみ検索
files.sort()  # 名前順に並べ替える

prefix = 'prefix'  # ファイル名変更後のprefix

for i, file in enumerate(files):
    if re.match('.*.txt', file) is not None:  # もしこの正規表現に一致するなら
        os.rename(file, prefix + str(i+1) + '.txt')  # こんな感じに名前を変える
```
SQLの「JOIN」とは？

#はじめに
私は、大学４回生でプログラミングを勉強しています。
現在、未来電子テクノロジープログラミング開発コースに所属しています。
今回は、SQLを勉強している時に気になった「JOIN」についてお話しします。

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

#「JOIN」とは
「JOIN」は、複数のテーブルを繋げたい時に使う命令のことです。
この結合させる方式は、いくつか存在します。
その中でもよく使われる３つの「JOIN」について、勉強しました。
それは、以下です。
・クロス結合
・内部結合
・外部結合

#クロス結合
クロス結合は、全ての組み合わせを作成する結合方式です。
実行命令の例は、以下です。

```
SELECT * FROM team CROSS JOIN user;
```

実行すると、全ての組み合わせが、出てきます。

#内部結合
内部結合は、指定した関係のある要素を含んだ物をだけを組み合わせてくれる方式です。

実行命令の例は、以下です。

```
SELECT * FROM team INNER JOIN user ON team.team_id = user.team_id;
```

実行すると、team_idに関係したものが結合します。

#外部結合
外部結合は、内部結合にプラスαの情報を表示する方式です。
実行命令の例は、以下です。

```
SELECT * FROM team LEFT OUTER JOIN user ON team.team_id = user.team_id;
```

実行すると、関係する要素が存在する場合のみ、結合を表示します。
この他に、「right outer join」「full outer join」があります。


#まとめ
一番使われるのが、内部結合らしいです。
これからもプログラミングを勉強していきたいなと思っています。
補数

ちょっとした工夫があって個人的に補数って好きなんですよね。なので、知識整理がてら補数について書くいておこうと思います。
#補数とは
補数はコンピュータで使われる、引き算を足し算で計算するための数です。
補数を初めて聞いた方は何を言ってるかわかりにくいと思いますが、1+(-1)の式の-1に相当する数を作ったってことですね。
#補数の仕組み
補数はコンピュータのオーバーフローを利用します。オーバーフローとは、コンピュータの扱える桁より大きい桁の数は消えてしまうことです。8ビットしか扱えないコンピュータでは計算結果が100000000だったとしても00000000とみなされるということです。
補数はこのオーバーフローを逆手にとって、ある数xを足したらぴったりオーバーフローする数を-xとするのです。
例えば2進数の00000001の負の値は8ビットを扱うコンピュータの場合、11111111になります。
実際に計算してみましょう。
00000001+11111111=100000000
100000000は00000000とみなされるので、11111111は0000001の負の値になっています。
別のパターンでも計算してみましょう。10110111(10進数:187)に11111111を足します。
10110111+11111111
=10110110+00000001+11111111
=10110110+10000000
=10110110+0000000
=10110110
答えは10110110(10進数:186)となります。
このように補数はオバーフローにより消えてしまう数を利用して引き算を足し算で計算できるようにするのです。

オバーフローという難点を利用して利点を生む、ちょっとおもしろいですよね。
[Swift]enumでランダムなケースを返すextension

# 実装

```swift

public protocol Sampling {
  static var all: [Self] { get }
  static var sample: Self? { get }
}

public extension Sampling {
  static var sample: Self? {
    let all = self.all
    if all.isEmpty { return nil }
    let index = Int(arc4random_uniform(UInt32(all.count)))
    return all[index]
  }
}

extension Sampling where Self: CaseIterable {
  static var all: [Self] { return self.allCases as! [Self] }
}
```

# 使い方

```swift
enum Basic {
  case one
  case two
}

enum IteratableBasic: CaseIterable {
  case one
  case two
}

enum Nums: Int {
  case zero
  case one
}

enum IteratableNums: Int, CaseIterable {
  case zero
  case one
}

enum Args {
  case str(String)
  case num(Int)
}

extension Basic: Sampling {
  static var all: [Basic] { return [.one, .two] }
}
extension IteratableBasic: Sampling {}
extension Nums: Sampling {
  static var all: [Nums] { return [.one, .zero] }
}
extension IteratableNums: Sampling {}
extension Args: Sampling {
  static var all: [Args] { return [.num(123), .str("mes")] }
}

Basic.sample
IteratableBasic.sample
Nums.sample
IteratableNums.sample
Args.sample

```