OmniAICreator/Qiita-1.07M huggingface dataset:
Firestore と Dart で _InternalLinkedHashMap<dynamic, dynamic>' is not a subtype of type 'Map<String, dynamic>



Firestoreのドキュメント内に階層化されたオブジェクトがある場合に、Dart側で`Map<String,dynamic>`として値を参照しようとしたところ、次のようなエラーメッセージが出力された。

```
_InternalLinkedHashMap<dynamic, dynamic>' is not a subtype of type 'Map<String, dynamic>
```


具体的にはこのような構造のデータがある場合

```
{
  "name": "Bob",
  "songs": {
    "1": {
      "title": "Foo",
      "price": 100
    },
    "2": {
      "title": "Bar",
      "price": 200
    }
  }
}
```

こんなコードを書くと出力される。

```dart
final Map<String,dynamic> map = snapshot.data["songs"];
```

回避するにはこんなふうに書けば良い。

```dart
final Map<String,dynamic> map = new Map<String,dynamic>.from(snapshot.data["songs"]);
```


参考
https://github.com/flutter/flutter/issues/16589
PHPの配列キーのキャストに関する挙動とPHPマニュアル考古学

突然ですが、下記のコードで配列 `$a` のキーはどうなると思いますか？

```php
<?php
$a = [3.14 => 3.14];
var_dump($a);
```

結果は次のようになります。

```
array(1) {
  [3] =>
  double(3.14)
}
```

キーとして渡した浮動小数点数が整数にキャストされています。このことはPHPマニュアルにも書いてあります。

> key は、整数 または 文字列です。 value には任意の型を指定できます。
> さらに、次のような key のキャストが発生します。
>
> - 10 進数の integer として妥当な形式の String は、 数値の前に + 記号がついていない限り、 integer 型にキャストされます。 つまり、キーに "8" を指定すると、実際には 8 として格納されるということです。一方 "08" はキャストされません。これは十進数として妥当な形式ではないからです。
> - floats もまた integer にキャストされます。つまり、 小数部分は切り捨てられるということです。たとえばキーに 8.7 を指定すると、実際には 8 として格納されます。
> - （以下略）
> 
> http://php.net/manual/ja/language.types.array.php

なるほど、マニュアル通りの挙動というわけです。

ところで、PHPを昔から使っているユーザーの中には「こんな記述、昔からあったっけ？」と思う方もいるのではないでしょうか。

そこで、Internet ArchiveでPHPマニュアルの過去の記述を調べてみたところ、上記の記述は2012年5月頃に追加されたということがわかりました。下記は2012年4月時点の記述です。

> Floats in key are truncated to integer.
>
> http://web.archive.org/web/20120204193433/http://us3.php.net/manual/en/language.types.array.php

不親切ではあるけど、以前から明文化されていたようですね。「こんな記述、昔からあったっけ？」に対する回答は「昔からありましたよ」になります。

こんな基本的な内容に関する記述も見直されてるんだなーというのが意外に感じられたので記事にしてみました。
Node.jsでテスト用の軽量SMTPサーバーを動作させる。

# ローカル完結で、簡単なSMTPサーバーをテストに利用したい

簡易的なSMTPサーバーは色々ありますが、設定がよくわからなかったり、インストールが面倒だったりで、なかなかうまくいきませんでした。（完全に私の知識不足）

そこで、下記のライブラリを用いて、node.jsのみで動く簡単なSMTPサーバーを構築しました。

- smtp-server（SMTPサーバー用）
- mailparser（リクエスト内容の解析）
- jconv（文字コードの変換。nodeで書かれているので、Windows SDKとかの考慮は不要です。）

# 実装

まずは、各ライブラリをインストールします。

`npm install --save smtp-server`
`npm install --save mailparser`
`npm install --save jconv`

下記を保存して、nodeコマンドで実行すれば、587ポートでSMTPサーバーが立ち上がります。
今回は、TLS不使用のユーザー名・パスワードによる認証だったので、下記の構成になっています。

下記のサイトを見ると、いろんなオプションが指定できるので、試してみてください！
https://nodemailer.com/extras/smtp-server/

```javascript
const {
  SMTPServer
} = require('smtp-server');

const {
  simpleParser
} = require('mailparser');

const jconv = require('jconv');

const server = new SMTPServer({
    // STARTTLSコマンドを無効化
    disabledCommands: ['STARTTLS'],

    // ユーザーID・パスワード確認
    onAuth(auth, session, callback) {
      if (auth.username !== 'aaa' || auth.password !== 'bbb') {
        return callback(new Error('Invalid username or password'));
      }

      callback(null, {
        user: 'aaa'
      });
    },

    // 送信者 確認
    onMailFrom(address, session, callback) {
      if (address.address !== 'test@example.com') {
        return callback(new Error('test@example.com 以外からの送信は受け付けません！'));
      }
      return callback();
    },

    // 内容 確認
    onData(source, session, callback) {
      source.pipe(process.stdout);
      simpleParser(source)
        .then(({
          from,to,bcc,cc,subject,text
        }) => {
          console.log({
            from: from.text,
            to: to.text,
            cc: (cc || {text: ''}).text,
            bcc: (bcc || {text: ''}).text,
            subject,
            // 今回本文は、ISO-2022-JPでしたので、JISです！
            text: jconv.decode(text, "JIS"),
          });
        })
        .catch(err => {
          console.log(err);
        })

      source.on('end', callback);
    }
  })
  .listen(587)
  .on('error', err => {
    console.log(err.name, err.message, err.stack);
  });

```

SMTPリクエストと、FROM・TO・CC・BCC・本文を持ったオブジェクトがコンソールに表示されます。
（どこにも送信はされません。受け取った引数を用いれば、メール転送も実装可能です。）
これで、簡単にメールが確認できました。
超簡単！NetlifyとNuxt.jsを使って自分のWebページを作る

この記事一つで瞬く間にWebページ作成からデプロイまでが出来ます！

ではまずNuxtによるレポジトリの作成から。Starterを使うと簡単です。

```
$ vue init nuxt-community/starter-template know-meee
$ cd my-project                     
# install dependencies
$ npm install # Or yarn install
$ npm run generate # distの作成
$ npm run dev
```
localhost:3000にアクセス

![image.png](https://qiita-image-store.s3.amazonaws.com/0/116252/6255253d-b39c-edd8-8d82-d712b821be3b.png)


このページが見れるかと。

とりあえずこれをNetlifyを使ってデプロイします。


その前にGithubにレポジトリを作ってpushします。


NewからRepositoryを作ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/116252/ea768bf1-eab0-1d58-47ef-b279a028a297.png)

作ったらpushまでします。

```
$ git init
$ git add .
$ git commit -m "first commit"
$ git remote add origin https://github.com/masalennon/know-meee.git
$ git push -u origin master
```


Netlifyで自分のGithubアカウントを連携します。
デプロイするレポジトリを選んだら、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/116252/676fb9e7-c123-71d2-f9e6-39a790592750.png)

このように設定。

Deploy site！

Deployが終わったらサイトを訪れてみましょう・・・。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/116252/11423bc6-35f4-7161-f19b-8518bb2f8950.png)

。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
目、、目が・・・。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/116252/65a7f8cc-9f7f-f3d3-5e78-cef0f1ae9c04.png)


！！！！！！！！

無事、瞬く間にデプロイできてますね！( )
是非あなたもサクッと自分のページを作って公開してみてください！
Pythonでのデコレータはメソッド上に毎回書く

当たり前になればなんでもないですが、Pythonのデコレータは馴れ親しみがなく、少し時間がかかったので、記録します。
@classmethodなどのデコレータ文言はデコレートしたいメソッド全ての上にデコレータ記載が必要です。
PrivatetとかPublicとかの様に一度書くとスコープが発生するかと思いましたが、そうではありませんでした（笑）
情けない。

```python:sample.py
    @classmethod
    def Method1(cls):
        return True
    @classmethod
    def Method2(cls):
        return False
        
```
ukukon-A「UkuNumber]


