OmniAICreator/Qiita-1.07M huggingface dataset:
GitHubにMavenリポジトリを構築してAndroidのAARライブラリを共有する手順

# 概要

Android Studioを使って、GitHubに簡易的にMavenリポジトリを構築し、AARライブラリを公開するまでの手順について書きます。自分の備忘録を兼ねています。

Android開発で、自作ライブラリをアプリ共通で使いたいけど、セントラルリポジトリ使う程でもないし、そもそもやり方知らないし、調べたら面倒臭そうだし、という感じの経緯でやった内容です。とにかく最短で手っ取り早く構築するだけの内容です。

キーやトークンの設定とか何も要らないです。ただ、GitHubリポジトリとAndroidプロジェクトがあって、GitHubにプッシュできるようになっていれば問題ないはずです。

サンプルは、自作ライブラリの「[Prefs](https://github.com/wa2c/prefs)」を公開した際の内容になっています。各種ファイルも同プロジェクトに含まれています。また、開発環境がWindowsだったので、その辺に依存した部分はあるかもしれない点はご了承ください。（作業自体は他OSでもできるかと思います）

# 環境

- Android Studio
- 共有したいAARモジュールが含まれるAndroidプロジェクト

# 手順

## 設定変更

リポジトリの設定を記述した以下のMavenファイルを作成し、[AARモジュールのフォルダ](https://github.com/wa2c/prefs/tree/master/prefs)に配置します。ファイル名は何でもいいですが、ここでは、maven.gradleとします。

出力先フォルダ("repository")や、version, groupId, artifactIdはアプリに応じて適宜変更します。

~~~Gradle:maven.gradle
def versionName = "0.0.1"
def repo = new File(rootDir, "repository")

apply plugin: 'maven'

uploadArchives {
    repositories {
        mavenDeployer {
            repository url: "file://${repo.absolutePath}"
            pom.version = "${versionName}"
            pom.groupId = 'com.wa2c.android'
            pom.artifactId = 'prefs'
        }
    }
}
~~~

[AARモジュールのbuild.gradle](https://github.com/wa2c/prefs/blob/master/prefs/build.gradle)に以下の変更を加えます。


~~~Gradle:build.gradle(Module)
apply from: 'maven.gradle'
~~~

バージョンを一致させるために、同ファイルにあるバージョンを以下のように変更します。

~~~Gradle:build.gradle(Module)
versionName "{$versionName}"
~~~

以下の[Windowsバッチファイル](https://github.com/wa2c/prefs/blob/master/uploadArchives.bat)を作成し、プロジェクトフォルダに配置します。Windows以外のOSの場合は適宜読み替えてください。

~~~Bat:uploadArchives.bat
cd /d %~dp0
.\gradlew uploadArchives
~~~

## リポジトリの作成

バッチファイルを実行します。これにより、gradlewコマンドをuploadArchivesオプションで実行されます。プロジェクトフォルダにrepositoryというフォルダが作成され、その中にmavenリポジトリが作成されます。
これが含まれたプロジェクト全体をGitHubにプッシュします。自分のアカウントにおけるMavenリポジトリのURLは以下のようになります。

https://github.com/wa2c/prefs/raw/master/repository/

余談ですが、もしこれをBitbucketにアップロードするなら、以下のようなURLになるはずです。

(存在しません)
https://api.bitbucket.org/1.0/repositories/wa2c/prefs/raw/master/repository/

なお、私の場合は個人開発で、管理が色々面倒なので、ソースコードとMavenリポジトリを一緒のGitHubリポジトリにまとめて置いてありますが、きちんと管理するなら、不用意にモジュールがアップデートされないように、GitHubリポジトリを別に分ける等の管理はした方が良いような気がします。

## プロジェクトからの参照

Gradleにリポジトリを読込む場合、以下のようになります。

~~~Gradle:build.gradle

repositories {
    maven { url 'https://github.com/wa2c/prefs/raw/master/repository/' }
}

dependencies {
    implementation 'com.wa2c.android:prefs:0.1.1'
}

~~~

## モジュールのアップデート

モジュールのアップデートを行う場合、maven.gradleに書いたバージョン番号を変更して、uploadArchives.batを再度実行すると、repository以下に新バージョンのフォルダが作成されます。これをそのままプッシュすれば、新バージョンを参照することができいます。

# まとめ

今回の作業は、自分で共通で使いたい処理を手っ取り早く共有するために行いました。本当にただファイルを配置するだけ（実質、バッチファイルを叩いてプッシュするだけ）でお手軽なので、個人レベルならこれで十分のような気がしました。

# 参考

GitHubにMavenリポジトリをつくる - システム開発で思うところ
http://vermeer.hatenablog.jp/entry/2017/09/02/092837	

やぎ小屋 | GitHubレポジトリにMavenのリポジトリを作成する
https://blog.yagi2.com/2016/12/15/how-to-deploy-maven-repo.html	

githubをaar用のMavenなリポジトリとして使う - 未処分利益
http://www.vagrantup.jp/entry/2014/04/03/083930	

【Android】Libraryを作ってprivateなgithubリポジトリにpushして、チームのみんなでgradleに書くだけで使えるようにするまで - Qiita
https://qiita.com/kgmyshin/items/87f560172c31c2fbd899
Vuex のmapStateなどの書き方決定版！

#はじめに

Vuexの`mapState`や`mapActions`って便利ですけど、色々な書き方があってややこしいですね。

例えば、以下のケースでそれぞれ書き方が変わってきます。

- ヘルパー以外のプロパティも定義したい場合
- モジュールから値を取ってきたい場合
- 値にエイリアス（別名）をつけたい場合
- 値に何らかの処理をほどこしたい場合

本記事では**「この2パターンだけ覚えていればOK」**という書き方をご紹介します。

#前提

前提として、userというモジュールに、`id`と`age`というステートが定義されているとします。

```javascript:store/index.js
const user = {
  state: {
    id: ''
    age: null
  },
  namespaced: true,
}
```

また、必要なヘルパーはインポートされているとします。

```javascript:pages/index.vue
<script>
import { mapState, mapGetters, mapMutations, mapActions } from 'vuex'

```

#書き方１（簡易型）

まずは、よく使う簡易的な書き方から。

ストアの値をそのまま使うだけの場合は、以下のように書けます。

```javascript:pages/index.vue
  computed: {
    ...mapState('user', [
      'id', 
      'age'
    ]),

    // この後にもちゃんと関数を定義できる

  },
```

これにより、userモジュールの`id`, `age` が`this.id`, `this.age` で取得できます。

参照先がモジュールじゃない場合は第1引数を省略するだけです。

```javascript:モジュールじゃない場合
  ...mapState([
    'some', 
    'states'
  ]),
```

他の3つのヘルパーも同様に書けるので省略します。
（ただし`mapMutations`と`mapActions`は、`computed`ではなく`methods`内に定義します）

#書き方２（万能型）

こちらはあらゆるケースで使える書き方です。
（ただエイリアスや値の加工が不要な場合は、書き方１より冗長になります）

```javascript
  computed: {
    ...mapState('user', {
      userId: 'id',
      isAdult: function(state) {
        return state.age > 19, // 成人かどうかを Boolean で返す
      },
    }),

    // この後にもちゃんと関数を定義できる
  },
```

書き方１と異なるのは、引数に配列ではなくオブジェクトを渡している点です。
そのオブジェクトには、

`エイリアス名: '取得したいキー名'` あるいは
`エイリアス名: function` （MapGetters 以外）

という形のプロパティを定義します。
（function を渡すやり方については下で補足解説します）

:point_up:のコードでは、

- `this.userId`で user の`id`が取得できる
- `this.isAdult`で「年齢が20歳以上かどうか」が取得できる

ようになっています。

#####補足（function を渡す書き方）

`mapState, mapMutations, mapActions`では、プロパティに function を渡すことで値の加工や処理の追加が行えます。

- `mapState`の場合は`state`を引数とし、加工した値を戻り値とします。

- `mapMutations, mapActions`の場合はそれぞれ`commit, dispatch`を引数とし、行いたい処理を記述します。[実例][1]を置いておきます。

※「値を加工するなら getters に書けばいいのでは？」と思われるかもしれませんが、例えば一つのページでしか使わないような値の場合、こうすることで getters の肥大化が避けられます。

#その他の注意点

- ヘルパーを書く場所は、
  - `mapState, mapGetters`は`computed`内
  - `mapMutations, mapActions`は`methods`内


- 参照先がモジュールではない場合は第1引数を省略する

- モジュールがネストしている場合は、モジュール名をスラッシュで区切って指定する。例：”user/photo”

###参考
[Vuex：mapStateの書き方8パターン+11サンプルコード][2]

[1]:https://github.com/vuejs/vuex/blob/caa663d69608fc36d1a88746df28961437d38786/examples/chat/components/MessageSection.vue
[2]:https://qiita.com/suin/items/7331905a45a8ff80d4dd
NginxでSSL+リバースプロキシ

# はじめに
NginxでSSL＋リバースプロキシさせるための設定です。手順が多いように見えますが、あらかじめ設定ファイルのひな形を作っておけば比較的簡単に設定できると思います。

# 前提環境
- さくらVPSのUbuntu16.04（カスタムOS）
- ドメインを取得済みで、かつサブドメインも登録済み。
- Let's Encryptを導入済み。

#仮定条件

- ドメイン**hoge.fuga.com**にアクセスしたときにリバースプロキシでサーバアドレス**123.456.789.12:3456**に接続させる。

# 設定手順

##初回認証

認証用のディレクトリを作成し、所有ユーザを**www-data**に変更

```bash
# mkdir /var/www/hoge
# chown -R www-data:www-data /var/www/hoge
```

HTTP接続するためのサイト設定ファイルを作成する。

```bash
# vi /etc/nginx/conf.d/hoge.conf
```
設定ファイルの中身は以下のようにする。

```config:/etc/nginx/conf.d/hoge.conf
# HTTPの設定
server{
    listen 80;
    listen [::]:80;
    server_name hoge.fuga.com;

    #letsencryptで認証するためのURL
    location ^~ /.well-known/acme-challenge {
        default_type "text/plain";
        root /var/www/hoge;
    }
}
```

Nginxを再起動する。

```bash
# systemctl restart nginx
```

サブドメイン**hoge.fuga.com**を**certbot**で認証する。
認証完了後、キーファイルが**/etc/letsencrypt/live**以下に作成される。

```bash
# certbot certonly --webroot -w /var/www/hoge -d hoge.fuga.com
```

##SSL接続設定

設定ファイルを編集する。

```bash
# vi /etc/nginx/conf.d/hoge.conf
```
設定ファイルを以下のように編集する。

```config:/etc/nginx/conf.d/hoge.conf
# HTTPの設定
server{
    listen 80;
    listen [::]:80;
    server_name hoge.fuga.com;

    #letsencryptで認証するためのURL
    location ^~ /.well-known/acme-challenge {
        default_type "text/plain";
        root /var/www/hoge;
    }
    #HTTPで接続された場合、HTTPSで同URLにリダイレクトさせる。
    return 301 https://$host$request_uri;
}

# HTTPSの設定
server{
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name    hoge.fuga.com;

    ssl_protocols TLSv1.2;
    ssl_ciphers EECDH+AESGCM:EECDH+AES;
    ssl_ecdh_curve prime256v1;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;

    # SSL認証キーの参照先。certbotで自動的に生成されるファイルを指定する。
    ssl_certificate     /etc/letsencrypt/live/hoge.fuga.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/hoge.fuga.com/privkey.pem;
    ssl_dhparam         /etc/ssl/certs/dhparam.pem;

    keepalive_timeout    70;
    sendfile             on;
    client_max_body_size 0;

    proxy_set_header    Host    $host;
    proxy_set_header    X-Real-IP    $remote_addr;
    proxy_set_header    X-Forwarded-Host       $host;
    proxy_set_header    X-Forwarded-Server    $host;
    proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;

    location / {
        # プロキシ先のサーバアドレスとポート番号を指定
        proxy_pass    123.456.789.12:3456;
    }
}
```

Nginxを再起動する。

```bash
# systemctl restart nginx
```

ブラウザで**https\://hoge.fuga.com**に接続し、正常に目的のページが表示されることを確認する。

※2019/02/08修正：Let's Encryptの再認証用URLはHTTP側じゃなきゃダメでした・・・
K-means法のアルゴリズム

**K-means法**について勉強したのでまとめました。

# k-means法の位置づけ


**教師無し学習**の内の一つに**クラスタリング**がある。

クラスタリングとは、あるデータ集合をデータ間の類似度を基準に複数のクラスタに分類すること。

クラスタリングは以下の二つに大別できる。

- 階層的クラスタリング
- 非階層的クラスタリング

このうち、K-means法は非階層的クラスタリングに属する。

# K-means法の目的
K-means法の目的は、$D$次元のベクトル$N$個で構成されるデータ集合$\boldsymbol{x_1}, \boldsymbol{x_2}\dots,\boldsymbol{x_N}$を$K$個のクラスタに分類すること。

# K-means法の流れ
### 前準備
各クラスタの代表ベクトルを$\boldsymbol{\mu_1},\boldsymbol{\mu_2}, \dots, \boldsymbol{\mu_K}$とする。
$k$番目の代表ベクトルが支配するクラスタを$M(\boldsymbol{\mu_k})$とする。

$i$番目のデータが、$k$番目のクラスタに属するか否かを表す変数を$q_{ik}$を以下に定義する。

```math
q_{ik} = \left\{
\begin{array}{ll}
1 & \boldsymbol{x_i} \in M(\boldsymbol{\mu_k})\\
0 & otherwize
\end{array}
\right.
```
$q_{ik}$を定義することで目的関数の記述が楽になる。


### 目的関数

K-means法の目的関数を以下により定義する。

```math
J(q_{ik}, \boldsymbol{\mu_k})= \sum_{i=1}^{N}\sum_{k=1}^{K}q_{ik}||\boldsymbol{x_i}-\boldsymbol{\mu_k}||^2
```
これは、$1 \leq i\leq N$とする時、各データ$x_i$と、$x_i$が属しているクラスタの代表ベクトル$\mu_k$との距離の二乗を計算し、データの数$N$だけサメンションしている。
$q_{ik}$を使うことで、データ自身が属していないクラスタの代表べクトルとの距離は0になるように設計されている。

この目的関数$J$を最小化していく。すなわち、各データと自身が分類される各クラスタの代表ベクトルとの距離の二乗和を小さくしていきたいということ。
### 目的関数の最小化
$J(q_{ik}, \boldsymbol{\mu_k})$は$q_{ik}, \boldsymbol{\mu_k}$を持つ関数である。
同時に最小化するのは難解なので、各変数について他方を固定して逐次的に最小化する。

最小化のアルゴリズムは以下のようになる。

### アルゴリズム
>1. **初期化**： 各データをランダムにクラスタに割り当てる。割り当てた各データの平均を代表ベクトル$\boldsymbol{\mu_k}(k=1, 2, \dots, K)$とする。
2. **$q_{ik}$についての最小化**：求めた$\boldsymbol{\mu_k}$を固定し、$q_{ik}$について$J$を最小化する。
3. **$\boldsymbol{\mu_{ik}}$についての最小化**：2.で求めた$q_{ik}$を固定し、$\boldsymbol{\mu_k}$について$J$を最小化する。
4. 上記2. 3.を収束するまで繰り返す。



### 最小化アルゴリズムの説明
* 2.について

以下のように、各データとクラスタ$j$の代表ベクトルとの距離を計算する。
各データ$i$に対して、一番距離が小さくなるクラスタを選んで、その時の$q_{ik}$を１とする。

```math
q_{ik} = \left\{
\begin{array}{ll}
1 & k = argmin_j ||\boldsymbol{x_i}-\boldsymbol{\mu_j}||^2\\
0 & otherwize
\end{array}
\right.
```
* 3.について

$J$は$\mu_k$についての二次関数であるので、目的関数$J$を偏微分して勾配を計算する。

```math
\frac{\partial J(q_{ik}, \boldsymbol{\mu_k})}{\partial \boldsymbol{\mu_k}}=2\sum_{i=1}^Nq{ik}(x_i-\mu_k)=0\\
⇒\mu_k=\frac{\sum_{i=1}^Nq_{ik}\boldsymbol{x_i}}{\sum_{i=1}^Nq_{ik}}

```
求めた$\mu_k$は、クラスタ$k$に属するデータの平均になっている。


以下サイトの図解がアルゴリズムを理解するのに役立った。
[K-means 法を D3.js でビジュアライズしてみた
](http://tech.nitoyon.com/ja/blog/2013/11/07/k-means/)

## K-means法の注意点
最小化アルゴリズムによる収束先は最初に設定した初期値に依存するので、最適な解になるとは限らない。
最適な値に近づけるには、初期値に設定する値を変更し、何度かK-means法を行う。

#参考文献
* 森北出版「はじめてのパターン認識 第10章」

* [K-means 法を D3.js でビジュアライズしてみた
](http://tech.nitoyon.com/ja/blog/2013/11/07/k-means/)
【Django】context must be a dict rather than tuple Django formsと出たとき

## はじめに
Django==2.1.3
python==3.6.5
Djangoのviews.pyのrenderメソッドでのエラー
## エラーメッセージ
```
TypeError: context must be a dict rather than tuple.
```

## 原因
renderメソッドの第二引数はタプルではない
## 対策
renderメソッドの第二引数に辞書を渡す

```python
from django.shortcuts import render
##中略##
def hoge(resuest):
    return render(request, 'index.html', ()<==)
```
ここはこうなる

```python
def hoge(resuest):
    return render(request, 'index.html', {}<==)
```

## 感想
TypeErrorで動かね！、どこ！？ってなった人たちに届けばよし。
backgroundImage: url(〜) のインラインcssをJSX化する正規表現

よく使うのでメモ

```
style="background-image:\s*url\("*'*(.+)"*'*\)
```

$1 で urlだけ抜き出せる

変換後の利用例（JSX用に変換）：

```
style={{ backgroundImage: `$1` }}
```
MessagePack for C# を Unity iOS で使う時のメモ

## これはなに

[MessagePack for C#](https://github.com/neuecc/MessagePack-CSharp) を Unity の iOS で使うとき一癖あったのでそのメモです。

## 環境

- macOS Mojave 10.14.1
- Unity 2018.2.10f1
- Mono JIT compiler version 5.12.0.301
- MessagePack-CSharp Ver 1.7.3

## Import

ここは普通です。

1. https://github.com/neuecc/MessagePack-CSharp/releases/tag/v1.7.3 から [MessagePack.Unity.1.7.3.zip](https://github.com/neuecc/MessagePack-CSharp/releases/download/v1.7.3/MessagePack.Unity.1.7.3.zip) をダウンロード
2. unitypackage を開いてインポートする

## Attribute をつける

README に書いてあるとおり、シリアライズしたい class / struct に `[MessagePackObject]` を、 member / property に `[Key]` 属性をつけます。
https://github.com/neuecc/MessagePack-CSharp#object-serialization

## コードの事前生成

ここがハマりポイントです。

README を読むと、 Unity iOS (IL2CPP) ではコードの事前生成が必要なことがわかります。
https://github.com/neuecc/MessagePack-CSharp#pre-code-generationunityxamarin-supports

macOS では mono サポートがあると書いてありますが、上記 v1.7.3 に含まれる mpc.exe は正常に動きません(中身が空の Resolver が生成されます)。

この [Issue comment](https://github.com/neuecc/MessagePack-CSharp/pull/155#issuecomment-354580450) にある [fork のリリース](https://github.com/PotterDai/MessagePack-CSharp/releases) に含まれている tools を使うとうまくいきます。

しかし最新の mono の stable (5.16.0)では動きませんでした。
とりあえず動かしたいので [archive](https://download.mono-project.com/archive/) から少し古いビルドをインストールします(今回は 5.12.0.301 で試しました)。

これで生成できます。
`mono path/to/MessagePack.Unity.1.7.3/tools/mpc.exe -i Assembly-CSharp.csproj -o Assets/Scripts/Generated/MessagePackGenerated.cs`

## 事前生成した Resolver を登録する

今回は1シーンのプロジェクトだったので、雑にシーンに直置きしました。

```MessagePackResolverRegister.cs
using MessagePack.Resolvers;
using UnityEngine;

public class MessagePackResolverRegister : MonoBehaviour
{
    void Start()
    {
        CompositeResolver.RegisterAndSetAsDefault(
            GeneratedResolver.Instance,
            MessagePack.Unity.UnityResolver.Instance,
            BuiltinResolver.Instance,
            AttributeFormatterResolver.Instance,
            PrimitiveObjectResolver.Instance
            );
    }
}
```

## さいごに

ちゃんと修正してコントリビュートしたい人生だった。
\ No newline at end of fileの修正

ファイルに変更を加えていなくても、
エディタなどで一度開いて保存し直すとファイル変更と認識されてしまうことがある。

Githubにpushしたりした際に、
`\ No newline at end of file` と表示されてしまうことがある。
（不要なcommitなので含めたくない場合、下記のように修正を行う。）

vi かなにかで、下記のコマンドを実行してから保存し直す。

```
:set binary noeol
```

原因は、

> POSIX的にはファイル末尾に改行が必要らしく、改行がない場合に警告されます。

とのこと。

参考：[git :: 「No newline at end of file」の対処](http://tm.root-n.com/unix:command:git:operation:no_newline_at_end_of_file)
Augurのシステム構成

Augurの中身は、いくつかの階層に分かれています。
公式ドキュメントの「[Hosted Ethereum Node](https://docs.augur.net/#hosted-ethereum-node)」に説明があります。

# Augurの階層構成
Augurの大まかな階層構成図を以下に示します。

![augur-layer.png](https://qiita-image-store.s3.amazonaws.com/0/142577/d10ec6ee-580e-0cde-920d-5dbf505495ac.png)

- 利用者はWEBブラウザを使ってマーケットにアクセスし、予測や賞金の受け取りを行います。

- Augur UI・・・Webフロントエンド。Reactで書かれているようです。

- augur.js・・・API。Augur UIや各自のプログラムからアクセスするインタフェース部分です。

- Augur node・・注文履歴などを保存しておく場所です。データはDBに格納します。初回起動時はネット上のブロックチェーンとの同期をとるため、時間がかかります。

- augur core・・実際の取引を行い、Ethereumのブロックチェーンに読み書きします。Ethereumのスマートコントラクトの言語であるSolidityで書かれています。

注文履歴はサーバ(Augur nodeのデータベース)にも保存しますが、実際の取引はEVM上のスマートコントラクトで行います。


[GitHub](https://github.com/AugurProject)では、各階層ごとにリポジトリが別れています。
次回は[Augurの各リポジトリの概要](https://qiita.com/jansnap/items/e52cd95f2421419b85b2)を説明します。
FelicaというかNFCとは

##この記事の目的
最近話題のキャッシュレス決済で使用されている無線通信方式であるFelicaの仕様などをまとめました。

##近距離無線通信とは
#### 広義
   - 交信距離の短い無線通信全般を示す

#### 狭義
   - **Near field communication（NFC）**の訳語
   - RFIDを使ってICタグと情報をやりとりする技術

##NFCとは
###構造
下記の要素で成り立つ(Felicaも大枠は変わらない)

- ICタグ…各種情報を格納
- (コイル状)アンテナ…電磁誘導によって電力をICタグに供給、リーダ/ライタと通信を行う
- リーダ/ライタ…ICタグと通信を行いタグ内の情報の取得や上書きを行う

###特徴
- ライターにタグをかざすだけとユーザビリティに優れる
- 通信速度が速い
- 非接触の為機械的な摩耗が少ない(故障はする)
- セキュリティを磁気カードなどより強力にできる
- QRコードなどと比較してコストが高い
- 暗所などでも問題なく作動する

####分類
- タグ種別
 - **パッシブタグ**…ICタグ作動の為の電源を搭載していない為、外部から電源供給しないとリーダ/ライタと通信が出来ない。電源の供給はリーダ/ライタの電波/電磁波を使用する。IDタグからの返答情報は、タグのアンテナがリーダ/ライタの電波を反射する反射波に乗せて行うので非常に弱く、近距離でしか通信できない。
 
 
 - **アクティブタグ**…ICタグに電源がセットになっている為、単体で長距離(数十m)の通信することができる。当然使用によって電池が減ってくるため、定期的に交換が必要
 - **セミアクティブタグ**…外部から特定の信号を受信したときのみにアクティブタグとして動作する。パッシブタグより通信距離が長く、アクティブタグより電池の消費が少ない

####規格
近距離通信(NFC)の規格は歴史的な背景から複数の規格がある上に、通信規格や後述するセキュアエレメントの問題もあり、かなり複雑になってしまっている。規格関係の記述が多くなりすぎてしまうため、Felicaの規格のみ記載します。

Felicaの規格は
通信規格…NFC Type-F(JIS X 6319-4,ISO/IEC 18092（NFC IP-1))
NDEFタグの規格…Type-3
セキュアエレメント…Felica SE(Sony規格)

つい最近も某小型スマホでやらかしていましたが、NFC type-Fが対応されていても、Felica SEが乗っていないとFelica(おサイフケータイ)として振る舞うことが出来ない。

####セキュアエレメント
海外のNFC対応スマホが国内の各種決済などに使用できない問題に、このセキュアエレメントの問題があります。
NFCの通信規格は現状Type-A/B/Fの規格がありますが、これはあくまで通信プロトコルなどの規格を定めただけで、セキュリティ面での規格ではありません。決済機能などセキュリティを必要とする分野では別途問題を解決する必要があります。
そこで考えられたのが**セキュアエレメント**です。

セキュアエレメントは基本的に独立した半導体のデバイスとして存在し、内部で独自のOSが走っています。リーダ/ライタとの通信データは基本的にこのセキュアエレメントと行われ、アプリ側ではセキュアエレメントを介した情報しか得ることが出来ないようになります。

このセキュアエレメントは各企業の思惑などもあり、デバイスに乗せるのか、SIMカードに乗せるのか、SDカードに乗せるのかなどなど国内と海外だけでなく、海外でも規格が乱立しているようです。
セキュアエレメントを積まず、HCE-Fという技術を使って直接アプリケーションとやりとりしようという流れもありますが、どうなるかわかりません。
Jetson TK1をUbuntu 16.04化して延命する

# 概要
Ubuntu 14.04 LTSのサポート期限切れが迫っている中、既にNVIDIAによるサポートが終了しているJetson TK1をUbuntu 16.04にアップグレードして延命を図ります。nouveauドライバではなく公式ドライバで動いているため、CUDA 6.5も使えるようです。

今年6月の動作報告をほぼなぞっています。
https://devtalk.nvidia.com/default/topic/1036457/jetson-tk1/how-to-successfully-update-jetson-tk1-to-ubuntu-16-04
これまではdo-release-upgradeすると環境が壊れるというのが通説でしたが、xserver-xorg-coreをholdすればうまくいったという報告が今年になって相次いでいます。

# 手順

1. Recovery modeで親機につなぎLinux for Tegra R21.7のインストール
    - https://developer.nvidia.com/linux-tegra-r217
    - 書き込み時にpartition sizeは必ず広げる  
`sudo ./flash.sh -S 14580MiB jetson-tk1 mmcblk0p1`
    - 所要時間は30分程度
2. 親機と同じネットワークにつなぎJetpack 2.3.1よりCUDA等のインストール
    - https://developer.nvidia.com/embedded/jetpack-2_3_1
    - サンプルもインストールしておくと動作確認を容易に行える
    - こちらも所要時間は数十分
3. 以下実機コンソールにて実行

~~~bash
sudo apt update && sudo apt upgrade

# L4T R21.7でもhold必須
sudo apt-mark hold xserver-xorg-core

# 所要時間数十分かつ途中の選択肢あり
sudo do-release-upgrade
sudo reboot

# Timezone設定
sudo timedatectl set-timezone Asia/Tokyo

# gccは4.8を使う
sudo apt install gcc-4.8 g++-4.8
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.8;
sudo update-alternatives --config gcc

# デスクトップ環境をUnityから変更(ログイン画面にて選択可能になる)
sudo apt install gnome-session-flashback


~~~

# 動作確認

homeディレクトリに入っている`tegrastats`をsudoつきで実行すると、1秒ごとのCPU, GPU, ハードウェアエンコーダ等の稼働状況を把握できます。
詳細は https://devtalk.nvidia.com/default/topic/935280/jetson-tk1/tegrastats-infomation/

### CUDA, VisionWorksなど
Jetpackからhomeディレクトリにインストールした各サンプルを実行

### ハードウェアエンコーダ
~~~bash
sudo apt install ffmpeg gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly
ffprobe "サンプル.ts"
# ffprobe実行結果をprogram-number, demuxer.video_0XXX, demuxer.audio_0XXXに反映
gst-launch-1.0 filesrc location="サンプル.ts" ! progressreport ! tsdemux program-number=211 name=demuxer demuxer.video_0140 ! video/mpeg ! queue max-size-time=0 max-size-buffers=0 ! mpegvideoparse ! omxmpeg2videodec ! nvvidconv ! omxh264enc bitrate=4000000 profile=8 ! video/x-h264,stream-format=byte-stream,profile=high ! h264parse ! mux. demuxer.audio_0141 ! audio/mpeg ! queue max-size-time=0 max-size-buffers=0 ! aacparse ! mux. matroskamux name=mux ! filesink location="サンプル.mkv"
~~~
ハードウェアエンコーダ/デコーダを使用し実時間の半分程度で再エンコード可能。

# 注意
- grinch kernel適用は失敗するようです。
- まったく同じコマンドを実行しているにもかかわらずアップグレード中の挙動が異なったりフリーズしたりすることがありました。失敗して起動しなくなった場合もflashからやり直してみることをおすすめします。
Node.js+pm2で環境立ち上げる時のメモ

# 読もう

https://github.com/sindresorhus/guides/blob/master/npm-global-without-sudo.md
http://pm2.keymetrics.io/docs/usage/quick-start/
https://qiita.com/poruruba/items/10df0d94e9127797498f
https://qiita.com/kenta8813/items/748d09c92c994dc74267
https://qiita.com/you21979@github/items/588bddb59378ce7303a2 (参考: pm2使わない場合)
http://pm2.keymetrics.io/docs/usage/startup/#generating-a-startup-script

# やりたいこと
サーバーが再起動しても大丈夫なnodejsアプリ環境を立てる。pm2は専用の一般ユーザーで動かしたい。
のやりかたを毎回忘れるのでメモしたい。

# かんきょう
Arch Linux on Raspberry Pi（**初代**）

#てじゅん

```bash
# aptやpacman、rpmなりでnodejs関連パッケージをインストールしておく
sudo pacman -S npm git

# pm2はsshからリモートサーバーへnon interactive shellでつなぐので、/usr/bin以外にPATHを通しづらい。
# なのでpm2だけは先にglobal installしておく。
sudo npm i -g pm2

# サービス用ユーザーnodeを作成(sudo禁止)
$ sudo useradd -m node 

# nodeユーザーにもssh公開鍵を登録しておく。（pm2 deploy用）
# sudo mkdir /home/node/.ssh
# sudo vim /home/node/.ssh/authorized_keys
# sudo chown node:node /home/node/.ssh/authorized_keys
# sudo chmod 600 /home/node/.ssh/authorized_keys

# nodeでログイン
$ sudo su - node

# npm -gを一般ユーザーでできるようにする。
# https://github.com/sindresorhus/guides/blob/master/npm-global-without-sudo.md
$ mkdir ~/.npm-packages
$ echo prefix=\${HOME}/.npm-packages >> .npmrc
$ echo NPM_PACKAGES="\${HOME}/.npm-packages" >> .bashrc
$ echo PATH="\$NPM_PACKAGES/bin:$PATH" >> .bashrc
$ source ~/.bashrc

# PM2
$ pm2 startup
# ↑この結果は環境によって異なる。
# sudoできないのを察してsudoできる環境で改めて↓をやれと言ってくる。親切すぎる。
# sudo env PATH=$PATH:/usr/bin /home/node/.npm-packages/lib/node_modules/pm2/bin/pm2 startup systemd -u node --hp /home/node
# nodeユーザーからlogoutし、一般ユーザーで言われるがまま実行。

# /etc/systemd/system/pm2-node.service の [Service]セクションに
# Restart=always
# を書き足してサービス起動
$ sudo systemctl daemon-reload
$ sudo systemctl start pm2-node

```

# イテレーション
```bash
$ git commit
$ git push

# pm2 deploy中に何度もpassphraseを聞かれるのでssh-agent使うと楽
$ ssh-add ~/.ssh/id_rsa
$ pm2 deploy dev
```

# ？？？
- npm -gを一般ユーザーでできるようにする、でググったら /usr/local/lib/node_modules のowner変えればいいよ！とか出てきてパワープレイすぎると思いました。
nuxt 2 で静的ファイルの生成時にファイル名を固定したい。

### 2019/12/24

現状、macとwindowsで出力形式が違います。
解決ができていないので、以下記事は微妙。

---

`nuxt generate`で静的ファイルの生成・納品をしていると「差分でほしい」とおねがいされることがある。

差分で受領するメリットは

- 修正したファイルのみアップロードするため、先祖返りが起きにくい。
- 修正箇所が比較しやすい。

の２点。

ディフォルトでは、ファイル名がhashになり`nuxt generate`のたびに全ファイル修正となる。また、修正箇所を比較するにもminifyされているため、diffできない。

上記２点のメリットが無くなってしまうので、設定を変更しておく。

## 静的ファイルの生成時にファイル名を固定

`nuxt generate`実行時は、hashを使わないようにfilenamesに指示を書く。正確には`nuxt build`も含めhashがつかない。


```nuxt.config.js
  build: {
    filenames: {
      app: () => '[name].js',
      chunk: () => '[name].js',
      css: () => '[name].js',
      img: () => '[path][name].[ext]',
      font: () => '[path][name].[ext]',
      video: () => '[path][name].[ext]'
    },
    ...
  },
```
参考：https://ja.nuxtjs.org/api/configuration-build/#filenames

## 静的ファイルの生成時はminifyしないようにする。

というか、改行してほしかったんだけど、Nuxtディフォルトの機能（[html.minify](https://ja.nuxtjs.org/api/configuration-build/#html-minify)）では無理であった。



---

差分ファイルのみのメリットとなりそうだ。無念。
【Mac】画面分割アプリケーション「Spectacle」

Windowsは標準で「スタートマーク ＋ ←」、「スタートマーク ＋ →」で
画面分割できますが、Macはできません。私のおすすめは「Spectacle」というAppです。

▼ダウンロードはこちら▼
https://www.spectacleapp.com/

![スクリーンショット 2018-11-17 14.18.28.png](https://qiita-image-store.s3.amazonaws.com/0/89106/5b12817a-bba0-b991-42c8-0ed18ea97ec6.png)
埋め込みRuby（erb）のおさらい <%  %> <%= >  前半はコントローラーとルーター

11分までコントローラとルーター、アクション
rails　は　ページを作る際に、まず、コントローラー　を作る。(rails g) MVCで言う所の、cである。

例、>>　rails g controller home     rails　　generate　　　➡️生み出すの意


```(app/controller/home_controller.rb)
```

>controllerを作ると、　　Viewディレクトリにも　　home　ができる。

>この中にviewファイルを作っていく。（htmlファイル）

>新しくページを追加していく際は、　　**アクション**というものを追加していく

>アクションとはアクセスがきた時に、具体的にどのviewファイルを返すのかという処理行う

>アクセスがきた時に、ルーター（routes.rb)というところで、どのcontrollerのアクションに、処理を任せるのかを記述する


```routes.rb

Rails application.routes.draw do
  
  root to: `home＃index`  ➡️rootはローカルホスト3000のこと。ここではその　ルートにきた時に、
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　homeコントローラーの　インデックスアクションの処理を実行するということ
end
```

該当するのはこちら↓

```home_controller.rb

class HomeController < ApplicationController

 def index   ➡️この部分がルーターファイルで実行された。
 end
end
```

def indexをhtmlfileを返すようにしたい↓

viewsディレクトリの対応する、homeディレクトリの中に、アクションとおんなじ名前のhtmlファイルを作成する。今回は
index.html.erb

ここで作ったのはviewsの中のhomeの中のindexhtmlファイル


ここまでのおさらい

***まずアクセスがきた時に　routes.rbのなかで、どこの　コントローラーアクションに、処理を任せるか　　を記述した***

railsには名前の命名規則の対応がある

アクションとおんなじ名前の***html***を自動で返すことになる

----


#.erbの拡張子の意味


***拡張子をつけるとrubyのコードを埋め込むことができる***

```index.html.erb
<h1>これはトップページです＜h1>
<%= request.url %>・・・・・・・・・・request.urlこの部分はプログラミングのコードで普通のhtml
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　ファイルには組み込めないのだが、.erbとすることで埋め込むことができる
                現在アクセスしているurlを表示してくれる

その場合、<% %>を使う　　　<%= %>
```

もう一つ学習すると

```index.html.erb

<h1>これはトップ<h1>

<% if request.url == 'http://localhost3000' %>

   <h2>これは自分のパソコn<h2>

<% else %>

   <h2>自分のパソコンで動かし〜<h2>
<% end %>

```
---

#<%=   %>と<%    %>の違い


<%=   %>は実際表示させたい時のみ

<%    %>は処理
GCP の Deep Learning VMが、apt -y upgrade で停止していた場合の対処方法

# apt -y upgradeで停止してライブラリがインストールできなくなり対処した方法
こんにちは、chlochanです。いつの日か仕事に生かせる事を目指して、休日とかにDeep Learning の勉強をしています。GCP の Deep Learning VM を使っていますが、'18/11/10に、新しく作ったVMにインストールしようとしたら、急に以下のエラーが出て必要なライブラリのインストールができなくなりました。Deep Learning VM のページでみると最終更新が2018/11/10 3:13になってましたので、このバージョンで何かやらかしたようです。11/15に再度tf-latest-gpuでVMを作ったところ解決していたのですが、念の為以下にその時の対処方法を書き残します。

~~~bash
E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?
~~~
プロセスみたところ、
apt -y upgrade
で止まっているようだったので、そのプロセスをkillしました。

~~~bash
$ ps -aux
$ sudo kill <"apt -y upgrade" のプロセス番号>
~~~
その後ネットの情報を頼りに以下を実行してなんとか動く様になりましたが、正しい対処方法かわかりません。まあ、消したのは全部varの下のファイルだからいいのかな...

~~~bash
$ sudo rm /var/lib/apt/lists/lock
$ sudo rm /var/cache/apt/archives/lock
$ sudo rm /var/lib/dpkg/lock
$ sudo rm /var/cache/debconf/*
$ sudo dpkg --configure -a
~~~
上記の最後のコマンドを実行すると、以下の様にGRUBの更新をしないで抜けるか聞かれるのですが、Yesを選び更新せず終了します。

~~~bash
Continue without installing GRUB? 
~~~

11/15、tf-latest-gpuでVMを作り直したところ、上記の問題は既に直っていましたが、再度発生したら上記の方法で対処します。
呼び出しメソッドに渡す引数をJunitで確認する方法

# 目的
* PG内でメソッドを呼び出しを行うが、そこに渡している引数を想定通り渡せているか確認を行う
    * メソッドの返り値が画像等、Junitでの検証が行いにくい場合に想定通りに引数を渡せているかで検証を行う
* Mock化したクラス・メソッドに渡した引数で返り値を制御したい

# 環境準備
Mavenの場合
以下タグを`<dependencies>`の配下に追加

~~~ xml
        <dependency>
            <groupId>org.jmockit</groupId>
            <artifactId>jmockit</artifactId>
            <version>1.8</version>
            <scope>test</scope>
        </dependency>
~~~

# Mock化手順
今回は例として、`Randon#nextInt(int)`をモック化します。

## Test対象クラス
~~~ java
    public int  getRandomName(int min, int max){
        return new Random().nextInt(max-min) + min;
    }
~~~

## 実際のチェック実装
~~~ java

     final int max;
     final int min;
     //RandomをMock化
     MockUp<Random> mocked = new MockUp<Random>(){
        @Setter 
        private int expectedArg;
        /**
         * {@link Random#nextInt} に想定した引数を指定しているか確認.
         */
        @Mock
        public int nextInt(int argMax) {
            //引数チェック
            assertEquals("引数チェック",expectedArg,argMax);
            //モックとしては最大値を返却
            return argMax;
        }
    };
~~~
## Test実行
ここで`getRandomName(int,int)`を呼び出した際に中でモック化された`Randon#nextInt(int)`が呼び出される。(引数チェックも合わせて実施される)

~~~ java
//想定値をモックに指定
mocked.setExpectedArg(8);
//実際のテスト対象メソッド呼び出し
new TestTargetClass().getRandomName(2,10);
~~~

## Test完了後
忘れずに`tearDown()`を呼び出す
後続の無関係のテストにも影響する可能性があるので、忘れずに後処理

~~~ java
mockedRandom.tearDown();
~~~
## おまけ
呼び出し回数を引数から取得することができる

~~~java
        @Mock
        public int nextInt(Invocation inv, int argMax) {
            System.out.println("呼び出し回数＝"+inv.getInvocationCount());
            assertEquals("引数チェック",expectedArg,argMax);
            return argMax;
        }
~~~

Mock化されたメソッドの引数の前に`Invocation`を引数として追加する。
`Invocation#getInvocationCount()`で呼び出し回数を取得可能
コンピュータ書籍売上ランキング上位の書店をGoogle Mapで巡る

プログラミングを学ぶとき、Web上の情報も便利ですが、体系的に学びたい場合には書籍は有効な手段です。
売上ランキング上位の書店で書籍を選ぶために、書店をGoogle Mapに整理しました。

# 売上ランキングから書店を探す

書籍を買う場合、Amazonなどのオンライン書店もありますが、店頭で選びたいことはよくあります。
ただ、近所にある小さな書店では技術書の選択肢が少なく、欲しい本が見つからないかもしれません。
また、大きな書店でもコンピュータ書コーナーが小さいと専門書の品揃えには限界があります。

プログラミングなどの専門書が豊富に取り揃えられている書店を探すには、「コンピュータ書の売上ランキング」で上位にランクインしている書店を探すのが効率的です。
「コンピュータ出版販売研究機構」(CPU)にて「コンピュータ書籍　書店別売上ランキング」が毎年公開されています。

2021年版が公開されましたので、最新の内容を反映しました。
http://www.computerbook.jp/archive/detail/5841

2020年版はこちら
http://www.computerbook.jp/archive/detail/5836

2019年版はこちら
http://www.computerbook.jp/archive/detail/5831

2018年版はこちら
http://www.computerbook.jp/archive/detail/5825

2017年版はこちら
http://www.computerbook.jp/archive/detail/5815

このランキングを元に、近くの書店を探すことにします。

## 地図上に書店をプロットする

店名だけだと現在地から近い場所がわからないことも多く、地図上にプロットされていると助かります。
そこで、Google Map上にまとめてみました。

以下のリンクからGoogle Mapを開くと、近くにある「コンピュータ書の売上ランキング」上位の書店が簡単に見つかります。

## Google Mapでチェックする

- コンピュータ書ランキング上位書店（都内編）
https://goo.gl/maps/1dB51EZhpv32

- コンピュータ書ランキング上位書店（北海道編）
https://goo.gl/maps/buCKPDuuPMK2

- コンピュータ書ランキング上位書店（東北編）
https://goo.gl/maps/16EqBxjKSCz

- コンピュータ書ランキング上位書店（関東編）
https://goo.gl/maps/8sg1r6WYW3N2

- コンピュータ書ランキング上位書店（甲信越編）
https://goo.gl/maps/ZNy7kyc3DNA2

- コンピュータ書ランキング上位書店（北陸編）
https://goo.gl/maps/hfGiG5DykAD2

- コンピュータ書ランキング上位書店（東海編）
https://goo.gl/maps/xB9bfFkkrYA2

- コンピュータ書ランキング上位書店（関西編）
https://goo.gl/maps/iT7kYhnGx9L2

- コンピュータ書ランキング上位書店（中国編）
https://goo.gl/maps/Umznsvv4HcJ2

- コンピュータ書ランキング上位書店（四国編）
https://goo.gl/maps/fcv1k6ugR7R2

- コンピュータ書ランキング上位書店（九州・沖縄編）
https://goo.gl/maps/HMJbRNZNVsw
jsdoで日能研

#概要

jsdoで日能研やってみた。

#サンプルコード

```
for (var i = 0; i <= 654321; i += 6) 
{
    var s = i.toString();
    if ((s.search("1") != -1) && (s.search("2") != -1) && (s.search("3") != -1) && (s.search("4") != -1) && (s.search("5") != -1) && (s.search("6") != -1))
    {
        var i5 = Math.floor(i / 10);
        if (i5 % 5 == 0)
        {
            var i4 = Math.floor(i / 100);
            if (i4 % 4 == 0)
            {
                var i3 = Math.floor(i / 1000);
                if (i3 % 3 == 0)
                {
                    var i2 = Math.floor(i / 10000);
                    if (i2 % 2 == 0)
                    {
                        document.writeln(i);
                    }
                }
            }
        }
    }
}

```

#成果物

http://jsdo.it/ohisama1/CoQX

以上。
MySQL8のパスワード変更

## はじめに
初めてQiita投稿です。

Mac上のMySQLを一度きれいにしたいと思い、
[どうしよう！困った時のMac上のMySQLのアンイストール&再インストール、動作確認手順](https://qiita.com/akiko-pusu/items/aef52b723da2cb5dc596)
こちらの記事を参考にアンイストールと再インストールを行いました。  

手順の中でパスワード設定を行わなかったため、自分でいろいろとやっていたのですが、気づいたら「パスワード入力しないとMySQLにログインできないよ」って言われてしまいました。

パスワードのリセットと再設定を備忘録として。

## 手順
### セーフモードで起動しパスワードなしでログイン
  
```
// mysqlを停止
$ mysql.server stop

// mysqlをセーフモードで起動
$ mysqld_safe --skip-grant-tables &

// パスワードなしでログイン
$ mysql -u root
```

### 一度パスワードをリセットする。 
```
mysql > UPDATE mysql.user SET authentication_string=null WHERE User='root';

mysql > exit;
```

### MySQLを再起動し、空のパスワードでログインして、パスワードを再設定
```
// MySQLを再起動
$ mysql.server stop
$ mysql.server start

// パスワードなしでログイン
$ mysql -u root
password:  //入力せず,Enter

// パスワードを再設定
mysql > USE mysql;
mysql > ALTER USER 'root'@'localhost' identified BY 'hogehoge';

mysql > exit;
```

### パスワードが設定できているか確認しておく
```
$ mysql.server stop
$ mysql.server start

$ mysql -u root -p
password:  // 先程設定したパスワードを入力

//　ログインできればOK
```

## 参考
- [MySQL8でユーザーのパスワードの変更 / リセット方法](http://www-creators.com/archives/5574#MySQL-2)

こちらの記事には、パスワード認証プラグインについても記載があり
DataGripからJDBC経由でAthenaを利用する

Amazon AthenaにはAWSのマネージメントコンソールから、SQL実装＆クエリログ保存ができるUIが提供されており、便利に使えます。
ちょっとした調査や分析であればこれで十分なのですが、ローカルのDB統合環境からつなげるとより捗りそうです。

もともと、SQL　Serverを扱う際にSQL Operation Studioを使っていたのですが、UIや動作でつらみが結構あり、DataGripに切り替えたところ劇的に改善されたので、その流れで今度はログ調査でよく利用しているAthenaの接続を試みることにしました。

## Athenaにローカル接続できる専用ツールは見つからない
GUIの専用ツールは見つけられず（2018/11/15時点）。あったら使ってみたい

## Athena用のJDBCドライバが公式に配布されている
AWSからJDBCドライバが提供されており、これを使えばツールからの接続ができそう
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/connect-with-jdbc.html

> AthenaJDBC42-2.0.5.jar は、JDBC 4.2 と互換性があり、JDK 8.0 以降が必要です。

## すでに試している方がいる（欧州）
eu-west-1（アイルランド）リージョンですでにDataGrip -> Athenaの手順をまとめてくれている方がいました（感謝）。
今回はこちらを参考に、Athenaのデータストア（S3）が東京リージョンの場合の手順をまとめてみます。
https://medium.com/datamindedbe/connect-to-aws-athena-using-datagrip-c34762e37a17

### JDBC接続に必要なもの（事前準備）
* Athenaに接続可能な管理ポリシーを持つIAMのアクセスキー取得
    * 必要なポリシー
        * https://docs.aws.amazon.com/ja_jp/athena/latest/ug/managed-policies.html

* 実行結果保存用のS3バケット作成

* DataGripのインストール
    * https://www.jetbrains.com/datagrip/ ※30日間試用可

* Athena接続用JDBCドライバのダウンロード
    * https://docs.aws.amazon.com/ja_jp/athena/latest/ug/connect-with-jdbc.html
        * AthenaJDBC42-2.0.5.jar ※JDK8.0以降が必要

## 接続までの手順
### DataGrip上にAthena接続用JDBCを登録
#### メニューの `Driver` より新規ドライバの追加画面へ
<img width="355" alt="スクリーンショット_2018-11-16_14_27_57.png" src="https://qiita-image-store.s3.amazonaws.com/0/1403/5714d34f-c8b4-76e1-90d4-506cad6e4522.png">

#### AthenaのJDBCを登録
* Driver filesにダウンロードしてきたJDBCのjarファイルを指定
* Classで `com.simba.athena.jdbc.Driver` を選択
<img width="737" alt="Data_Sources_and_Drivers_と_test.png" src="https://qiita-image-store.s3.amazonaws.com/0/1403/075e1f37-7103-d9dc-009f-2f21cd8fdecf.png">

#### メニューの `Data Source` より `Athena` を選択し、接続設定へ
<img width="396" alt="スクリーンショット_2018-11-17_11_34_00.png" src="https://qiita-image-store.s3.amazonaws.com/0/1403/e723ee14-56c4-43a1-365a-799842b28332.png">

#### Athenaの接続情報を登録
* `General` タブにであることを確認
* Userにアクセスキー、 Passwordにシークレットアクセスキーを入力
* URLに `jdbc:awsathena://athena.ap-northeast-1.amazonaws.com:443/` を入力
<img width="724" alt="Data_Sources_and_Drivers.png" src="https://qiita-image-store.s3.amazonaws.com/0/1403/a3f7d754-82b5-4b09-9a1c-339461fc7835.png">

* `Adbanced` タブに移動
* S3OutputLocationに `s3://実行結果保存用のバケット名` を入力

※ここではAthenaのデータストア、実行結果保存用のバケットともに `ap-northeast-1` の場合を想定
*Regionが異なる場合は、同じリスト内にあるAwsRegion欄を設定する必要があるかも知れません
<img width="729" alt="Data_Sources_and_Drivers_と_test.png" src="https://qiita-image-store.s3.amazonaws.com/0/1403/b996507e-db5d-188e-99f3-d468c367da9d.png">

* `General` タブに再び移動
* Test　Connectionをクリック
* ボタン横に「**Successful**」と表示されれば接続成功 🎉
* 右下のOKを押して、接続情報の登録を完了

## RubyMineなどのDatabase機能でも同様の接続が可能
RubyMineなどのDatabase機能も、DataGrip互換の機能が利用できるようで、そちらからもAthena接続が可能でした。

DataGrip使えるライセンスじゃない　or 買うほどじゃないという方はありかもしれません。
（個人的には独立して使えるDataGripがおすすめ）
railsチュートリアル４章〜ブロック〜

#4.3.2 ブロック
配列　と　範囲　はいずれも、　”ブロック” を伴うさまざまな　メソッド　に対して応答することができます。
ブロックは、Rubyの極めて強力な機能であり、かつわかりにくい機能でもあります....



```
>> (1..5).each { |i| puts 2 * i }       ➡︎    (1..5)が範囲オブジェクト。　　.eachがメソッド。　 { |i| puts 2 * i }がブロック。
2
4
6
8
10
=> 1..5
```


>上のコードでは、**範囲オブジェクトである(1..5**)に対して**eachメソッド**を呼び出しています。メソッドに渡されている**{ |i| puts 2 * i }**が、**ブロック**と呼ばれる部分です


|i|では変数名が縦棒「|」に囲まれていますが、
これはブロック変数に対して使うRubyの構文で、
ブロックを操作するときに使う変数を指定します。
この場合、**範囲オブジェクト**の**eachメソッド**は、**i**という1つのローカル変数を使ってブロックを操作できます。そして、範囲に含まれるそれぞれの値をこの変数に次々に代入してブロックを実行します。
ブロックであることを示すには波カッコ で囲みますが、次のようにdoとendで囲んで示すこともできます。

とりあえずここでストップ
zsh 5.6で行われたパイプのパラメタ展開のバグ修正

# どんなバグか

zshでパイプを使ったとき最後の右端のコマンド以外は別プロセスのサブシェルで実行されます。したがって以下のようなことをしても`a`への値の設定はサブシェル側で実行され親へは影響しません。

```zsh
% a=1 | cat; echo $a

```

しかし5.6になる前のzshでは以下のようなことをすると親の側の`a`に値を設定できてしまいました。

```zsh
% echo ${a:=1} | cat ; echo $a
1
1
```

また`$jobstatus`などの特別なパラメタがサブシェルの状態ではなく親側の状態に基づく値に展開されてしまっていました。

これはなぜかパラメタ展開をforkする前の親プロセスの側で行うようになっていたからです。結構長いことこの状態だったようなのですが、パラメタ展開をサブシェル側で行うようにすることで、5.6以降はこの問題は修正されました。

# 影響

このせいでzplugのインストーラーがインストール完了前に終了してしまうようになりました。([報告済み](https://github.com/zplug/installer/issues/11)) もともとこちらがきっかけで調べ始めてたどり着いたわけですが。

でもこの件は単なるバグフィックスという位置づけらしく、READMEのIncompatibilities since ...やNEWSでは全く触れられていなくて、かろうじてChangeLogに以下のような記述があるのみです。

```text
2018-05-01  Peter Stephenson  <p.stephenson@samsung.com>

	* from branch fork_early, c.f. 42702: Src/exec.c: Various changes
	to make forking for a command work better.  Move the fork even
	earlier; add case of non-final pipeline elements; _exit when
	forked; remove previous early fork in caller; replace fix for
	leaked file descriptor in pipeline handling.
```

これでわかれといわれてもかなりつらい。
Nuxt でストアから GraphQL を扱う方法

#概要

この記事ではVuexストア内からGraphQLを扱う方法を解説します。

Vueコンポーネントから扱う方法や、NuxtプロジェクトにGraphQLを導入する方法自体は、[Nuxt.jsでGraphQLを扱う方法](https://qiita.com/takanorip/items/d1e8618800d951780f4b)に詳しく解説されています。

※以下ではApolloクライアントの導入および設定はできているものとします。

# クエリの発行

Vuexストア内では`this.app.apolloProvider.defaultClient` でApolloクライアントにアクセスできます。

```store/index.js
import fetchUser from '~/apollo/queries/fetchUser'

export const actions = {
  async fetchUser(context) {
    const response = await this.app.apolloProvider.defaultClient.query({
      query: fetchUser,
    })

    console.log(response)
  }
}
```

```apollo/queries/fetchUser.graphql
{
  user {
    id
  }
}
```

また、以下のようにクエリをベタ書きすることもできます。
（`graphql-tag`パッケージのインストール＆インポートが必要です）

```store/index.js
import gql from 'graphql-tag'

export const actions = {
  async fetchUser(context) {
    const response = await this.app.apolloProvider.defaultClient.query({
      query: gql`
        {
          user {
            id
          }
        }
      `,
    })

    // ユーザーIDをセットする
    context.commit('setUser', response.data.user.id)
  }
}
```

#ミューテーションの発行（変数なし）

ミューテーションの場合は`mutate()`関数を使用します。

```store/index.js
import updateUser from '~/apollo/mutations/updateUser'

export const actions = {
  async updateUser(context) {
    const response = await this.app.apolloProvider.defaultClient.mutate(
      {
        mutation: updateUser,
      }
    )
  }
}
```

```apollo/mutations/updateUser.graphql
{
  updateUser(
    user: { id: 1, nickname: 'nick' }
  )
}
```

#ミューテーションの発行（変数あり）

ミューテーションを使う場合、送る内容はつど変わるのが普通だと思います。
そういう場合は変数を`mutate()`の`variables`に格納します。

```store/index.js
import updateUser from '~/apollo/mutations/updateUser'

const user = {
  id: 1,
  nickname: 'nick',
}

export const actions = {
  async updateUser(context) {
    const response = await this.app.apolloProvider.defaultClient.mutate(
      {
        mutation: updateUser,
        variables: {
          user: user,
        }
      }
    )
  }
}
```

```apollo/mutations/updateUser.graphql
mutation updateUser(
  $user: UserInput
) {
  updateUser(
    user: $user
  )
}
```

上記の2番目の`$user`に、`mutate()`の`variables`に指定した`user`の値が入る形になります。

#感想
NuxtもGraphQLも情報がまだ少なくつらみがありますが、慣れると便利でよいですね。
Pythonで競プロに挑む日誌 vol.19 ~制約条件を利用する練習~

# 現在の目標
* 2018年内に茶色になる**←イマココ**
 * [ABC](
https://kenkoooo.com/atcoder/?user=&rivals=&kind=category) の A, B 問題を全部解く
* 2018年度内に緑色を取得する
* 水色になったら, [APG4b](https://beta.atcoder.jp/contests/apg4b) で C++ にも手を出す

# 今日のおはなし
### 結論
場合の数は大切.

#### 解いた問題
[B - Sum of Three Integers ](https://beta.atcoder.jp/contests/abc051/tasks/abc051_b)

#### for 文 2 つで時間かかった解答

```answer1.py
# coding: utf-8
K, S = map(int, input().split())
cnt=0
for x in range(K+1):
    for y in range(K+1):
        z = S-x-y
        if 0<=z<=K:
                cnt+=1
print(cnt)

# 実行時間 1490ms
```
[解説](https://atcoder.jp/img/abc051/editorial.pdf) 通りの方法で解けました.  解くには解けましたが, 時間がかかりました.

#### 時短版解答
問題の制約条件を使えば, for ループを減らして数え上げるようです(ほかの方の解答を参照).

```answer2.py
# coding: utf-8
K, S = map(int, input().split())
cnt=0
for x in range(K+1):
    yz = S - x
    if yz < 0:
            break
    elif yz > 2*K:
            continue
    else:
            cnt += yz + 1 - 2 * max(0, yz - K)
print(cnt)

# 実行時間 18ms
```
最後の一行が咀嚼できていないのですが, おそらく下記のようなアルゴリズムでしょうか. 

* x を制約条件内 (0 から K までの K+1 個) で順番に調べる. 
* ある x に対して, y + z が制約条件を満足しているか調べる. 
    * 「y + z < 0 ならば, 以降の x に対して y + z < 0」なのでループ終了 (= カウント終了).
    * 「y + z > 2K」の場合, 制約を満足していないので次の x に更新する.
* y + z が制約条件を満たしている場合, ある x に対する y + z の場合の数の候補は (y + z + 1) 通り. そこから, 条件に合致しない場合の数を差っ引く?

# むすび

制約条件を利用するには数学力がもっと必要.  間違ってたらご指摘ください.
webサーバーソフトウェア

## Apache（アパッチ）

* HTTPのサービスに特化
* webサービスが使うであろう機能がたくさん搭載されている
* 重たい仕事も全部自分でこなす
* たくさん機能が搭載されているため、メモリ使用量が多い

## nginx（エンジンエックス）

* HTTP以外のサービスにも柔軟に対応できるような設計
* 早く処理するため、自分以外に処理を割り振るのが得意
* シンプルな設計で、メモリ使用量が少ない
* PHPの処理機能がない
【VB6・VB】古いコードのリプレース　まとめです。

#【VB6・VB】古いコードのリプレース　まとめ

##はじめに

VB6や古いバージョンのVBから、.NET 4.*以降のVBまたはC#にリプレースする案件を多くやってきたので
よくあるリプレースの方法をまとめておく。

## 注意点

 ・using/Importは省略しています

 ・リプレース後は**.NET Framework 4.5以降**を想定しています

 ・動作確認はしていますが、保証は致しかねます


## メニュー
各記事へのリンクです。
VBリプレースに関する話は一通り網羅する予定。

###[その１　コントロール配列](https://qiita.com/so_rei/items/2f667c7c0f415a569bd1)

###[その２　旧関数いろいろ](https://qiita.com/so_rei/items/e207edebe835cb1286cd)

###[その３　On Error ～](https://qiita.com/so_rei/items/2a73dcd5c58b67cfaae0)

###[その４　SQL](https://qiita.com/so_rei/items/932cbc0e0dcf506fab3d)
vbsの作法 その7

#概要

vbsの作法、調べてみた。
wavファイルを作ってみた。

#サンプルコード

```
Function IntToString(Value)
	Dim Part1, Part2, Part3, Part4
	Part1 = (Value And &h000000FF) Mod 256
	Part2 = ((Value And &h0000FF00) \ 256) Mod 256
	Part3 = ((Value And &h00FF0000) \ 65536) Mod 256
	Part4 = ((Value And &hFF000000) \ 16777216) Mod 256
	IntToString = Chr(Part1) & Chr(Part2) & Chr(Part3) & Chr(Part4)
End Function

SoundDataSize = 8000
SampleRate = 8000
BitsPerSample = 1
pi = 3.14
dim stm
set stm = WScript.CreateObject("adodb.stream")
stm.type = 2
stm.charset = "iso-8859-1"
stm.open
WAVHeader = "RIFF" & IntToString(36 + SoundDataSize) & "WAVEfmt " & Chr(&h10) & Chr(&h00) & Chr(&h00) & Chr(&h00) & Chr(&h01) & Chr(&h00) & Chr(&h01) & Chr(&h00) & IntToString(SampleRate) & IntToString(SampleRate) & Chr(&h01) & Chr(&h00) & Chr(&h08) & Chr(&h00) & "data" & IntToString(SoundDataSize)
for i = 0 to len(WAVHeader)
	v = mid(WAVHeader, i + 1, 1)
	stm.writeText(v)
next
ds = 220 * 2 * pi / 8000
s = 0
for i = 0 to 8000
	v = 120 * sin(s)
	stm.writeText(ChrW(v))
	s = s + ds
next
stm.saveToFile "test.wav", 2
stm.close

```

以上。
Parcel+VueJS環境づくりまで(多分最終)

# 古い情報の記事にたまに反応が来るので最終版書きました

# parcelとは
https://parceljs.org/
コンフィグ無しでウェブアプリケーション作ろうぜ・・・って言う感じのビルドツール

# 公式サイトでドキュメントあるのでみたらとても簡単になってます
https://parceljs.org/recipes.html#vue

# 環境構築
npm install --save vue
npm install --save-dev parcel-bundler

```index.html
<html>
<body>
  <div id="app"></div>
  <script src="./index.js"></script>
</body>
</html>
```

```src/index.js
import Vue from 'vue/dist/vue.esm.js';
import MyApp from './MyApp.vue';

new Vue({
  el: '#app',
  components: {
    MyApp,
  },
  template: '<my-app></my-app>',
});
```

```MyApp.vue
<template>
  <div>
    {{ title }}
  </div>
</template>

<style>
</style>

<script>
  export default {
    data() {
      return({
        title: 'Hello World!',
      });
    },
  }
</script>
```

```package.json
// parcel起動コマンド登録のため下記start部分を追加
"scripts": {
  "start": "parcel index.html"
}
```
データ分析Pythonオレオレチートシート

雑多なメモになりますが、
自分用データ分析する際に使用する時にそこそこ使うやつ。
※随時更新

### データ読込

```
import pandas as pd
// Excel
df = pd.read_excel("./sample.xlsx")

// CSV
df = pd.read_csv("./sample.csv")
```

### データの形状確認

```
df.shape

(388, 12) // 388行、12列のデータ
```

### 欠損値の確認

```
df.isnull().sum()
```

### データの中身にどういった値があるのか確認
```
for col in df.columns:
    print(col + ':\n' + str(df[col].unique().tolist()) + '\n')
```

### 散布図

```
import matplotlib.pyplot as plt

pd.plotting.scatter_matrix(df_linear, figsize=(10,10))
plt.show()
```

### いらない説明変数の削除(列を消す)

```
// 1列分消す
df = df.drop("hoge", axis=1)

// 複数列消す
drop_params = ["hoge", "fuga"]
df = df.drop(drop_params, axis=1)
```

### 欠損値を埋める

```
// nothingという文字列で欠損値を埋める
df["hoge"].fillna("nothing", inplace=True)

//　複数行は上記のいらない変数を複数消した方法と同じように配列を渡すことで実現可能

// 平均値で欠損値を埋める
df["temp"] =.fillna(df["temp"].mean(), inplace=True)
```

### 名寄せする

```
encode_rules = {
    "female": "female",
    "Female": "female",
    "FEMALE": "female"
}
df["sex"] = df["sex"].map(encode_rule)
```

### ダミー変数化する

```
dummy_params = [
    "sex",
    "type",
]

df = pd.concat([df, pd.get_dummies(df[dummy_params])], axis=1)
```

### 値があれば1,なければ0としてフラグ変数を作る

```
df["hoge_flag"] = df["hoge"].map(lambda x:1 if not pd.isnull(x) else 0)
```

### 2変数間の差をとり、新しい変数を作る

```
df["temp_diff"] = df["temp_inside"] - df["temp_outside"]
```
## 列の並び順を変える
```
// 説明変数が量的変数と質的変数が混在している場合に標準化などを行うために量的変数だけ列の前半にまとめたいときなどに使用
df = df.ix[:, [0,2,1]]
```

### 標準化する
```
// トレーニングデータとテストデータに分ける
X_train,　X_test,　y_train, y_test = train_test_split(X.values, y.values, test_size=test_size, random_state=1234)

// 標準化
stdsc = StandardScaler()
# trainの量的変数だけ標準化
std_idx = 4
X_train_std = stdsc.fit_transform(X_train[:,:std_idx])

# trainの質的変数をがっちゃんこ
X_train = np.insert(X_train_std, [std_idx], X_train[:,std_idx:], axis=1)

# testの量的変数だけ標準化
X_test_std = stdsc.transform(X_test[:, :std_idx])

# testの質的変数をがっちゃんこ
X_test = np.insert(X_test_std, [std_idx], X_test[:,std_idx:], axis=1)
```
日能研の問題をphpで解いてみた(2018/11)

[日能研の広告の問題](https://www.nichinoken.co.jp/shikakumaru/201811_sa)を解く記事がpythonとcとgoで上がっていたので・・・

- [日能研の問題を解く(2018/11)](https://qiita.com/sora410/items/bd349c48e7920e7f2573)
- [日能研の問題をCで解いてみた(2018/11)](https://qiita.com/98hira/items/7a704fa0d1082c2e1190)
- [日能研の問題をGo言語で力づくで解いてみた(2018/11)](https://qiita.com/spiegel-im-spiegel/items/90332789f8a6f98c670d)

phpで実装しようかと。
まず、pythonのitertools.permutations()の部分を実装

```php:permutations.php
<?php
function permutations($list, $length, $case=[], $results=[])
{
    $list_count = count($list);
    if ($length>$list_count){               // エラー
        return [];
    }
    if ($length===0 || $list_count===0){    // 探索終了
        $results[] = $case;
        return $results;
    }
    for ($i=0; $i<$list_count; $i++){
        $target = $list;                    // 初期状態に戻す
        array_push($case, $target[$i]);     // 値を追加
        unset($target[$i]);                 // リストから値を削除
        $target = array_values($target);    // 添字再設定
        // 次の桁を探索
        $results = permutations($target, $length-1, $case, $results);
        array_pop($case);                   // 値を削除
    }
    
    return $results;
}
```

すべての組み合わせが取得できれば、あとはチェック。
ちょっと冗長的なところもありますが。

```php:日能研201811.php
<?php
require('./permutations.php');

$results = permutations([1,2,3,4,5,6], 6);

foreach($results as $case){
    $check = true;
    for ($i=0, $v=0; $i<6; $i++, $v *= 10){
        $v += $case[$i];
        if ( $v % ($i+1) !== 0 ){
            $check = false;
            break;
        }
    }
    if ($check){
        print(implode(',', $case) . "\n");
    }
}
```

pythonいいなぁ
Excelのテーブルから最速で全行削除する

# Excelのテーブルを全行削除

Excel2007以降には「Ctrl」+「T」でテーブルを作成する機能がある。
ListObjectsにまとめられていて使い勝手がいいので、
VBA使いとしては業務自動化に当たって重宝したい機能である。
そんな中で4000行程度のテーブルをクリアする機会があり、フリーズで行き詰ったので掲載。

# 最速の方法

いろいろ試してみたが、以下が最速。
行は全て消えるが、数式と列タイトルは残る。

```vb

Dim myTable As ListObject
Set myTable = ThisWorkbook.Sheets("Sheet1").ListObjects("テーブル１")
If Not (myTable.DataBodyRange Is Nothing) Then
    myTable.DataBodyRange.Delete
End If
```

# 他の方法

１行ずつ削除するのを繰り返し行うものだが、
この方法が通用するのはせいぜい数十行までだった。
テスト環境では100行を超えたあたりからフリーズした。

```vb
Dim myTable As ListObject
Set myTable = ThisWorkbook.Sheets("Sheet1").ListObjects("テーブル１")
If Not (myTable.DataBodyRange Is Nothing) Then
    With myTable.ListRows
        For i = .Count To 1 Step -1
            .Item(i).Delete
        Next i
    End With
End If
```

# テスト環境

* Windows10 Pro
* Microsoft Office 2013
* RAM 8GB
* CPU intel CORE i5

# 追記

もしかしたら、`object.Range(object.Cells(),object.Cells()).Delete`で範囲指定して消してから`ListObject.Resize()`した方が速いかもしれない。未検証。しかし、コーディングとかメンテナンスの手間、可読性を考えるとやはり`ListObject.DataBodyRange.Delete`一択。

**Excelsior!**
Railsのform要素をVue.jsで操作したいときにどうやって初期値を取得したらいいのか考えてみる

フォーム要素をまるっと Vue.js で管理したいとき v-model を指定すると初期値が Vue.js 側の値で上書きされて、フォームにもともと指定してあった value の値が無視されてしまう問題にいまごろ直面しました。

もともと Vue.js 1系のころは v-model で指定した値にフォームの初期値が入っていたそうなのですが2系からは入らなくなったようです。

そこで先人が考え出したアイデアがこちらです。とても興味深いです。

Railsのフォームビルダーで生成したform要素をVueコンポーネント化する
https://qiita.com/kuroda@github/items/940338b5f6f46da2c5f1

記事を拝見する前、私はひとつひとつの input に ref 属性をつけて `this.$refs.xxx` として値を取得する方法を試みていたのですが querySelector という手があったかと感心しました。さらには完全にライブラリ化＆ブラックボックス化しており、同じコードは二度と書かねえという心意気を感じます。scaffold で生成したフォームを Vue.js で管理できるようにする目的であればできてます。

ただ、 Vue.js でフォームを管理できるようになると、いろいろやりたくなってくるんです(笑) いろいろやるにはデータは全部欲しいわけです。フォームに無い値も使いたくなるんです。

上の方法ではデータは HTML のタグ経由なので、データを渡すために input タグを定義するという変な感じになってきます。そうなるともう最初から Vue.js にデータを全部まるっと渡しとけばいいんじゃねってことになります。で、これに行きつきました。

```js:app/javascript/packs/user_form.js
import Vue from "vue/dist/vue.esm"

window.UserForm = Vue.extend({
  data() {
    return {
      user: this.$options.user_attributes,
    }
  },
})
```

```sass:(slim)
#app
  = form.text_field(:foo, "v-model": "user.foo")
  = form.text_field(:bar, "v-model": "user.bar")

javascript:
  new UserForm({user_attributes: #{form.object.to_json.html_safe}}).$mount("#app")
```

Vue.js のクラスは一箇所で定義して、それを使うときに form.object を全部渡してインスタンス生成します。当初は propsData で渡したりしていましたが、それはテスト用らしいので、普通に引数で渡して $options で参照する方法にしました。

けっこうシンプルでいいかなと思うんですが、こういうのどうなんでしょう？
wordpressのdo_actionとadd_action

## はじめに
WordPressの中を追っていく上で、do_actionの所でどのように動いているのか分からなかったので調べたことをまとめさせていただきました。

## do_action

wordpressの
`wp-includes/plugin.php`
に以下のように定義されています。

```php

function do_action($tag, $arg = '') {
```

第一引数はタグで、

do_action( 'template_redirect' );

としてタグを`template_redirect`とすれば、do_actionを実行した時に`template_redirect`タグで追加された関数が実行されます。

## add_action

do_action関数が実行された時に呼ばれる関数を定義します。

wordpressの
`wp-includes/plugin.php`
に以下のように定義されています。

```php
add_action($tag, $function_to_add, $priority = 10, $accepted_args = 1) 
```
第二引数はdo_actionにフックする関数です。

add_action('template_redirect', 'redirect_canonical');

とすれば、`do_action( 'template_redirect' );`が呼ばれた時に、`function redirect_canonical`が実行されます。


## 参考にしたサイト

http://frumph.net/wordpress/understanding-do_action-and-add_action/
Python個人用備忘録です

# はじめに

Qiita初投稿です。
Pythonの勉強をしていてまだまだ初学者です。
初投稿は勉強してから約3時間程です。

個人用備忘録として逐次更新していきます。

間違っている内容がありましたら、ご教授よろしくお願いします。


### タプル

変数定義時、後ろに","が残っていると、型はタプルとしてみなされます。

```python:qiita.py
>>> x = 1
>>> type(x)
<type 'int'>
>>> y = 1,
>>> type(y)
<type 'tuple'>
```