OmniAICreator/Qiita-1.07M huggingface dataset:
pythonでクラスオブジェクトをコピーすることはできない

当たり前と言えば当たり前の話なのですが…

```python:
In [1]: class A:
   ...:     pass
   ...: 

In [2]: a1 = A(); a2 = A(); a3 = A()

In [3]: print(id(a1), id(a2), id(a3))
4420780664 4420780776 4420781896
```

普通にオブジェクトを３つ生成すると、このように区別して生成されます。

pythonだと、クラスすらオブジェクトなのでひょとしてA自体コピーすることができる？と思ってcopyモジュールを使ってやってみました。

```python:
In [4]: import copy

In [5]: ac1 = A; ac2 = copy.copy(A); ac3 = copy.copy(A)

In [6]: print(id(ac1), id(ac2), id(ac3))
140280656452216 140280656452216 140280656452216

In [7]: ac1 = A; ac2 = copy.deepcopy(A); ac3 = copy.deepcopy(A)

In [8]: print(id(ac1), id(ac2), id(ac3))
140280656452216 140280656452216 140280656452216
```

ご覧のとおり、Aは１つしか生成できないようです。言語仕様としてはこれで全く正しいと感じました。
PeerCast プログラミング配信 Advent Calendar 2017 16日目

人工配信者用のdockerイメージを作ります。
（配信で起きたことをおおよよ順番に書きます）

# 配信スタート
主な構成は、
基本的な画像処理関係をopencvで
機械学習はtensorflowで
言語はpython3で(python2は入れない)

実行用と開発用を二つ（後者は前者からつくる）
開発用にはtmuxとかいれて・・・

# CUDAのバージョンがホストとあわなくて転ける
hostのCUDAのバージョンが古くてビルドし直し・・・

# 設定ファイルをホストとある程度リンクさせる
_homeをdockerが/home/developerと思うようにします。
dockerでマウントしたものがシンボリックリンクだと読み込めなかったりするんですね。

# konsoleとtmuxの相性
なんかしらんけど、"q"がでる。https://github.com/neovim/neovim/issues/6778 に対処方あり

# tensorflowの要求するCUDNNのバージョンが6だった
もう一度ビルド。別にリンクで対処できるって話らしい。
本来ならtensorflow自体もビルドすべき
Google Homeに漫才させてみた