- [問題URL](https://beta.atcoder.jp/contests/ukuku09/tasks/ukuku09_a)

# 考察

## コンテスト中の考察

- フィボナッチ数列っぽいなー
- 愚直に計算したらTLEだなー
- フィボナッチ数列の任意の項を高速に求めるには行列を使うって聞いたことあるなー
- なんかいい解法も思いつかないし、もしかしたら行列使うかもしれないからあきらめー



## 理想の考察

<img width="521" alt="uku.png" src="https://qiita-image-store.s3.amazonaws.com/0/218584/9b26a9cd-f532-9a7f-480a-2c8d6c8bc52d.png">


- うく数列を書いてみると、フィボナッチ数列に似ていることが分かる。
- 2つを比較して法則性を見つけることで、うく数列の式「$u_{i}=a \times fib_{i-2}+b \times fib_{i-1}$」を得られる。
- うく数列の式について、$a, b, i$についての3重ループを書けば全探索することができる。
- ただ、$a,b$は範囲が大きすぎるし$i$は探索範囲が分かっていない。
- ここで、$a, b$のペアが辞書順最小であることを思い出すと、$a=1$に確定できることが分かる。
- $a=1$に確定したので、うく数列の式を「$u_{i}= fib_{i-2}+b \times fib_{i-1}$」に書き換える。
- この時点で、$b, i$の2重ループまで計算量を減らせた。
- でも、やはり$b$の探索範囲が広すぎる。なので、とりあえず$i$の探索範囲を調べてみる。
- $b=1$としてループを回すと最大の計算回数を知ることができる。
- 実際にループを回すと$87$回程度でうく数は$10^{18}$を超えることが分かる。
- つまり、$i$の探索範囲は$2 \leq i \leq 87$となる。
- この少ないループを上手いこと利用して答えを求めたい。
- 結局のところ、$u_{i}=X$となるような$b$が存在するかを判定すれば良い。なので、うく数列の$u_{i}$を$X$にする
- $X= fib_{i-2}+b \times fib_{i-1}$となった式をさらに$b$についての式に変形する。
- すると、$b=\frac{X - fib_{i-2}}{fib_i-1}$となる。
- あとは、$b$が制約の範囲内であるかを判定すればよい。
- $b$は自然数なので、$\frac{X - fib_{i-2}}{fib_i-1}$が整数かつ、分子が$0$より大きければいい。



# 解法

- あらかじめフィボナッチ数列を90くらいまで求めておく
- $a=1$で固定である。
- うく数列のループを$90$くらいまで回し、$b$を$O(1)$で求める。
- その$b$が制約を満たしていれば$b$の値を更新する。
- $\{1, b\}$を出力する


# [コード](https://beta.atcoder.jp/contests/ukuku09/submissions/2821096)

```cpp
#include <bits/stdc++.h>
using namespace std;

#define ll long long

int T;
ll X;
ll fib[90];

void solve() {
   ll b = 2e18;
   for (ll i = 2; i < 90; i++) {
      if ((X - fib[i-2]) % fib[i-1] == 0 && (X - fib[i-2]) > 0) {
         ll t = (X - fib[i-2]) / fib[i-1]; // bの候補
         b = min(b, t);
      }
   }

   printf("%d %lld\n", 1, b);
}

int main() {
   // あらかじめフィボナッチ数列を求めておく
   fib[0] = fib[1] = 1;
   for (int i = 2; i < 90; i++) fib[i] = fib[i-1] + fib[i-2];

   cin >> T;
   while (T--) {
      cin >> X;
      solve();
   }

   return 0;
}
```


# 要点

- 「**似ている→実際に比較して法則性を見つける**」という発想
  - 今回の場合、うく数列とフィボナッチ数列が似ているため実際に比較して法則性を見つけることが大事だった
- 「**見つけた法則性についての式を作る**」という発想
  - 強い人にとっては当たり前かもしれないが、僕は式を作るという発想がよく頭から抜けている...
  - 問題文から式を作るのには慣れたが、自分が見つけた法則性で式を作るのには慣れてなかった
- 「**探索の範囲を絞る**」という発想
  - 2分探索で全範囲を探索するという発想しかなかった
  - でも、ループを回して調べれば$87$回程度のループを回せばいいことが分かった
  - 計算量を落とすには、アルゴリズムを使うだけではなくて探索の範囲を絞るという方法もあるんだなーと思うなど
- 「**値を仮定する**」という発想
  - $u_{i}= fib_{i-2}+b \times fib_{i-1}$という式を眺めていても、$b, i$についてのループを回すという解法しか思いつかない
  - だが、$u_{i}=X$になるかを判定すれば良いことに気が付くと、$u_{i}=X$と仮定すればよいことに気が付く
  - $X= fib_{i-2}+b \times fib_{i-1}$という式にすることで、変数が1つだけになるので$b$に注目すればいいこともわかるようになる
  - $X$のみに注目したい！！って思えばこの発想ができたのかなー...



# おまけ

- [ Otoshidama](https://beta.atcoder.jp/contests/abc085/tasks/abc085_c) 
  - この問題の、式変形して計算量を落とすみたいな発想はこの問題でも使えたっぽい
- なんか式変形とか値を仮定するとか、数学得意な人は当たり前にできそうなんだけど僕にとっては天才かよ！！て気分。競プロは数学って思った方がいいのかねー。
- あと、1問に時間かけすぎてもうだめぇ...
Python から PostgreSQL へ接続

# install

```
pip install psycopg2
pip install psycopg2-binary
```


# Running the test suite

```
python -c "from psycopg2 import tests; tests.unittest.main(defaultTest='tests.test_suite')" --verbose
```

下記の通りテスト用のDBをあらかじめ準備してあげることによって、実行できるようでした。
`createdb -E utf8 psycopg2_test`



# Basic module usage

あらかじめテスト用DBを作成し
```
createdb -E utf8 test
python
```
Pythonのインタラクティブ・モードを起動します。


```python

import psycopg2
conn = psycopg2.connect("dbname=test user=postgres")
cur = conn.cursor()
cur.execute("CREATE TABLE test (id serial PRIMARY KEY, num integer, data varchar);")
cur.execute("INSERT INTO test (num, data) VALUES (%s, %s)",(100, "abc'def"))
cur.execute("SELECT * FROM test;")
cur.fetchone()
conn.commit()
cur.close()
conn.close()
```
テーブル作成(CREATE)、
データ作成(INSERT)、
データの参照(SELECT)、
まで確認することができました。

# 参考
[Psycopg – PostgreSQL database adapter for Python](http://initd.org/psycopg/docs/index.html)
スキルと資格　データサイエンティストを名乗るには　初心者の悩み

#いつから初心者脱却なんだろう？

大学でC言語などある程度簡単なものを触り、研究はバイオサイエンスなものをしていた僕ですが、就職したところでデータサイエンティストのお仕事をしなければならなくなりました。参考書を買い、勉強。線形代数、Python、MLを勉強。

ふと思ったのです。将来像が見えない。NNを理解したらいいのか、それを応用できればいいのか？けれど、求められるものはどんどん変わるのだろう。
一人前はいつなれるのでしょう？

#やはり資格なのか？
応用情報技術者、ITストラテジストなど色々ありますね。
資格を取ることが、将来像が見えてくる近道になるかもしれませんね。

・日本ディープラーニング協会の資格。
http://www.jdla.org
興味はありますが、どうなんだろう？受検料高めなイメージですが、将来性あり？
・kaggle
前の記事に書きましたので、省略。


無料IT系の授業イベントに出向いてお話しを聞いてくるべきでしょうか？
会社の性質上IT系の先輩がいないので、そうすべきでしょうか？
とたらたらと書きましたが、諸先輩方のご意見聞いてみたいので、どうかコメントよろしく御願いします。
プロパティレプリケートのタイミング

鈴木です。GameOfThronesが面白くて寝不足です。

#レプリケーションはアクター単位でサーバーから送信される
アクターのプロパティのレプリケートはTick毎に幾つかのアクターが指名されて送信されます。

SimulateProxyアクターを持つクライアント上での処理で、自分以外の複数のアクター内のレプリケート変数にアクセスするような処理がある場合、プロパティの更新タイミングのズレによって問題が出たりする事があります。
※根本的には次アクター外に強い依存関係があるのは好ましくありません

##図解

ThePawnとTheActorのそれぞれが持っているプロパティLastPowerとPowerがシンクロしているのを期待しているとした時の挙動です。
※悪い設計の例です

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223804/de52c5a6-e9dd-7b75-5477-e961e999e873.png)

サーバー側ではThePawnとTheActorは連続して処理されていますが、
クライアント側ではレプリケートはアクター単位で行われるのでLastPowerとPowerプロパティがアクター間でシンクロしていないタイミングが生まれます。
複数のアクターにまたがるような変数アクセスを行う場合はこのようなタイミングのズレがあるので可能な限り避けるのが懸命です。

#サーバー上での処理順序とRepNotifyの処理順序は一致しない

RPCは処理順序が保証されますがRepNotifyは順序は保証されません
例としてサーバーとクライアントでの処理の流れを書いてみます。


- サーバー
	- Pawn::SetValueA(B)
		- OnRep_ValueB() ※ローカルで呼び出し
	- Pawn::SetValueA(10)
		- OnRep_ValueA() ※ローカルで呼び出し
	- PawnAのプロパティをレプリケート


- クライアント
	- クライアントでパケット受信
	- プロパティをPawnAにストア(ValueA:10 ValueB:5)
	- PawnAに対してRepNotifyを呼び出す
		- OnRep_ValueA
		- OnRep_ValueB

クライアント側でサーバーRPCの順序でRepNotifyが起こることを期待するとバグの原因になります。
また値が全てストアされてからRepNotifyが呼ばれるため
それぞれのRepNotify中でトリガー対象となった対象の別の変数にアクセスする場合も注意が必要です。

RepNotiyの呼ばれる順序はUClass内のプロパティリストの並び順に依存する気がします。

#参考

昔書いたやつ
[UE4 MultiPlayer Online Deep Dive: 実践編1 ](https://www.slideshare.net/EpicGamesJapan/ue4-multiplayer-online-deep-dive-1-byking-ue4dd)
【記録】Unity 2Dでゲームを作る 01

#はじめに
Googleの旅をしたけどUnity 3Dの資料は多いが2Dがない
と思っていたらUnityが2DのTutorialを用意していた、神
早速DLして実行したけど、開かない
3回試したけど駄目だった、別のチュートリアルをやる
と思ったらあった
　![image.png](https://qiita-image-store.s3.amazonaws.com/0/270036/de38eb12-dbde-48df-f8db-2dea4153397d.png)
僕がやりたかったのはこういうチュートリアルです、あるやん

#チュートリアル(UFO)
　[2D UFO tutorial](https://unity3d.com/jp/learn/tutorials/s/2d-ufo-tutorial)
まずここから試していきます
つまずいたポイントとかを記載していきますが、基本動画通りにすすめていきます
##つまづきポイント1
![image.png](https://qiita-image-store.s3.amazonaws.com/0/270036/d6e3c10a-3c72-b996-69a0-1fd4a40b1818.png)
早速躓いた。**You are currently offline**だし見る感じofflineModeになってるって言われてる、めげない
ぐぐる

[UnityのAsset Storeが表示されない時の対処法〜「You Are Currently Offline」と出るとき編〜](http://freesworder.net/unity-asset-store-offline/)
先人たちは偉大なのだ。
調べたところPCのネットワーク確認とFirewallの確認はした、問題ないのでUnity側だと思う

[アセットストア(2D UFO tutorial)](https://assetstore.unity.com/packages/essentials/tutorial-projects/2d-ufo-tutorial-52143)
一方のやり方が駄目だったら別のやり方を試してみる、これだいじ
###追記
![image.png](https://qiita-image-store.s3.amazonaws.com/0/270036/ea73a083-9b16-2d47-ff9e-d63afe2f0c60.png)
時間が経ったらいけるようになりました

##つまづきポイント2
![image.png](https://qiita-image-store.s3.amazonaws.com/0/270036/46394eac-0866-dc19-f643-88f2c1576d96.png)
どうみてもUFOのassetsが裏にいる

[【Unity】スプライトの描画順を「下にある物を手前」にする](http://tsubakit1.hateblo.jp/entry/2017/04/14/024945)を参考に、右側のReferenceを修正
![image.png](https://qiita-image-store.s3.amazonaws.com/0/270036/e752186d-1d9e-66e3-b5ea-fd69d4a2656b.png)
Defaultレイヤー内で完結したい場合：
　Order In Layerが高いほど手前に表示される(BackGround→0, UFO→1のように)
レイヤー種別で完結させる場合：
　Background→Pickups→Playerの順に表示される
上記2つの結合で背景物「土→木」だったり、「キャラクター→装備品」みたいな表示順にできそう。

###追記
動画もうちょっと先で説明してた、ちゃんと動画は見よう

##つまづきポイント3
Ctrl+' が効かない
Visual Studio Community 2015で実行されているけどそこだからか不明
とりあえず[Unity Reference](https://docs.unity3d.com/ja/current/ScriptReference/Input.html)を見ることに(問題の先延ばし)

#UFO Tutorial　おわり
![image.png](https://qiita-image-store.s3.amazonaws.com/0/270036/c7757b94-1ec9-80ee-923e-d0f4e036df7c.png)

無事ビルドまでたどり着けました。
次回から作りたいゲーム作成へと移っていきます
Rails5の自己結合でハマる

# tl;dr
Rails5を利用している環境で、１対多の自己結合を実現させるために以下のようなコードを書いた。

```ruby
class Hoge < ApplicationRecord
  has_many :children, class_name: 'Hoge', foreign_key: 'parent_id', dependent: :destroy
  belongs_to :parent, class_name: 'Hoge'
end
```

何度DBにレコードを登録しようとしても、毎回以下のようなエラーが発生して登録できない。

```irb
ActiveRecord::RecordInvalid: バリデーションに失敗しました: Parentを入力してください
```

いや、親に当たるレコードは、`parent_id`持たないんだよなぁ。。。ってことで盛大にハマったのでメモ。

#原因
参考にしたサイトの情報が古い（Rails4以前のもの）ばかりだったので、Rails5からの仕様変更でハマっていた。

Rails5からは`belongs_to`アソシエーションは、デフォルトで`require: true`になったので、`null`での登録ができなくなっていた。
※確かに、`belongs_to`なのに、`id`設定しないとかレアパターンなので、デフォルトをそっちにするのは自然なんだけど。

逆に、これまで通り（Rails4みたいに）`belongs_to`のアソシエーションで`null`を許容したい場合は、`optional: true`使えばエラーは発生しなくなる。

```ruby
class Hoge < ApplicationRecord
  has_many :children, class_name: 'Hoge', foreign_key: 'parent_id', dependent: :destroy
  belongs_to :parent, class_name: 'Hoge', optional: true
end
```
Webex Teamsでボブ・マーリーが毎朝「What you gonna do?」とメッセージするBOTを作った

* 毎朝各人の本日の作業を簡易にチャットしてほしいという要望が上の人からあり、当初はみんなやっていたが2～3週間ほどすると誰もやっていない、ということが何度かあった
* 人力は頼りにならないことは既に経験済みなので仕組み化したい
* 毎朝「何やるの」とメッセージするBOTを作ろう


# 参考にしたWebページ
* [Qiita - Cisco Webex Teams(旧Cisco Spark)のBot用アカウントの作り方](https://qiita.com/thrzn41/items/672870bb8a6ab2ca44b2)
* [Cisco Webex for Developers - Create a Message](https://developer.webex.com/endpoint-messages-post.html)

# 仕組み

描いてみたけど不要だった

![866_4011.png](https://qiita-image-store.s3.amazonaws.com/0/107536/c2176ec5-e996-ef3a-47a3-24d1de44f6a1.png)


# 動作確認
一分間隔で動かしてみる
![590_5011.png](https://qiita-image-store.s3.amazonaws.com/0/107536/f4498f41-4d76-bd58-3cdd-796ffcfc1c58.png)

成功！


# 動かしてみてどうだったか
* 問題なく動いていたけど元ネタを誰も知らなかったので非常に滑っていた

# まとめとか
* Authorizationヘッダーの存在を初めて知った。結構メジャーっぽいので調べないと
    * keyが`Authorization`でvalueが`Bearer xxxxxxx`の形式っていうお作法っぽい
* 人力はやめよう。仕組み化しよう。自動化しよう

# 関連記事
Webex Teamsと非常に似た名前でややこしい存在のMicrosoft TeamsのBOTの作り方は下記の記事が参考になると思います
https://qiita.com/chomado/items/6bda10abde0551f25723
Pythonで世界地図-14(都道府県を着色する)

Pythonで世界地図(cartopy版)を使って、mpl_toolkits.basemapの日本地図に都道府県別に着色できないかやってみましたが、出来ないのでライブラリjapanmapでやってみました。

japanmapのインストール

```shell-session
$ pip install japanmap
```

japanmap(県別データの可視化)
https://qiita.com/SaitoTsutomu/items/6d17889ba47357e44131

```python:
#!/usr/bin/python3
# coding: UTF-8

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
from japanmap import get_data
from japanmap import pref_points

#japanmapで境界線のベクトルデータを取得
qpqo = get_data()
pnts = pref_points(qpqo)
b_data = pnts[0] #0-北海道、1-青森・・・(都道府県コード - 1)

lon1 = 137.0
lat1 = 37.0
lon2 = 10.0
lat2 = 10.0

fig = plt.figure()
ax = plt.axes()

map = Basemap(llcrnrlon = lon1 - lon2, llcrnrlat = lat1 - lat2, urcrnrlon = lon1 + lon2, urcrnrlat = lat1 + lat2, resolution = 'i', projection='cyl')

map.drawcoastlines() #海岸線

#japanmapで都府県境界線を表示
qp, qo = get_data()
for k in range(len(qo)):  # 各県ごと
    for othr, ls in qo[k]:  # 各線分ごと
        if othr > k:  # 県コードkが小さい県のとき
            plt.plot([qp[i][0][0] for i in ls], [qp[i][0][1] for i in ls],color = 'r',linewidth = 0.5,linestyle = '--')

poly = plt.Polygon(b_data,fc="#7700"+"ee") #都道府県を塗りつぶす
ax.add_patch(poly)

plt.show()
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/238800/d34cd55f-bee0-4887-11fb-460075a6a90b.png)

japanmapとmpl_toolkits.basemapでは海岸線の座標のとり方が違うので、resolution = 'l','c'では着色部と海岸線に隙間が目立ちます。

resolution = 'l'の場合

![image.png](https://qiita-image-store.s3.amazonaws.com/0/238800/c7a0cd2c-b5fb-38dc-66bc-ec0202f40931.png)

resolution = 'f'の場合

![image.png](https://qiita-image-store.s3.amazonaws.com/0/238800/760ae6a8-a36b-aa62-01d2-9b91ca769ce9.png)

###全ての県に色を付ける

```python:
#!/usr/bin/python3
# coding: UTF-8

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
from japanmap import get_data
from japanmap import pref_points

#japanmapで境界線のベクトルデータを取得
qpqo = get_data()
pnts = pref_points(qpqo)

lon1 = 137.0
lat1 = 37.0
lon2 = 13.0
lat2 = 13.0

fig = plt.figure()
ax = plt.axes()

map = Basemap(llcrnrlon = lon1 - lon2, llcrnrlat = lat1 - lat2, urcrnrlon = lon1 + lon2, urcrnrlat = lat1 + lat2, resolution = 'i', projection='cyl')

map.drawcoastlines() #海岸線

#japanmapで都府県境界線を表示
qp, qo = get_data()
for k in range(len(qo)):  # 各県ごと
    for othr, ls in qo[k]:  # 各線分ごと
        if othr > k:  # 県コードkが小さい県のとき
            plt.plot([qp[i][0][0] for i in ls], [qp[i][0][1] for i in ls],color = 'k',linewidth = 0.5,linestyle = '--')

#都道府県に色を付ける
color2 = 0
for i in range(47):
    
    color2 += (1250067 + 150) #50,100,150　←加算している、この数値を変更すると色が変わる
    if color2 > 16250870:
        color2 -= 15527148
    fc1 = hex(color2)
    fc1 = fc1[2:] #0xを削除
    fc1 = '#' + fc1.zfill(6) #6桁になるように0で埋めてから、先頭に"#"を追加
    poly = plt.Polygon(pnts[i],fc =  fc1) # pnts[0] #0-北海道、1-青森・・・(都道府県コード - 1)
    ax.add_patch(poly)

plt.show()
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/238800/d25d24e0-40e4-43fe-471a-61aafe1fcff1.png)

japanmapでは北海道本島・本州本島・四国本島・九州本島・沖縄本島の５つの島しか着色できないようです。（やり方がわからないだけかも？）
佐渡ヶ島・淡路島・対馬等の大きな島も着色出来ません？。

隣の県と区別がつくように色を変えよううと思いましたが、
どのようにしてよいのかよくわかりません。私がわかる範囲で作成しました。
最初は他の人のコードを見てやろうと思いましたが、スキル不足で？？？
cURLでGaroon REST APIを叩く

## Garoon REST API
サイボウズが提供するグループウェアに **Garoon** がありますが、2018年5月にREST APIがリリースされました。cURLコマンドで操作してみることにします。 どのようなAPIがあるかは[Garoon REST API](https://developer.cybozu.io/hc/ja/articles/360000503306) へアクセスしてみてください。

2018年7月時点では、次のAPIがありました。

- REST APIはスケジュールのみ
- SOAP APIはたくさんある（スケジュール、掲示板、メール、通知、ワークフロー、アドレス帳、ファイル管理、メッセージ、システム管理など）

<img width="1084" alt="garoon-top1.png" src="https://qiita-image-store.s3.amazonaws.com/0/100494/13cafb04-734b-52a8-988a-248ba03fac58.png">


## 環境を準備する
この時点では、Garoonには開発者ライセンスがなかったので、[試用申し込みへ](https://garoon.cybozu.co.jp/trial_garoon/)
環境を準備したら、まずはマウス/キーボードを使ってスケジュールを登録してみます。

<img width="573" src="https://qiita-image-store.s3.amazonaws.com/0/100494/c3d50866-4ec0-4643-6582-244f842e22b7.png">


## cURLコマンド

ユーザー認証を利用するので、「ログイン名:パスワード」をBase64でエンコードした文字列を準備しておきましょう。


### 予定を取得する（1件）

```
curl -X GET 'https://{subdomain}.cybozu.com/g/api/v1/schedule/events/{id}' \
  -H 'X-Cybozu-Authorization: {ログイン名:パスワードをBase64エンコードした文字列}'
```

### 予定を取得する（複数）

- limit=10 >> 10個まで
- rangeStart%3D2018-07-01T00%3A00%3A0%E2%80%8B%E2%80%8B0Z >> 検索対象の開始日時をURIEncodeしたもの

```
curl -X GET 'https://{subdomain}.cybozu.com/g/api/v1/schedule/events?limit=10&rangeStart%3D2018-07-01T00%3A00%3A0%E2%80%8B%E2%80%8B0Z' \
  -H 'X-Cybozu-Authorization: {ログイン名:パスワードをBase64エンコードした文字列}'
```

### 予定を登録する（複数）
1件を登録することもできますが、ここでは複数件登録できるAPIで1件を登録してみます。

```
curl -X POST 'https://{subdomain}.cybozu.com/g/api/v1/schedule/events' \
  -H 'X-Cybozu-Authorization: {ログイン名:パスワードをBase64エンコードした文字列}'
  -H 'Content-Type: application/json' \
  -d '{"subject": "テスト会議", "eventType": "REGULAR", "start": {"dateTime": "2018-07-12T13:00:00+09:00", "timeZone": "Asia/Tokyo"}, "end": {"dateTime": "2018-07-12T14:00:00+09:00", "timeZone": "Asia/Tokyo"}, "attendees": [{"code": "test", "type": "USER"}]}'
```

できました。
<img width="721" src="https://qiita-image-store.s3.amazonaws.com/0/100494/859b30ca-81b4-f16c-2cf0-32d3d012a695.png">


ちなみに、登録したJSON文字列を見やすく整形したものは、こちらです。
※ "subject" 以外は必須。

```
{
    "subject": "テスト会議",
    "eventType": "REGULAR",
    "start": {
        "dateTime": "2018-07-12T13:00:00+09:00",
        "timeZone": "Asia/Tokyo"
    },
    "end": {
        "dateTime": "2018-07-12T14:00:00+09:00",
        "timeZone": "Asia/Tokyo"
    },
    "attendees": [
        {
            "code": "test",
            "type": "USER"
        }
    ]
}
```

### その他
取得、登録以外にも次のこともできます。

- 予定の更新（PATCH）
- 予定の削除（DELETE）

### さいごに

[cURLでkintone REST APIを叩く](https://qiita.com/ushiron/items/d4de5ed60ecd47870bb1) の記事もありますので、参考にしてみてください。
【Git】ファイルパーミッションの変更（chmod）を無視する方法


Linux と Windows ではファイルのパーミッションの扱いが異なるので、
Linux で作成したスクリプトファイル（パーミッション:`0755`）を、
Windows で`git diff`したときに、パーミッションが`0644`に変わっているということが起きたりします😓


### ファイルパーミッションの変更を無視する方法
ファイルパーミッションの変更を検知しないようにするため、
Git の設定を以下のように変更✌️

```config
$ git config core.filemode false
```

以下のコマンドで`core.filemode = false` に設定できたか確認👀

```config
$ git config -l | grep filemode
```


### `git config core.filemode`とは
Git のパーミッション変更に関する設定

デフォルトだと`true`になっており、こちらが`false`になっていない場合、パーミッションが`755`になっていたりすると`644`に自動的に変換されたりします😷


### 設定した方がいいの？

1人で使用している場合は問題がないですが、
複数人で作業している場合には、パーミッションが Git の設定により、
「変更される人」と「変更されない人」が混在してしまうため、作業に支障をきたす可能性があるかも？
なので、設定する際は注意しましょう😪


### 参考
[Git でファイルパーミッションの変更（chmod）を無視する - git config core.filemode false](https://blog.t5o.me/post/20121119/git-chmod-git-config-core-filemode.html)
素の隔離された(オフライン上の)CentOS6.9にAnsibleをインストールする

今どきclosedな環境でCentOS6.9上にAnsibleをインストールしたくなることがありますよね（あんまりないですか？^^;）
Ansibleをインストールするために必要なrpmの探し方、ダウンロードの仕方、インストールの仕方について記載します。

#準備
yumレポジトリが登録されているCentOS6.9にて。

```
#yum install yum-utils
```
これでまずyumdownloaderを使えるようになります。

#yumdownloaderで必要なrpmを探す
次に依存関係含めAnsibleに必要なrpmファイルを根こそぎ取得します。

```
#yumdownloader ansible --solve
```

取ったファイルがこちら。

```
#ls
PyYAML-3.10-3.1.el6.x86_64.rpm           python-httplib2-0.7.7-1.el6.noarch.rpm    python-setuptools-0.6.10-4.el6_9.noarch.rpm
ansible-2.5.5-1.el6.noarch.rpm           python-jinja2-26-2.6-3.el6.noarch.rpm     python-simplejson-2.0.9-3.1.el6.x86_64.rpm
libyaml-0.1.3-4.el6_6.x86_64.rpm         python-keyczar-0.71c-1.el6.noarch.rpm     python-six-1.9.0-2.el6.noarch.rpm
python-babel-0.9.4-5.1.el6.noarch.rpm    python-markupsafe-0.9.2-4.el6.x86_64.rpm  sshpass-1.06-1.el6.x86_64.rpm
python-crypto-2.0.1-22.el6.x86_64.rpm    python-paramiko-1.7.5-4.el6_9.noarch.rpm
python-crypto2.6-2.6.1-2.el6.x86_64.rpm  python-pyasn1-0.0.12a-1.el6.noarch.rpm
```
これらをtar.gzかなにかで固めましょう。

#対象のサーバにAnsibleをいれる
対象のサーバにSCPか何かで先程のtar.gzをコピーして展開して以下実行。

```
#rpm -ivh *.rpm
```
なんかぐちゃぐちゃいってきたら（ぉぃ

```
#rpm -ivh *.rpm --force
```
（↑あんまりよくないかも）

最後にコマンドが動くことを確認する。

```
#ansible
```

■補足
yumdownloader yumでインストールする時のRPMだけを取得したいときに使うコマンド```--solve```を使うことで、依存関係解消に必要なrpmもまるごと持ってきてくれるみたいです
【記録】Unity 2Dでゲームを作る 00

#自己紹介
・ただのIT系エンジニア
・本職はネットワーク系でコードもツール作る程度しかしない
　→VBS, GAS(javascript), TTL(teratermMacro)をいじるのがメイン
・UNITY触るの初めて
・C#は簡単に触れたことある
・とりあえずゲーム作りたい

#これから
Unity2Dをまず勉強してゲーム作成したい
(部屋の隅にあるRaspberryPiは見なかったことに)
完成させたい、動けばいい、というか三日坊主にならないようにする
Raspberry Piでcm精度のRTK-GPSガイダンスの制作（その４）

#Ambientで地図上に表示
今回はGPS(GNSS)トラッカー（ロガー）機能を追加したいと思います。
RTKLIBにもWindows用に地図上にプロットするアプリや、後処理でgoogleMapに利用できるkmlファイルに変換機能がありますが、リアルタイムでAndroidスマホ等で地図にプロットするには別にアプリを用意する必要がありました。
簡単にかつ無料で地図上に位置情報を表示するためにAmbientを利用しました。

#参考URL
ESP8266 ArduinoとGPSモジュールでGPSロガーを作る
https://qiita.com/AmbientData/items/7f728917ce0df78e7124
Ambient　IoTデーターの可視化サービス
https://ambidata.io/
データーに位置情報を付加する
https://ambidata.io/docs/geo/
AmbientのPython/MicroPythonモジュール
https://github.com/AmbientDataInc/ambient-python-lib

#Pythonプログラム
Raspberry Piでcm精度のRTK-GPSガイダンスの制作(その１）
https://qiita.com/m_take/items/06892a8e25aa577e8455
にあるrtkrcvの設定ファイルを一部書き換えます

```my.conf
outstr2-type       =tcpsvr
outstr2-path       =:52002
outstr2-format     =llh
```
**（追記）**
またはrtkrcvのモニターオプションを利用して

```rtkrcv.sh 
#!/bin/sh
cd /home/pi/RTKLIB/app/rtkrcv/gcc/
./rtkrcv  -o /home/pi/RTKLIB/app/rtkrcv/my.conf -s -d /dev/tty0 -m 52002
```
Python3モジュールのインストール

```
$ sudo pip3 install git+https://github.com/AmbientDataInc/ambient-python-lib.git
```

```python:gps-tracker.py
#!/usr/bin/python3
import socket
from io import StringIO
import ambient
am = ambient.Ambient(チャネルID,'ライトキー')
host = '127.0.0.1' #localhost
port = 52002
bufsize = 150
timespan = 50 #10s *5Hz =50
def setpoint():
    buff = StringIO()
    data = sock.recv(bufsize)
    buff.write(data.decode('utf-8'))
    data = buff.getvalue().replace('b ', ' ')
    dlist = data.split()
    buff.close()
    return  dlist

try:
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((host, port))
    while True:
        i =0
        for i in range(timespan) :
            dlist = setpoint()
        senddata = {'created': 'YYY-MM-DD HH:mm:ss.sss','d1': float(dlist[4]) ,'lat': float(dlist[2]) ,'lng':float(dlist[3])}
        r = am.send(senddata)
        if r.status_code ==200:
            print('send OK')
        else :
            print('ambientsend error')
except socket.error:
    print('socket error')
except KeyboardInterrupt:
    pass
sock.close()
```


#Ambientで表示
[チャート設定]-[グラフ種類]-[地図]を選択
![ambient2.jpg](https://qiita-image-store.s3.amazonaws.com/0/261581/b41029ba-4b1f-a6d8-02ea-c4394eca7ea4.jpeg)


d1として高さをデータとして送りました。
#応用できること
・複数者作業中にネット経由で現在位置と進捗状況がスマホの地図上で確認できる
・例えばECセンサーと組み合わせて土壌肥沃度マップ、収量センサーと合わせて収量マップ、レーザー測量機と組み合わせて精密高低差マップなどが作れる。
開発中に簡単にsslをreverse proxyで付与する方法

この記事は
===

* 開発中にssl経由でWebサイトを見たくなった時にいちいちnginxとか入れるのめんどくさいよねー
* 簡易なproxyがあったのでメモです

local-ssl-proxy
===

* [local-ssl-proxy](https://github.com/cameronhunter/local-ssl-proxy)で解決です

インストール
---

```
npm install -g local-ssl-proxy
```

実行
---

```
local-ssl-proxy --source 3001 --target 3000
```
[初学者]module(モジュール)について調べたこと

# 目的 
- module(モジュール)について理解を深めるため

# 目次
- moduleについて
- moduleの呼び出し方について
- classに定義したメソッドとは異なる用途について


# moduleについて

moduleを一言で表すと下記のようになります。

##### → <font color="Red">「インスタンス化できないクラスのようなもの」</font>
#####→ <font color="Red">「インスタンス化能力はないが、メソッドを格納できるもの」</font>

一応、上辺だけ分かりました。人に聞かれたとき、この一言使えばいいぐらいに


| moduleの定義式       　| 
|:-----------------|
| module モジュール名<br><br>end|

```ruby:
# モジュールのインスタンスは作成できない
shimada = Tamago.new # NoMethodError: undefined method 'new' for Tamago.Module
```

# moduleの呼び出し方について
module定義の中では<font color="Red">別のmodule</font>や<font color="Red">class</font>を定義できる。
よって、<font color="Red">名前空間</font>として利用できます。


#### <font color="Red">名前空間</font>とは？
- 名前の衝突を避けるために使う概念です。
- プログラムが複雑になると、他の人が作成したクラス名やメソッド名と重複してしまう可能性がでてきます。
- モジュールを名前空間として使用することで重複を避けることができます。

#### 名前空間を利用した呼び出し
同じ名前のクラス(Shimada)を異なるmoduleの中に定義した場合、ネストしたclassやmoduleは「::」を用いて参照します。

```ruby:違うmoduleに書かれた同じclassを呼び出す
module Gyudon
  class Shimada
     def self.order
      puts '牛丼注文'
    end
  end
end

module Katsudon
  class Shimada
     def self.order
      puts 'カツ丼注文'
    end
  end
end

# 同じクラス名が2つある。その場合に
# 「::」を用いて参照する
Gyudon::Shimada      # =>Gyudon::Shimada 
Katsudon::Shimada    # =>Katsudon::Shimada

Gyudon::Shimada.order      # "牛丼注文"
Katsudon::Shimada.order    # "カツ丼注文"
```

```ruby:モジュールから直接メソッドを呼び出したい場合(２種類)
# class名と同じように始まりの文字は大文字を使います。
module Shimada

# 定数を定義
VERSION = 1.0

# 1: selfオブジェクトを使用する
  def self.gyudon
    puts "Gyudon!"
  end


# 2: module_functionメソッドを使用する
  def katsudon
    puts "Katsudon!"
  end
  module_function :katsudon
end

# モジュールから直接メソッドを実行
Shimada.gyudon
Shimada.katsudon

# 定数にアクセスする場合
puts Shimada::VERSION
```

# classに定義したメソッドとは異なる用途について

moduleに定義したメソッドとclassに定義したメソットでは用途が違います。
違いとしては以下の4つが挙げられます。

1. 名前空間を作る
2. moduleのメソッドをあるclassのインスタンスメソッドとして取り組む
3. moduleのメソッドをあるオブジェクトの特異メソッド(クラスメソッド)として取り組む
4. 特異メソッドやmodule関数を定義して使う

なぜ、上記のような用途なるかというとmoduleの特徴を知る必要があります。

##### moduleの特徴

- インスタンスを生成できない
- 継承できない

# 最後に
うまく書けなかったので、どんなものか特徴だけ書きました。
あと、書いてて思ったのはRubyについてもっと勉強しようと思った。
moduleとか他の言語でもあるし、根本的な知識が足りていないって気付かされたのが本当良かった。


# 参考
[改訂2版 パーフェクトRuby](https://www.amazon.co.jp/%E6%94%B9%E8%A8%822%E7%89%88-%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88Ruby-Ruby%E3%82%B5%E3%83%9D%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%BA/dp/4774189774/ref=tmm_other_meta_binding_swatch_0?_encoding=UTF8&qid=&sr=)
【Ruby on Rails】Ruby on Railsでページが表示される仕組を大雑把に理解する[Progate]

# Ruby on Railsを使ってWebを表示するには

大まかに、次の３つの仕組みが必要。大まかに、役割を覚えよう
コマンドラインを使ってRuby on Railsでトップページをgenerateすると、
これらのファイル達が自動的に生成される。

#ビュー（view)

<img width="974" alt="スクリーンショット 2018-07-10 19.38.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/265778/7c6881a5-62ed-f539-4140-7295a48ea96e.png">

サイトの見た目を構成する為のファイルがhtml形式でできている。
ただし拡張子は.erbだ。

#コントローラ(controller)
<img width="973" alt="スクリーンショット 2018-07-10 19.39.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/265778/221b7a93-1680-95db-d2e3-18876f118861.png">

ビューをブラウザ上に表示させるために、必要なファイル。
コントロール内に定義されているメソッドを「アクション」という。
アクションは、コントローラと同じ名前のビューフォルダから、
アクションと同じ名前のHTMLファイルを探してブラウザに返す。

<img width="972" alt="スクリーンショット 2018-07-10 19.45.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/265778/5375afe1-d0b4-41de-6077-24f488939b7e.png">


#ルーティング(routing)
<img width="973" alt="スクリーンショット 2018-07-10 19.49.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/265778/323fe4bc-6089-edb1-822c-40db83d56e4d.png">

ブラウザとコントローラを繋ぐ役割を担う。
ページが表示されるまでに、ルーティング→コントローラ→ビュー
という順で処理が行われている。

<img width="976" alt="スクリーンショット 2018-07-10 19.51.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/265778/80a5268a-4e22-4fb7-cc9f-b1093cba5e92.png">

ルーティングは、送信されたURLに対して「どのコントローラの、どのアクション」で処理するか
を決める「対応表」のこと。ブラウザでURLを入力すると、ルーティングがURLを見て、
適切なコントローラのアクションを呼び出す。


# MVCという仕組みについて
> Model View Controllerのこと
ゲーム機でわかりやすく例えると下図みたいな感じです

![image.png](https://qiita-image-store.s3.amazonaws.com/0/265778/22a36d9a-df4c-0cd0-f00a-26a5e21a5305.png)

画面に表示するビュー、キャラクターを操作する為のコントローラー、
そして操作に従って動かす指示を出すモデル、というイメージで良いと思われる。
この仕組みをRailsでも用いるんだな。
redash manage.py 使い方のまとめ

### 操作
redashのコンテナ（server）にログイン
`docker exec -it redash_server_1 bash`

####ヘルプを見る
`./bin/run ./manage.py --help`
`./bin/run ./manage.py [option] --help`

####ユーザー一覧
`./bin/run ./manage.py users list`

####パスワードの強制変更
`./bin/run ./manage.py users password username@abc.com newP@ssword`

####グループ一覧
`./bin/run ./manage.py groups list`

####org一覧
`./bin/run ./manage.py org list`

####ユーザーを追加する
`./bin/run ./manage.py users create [user-name@example.com] [user-name]`

####グループを追加する
`.bin/run ./manage.py groups create [group-name]`
グループにユーザーを追加するコマンドはなさそう

####管理者権限を与える
`./bin/run ./manage.py users grant_admin --org default [user-name@example.com]`
Unityでゲーム内データをJson形式にして保存する

こんにちは、現在個人でゲームを作っているのですが
その中で実装したセーブデータの保存・読み込みについて書かせていただきます。



#用意するもの
Json.NET　　＝　クラスをJSON化するために必要
参考にさせていただいたサイト
http://spi8823.hatenablog.com/entry/2016/04/16/001641

のみです。

#コード
通常であればサーバーなどに保存したりしますが今回サンプルとして保存先はPlayerPrefsとします。（用途に合わせて保存場所は変えてください）
PlayerPrefsは簡単に中身の書き換えや見ることが可能なので本来はセーブデータを保存するのには向きません。
（私はゲームの設定などの保存などにPlayerPrefsを使っています）

```cs:SaveLoad.cs

using UnityEngine;
using Newtonsoft.Json;

class SaveLoad: MonoBehaviour {
    public class CharacterData //キャラクターデータクラス
	{
		public string userName = "デザートイーグル";
		public int userLV = 50;
		public int birthdayYear = 1979;
		public string comment = "中二病の象徴";
	}

	CharacterData chara = new CharacterData();
	
	/// <summary>
	/// データの保存を行う
	/// </summary>
	public void Save()
	{
		if (chara != null)//キャラデータがない場合不具合が発生している場合があるのでLogErrorとして通知しておく
		{
			string jsonStr = JsonConvert.SerializeObject(chara); //クラスをJson化
			PlayerPrefs.SetString("playerData", jsonStr); //PlayerPrefsにデータを保存　　第1引数は任意
		}
		else
		{
			Debug.LogError("キャラクターデータがないよ！");
		}
	}

    /// <summary>
	/// データのロードを行う
	/// </summary>
	public void Load()
	{
		string loadJsonStr = PlayerPrefs.GetString("playerData", ""); //データのロード　第2引数は設定されていなかった場合の空データ設定
		if (string.IsNullOrEmpty(loadJsonStr)) //セーブデータがない場合無駄な処理を行わないためのif文
		{
			Debug.Log("セーブデータはないよ！");
		}
		else
		{
			CharacterData loadClass = JsonUtility.FromJson<CharacterData>(loadJsonStr);
		}
		
	}
}
```

変換処理が両方とも1行で済むのがいいですね。

```
string jsonStr = JsonConvert.SerializeObject(chara);
```

今回の肝となるのがこのコードでCharacterDataクラスをJson（string)に変換しています。
このコードでは下記のように変換されます。
{"userName":"デザートイーグル","userLV":50,"birthdayYear":1979,"comment":"中二病の象徴"}



nullチェックを行っているのはもし何かしらの不具合でキャラデータが消えてしまった場合、
nullの状態でセーブされてしまうのでセーブデータが壊れたり消えたりしてしまうのを避けるためです。

```
string jsonStr = JsonConvert.SerializeObject(null); 
```

とやった場合jsonStrはnullとなります。

もう一つの肝となるのは下記のコードです。

```
CharacterData loadClass = JsonUtility.FromJson<CharacterData>(loadJsonStr);
```
JsonUtility　　※こちらはUnity機能です。
https://docs.unity3d.com/ja/current/ScriptReference/JsonUtility.html

こちらはJson形式の文字列をCharacterData型に変換しています。
上記によりloadClassの中身は
![無題1111.png](https://qiita-image-store.s3.amazonaws.com/0/269147/9c0a7f02-5a38-c6f6-7e40-50040cd25cfa.png)
となります。


実際のゲームを作る際に暗号化などの問題も出ますが今回は省かせていただきました。
Haskell で直角三角形をなす三辺を任意の数出力する

# 概要
Haskell を触ってみて、掲題のことをやって感動したのでメモ。
関数型の良さを最初に実感した例。

# 本編
```haskell
-- 3辺を短い順に出力
rightAngleTriangle x = take x [[c, b, a] | a <- [1..],
                                           b <- [1..a],
                                           c <- [1..b],
                                           a^2 == b^2 + c^2]
```

使ってみると

```haskell
ghci> rightAngleTriangle 10
[[3,4,5],[6,8,10],[5,12,13],[9,12,15],[8,15,17],[12,16,20],[15,20,25],[7,24,25],[10,24,26],[20,21,29]]
```

手続き型言語での実装をイメージして、それを↑と比較すると、あまりの違いに愕然とする。
django restframework : add extra method

- 以下記事を試行済みの想定.
    - https://qiita.com/Satoshi_Numasawa/items/53c6de8816de53e92851

# description
- django restframework viewset へ, 独自 path(method) を追加

# how
- viewset class へ独自 method を追加
- path は自動生成される

# code例
```python:api/views.py
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework.decorators import action
from api.models import User

from .serializers import UserSerializer


class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all().select_related()
    serializer_class = UserSerializer

    @action(methods=['post'], detail=True)
    def set_password(self, request, pk):
        '''
        指定userへ passwordを設定する
        '''
```


# action設定
- methods
    - post, get, put... などの指定
    - 複数指定可能

- detail
    - True の場合, 以下 path となる
        - POST : /api/users/{id}/set_password/
    - False
        - POST : /api/users/set_password/


# 参考
http://www.django-rest-framework.org/api-guide/viewsets/#introspecting-viewset-actions
Rubyで最大値を探すアルゴリズムを書いてみた

# はじめに

ITエンジニアなら、基本的なアルゴリズムは知っておきたいよねとか言われても、一つも知らなかった。

まず、なぜ知って起きたいほど重要なのかをハラ落ちさせたかったので色々調べてみた。

[エンジニアの面接でアルゴリズムを組ませる理由](https://j.ktamura.com/archives/1348)

この記事に、アルゴリズムが大事だという２つ理由がありました。

> 速く基本的なアルゴリズムが正しく組める人は、他のコードを書かせてもバグを入れにくいうえ、作業が速い。もちろん、アルゴリズムを組むのが遅くても、バグの少ないコードを書く人は沢山いる。でも、アルゴリズムを速く正確に組める人は概して他のコードを書かせても素早いし、バグを入れにくい。雇う側からすれば、バグが少なく開発スピードが速いに越したことはない。

もう一つは

> 効率的なアルゴリズムはコスト削減につながる。当然の話だが、同じ機能だったら出来る限り少ないリソースでできた方が、コストが減って儲けにつながる。ソフトウェアもビジネスなので、コストが低いに越したことはない。そこで様々なソフトウェアの最適化がされるのだが、多くの場合、もっとも大幅にリソース使用量を減らせるのが、より効率的なアルゴリズムを使うことだ。裏を返せば、効率的なアルゴリズムがちゃちゃっと組めないエンジニアは、コードを書く度に、それだけ会社に損をさせていることになる。

アルゴリズムを勉強すると、応用力が効くし、コードの安全性も増すことができるということだろう。よし、ハラ落ち。

次に、本屋で簡単そうなアルゴリズムの本を買ったので、それを今勉強中のRubyで書いてみようというのをやって行こうかと思います。

今回は...

## 最大値を探すアルゴリズム

教科書はp80にあります。

暫定的に最大値を変数（`max`）に格納して、他の配列データ一つ一つと比較して、
暫定的なデータよりも小さかったら、何もしない。
暫定的なデータよりも大きかったら、そちらを変数（`max`）に格納する。という方法でやっていきましょう。

コードは以下のようになると思います。

```rb
array = [12,13,11,14,10]

max = array[0]

array.length.times { |i|
	if max < array[i]
		max = array[i]
	end
}

puts "最大値は#{max}です"
```

まず、`puts array.length`は配列0から4までの5個の要素があるので、数値の5が出力されます。

### timesメソッド

timesメソッドは、指定した回数だけ繰り返し処理を行うことが出来ます。使い方は...

```rb
オブジェクト.times{|変数|
  実行する処理
}
```

ということなので、今回は5 times繰り返し処理を行うということになります。
コードの繰り返しを１つ１つ説明すると

- 変数MAXに最初に入った12と12（array[0]）を比較
    - if文の中は実行しない
- 変数MAXに最初に入った12と13（array[1]）を比較
    - 13の方がデカイので、maxに代入
- 変数MAXに最初に入った13と11（array[2]）を比較
    - if文の中は実行しない
- 変数MAXに最初に入った13と14（array[3]）を比較
    - 14の方がデカイので、maxに代入
- 変数MAXに最初に入った14と10（array[4]）を比較
- 個数分繰り返したので、処理を抜けて`puts`を実行
    - 変数には14が格納されている

こんな感じです。

今回は、アルゴリズムを学ぶのが目的でしたが、Rubyなら

```rb
puts array.max

=>14
```

で、最大値は出力されますけどね。

ありがございました。

# レポジトリ

https://github.com/ryosuketter/algorithms_in_ruby

# 参考図書

[伊藤静香. アルゴリズムを、はじめよう. 第3章. インプレス, 2012, p. 80-86. ](http://amzn.asia/e2TwMNK)

# 参考
- https://j.ktamura.com/archives/1348
- https://www.rubylife.jp/ini/for/index6.html
xc3sprogをつかってFPGAをプログラムする

xc3sprogはJTAG経由でXilinxのFPGAを(SRAM)プログラムする便利なツールです。Sourceforgeの本家のSVNがアクセスできなくなったようなので、Githubにあるコピーを使いますが、レポジトリによってはうまく行かないものがあるようです。以下はUbuntu16.04上でARTYをプログラムできるxc3sprogのビルドとインストールのメモです。

## ビルド

    sudo apt-get install libftdi-dev
    git clone https://github.com/xtrx-sdr/xc3sprog.git
    mkdir build
    cd build
    cmake ../
    make
    sudo make install


## ARTYで動作確認

USB接続の確認

    $ lsusb
    Bus 001 Device 023: ID 0403:6010 Future Technology Devices International, Ltd FT2232C Dual USB-UART/FIFO IC

xc3sprogで検出できるか確認（ARTYの場合はnexys4でOK）

    $ xc3sprog -c nexys4 -v -j
    XC3SPROG (c) 2004-2011 xc3sprog project $Rev: 774 $ OS: Linux
    Free software: If you contribute nothing, expect nothing!
    Feedback on success/failure/enhancement requests:
    	http://sourceforge.net/mail/?group_id=170565 
    Check Sourceforge for updates:
    	http://sourceforge.net/projects/xc3sprog/develop

    Using built-in device list
    Using built-in cable list
    Cable nexys4 type ftdi VID 0x0403 PID 0x6010 Desc "Digilent USB Device" dbus data e8 enable eb cbus data 00 data 60
    Using Libftdi, Using JTAG frequency   6.000 MHz from undivided clock
    JTAG chainpos: 0 Device IDCODE = 0x0362d093	Desc: XC7A35T
    JTAG loc.:   0  IDCODE: 0x0362d093  Desc:                        XC7A35T Rev: A  IR length:  6

xc3sprogでFPGAをプログラム

    $ xc3sprog -c nexys4 -v  sample.bit
    XC3SPROG (c) 2004-2011 xc3sprog project $Rev: 774 $ OS: Linux
    Free software: If you contribute nothing, expect nothing!
    Feedback on success/failure/enhancement requests:
    	http://sourceforge.net/mail/?group_id=170565 
    Check Sourceforge for updates:
    	http://sourceforge.net/projects/xc3sprog/develop
    
    Using built-in device list
    Using built-in cable list
    Cable nexys4 type ftdi VID 0x0403 PID 0x6010 Desc "Digilent USB Device" dbus data e8 enable eb cbus data 00 data 60
    Using Libftdi, Using JTAG frequency   6.000 MHz from undivided clock
    JTAG chainpos: 0 Device IDCODE = 0x0362d093	Desc: XC7A35T
    Created from NCD file: testbed;UserID=0XFFFFFFFF;Version=2016.4
    Target device: 7a35ticsg324
    Created: 2018/07/10 17:29:13
    Bitstream length: 17536096 bits
    done. Programming time 2987.4 ms
    USB transactions: Write 1087 read 14 retries 8
Rails で、複数 ID に対して OR 条件で BASIC 認証をかける方法

# 前提

* Rails の話
* 下記のような2組の ID/PW ペアが存在するとする
    * user1 / pass1
    * user2 / pass2

# やりたいこと

* あるアクションに対して、 user1 **または** user2 だけがアクセスできるような BASIC 認証をかけたい

# 結論

以下のように実装すればよい。

```ruby
class FooController < ApplicationController
  before_action :multiple_authenticate

  def index
  end

  protected

  def multiple_authenticate
    authenticate_or_request_with_http_basic do |username, password|
      (
        ActiveSupport::SecurityUtils.secure_compare(username, 'user1') &
        ActiveSupport::SecurityUtils.secure_compare(password, 'pass1')
      ) | (
        ActiveSupport::SecurityUtils.secure_compare(username, 'user2') &
        ActiveSupport::SecurityUtils.secure_compare(password, 'pass2')
      )
    end
  end
end
```

もちろん、ID/PW をハードコードしているところは適宜セキュアにすること（環境変数を使う、secret.yml を使うなど）。

# 解説

まず、「やりたいこと」で示した「OR 条件による BASIC 認証」を実現する標準機能はどうやら存在しないようでした。
仕方ないので自前で実装するわけですが、ここで普通に BASIC 認証するときに使う `http_basic_authenticate_with` の実装を参考にします。ソースはこちら (https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/http_authentication.rb#L71-L81) 。

このメソッドは、直下で定義されている `authenticate_or_request_with_http_basic` というメソッド（名前が似ていてややこしい）を使って `before_action` を設定しているだけのようです。`authenticate_or_request_with_http_basic` は、

* リクエストヘッダに BASIC 認証情報が含まれていなければ 401 を返す（ID / PW を聞く）
* リクエストヘッダに BASIC 認証情報が含まれていればブロックを評価し、
    * truthy なら処理を続行
    * falsy なら 401 を返す（ID / PW を聞く）

という挙動をします。ということは、`authenticate_or_request_with_http_basic` のブロック内で user1 **または** user2 の ID/PW と一致するかどうかをチェックすればよい、ということになります。

ここで、`http_basic_authenticate_with` のソースに目を戻します（繰り返しになりますが、メソッド名がややこしいので混乱しないよう注意してください）。この実装を見ると、ID/PW の比較に変わったメソッドを使っています。

```ruby
# This comparison uses & so that it doesn't short circuit and
# uses `secure_compare` so that length information
# isn't leaked.
ActiveSupport::SecurityUtils.secure_compare(name, options[:name]) &
ActiveSupport::SecurityUtils.secure_compare(password, options[:password])
```

ここでは、セキュリティのために以下の2つの工夫がこらされています。

* 文字列の比較に `secure_compare` を使っている
    * コメントにも書かれていますが、これによって比較対象の文字長がバレないようになっています。
    * 文字列比較が「そもそも文字長が一致してなければ即エラーを返す」という実装になっている場合、比較処理がすぐ終わるかどうかで文字長を推理できてしまいます。いわゆるタイミング攻撃というものです。
    * 実装を見てみると、与えられた文字列を SHA256 でハッシュ化してから比較しています。つまり常に 256 文字同士の比較になるため、セキュアというわけです。
    * 参考: https://github.com/rails/rails/commit/fa487763d98ccf9c3e66fdb44f09af5c37a50fe5
* AND 演算に `&` を使っている
    * コメントにも書かれていますが、これによって短絡評価がされないようになっています。
    * 短絡評価されてしまうと、`name` が正しいときと間違っているときとで処理時間に差が出てしまい、ここでもタイミング攻撃のリスクが発生します。
    * 参考: https://github.com/rails/rails/commit/17e6f1507b7f2c2a883c180f4f9548445d6dfbda

これに倣うと、今回実装する複数 ID/PW ペアに対する OR 条件での認証も、

* 文字列の比較に `secure_compare` を使う
* OR 条件に `|` を使う

という方針で実装すればよさそうです。その実装例が上記で示したものとなっています。
Scratch 3.0 で micro:bit が使えるらしいのでWindowsで環境を準備しました

#Scratch3.0 の拡張機能
こんな記事が投稿されていましたので、試してみました。
（でも、micro:bitをもっていませんので、実機に接続できていません・・・）
##ISTE2018レポート：ベールを脱いだScratch 3.0のmicro:bit接続機能
`8月1日にリリース予定のScratch 3.0 Betaで提供されるBluetooth Low Energy（以下、BLE）によるmicro:bit接続機能について、初公開とワークショップが行われた`
[リンク](https://www.watch.impress.co.jp/kodomo_it/news/1130112.html)

#Scratch3.0+micro:bit
本家はこちらのページです。
[Scratch3.0+micro:bit](https://llk.github.io/microbit-extension/iste18/)

#web-bluetooth-polyfill
Windows10の場合、Chromeの拡張機能の設定が必要です。スマートフォンやLinux、Macは対応済みらしい。

日本語に訳しましたので、この手順で設定してください。

https://github.com/jp-96/web-bluetooth-polyfill/blob/ja-JP/README_ja-JP.md

注釈にも書きましたが、設定するにはWindowsの管理者権限が必要です。

#プログラミング学習環境
子供向けのプログラミング学習の場では、 `Scrtch3.0+micro:bit` がデファクトスタンダードになるのかなー
シンボリックリンク作成Droplet

# ln -s をドロップレットで

Dropboxにはエイリアス突っ込んでもDropboxフォルダの外だと同期してくれませんので、シンボリックリンクを作る必要があります…
がターミナルでln -s 、あれ、どっちが先だっけ？　ってなるので、「ここにシンボリックリンク作成.app」にまとめました。
スクリプトエディタにコピペして、アプリケーションとして保存し、Dropbox内の適当なフォルダに移動してください。
Dropbox外のフォルダをこのアプリにドラッグ＆ドロップすると、同じ階層にシンボリックリンクが作られます。
これならDropboxも同期してくれます。
必要な時に必要なものだけ突っ込んで同期しませう。

※シンボリックリンクの扱いはエイリアスと同様で。削除しても元フォルダは消えません。


```applescript:_ここにシンボリックリンク作成.app
on open myFolder
	tell application "Finder" to set myTarget to POSIX path of (container of (path to me) as alias)
	repeat with i in myFolder
		if folder of (info for i) then
			set a to POSIX path of i
			do shell script "ln -s " & quoted form of a & " " & quoted form of myTarget
		else
			display alert "フォルダを入れてください"
			exit repeat
		end if
	end repeat
end open
```
カスタム投稿タイプのページslug名から投稿オブジェクトを取得する


slugから、該当するカスタム投稿タイプの情報を取得する。

```php
$post = get_page_by_path($slug, "OBJECT", $post_type);
```

投稿IDのみ取得するなら、次のとおり。

```php
$post_id = get_page_by_path($slug, "OBJECT", $post_type)->ID;
```

$post_typeを省略すると、デフォルトで固定ページが選択される。
プログラミングに必須なAtomの設定！！

##はじめに
Atomを使っている人は、時々「不便だな…」と思うことがあるはず。
まぁ、Atomに限らないだろうけど。
この記事では、自分が不便に思ったAtomの初期設定とその解消法を書いていきます!!

##編集するファイルを別のタブで開きたい！！
初期設定のAtom
　「別のファイル見たいな」(プロジェクトフォルダからファイルをクリック)
→(今使っているファイルの上に新しいファイルが開かれる)
→:rage:

解決法

```
 setting(環境設定)
→Core setting(コア設定)
→Allow Pending Pange Items(プレビュータグを使う)のチェックを外す
```

![Screenshot from 2018-08-01 14-24-32.png](https://qiita-image-store.s3.amazonaws.com/0/218398/099db642-1bf4-771f-6ec9-5a8687ff2c36.png)


設定変更後のAtom
　「別のファイル見たいな」(プロジェクトフォルダからファイルをクリック)
→(今使っているファイルの隣のタブで見たいファイルが開かれる)
→:grin:

参考記事:
Atomで編集ファイルを新規タブで表示させる方法(http://dosukoikoi.sub.jp/blog/archives/257)

## No newline at end of fileの前の改行いらん！！
初期設定のAtom
 「よっしゃファイル変更終わったし、git pushしたろ！！」
→(ファイルの最後に`No newline at end of file`があって、わけわからん改行がある)
→わけわからん改行いらんねんけど…:no_good:

解決法

```
 setting(設定)
→Packages(パッケージ)
→「whitespaces」で検索
→Settingをクリック
→一番上にある「Ensure Single Trailing Newline」のチェックを外す
```
![Screenshot from 2018-08-01 14-27-30.png](https://qiita-image-store.s3.amazonaws.com/0/218398/97b7f486-d779-712a-f084-e2000c92acaa.png)


設定変更後のAtom
 「よっしゃファイル変更終わったし、git pushしたろ！！」
→(自分が行った変更だけがgit diffで表示される。`No newline at end of file`は残る)
→まぁええか！:ok_woman:

参考記事:
【Atom】ファイルの最後に自動で改行入る対策 | komura's Ownd
(https://komura.amebaownd.com/posts/797196)

##おわりに
今後も不便に思ったことは更新していきますよ！！
FAT32 > FAT Tableが壊れたメディアの内容を別のメディアにコピーする | エクスプローラでコピーできないファイルを持つメディアのコピー ( dd if=/dev/sdb1 of=/dev/sdc1 )

```txt:動作環境
CentOS 6.9 (64bit)
```

### 希望

- FAT32でフォーマットされたmicroSD
- FAT Tableが壊れた状態
- FAT Tableが壊れた状態のまま別のメディアにコピーしたい
    - FAT32でフォーマット済メディアへ

### 方法

CentOSでコピー元とコピー先をマウントし、ddコマンドを実行する。

```txt
$ dd if=/dev/sdb1 of=/dev/sdc1
```

コピー元が8GB(microSD), コピー先は16GB(USBメモリ)であったが、コピーできた。

壊れた元のメディアは保持し、故障状態に対する各種テストをする場合などに役立つかもしれない。


### コピーできないファイル

(2018-12-20追記)

エクスプローラでコピーできないファイルを保持するメディアに遭遇した。

上記のコマンドにてそのファイル含めて別のメディアにコピーでした。
雑にPromiseを直列接続する


## はじめに
JavaScriptでPromiseを直列接続しようとするとよくはまるので、メモしておく。
コメントも参照してね。

## 環境
* macOS High Sierra 10.13.5
* Node.js v8.11.3

## ソースコード

```js
'use strict'


function startPromise() {
    return new Promise(resolve => {
        console.log('START');
        resolve();
    });
}

function arrayPromise(array) {
    array.forEach(element => {
        setTimeout(() => {
            console.log('ARRAY FINISH:' + element);
            Promise.resolve();
        }, element);
    });
}

/**
 * こいつはthenの中にfunctionじゃなくてPromiseを突っ込んでるのでうまくいかない。
 * @param {*} array 
 */
function badArrayPromise(array) {
    // Promiseを保管する箱
    var promiseArray = new Array();
    // Promiseの生成
    array.forEach(element => {
        promiseArray.push(new Promise(resolve => {
            console.log('ARRAY START:' + element);
            setTimeout(() => {
                console.log('ARRAY FINISH:' + element);
                resolve();
            }, element);
        }));
    });
    // 直列接続
    return promiseArray.reduce((p, c) => {
        return p.then(c);
    });
}

/**
 * 正解
 * @param {*} array 
 */
function goodArrayPromise(array) {
    // Functionを保管する箱
    var functionArray = new Array();
    // Promiseの生成
    array.forEach(element => {
        functionArray.push(() => {
            return new Promise(resolve => {
                console.log('ARRAY START:' + element);
                setTimeout(() => {
                    console.log('ARRAY FINISH:' + element);
                    resolve();
                }, element);
            });
        });
    });
    // 直列接続
    return functionArray.reduce((p, c) => {
        return p.then(c);
    }, Promise.resolve());
}


function endPromise() {
    return new Promise(resolve => {
        console.log('END');
        resolve();
    });
}

function main() {
    var ary = [1000,2000,3000,4000];
    startPromise()
        .then(() => {return goodArrayPromise(ary)})
        .then(endPromise);
}

main();
```