OmniAICreator/Qiita-1.07M huggingface dataset:
はてなダイアリー to Markdown > v0.6 > Verilog-HDLコードとVHDLコード表記対応

[はてなダイアリー to Markdown > v0.5 > Tex:表記対応](https://qiita.com/7of9/items/fe4e3d46dcd0369a3849)
の続き

v0.1は[こちら](https://qiita.com/7of9/items/4e5c586431871e24ad33)

### code v0.6

- FPGAのVerilog-HDLコードとVHDLコードの記事がはてなダイアリーにあったため、対応した

https://ideone.com/Vvzdqk

```py
...
def conv_super_pre_notation(astr):
    astr = astr.replace(">||", "```")
    astr = astr.replace(">|cpp|", "```cpp")
    astr = astr.replace(">|c|", "```c")
    astr = astr.replace("||<", "```")
    astr = astr.replace(">|verilog|", "```verilog")
    astr = astr.replace(">|vhdl|", "```vhdl")
    return astr
...
```

### 全コード

```py
import sys
import re

# on Python 3.5

'''
v0.6 Jun. 22, 2018
   - conv_super_pre_notation() handles [vhdl]
   - conv_super_pre_notation() handles [verilog]
v0.5 May, 29, 2018
   - add conv_tex()
v0.4 Apr. 25, 2018
   - add conv_tableFormat()
v0.3 Apr. 25, 2018
   - conv_super_pre_notation() takes cpp notation
v0.2 Apr. 25, 2018
   - add conv_super_pre_notation()
   - add conv_sublist()
v0.1 Apr. 24, 2018
   - sub list is converted to Markdown style
'''


def conv_tex(intxt):
    if r"[Tex:" in intxt or r"[tex:" in intxt:
        wrk = re.sub('\[Tex:', r'```math\r\n', intxt)
        wrk = re.sub('\[tex:', r'```math\r\n', wrk)
        wrk = re.sub(r']', r'\r\n```', wrk)
       	return wrk
    return intxt


def conv_sublist(astr):
    if "---" in astr:
        astr = astr.replace("---", SPACE4 + SPACE4 + "-")
    if "--" in astr:
        astr = astr.replace("--", SPACE4 + "-")
    return astr


def conv_super_pre_notation(astr):
    astr = astr.replace(">||", "```")
    astr = astr.replace(">|cpp|", "```cpp")
    astr = astr.replace(">|c|", "```c")
    astr = astr.replace("||<", "```")
    astr = astr.replace(">|verilog|", "```verilog")
    astr = astr.replace(">|vhdl|", "```vhdl")
    return astr


def getTableFormat(numVertical):
    wrk = "|"
    for loop in range(numVertical - 1):   # -1: except for first
       wrk += ":-:|"
    return wrk


def conv_tableFormat(astr):
    global countTbl
    if "|" in astr:
        countTbl += 1
        if countTbl == 2:
            num = astr.count('|')
            fmt = getTableFormat(num)
            return fmt + "\r\n" + astr
    else:
        countTbl = 0
    return astr
    
# read from stdin
lines = sys.stdin.readlines()

SPACE4 = "    "

countTbl = 0  # Table format counter
for elem in lines:
    wrk = conv_sublist(elem)
    wrk = conv_super_pre_notation(wrk)
    wrk = conv_tableFormat(wrk)
    wrk = conv_tex(wrk)
    print(wrk, end='')
```


### 問題点

VHDLのコードのコメント`-- 2to4デコーダー`の`--`は、はてなのリスト表記`--`と被る。

v0.6までは`--`はリストとして変換されてしまうので、あとで手直しが必要となる。
Vagrantを使って起動時にdocker＋docker-composeをセットアップする

# Vagrantを使って起動時にdocker＋docker-composeをセットアップする

## 環境情報

- Docker version 18.05.0-ce
- docker-compose version 1.21.0

## 事前条件として

- Virtual BoxやVagrantがセットアップ済みであること

## 環境構築

### Vagrantfileを修正

Vagrantfileの内容を以下のようにセットする。

```
Vagrant.configure("2") do |config|
  config.vm.box = "bento/centos-7.4"
  config.vm.provision "docker"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--memory", "2048"]
  end
  # docker-composeのインストール
  $get_compose = <<-'EOF'
  sudo curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
  sudo chmod +x /usr/local/bin/docker-compose
  EOF
  config.vm.provision "shell", inline: $get_compose
end
```

### vagrant upする

```shell
vagrant up
```

### dockerとdocker-composeがインストールされているか確認

```shell
C:\vagrant-work\docker>vagrant ssh
[vagrant@localhost ~]$ docker -v
Docker version 18.05.0-ce, build f150324
[vagrant@localhost ~]$ docker-compose -v
docker-compose version 1.21.0, build 5920eb0
```
NPO Toppers asp configurator, macintosh「名古屋のIoTは名古屋のOSで」

# TOPPERS ASP Configurator
で検索すると先頭の１０項目は次

### TOPPERSプロジェクト／
TOPPERS新世代カーネル用コンフィギュレータ
https://www.toppers.jp/cfg.html

### TOPPERSプロジェクト／
ダウンロード
https://www.toppers.jp/cfg-download.html

### TOPPERSコンフィギュレータの進んだ使い方 - 
TOPPERSプロジェクト
https://www.toppers.jp/docs/tech/cfg-tutorial.pdf

### TOPPERSプロジェクト／ドキュメント
https://www.toppers.jp/documents.html

### Besttechnology - TOPPERS/ASPを動かす #1・・・何はともあれ動かしてみる
http://www.besttechnology.co.jp/modules/d3blog/details.php?bid=28

### toppers-asp/configurator.txt at master · takahashim/toppers-asp · GitHub
https://github.com/takahashim/toppers-asp/blob/master/doc/configurator.txt

### Ubuntu 15.10 で TOPPERS/ASP 用コンフィギュレータをビルドする - Qiita
https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=7&cad=rja&uact=8&ved=0ahUKEwio48D07uXbAhVVA4gKHV1EA9AQFghOMAY&url=https%3A%2F%2Fqiita.com%2Fwarafuuji%2Fitems%2F9f9924cd303541fea040&usg=AOvVaw2PCUmdHsQ0KogldLJqZopJ

### MacでTOPPERS/aspのコンフィギュレータを作成 - ロボットを作りたい
http://d.hatena.ne.jp/shaga/20090212

### TOPPERS/ASP for LPCXpresso ユーザーズ・マニュアル
ftp://ftp.iij.ad.jp/pub/sourceforge.../toppersasp4lpc/.../toppersasp_lpcxpresso_um_diff....

### 組込マーへの道 TOPPERS/ASP - FC2
kumikoma.blog47.fc2.com/blog-category-1.html

# Toppers asp configurator macintosh
で検索すると

TOPPERS/ASP3をシミュレータで動かす & タスクを実装する - 千里霧中
http://goyoki.hatenablog.com/entry/2016/04/01/024047

NUCLEO-F401REでTOPPERS/ASPを動かす(Mac+Eclipse版) - Qiita
https://qiita.com/yurie/items/7bfe88d657bbbacc63c8

名古屋のIoTは名古屋のOSで（TOPPERS まとめ） - Qiita
https://qiita.com/kaizen_nagoya/items/9026c049cb0309b9d451

TOPPERSプロジェクト／INDEX
https://www.toppers.jp/

TOPPERS利用の想定質問と回答作成中 - researchmap
https://researchmap.jp/jong1zpmi-1778110/

TOPPERS/ssp cfg（コンフィギュレータ） - researchmap
https://researchmap.jp/joxm41sjc-1778110/?

TOPPERS最小セットカーネルへの（廻り）道（4）Mac OS X用シミュレータ ...
https://researchmap.jp/jojear0f4-45644/

ソースツリー: /asp/cfg/ (master) - asp (git) - TOPPERS/ASP for ... - OSDN
https://ja.osdn.net/projects/toppersasp4lpc/scm/git/asp/tree/master/asp/cfg/

ファイル詳細: /asp/cfg/README.txt (master) - asp (git) - TOPPERS/ASP ...
https://ja.osdn.net/projects/toppersasp4lpc/scm/git/asp/blobs/master/asp/.../README.tx...

重複した１件は省略。
### 文書履歴(document history)
ver. 0.10 初稿 20180303
ver. 0.11 「名古屋のIoTは名古屋のOSで」追記 20180731
ver. 0.12 ありがとう追記　20230413
## 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
AWS初心者が無料利用枠で個人運用していたら$0.64請求がきた話し

# 概要

ついに私のところにもきましたAWS請求$0.64。。。
不正利用ついにやれたか!!!
と、思っていたら実は違いました。

AWS初心者が無料利用枠の範囲内でと利用していたがダメだった話しとして、
興味ある方はご覧ください(_ _)

## 詳細

いろんなところで目にする突然の多額請求が怖いので請求ダッシュボードは日々チェックしていました。
前日までは何の問題もなかったのに、何の前触れもなくやってきた$0.64

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188544/d19cc1b5-f9b1-3293-ed7b-f1efd677a7aa.png)

いやいや焦りました。このまま雪だるま式に増えていったらどうしようと
必死に何にやられたのかチェックです。

とりあえずダッシュボードの中ほど、使用状況別の上位利用無料枠サービスをみてみると、
S3 - Puts となってます。
昨日まで上位5位にすらいなかったのに突然ランクイン&ぶっちぎりで100%といってます。
しかも今月終わりまでで200%になると。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188544/c8c60da9-1262-4eba-ae06-cd19382b4f39.png)

身に覚えがないですが、何が Puts されているのかS3をチェックです。
いくつかバケットを作成しファイル保存はしていたので一つ一つチェックしていきますが、
どれを見ても更新された形跡がなく、何かの間違いではないかと思ってきたところついに発見、、、

CloudTrail-Digest 配下になんだかフォルダいっぱい、、、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188544/ee9ac788-a7be-47df-ecd9-a3634dbb8319.png)

さらにフォルダ下にファイルいっぱい、、、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188544/926ad061-612b-d5d1-e451-6957c9bdddd9.png)

間違いなくこれだと思い、これは何ぞやと調べたところ、

```
ログファイルの整合性の検証機能を有効にすると、CloudTrail からダイジェストファイルが毎時間配信されます。
```

とのこと。。。
確かにアカウント取った直後くらいに有効にした。そして昨日、とある変更をS3に保存しておきたいなぁと
30分ほどCloudTrailのログ記録ONにした、、、

この30分で過去 90 日間保存されている証跡ダイジェストがS3に保存されたということですか？AWSさん
なぜか肝心の証跡の方は有効にしていた約30分間ぶんの操作証跡しかないですが。

ダイジェストの方だけ90日間分遡って保存
　90日間　×　24時間　×　16リージョン　=　34,560 Puts
ということですか？
そりゃ無料利用枠2,000Putsなんて一瞬で超えますよ。。。

そもそも個人利用で整合性の検証機能を有効にしたのがバカだったのか
さっと無効にしました。

ちなみに設定は、CloudTrail　＞　証跡情報　＞　設定の以下です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188544/db58527a-72e9-b6cb-3352-59b7016bd00c.png)

S3へのログ記録はこっち

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188544/900be823-a8e7-7c08-b8a2-157f1b400f4d.png)

誰かの参考になればと思います。

## 最後に

AWSさんこれは正しい動きなんですかね？
せめて、証跡の方も90日間分遡ってS3に保存されないと何のためのダイジェストファイルなのか。
と、思うのは私だけでしょうか？

## 追記

気が付けば不正請求の第二弾、、、
と、思ったら１年の無料期間がいつの間にか終わり放置しておいたEBSの請求が発生していた。
使っていないEBSはスナップショットを取って削除しましょう。。。

EBSの料金について以下に参考記事を書きました。良かったらこちらも＾＾

　[AWS初心者がEC2を最低限の利用料金で利用する](https://qiita.com/fkooo/items/1254121c20b4593cc2f4 "AWS初心者がEC2を最低限の利用料金で利用する")
Windows10 + PHP7.2+Apache2.4でcurlを有効にする

Windows10 + PHP7.2+Apache2.4でcurlを有効にする方法、結構ハマったので書いておきます。

ネットを探すとcurlが動かない時の対処法がいろいろ見つかりますが古いphp5時代のものだったりして混乱しました。

まず、**php7.2の64ビット版にはlibeay32.dllとかssleau32.dllはありません。**

64ビット版のphp_curl.dllの依存関係を確認してみます。

```
deplister ext/php_curl.dll
```

![20180622_apache php curl.jpg](https://qiita-image-store.s3.amazonaws.com/0/252253/96148663-c0fc-4c3d-625a-7a7e37677518.jpeg)

ここで、NOTFOUNDのapi-ms-win-crt-シリーズが原因なのかと思ってしまってハマる。

色々やった結果、次のファイルだけをapacheのbinに入れてやるとうまくいきました。

```
libssh2.dll
nghttp2.dll
libcrypto-1_1-x64.dll
libssl-1_1-x64.dll
```

元記事：https://ameblo.jp/ryujimiya/entry-12357363197.html
継承関係の依存を軽減する

# 前置き
**オブジェクト指向設計実践ガイド　～Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方**を読み、咀嚼のために　PHPで同じようなことを実装して理解を深めます。助言いただけると幸いです。

# 概要
オブジェクト指向の考え方として、**依存しすぎない(＝疎結合)**であることが良しとされる。
**そしてこの考えは継承関係にあるクラス同士でも適用される。**

* 継承関係にあるクラス同士がどのように依存しているか
* その依存をどうやって解消するか

をPHPのコードで例を示します。

# 依存しすぎている継承関係
以下の例は、幾つかの子クラスで共通した処理を行う場合を仮定しています。
その共通処理を親クラスのメソッドとしてまとめることで、[Don't Repeat Yourself](https://ja.wikipedia.org/wiki/Don%27t_repeat_yourself)に則ろうとしています。

```php:ParentModel.php
<?php

class ParentModel
{

    public function initialize()
    {
        // 親クラスで実装している共通処理
        echo "parent initialize done...\n";
    }
}
```

```php:ChildModel.php
<?php

require __DIR__."/ParentModel.php";

class ChildModel extends ParentModel
{

    public function initialize()
    {
        // 親クラスにまとめられた共通処理を呼ぶ
        parent::initialize();
        // 子クラス独自の処理を行う
        echo "child initialize done...\n";
    }
}
```

```php:call.php
<?php

require __DIR__."/ChildModel.php";
// このプログラムを実行する
$child = new ChildModel();
$child->initialize();
```

```:動作結果
parent initialize done...
child initialize done...
```

非常にシンプルなコードですが、この継承関係にある２つのクラスで注目すべき依存とは`parent::initialize()`です。
ここで問題なのは**子クラスが「親クラスがinitialize()を実装している」ことを知っている**という点です。
(ここでの「知っている」とはソースコードに明示的に記述されていることを意味します。)

**あるクラスが他のクラスについて知っている**というのは依存している事を示しています。新たなサブクラスを作成しようとした別のプログラマが`parent::initialize()`を書き忘れた途端、予期せぬ挙動が起きるかもしれません。

# 依存を解消する
依存を解消するには、子クラスのChildModelから`parent::initialize()`という行が存在しなければ解決です。
ということで、以下のようにソースコードを変更します。

```php:ParentModel.php
<?php

class ParentModel
{

    public function initialize()
    {
        // 親クラスで実装している共通処理
        echo "parent initialize done...\n";
        // 独自処理を呼ぶ
        $this->postInitialize();
    }

    protected function postInitialize()
    {
         // 親クラスで実装するが特に何もしない
    }
}
```

```php:ChildModel.php
<?php

require __DIR__."/ParentModel.php";

class ChildModel extends ParentModel
{

    protected function postInitialize()
    {
        // 子クラス独自の処理を行う
        echo "child initialize done...\n";
    }
}
```

call.phpは変更ありません。
この変更のポイントはcall.phpから見ると

* 変更前：子クラスに実装されたメソッドを呼ぶ
* 変更後：親クラスに実装されたメソッドを呼ぶ（間接的に子メソッド呼ぶ）

に変わった点です。
この変更によりChildModel.phpでは親クラスのメソッドを明示的に呼ぶ必要がなくなったので依存が解消されました。

# 所感
空のメソッドがあるというのは少しモヤっとするのですが、こんなもんだと割り切るんですかね？あまり見たことがないのでかなり拒絶されそうな気がしますが・・・
abstractクラスにしてpostInitialize()を抽象化すると状況が多少改善されるのでしょうか。
ただしその場合は、子クラス独自の処理がないとき子クラス側に何もしないメソッドが追加されることになりますね。

（よくよく考えればcakephpのコアソースにも空のメソッドがどこかにあったかも・・・。知らないだけで一般的？）
Redmine 3.4.4 のRedmine Backlogs でエラー

##Redmineの構築

以下を参考に、docker上にRedmine,Redmine-db(mysql)を構築し、[Redmine Backlogs](https://github.com/backlogs/redmine_backlogs)プラグインを導入しました。

アジャイル開発を行う上で、非常に便利なプラグインですが、Redmineの2.X系しかサポートしておらず、4年以上更新がないため、一部Redmineのアプリケーションを修正しないと動作しないという問題がありました。

構築の参考：[RedmineをDockerで建てる in Mac](
https://qiita.com/boyaki_machine/items/22c4d15350e330e4a8ff)

##Redmine3.XでRedmine Backlogsを運用する時の問題点
ある時、アジャイルなので、少しRedmine Backlogsの設定を改善しようと、いろいろ変更をかけてみようとしたところ、見えていたはずのバックログが突然、

**「バックログが設定されていません。設定画面 管理 > プラグイン, からリンク 設定 をクリックして設定してください。フィールドを設定後、このページへ戻りツールを利用してください。」**

となり、チケット操作も出来ない状態になりました。

実施した操作は、
「管理」「プラグイン」「Redmine Backlogsの設定」「適用」ボタンを押下した場合です。
（値を何も変更しなくても、「適用」を押すと事象が再現されます。）

未対応のバージョンでプラグインを使っているので、当然ではありますが、対処法を記しておきます。

##原因
Redmine Backlogsのプラグインで使用している、settingsテーブルの「plugin_redmine_backlogs」のレコードの先頭にあった「：」が消えてしまうため。

##対処
「:」入りのレコードを作る。

以下は、ほぼ初期設定にはなりますが、上記の方法で構築した場合の対処手順を記載します。
別環境で、同様の事象が起きている場合は、適宜読み替えてください。

#mysqlコンテナにログイン
```
docker exec -it redmine_db /bin/bash
```
#mysqlにログイン
```
mysql -u root -P
Enter password: PASSWORD
＃ パスワードは構築時に設定したもの
```

#正常なレコードをインサート
```
INSERT INTO `settings` VALUES (2,'plugin_redmine_backlogs','---\n:story_trackers:\n- \'4\'\n:default_story_tracker: \'1\'\n:task_tracker: \'5\'\n:wiki_template: \'\'\n:show_redmine_std_header: enabled\n:scrum_stats_menu_position: top\n:story_points: \'1,2,3,5,8,13\'\n:new_story_position: bottom\n:story_follow_task_status: nil\n:story_close_status_id: \'0\'\n:points_burn_direction: down\n:burndown_print_width: \'\'\n:burndown_print_height: \'\'\n:show_burndown_in_sidebar: enabled\n:burndown_timezone: Etc/GMT-0\n:taskboard_card_order: story_follows_tasks\n:autorefresh_wait: \'1000\'\n:sprint_sort_order: asc\n:sharing_new_sprint_sharingmode: none\n','2018-05-07 11:50:22');

exit
exit
# idを2にしていますが、キーが被らないように新たなレコードを作成する
# 元の設定を活かしたい場合は、事前にセレクトしてインサート文を編集する
```
#Redmineを再起動
```
docker restart redmine
```

以上。
read_csvの読み込みではまったとき用の備忘録

## Who am I
環境情報や、サンプルデータなど
https://qiita.com/Senple/items/b47374e68e4d8d26d0cb


## まずread_csvの使い方
csvファイルであれば、基本的にはread_csvで読み込めます。

```Python:
import pandas as pd

pd.read_csv('h2c1zike.csv')
```
しかし条件によってはたまに、読み込むことができなくて、

```
"utf-8"codec can't decode byte 0x81 in position 0: invalid start byte
```
と出てしまうことがあります。

セルの結合などの操作などを行ったExcelファイルをcsv形式で保存して、pandasの分析に使おうとすると、このエラーが出てきました。
Excel側を直しても解決するのですが...
~~基本的にものぐさ~~Excelデータをいじれない場合もあるので、pandasでむりやり読み込ませる方法はないものかと、エラーコードでGoogle検索した結果、以下の記事を見つけました！
◆pandasでread_csv時にUnicodeDecodeErrorが起きた時の対処 (pd.read_table())
https://qiita.com/niwaringo/items/d2a30e04e08da8eaa643

## codecsを使って読み込む

```Python
import codecs

with codecs.open("h2c1zike.csv",mode ="r", encoding= "Shift-JIS",errors="ignore") as file:
    data = pd.read_table(file, delimiter=",",header=None)
```
変なことあっても無視してね！ってことで、力業で読み込んでくれます。
とっても便利なので、pandasがread_csvが嫌いになる前にいちど試してみてください。

## 関連情報
[csvとして出力する方法](https://note.nkmk.me/python-pandas-to-csv/)を追記しておきます。

```
data.to_csv("Semple.csv")
```
dataをSemple.csvという名前で出力する。
GPSの研究　その20

#概要
GPSを理解したかった。
RTKLIBを調べてみた。


#RTKLIBとは。

RTKLIBは，東京海洋大学の高須知二氏が開発している、GNSSライブラリです。

|    |GUI    |CUI    |
|:---|:---|:---|
|APランチャ |RTKLAUNCH||
|リアルタイム測位 |RTKNAVI | RTKRCV|
|通信サーバ |STRSVR| STR2STR|
|後処理測位 |RTKPOST| RNX2RTKP|
|RINEX変換 |RTKCONV| CONVBIN|
|GNSSデータ・測位解プロット |RTKPLOT||
|GNSSデータダウンローダ |RTKGET||
|NTRIPブラウザ |NTRIPBROWS||



以上。
Project EulerでF#の勉強をしました（Problem1～3編）

## はじめに
初心者プログラマです。
「関数型触ってみよう」だけのモチベーションで少し前からF#で遊んでいます。
とりあえず手元には1～10までやってあるので、そこまで記事にする予定です。

初投稿です。よろしくおねがいします。

## ProjectEuler
数学（数字？）の問題をプログラムで解く課題がたくさん置いてあるところです。これです。↓
https://projecteuler.net/

日本語翻訳版wiki↓
http://odz.sakura.ne.jp/projecteuler/

早速やっていきます。
手元でしか動かしていないので、間違いがあったら指摘を頂けると喜びます。

## Problem 1
> 10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる.
> 同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ.

```Fsharp
let rec sum xs =
    match xs with
    | [] -> 0
    | y::ys -> y + sum ys

let filter pred xs =
    let rec inFilter xs =
        match xs with
        | [] -> []
        | y::ys -> if pred y then y::inFilter ys else inFilter ys
    inFilter xs
    
let Problem1 = [1..999] |> filter (fun x->(x%3 = 0)||(x%5 = 0)) |> sum
```
勉強なので、車輪の再開発はどしどししていきます。
特に言うことはない気がしますが、
再帰で足し算をするやつsumと再帰でlist要素抽出をするやつfilterに[1..999]を突っ込んでいます。

## Problem 2
> フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.
> 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
> 数列の項の値が400万以下の, 偶数値の項の総和を求めよ.

```Fsharp
let returnFibList lim =
    let rec inReturnFibList ns n0 n1 =
        match n1 with
        | _ when n1 < 2 -> inReturnFibList [] 1 2
        | _ when n1 >= lim -> ns
        | _ -> inReturnFibList (ns@[n1]) n1 (n0+n1)
    inReturnFibList [] 1 2

let Problem2 = returnFibList 4000000 |> filter (fun x -> x%2 = 0) |> sum
```
フィボナッチ数列を下から求めましたが、変な事ではないですよね・・・？（不安）
400万まで求めて、またfilter、sumですね。
Cとかばっかりやっていたので、filter関数だけで感動しているフシがあります。

それから、この後も続きますが、勉強した流れからか基本的に継続渡しで再帰を作っています。

## Problem 3
> 13195 の素因数は 5, 7, 13, 29 である.
> 600851475143 の素因数のうち最大のものを求めよ.

```Fsharp
let SieveOfEratosthenes (max:int64) =
    let rtMax = (float >> sqrt >> int64 <| max)
    let rec inSieveOfEratosthenes ps ns =
        match ns with
        | [] -> ps
        | head::body when head > rtMax -> ps@body
        | head::body -> inSieveOfEratosthenes (ps@[head]) (filter (fun x -> (x % head <> 0L)) body) 
    inSieveOfEratosthenes ([]:int64 list) [2L..max]

let findLargestPrimeFactor (target:int64) =
    SieveOfEratosthenes target |> filter (fun (x:int64) -> (target % x = 0L))

let rec max64 (xs:int64 list) =
    match xs with
    | [] -> 0L
    | [y] -> y
    | y::ys ->
        match ys with
        | [z] -> if y > z then max64 [z] else max64 [y]
        | z::zs -> if y > z then max64 (y::zs) else max64 (z::zs)
        | [] -> 0L

let Problem3 = findLargestPrimeFactor 600851475143L |> max64
```
SieveOfEratosthenes(エラトステネスのふるい)で素数リストを作って、
対象(600851475143)を割り切れる値(=素因数)抽出して、
そのリストの最大値を選んでいます。

型まわりの書き方がわかっておらず「とりあえず全部int64にするか・・・」などとしてしまっています。
そのためにmax関数もint64用を再開発。恥ずかしい事をしていたらどうしよう。

最大の難所はlet rtMax = (float >> sqrt >> int64 <| max)のくだりでした。
「floatにしてsqrtかけてint64にするのを合成した関数にmaxを渡す」という理解ですが、
正直なところググり知識が元なので、別の形に応用して使っていけるかがまだ怪しいところです。
パイプラインをmax|>にするとエラーになる理由とかがよくわかってないのでたぶんダメですね・・・。

## おわり
Problem10まで続きます。（投稿したらリンクを貼りに来ます。）→貼りに来ました
[（Problem4～5編）](https://qiita.com/nanoyatsu/items/448f8ad22dc7212ec47f)
[（Problem6～7編）](https://qiita.com/nanoyatsu/items/7823d28eccab995fbadb)
[（Problem8～10編）](https://qiita.com/nanoyatsu/items/89dc542c9c2fb84c8fe7)

ご指導してくださる方がいらっしゃれば、よろしくお願い致します。
React TutorialのTick-Tock-Toeを題材に、ReactでのEvent Handlingを理解する

# まとめ
Reactのチュートリアルを読んでいて、onClickでのイベントハンドリング部分のコードが理解できず、３日間悩んだ。二つのポイントで誤解してハマっていたのでメモ。

# 中々理解できなかった箇所
Square, Board, Gameと３つのコンポーネント間で、ユーザのマウスクリックイベントをどう伝えていくか。 
 具体的には以下のコード。
[React TutorialのCodePenコード](https://codepen.io/gaearon/pen/gWWZgR?editors=0010)

```jsx
// Square Class
<button className="square" onClick={props.onClick}>
  {props.value}
</button>
```

```jsx
// Board Class
<Square
  value={this.props.squares[i]}
  onClick={() => this.props.onClick(i)}
/>
```

```jsx
// Game Class
<Board
  squares={current.squares}
  onClick={i => this.handleClick(i)}
/>
```

# 誤解していたポイント
1. HTMLでの作法と同様に、onClick属性には関数の実行文を与える
2. 以下のアロー関数は、関数を返す関数である  

```javascript
const func = () => console.log("asdf")
```

## 誤解ポイント１
*JSXで指定するonClick属性には、HTMLでの作法と同様に、関数の実行文を与えるべき。*
これが間違っていた。
HTMLでは以下のように関数の実行文をonClick属性に与える。

```html
<button onClick="console.log('hoge')"/>
```

JSXでもこれに習って実行文を与えるものと思っていたが、JSXでは実行文ではなく、関数を与えると内部で実行してくれる模様。下記コードが実例で、`onClick={this.handler}`において関数定義を与えるだけで、関数が実行されてhogeが表示される。

```javascript
class Hoge extends React.Component{
    handler(){
        console.log("hoge");
    }
    render(){
        return(
            <button onClick={this.handler}/>  /* マウスクリックでhogeが表示される */
        );
    }
}
```
このHTMLとJSXの仕様の差に気づかず、React/JSXのコードを読んで、「このコードでいつ誰が関数を実行しているんだろう」と悩んでいたが、React/JSXでは関数定義を与えると内部で実行される模様。


## 誤解ポイント２
ポイント１の誤解に気づいてonClickには関数定義を与えれば良いと分かり、Square Classの`onClick={props.onClick]`は理解できた。 
しかし、Game Classの`onClick={i => this.handleClick(i)}`は関数定義でなく関数の実行をしているように（何故か）誤解して、両者の違いに悩んだ。 
結局は**アロー関数のreturnの省略出来るケース**に気づいて、Game Classでも関数の定義をonClickに渡しているだけだ、とようやく理解できた。

```javascript
//昔ながらの形式
function func(arg){
  return console.log(arg)
}
//アロー関数
const funcAllow = (arg) => console.log(arg)
```

returnという予約語を見慣れていたこと、アロー関数の省略記法に慣れてなかった事が誤解につながったんだと思う。

- 関数の定義：funcA

```javascript
var funcA = function(){
  console.log("asdf");
}
```
- 関数を返す、関数の定義：funcB

```javascript
var funcB = function(){
  return function(){
    console.log("asdf");
  }
}
```

- 実行文を返す、関数の定義：funcC  
【2018/6/21追記】「実行文を返す」でなく「実行結果を返す」の方が一般的で分かりやすい。

```javascript
var funcC = function(){
  return console.log("asdf");
}
```

これらをES6の表記に直してみると、以下のようになる。違いが分かりづらい。

```javascript
const funcA = () => {console.log("asdf")}
const funcB = () => () => console.log("asdf")
const funcC = () => console.log("asdf")
```
Python で配列の一致比較 (list, ndarray)

この記事では、Python の list および numpy の ndarray において、配列を比較した際に全要素が一致しているかどうかを知る方法について記載しています。

# list の場合
- '==' や '!=' を使って比較演算した場合、全要素を見た場合の一致/不一致が返される。
- テストコード等で配列全体の一致を調べる場合は、単純に比較演算すればよい。

```python:ComparisonOfArray.py
test_data = [[1,2,3],[4,5,6]]
test_data1 = [[0,2,3],[4,5,6]]
actual = [[1,2,3],[4,5,6]]

print(test_data == actual)
# [out] >> True

print(test_data1 == actual)
# [out] >> False
```

# ndarray の場合
- '==' や '!=' を使って比較演算した場合、要素ごとの一致/不一致が返される。
- テストコード等で配列全体の一致を調べる場合は、
    - numpy の `.all()` コマンドを使う。
    - python native の `all()` コマンドを使う。

```python:ComparisonOfArray.py
test_data = np.array([1,2,3])
test_data1 = np.array([0,2,3])
actual = np.array([1,2,3])

# element wise comparison
print(test_data == actual)
# [out] >> [True, True, True]
print(test_data1 == actual)
# [out] >> [False, True, True]

# comparison of all the elements
# Using .all() command of the numpy
print((test_data == actual).all())
# [out] >> True
print((test_data1 == actual).all())
# [out] >> False

# Using all() command of the native python
print(all(test_data == actual))
# [out] >> True
print(all(test_data1 == actual))
# [out] >> False
```

# Gist Link
https://gist.github.com/kattoyoshi/6c691033a4951a4607e85fed93841dcf
OSX上のVirtualBoxで動いてるLinuxでSDカードをマウントする

#Oracle VM VirtualBox Extension Pack

USB2.0とかコピペ機能とかetcを提供してくれるExtensionをインストール。

![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/0/181687/48a063be-2a28-6999-c03a-dfa9bc04b80c.png)


#灰色になってて選べない
SDカードリーダをMacに刺すと、こんな感じになる。

例：100均のUSB SDカードリーダ
<img width="445" alt="スクリーンショット 2018-06-22 2.42.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/181687/ccf9b784-1ccc-fb71-ca1e-799eaf0f4952.png">
灰色になってて選べない。

#アンマウントすれば使える

Pi焼きと同じ手順でSDカードを見つける。

```
$ diskutil list

/dev/disk5 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.5 GB    disk5
   1:             Windows_FAT_32 boot                    43.8 MB    disk5s1
   2:                      Linux                         15.5 GB    disk5s2
```

アンマウント

```
$ sudo diskutil umountdisk /dev/disk5
```

選択できる！

<img width="445" alt="スクリーンショット 2018-06-22 2.58.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/181687/a31e722e-8f09-2340-a17f-3749c83aac78.png">

##VirtualBoxのlinux
```
$ sudo fdisk -l
デバイス   起動 Start 最後から   セクタ  Size Id タイプ
/dev/sdb1        8192    93802    85611 41.8M  c W95 FAT32 (LBA)
/dev/sdb2       98304 30318591 30220288 14.4G 83 Linux
$ sudo mount /dev/sdb2 /mnt
$ sudo mount /dev/sdb1 /mnt/boot
```
秀丸で編集中のMarkdown表の縦棒「|」をそろえる為に、スペースを挿入する秀丸マクロ

# 作ったきっかけ
タイトルのままです。
秀丸でMarkdownの表を編集中、「|」をそろえたくなりました。

## 秀丸マクロ用ファイル（***.mac）作成時の注意点
- Shift-JISで保存。

## 制作状況
- 文字列分割のサブルーチンSplit:を拝借させてもらいました。
- 秀丸マクロってクセが強いですね。
- 2018年6月22日現在、なんとか動く程度です。

# 秀丸マクロの本文

``` php5
gofiletop;	//カーソルをファイル先頭に移動
#lcnt=1;		//行番号変数を「1」行目にセット

while (#lcnt<linecount2+1) {
	golineend;		//カーソルを行の最後に移動
	#end_num = x;//その行の半角文字数を取得

	$seltext[#lcnt] = gettext(0,y,#end_num,y);//カーソルのある行の文字列を選択
	call Split $seltext[#lcnt], "|";//選択した行の文字列を「|」で分割する。

	if(#max_width <= ##return){
		#max_width = ##return;
	}

	//message str(#lcnt) + "行目は　"+ str(##return) + "列あり。最大列は" +str(#max_width);

	#i =0;//表の「列」数の初期値
	while ( #i <= ##return) {
		$seltext[#lcnt][#i] = $ReSplit[#i];

		if(#max_strlen[#i] < strlen($ReSplit[#i])){
			#max_strlen[#i] = strlen($ReSplit[#i]);
		}
		#i = #i + 1;
	}
	
	down;//カーソルを次の行に移動（down=下げる）する。
	#lcnt=#lcnt+1;
}

//*****************************************************************

#lcnt=1;		//改めて、行番号変数を「1」行目にセットし直し
while (#lcnt<linecount2+1) {
	#i =0;
	while ( #i <= 15) {
		#j =0;
		$spaces ="";
		while ( #j <= #max_strlen[#i]-strlen($seltext[#lcnt][#i])-1){
			$spaces = $spaces + " ";
			#j = #j + 1;
		}
		$seltext[#lcnt][#i] = $seltext[#lcnt][#i] + $spaces;
		$result_matrix = $result_matrix + $seltext[#lcnt][#i] +"|";

		#i = #i + 1;
	}
	
	$result_matrix = $result_matrix + "\n";
	#lcnt=#lcnt+1;
}
	//message $result_matrix;

	gofileend;	//カーソルをファイルの最後に移動
	insert "\n\n" + "★↓↓↓↓↓出力結果↓↓↓↓↓★\n" + $result_matrix;

endmacro;//以下サブルーチンの為、本文のマクロを終了

//文字列分割のサブルーチン*****************************************************************
Split:
    while ( ##i < strlen($$1) ) {
        if ( midstr($$1, ##i, 1) == $$2 ) {
            ##cnt = ##cnt + 1;
            $ReSplit[##cnt -1] = midstr($$1, ##start, ##i - ##start);
            ##start = ##i + 1;
        }
        ##i = ##i + 1;
    }
    $ReSplit[##cnt] = midstr($$1, ##start);
    return ##cnt;```
```

# 秀丸マクロの適用デモ
Qiitaでは文字幅はそろってないですが、画面上では一応そろってます。

```
もしもしかめよ|かめさんよ
せかいの|うちで
お|まえ|

★↓↓↓↓↓出力結果↓↓↓↓↓★
もしもしかめよ|かめさんよ|||||||||||||||
せかいの      |うちで    |||||||||||||||
お            |まえ      |||||||||||||||
```

## 画面キャプチャー
![image.png](https://qiita-image-store.s3.amazonaws.com/0/157498/babbcbab-5df2-e611-9498-b1468e114a77.png)
Chef test-kitchen の chef_zero provisioner で role や environment を使う設定

#問題
chefdkのchef generate cookbook <my_book>で作ったcookbookからtest-kitchenを行なうと、他のクックブックやrole, environment, data_bagなどはこのcookbook外に位置することになる。

他のクックブックは以下にて使用可能
[Chef + test-kitchenで依存関係を持ったクックブックテスト環境構築](
https://qiita.com/hiroyuki_onodera/items/f6aaf0fbbd8e86960aa8)

##では、role, environmentなどを使うには？

Chef社の公式だけでは分かりにくく、少し手間取ったので備忘

[.kitchen.yml](https://docs.chef.io/config_yml_kitchen.html)  -> Provisioner Settings
[client.rb](https://docs.chef.io/config_rb_client.html)


#記述例
##.kitchen.yml

```yml:.kitchen.yml
...

provisioner:
  name: chef_zero
  always_update_cookbooks: true
  roles_path:        ../../roles         # rolesのpath
  environments_path: ../../environments  # environmentsのpath
  client_rb:
    environment: dev                     # environmentを指定

...

```

- roles_path:, environments_path:, data_bags_path: などをprovisioner:に追記してパスを記載
    - 相対パスの場合、.kitchen.ymlのあるcookbook homeから
    - cookbook home外でも使用可
- client_rb: の下でノードの environment: を指定




##roleやenvironmentはjsonのみ可能 
Ruby DSL表記不可


```json:../../environment/dev.json
{
  "name": "dev",
  "description": "My Chef environment",
  "cookbook_versions": {},
  "json_class": "Chef::Environment",
  "chef_type": "environment",
  "default_attributes": {
  },
  "override_attributes": {
  }
}

```
- JSONでの普通の定義
[Swift] NSCacheをシングルトンにして使う

画像をurlから取得してくる時、すでに取得済みの画像であれば再利用したいなって時があると思います
NSCacheの基本的な使い方は下のように、setObjectでキャッシュして、objectで取得するって感じです

```swift:
let cache = NSCache<AnyObject, AnyObject>()
let data = "data"
let key = "key"
cache.setObject(data as AnyObject, forKey: key as AnyObject)
        
let cachedData = cache.object(forKey: key as AnyObject) as! String
print(cachedData) // data
```

だたこれだと、毎回NSChacheをinitしてるので、キャッシュしても、初期化のたびにキャッシュしたものもリセットされちゃいます

キャッシュのインスタンスは共通のものを使わないといけないです

そんな時使えるのがシングルトンです

>Singleton パターンとは、そのクラスのインスタンスが1つしか生成されないことを保証するデザインパターンのことである。

このシングルトンパターンを使うことで、インスタンスが1つしか生成されないことが保証されるので、
どこで使っても同じインスタンスを扱うことができます


なので実際にNSCacheのシングルトンを作ってみましょう

コードは下のようになります。

```swift:cache.swift
final class Cache: NSCache<AnyObject, AnyObject> {
    static let sharedInstance = Cache()
    private override func init() {
       // 特に何もする必要なし
    }
}
```

これだけでNSCacheのシングルトンを表現することができます
ポイントは
1. finalにすること
2. initをprivateにすること

1をすることで、このクラスが継承され、initとかがoverrideされて、インスタンス化されることを防ぐことができます
2をすることで、下のように初期化すると、その時点でエラーになります
なので、万が一誰かがどこかで上のようにしてインスタンス化することを防ぐことができます

```swift:
let cache = Cache() // initがprivateなので外部からはアクセスできない
```



よって、このクラスのsharedInstanceという名前のプロパティは、どこで呼んでも同じインスタンスになっていることになります
(シングルトンの名前はsharedInstanceになることが多い)

これでどこでキャッシュしても、その値をどこでも取得することができるようになりました
NSCacheを継承してるので使い方は同じです

```swift:
let url = "https://pbs.twimg.com/profile_images/991480698824409088/6j69FNqy.jpg"
if let data = Cache.sharedInstance.object(forKey: url as AnyObject) {
    // すでにキャッシュされてる
    self.imageView.image = UIImage(data: data as! Data)
} else {
    // まだキャッシュされてない
    let downloadTask = URLSession.shared.dataTask(with: URL(string: tweet.user.profileImageURL)!) { [weak self] data, _, error in 
        if let error = error {
            print(error)
            return
        }

        Cache.sharedInstance.setObject(data as AnyObject, forKey: url as AnyObject)

        DispatchQueue.main.async {
            self?.imageView.image = UIImage(data: data!)
        }
    }
    downloadTask.resume()
}

```
技術は陳腐化しないうちに売りきろう

ある時期ある企業で、第一線に達した技術があった。
他社の競合製品よりも良好な性能を出しているらしかった。
論文ベースで見る性能はそのようだった。
その技術を実装したリファレンスボードを購入して評価したいと思った。
担当の営業さんとコンタクトをとって説明を受けて、見積りをとった。

しかし、そのリファレンスボードを評価することはなかった。
リファレンスボードを購入するには数セット単位で購入する必要があった。
そうすると金額が１００万円程度になってしまう。
そのため、購入を断念してしまった。

サラリーマン開発者が、自分の裁量でどうにかできる金額ではない。
既存のボードを置き換えることができるのかどうか、未知のボードを「うまくいきます」と言って購入・評価を推進しきる勇気はなかった。

そのボードを使い切るには、入手できる公開情報があまりにも少なかった。

- NDAにがんじがらめなのか、そのボードを利用して何かを実行した情報は入手できなかった。
- 使いたい機能がハードウェアブロックとして実装されている。その機能の使い方のサンプルコードなどもなかった。
- CPUは、よくあるCPUとはかなり異なるものであるらしかった。
- また、OSもよくあるタイプとは違っていた。

それらの理由のため、サラリーマン開発者は、その製品を利用する可能性を断念した。

それから数年後、世界的な技術の進展は、その技術を陳腐化させてしまった。

### 私見：

- 技術には賞味期限がある。技術の優位性があるうちに売り切ることが必要だ。
- 技術はユーザーコミュニティがあってこそ技術である。ユーザーコミュニティを作ることに失敗すれば、どんな優秀な技術であっても、普及しないままになってしまう。
- 営業とコンタクトをとって見積りをとって、高価なボードを購入して、評価してみて、これを次の製品に使えるかどうか判断して、製品設計に主要な部品として選定させるのは、とても大変なことなのです。
- 評価版を無料で利用できるようにしよう。開発に関わる情報を利用しやすくしよう。
- 評価ボードが必要な場合には、価格を抑えて、提供しよう。開発者が評価・開発に着手しやすくすることが、量産に使いうる可能性を高めるのです。


---

次の記事のアプローチでは、技術を積極的に公開することによって、利用者のコミュニティを作ろうとする動きの一例になっています。

[低コストFPGAで深層学習、コア技術をオープンソース化したベンチャーの狙い (1/2)](http://monoist.atmarkit.co.jp/mn/articles/1810/19/news053.html)
Google Apps Script（GAS）のプロジェクト内に複数のスクリプトファイルがある場合の実行順序

Google Apps Scriptでは、1つのプロジェクト内に複数のスクリプトファイルを配置することができます。
その際問題となるのが、各ファイルの実行順序です。
実行順序によっては、未定義の変数を参照したり、定義済みの変数を再宣言したりしてしまう恐れがあります。
そこで、実際に複数のスクリプトファイルを配置したプロジェクトを作成し、実行順序がどうなるのか検証してみました。

## 検証方法
以下のスクリプトファイルを同一プロジェクト内に配置し、`main2.gs`の`exec`関数を実行しました。

```js:main1.gs
var COMMON_VALUE = 1
var MAIN_1_VALUE = 'defined'

Logger.log('main1: COMMON_VALUE=' + COMMON_VALUE)
Logger.log('main1: MAIN_1_VALUE=' + MAIN_1_VALUE)
Logger.log('main1: MAIN_2_VALUE=' + MAIN_2_VALUE)
Logger.log('main1: MAIN_3_VALUE=' + MAIN_3_VALUE)
```

```js:main2.gs
var COMMON_VALUE = 2
var MAIN_2_VALUE = 'defined'

Logger.log('main2: COMMON_VALUE=' + COMMON_VALUE)
Logger.log('main2: MAIN_1_VALUE=' + MAIN_1_VALUE)
Logger.log('main2: MAIN_2_VALUE=' + MAIN_2_VALUE)
Logger.log('main2: MAIN_3_VALUE=' + MAIN_3_VALUE)

function exec () {
  Logger.log('main2#exec: COMMON_VALUE=' + COMMON_VALUE)
}
```

```js:main3.gs
var COMMON_VALUE = 3
var MAIN_3_VALUE = 'defined'

Logger.log('main3: COMMON_VALUE=' + COMMON_VALUE)
Logger.log('main3: MAIN_1_VALUE=' + MAIN_1_VALUE)
Logger.log('main3: MAIN_2_VALUE=' + MAIN_2_VALUE)
Logger.log('main3: MAIN_3_VALUE=' + MAIN_3_VALUE)
```

すべてのファイルで同じ名前の変数`COMMON_VALUE`をそれぞれ異なる値で定義し、各ファイル固有の変数も定義しています。

## 検証結果
`main2.gs`の`exec`関数を実行したところ、ログは以下のようになりました。

```
main1: COMMON_VALUE=1
main1: MAIN_1_VALUE=defined
main1: MAIN_2_VALUE=undefined 
main1: MAIN_3_VALUE=undefined
main2: COMMON_VALUE=2
main2: MAIN_1_VALUE=defined
main2: MAIN_2_VALUE=defined
main2: MAIN_3_VALUE=undefined
main3: COMMON_VALUE=3
main3: MAIN_1_VALUE=defined
main3: MAIN_2_VALUE=defined
main3: MAIN_3_VALUE=defined
main2#exec: COMMON_VALUE=3
```

ログを見ると、以下のような順序で処理が行なわれていることが分かります。

1. `main1.gs`のトップレベルの処理
2. `main2.gs`のトップレベルの処理
3. `main3.gs`のトップレベルの処理
4. `main2.gs`の`exec`関数内の処理

すなわち、すべてのファイルのトップレベルの処理がファイル名順に実行された後、指定した関数の処理が実行されています。

## まとめ
おそらく、サーバー側ではファイル名順にすべてのスクリプトファイルを結合してから、指定した関数を実行しているものと思われます。
とはいえ順序の保証があるわけではないので、予期せぬ挙動を防ぐためにも、実行順序に依存しないコードを書いたほうがよさそうです。
SwiftでKVO(Key-Value Observing)

KVOは(Key-Value Observing)変数の値の変化を監視する仕組みです。
Swiftでは使ったことがなかったので試してみました。

ViewControllerにボタンを配置して、ボタンを押した時に変数の値を変えるテストプログラムを作成し動作確認します。


ViewControllerで監視するクラスを作成し、このインスタンス変数を監視します。

```swift:Hoge.swift
import Foundation

class Hoge : NSObject {
	@objc dynamic var count: Int = 0
}
```


```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {

	var hoge: Hoge = Hoge()

	override func viewDidLoad() {
		super.viewDidLoad()
		
		// countを監視対象にする
		hoge.addObserver(self, forKeyPath: "count", options: [.old, .new], context: nil)
		
		hoge.count = 10
		hoge.count = 11
	}

	override func didReceiveMemoryWarning() {
		super.didReceiveMemoryWarning()
	}

	deinit {
		// countを監視対象から削除
		hoge.removeObserver(self, forKeyPath: "cout")
	}
	
	@IBAction func tapCountBugtton(sender: Any){
		print("----- tapCountBugtton")
		hoge.count += 1
		print("hoge.count : \(hoge.count)")
	}

	override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
		print("----- observeValue")
		print("object : \(String(describing: object))")
		print("keyPath : \(String(describing: keyPath))")
		print("change : \(String(describing: change))")
	}
}
```

ボタンをタップするとtapCountBugttonが実行されてhoge.countをインクリメントします。

###　出力結果

viewDidLoadでhoge.countに10を代入し、そのあとに11を代入しているのでobserveValueが２回呼ばれまています。
addObserverのoptionsで.oldと.newを指定しているのでchangeに新しい値と古い値が入っています。

```:コンソール出力
----- observeValue
object : Optional(<KvoTest.Hoge: 0x600000016bc0>)
keyPath : Optional("count")
change : Optional([__C.NSKeyValueChangeKey(_rawValue: new): 10, __C.NSKeyValueChangeKey(_rawValue: kind): 1, __C.NSKeyValueChangeKey(_rawValue: old): 0])
----- observeValue
object : Optional(<KvoTest.Hoge: 0x600000016bc0>)
keyPath : Optional("count")
change : Optional([__C.NSKeyValueChangeKey(_rawValue: new): 11, __C.NSKeyValueChangeKey(_rawValue: kind): 1, __C.NSKeyValueChangeKey(_rawValue: old): 10])
```

ボタンをタップするとtapCountBugttonが実行され、hoge.countをインクリメントしています。
hoge.countの値が変わるのでobserveValueが呼ばれます。

```:コンソール出力
----- tapCountBugtton
----- observeValue
object : Optional(<KvoTest.Hoge: 0x600000016bc0>)
keyPath : Optional("count")
change : Optional([__C.NSKeyValueChangeKey(_rawValue: new): 12, __C.NSKeyValueChangeKey(_rawValue: kind): 1, __C.NSKeyValueChangeKey(_rawValue: old): 11])
hoge.count : 12
```

Objective-Cの時代からあったKVOなので簡単に動くと思ったのですが、
ちょっとハマってしまいました。
最初、Hogeクラスのcountを下記のように定義していました。
これではKVOはうまく動きませんでした。

```swift
	var count: Int = 0
```

下記のようにobjc dynamicを指定すると正常に動作します。

```swift
	@objc dynamic var count: Int = 0
```

監視対象の変数にはdynamicの指定が必要なようです。
Swift4からobjcの指定が必要になったようです。
dhclientがntpdをrestart

# ■ 事象

DHCP クライアントプログラムである dhclient は、DHCP サーバーから NTP サーバーのリストを受信すると、これに ntp.conf を追加して、ntpdをrestartする。

この機能を無効にするには、PEERNTP=no を /etc/sysconfig/network に追加する必要がある。

# ■ まとめ

ntpdがrestartされていた場合、dchpを疑うべし。


http://microgroove.jp/shaolin/2007/02/dhclient_overwrites_etcntpconf.html

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/s1-understanding_the_ntpd_configuration_file

https://cloudpack.media/373
ServerSpec参考サイト

# ServerSpec参考サイト

* [ServerSpec入門スライド](https://www.slideshare.net/TatsunoriSaito1/itamaeserverspec)

* [AnsibleとServerSpecの成功・失敗例](https://www.ospn.jp/osc2017-nagoya/pdf/OSC2017_Nagoya_tis.pdf)

* [ITインフラ自動化スライド](https://www.obci.jp/wp-content/uploads/2016/09/160901_OSC.Enterprise_TIS.pdf)

* [ServerSpecの例](http://www.atmarkit.co.jp/ait/articles/1608/02/news104.html)


* [chefとAnsibleの違い](https://www.ossnews.jp/compare/Ansible/Chef)
* https://dev.classmethod.jp/server-side/ansible/testing/
* [AnsibleとServerSpecの使い方](https://sekai-it.com/archives/4963)
ntpdのポーリング間隔

## ntpdのポーリング間隔

ntpdで時刻同期(上位NTPサーバへの問い合わせ)をポーリング間隔という。

時刻同期の間隔は、デフォルトは64秒で、
ネットワークへの負荷を減少させるため、128秒、256秒、512秒、と徐々倍加して、最大で1024秒まで増加する。

http://adventure-diary.hateblo.jp/entry/2013/12/31/161027
https://superuser.com/questions/1129742/can-i-change-the-polling-frequency-of-a-running-ntpd

倍加されるタイミングは、下記のサイトに記載されており、
通信が安定している場合と、切断している場合で、
変わってくるようだが、いまいちわかない。

https://www.eecis.udel.edu/~mills/ntp/html/assoc.html#poll
https://www.eecis.udel.edu/~mills/ntp/html/poll.html

---

## etc

* オフセット : 基準値からのずれ
* クロックジッタ : 信号の遷移タイミングの理想値からの時間的なズレの度合い
anaconda環境へのGDALのインストールでハマった時のメモ

### この記事について

シェープファイルをpythonで扱う必要があり、手元のanaconda環境にGDALを入れる際にdependency周りでハマり、その後なんとか解決したので、その際のメモ。


### GDAL
gdalを入れるとき、[たまたまググって上位に引っかかった記事](https://qiita.com/shima_x/items/fe29274d67de3a461524)を見ると、

```
brew install gdal
pip install GDAL={インストールしたgdalのversion}
pip install pyshp
```

で大丈夫らしいけど、anaconda環境ではそれは再現しない(2018年6月現在、brewでインストールされるgdalとpipでインストールされるgdalに互換性がなく、いろいろdependency問題が起こる)。
のでさらに、

```
conda install libtiff
conda install libcurl
conda install krb5
```
を実行して、dependencyを解消してあげる必要がある。
( `python -c "import gdal"` をコマンドラインで実行してみると、どのパッケージに問題が起こっているかわかる。なので、エラーを起こしているパッケージを順番通りインストールしていく形)。
zshで補完が効かないときの対処法

## この記事について

zshを意気揚々と導入し、便利そうな`.zshrc`ファイルを拾ってきてみたけど、全く補完が効かない上に、 `function definition file not found` みたいなメッセージが出て困る時の対処法。OSはMac OSを想定。
なお、zsh自体の導入方法は割愛。

### キャッシュファイルを消してみる

zshが生成するキャッシュファイルを消して、シェルを再起動する。

```
$ rm ~/.zcompdump
$ exec $SHELL
```

### fpathの設定を確認する

他のところから拾って来た`.zshrc`をそのまま利用している時にありがち。
`.zshrc`に下記の一行を追加し、上記の方法でシェルを再起動しましょう。

```
fpath=(/usr/local/share/zsh-completions ${fpath})
```
RaspberryPiを使ってチャイム（呼び鈴）を作る

# はじめに

* 事務所にチャイムがなく、100均のベルが置かれていた
* IT企業っぽく、かつ、手作り感がある素敵なチャイムが欲しかった
* RaspberryPiが好きなので、なんとかしようと考えた結果

---
# システム構成
---
![speaker01_21.png](https://qiita-image-store.s3.amazonaws.com/0/59636/15771214-c94f-9935-c5db-fe10ed46cfc9.png)

---
## 用意するもの

---
RaspberryPi × 2個

　⇒　RaspberryPi2B+ と RaspberryPi Zero WH
![download.jpg](https://qiita-image-store.s3.amazonaws.com/0/59636/4703710a-c13b-2d3f-c079-86f80c9dec41.jpeg)![download.jpg](https://qiita-image-store.s3.amazonaws.com/0/59636/6fb615e0-50d1-06b1-3a99-deab5bb57fcd.jpeg)
　
LANに入れればどの機種でもOK

---
チャイム用スイッチ × 1個
　⇒　[EG121P](https://www2.panasonic.biz/scvb/a2A/opnItemDetail?use_obligation=&item_cd=EG121P&item_no=EG121P&catalog_view_flg=1&contents_view_flg=1&close_flg=1&b_cd=301&hinban_kbn=1&s_hinban_key=EG121P&vcata_flg=1"EG121P")


---
スピーカー　× 1組
　⇒　ステレオジャックで接続するやつ

---
# 受付側ラズパイの設定(ハード)

---
RaspberryPiのGPIOとチャイムスイッチを配線
　
![Raspberry-Pi-GPIO-Layout-Model-B-Plus-rotated-2700x900.png](https://qiita-image-store.s3.amazonaws.com/0/59636/b2c7733d-207c-fd57-2f5b-a4827a5c3722.png)

---
* 配線に使う線はジャンパワイヤーが便利
* ただし、チャイムスイッチに挟むときに細すぎる気がするのでなにかしら工夫が必要

---
# 受付側ラズパイの設定(ソフト)

---
```shell-session:console
mkdir chime
touch chime.py
vi chime.py
```
---

```python:chime.py
#!/usr/bin/python
# coding:utf-8
import time
import RPi.GPIO as GPIO
import commands

GPIO.setmode(GPIO.BCM)

GPIO.setup(15,GPIO.IN,pull_up_down=GPIO.PUD_UP)

sw_status = 1

while True:
    sw_status = GPIO.input(15)
    if sw_status == 0:
        commands.getoutput('curl http://192.168.xx.xxx:8080/chime')
    time.sleep(0.03)

GPIO.cleanup()
```

---
```shell-session:console
python chime.py
```

---
* chime.pyの内容は[こちら](http://jellyware.jp/kurage/raspi/shutdown_button.html"こちら")の記事ほとんどそのまま
* スイッチが押されたらcurlで事務所側ラズパイが待っているアドレスにGET
* 本来はcurlじゃなくてrequests等でやるべき

---
# 事務所側ラズパイの設定(ハード)

---
* スピーカーを繋げる
* 音がでるようにする

---
# 事務所側ラズパイの設定(ソフト)

---
* チャイム音源を用意する
* チャイム音源を鳴らせるようにしておく

---
```shell-session:console
pip install Flask
mkdir chime
touch chime.py
vi chime.py
```

---
```python:chimeHost.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import commands
from flask import Flask
app = Flask(__name__)

@app.route("/chime")
def chime():
    commands.getoutput("sh /home/pi/voice/say.sh 'お客様がおみえです'")
    return 'OK'

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=8080)
```

---
```shell-session:console
python chimeHost.py
```

---
* say.shは引数の日本語をしゃべってくれるバッチ(詳細は[こちら](https://www.moyashi-koubou.com/blog/raspi_slack_for_children/"こちら"))
* ラズパイを移動したときなどのために、crontab等で自動起動設定をしておくと便利

---
# 所感

---
* もっと素敵でおしゃれなスイッチがほしい
* Flaskが便利、こんなに簡単にWebサーバ作れるなんてびっくりした
* もっと便利でIT風なおしゃれ機能をつけたい
Simulatorを使ってiOS版SafariのWebページの挙動をデバッグする

モバイル向けのWebページにおいて、特定のOSバージョンでJSがうまく挙動しないなどのバグに遭遇することがある。

たまたま同じバージョンの端末が手元にあればすぐにデバッグできるが、往々にして手元にはないので、その際にXcode付属のシミュレータでデバッグをするための手順メモ

## 環境（Mac側）
Xcode(Version 9.2)
Safari(バージョン11.1.1)

## やり方

### 1. MacにXcodeをインストール

AppStoreからダウンロードしてくる、方法は割愛。

### 2. Simulatorを立ち上げる。

Xcodeを立ち上げてSimulatorを立ち上げる方法もあるのですが、Bash実行のほうがスマートなのでこちらを紹介。

```bash
$ open /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app
```


### 3. 任意のバージョンのiOSをDLする

検証したいバージョンのOSを以下の手順でいれる

`Hardware` → `Device` → `Managed Device`　を選択、Xcodeが部分的に立ち上げる
<img width="446" alt="スクリーンショット 2018-06-21 15.47.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/15902/ab7650ca-b43d-36eb-0613-e31fef2034d7.png">

デバイス設定の画面がでるので、`Simulators` を選択
<img width="546" alt="スクリーンショット 2018-06-22 0.04.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/15902/67a8f2f5-93bd-4104-c878-8f05a009adc0.png">

左下に「＋」の追加ボタンがあるので押す
<img width="259" alt="スクリーンショット 2018-06-22 0.04.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/15902/d51f82c2-0a4d-28e8-8ace-52520d1da1f3.png">

`OSVersion`のプルダウンを選択して `Download more simulator runtimes` を選択
<img width="393" alt="スクリーンショット 2018-06-22 0.04.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/15902/c2d941a4-7280-b4b2-574e-820ac23beb7c.png">

ダウンロードしたい端末にチェックを入れてダウンロードする、時間がかかるので待つ
<img width="778" alt="スクリーンショット 2018-06-22 0.04.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/15902/4dc64fb7-cfff-d9bf-4b6c-0779ef2fef3f.png">





### 4. 任意のiOS端末を立ち上げる

ダウンロードが完了したら立ち上げたいOSと端末種別を選択する

<img width="637" alt="スクリーンショット 2018-06-22 0.04.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/15902/19dec28d-0207-d082-efae-38fc73f0ef39.png">


### 5. デバッグしたいページをSimulator内のSafariで開く

単純にSafariをタップしてURLを開く。

なおMacのキーボードと連動したい場合は
`Hardware` → `Keyboard` → `Connect Hardware Keyboard`を選択すること


<img width="606" alt="スクリーンショット 2018-06-22 0.17.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/15902/d2f48c8f-a88d-1a08-b508-622c67f6de34.png">


### 6. PC側のSafariを立ち上げて、開発を有効に

Safariの「環境設定」を選択、詳細の `メニューバーに'開発'メニューを表示` にチェックボックスを入れる

<img width="536" alt="スクリーンショット 2018-06-22 0.09.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/15902/0ebd5989-ec98-4df5-1796-dd688aca1e2d.png">




### 7. 開発タブからSimulatorを選択

Safariの開発タブからさきほど立ち上げたSimulatorを選択
<img width="744" alt="スクリーンショット 2018-06-22 0.14.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/15902/080ad963-e523-0938-3c24-db40f2d23e90.png">

そうするとWebインスペクタが立ち上がり、デバッグ可能になる

<img width="1232" alt="スクリーンショット 2018-06-22 0.15.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/15902/a9a94d7c-3ebe-4fea-8bc5-024d97732317.png">


## 参考リンク

* [ターミナルからiOSシミュレータを開く \- Qiita](https://qiita.com/nakajmg/items/b9927bb1237ac44bc186)
* [iOSのSafariのWebインスペクタを使ってみる ｜ Tips Note by TAM](https://www.tam-tam.co.jp/tipsnote/html_css/post12114.html)
Web3.js でEthereum の残高を取得

`web3.eth.getBalance` を使用します。

# サンプルコード
```js
web3.eth.getBalance(walletAddress, (error, balance) => {
  console.log(balance);
);
```

ここで取得できる balance の単位は wei なので、ether 単位で表示したい場合は、次のようにします。
`var ethBalance = web3.fromWei(balance, 'ether');`

# デモ
* https://piyolab.github.io/playground/ethereum/getBalance/

# 参考
* https://scrapbox.io/web3-jp/web3.eth.getBalance

# Note
- Ethereum 関連の情報は https://scrapbox.io/sushiether/ に集約することにしました。
- この記事の内容に変更・更新がある場合は、以下の URL を更新します。
- https://scrapbox.io/sushiether/Web3.js_でEthereum_の残高を取得
apt-getでパッケージをダウングレードする方法

すでにインストール済みのパッケージについて、何かの都合でバージョンをダウングレードするときは
/etc/apt/preferencesにパッケージの優先度を変更する記述を記載すること。

例えば、openjdk-8-*というパッケージは現状ubuntu16.04では最新8u171だが
これを8u77-b03-3ububtu3にダウングレードするには

   Package: openjdk-8-*
   Pin: version 8u77-b03-3ubuntu3
   Pin-Priority: 1000

と書いておいて、通常通りapt-get updateとapt-get upgradeを実行する。
すると、aptがその名のadvancedにふさわしい高度な振る舞いで、依存関係を考慮して
ダウングレードしてくれる。  1000は古くてもインストールする優先度の指定。
apt-get install <パッケージ名>=<バージョン>でバージョン指定でインストールする方法があるが、  
この方法では依存関係のパッケージが複数あって、バージョンがunmetでインストールできない。  
それら関係するパッケージを複数同時にコマンドラインに並べても、その方法ではうまくいかない。  

snapshot.debian.orgが過去のスナップショットのホスティングサービスしているが、
パッケージをダウングレードをする場合は、パッケージの優先度を変更する必要がある。
残念ながら、snapshot.debian.orgのサイトの説明は、sources.listの記載例が載っているが、
優先度をいじることまでは書かれていない。実際やってみると、古いパッケージは無視される。
このことは、Debian管理者ハンドブックをじっくり読むと、aptの優先度の説明の項に丁寧に説明されている。

ちなみにDebian 管理者ハンドブックは、PDF,ePub,mobi何ちゃらの3つの電子フォーマットで入手できる。
しかも日本語もあり無料でダウンロードできる。iPadはePubの方が読みやすい。とってもセンスのいい人達。
すかさず、際少額ですがdonateさせていただきました。
Debianって、カップルの二人の名前をミックスしたものだったのですね。女の人がDeb*で男がIan.

以上
JavaScript学習記録1　2018年6月21日分

・開始時点
CとJavaは大学の講義でやった文系。ほぼ頭には残ってないわ

就職がどうやらITに向かいそうな気配なので学習開始。
大学4年生の6月にこれは、控えめに言って遅い、が遅すぎるということはない。
最悪プー太郎という手もあるのだから。

始めるにあたって
『プログラマーになりたいと思った人がやるべき７つのこと』
<https://axia.co.jp/2018-03-16>
を参照した。
『ログイン機能、画像投稿機能、データダウンロード機能が備わった掲示板』（上記ブログより）ができるとちょっといい感じらしい。そこまでの実装を目指して学習する。

使用図書
『ここからはじめるJavaScript入門』（井上久夫　2002年1月25日発行）
大学の図書館にあったのを掴んできた。少々古いがいいんじゃないかな。

使用PCなど
MacBook Air　
Eclipse 4.7.3

やったこと
ひとまず勢いで90Pほど進めた。
文字の表示、色変更、HTMLタグの基本、イベントハンドラの基本といったところだ。
これはまだ簡単の簡単のちょろーんなのだろう、すんなり進んだ。
もちろんしっかり打ち込んで実行している。
ところで、使っている本が古すぎるためか、ちょいちょいメソッドが時代遅れらしい。
document.writeとかダメなんですか？　そっかー。
ひとまず本は通してやってみようと思う。その後直せばいいっしょ
なんとか今年中に就職したいので頑張る。ていうか誰か雇ってください
Djangoでファイルアップロード

Djangoでアプリケーションを作ってた時困った話。
Formを使ってファイルをアップロードしたいのにできなった。

修正前

```python:views.py:
def InfoView(request):
    form= Form(request.POST or None)
    if form.is_valid():
        form.save()
        return redirect("/complete")
    return render(request, 'form.html', {'form': form} )
```


ファイルを選択してアップロードしてもファイルだけがアップロードされない。（他のテキストなどはDBに保存される）
しらべたらFormの引数に
`request.FILES`
が必要だったらしい。

修正後

```python:views.py:
def InfoView(request):
    form= Form(request.POST or None, request.FILES)
    if form.is_valid():
        form.save()
        return redirect("/complete")
    return render(request, 'form.html', {'form': form} )
```

ファイルも一緒に保存されるようになった。
fragment遷移時、画面が重なり前のページが機能してしまう場合の対処法

#参考にしたサイト
YAMの雑記帳様
http://y-anz-m.blogspot.com/2013/05/support-package-fragment.html

#対処法

一度frameLayoutのみのxmlをsetContentViewでセットしてそこを基準にfragment遷移していく。

[main_fragment.xml]

~~~
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />



</LinearLayout>

~~~

[MainActivity.java]//oncreate内

~~~

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_fragment);

        CalendarFragment calendarFragment = new CalendarFragment();
        //FragmentManagerをセット
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager
                .beginTransaction();
        transaction.addToBackStack(null);

        transaction.replace(R.id.container, calendarFragment);
        transaction.commit();
}

~~~

これで透過や重なりを防げる。