今日（2017-12-16），[ゆるゆるIT勉強会 feat.Reedex](https://yuru-it.connpass.com/event/69788/)にてLTさせてもらいました（はじめてのLTでした）．

LTは5分で細かいところまで話せなかったので，もう少し細かいところも含めてメモしておきます．

## スライド

[Google Homeに漫才させてみた // Speaker Deck](https://speakerdeck.com/ottijp/google-homeniman-cai-sasetemita)

## 動画

[![](http://i.ytimg.com/vi/X0hIpbhqoDs/mqdefault.jpg)](https://youtu.be/X0hIpbhqoDs)

## 構成

![](https://qiita-image-store.s3.amazonaws.com/0/35592/954d6f79-fc44-c51e-72bf-020c9d493760.png "Untitled Diagram.png")


人間が喋ると両方（Google HomeとGoogle Assistant App）が反応してしまうので，[google-home-notifier](https://github.com/noelportugal/google-home-notifier)でGoogle Homeに喋らせて，もう片方のアプリを起動する方法を考えました．

Actions on Googleでは２つのアプリを作り，それぞれに次のようなインテントを用意しました．

### アプリ１（ツッコミ担当）

* アプリ名: 相方
* インテント１（Default Welcome Intent）
  * User Says: ""
  * Text Response: "どうもどうもどうもー。Google Homeブラザーズですー！いやー最近スマートスピーカーが流行ってますねー。"
* インテント２
  * User Says: "流行ってますねー。うちもひとつ買いましたよ。"
  * Text Response:  "おー！何を買ったんですか？"
* インテント３
  * User Says: "Amazon Echo"
  * Text Response: "いやGoogle Homeじゃないんかーーーい！"
* インテント４
  * User Says: "どうも、ありがとうございましたー"
  * Text Response: "ありがとうございましたー"

### アプリ２（ボケ担当）

* アプリ名: 漫才
* インテント１（Default Welcome Intent）
  * User Says: ""
  * Text Response: "OK Google、相方につないで"
* インテント２
  * User Says: "わかりました。テストバージョンの相方です。"
  * Text Response: "どうもー"
* インテント３
  * User Says: "Google Homeブラザーズですー！いやー最近スマートスピーカーが流行ってますねー。"
  * Text Response: "流行ってますねー。うちもひとつ買いましたよ。"
* インテント４
  * User Says: "おー！何を買ったんですか？"
  * Text Response: "Amazon エコー"
* インテント５
  * User Says: "いやGoogle Homeじゃないんかーい！"
  * Text Response: "どうも、ありがとうございましたー"

アプリ２のインテント２と３は，アプリ１から「はい，テストバージョンの相方です（ピロン♪）」が自動的に入ってしまい，そこで１つの発話と認識されてしまうので，一旦「どうもー」と返しておきながら，アプリ１インテント１の途中からの発話をフックするトリックです．

シーケンスで表すと次のようになります．

![](https://qiita-image-store.s3.amazonaws.com/0/35592/6733951e-fdd2-74d9-a62f-b811d9b033f4.png "manzai-flow.png")

## node.jsのコード

はじめのトリガをかけるnodes.jsのコードは次のような感じです．

```javascript:index.js
var googlehome = require('google-home-notifier');

googlehome.device('Google Home', 'ja');
googlehome.ip('192.168.10.xxx');
googlehome.notify('オーケー、グーグル。漫才に繋いで', function(res) {
  console.log(res);
});
```
2011/03/24 CSSのdisplay:inline;はposition:absolute;の時効かないっていう例

昔書いた社内ブログ記事です。
※当時はブラウザがpalceholder属性に対応していませんでした。

---

どうも（ｐ・&omega;・ｑ）


入力ボックスにうっすらと説明が書かれているサイトってありますよね。
入力し始めると隠れてしまうアレです。

ウォーターマーク（透かし）っていう呼び方とかありますが。

![20110324_1.gif](https://qiita-image-store.s3.amazonaws.com/0/214263/ab6f17b8-d905-6e78-77a9-4817fdc75e50.gif)


今作っているサイトで <a href="http://plugins.jquery.com/project/updnWatermark" target="_blank">jquery.updnWatermark.js</a> プラグインを使って
見た目の調整をしていましたが、予想外のレンダリングをされてあれれと思いました。



こんなコードを jQuery で作成して
`<input>` の上に薄く表示してくれるやつなんですが、

```html:HTML
<span>　　　　　　　　　　　　　　　　　　
    <label>メールアドレス</label>
</span>
```

これを `show()` したときに場所がズレちゃってたのです。


まとめると、CSS の `display` と `absolute` が競合したときの仕様によるもの
だったんですが、ずいぶん前に読んだので挙動を忘れていたみたいです（&acute;д｀。）


なので読み直してメモ。

CSS における display, position, float プロパティの相互関係 - elm200 の日記
<a href="http://d.hatena.ne.jp/elm200/20080201/1201874740" target="_blank">http://d.hatena.ne.jp/elm200/20080201/1201874740</a>

+

そういえば jQuery の <a href="http://api.jquery.com/show/" target="_blank">`show()`</a> ですが、これはブロック要素に対する挙動と、
インライン要素に対する挙動が少し違うんですよ。

あえｒ？知ってました？（ｏ・&omega;・ｏ）

**2017/12/16 追記**
**jQueryのバージョンによって以下のデモの動きは異なりますが、**
**「仕様を知った上で `show()` や `hide()` を使ったほうがいい」**
**というのはいつのバージョンでも変わりませんネ。**

次の実験（？）の結果を見てみてください。

まず、ブロック要素 `<div>` と、インライン要素 `<span>` を用意します。

![20110324_2.gif](https://qiita-image-store.s3.amazonaws.com/0/214263/27a3951e-f313-5d58-8fa5-63e8bcaa54bf.gif)

これをいったん隠して再表示してみます。

ちちんぷいぷい。

```JS:jQuery
$("div").hide().show();
$("span").hide().show();
```

![20110324_3.gif](https://qiita-image-store.s3.amazonaws.com/0/214263/ffa59550-9457-06f2-74aa-27e3cc492318.gif)

`<div>` 要素には `display: block;` が、`<span>` 要素には `display: inline;` が
追加されています。


jQuery の `hide()` は CSS 的には `display: none;` をしていますが、
`show()` の方は対象の要素によって二種類の作用があるんですね。



じゃあこっちはどうでしょう。


`position: absolute;` と `position: relative;` の `<span>` 要素を用意します。

![20110324_4.gif](https://qiita-image-store.s3.amazonaws.com/0/214263/2236d7fc-0687-9246-2fa2-d2f2884d2166.gif)

ちちんぷいぷい。

```JS:jQuery
$("span").hide().show();
```

![20110324_5.gif](https://qiita-image-store.s3.amazonaws.com/0/214263/36d0adbc-f7b2-e220-bcbb-d41a66f96852.gif)


あるぇ？

`<span>` なのに `show()` しても `display: inline;` にならないじゃないですか！

・・って思いました？（＠・&epsilon;・＠）＜ﾜﾀｼﾊｵﾓｲﾏｼﾀ


別にこれは jQuery のせいではないのです。
**`<span>` だけど、`hide()` する前からもともとブロック要素** になっているからです。


`show()` の仕様としては、ブロック要素はブロック要素に、
インライン要素はインライン要素に、ちゃんと元通りにしてくれるってことですね。



**なんでブロック要素になっていたかというと、position の指定がしてあったから！**
display の設定は position の設定に引っ張られちゃうんですね。


position が absolute のときは、display はもちろん、float なんかの設定も効きません。
強制的に float 無しの ブロック要素 になってしまいます。

display を自由に変えられるのは、position が relative か static のときだけなのです。
（display: fixed; の場合も display: absolute; と同じです。）




つまり、冒頭のコードでは、間違ってこうやっちゃっていたのでした。

```html:HTML
<span style="position: absolute;">
    <label style="position: relative;">メールアドレス</label>
</span>
```


正しくはこうですね。

```html:HTML
    <label style="position: absolute;">メールアドレス</label>
```



以上でした。

さー仕事に戻ろー。
Retrofit 2 で何故か404が帰ってくる時のトラブルシューティング

この記事は [株式会社Y's アドベントカレンダー](https://qiita.com/advent-calendar/2017/ysinc)  14日目の記事になります。

# 概要
Retrofit2 あたりでつまづくの悲しかったので、トラブルシューティング書きました。
こんなところで、みなさんには躓いて欲しくない。
そんな切なる願いを持って書きました。

いつも記事が薄い？
大丈夫、大丈夫。そんなことないよ、きっと。

## 何故か404が帰ってくる時
### リクエスト送る時のHTTPメソッドは、APIの仕様に準拠していますか？
GETやPOSTの指定を間違えていないか確認しましょう。

ダメな例

```kotlin
// ホントはGETなんだよ〜〜〜〜！
@POST("hoge/fuga")
fun getHoge(@Path("id") id: Int)
```

### エンドポイントの指定に間違いはありませんか？
typoしていないか、今一度深呼吸して確認しましょう。

ダメな例

```kotlin
// hoge/fuga が正解なのに〜〜
@GET("hoge/fga")
fun getHoge()
```

### エンドポイントの開始指定に、 / が含まれていませんか？
エンドポイントの指定は / から始めません。

ダメな例

```kotlin
// /から始まってたらまずい
@GET("/hoge/fuga")
fun getHoge()
```

## baseUrl正しく設定しているのにエラーが帰ってくる時
### baseUrl() は **/** で締めていますか？
/ で締めないと怒られます

ダメな例

```kotlin
val retrofit: Retrofit = Retrofit.Builder()
                    .baseUrl("http://fuga.hoge.co.jp")  // baseUrlは / で締めます
                    .addConverterFactory(MoshiConverterFactory.create())
                    .build()

```

## さいごに
何か増えたらまた書きます。おわり

次は、 @w_ide_Ysinc さんの記事です！お楽しみに！
最高のGit運用をするための9の方法

この資料は12/16(土)に行われた、[だいたい新卒エンジニア向け技術交流会 vol.13](https://dark.connpass.com/event/71294/)の発表資料です。
発表時から一部変更を加えています。

---
#今日は最高のGit運用の話をします

---
# これをすれば同僚から一目置かれる存在に

---
# 自己紹介なんていらない

---
# 早速行きましょう

---
# 1. メインブランチにコミット

---
# 2. 改行コードを混ぜ込む

---
CRLFとLFを混ぜ込んでみよう！
そうするとめっちゃ差分出るしコンフリクトするので治し甲斐があるなあってなるぞ！

![Git改行コード変更.png](https://qiita-image-store.s3.amazonaws.com/0/64362/93e06b48-f717-08b5-68ff-6796c2d2fdf1.png)

```diff
-namespace SampleMvc.Models
-{
-    public class Article
-    {
-        public int Id { get; set; }
-
-        public string Title { get; set; }
-
-        public string Content { get; set; }
-    }
-}
+namespace SampleMvc.Models^M
+{^M
+    public class Article^M
+    {^M
+        public int Id { get; set; }^M
+^M
+        public string Title { get; set; }^M
+^M
+        public string Content { get; set; }^M
+    }^M
+}^M
```
Windows環境だとcore.autocrlfとか有効にすれば全部LFになるけどそんなものは無視だ！

---
# 3. 文字コードを変更する

---

```diff
 namespace SampleMvc.Models
 {
     /// <summary>
-    /// 記事
+    /// <8B>L<8E><96>
     /// </summary>
     public class Article
     {
```

同僚は頭の中で文字コードを変換できるように成長するだろう。

---
# 4. コンフリクトしたらプッシュ

---
```diff
diff --git a/Article.cs b/Article.cs
index bd41686..93834b7 100644
--- a/Article.cs
+++ b/Article.cs
@@ -11,6 +11,10 @@ namespace SampleMvc.Models

         public string Content { get; set; }

+<<<<<<< HEAD
         public IEnumerable<string> RelatedLinks { get; set; }
+=======
+        public DateTime Created { get; set; }
+>>>>>>> conflict-b
     }
 }
```

HTMLに入れてあげればエンドユーザーにも届く！

---
# 5. マージコミットでファイル削除

---
```diff
diff --git a/Article.cs b/Article.cs
index 8bb591a..af62a0b 100644
--- a/Article.cs
+++ b/Article.cs
@@ -11,6 +11,10 @@ namespace SampleMvc.Models

         public string Content { get; set; }

+<<<<<<< HEAD
         public DateTime Created { get; set; }
+=======
+        public IEnumerable<string> RelatedLinks { get; set; }
+>>>>>>> conflict-a
     }
 }
```

```bash
$ git merge --no-ff conflict-b

$ git status --short
 M Article.cs
?? Tag.cs

$ git status --short
 M Article.cs
?? Tag.cs

$ git checkout -- .

$ git status --short
?? Tag.cs

$ rm Tag.cs

$ git commit
```
ファイルが消える上にgit log、--付きでも追えなくなるぞ！

---
# 6. 全く意味のないコミットメッセージ

---
# 7. ビルドできない状態のブランチのマージ

---
# 8. ビルドしたものを含める



---
# 9. 履歴書き換え、強制プッシュ

---
# そう

---
# これは遠いおとぎの国の現場の話なんだ…

---
# みんな

---
# こうなる前に仕組みと教育で防ごうな！！

---
# 完
ISUCON7本選問題を使って社内ISUCON環境を構築してみた

# 1. 前書き

先日のISUCON7予選敗退の悔しさをメンバーとともに引きずっているので、我々がISUCON7 Finalに参戦できたらどこまで行けたのかを検証するべく、競技用インスタンスを構築して社内ISUCONをやることになりました。
この記事では、競技用インスタンスを構築する際にやったこととつまったことを紹介します。
最後のほうで、今回作ったAnsible playbooksを紹介しているので、良ければ皆さんもISUCON7本選環境を構築してみてください。

# 2. 構築する環境

## 2-1. マシンスペックと構成台数

[レギュレーション](https://github.com/isucon/isucon7-final/blob/master/manual.pdf)を確認します。
最小構成は以下の通り
- ベンチマーカー兼ポータル：1台
- Webサーバ：3台
- DBサーバ：1台

各サーバのスペックは[本選出場チームのブログ](http://kujira16.hateblo.jp/entry/2017/11/27/211231)を参考に**CPU：2コア、メモリ：2GB**で用意するつもりでしたが、社内の手続きが間に合わず、Amazon EC2でm4.largeを選択しました。この時点で帯域は再現できず。
**[出題者の本選解説記事](http://isucon.net/archives/51187977.html)を読むとCPU：3コアとも読み取れる記述があったので詳しく知りたい。**

今回は4チーム参加ということで、インスタンス16台＋ポータル1台を用意することになりました。
17台の構築を手でやるのは非常に面倒なので、オーケストレーションを[Terraform](https://www.terraform.io/)、プロビジョニングを[Ansible](https://www.ansible.com)で行う・・・つもりでしたが、最終的にAnsibleでWeb+DBサーバを構築したあと、AMIを作って16台増設しました。

## 2-2. OS

[さくらインターネット](https://www.sakura.ad.jp/)さんが協賛なので、さくらのクラウドで選択できるUbuntuの最新バージョンではないかという推測のもと、**Ubuntu Server 16.04.3 LTS 64bit**を選択しています。

# 3. ハマったこと

おそらくここが気になっている人が多いと思うので、先に書いておきます。
ちなみに、1VMで構築する分には、[GitHubに公開されているリポジトリ](https://github.com/isucon/isucon7-final)のREADMEに沿って準備するだけでよく、特につまるところはありませんでした。

## ▼各クラウドサービスのサービス制限により必要台数インスタンスを用意できない・・・。

普段社内で利用しているIDCFクラウド, AWSで環境構築を検討しましたが、準備を前日に行ったこともあり、必要台数確保できないかも・・・と非常に焦りました。
大量にインスタンスを立てる場合は、サービス制限にかからないかを事前に調べて、上限解放をリクエストしておく必要があります。

## ▼Ubuntu 16.04でAnsible playbooksが動かない・・・。

こういうメッセージが出ます。
`"/usr/bin/python: not found"`

[こちらのIssue(Ubuntu 16.04 requires Python 2)](https://github.com/plone/ansible-playbook/issues/82)を見て解消しました。
Ansible playbooksを実行する際に、Python2入ってないよ！と怒られた模様。
以下のコマンドをpre_tasksで実行することにより解消しました。

```shell-session
$ sudo apt install python-simplejson
```

## ▼portalでmakeできない・・・。

必要なパッケージが見つからないと怒られる。

```shell-session
$ cd ~/portal
$ make
GOPATH=`pwd`:`pwd`/vendor go install ./src/cmd/...
src/cmd/import/import.go:16:2: cannot find package "github.com/go-sql-driver/mysql" in any of:
        /home/isucon/local/go/src/github.com/go-sql-driver/mysql (from $GOROOT)
        /home/isucon/portal/src/github.com/go-sql-driver/mysql (from $GOPATH)
        /home/isucon/portal/vendor/src/github.com/go-sql-driver/mysql
...
```

これはgbの使い方を知らなかっただけ。
`~/portal/vendor/manifest`というファイルがあるので、以下のコマンドを実行すると必要なパッケージが入るので、先ほどのコマンドも通るようになります。

```shell-session
$ gb vendor restore
```

# 4. Ansible playbooks

今回作成したPlaybookをGitHubに公開しました。
https://github.com/ihsiek-s/isucon7-final-ansible

Goの参考実装をmakeするときにこけるので、07_build_webapp.ymlはコメントアウトしてます。
わかる人、教えてください・・・。

# 5. おわりに

社内ISUCONの運営と競技両方に参加しましたが、アドバンテージを得ないようにレギュレーションを読んではいけないという制約の中で準備をするのはすごく大変でした。
中途半端にアドバンテージを得てしまったり、競技開始後に運営で手をとられたりといろいろ問題があるので、運営と競技者はちゃんと線引きしたほうがいいというのが、今回得た教訓です。
CesiumのVRモード

# はじめに
今回はVRモードの表示方法について調査した結果を記載します。

![vr_game_mother.png](https://qiita-image-store.s3.amazonaws.com/0/53918/b9b609b8-c941-983e-81dd-406fff0e334e.png)

　VRモードとは、専用器具を付けて両眼で立体視を可能にし、首振りに追従して視点を変更したりする表示を指します。
　近年では、ゲーム機として[Playstation VR](http://www.jp.playstation.com/psvr/)が有名ですし、都心の家電量販店に行けばVRゴーグルというスマートフォンを中に入れて使う器具は、2000円程度で買えるようになりました。

# 先行事例 
　日本語の資料としては、FireFoxのWebVR拡張機能を用いたものが紹介されています。

- [Cesium + Firefox の VR モード] (https://www.kunihikokaneko.com/dblab/3dmap/cesiumvr.html) 福山大学金子邦彦研究室

 上記の方法を試そうとしたのですが、最新のFireFox（57.0.1）ではWebVRは特別のプラグインを入れずにも[WebVRを体験](https://mozvr.com/)できるようです。

 githubに公開されているCesiumのVRプラグインの[デモサイト](https://github.com/NICTA/cesium-vr)をFireFoxで閲覧しても動作しない状況です。

<img width="571" alt="スクリーンショット 2017-12-16 17.58.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/53918/c592ff74-6e55-cfd9-152e-38c2572ea1c3.png">

# Cesium VRモード対応
Cesiumでは、バージョン1.18(2016年2月1日)からVRモードに対応しているようです。
https://cesium.com/blog/2016/02/01/cesium-version-1.18-released/

［原文］
>Added VRButton which is a simple, single-button widget that toggles VR mode. Cardboard for mobile is supported. More VR devices will be supported when the WebVR API is more stable.

[ Google 翻訳 ]
> VRモードをトグルするシンプルなシングルボタンウィジェットであるVRButtonが追加されました。モバイル用の段ボールがサポートされています。 WebVR APIがより安定していると、より多くのVRデバイスがサポートされます。

# VRBottunの設置

 Cesiumのビューワ初期化時に、VRBottunを有効にするだけで、地図の右下にVRボタンを設置することが出来ます。

```js
var viewer = new Cesium.Viewer('cesiumContainer', {
    vrButton : true //VRボタン有効化
});

```

サンプルコード
http://jsdo.it/tkama/UWYD

サンプルコードを掲載したサイトでは、スマートフォン表示モードがありまして、ボタンを見つけることが出来ます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/53918/a2aa65cb-b2c9-fc9b-8184-5e24c8d47fac.png" width=50%>

赤枠のボタンがVRBottonです！

## VRモード表示例
<img width="650px"  src="https://qiita-image-store.s3.amazonaws.com/0/53918/db6fa6a7-355c-d5a4-1384-2752f9a51c08.png">

# 表示動作
　手元にあるAndroid端末で動作確認した所、Chrome、FireFoxどちらでも表示に対応しているようです。

| ブラウザ       |   VR表示 |    首振りによる視点変化    |
|:-------------|:-------:|:------------------:|
| Chrome       |      ◯ |       ◯       |
| FireFox      |     ◯|       ◯       |

　視点変更はスマホを動かくだけで実現するのですが、拡大・縮小は何らかの入力が必要になりますので、マウス等の入力インターフェースがあると便利だと思います。

# 終わりに

現在のCesiumではVRモードに対応しているため、簡単に実現することができました。心残りは、Oculus RiftのようなPCを接続した専用端末での表示や、PSVRでの表示が未検証であることです。

ご興味がある方は、挑戦してみて下さい！
手軽にプログラミングができるオンライン実行環境

#はじめに
クラウド型IDEについては紹介記事をよく見かけるのですが、開発とは別に手軽にプログラミングの書いて実行するオンライン実行環境についての記事は（私が）あまり見かけないので以前使っていたものをここで紹介したいと思います。
オンライン実行環境はプログラミング初心者や新しい言語をお試ししたいという人には手軽で嬉しいツールだ思います。

今回は
* ideone.com
* paiza.IO
の2つを紹介したいと思います。

# ideone.com
サイトURL [https://ideone.com](https://ideone.com)

[特徴]
・対応言語数 **60言語以上**
　  一覧：[https://ideone.com/faq](https://ideone.com/faq) 下から２番目の質問
・日本語非対応（外国語は複数対応
・既存ファイルのアップロードが出来ない（copy&pasteでどうぞ...
・コンパイルは単一ファイルごと
・少し広告が多め

使い方は簡単で、コードを書いたら言語を選択して「Run」ボタンで実行。無限ループに陥るようなコードを手動で停止させることができないが、タイムアウト時間は5秒/15秒が設定可能です。
対応言語はとても多いのですが、ファイルのアップロードが出来ないのは残念ポイント。


#paiza.IO

サイトURL [https://paiza.io/ja](https://paiza.io/ja)

[特徴]
・対応言語数 **24言語以上**
   一覧：[https://paiza.io/help](https://paiza.io/help)
・日本語対応（英語に切り替え可能
・コーディングエリアが広い
・複数ファイルを同時コンパイル可能
・広告は表示されない
・形態素解析エンジンMecabが使える←
・リアルタイムの共同編集（実験機能）

こちらも使い方は簡単で、言語を選択してからコードを書いて「実行」ボタンで実行。タイムアウト時間は2秒と短め。
個人的に注目しているのは「リアルタイムの共同編集」。実験機能の段階ですが、リアルタイム編集機能やチャット機能・通話機能などもあり、遠くの人とも共同でコーディングができるらしい。（実際に試していませんが

#最後に
紹介したどちらのサービスも、サイト登録（無料）をすることで自分が以前書いたコードの閲覧・編集をすることができます。また、コードの公開範囲設定もでき、privateでもURLによって共有が可能です。
企業のプログラミング勉強会等にもこのようなオンライン実行環境が使われているらしいので知っておいても損はないかなと思います。


#ひとりごと
Qiita初回投稿は画像アップロード制限で苦しむ。味気のない白黒画面が出来上がりました
当初予定していたmcmcはもうしばらくお待ちください...
CloudFormationでRDSを更新する時の注意

# 背景
`CloudFormation`で管理している`MariaDB`インスタンスのパブリックアクセスを変更したかったのですが
スタックファイル(json)から更新すると以下のエラーでハマりました。

```text
CloudFormation cannot update a stack when a custom-named resource requires replacing. Rename (DBインスタンス名) and update the stack again.
```

[公式ドキュメント](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-rds-database-instance.html#DBInstanceIdentifier)を読んで見ると
>InstanceIdentifier
>重要
>名前を指定すると、このリソースの置換が必要な更新はできません。中断が不要であるか、一定の中断が必要な更新であれば、行うことができます。リソースを置き換える必要がある場合は、新しい名前を指定します。


`CloudFormation`で、`DBInstanceのInstanceIdentifier`(DBインスタンス名)を設定していると置換ができないのです。。。。

それでは逆に名前を指定しないとどうなるかと言うと

>DB インスタンスの名前。名前を指定すると、AWS CloudFormation は名前を小文字に変換します。名前を指定しないと、AWS CloudFormation は一意の物理 ID を生成し、その ID を DB インスタンス名として使用します。詳細については、「Name タイプ」を参照してください。

AWSでIDを生成してくれ、それがDBインスタンス名になりますが、人間にとってわかりやすい名前を指定できないので管理はしづらくなりそうです。

# 名前を指定している時はどうするのか？

例えば以下のような既存のスタックファイル(json)でDBの名前を指定している場合で、その名前を再利用するためには

```json
{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Description" : "rds stack",
  "Resources" : {
    "DevRDSDBInstance" : {
      "Type" : "AWS::RDS::DBInstance",
      "Properties" : {
        "DBInstanceIdentifier":"sample-instance01",
        "DBSubnetGroupName" : "sample-rds-subnet-group",
        "AvailabilityZone" : "ap-northeast-1a",
        "AllocatedStorage" : "50",
        "DBInstanceClass" : "db.t2.medium",
        "PubliclyAccessible": "true",
        "Engine" : "MariaDB",
        "DBParameterGroupName": "sample-rds-parameter-group",
        "MasterUsername" : "sample-master-user",
        "MasterUserPassword" : "sample-master-password",
        "DBSnapshotIdentifier" :"snapshot-sample-instance01",
        "Tags" : [ { "Key" : "Name", "Value" : "sample-Instance01-rds01" } ],
        "VPCSecurityGroups": "sg-sample"
      }
    }
  }
}
```

#### 1.更新するDBインスタンスのスナップショットをとる

上記のスタックファイルでは例では`snapshot-sample-instance01`


![無題のプレゼンテーション (4).png](https://qiita-image-store.s3.amazonaws.com/0/159733/4373fe60-d1b1-8a5d-4b94-15b1d17b6505.png)

#### 2.別の名前に変更し、CloudFormationを反映

`CloudFormation`ファイル(json)の`DBInstanceIdentifier`で指定している名前を
`sample-instance02`などに変更し、`DBSnapshotIdentifier`を1で取得したスタップの名前にする。

![無題のプレゼンテーション (5).png](https://qiita-image-store.s3.amazonaws.com/0/159733/b4dd0461-0d45-92a4-a9cc-21ad5e9581b1.png)

スタックを更新すると、AWSが作成したインスタンス名のDBインスタンスができ、もともと設定していた`sample-instance01`のDBインスタンスが削除される。

#### 3.元の名前に戻し、CloudFormationを反映

再度CloudFormationのjsonファイルに、`DBInstanceIdentifier`を追加し、名前(`sample-instance01`)を指定する。

![無題のプレゼンテーション (7).png](https://qiita-image-store.s3.amazonaws.com/0/159733/680b5ecc-f97c-3386-18ad-d448159df744.png)

名前を指定したDBインスタンスが生成され、2で作成されたDBインスタンスが削除される


というような作業になり、かなり面倒です。。。。

awsのコンソール画面からだと、パブリックアクセスの変更は特にダウンタイムもなく更新されるのに、
パブリックアクセスやオプショングループの変更など、一般的に再起動が発生しそうな変更を`CloudFormation`で行うと、DBインスタンスの置換が必要に大がかりな作業になります。

## 終わりに
こういった事情を考慮するとDBインスタンスの名前は特に設定しないで、DBインスタンスにDNSを設定して、RDSのエンドポイントが変わっても管理するのが楽そうですね。
名前空間の汚染を防ぐためのモジュール化

中規模のアプリケーションをJavaScriptでプログラミングすると思わぬところで変数名や関数名の重複が発生してトラブルになります。

グローバルスコープの汚染を防ぐには色々方法があり、変数のスコープ等、色々と理解すべきことは多いのですが、即時関数の中にメソッドを定義することで解決する方法をメモしておきます。

```JavaScript
var NameSpace = NameSpace || {}; //グローバル変数を生成

//即時関数を作成してその中に関数をまとめる
(function(_) {
    var name = "Qiita";
    function getName() {
        return name;
    }
    _.displayName = function() {
        console.log(getName());
    };
    _.setName = function(x) {
        name = x;
    };
})(NameSpace); //即時関数に名前空間用のグローバル変数を渡す

//利用側
NameSpace.displayName(); // Qiitaと表示
NameSpace.setName("New Qiita");
NameSpace.displayName(); // New Qiitaと表示
```
俺様サーバー構築記 - 基本方針

# HDDのフォーマット

[ArchLinux インストール覚書](https://qiita.com/katz_engineer/items/f032a24cb273c4eb6669)から始まる一連のシリーズとして、自宅サーバの構築とその過程を綴ってきました。そこではちょっと珍しい試みとしてHDDをbtrfsでフォーマットし、その上にArchLinuxをインストールしてみました。btrfsを選んだのは、現状でもそれなりに安定していて、今後の発展が楽しみだ、と判断したからです。

ところが今年の8月くらいでしょうか、Red Hat がbtrfsから手を引く？とかいうニュースがありました。どうもbtrfsには逆風が吹いているようです。こうなると、私もサーバ構築に当たってはbtrfsはやめた方がいいのかなぁ…と考えてしまった次第です。ろくすっぽ稼働どころか構築も進んでいませんし、引き返すなら今の内かと。

かと言って普通にlvmでは面白くありません。ストレージのsnapshot機能は必須と考えるのでext4とかxfsとかもイヤです。

というわけで、ZFS on Linux を使ってみる事にしました。手順が面倒臭くなるので避けてたんですが、こうなったら仕方がありません。手間を掛けます。頑張ります。我が家のNASはFreeNASでして、ZFSで統一しとけば面白い連携も実験できるかも知れませんしね。

余談ですが、何というか、ライセンス問題に阻まれて優秀な技術を自由に手軽に使えないこの状況は、どうにかなりませんかね。ストールマンさんはZoLに関しては自己責任でいいんじゃね？発言をされているようですが、Oracleの沈黙が不気味です。まぁ、会社が発言しちゃうと責任問題が付いて回るので、現状を黙認しようとしているだけだ、と考えたい所ではありますが…

# マシン環境

2つ試みる事にしました。

0. VirtualBox に UEFI の設定で仮想マシンを構成、ここにインストール
0. 今まで構築してきた物理マシン Inspiron 530s （こいつはBIOS）に再インストール

前者は、UEFI対応やZFS on Linuxインストールの手順確認が目的です。自宅サーバとしては後者が本命です。

# やりたい事

[ArchLinux インストール覚書](https://qiita.com/katz_engineer/items/f032a24cb273c4eb6669)に書いた漠然とした夢に基づいて色々と動いてきた経験を踏まえて、今後やりたい事を挙げてみます。

- FreeNASとはiSCSIではなくてNFSでストレージを共有
- [超軽量仮想環境 cage](https://qiita.com/katz_engineer/items/d0404a896f2faa267fb8)
をZFS上に構築
- 家庭内ネットワーク環境の整備: DNSサーバ、メールサーバ、HTTPサーバ
- データの自動バックアップシステムの確立
- WebDAVサーバの構築
- CalDAVサーバの構築
- 個人的なメモ書き共有システムの開発
- メモ書きシステムの充実
- [超軽量仮想環境 cage](https://qiita.com/katz_engineer/items/d0404a896f2faa267fb8)の充実

その後は当分、最後の2つの充実ですかね。その管理もメモ書きシステムにお任せにしたい。

# やりたい事・2020/07/11

もう3年も経ってまだサーバーが確立してないとか、何の冗談ですかね…:expressionless:

一応、下記の順番で導入したい（Gitを除く）

- バージョン管理
    - 基本はSubversion
    - 私はgit嫌いなのでなるべく使いたくないが、GitLabは使い勝手がいいのでもしかしたら入れるかも
- Subversionで```/etc```管理
- DNSとして軽量と噂のUnboundを導入
- アカウント管理関係の整備
    - Kerberosでユーザー認証を中央管理
    - LDAPでログイン情報を中央管理
    - SSSDでオフライン認証
- DHCPサーバ冗長化
- メール
    - DovecotでIMAPサーバ（sendmailの時は、maildirの関係で先にDovecotを立てた方が良さそうな印象だったが、postfixだとどうだろう）
    - postfixでメール送信サーバ（sendmailはもういいかな、やはり世間標準の方がいいような気がしてきた）
- httpサーバ
    - nginx
    - WebDAV
- RDBサーバ
    - PostgreSQL（MySQLよりPostgreSQLを弄ってみたい、SQL標準に正しく準拠してるようだし）
- CalDAVサーバ、何を使うかは現在検討中

ここまで来たらDockerを入れたい、コンテナを利用したデプロイシステムの研究！

で、Dockerの何たるかを把握したら、自作の[超軽量仮想環境 cage](https://qiita.com/katz_engineer/items/d0404a896f2faa267fb8)
をZFS上に構築ですな。
Android/Windows開発

#概要
こちらはC++ ([DXライブラリ](http://dxlib.o.oo7.jp/))を使って、簡単にAndroid・Windows両方で動くコードを書く記事です。
以前、記事を書いた["３時間で作った自作(超クソ)スマホゲーム"](https://qiita.com/Gaccho/items/a7f1d75be7eb3e822b2c)はこれを応用してWindowsでもAndroidでも動かせるようにしています。

DXライブラリは[こちら](http://dxlib.o.oo7.jp/dxdload.html)からダウンロードできます。
何か不備がありましたら指摘していただければ幸いです。

#コード
白い円を表示するプログラムです。

```cpp:Main.cpp

#include "Dxlib.h"

#ifdef __ANDROID__
//Android版のコンパイルだったら android_main
int android_main() 
#else
//Windows版のコンパイルだったら WinMain
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
#endif
{
	//背景を灰色にする
	if (SetBackgroundColor(127, 127, 127)) return -1; 

	//logの出力を無しにする
	if (SetOutApplicationLogValidFlag(FALSE)) return -1; 

#ifndef __ANDROID__
	// Windows版のコンパイルだったら ChangeWindowMode を実行する
	if (ChangeWindowMode(TRUE)) return -1; 

	//タイトル
	if (SetMainWindowText("Circle")) return -1;
#endif

	//ウィンドウサイズ
	if (SetGraphMode(600, 600, 32)) return -1; 

	//初期化処理
	if (DxLib_Init()) return -1; 

	//処理をここに書く

	//白い円を線画
	DrawCircle(300, 400, 100, GetColor(255, 255, 255), TRUE);

	WaitKey();

	//終了処理
	if (DxLib_End()) return -1;
	return 0;
}

```

#Windows

![1513416823507.jpg](https://qiita-image-store.s3.amazonaws.com/0/213065/b3ed1684-2283-ce80-cf6d-cee15c67272b.jpeg)


#Android

![andcir2.png](https://qiita-image-store.s3.amazonaws.com/0/213065/02777d15-5de2-4724-feca-5670e540f76e.png)

#さいごに
両方で動かせるプログラムが作れましたね！
このようなコードを書けば、WindowsとAndroid両方に対応したプログラムを簡単に作ることが出来ます。

[DXライブラリ](http://dxlib.o.oo7.jp/)の導入方法は、[ＤＸライブラリ置き場](http://dxlib.o.oo7.jp/)を参考にしてみてください。
最後までお読みいただきありがとうございました。

##ソースコードのライセンス

These codes are licensed under CC0.
[![CC0](https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/cc-zero.svg "CC0")](http://creativecommons.org/publicdomain/zero/1.0/deed.ja)

ソースコードは自由に使用してください。
LINEでログインしたら、LINE@のアカウントと友だちになるようにしてみた。

2017/11/22 に LINEログインとBotの自動リンク機能が一般公開されました。
このリリースによって、
LINEログイン時に、LINE@とのアカウントと自動的に友だちになることが出来るようになりました。

サクッと試してみましょう。


# LINE@の Channel 作成

まずは、LINE@の Channel を作成します。
LINE developers 左メニューから Messaging API 画面に行き、
『今すぐはじめよう』をクリックし、新規Channelを作成します。
Developer Trial・フリー というプランが選択できますが、
フリーでは、PUSH_MESSAGE のAPIが使用出来ないため、
テストする場合は、Developer Trial を選択しましょう。
※Developer Trial は プランの変更が出来ません。


# LINEログインの Channel 作成

続いて、LINEログインの Channel を作成します。
LINE developers 左メニューから LINEログイン 画面に行き、
『今すぐはじめよう』をクリックし、新規Channelを作成します。
プロバイダーは、リンクさせるLINE@のChannelと同様のものを選択します。


プロバイダーの画面が↓こんな感じになってると思います。

![2017-12-16_15h34_27.png](https://qiita-image-store.s3.amazonaws.com/0/18487/fb36ba22-f7ed-df7c-50e3-7586d255febc.png)


# LINEログインの設定

## リンクするボットを設定

LINEログインの Channel基本設定 よりリンクするボットを設定します。

![2017-12-16_15h49_46.png](https://qiita-image-store.s3.amazonaws.com/0/18487/059a01a4-8684-8684-b40a-c821470d0274.png)

## ログイン後にリダイレクトするURLを設定

LINEログインの アプリ設定 よりログイン後にリダイレクトするURLを設定します。
※URLは改行区切りで複数設定することが可能です。

![2017-12-16_17h18_08.png](https://qiita-image-store.s3.amazonaws.com/0/18487/844b304e-31fe-a857-ac4a-75b974bcc574.png)

ココまでで準備完了です。
早速 LINEでログインして LINE@のアカウントと友だち になってみましょう。


# 実際にログインして友だちになってみる

下記のようなURLへブラウザでアクセスします。

```
https://access.line.me/oauth2/v2.1/authorize?response_type=code&client_id={LINEログインのChannel ID}&redirect_uri={ログイン後にリダイレクトするURL}&state={ユニークな文字列}&scope=openid%20profile&prompt=consent&bot_prompt=normal
```

※{}内は、各自の環境に併せて設定して下さい。
※GETパラメータの詳細は、下記ドキュメントを御覧ください。
　[ウェブアプリにLINEログインを組み込む](https://developers.line.me/ja/docs/line-login/web/integrate-line-login/)

LINEのログイン画面が表示されます。

![2017-12-16_17h41_22.png](https://qiita-image-store.s3.amazonaws.com/0/18487/dea23838-e106-4030-7e70-56a5e7d45c85.png)

ログインすると、認証画面が表示されます。

![2017-12-16_17h43_44.png](https://qiita-image-store.s3.amazonaws.com/0/18487/19b5e9db-27ab-fbd4-f95c-b700d68b200b.png)

画面下部に、友だち追加のチェックボックスが表示されました。
チェックを入れて、『同意する』をクリックすると、
連携したLINE@のアカウントと友だちになれます。
※今のところ、友だち追加のチェックを必須にすることは、
　LINEログイン上では出来ないようです。
　チェックの仕方は後述します。

また、認証後、先程設定した{ログイン後にリダイレクトするURL}に、
リダイレクトされますが、
リダイレクトする際、付与された、GETパラメータ の code を使用し、

1. アクセストークンの発行
（[アクセストークンを発行する](https://developers.line.me/ja/docs/social-api/reference/#anchor-b1968b9d26c2324f25ec27e1b45985876d92a911)）

2. 1のレスポンス id_token を使用して、ユーザーIDを取得
（[IDトークン](https://developers.line.me/ja/docs/line-login/web/integrate-line-login/#id-tokens)）

3. 1のアクセストークンを使用して、LINE@と友だちがどうかをチェック
（[ボットとの友だち関係を取得する](https://developers.line.me/ja/docs/social-api/reference/#get-friendship-status)）

4. 友だちだった場合、2のユーザーID を使用し、LINE@ からメッセージを送る
（[プッシュメッセージを送る](https://developers.line.me/ja/docs/messaging-api/reference/#send-push-message)）

というような事が可能です。

また、LINE@ で友だちのユーザーにのみ公開するWEBコンテンツなども簡単に作成出来そうですね。

以上、サクッとやってみました。
D言語でSTM32F407DISCOVERYを動かした話

## D言語で動くのか

D言語は複数のコンパイラ実装が存在しており、リファレンスコンパイラであるDMDではできないのですが、コンパイラバックエンドがGCCのGDCやLLVMのLDCではCortex M4向けにバイナリを吐くことが可能です。今回はLDCを使って開発しました。

理屈の上ではできることはわかるのですが、実際に動くものを作るというのは大きな違いがあり、なかなか簡単にいかなかったりします。とはいえLDCはすでにThumb2 targetをサポートしていたので、特にコンパイラをいじるようなこともなくLチカまではすんなり書くことができた記憶があります。

ソースコードはGitHubで公開しています。

- https://github.com/kubo39/cortexm
- https://github.com/kubo39/stm32f407discovery
- https://github.com/kubo39/semihosting

## D言語だとなにが嬉しいのか・辛いのか

組み込みでよく使われる言語というとAssemblyやC言語になります。これらの言語と比較してという話でいうと、

- より強力な型チェックが存在すること
- テンプレートによる柔軟なメタプログラミングが可能
- UFCSでメソッドチェーンっぽく記述できる

といったあたりが個人的に嬉しいです。またffiがあるので(今回はしていないのですが)C言語のライブラリをD側から呼び出すことも可能です。

反面、エコシステムが充実していないこと(そもそも今回はスタートアップルーチンから全て自作しています)、組み込みプログラミングにおけるDの作法を意識せずに書いてしまうとかなりの確率でエラーになってしまうことなどがあります。

例えばD言語は全てのグローバル変数が普通に書いてしまうとTLS領域に置かれるのですが、これはLibcの `__tls_get_addr` 関数を使うようにコンパイラがコード生成するのでリンカエラーに遭遇してしまうでしょう。スタブを置いてもよいのですが、そもそも組み込みプログラミングでTLS領域を用意する必要は今の所ないので `__gshared` というキーワードを使って明示的に `.data` あるいは `.bss` 領域に配置されるようにしたほうがよいでしょう。こういった知識を暗黙に要求する場面が多々あるので、初心者からするとすこし敷居が高くなってしまうかもしれません。

## どのくらいできるのか

現状だとLチカ、割り込み、タイマー制御、arm semihostingでホスト側に書き込むといったことはできます。Lチカのプログラムは以下のように記述できます。そこそこシンプルに記述できているのではないでしょうか。

```d
import stm32f407discovery;

import stm32f407discovery.led;
import stm32f407discovery.timer;

@nogc:
nothrow:

extern (C) void main()
{
    pragma(LDC_never_inline);

    auto tim2 = powerOn!"TIM2"();
    initLED();

    tim2.pause();
    tim2.setPrescaler(7999);

    while (true)
    {
        auto ticks = 1000;
        foreach (led; LEDS)
        {
            led.on();
            tim2.delay(ticks);
            led.off();
            tim2.delay(ticks);
        }
    }
}

void delay(Tim* tim, uint ticks)
{
    tim.setAutoreload(ticks);
    tim.resume();

    while (!tim.isUpdated())
    {
    }
    tim.clearUpdateFlag();
}
```

## 他の言語の選択肢

もちろん、AssemblyとC言語以外の選択肢がD言語以外にないわけではありません。MicroPythonは有名ですし、Rustも http://blog.japaric.io/ のように活動的な人がいます。
マイナー言語でも [今回のアドベントカレンダーで紹介された](http://tattakaaqua.hatenablog.com/entry/2017/12/07/000000) Nimや、 さらにAdaで [書いている](https://github.com/mborko/stm32f4-ada) 人もいたりします。

個人的にはコンパイル型の静的型付き言語が好みなので、D言語・Rust・Nimあたりに頑張ってもらえたらなあ。。といった感じです。この中だとRustがユーザコミュニティやライブラリの充実度で一歩リードしているのではないでしょうか。

## 宣伝

C93にサークル参加して、今回の話をチュートリアル形式で進めるようなものを書いてます。興味があれば是非。

https://twitter.com/henteko07/status/930971088351141888
Lisp(Scheme)超絶入門備忘録1

#はじめに
　
Lisp経験者は読むだけ無駄です、悪しからず！！

以前からLisp(scheme)を触ってみたかった。
最古のプログラムであり至高、こんな言葉を耳にしたことがあります。
このフレーズだけでも気になっていたので、徐々に学習していこうかと。

ニッチな機械学習とも相性が良いみたいですね、６０年も前に開発された言語なのに、恐るべし・・・

そんなわけで超絶初学者向けにはなるかな程度の備忘録です、よし、やってこ！！！

#何はともあれHello World
　
とりあえずお決まりのご挨拶を・・・
printが出力する手続き、一つの処理は括弧で括るって感じですかね。
改行、インデントは影響がない様です。

```Lisp

(print "Hello World") ; Hello World


(print
    "Hello World")    ; Hello World

```
でけたでけた！！！
どの言語も第一歩を踏み出すだけでちょっと嬉しくなりますね。
　　
#演算してみる
　
簡単な演算を・・・

```Lisp

(print (+ 1 2))        ; 3

(print (+ 1 (* 2 3)))  ; 7

(print (+ 1/2 2/5 2))  ; 29/10

```

演算記号は基本的に他の言語と相違ないです。
しかし、なぜ演算式が 1 + 2 でなく + 1 2 なのだろう・・・
とも思ったのですが(print "Hello World")と同様に考えると理解できました。
飽くまでもソースは最初に手続き、内容といった規則性みたいですね。

　
上記の例でいうと
　
(print (+ 1 2))  =>  表示しろ、(+ 1 2)を　
(+ 1 2)            =>  足せ、1 と 2 を

といったところでしょうか。
　
　
3項以上、分数を含む場合もシンプルに演算可能です。
※分数でなく実数を扱うことも可能ですが割愛させていただきます。

#真偽値
　
しつこい様ですが、同様に手続きを最初に！！

```Lisp

(print (= 1 1))      ; #t

(print (eq? 1 1))    ; #t

(print (= 1(+ 1 1))) ; #f

```
　

真偽値を返す手続きの一例は下記となります。
 


| 手続き       |       内容 |
|:-----------------|------------------:|
| boolean?            | 真偽値か|
| string?         |       文字列か    |
| number?          |        数値か |
| integer?          |              整数か |
| eq?        |             等しいか |
| =        |             等しいか |
　

eq?と=ですが下記の様に結果が異なります。

```Lisp

(print (= 1 1.0))    ; #t

(print (eq? 1 1.0))  ; #f

```
　

= は数値を、eq?は同一オブジェクトかどうかを比較しています。
また、値が等しいかどうかを調べる手続きの他にeqv? equal?がありますが
~~ちょっと調べる余裕なかったので~~今回は割愛します。

#変数、条件分岐
　
変数　(define 変数名 式) // 型指定は不要
if関数　(if (条件式) (真の式) (偽の式))
　
こんな感じで定義できます。

```Lisp

;　変数定義
(define a 1)
(define b 2)

; if関数
(if (< a b)
    (print "aはbより小さいよ")
    (print "aはbより大きいよ")) ; aはbより小さいよ
 
; 変数書き換え
(set! a 3)
 
(print (if (< a b) "aはbより小さいよ" "aはbより大きいよ")) ; aはbより大きいよ

; 複文
(if (< a b)
  (begin
    (print "aはbより")
    (print "小さいよ"))
  (begin
    (print "aはbより")
    (print "大きいよ"))) ; aはbより大きいよ

```

おぉ、elseとか不要でスッキリしてますね、三項演算っぽくも書けるし、少しずつ最も美しい言語という名声を
実感してきた気がします。(気のせいです)
 

#関数

関数の定義は以下です。
(define (関数名　引数)(処理))

```Lisp

; 引数を2倍する関数
(define (hoge x)(* x 2))

; 関数実行
(print(hoge 3)) ; 6

```

とまあこんな感じで。

あと、Schemeでは変数と関数も同列の扱いらしいです。
例えば関数hogeと同名の変数を定義して実行すると・・・

```Lisp

;　hogeを再定義
(define hoge 10)

(print (hoge 10)) ; hogeは変数の為error
(print hoge)      ; 10

```
関数としてのhogeが変数hogeに上書きされるので注意！！

#まとめ
Lisp(List processor)なのに今回はlistを扱ってませんw
ただ既にシンプルで無駄がない振る舞いに徐々に魅力を感じます。
次回はlambdaやらmapやら使ってちょっと関数型っぽい領域に入れたら、と思います、ではまた！！
Progateユーザーのコード実行環境

# はじめに
[Progate Advent Calendar 2017](https://qiita.com/advent-calendar/2017/progate) 16日目の記事になります！

[Progate](https://prog-8.com)では、環境構築することなくブラウザ上でコードを実行することができます。
そのコード実行環境をどのように実現しているかについての記事となっています。
かなりざっくりと書かせていただきました！

# 前提
Progateでの演習は、穴埋め形式ではありません。
穴埋め形式ですと、決まったコードが入力されたときだけあらかじめ用意しておいた実行結果を表示する、などということができそうですが、Progateではユーザーが自由にコードを記述・実行できるので、自分のローカルでコードを実行するような、ある程度自由な環境である必要があります。

![browser.png](https://qiita-image-store.s3.amazonaws.com/0/105948/faa32907-25bf-a274-6dd3-9ef6ab56b651.png)


# 本題
結論から言うと[Docker](https://www.docker.com)を用いて実行環境を実現しています。
Dockerコンテナを用いることでユーザー毎に独立した環境を提供することができ、ユーザーが自由にその環境を使うことができます。
以下、具体的に説明していきます。

![infra_1.png](https://qiita-image-store.s3.amazonaws.com/0/105948/ae4dac32-ddbf-157a-1ae8-805224229f3d.png)


1. ユーザーがブラウザでアクセスするとProgate本体サーバーにリクエストが飛びます。
2. Progate本体サーバーはコード実行サーバーにDockerコンテナ作成をリクエストします。
3. コード実行サーバーはコンテナを作成し、コンテナへ接続するための情報（コンテナのidなど）をレスポンスとして返します。 


![infra_2.png](https://qiita-image-store.s3.amazonaws.com/0/105948/348fed3a-4c25-677f-97db-9eff4a6b1039.png)

4 . コンテナへ接続するための情報を用いて、ブラウザからコンテナにWebsocketを繋ぎます。

あとはWebsocketを使って、

- エディタに入力されたコードをコンテナに送信
- コードの実行リクエスト
- 実行結果の送受信

などが行われます。

Websocketを用いることで、リアルタイムでのコードの実行結果の取得、インタラクティブなコード（Rubyのgetsメソッドなど）の実行などが可能となっています。

# 補足
本当はロードバランサーやオートスケーリンググループ、Websocketのリクエストを振り分けるためのリバースプロキシ、Docker Swarmなど様々なものを用いていますが、この辺はまたの機会に書きたいと思います！
Advent of Code day9をPerl 6で

こんにちは、15日目になります。
昨日は @debility さんの[Perl6のAcmeモジュールをサクッと作った話](https://qiita.com/debility/items/9586d8f8efdbe312401a)でした。

独自演算子と言えば、私の知っているモジュールだと`Σ`みたいな足し合わせの演算子をユーザー定義しているものもあったりします: https://github.com/hipek8/p6-Statistics-LinearRegression/blob/master/lib/Statistics/LinearRegression.pm6#L4

・・・今日は特に投稿がなかったので、例によって私の[Advent of Code day9](https://adventofcode.com/2017/day/9)の回答を貼っておきます。

```
use v6;                                                            
                                                                   
my Bool $garbage = False;                                          
my Bool $skip = False;                                             
my Int $score = 0;                                                 
my Int $depth = 1;                                                 
                                                                   
for $*IN.get.comb -> $char {                                       
    if $skip {                                                     
        $skip = False;                                             
        next;                                                      
    }                                                              
    given $char {                                                  
        when '!' { $skip = True }                                  
        when '{' { $score += $depth++ unless $garbage }            
        when '}' { $depth-- unless $garbage }                      
        when '>' { $garbage = False if $garbage }                  
        when '<' { $garbage = True unless $garbage }               
    }                                                              
}                                                                  
                                                                   
$score.say;                                                        
```

+ ポイント
  + Grammar-Actions を使うよりも、単純に左から右へ読んでいった方がこの問題の場合は楽です

以上15日目でした
数値解析で使う3次元ベクトルクラスの一案

#普通の3次元ベクトルクラスはこう書く、と思う。

```cpp
class qta3dVector
{
public:
	//	成分
	double	x, y, z;

public:
	//	コンストラクタ
	qta3dVector( double	rx, double ry, double rz ) :x( rx ), y( ry ), z( rz ){}
	//	長さ
	double	length(){ return ..; }
	//	外積
	qta3dVector crosproduct( const qta3dVector& vec ){ return ..; }
	//	内積
	double	innerproduct( const qta3dVector& vec ){ return ..; }
	//	回転
	bool	rotate( const qtaQuaternion& q ){}
};
```
（クラス名のqtaはQiitaの略です。）

これは分かりやすいです。でも次のような場合を考えてみます。

#可読性や保守に問題がある気もします。
　構造計算などの数値解析において、N次元の連立方程式を解き、N自由度のdouble型の解ベクトルが求まるとします。このベクトルが3次元ベクトルの集まりと考えた時、これを全部ある回転クォータニオンqで回転させるには、最初のクラスを使うと、下記のようになります。

```cpp
std::vector< double > vecSolution( N );	//	N自由度の解ベクトル
qtaQuaternion	q;	//	回転クォータニオン

for( int i = 0; i < N / 3; ++i ){
	//	値を取り出して3Dベクトルを作成
	const double x = vecSolution[ i * 3 + 0 ];
	const double y = vecSolution[ i * 3 + 1 ];
	const double z = vecSolution[ i * 3 + 2 ];
	qta3dVector	vec( x,y,z );	//	ベクトル作成

	vec.rotate( q );	//	回転

	//	回転した値を元に戻す
	vecSolution[ i * 3 + 0 ] = vec.x;
	vecSolution[ i * 3 + 1 ] = vec.y;
	vecSolution[ i * 3 + 2 ] = vec.z;
}

```

値を元に戻すのでソースも長くなるし、何をやってるのか分かりにくい。xyzがメモリに連続して配置していることを前提にし、非メンバ関数にすれば一行で済みます。

```cpp
for( int i = 0; i < N / 3; ++i ){
	rotate3dVector( &vecSolution[ i * 3 ]);	//	回転
}
```

しかし、メンバ関数の方が便利なケースもあるため、それを残すと、両方の関数を管理する必要があります。メンバ関数から上記の非メンバ関数を呼ぶと言う方法もあるのですが、以下のようにクラスを２つ作ったほうが汎用的なのではないかと考えております。

#クラスを2つに分けたらどうでしょう。
以下のように、3成分の先頭ポインタだけを持つベクトルのクラスと、3成分の実体を持つベクトルの２つに分け、関数を共有するのはどうでしょう。

```cpp
////////////////////////////////////////////////////////////////////////
//	3成分の先頭ポインタだけを持つベクトル
class qta3dVector_0
{
private:
	double* x;	//	3成分へのポインタ

public:
	double&	x(){ return	x[ 0 ]; }
	double&	y(){ return	x[ 1 ]; }
	double&	z(){ return	x[ 2 ]; }

	//	コンストラクタ
	qta3dVector_0( double* rx ) :x( rx ){}
	//	長さ
	double	length(){ return ..; }
	//	内積
	double	innerproduct( const qta3dVector_0& vec ){ }
	//	回転
	bool	rotate( const qtaQuaternion& q ){}
};

////////////////////////////////////////////////////////////////////////
//	3成分の実体を持つベクトル
class qta3dVector_1 : public qta3dVector_0
{
	//	成分
	double	x[ 3 ];

public:
	//	コンストラクタ
	qta3dVector_1( double rx, double ry, double rz ):
		qta3dVector_0( &x[0] )
	{
		x[ 0 ] = rx;
		x[ 1 ] = ry;
		x[ 2 ] = rz;
	}

	//	外積
	qta3dVector_1 crosproduct( const qta3dVector_0& vec ){  }
};
```

クラス名末尾の0と1は、そっけないですがおいといて、これにより前述の回転の実装は次のようになります。

```cpp
for( int i = 0; i < N / 3; ++i ){
	qta3dVector_0	vec( &vecSolution[ i * 3 ]);
	vec.rotate( q );	//	回転
}
```
これで計算した値を取り出し、計算結果を戻す処理は不要となり、非メンバ関数となることも防ぐことができます。また、3成分の実体を持つベクトルqta3dVector_1もメンバ関数を共有でき、かつqta3dVector_0と_1とで共通の関数を使うことも可能です。データの取り出し、戻す処理が不要となり速度の向上にも繋がると思います。（試してないです）

#終わり
以上は、配列や行列に関しても同様のことが適用可能であります。特に行列においては、値のコピーが計算時間に影響がある場合があり、それに対してこの方法は有効ではないか、と考えております。まだ確認はしておりません。またいつか試してみようかと思います。
ElectricImpで部屋の温度と湿度を常時計測する

今回使用しているElectricImpのボードは **Imp004m** です。

ElectricImpはhttpsでデバイスのデータや制御が行えるようになっています。

今回実装の概要はこんな感じ

<img width="655" alt="スクリーンショット 2017-12-16 11.21.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/57579/8092c4f4-1c12-13c3-94f0-51308404895e.png">

---

ElectricImpのIDEでセンサー側とセンサーからデータを受信する側のプログラムを記述

**センサー側(Device側)**

```Device.squirrel
#require "HTS221.device.lib.nut:2.0.1"

// 温度湿度センサーの接続設定
hardware.i2cNM.configure(CLOCK_SPEED_400_KHZ);
tempHumid <- HTS221(hardware.i2cNM);
// 最終データを記録（agentに飛ばすため)
lastTemp <- "";
lastHumid <- "";

// agentにセンサー情報を送信
function sendTempHumid() {
    agent.send("sendTempHumid", [lastTemp, lastHumid]);
}

// センサーから温度湿度の情報を読み取る
function readTempHumid() {
  tempHumid.setMode(HTS221_MODE.CONTINUOUS, 7);

  local result = tempHumid.read();
  if ("error" in result) {
    server.error("An Error Occurred: " + result.error);
    lastTemp = "error";
    lastHumid = "error";
  } else {
    server.log(format("Current Humidity: %0.2f %s, Current Temperature: %0.2f °C", result.humidity, "%", result.temperature));
    lastTemp = result.temperature.tostring();
    lastHumid = result.humidity.tostring();
  }
  // agentに送信
  sendTempHumid();
  // 30秒後に自分をコールバック
  imp.wakeup(30.0, readTempHumid);
}

function getTempHumid(data) {
  readTempHumid();
}

// agent側から温度湿度の読み出しリクエストをデバイス内部関数呼び出しに変換
agent.on("getTempHumid", getTempHumid);
```

**受信側(Agent側)プログラム**

```Agent.squirrel
function sendTempHumid(tempHumid) {
  // Send the device a 'pong' message immediately
  server.log("デバイス = " + tempHumid[0] + "度 / " + tempHumid[1] + "%");
  local url = "センサーデータ受信用サーバのAPIパス";

  // Prepare the request with a JSON payload
  local body = http.jsonencode({ "temp": tempHumid[0], "humid" : tempHumid[1] });
  local extraHeaders = {};
  local request = http.post(url, extraHeaders, body);
    
  // Send the message
  local incomingDataTable = request.sendsync();
 
  // Display the received data
  server.log("Code: " + incomingDataTable.statuscode + ". Message: " + incomingDataTable.body);
}
 
device.send("getTempHumid", null);
device.on("sendTempHumid", sendTempHumid);
```

**データ格納側API(超絶手抜き)**

```write.php
<?php

$json_data = file_get_contents('php://input');
try {
  $json_data = json_decode($json_data);
  $db = pg_connect("******");
  $sql = sprintf(
         "INSERT INTO temphumids (temp, humid) VALUES(%s, %s);"
         , is_numeric($json_data->temp) ? $json_data->temp : 'null'
         , is_numeric($json_data->humid) ? $json_data->humid : 'null'
  );
  pg_query($db, $sql);

  echo "OK";
} catch(Exception $e) {
  echo "NG";
}
```

温度・湿度格納テーブル定義

| col | type |
|:---|:---|
| id | biserial |
| temp | float |
| humid | float |
| created_at | timestamp |
| updated_at | timestamp |

これで一通り、センサーからデータを読み取って外部のデータストアに格納するためのプログラムができました。
ほんと簡単。
Perlでの配列/ハッシュの取り扱い方


久しぶりにPerlでの開発を経験したので、自身への備忘録も含めて、記事にまとめます。
今回は配列/ハッシュの取り扱い方です。
※後で追加/編集する可能性があります。

## 初期化
### 旧式な方法
```
my @list1 = ( 1, 2, 3 );
my @list2 = qw/1 2 3/;

my %hash = ( 'name' => 'テスト太郎', 'age' => 10, 'email' => 'taro@test.com' );

print $list1[0];       # 1
print $list2[1];       # 2
print $hash{"name"};   # "テスト太郎"
```

* 変数宣言時は以下のようにする
   * 配列:`@~`
   * ハッシュ:`%~`
* 配列/ハッシュに格納済みの値への参照時は`$~`で参照する

### モダンな方法
配列やハッシュでも`@~`や`%~`ではなく、`$~`で宣言することも可能。

```
my $list = [ 1, 2, 3 ];
my $hash = ( 'name' => 'テスト太郎', 'age' => 10, 'email' => 'taro@test.com' );

print $list->[0];       # 1
print $hash->{"name"};  # "テスト太郎"
```

この場合は変数名の後に`->`で配列のインデックスやハッシュのキーを指定する。
配列やハッシュとして扱いたい場合は、以下のように変数名の先頭に`@~`や`%~`を付ける。

```
print scalar @$list; #3
print scalar %$hash; #3
```

## 変換
### 文字列 => 配列
```
my $value = ™太郎 花子 次郎 三郎™;
my @names = split( /,/, $value );
print Dumper @names;
```

### 配列 => 文字列
```
my $names = qw/太郎 花子 次郎 三郎/;
my $value = join( ',', @$names );
print $value;           #太郎,花子,次郎,三郎
```

### 配列 => ハッシュ

```codes
use strict;
use warnings;
use Data::Dumper;

my $user_list = [
    {
        'id'    => 1,
        'name'  => 'テスト太郎',
        'age'   => 30,
        'email' => 'taro@test.com',
    },
    {
        'id'    => 2,
        'name'  => 'テスト花子',
        'age'   => 26,
        'email' => 'hanako@test.com',
    },
    {
        'id'    => 3,
        'name'  => 'テスト次郎',
        'age'   => 28,
        'email' => 'jiro@test.com',
    },
    {
        'id'    => 4,
        'name'  => 'テスト三郎',
        'age'   => 22,
        'email' => 'saburo@test.com',
    },
];

# id => 各データのhash
my $user_hash = { map { $_->{'id'} => $_ } @$user_list };
print Dumper $user_hash;

# # id => nameのhash
my $user_names = { map { $_->{'id'} => $_->{'name'} } @$user_list };
print Dumper $user_names;
```

```実行結果
$VAR1 = {
          '3' => {
                   'id' => 3,
                   'age' => 28,
                   'email' => 'jiro@test.com',
                   'name' => 'テスト次郎'
                 },
          '1' => {
                   'name' => 'テスト太郎',
                   'age' => 30,
                   'id' => 1,
                   'email' => 'taro@test.com'
                 },
          '2' => {
                   'name' => 'テスト花子',
                   'id' => 2,
                   'age' => 26,
                   'email' => 'hanako@test.com'
                 },
          '4' => {
                   'email' => 'saburo@test.com',
                   'id' => 4,
                   'age' => 22,
                   'name' => 'テスト三郎'
                 }
        };
$VAR1 = {
          '3' => 'テスト次郎',
          '2' => 'テスト花子',
          '1' => 'テスト太郎',
          '4' => 'テスト三郎'
        };

```

## 繰り返し処理
```配列の場合
# 各値のみ参照
my $names = [ "太郎", "花子", "次郎", "三郎" ];
foreach (@$names) {
    print "$_ \n";
}

# インデックス付きで参照
foreach my $i ( 0 .. $#names ) {
    print "$names[$i] \n";
}
```

```ハッシュの場合
my $hash ={ 'name' => 'テスト太郎', 'age' => 10, 'email' => 'taro@test.com' };
foreach ( keys(%$hash) ) {
    print "$_ => $hash->{$_}\n";
}
```
source ~/.bash_profile や source venv/bin/activate と何度も入力したことのある人へ

`source ~/.bash_profile`
は
`. ~/.bash_profile`
と同義っぽい（実際に本当に同じなのか、厳密なBashの仕様等はわからないので詳しい人いたら教えてください。少なくとも今まで問題になったことは無いです。）

特にたくさん入力する機会があるのはvirtualenvの

`. venv/bin/activate`

ですかね。
tsuquyomiのCtrl-Tマッピングを変更する

TsuquyomiでVim+TypeScriptの環境を触っていたときに、自分は`Ctrl+T`へ`:tabnew`をマッピングしていたところがプラグインによってオーバーライドされてしまったのを変更したときのメモ。

後で読んだら[READMEにばっちり書いてあった](https://github.com/Quramy/tsuquyomi#disable-default-mappings)けど、備忘録として。

## デフォルトマッピングの無効化

```vim
let g:tsuquyomi_disable_default_mappings = 1 
map <buffer> <Nop> <Plug>(TsuquyomiGoBack)
```
とりあえず上を書いておけば`Ctrl+T`は取り戻せる。

## そもそもプラグインのマッピングは再割当てできない？
そもそもvimrc側でプラグインによって割り当てられたマッピングは変更できないのだろうか。

> Plugins are sourced after your vimrc so there's no way to override a plugin mapping in your vimrc if the plugin doesn't provide a way to do so.

[このスレッド](https://vi.stackexchange.com/questions/756/how-can-i-redefine-plugin-key-mappings)によると、そもそも設定ファイルの読み込まれる順番がvimrc→プラグインなので、vimrc側でやれることはないとのこと。なるほど。


## 余談

ちなみにプラグイン内部の実装で該当するのはこの部分

```vim
function! tsuquyomi#config#applyBufLocalDefaultMap()
  if(!exists('g:tsuquyomi_disable_default_mappings'))
    if !hasmapto('<Plug>(TsuquyomiDefinition)')
        map <buffer> <C-]> <Plug>(TsuquyomiDefinition)
    endif
    if !hasmapto('<Plug>(TsuquyomiSplitDefinition)')
        map <buffer> <C-W>] <Plug>(TsuquyomiSplitDefinition)
        map <buffer> <C-W><C-]> <Plug>(TsuquyomiSplitDefinition)
    endif
    if !hasmapto('<Plug>(TsuquyomiGoBack)')
        map <buffer> <C-t> <Plug>(TsuquyomiGoBack)
    endif
    if !hasmapto('<Plug>(TsuquyomiReferences)')
        map <buffer> <C-^> <Plug>(TsuquyomiReferences)
    endif
  endif
endfunction
```
思ったより読みやすかった。
マイクロサービスの概念はわかるけど、どう実践すればいいの？ という人向けの「プロダクションレディマイクロサービス」を読んでみた


#はじめに 
https://qiita.com/advent-calendar/2017/syoroumaru の16日目です。

こんにちは。初老って40代でいいんですよね? きがついたらもうアラフィフになってますが、まだ初老でいこうとおもいます。

オライリーから三ヶ月ほどまえに出た[プロダクションレディマイクロサービス](https://www.oreilly.co.jp/books/9784873118154/)。あまり話題になってないようでしたが、読んでみたところよかったので紹介します。
結論から書いておくと **「読んどけ」** です。

# 動機

会社にあるはずのオライリー [マイクロサービスアーキテクチャ](https://www.oreilly.co.jp/books/9784873117607/)が借り出されているようで他になんかないかなぁとさがしたら見つけました。ちなみにマイクロサービスアーキテクチャは344ページにたいしてプロダクションレディのほうは216ページということで量が少なく、頑張れば一日でよめそうな分量というのもよかったです。

2.内容について

マイクロサービスのシステムを運用に必要な要素をあげて、それぞれの原則を説明するという本でした。
- 安定性と信頼性
- スケーラビリティとパフォーマンス
- 耐障害性と大惨事対応
- 監視
- ドキュメント

# 感想 

付録のAとBが肝です。わずか10ページすこしですが以下、目次から引用します。

```
付録A　本番対応のチェックリスト
    A.1　本番対応サービスは安定性、信頼性を備えている
    A.2　本番対応サービスはスケーラブルでパフォーマンスが高い
    A.3　本番対応サービスは耐障害性があり大惨事対応力がある
    A.4　本番対応サービスは適切に監視されている
    A.5　本番対応サービスはドキュメントが整備され、組織的に理解されている

付録B　マイクロサービスの評価基準
    B.1　安定性と信頼性
        B.1.1　開発サイクル
        B.1.2　デプロイパイプライン
        B.1.3　依存関係
        B.1.4　ルーティングと検出
        B.1.5　非推奨と廃止
    B.2　スケーラビリティとパフォーマンス
        B.2.1　成長の判断基準
        B.2.2　リソースの効率的な利用
        B.2.3　リソースの把握
        B.2.4　キャパシティプランニング
        B.2.5　依存関係のスケーリング
        B.2.6　トラフィック管理
        B.2.7　タスクの処理
        B.2.8　スケーラブルなデータストレージ
    B.3　耐障害性と大惨事対応
        B.3.1　単一障害点の除去
        B.3.2　大惨事と障害のシナリオ
        B.3.3　回復性テスト
        B.3.4　障害の検出と修正
    B.4　監視
        B.4.1　主要メトリック
        B.4.2　ロギング
        B.4.3　ダッシュボード
        B.4.4　アラート
        B.4.5　オンコールローテーション
    B.5　ドキュメントと組織的な理解
        B.5.1　マイクロサービスのドキュメント
        B.5.2　マイクロサービスについての組織的な理解
```

で、AとBの内容を説明しているのが本文になります。
本文もそれほどながくないので、是非よんでもらいたいですが、知っていることも知らないこともありました。気になった概念としては

- SLAがさがったら、デプロイを実施しないという判断
- 防御的キャッシュ
- サーキットブレーカー
- 質的な成長の判断基準

でしょうか。序文にもかいてありますが、詳細について書くと章が本になってしまうので、あくまで原則とその説明になっています。それが、本書の簡潔で読みやすい理由になってます。
詳細については、別の本なりブログなりで読めるので、実際システム運用している人で、マイクロサービスの運用の概観をしりたいという人にとてもお勧めです。

# 余談

著者の人が女性でした。優秀な人に性差はないんですね。UberのSREということですが、シンプルな原則と読み易い文の裏に血を流して学んだ経験を感じられるのもよい本でした。

もうひとつ、ドストエフスキーの引用をしている部分があるのですが、芥川龍之介の蜘蛛の糸とおなじ構造の話でした。
蜘蛛じゃなくて葱でした。どっちがオリジナルかはよくわかりませんが、よいものは学んで自分のものにすべきという学びだとおもいました。

ではでは。