OmniAICreator/Qiita-1.07M huggingface dataset:
kaggleのkernelでオフラインジャッジ付き教材を作った

# 概要
kaggleのkernelやdatasetの機能を用いて、AtCoderのようなオンラインジャッジもどきを含む教材のようなものを作ってみました→[AIMS_binary_search_ja](https://www.kaggle.com/nadare/aims-binary-search-ja)
kernelの仕様と私の力不足で完璧なものを作ることはできませんでしたが、練習用として用いるならばおおよそ使えそうなものはできたと思うのでforkして遊んでみてください。ここから下では作った感想などを書いていきます。

# 作ったモチベーション
courseraの授業にはjupyter hubを用いたNotebook形式の課題が出ることがあります。[Andrew先生の授業](https://www.coursera.org/specializations/deep-learning)の深層学習モデルを実装する課題では細かなテストケースがついていて、デバッグの手間を減らしながら実装できたので感動しました。
これと同様のものをkaggleのkernelを使って作ることで、勉強会の資料を受講者に環境構築を強いることなく手を動かして学べる教材が作れると思ったので、私の所属する学生団体の[AIMS](https://twitter.com/ou_aims)の勉強会用にそれっぽい資料を作ってみました。


# 中身の解説
## コードのインポート
教材でnotebook上に出したくないコード等は、pythonファイルにしてdataset内に入れました。pythonでは実行ファイル上の階層にあるファイルのimportはsys.pathにモジュールのあるパスを追加することでインポートできるようになります。※参考: https://chaika.hatenablog.com/entry/2018/08/24/090000

## ビジュアライザの作成
二分探索は可視化しやすいアルゴリズムだったので、ipywidgetsのinteractを用いて動かしながら雰囲気を掴んでもらえるようなのを作りました。一回一回figureを書き直しているので動きは重めですが、参加者には好評でした。

## ジャッジ部分の作成
初めは文字列を適当なファイルで実行した後、[subprocess.POPEN](https://docs.python.jp/3/library/subprocess.html#popen-objects)を用いて実行する予定だったのですが、subprocessからpython.exeを呼び出せなかったので断念しました。代わりに、組み込み関数の[exec](https://docs.python.jp/3/library/functions.html#exec)を用いて文字列を実行しようとしたのですが、そのままだとglobal変数が呼び出したいコードに混じってしまい、かといってexecの変数のglobalsとlocalsに空の辞書を与えると変数の定義が上手くいかなくなってしまいました。今回はmain関数を定義しその中に提出されたscriptを埋め込むことでそれっぽく見せましたが、あまりよくない方法なので他に方法があれば探したいです。

## テストケースの作成
問題ごとに乱数を用いてテストケースを作り、入力用のファイルと模範解答のファイルを用意しました。zipファイルにまとめて入れて、kaggleのdatasetの中に加えました。

# 参加者から頂いた意見
> 文字列にそのままコーディングしようとしてバグらせてしまった。

コーディング用のテストケースをつけておき、動いたらテストケースでチェックするといった導線を貼った方が良かったかもしれません。

> notebookはそれぞれのセルがjson形式みたいに保存されているので、そこからコードを読み取って提出できないか

これは面白そうなアイデアでした。提出用のセルの上部にコメントをつけておき、ジャッジ時に識別用のコメントの書いてあるセルを探し実行という形にすれば、参加者の負荷が減りそうな気がします。(実行中のnotebookを読み取ることができるのかは分かりませんが)

> 練習問題の難易度が高い

二分探索は典型だし、丁寧に誘導しているからやるだけレベルになっていると勘違いしていました。

# まとめ(感想)
それっぽいものは作れましたが、まだまだ改善の余地が大きいです。今後は先人達の優れたkernelを読み、ブログ感覚でこまめにkernelを書いて精進しながらkernelのメダルも狙っていきたいです。
Docker の生まれた年

# Docker の生まれた年

今日が自分の誕生日らしいので、ちょっと Docker の誕生日っていつなのかなとみてみました。

## いつ？

2013年の PyCon でデモされたのが最初って書いてありますね。

[出典](https://blog.docker.com/2014/03/happy-birthday-docker/)

その後、[Hacker News](https://news.ycombinator.com/item?id=5408002) にリークされて、数日後にオープンソース化されたようです。

まだ、5年くらいしか経ってないんですね。もっと前からあるのかなと思ってましたが。

## ぐぐってみる

docker とぐぐってみると `約 53,800,000 件 （0.28 秒）` て出ますね。
5000万件ていうと、多いのか少ないのかわからないですが、結構多い方でしょうか。

ニュースだけにしてみると、`約 275,000 件 （0.24 秒）`　て出ます。
ニュースで 27万件は比較的多いような気がします。
普通の人が 27万件もニュースにされてたらかなり有名人ですね。
ちなみにニュースで `ビルゲイツ` は `約 2,820 件 （0.20 秒）` でした。。。

## Google は 20億個のコンテナを使ってる

[すでにGoogleは全部のソフトウェアをコンテナに乗せており、毎週20億個ものコンテナを起動している](https://www.publickey1.jp/blog/14/google20.html)

Googleさんの規模が大きいのは知ってましたが、20億個ってすごい数ですよね。
これ、2014年の記事なので、今だと全世界の人口より多い個数のコンテナを動かしてる可能性もありますよね。
1人1個のコンテナとか言われても不思議じゃないです。

そんな自分でさえ、今週少なくとも数十個のコンテナを上げ下げしてたわけですし。。。

## まとまらない・・・

適当に書き始めたのでまとまりません。
眠くなってきたので、短いですがここらで終わります。
docker も色々派生技術が出てきて世界が広がってるので、今後も楽しみです。
自分も、置いてかれないように頑張っていきたいものです。
Unityシーン切り替えとファイル読み込み高速化手法その２

# AssetBundle
AssetBundle自体の説明は他のサイトでも多く文献があるので割愛する
ここではAssetBundleのファイルの格納についての話をする

AssetBundleは複数のファイルを格納し、無圧縮、LZMA、LZ4の3種類の圧縮フォーマットを使えるものである。
AssetBundleのファイルの格納は2タイプに分かれる(とあえて考える)

- 1つのAssetBundleに1ファイル格納
- 1つのAssetBundleに複数ファイル格納

## 1ファイル格納
更新頻度が高い種類のものはこちらに該当する
例えばADVの背景画像は、運用するアプリであれば更新が多く発生するため、複数ファイルでまとめてしまった場合、ユーザーのDL負荷が高くなってしまう

圧縮はLZMAまたはLZ4を推奨する

## 複数ファイル格納
更新頻度が低くてまとめたいものはこちらに該当する
圧縮はLZ4を推奨する（LZMAは絶対ダメ）

## AssetBundle生成時のオプション
AssetBundleを作る時のオプションに何も指定しないとLZMAとなる
BuildAssetBundleOptions.ChunkBasedCompressionを指定するとLZ4となる
BuildAssetBundleOptions.UncompressedAssetBundleを指定すると無圧縮となる

# AssetBundleGraphTool
AssetBundleの生成は個人的にはAssetBundleGraphToolを推奨する
https://bitbucket.org/Unity-Technologies/assetbundlegraphtool

使い方は後日書く（予定）

# 開発中のファイルアクセス
Resourcesはエディタ、実機で共通の使い方だから問題ないが、AssetBundleはリソースを更新するたびにAssetBundle化するのは効率が悪い。
開発中はファイルを置いたところから直接読み込み、実機ではコードを一切変更しないでAssetBundleから読み込むようにしたい。
そこでResources、AssetBundle、開発時のディレクトリどこであっても汎用的に使える汎用Loaderを用意して、ゲーム内ではアクセス方法を気にしないようにする。

## サンプル
### Github
C#7の機能を使っているので、Unity2018.3以降でないとエラーになります。
https://github.com/artisan-sawasaka/AssetLoader

### ファイル構成
![sample.png](https://qiita-image-store.s3.amazonaws.com/0/64194/7c730358-eb39-3ef6-d6d4-06d4a1ea9814.png)

AssetBundleDownloadフォルダはAssetBundleをアプリでダウンロードされた場合のファイル構成を確認するためのフォルダと思ってください。

このサンプルではHomeは1AssetBundle1ファイル、Iconは1AssetBundle複数ファイルとしました。
AOJ day 25: PureScript is for Everyone

Today is the last day of the Advent of Justin. This means that if you follow me on Twitter, today is one of the last days I will post yet another reply into my huge mega-thread of Advent of Justin tweets. It also means that I need to wrap up this series and try to do some reflection on what this series of posts has tried to do.

But there hasn't really been any kind of theme here to these posts. Yes, all of the posts have been related to PureScript and most of them have talked about something specific in and to the PureScript language, but there hasn't really been much of any kind of progression in these posts, as advanced posts would be posted right before more beginner-friendly posts, and none of the posts have really been geared towards beginners of the language but rather intermediate and advanced users, who simply need some reminders of what things look like and where they should go look for more information.

So instead, I'll talk about a more generic topic that hopefully encourages people, experienced and inexperienced alike.

## PureScript is for Everyone

The only important thing for you to use PureScript is that you don't give up. That might seem obvious here, but it really isn't obvious in practice, where we find ourselves quitting various things that we think would be good or fun to do not because of a good reason, but because of our mentality.

If I can ask for one thing from everyone for the following year, it's for positive thinking. It doesn't have to be naive -- indeed, we might not have PureScript if everyone were naively positive about everything around us. But it should be overall positive and constructive in the public space. Rather than just complain about why something is, it would be more helpful to ask why, and to then use the additional information to further speculate on why something is.

There are a few personalities that may not work for PureScript though, but they are few and limited to only one thing: total negativity. If you can't accept that you should put some effort into both learning and communicating with others, then there might not be anything others can do for you to use PureScript, and indeed, you may quit very early without having done much. But even if you are some kind of totally negative person, maybe given some reflection and help from others, you too could become a force of good, not just in PureScript, but in other spaces as well.

So please, try looking around in the PureScript documentation: <https://github.com/purescript/documentation>

Thanks for reading the Advent of Justin 2018!
Cisco 841M のレビュー

# Cisco 841M のレビュー

この記事は、[Qiitaユーザー大決戦、ベストレビュアーは誰だ!?《その１》](https://qiita.com/advent-calendar/2018/itreview) 23日目の記事です。今日が誕生日なんで、iPad ほしいです（書いてみただけ）。
項目は、[ITreview](https://www.itreview.jp/) に準じてます。

## 評価対象

[Cisco 841M](https://www.cisco.com/c/m/ja_jp/solutions/cisco-start/product_841mj.html)

## この製品の良いポイントは何でしょうか？

- Cisco のルータラインとしては比較的安価である
- Cisco には珍しく GUI のインターフェースがついている
- 2.0Gbps のスループット
- VPN接続20か所
- BGP とか家庭用ルータが対応していないプロトコルに対応している

## 改善してほしいポイントは何でしょうか？

- ファームウェアのアップデートがオンラインで行えるとよい
- 管理画面のもっさり具合
- IPoE とか IPv6 関連にも正式に対応していってほしい

##どのようなビジネス課題を解決できましたか？あるいは、どのようなメリットが得られましたか？

- ライトな環境でのサーバ向けルータとしても使えた
- 障害もなく比較的安定稼働していた
- 速度的にも体感はそこそこだった

## 検討者にお薦めするポイントがあれば記入ください

- とりあえず Cisco 使ってみたい時の入門用にはいいかも
- GUI はそこそこきれなので、ヘビーな用途に使うのでなければ便利
- 他にも連携する Start シリーズがあるので、事務所などの環境にいいのでは

## まとめ

nttxstore で最初の頃安売りしてたので買ったやつですが、そこそこ長いこと使ってました。
特にトラブルはなかったのですが、アップデートは USB 刺したりちょっとめんどいイメージです。
CLI でがしがしいじればもっと活用できるのかもしれません。
Site24x7 の RUM ってなんじゃらほい

# Site24x7 の RUM ってなんじゃらほい

[Site24x7](https://www.site24x7.com/) には色々な監視機能がありますが、その中の一つに RUM って書いてあるやつがあります。
ラムってあれですかね、羊とかお酒とか・・・綴り的には、酒ですよね・・・
今日は天皇誕生日ですが、自分も誕生日なのでゆるゆるとやってみます。

RUM = Realtime User Monitoring

ってことらしいです。
感じとしては、Google Analytics ぽいものなんでしょうかね。

## 使ってみる

![RUM_001.png](https://qiita-image-store.s3.amazonaws.com/0/318450/95b41c6e-a708-8d7e-4cdd-c39bf2ae0a0a.png)

ログインした後、RUM 選びましょう。

![RUM_002.png](https://qiita-image-store.s3.amazonaws.com/0/318450/44de76f6-4150-d7af-9827-bdbf674439e1.png)

`アプリケーションの追加` を押します。

![RUM_003.png](https://qiita-image-store.s3.amazonaws.com/0/318450/ae1041be-d0d8-db31-1f80-62a2e8c8adbd.png)

とりあえず、`アプリケーション名` だけ打ち込んで、`保存` を押します。

![RUM_004.png](https://qiita-image-store.s3.amazonaws.com/0/318450/6b6a6568-6c3b-d3d4-0a19-9e2c1fb40bca.png)

スニペットが出てくるので、これを自分のページの HTML などにコピペします。
とりあえず、これで事前設定は終わりですね。

## レポートの確認

リアルタイムと書かれていますが、実際のアクセスから数分のラグはあります。
そのため、最初データが入ってくるまで少し待つ必要があります。

### サマリ

![RUM_005.png](https://qiita-image-store.s3.amazonaws.com/0/318450/f0f95017-a206-67c8-9f76-1dd0d7db4871.png)

データ取れてますね。

- リダイレクト時間
- DNS time
- Connection time
- ドキュメントダウンロード時間
- サーバーの時間
- 先頭バイト到達時間（FirstByteTime）
- ページレンダリング時間
- ドキュメントレンダリング時間
- 全体の応答時間

まぁまぁの細かさで出てきますね。
これ見ると、Newreric とか思い出します。

### リージョン

サマリの方でもマップは切り替えられますが、リージョンの方でも切り替えてみることができます。
ただ、これ、`世界` `米国マップ` `ヨーロッパ` `インド` `オーストリア` しかないですよね・・・ここは日本・・・

![RUM_006.png](https://qiita-image-store.s3.amazonaws.com/0/318450/9623b668-87de-cd74-1db6-b9d854ef405d.png)

### ISP

ISP 別に応答時間が見られるようになっています。
とりあえず、テストしただけなので、うちで使ってる ISP の上位の IIJ が出てますね。

![RUM_007.png](https://qiita-image-store.s3.amazonaws.com/0/318450/8dcdf4f0-651e-c289-8206-8abacdd7e853.png)

### ブラウザー

どんなブラウザでアクセスがきてるのか表示されます。
ブラウザのバージョンなんかも見られるようです。

![RUM_008.png](https://qiita-image-store.s3.amazonaws.com/0/318450/c959c9a2-44e6-6315-b22d-df43b0f2be57.png)

### 装置タイプ

装置っていうと微妙ですが、マシンを訳すとそうなるんですかね。
端末タイプという方が言い方としては多いような気もします。

![RUM_009.png](https://qiita-image-store.s3.amazonaws.com/0/318450/9a977e6f-444e-8d82-e350-98de8cbca4c1.png)

### Webページ

サイトのどのページにアクセスしてきたのかを見られるようです。
テストなんで、トップページのみになってます。

![RUM_010.png](https://qiita-image-store.s3.amazonaws.com/0/318450/70959992-b5ec-10e7-6698-2fbcb1990540.png)

### リソース

ドメインごとのスループットとか見られます。
比較したいサイトに同じタグ貼り付けたらいい感じなんですかね。

![RUM_011.png](https://qiita-image-store.s3.amazonaws.com/0/318450/eaf5be5f-f144-4569-c909-1e85ff320e56.png)

### AJAX呼び出し

すいません、今回は AJAX 使ってないので、何も出てません・・・
AJAX でどれくらい処理時間かかってるかとか見られそうな感じですね。

![RUM_012.png](https://qiita-image-store.s3.amazonaws.com/0/318450/c81cf096-af94-c042-ccb8-026d4f0cf881.png)

### JavaScriptエラー

これも今回、24x7のタグ以外は JavaScript 入れてないので計測できてませんね。

![RUM_013.png](https://qiita-image-store.s3.amazonaws.com/0/318450/3bc0e885-389c-cb6a-51bb-62b8b3f7b16c.png)

### スナップショット

スナップショットは時間のかかったものの統計ぽいですね。
今回は、テスト時間も短かったので何も出てないです。

![RUM_014.png](https://qiita-image-store.s3.amazonaws.com/0/318450/487ba861-3a79-9253-d3a5-deab2faeab0a.png)

## まとめ

一通り見た感じでは、機能的な不足は余りないように思いました。

ただ、翻訳が微妙な箇所はそこそこありましたね。翻訳されてないとこも多いですし。
後、RUM ではないですが、インストールスクリプトのコマンドラインの内容が間違っていたりするのも散見されました。
Zoho もプロダクトが増えて追いついてない感じなんですかね。
macでkarabiner-elementsを使用してUS bluetoothキーボードのcaps-lockをcontrolに変更した。


##karabiner-elementsでbluetoothのUSキーボードのcaps-lockをcontrolに変更したはずが変化がなかった。:frowning2:
某macの純正bluetoothキーボードの設定したときのことです。caps-lockをcontrolにしたはずがピカピカ光ってcontrolに設定されない〜、ググってもkarabiner-elementsの使い方しか出てこなくて結構苦戦しました。そうなんだけど、そうじゃない。

### 試したこと
- `karabiner caps lock conotrol`...:rolling_eyes:configファイルの話とかkarabinerの使い方が検索結果出でるけど違う気がする。。

- macのキーボードの設定でもCaps Lockをcontrolに設定しているけど。。なぜか反映されない。

### 解決
`macの環境設定`→`キーボード`→``右下の修飾キー`→`キーボードを選択`→`Karabiner VirtualHDKeyboard`を選択してCaps Lockをcontrolに変更するだけだった。。。
デフォルトでキーボードのキー設定は`Apple内蔵`が選択されていた。:astonished:なぜが気づかなかった。

### 余談と経緯
macbookのjisキーが気に食わなくてusキーを買い、macのキーの上に置く。トラックパッドはmacbookを使うというのにハマっています。※電源キーは停止されていません。

`Preference`→`Devices`→`Disable the built in keyboard~`内のキーボードを自身が使いたいキーボードを選択すれば`そのキーボードのみを使用することができます。`macをjisキーで買ってしまい、後悔しているそこのあなたも、そもそもmacのキーボード嫌いなあなたもこれさえ知っておけば最高のキーボードとのmacライフ待ったなし。

[karabiner-elementsはここからダウンロードできます。for-mac](https://pqrs.org/osx/karabiner/)
GCEのVMインスタンス作成からDockerの利用開始まで

# 背景

コンテナの学習にGCPを使用しています。
Dockerのテスト用にGCEのVMインスタンスを作成することが何度かあったので、その手順を記載します。

# VMインスタンスの作成

``docker-sample``という名称で、CentOS7のVMインスタンスを作成します。
コンソールから作成するか、以下のようなコマンドを実行します。
``--project``には自身のプロジェクト名を指定してください。

```console
$ gcloud beta compute --project=yourproject instances create docker-sample \
--zone=asia-northeast1-b --machine-type=n1-standard-1 --image=centos-7-v20181210 \
--image-project=centos-cloud --boot-disk-size=10GB --boot-disk-type=pd-standard \
--boot-disk-device-name=docker-sample
```

作成したVMインスタンスにSSHで接続すれば、事前準備は完了です。

# Dockerのインストール

複数のインストール方法がありますが、スクリプト実行によるインストールが簡単だと思います。
※インターネットからダウンロードしたスクリプトは、実行前に必ず確認を行いましょう

参考：[Get Docker CE for CentOS](https://docs.docker.com/install/linux/docker-ce/centos/#install-using-the-convenience-script)

```console
[user@docker-sample ~]$ curl -fsSL https://get.docker.com -o get-docker.sh

[user@docker-sample ~]$ sudo sh get-docker.sh
```

``-f`` : サーバーエラーを出力しない
``-s`` : 進捗、エラーを表示しない
``-S`` : エラーを表示する(``-s``と同時に使用)
``-L`` : リクエストページが移動していた場合、移動先で再実行する

Dockerのインストールに成功すると、バージョン確認ができるようになります。

```console
[user@docker-sample ~]$ sudo docker version
Client:
 Version:           18.09.0
 API version:       1.39
 Go version:        go1.10.4
 Git commit:        4d60db4
 Built:             Wed Nov  7 00:48:22 2018
 OS/Arch:           linux/amd64
 Experimental:      false
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
```

# Dockerデーモンの起動

バージョンの確認では、最終行にDockerデーモンに接続できないというメッセージが表示されていました。
この状態ではDockerを利用することはできません。

```console
[user@docker-sample ~]$ docker container run hello-world
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
See 'docker run --help'.
```

Dockerを利用するためには、Dockerデーモンを起動する必要があります。

```console
[user@docker-sample ~]$ sudo systemctl start docker

[user@docker-sample ~]$ sudo docker container run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
-- 以下略
```

ただし、VMを再起動すると再びDockerを利用できなくなります。
VMの起動時に毎回Dockerデーモンを起動しなくてはなりません。

Dockerデーモンを自動起動する場合は、次のコマンドを実行します。

```console
[user@docker-sample ~]$ sudo systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
```

参考：[systemd で Docker の管理・設定](http://docs.docker.jp/engine/admin/systemd.html)

# ローカルユーザーでの実行

Dockerは初期状態ではrootユーザーでのみ利用できるので、``sudo``をつけてコマンドを実行しなければなりません。
``sudo``をつけなかった場合はエラーとなります。

```console
[user@docker-sample ~]$ docker container run hello-world
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.39/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
```

ローカルユーザーでDockerを利用するためには、次のコマンドを実行します。

```console
[user@docker-sample ~]$ sudo usermod -aG docker youruser
[user@docker-sample ~]$ docker container run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.

（以下略）
```

※うまく実行できない場合は、SSH接続を一度終了し再接続してみてください。
Ruby・attr_accessorとは何か

初見で意味がよくわからなかったので、メモ。

attr_accessorを設定することによって、そのオブジェクトのインスタンス変数を読み書きできるようになる（メソッドとして値を読み書きできる）。

```ruby
class User
  # first_nameの読み書きを許可する
  attr_accessor :first_name

  def initialize(first_name, last_name, age)
    @first_name = first_name
    @last_name = last_name
    @age = age
  end

  # 省略
end

# "Ruby Alice"さん(20)を作る
user = User.new('Alice', 'Ruby', 20)
user.first_name 
=> "Alice"
user.first_name = 'ありす'
user.first_name
=> "ありす"
```

参考文献: [プロを目指す人のためのRuby入門](https://gihyo.jp/book/2017/978-4-7741-9397-7)
メモ：「３０日でできる！OS自作入門 」12日目

## タイマー１

1) タイマを使おう
- PIT (Programmable Interval Timer) がある

```
EQU PIT_CTL 0x43
EQU PIT_CNT0 0x40

OUT PIT_CTL, 0x34; 
OUT PIT_CNT0, 0x9c;
OUT PIT_CNT0, 0x2e;
```
- `0x2e9c` -> `11932` -> 100Hz, 約 10ms 
- inthandler20 と asm_inthandler20 を作成
- set_gatedesc で idt + 0x20 を追加

2) 時間をはかってみよう
- counter が入ってる構造体を作って inthandler20内でカウントアップしていく
- それを画面で表示
- どのマシンでも同じ速度でカウントするようになった

![counter4.gif](https://qiita-image-store.s3.amazonaws.com/0/109145/3945168e-8a09-7851-9858-9031839ea790.gif)

3) タイムアウト機能
- counter と timeout が入ってる構造体を作って timeout は減らしていく
- 一定期間になったら FIFI のキューにいれてやりたい処理をする

![counter5.gif](https://qiita-image-store.s3.amazonaws.com/0/109145/cd76340e-d778-6238-afb3-b73cfcec3417.gif)

4) 複数タイマ対応
- TIMER と TIMERCTL構造体を用意、struct TIMER timer[MAX_TIMER]; などで定義
- 一旦MAXは５００
- TIMERに状態などをもたせるため、flags を利用
- flags に 未使用、ALLOC,USINGのステートを持たせる
- TimerセットしたらUSINGに変更
- inthandler20でUSINGを探して timeout が　　０になったら　fifo　キューに入れる
- １０秒のタイマ、３秒のタイマ、点滅するカーソルみたいなのを作成

![counter6.gif](https://qiita-image-store.s3.amazonaws.com/0/109145/6bc0a92f-2527-d796-dc9d-2bf8f082146a.gif)

動作はいい感じ、点滅するカーソルだけもっとスピード欲しい

5) 割り込み処理は短く
- inthandler20を count と timeout を count だけにする （カウントアップするだけでよいので　timeout を減らす処理は必要ないため）

6) 割り込み処理は短く2
- 複数タイマの一番短いtimeout 時間を next としてもつ
    - inthandler20 は全てのタイマを見る必要がなくなって、next だけみてまだなら終了
    - next に引っかかったら今までの timeout 処理をして、next を再設定
- 最初は next を　０ｘffffffff に指定、まだタイマないので
- timer セットするときも next より短ければ、next を更新するように変更
- まだやはくなった実感はない

7) 割り込み処理は短く３
- TIMECTLの構造体に使ってるタイマをカウントする using とセット中のタイマの一覧を持つフィールドを追加
    - タイマが実行されたらタイマ一覧を並び直したりする

実感的にはそんなに早くはないが、タイマー１はここまで。また明日！
オブジェクト指向とこれからの時代のプログラミングについて

この記事は[全部俺 Advent Calendar 2018](https://adventar.org/calendars/3702)の22日目の記事です。
とあるSEの妄想怪文書です。個人の考えなのでその前提で読んでいただけると幸いです。

## オブジェクト指向と関数型
プログラミングの歴史は状態との戦いの歴史です。
プログラミングでの状態との付き合い方はオブジェクト指向と関数型の2種類に大別できます。
オブジェクト指向と関数型は、どちらも状態と上手に付き合うことを目的としていますが、アプローチの方法は正反対です。

- オブジェクト指向
    - 状態をオブジェクトの形式でラッピングし、使用者が意識しないで使えるようにすることを目的とする
    - 状態を**中**に持つ
- 関数型
    - 状態を内部で持たないようにし、引数/戻り値以外で状態を取り扱わない
    - 状態を**外**に持つ

どちらも状態を意識しているのに、オブジェクト指向は状態をプログラムの中に閉じ込めて見えないようにしているのに対して、関数型は使用者が見えるところ以外で状態を取り扱わないようにしているというのが面白いところですね。
なお、ここで言うオブジェクト指向や関数型とは、言語の話ではなく設計の話になります。

## オブジェクト指向とマイクロサービス
マイクロサービスの時代になってくると、状態との付き合い方はより大事な考え方になってきました。
全てのマイクロサービスが同じ状態を参照したり、複数のマイクロサービスが同じ状態を更新したりすることが発生したためです。
こうなると、個別のマイクロサービスに対してオブジェクト指向の考え方を適用するのは具合が悪いです。　
マイクロサービスAの中でのみ使用する状態がある場合、Aを呼び出す度に値が異なってしまう可能性があると後続のマイクロサービスも連鎖的に結果が変わるということが起こってしまうかもしれません。
そこで、関数型の考え方が重要になってきました。状態は内部で保持するよりも外から与えられるべきであるという考え方です。最近のプログラミングでは、関数型で書いて副作用を極力避けるということが一般的になってきたように思います。

ただ、実際のサービスにおいて、状態はどこかで保持する必要があります。（例えば、Twitterなどではユーザーごとに投稿しているTweetが異なっていますので、これをDBなどで保持する必要があります。）状態を扱っていて、実行するタイミングや状況などで結果が変わることが予想されるところではオブジェクト指向の方が適任と言えるでしょう。

## マイクロサービス化が進む先にあるもの
今後もマイクロサービス化が進んでいった場合、汎用言語の価値は相対的に下がっていくと思います。
モノリシックなシステムの時代は、1つの言語でなんでもできるということが重要でした。
しかし、マイクロサービス化が進んでくると、それぞれのマイクロサービスで特定の分野に強いものを選ぶことができるので事情が異なって来ます。画面表示に特化した言語/フレームワークや数値計算に特化した言語など、なんでもできるよりも特定の分野や領域で無類の強さを発揮する言語の価値が上がっていくはずです。

## まとめと所感
オブジェクト指向と関数型の良いところを活かしながら、適材適所な設計/プログラミングを行っていくことが今後より重要になっていくと思います。今後は、オブジェクト指向/関数型の二元論的な話だけではとどまらず、より特化した言語やフレームワークを選択することがより良い選択となっていく可能性が高いと思います。

> 画面表示に特化した言語/フレームワーク

来年になるまでにElmを学び始める所存です！
今後も面白い思想の尖った言語がどんどん出てくることを願っています。
CentOS7をVMwareにインストール

CentOS7を、VMwareにインストールした際の手順と、詰まったところを記載。

ホストOS： windows10
ゲストOS：CentOS 7（DVD）
ツール：VMware Workstation 15.0.2 player
ネット環境：wifi

1.　isoをダウンロード。今回は「DVD」を選択し、DVDに焼く。
2.　VMwareをダウンロード。
　　※VirtualBoxとどっちにしようか悩んだけど、今回はVMwareを採用。
3.　VMwareをインストール。
4.　VMwareを起動し、DVDをOSに設定して、インストール開始。
5.　インストール方法は、画面の内容を確認しながら進めればOK。
　　※ボケっとして、せっかくDVD版を落としたのに最小インストールしちゃったけど.....
6.　OSが起動してログイン。5.の理由でCUI表示。でもログインできることを確認。
7.　GNOME Desktopをインストール。
　　`#yum grouplist GNOME`
　　`#yum groupinstall "GNOME Desktop"`

ここまではうまくいったけど、ネットワーク接続ができなくて詰まった。

【結論】
VMwareのネットワーク接続をブリッジに変更する。
「管理>管理マシン設定」で表示されるハードウェアタブ内の「ネットワークアダプタ」から、設定を以下に変更。
「ネットワーク接続」の「NAT」（デフォルト）→「ブリッジ」

時間かかったけど、結局はこれだけだった。

【詰まった点】
・ネットワーク接続をしようとしたけれど、wifiの設定欄でアダプターがないと表示される。
・wifiのデバイスを確認しようとしたけれど、デバイスが表示されない。
　　`#nmcli d`
　　これでデバイスが表示されるはずらしいけれど、ネットで調べたwlXXXのようなデバイスが見つからない
・カーネルの確認と必要そうなアダプタを確認したけど、ありそう。
　　`#uname -a`　←これでカーネルが3.10であることを確認
　　`#ls /lib/firmware`　←3.10以降のカーネルに対応したバージョンのアダプタが格納されていることを確認
・iwconfigでwifi設定を確認しようとしたけれど、iwconfigなんてコマンドはないと言われる。
・nmtuiを起動してwifi接続用の設定を追加しても、デバイスは表示されない。

PCは有線LANがないからPCはオフラインで、カーネルのアップデートも試せないし、リポジトリ作成をするしかないのかなぁと考えて、なんとなくVMware側の設定も見直そうと思って設定したら、正解だった。
だけど、ブリッジにしてもwifi接続用のデバイスは見つからないし、いいのかな？

なんで接続できているかは、たぶんブリッジ接続を理解してないからわかっていないんだと思うんだけれど、とりあえず動いたので、理解できたらまた追記。
【Unity】VR用にビルドする方法


<font color="Magenta">VR用にビルドする方法<font>

実際に動かした動画はこちら↓↓
https://twitter.com/nonnonkapibara/status/1076511052043448320
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【Unity】やっとVR用のゲームができました！！<br>シーンの遷移も、スマホにVR用の出力もできました！！<br>やった！！<br>v(≧∇≦)v イェェ～イ♪<a href="https://twitter.com/hashtag/unity?src=hash&amp;ref_src=twsrc%5Etfw">#unity</a> <a href="https://twitter.com/hashtag/unity3d?src=hash&amp;ref_src=twsrc%5Etfw">#unity3d</a> <a href="https://twitter.com/hashtag/VR?src=hash&amp;ref_src=twsrc%5Etfw">#VR</a> <a href="https://t.co/AEsbXdrnhX">pic.twitter.com/AEsbXdrnhX</a></p>&mdash; non (@nonnonkapibara) <a href="https://twitter.com/nonnonkapibara/status/1076511052043448320?ref_src=twsrc%5Etfw">2018年12月22日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>






環境メモ
⭐️Mac OS Mojave バージョン10.14
⭐️Unity 2018.2.15f1
⭐️Xcode10.1
⭐️iPhone7(IOS 12.1)

1.「Scenes In Build」に表示するシーンを設定する
<img width="627" alt="スクリーンショット 2018-12-22 23.41.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/65ced8c4-5bf2-5190-6882-e27c0471e5a2.png">

2.「Player Setting」ボタンを押す
<img width="619" alt="スクリーンショット 2018-12-22 23.42.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/e6e35838-cd92-a34b-5bda-0370be663871.png">

3.「XR Settings」の「Virtual Reality Supported」チェックONする。
「Virtual Reality SDKs」を「Cardboard」にする
<img width="399" alt="スクリーンショット 2018-12-22 23.42.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/7949eacf-a800-5eeb-9915-cc56c5d30b56.png">

<img width="508" alt="スクリーンショット 2018-12-23 0.37.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/529cfdf7-88ce-99a7-73bc-a909e9c4a1a8.png">
BitriseのXcode10Stackでreact-nativeを通す

[AutoScale Advent Calendar 2018](https://qiita.com/advent-calendar/2018/auto-scale) 13日目の記事です。
AutoScaleではスマートで効率的な Twitter アカウント運用ツール[SocialDog](https://web.social-dog.net)の開発運用をしています。

主にフロント担当しています[t0m0120](https://twitter.com/t0m0120)です。

Bitriseで用意されているios/androidがビルドできるスタックがXcode10になってしまいreact-nativeのiosbuildが通らなくなってしまったので解決方法を残しておこうと思います。

一度
`push` -> `Xcode9のStackのWorkflow` -> `AndroidのWorkflow`
などで頑張っていたのですがDeveloperPlanでは並列でworkflow動かせずiosBuildをWaitしてAndroidが終了した際の通知を受け取って終了のSlack通知やGithubのCheck通知が行えないなどで断念しました・・・もしいい方法があれば教えて頂ければ幸いです！


XCode上では下記issueの用にproject settingのBuild Systemを`Legacy Build System`にすればbuild通るようになっていたのですががBitriseでのやり方で戸惑いました。

https://github.com/facebook/react-native/issues/19573
![46042225-bdcba700-c0c9-11e8-97b8-42d7a4e11996.png](https://qiita-image-store.s3.amazonaws.com/0/226100/b3946a1c-eeb0-aaa9-fcfe-85033aff2577.png)

## Bitriseでの設定方法

1. Workflow画面のXcodeArchive&Export for iOSから
<img width="376" alt="スクリーンショット 2018-12-22 19.35.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/226100/cadacc56-8858-1c7c-7377-9c8c7f1726f7.png">

1. Debug欄の`Additional options for xcodebuild call`へ`-UseModernBuildSystem=NO`を追加する。

<img width="822" alt="スクリーンショット 2018-12-22 19.35.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/226100/0e562c9e-13c7-00ce-4fc1-ed74d00029d6.png">

以上でXCode10のStackでもビルド通る様になると思います。
Xamarin.iOS で UIGestureRecognizer を使うときのお作法

# Problem
`UIGestureRecognizer` とその継承クラスはなんらかのビューにジェスチャを付けたいときに使います。たとえば `UIView` がタップされたことを検知したいなら次のようになるでしょう。

```c#:ViewController.cs
public override void ViewDidLoad()
{
    var tapGesture = new UITapGestureRecognizer(this.HandleTapped);
    view.AddGestureRecognizer(tapGesture);
}

private void HandleTapped()
{
    Console.WriteLine("Tapped!");
}
```

おめでとうございます。これであなたは解放されない `ViewController` を手に入れました。
サンプルはこちらです。https://github.com/ailen0ada/XamarinAdvent18Sample
色の名前をタップすると全面に色を表示する画面に遷移し，タップすると透明度が変化するようになっています。行をタップしたときに `GC.Collect` を走らせているので，きちんと解放されればファイナライザが呼ばれてデバッグコンソールに出力が行われるはずです。解放されれば。

# TL;DR

 - 強参照
 - ちゃんと参照を外すか， `ObjCRuntime.Selector` を使ったアプローチに変える
 - そのうちもう少し簡単に解放できるようになる

# Cause
`Action` を渡すコンストラクタの内部で，別のクラスが作られてにここで渡した `Action` が抱え込まれるからです。おおよそ次のようなコードに展開されます。

```csharp:UIGestureRecognizer.ctor
[DesignatedInitializer]
public UIGestureRecognizer(Action action)
: this(Selector.GetHandle("target"), 
       (UIGestureRecognizer.Token) 
            new UIGestureRecognizer.ParameterlessDispatch(action))
{
}

[Register("__UIGestureRecognizerParameterlessToken")]
public class ParameterlessDispatch : UIGestureRecognizer.Token
{
    private Action action;  // ここで抱え込まれて誰も解放しない

    internal ParameterlessDispatch(Action action)
    {
        this.action = action;
    }

    [Export("target")]
    [Preserve(Conditional = true)]
    public void Activated()
    {
        this.action();
    }
}
```

ネイティブ側の `UIGestureRecognizer` が要求するのはセレクタと，そのセレクタを受け取るターゲットのポインタです。いろいろXamarin側でコンストラクタを定義していますが最終的にはそこに行き着きます。詳しくは拙著 [Xamarin Myth Busters](https://xamaritans.booth.pm/items/833234) をどうぞ。

# Solution

## A; `TapGesture` をビューから剥がす

プッシュ遷移の際には，必ず `DidMoveToParentViewController` を通ることになっているので，これを使います。

```csharp:UIViewController.cs
public override void DidMoveToParentViewController(UIViewController parent)
{
    base.DidMoveToParentViewController(parent);
    if (parent == null) // 戻る遷移の場合は parent が null
    {
        foreach (var recognizer in this.View.GestureRecognizers)
        {
            this.View.RemoveGestureRecognizer(recognizer);
        }
    }
}
```

これで `ViewController` については解放されます。


## B; コンストラクタでセレクタを渡す

次のように書き換えて，ネイティブ呼び出しに近い形にしてしまいましょう。

```csharp:UIViewController.cs
public override void ViewDidLoad()
{
    var tapGesture = new UITapGestureRecognizer(this, new ObjCRuntime.Selector(nameof(HandleTapped)));
    view.AddGestureRecognizer(tapGesture);
}

[Foundation.Action(nameof(HandleTapped))]
private void HandleTapped()
{
    Console.WriteLine("Tapped!");
}
```

これでターゲットである `UIViewController` のポインタと，セレクタが渡されるだけになったので参照が弱くなりました。

## C; `Dispose()` する
Xamarin.iOS 12.2.1.12 の時点ではまだ実装が入っていませんが，きちんと `UIGestureRecognizer.Dispose()` を呼べば抱えているものをすべて解放する実装がそのうち入ります。
https://github.com/xamarin/xamarin-macios/issues/4190

マージされた箇所を見ると，どこにアタッチされたかを保持しておいて全部解除していくという動きをしています。Aパターンとやることは同じで方向が逆ということですね。

https://github.com/xamarin/xamarin-macios/blob/9456474948db7a32c95d6e2ecf0ce3114746e67a/src/UIKit/UIGestureRecognizer.cs#L25

# Conclusion
 1. 参照について意識しましょう。
 1. Rxを使うなら `Subscribe` したらちゃんと `Dispose` しましょう。
 1. Xamarin Profilerが使える環境なら使いましょう。（ライセンスはあってもアプリの構造によっては使い物にならないのじゃよ）
【Rails5】ユーザパスワード更新の実装パターンまとめ

業務でRailsを使って社内用のアプリケーション開発を行なっていた際、ユーザのパスワード管理の部分で色々と調査をしていたのでそこで得られたいくつかの知見を書きます。

アプリケーションにユーザ管理機能を実装する際は、deviseというrubyのgemを使うことで簡単にユーザ管理に必要な機能を実装できます。
ユーザ情報への入力パラメータに対してバリデーションなどを簡単に実現できますが、独自に実装を加えたりする必要も場合によってはあります。
今回はdeviseを使ったユーザ管理を実装していく中でパスワードの更新周りで調べた点をまとめてみます。

# Rubyと各gemのバージョン
* ruby 2.5.1p57
* rails (5.2.1.1)
* devise (4.5.0)

# パスワード更新のパターン
* ユーザ更新時にパスワードを更新しない
* ユーザ更新時に特定の条件でパスワードの検証をしない
* ユーザ更新時にパスワードフォームの値が空でない場合にパスワードを更新する

## ユーザ更新時にパスワードを更新しない
ユーザ更新時にパスワードを更新したくない場合、strong parameterに`:password`を含めない方法が簡単です。

```ruby

params(:user).permit(:first_name, :last_name, :address)
```

上記は独自のコントローラー内でupdateを行う場合になりますが、Devise::RegistrationsControllerを実装したコントローラーに実装する場合は下記のようになります。
update_resourceをoverrideして中でupdate_resourceをresource.update_without_passwordを呼ぶように実装を変更します。

```ruby

# app/controllers/registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController

  protected

  def update_resource(resource, params)
    resource.update_without_password(params)
  end
end
```

## ユーザ更新時に特定の条件でパスワードの検証をしない
deviseのvalidatableを実装することでupdate時にパスワードの検証を行うことができます。

```ruby
class User < ApplicationRecord
  devise :validatable
end
```

validatableのパスワード検証のロジックはpassword_required内で定義されています。

```ruby
def password_required?
  !persisted? || !password.nil? || !password_confirmation.nil?
end
```

このメソッドをoverrideすることで任意の条件でパスワード検証を行うことができます。

```ruby
def password_required?
  if do_validate # パスワード検証を行う条件
    !persisted? || !password.nil? || !password_confirmation.nil?
  else
    false
  end
end
```

## ユーザ更新時にパスワードの値が空だった場合、パスワードを更新しない
これは同僚から聞いて知ったのですが、controller内で参照できるparamsに含まれるパラメータは全てvalidationの対象となるようです。
なのでupdateメソッド内にパスワードが空だった場合、userをupdateする前にparams[:user].delete(:password)を実行することで
validationを回避することができます。

```ruby
  def update
    if params[:user][:password].blank?
      params[:user].delete("password")
    end
    if @user.update(user_params)
  end
```

# おわりに
それぞれ簡単にですがdevise利用を踏まえてのパスワード更新周りについてまとめました。
deviseは便利な機能が多いので使う場合はどんな機能があるのかをざっと確認しておくと良いです。
機能の全体像を把握する上で下記の記事が参考になりました。

https://qiita.com/cigalecigales/items/f4274088f20832252374



# 参考リンク

https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-account-without-providing-a-password


https://easyramble.com/user-account-update-without-password-on-devise.html


http://yoshitsugufujii.github.io/blog/2015/06/08/devise-skip-password-check


https://code.i-harness.com/en/q/1133599

https://qiita.com/cigalecigales/items/f4274088f20832252374
メモ：「３０日でできる！OS自作入門 」11日目

## ついにウインドウ

1) もっとマウス
- 画面外にもマウスなどを移動したいが、うまくいかないことを確認

![スクリーンショット 2018-12-22 23.51.20.png](https://qiita-image-store.s3.amazonaws.com/0/109145/3432a964-e984-6381-84cd-6a1237b1fc43.png)

２） 画面外サポート
- sheet_refreshsub に 画面外の場合は中で収まるように修正、< 0 を　０ にするとか

![スクリーンショット 2018-12-22 23.51.41.png](https://qiita-image-store.s3.amazonaws.com/0/109145/df9b77df-5a41-ccd7-2df7-c7f5e24726f7.png)

3) shtctlの指定省略
- shtctl の参照を sheet の中に持つように変更
- 動作的には特に変化なし

4) ウインドウの作成
- クローズボタンとタイトルがある

![スクリーンショット 2018-12-23 0.06.21.png](https://qiita-image-store.s3.amazonaws.com/0/109145/4ae692e8-a812-031e-20c6-75b6fc98af41.png)

いいですね。

5) マウスをウィンドウの下においてみる

![スクリーンショット 2018-12-23 0.08.06.png](https://qiita-image-store.s3.amazonaws.com/0/109145/f83fb32d-4338-3468-8a83-c0ecf530d2cf.png)

6) 高速カウンター

![counter.gif](https://qiita-image-store.s3.amazonaws.com/0/109145/760346fe-8491-860b-a00f-c05cda8e008d.gif)

表示がチラチラする

7) チラチラ解消
- 背景は再描画する必要はない、ですが、マウスなどの上のレーヤは書き直す必要ある
- refreshsub するときにレーヤ（ここではHeight)を指定してそれ以上を再描画すればよい

![counter2.gif](https://qiita-image-store.s3.amazonaws.com/0/109145/f4629b47-1947-f77e-74be-00bc23f9f56a.gif)

- 背景は大丈夫ようになった。だが、今度はマウスがちらちらする

8) チラチラ解消２
- vram の他に同じ大きさの map を使って下敷きの地図を作る
- refresh_map で見えてる部分にシートIDを振り分ける
- refresh_sub で対象のシートIDだった場合のみに描画する

![counter3.gif](https://qiita-image-store.s3.amazonaws.com/0/109145/d257d82d-a2e2-e648-cb03-ee8375431131.gif)

めちゃ、スムーズになりましたね。
【PHPデザインパターン】01_TemplateMethod～処理を穴埋めする

# 引用記事

この記事を書くきっかけになったブログです。

記事内の解説やソースコードは、こちらのブログと著者の公開リポジトリから引用・参考としています。

> [Do You PHP はてな〜[doyouphp][phpdp]PHPによるデザインパターン入門 - TemplateMethod～処理を穴埋めする](http://d.hatena.ne.jp/shimooka/20141212/1418363698)

# 概要

- 親クラスで処理の大きな枠組みを定義し、具体的な処理内容をサブクラスで決定させる。
- 親クラスでは抽象メソッドが定義されている。抽象メソッドとして定義したメソッドは、サブクラスにおける実装が保証されている。
- 継承を利用する。
- サブクラスの型は、その親クラスの型と置換可能である。（リスコフの置換原則）
- 親クラスがサブクラスのメソッドを呼び出す「制御構造の反転」という特長を持つ。（ハリウッドの原則）
 
# 構成

- 親クラスに、サブクラスに固有で持たせたいメソッドを、``TemplateMethod``として定義する。
- TemplateMethod内のメソッドは``abstract（抽象クラス）``として定義するため、サブクラスにおける定義が必須になる。
- サブクラスで、abstractとして定義したメソッドをサブクラス固有のメソッドとして定義する。
- 逆に、TemplateMethod内のメソッドは親クラスでは定義できない。

# ソースコード

[前回の記事](https://qiita.com/33yuki/items/fc0e48b9816aecedb47a)ではオートロードや名前空間を利用していましたが、今回コードを簡素化したため、クラスも1つのファイルにまとめました。
そのため、``require_once``でクラスを記述しているファイルを呼び出しています。

処理の詳細は、ファイル内のコメントに記載しました。

## 処理の流れ
- 親クラスとして``AbstractDisplayクラス``を定義する。
- サブクラスとして``BreakDisplayクラス``と``TabDisplayクラス``を定義する。
- 配列をプロパティとして受け取り、それを返す処理は、各サブクラスで共通している。
- BreakDisplayクラスでは、配列の各要素を改行区切りで返す。
- TabDisplayクラスでは、配列の各要素をタブ区切りで返す。

## my_client.php

- クライアント側のファイルです。

```my_client.php
<?php
// クラスが記述されているファイルを読み込む
require_once 'my_class.php';

// 表示する配列を定義する
$data = array('apple', 'orange', 'peach', 'banana');

// BreakDisplayクラスのインスタンスを作成
// displayメソッドを呼び出す
$display = new BreakDisplay($data);
$display->display();

echo str_repeat('-', 40)."<br>"."\n";

// TabDisplayクラスのインスタンスを作成
// displayメソッドを呼び出す
$display = new TabDisplay($data);
$display->display();
```

## my_class.php
- 親クラス、サブクラスが定義されているファイルです。

```my_class.php
<?php
// 抽象クラスとして作成
// そのためAbstractDisplayのインスタンスは作成できない
abstract class AbstractDisplay
{
    // プロパティ(メンバ変数)の定義
    // privateで定義されていてもgetDataメソッドでサブクラスから呼び出せる
    private $data;

    // オブジェクト生成時にコールされるメソッド
    // オブジェクトを使用する前に必要な初期化を行う
    public function __construct($data)
    {
        if (!is_array($data)) {
            $data = array($data);
        }

        $this->data = $data;
    }

    // サブクラスで共通して使用するメソッド
    public function getData()
    {
        return $this->data;
    }

    // これがTemplateMethodに相当するメソッド
    public function display()
    {
        $this->displayTitle();
        $this->displayArray();
    }

    // abstractとマークされたメソッドは、サブクラスにこれらのメソッドの定義を強制する
    // メソッドの外観を宣言するのみで実装を定義することはできない
    // 引数は定義できる
    abstract protected function displayTitle();

    abstract protected function displayArray();

}

// サブクラスその1
// 配列を改行区切りで返す
class BreakDisplay extends AbstractDisplay
{
    protected function displayTitle()
    {
        echo get_class()."クラスで配列を表示します"."<br>"."\n";
    }

    protected function displayArray()
    {
        foreach ($this->getData() as $value) {
            echo $value."<br>"."\n";
        }
    }
}

// サブクラスその2
// 配列をタブ区切りで返す
class TabDisplay extends AbstractDisplay
{
    protected function displayTitle()
    {
        echo get_class()."クラスで配列を表示します"."<br>"."\n";
    }

    protected function displayArray()
    {
        foreach ($this->getData() as $value) {
            echo $value."\t";
        }
    }
}
```

メソッドやプロパティのアクセス権（public、protected、private）、construct、abstractについても、別記事でまとめてみます！
分散表現の類似度を高速に算出する

# はじめに
みなさんこんにちは。
近年自然言語処理界隈では、word2vecをはじめELMoなど、分散表現が非常に人気を博しております。
分散表現とは、すごく雑にいうと、単語（もしくは文）をベクトル化したものを指します。
ただ、そのベクトル化にはいろいろ工夫をされており、似た表現は似たようなベクトルに変換されるといった特徴があります。
例えば、「日本」という単語のベクトルと「ギター」という単語のベクトルは遠く、「日本」という単語ベクトルと「中国」といった単語ベクトルは近くなります。（ベクトル間の「近い」「遠い」はコサイン類似度を用いて計算できます。）
最近は単語だけでなく、文書の分散表現を獲得しようとしている論文が多いです。文書の分散表現の獲得ができると、類似文書の検索ができたりします。

分散表現は便利な一方、高次元かつデータ数が大量にあり、単純に類似度をとるスクリプトを書くだけではものすごく時間がかかることがあります。
本記事では、高次元のベクトルの類似度計算を行う際のベストプラクティスを紹介しようと思います。

# 結論
ベクトルの計算には、[NGT](https://github.com/yahoojapan/NGT/tree/master/python)を使えばOK。

# ベクトル計算について
ベクトルの類似度計算には、[NGT](https://github.com/yahoojapan/NGT/tree/master/python)を利用するのがベストだと思いました。
なんといっても、速い＋非常にわかりやすい。さらにApache License2ライセンス。
類似度の計算&探査は下記コードで計算できちゃいます。

```python
from ngt import base as ngt 

# w2vという変数は200次元のベクトルが入っている二重リスト
w2v = ....
dim = 200

index = ngt.Index.create(b"tmp", dimension=dim, distance_type="Cosine")
index.insert(w2v)
index.save()

# queryには200次元のベクトルが入っている想定
query  = [0.5,2.0,1.0,.....]

result = index.search(query, 3)

for o in result :
    print("id is", str(o.id)) 
    print("distance is ", str(o.distance))
    


```

ここからは上記コードを解説していきます。
ますはここのコード。

```python

from ngt import base as ngt 

# w2vという変数は200次元のベクトルが入っている二重リスト
w2v = ....
dim = 200

index = ngt.Index.create(b"tmp", dimension=dim, distance_type="Cosine")
index.insert(w2v)
index.save()
```
ここのコードは、w2vという変数に二重リストで200次元のベクトルが代入されていることとします（今回はベクトルを取得するところは本質ではないので省いています）。最後の3行で`/tmp`にindexを作成しています。indexを作成する際、`distance_type`に引数を与えることで、どういった距離を使うかが選択できます。今回は分散表現なのでコサイン類似度で計算していますが、ユークリッド距離（L2 distance）に設定することも可能です。

そしてあとは検索をするだけです。

```python

query  = [0.5,2.0,1.0,.....]

result = index.search(query, 3)

for o in result :
    print("id is", str(o.id)) 
    print("distance is ", str(o.distance))

```
index.searchに類似度を計算したいベクトルを入れればOKです。
これで、全ベクトルから類似度を計算し、近いものから3つをソートして算出してくれます。
実際に試してみたのですが、爆速でした。
[AIを使って顔画像から「常連さん」を判定しよう！](https://future-architect.github.io/articles/20170526/)の記事で、人の顔画像を128次元にし、たくさんの顔画像から同一人物の計算をしようとしていますが、NGTを使うとこの計算が爆速でできます。
（画像の場合はユークリッド距離で類似度を算出することが多いので注意）


# 終わりに
今回はベクトルの類似度を爆速で計算する方法を紹介しました。
機械学習の実装をしていく上で、ベクトル計算の時間は意外と処理時間を占めます。
そんな時は[NGT](https://github.com/yahoojapan/NGT/tree/master/python)のような素晴らしいツールを利用することも検討してみてはいかがでしょうか。
JSONファイルをUnityで利用

#はじめに
まず完全に忘れておりました。大変申し訳ございませんんんんん。

で、今回ですが芸大の友人とADVゲーム作ろうという話になったんで、今回はティラノスクリプトや吉里吉里といった開発ツールは使わずにJSONファイルを利用して製作することにしました。

そのためにまずJSONファイルをUnityで扱う方法を勉強してみたのでそれをまとめます。
今回は[Weather Hacks](http://weather.livedoor.com/weather_hacks/webservice)から天気情報を取ってきて今日、明日、明後日の天気情報を表示するUIをUnityで制作してみました。

#JSONファイルの中身
上記のサイトでJSONファイルの中で今回使用するところを取り出すと以下の部分です。

```Java
{
   "forecasts":
   [
      {
       "dateLabel":"\u4eca\u65e5",
       "telop":"\u66c7\u6642\u3005\u96e8",
      },
      {
       "dateLabel":"\u660e\u65e5",
       "telop":"\u6674\u306e\u3061\u96e8",
      },
      {
       "dateLabel":"\u660e\u5f8c\u65e5",
       "telop":"\u66c7\u6642\u3005\u96e8",
      }
   ]
}
```
#JSONファイルをUnityで取得
今回はJSONUtilityを使ってJSONファイルを取得する予定なので、JSONファイルの構造をスクリプト内で定義する必要があります。
Itemという名前は適当につけたものなのであしからず。

```C#:GetWether.cs

	[Serializable]
	public class Item{
		public forecasts forecasts;
	}

	[Serializable]
	public class forecasts{
		public string dateLabel;
		public string telop;
	}

```

JSONファイルを獲得し、そのファイルから成形したデータでインスタンスを生成する。
WWW (name)= new WWW(link);でリンク先のデータをダウンロードできます。
リンク先からnull値を返された時のためにコルーチンを使っていきます。
ダウンロードしたデータを使ってデータを成形し、それらをUnity上のオブジェクトにアタッチしましょう。

```C#:GetWeather.cs

	[SerializeField]
	public GameObject NodePrefab;

public void Getinfo() {
		StartCoroutine ("GetWeatherInfo");		//コルーチンを開始
	}

	IEnumerator GetWeatherInfo(){

		WWW www =new WWW("http://weather.livedoor.com/forecast/webservice/json/v1?city=130010");
		yield return www;

		//エラーが出た時
		if(!string.IsNullOrEmpty(www.error)){
			Debug.LogError (string.Format ("Fail Whale!\n{0}", www.error));	//エラーを表示
			yield break;
		}

		string jsonText = www.text;

		Item item =JsonUtility.FromJson<Item>(jsonText);

		for (int i = 0; i < 3; i++) {
			var node = Instantiate (NodePrefab, Content, false);
			var wn = node.GetComponent<WeatherNode> ();

			wn.dateLabel.text=item.forecasts[i].dateLabel;
			wn.telop.text = item.forecasts[i].telop;
		}
	}

```

インスタンス化するNodeにアタッチするスクリプトは以下。
dateLabelとtelopをUnityでアタッチする。

```c#:WheatherNode.cs
	[SerializeField]
	public Text dateLabel;

	[SerializeField]
	public Text telop;
```
こんな感じでやっていけばできると思います。

#まとめ
Qiita書くのそもそも初めてなんでレイアウトとか変だったらごめんなさい。
JSONを利用する方法はUnityではあんまり使うことはないのかも...とやってるうちに思ったりましたが何かの助けになれば幸いです。
obniz:AIロボットキットにカメラを搭載して遠隔操作した

#概要
先日クラウドファンディングで販売された
　　[obnizのAIロボットキット](https://obniz.io/products/ai_robot_kit)
が届きました。

そこで男子の夢である
「カメラがついたラジコンをモニタを見ながら遠隔操作する」
を試してみました。

技術的には大したことがありませんが、自宅に余っているスマホを利用して簡単に楽しめるものになっています。

#イメージ
下記のペアでモニタ、操作を行います。

モニタリング用
・iPad（モニタ用）→（LINEのテレビ電話で接続）→AIロボットに載せたスマホ１（カメラ用）

操作用
・スマホ２（AIロボットキット操作用）→obniz


![unnamed (13).jpg](https://qiita-image-store.s3.amazonaws.com/0/181708/9d03a136-4b97-d89c-5d7b-64745a2589b6.jpeg)
![DSC03250説明付き.jpg](https://qiita-image-store.s3.amazonaws.com/0/181708/6a34a3a7-92ac-f7df-dfae-af8377b368d4.jpeg)


#遊び方
キッチンのテーブルに操作台（操作用スマホ＋モニタリング用のiPad）をセットし、家中をAIロボットで探検をします。

息子＋その友達に渡したら大興奮で、ブロックでコースを作ったりと楽しんでいました。

AIロボットキットのポテンシャルを全く活用できていませんが、まずは第一弾の報告として頂きます。
SearchBarのカスタマイズ

#はじめに
今回はSearchBarの高さと、虫眼鏡の画像を変えていきたいと思います。

#目標物
![Simulator Screen Shot - iPhone7(12.1) - 2018-12-22 at 22.57.33.png](https://qiita-image-store.s3.amazonaws.com/0/221940/12b40004-e666-2c45-b19a-e0615863b5a0.png)
これを
![Simulator Screen Shot - iPhone7(12.1) - 2018-12-22 at 23.28.55.png](https://qiita-image-store.s3.amazonaws.com/0/221940/ad3ff075-23fd-869c-68fb-d1bef0c54e66.png)

こうしていきます。

#textfieldの高さ変更とtextfieldを角丸のやり方
textfieldの高さ変更とtextfieldを角丸にするコードです。

```Swift
class SearchBarCustomize: UISearchBar {
  
    // textfieldの背景色
    @IBInspectable var textFieldColor: UIColor = .white {
        didSet { textFieldUpdate() }
    }
    
    // textfieldの高さ変更
    @IBInspectable var textFieldHeight: CGFloat = 38 {
        didSet { textFieldUpdate() }
    }
    
    // textfieldを角丸に
    @IBInspectable var textFieldCornerDadius: CGFloat = 18 {
        didSet { textFieldUpdate() }
    }
    
    fileprivate func textFieldUpdate() {
        let image = UIImage.instantiate(size: CGSize(width: UIScreen.main.bounds.size.width, height: textFieldHeight), fillColor: textFieldColor, cornerRadius: textFieldCornerDadius)
        self.setSearchFieldBackgroundImage(image, for: .normal)
    }
}

extension UIImage {
    static func instantiate(size: CGSize, fillColor: UIColor, cornerRadius: CGFloat) -> UIImage? {
        let rect = CGRect(origin: CGPoint.zero, size: size)
        let path = UIBezierPath(roundedRect: rect, cornerRadius: cornerRadius)
        UIGraphicsBeginImageContextWithOptions(size, false, 0)
        fillColor.setFill()
        path.fill()
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
}
```
こうかくと、StoryBoardに
<img width="260" alt="スクリーンショット 2018-12-22 23.18.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/221940/bdd9c443-a328-3b79-bedf-e659bad9e122.png">
こういうのが現れます。
ここでtextfieldの高さや角丸の数値を決めていきます。今回は、textFieldColorを白、textFieldHeightを50、textFieldCornerDadiusを5にしました。

#虫眼鏡画像の変更
今回の画像は弊社会長のふたばです。([この画像です](https://twitter.com/qnote_inc/status/1061462735798460416))

```Swift
override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        let barImageView = searchBar.value(forKey: "_background") as! UIImageView
        barImageView.removeFromSuperview()
        searchBar.backgroundColor = UIColor.clear       
        for subView in searchBar.subviews  {
            for secondSubView in subView.subviews  {
                if let textField = secondSubView as? UITextField {
                    if let glassIconView = textField.leftView as? UIImageView {
                        glassIconView.image = UIImage(named: "futaba")
                        glassIconView.frame.size = CGSize(width: 40, height: 40)
                    }
                }
            }
        }
    }
```

これで完成です！！

#参考サイト
[Swift4 IB上で色やTextFieldの高さのカスタマイズができるUISearchBarの実装
](https://qiita.com/KikurageChan/items/f5ead86bfcb3a81595dc)

#最後に
最後までご覧頂きありがとうございました！
「nodist npm match」で「Failed to read response from (略)」エラーになる件についてのメモ

# 問題

2018年12月22日現在、久々に JavaScript の復習をしようと思って、Node 10 とそれに合致する npm をインストールしようと、Nodist v0.8.8 から「nodist npm match」を実行したら以下のエラーが発生した。

```
> nodist add 10
(略)
> nodist global 10
(略)
> nodist npm match
npm match
stream.js:74
      throw er; // Unhandled stream error in pipe.
      ^

Error: Failed to read response from https://codeload.github.com/npm/npm/tar.gz/v6.4.1
    at Request.<anonymous> (C:\Program Files (x86)\Nodist\lib\build.js:110:25)
    at emitOne (events.js:96:13)
    at Request.emit (events.js:188:7)
    at Request.onRequestResponse (C:\Program Files (x86)\Nodist\node_modules\request\request.js:954:10)
    at emitOne (events.js:96:13)
    at ClientRequest.emit (events.js:188:7)
    at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:473:21)
    at HTTPParser.parserOnHeadersComplete (_http_common.js:99:23)
    at TLSSocket.socketOnData (_http_client.js:362:20)
    at emitOne (events.js:96:13)
    at TLSSocket.emit (events.js:188:7)
    at readableAddChunk (_stream_readable.js:176:18)
    at TLSSocket.Readable.push (_stream_readable.js:134:10)
    at TLSWrap.onread (net.js:551:20)
```

# 暫定対応

Issues [#219](https://github.com/nullivex/nodist/issues/219)をみたところ、どうやら npm の GitHub リポジトリのパスが [npm/npm](https://github.com/npm/npm) から [npm/cli](https://github.com/npm/cli) に変わり、[前者の方の Releases](https://github.com/npm/npm/releases) には v6.1.0 までしかないのが原因とのこと。

修正のための PR はすでに出されていた。

* [fixes #219 - installs well npm higher than 6.1.x #221](https://github.com/nullivex/nodist/pull/221)

このPR の修正内容にしたがって、C:\Program Files (x86)\Nodist\lib\npm.js を修正して事象の回避に成功した。

# 恒久対応

前述の PR のマージ & 新バージョンのリリースを待つ。
ただ、2018年12月22日現在、Nodist の master の最後のコミットが 2017年6月9日なので、Nodist のメンテナンスが止まっている可能性がある・・・。

## 追記(2018/12/29)

結局、僕は [nvm-windows](https://github.com/coreybutler/nvm-windows) を使うことにしました。

# 補足

事象発生後は以下の空フォルダが残り、以降は「nodist npm match」は成功する。
だが、その状態で「npm -v」を実行しても以下のエラーとなる。

```
C:\Users\teru1>npm -v
internal/modules/cjs/loader.js:583
    throw err;
    ^

Error: Cannot find module 'C:\Program Files (x86)\Nodist\npmv\6.4.1\bin\npm-cli.js'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:581:15)
    at Function.Module._load (internal/modules/cjs/loader.js:507:25)
    at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
    at startup (internal/bootstrap/node.js:282:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3)
```

この挙動は事象発生後に以下のパスに空のフォルダが作成されているのが原因であると推測される。

C:\Program Files (x86)\Nodist\npmv\(6.1.0 より後のバージョン)

私の場合は、暫定対応実施前に念のために削除した。
Pythonでリッジ回帰を実装

## 目次
- リッジ回帰とは
- リッジ回帰の実装
- 制約の強さを変化させる
- おまけ

## 参考文献
- [Pythonではじめる機械学習](https://www.oreilly.co.jp/books/9784873117980/)

## リッジ回帰とは
リッジ回帰は、線形モデルによる回帰の一つ。

### 通常最小二乗法と同じ点
- 予測に用いられる式

### 通常最小二乗法との異なる点
- 係数($w$)は、訓点データへの予測だけでなく、他の制約へも最適化する
- 個々の特徴量の影響度を小さくしたいため、正則化をする

### 正則化とは
正則化とは、過剰適合(過学習)を防ぐために、モデルが複雑になりすぎないように制約すること。

下の図でいうと、正則化をすることで、左に移動する。

![width=70](https://qiita-image-store.s3.amazonaws.com/0/185039/f889a769-6e6c-a3b8-27a9-5da761d929ae.png)


リッジ回帰では、**L2正則化**が用いられる。


### 準備

```
$ pip install scikit-learn
$ pip install mglearn
```

## 実装

```python
import mglearn
from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split

X, y = mglearn.datasets.load_extended_boston()
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

ridge = Ridge().fit(X_train, y_train)
print(f"training dataに対しての精度: {ridge.score(X_train, y_train):.2}")
print(f"test set scoreに対しての精度: {ridge.score(X_test, y_test):.2f}")
# => training dataに対しての精度: 0.89
# => test set scoreに対しての精度: 0.75
```

### ちなみに同じでデータセットで線形回帰(通常最小二乗法)

```python
from sklearn.linear_model import LinearRegression

X, y = mglearn.datasets.load_extended_boston()
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
lr = LinearRegression().fit(X_train, y_train)
print(f"training dataに対しての精度: {lr.score(X_train, y_train):.2}")
print(f"test dataに対しての精度: {lr.score(X_test, y_test):.2}")
# => training dataに対しての精度: 0.95
# => test dataに対しての精度: 0.61
```

### 考察
- リッジ回帰の方がtraining dataへの精度が**低い**
- リッジ回帰の方がtest dataへの精度が**高い**
- 過剰適合を防ぎ、モデルの複雑さを軽減できている
    - 予想通り、上の図の左側に遷移したといえる

僕らが目指すのは、test dataに対する精度なので、**リッジ回帰の方が良い**といえる。

## 制約の強さを変化させる
上のリッジ回帰の実装では、正則化の強さは、デフォルト値のままである。
正則化の強弱、つまり、モデルの複雑さは、**alpha**の値を変化させることにより、僕ら(モデルを構築する側)が決められる。

- alphaを増やす　-> 正則化が強くなる -> モデルは簡潔になる
- alphaを減らす　-> 正則化が弱くなる -> モデルは複雑になる

### alphaを増やす
「alpha=10」にする。

```python
ridge10 = Ridge(alpha=10).fit(X_train, y_train)
print(f"training dataに対しての精度: {ridge10.score(X_train, y_train):.2}")
print(f"test set scoreに対しての精度: {ridge10.score(X_test, y_test):.2f}")
# => training dataに対しての精度: 0.79
# => test set scoreに対しての精度: 0.64
```

#### 考察
仮説通り、上の図の左側に遷移し、おそらく「スイートスポット」を超えて、精度が下がった。

### aplhaを減らす
「alpha=0.01」にする。

```python
ridge01 = Ridge(alpha=0.1).fit(X_train, y_train)
print(f"training dataに対しての精度: {ridge01.score(X_train, y_train):.2}")
print(f"test set scoreに対しての精度: {ridge01.score(X_test, y_test):.2f}")
# => training dataに対しての精度: 0.93
# => test set scoreに対しての精度: 0.77
```

#### 考察
仮説通り、上の図の右側に遷移し、おそらく「alpha=1.0」の際より「スイートスポット」に近づき、精度は向上した。
alphaパラメータのモデルへの影響を定量的に知るには、alphaを変化させて、それらのモデルの coef_ 属性を確認するとよいだろう。

だが、本記事ではここまでで、終了して、それらの内容は参考文献で学習してみてください。

## おまけ
分析結果とグラフとの対応を確認しながら学習すると、理解度が深まると思う。参考書にグラフが出てきた際は、その解説を読む前に、そのグラフを自分なりに読み解いてみると良いかもしれません。

次の記事では、L1正則化を使う**Lasso**を書きます。