OmniAICreator/Qiita-1.07M huggingface dataset:
Azureではメール送信できないし、メールサーバもつくれない

表題の通りMicrosoft Azureでは

 - 外部にメールを送信すること
 - メールサーバを作ること

はできません。

#そもそもサポート対象外

[2016年6月9日の公式ブログ](https://blogs.technet.microsoft.com/jpaztech/2016/06/09/smtp-on-azurevm/)で

>昨今、メールのセキュリティが重要視され、様々な形で迷惑メールとみなされることがございます。こういった既知の IP アドレスをスパムの出所として記録し、ブラックリストとしてフィルターするという第三者機関も多くございます。また、VM を一時的に立ち上げ、その IP アドレスからスパムメールを送信するといった乱用も潜在的な可能性として存在します。

>このような理由から、**Azure 上の VM から直接 SMTP 等を使ってメール送信することは、Azure プラットフォームとしてサポートをしておりません。**


と**赤字&太字**でメール送信はサポートしない旨を強く公言しています。

しかしそれでもスパムメール送信をする輩が減らないのかは不明ですが、**2017年11月ついに25番ポートをブロックしました**

#25番ポートがブロックされる

[Azure VM からのメール送信に関するアナウンス (2017 年 11 月)](https://blogs.technet.microsoft.com/jpaztech/2017/11/16/smtp-block-announcement-november-2017/)

> Microsoft Azure は、不正なユーザーによる Azure からのスパム メールの送信をストップするとともに、IP アドレスのレピュテーション (メールの送信元としての信頼性) を保ち、正当な利用を行っているお客様に対して影響が及ばないようにする責任を負っています。

> この対策の一環として、2017 年 11 月 15 日以降、Azure VM から外部ドメイン (たとえば outlook.com や gmail.com など) への直接のメール送信は、特定の契約種別のサブスクリプションでのみ許可するよう、動作が変更されます。許可されていない契約種別のサブスクリプションにおいては、Azure VM からの **TCP/25 ポートによる外部へのメール送信を Azure プラットフォームがブロックする**動作が加わります。

詳しくは上の記事を見ていただくとして、まとめると

 - 2017年11月15日より前のサブスクリプション　→　**一切ブロックなし。**だたしサポートは対象外
 - 2017年11月15日以降のサブスクリプション　→　**原則ブロック**
    - エンタープライズ契約　→ブロックなし
    - 従量課金（ふつうコレ？）　→　**ブロックあり**ただし申請することで解除される場合あり
    - MSDN、Free Trial（無料アカウント）など　→　**ブロックあり・解除不可**

※587番ポートなどのサブミッションポートは使う場合は制限されません

#どうすれば
[SendGrid](https://sendgrid.kke.co.jp/)などのメール配信のSaaSを使いましょう。
Azure利用者なら1か月あたり25,000通まで無料です。

 - [SendGrid 電子メール サービスの使用方法 (.NET) | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/sendgrid-dotnet-how-to-send-email)
 - [Microsoft AzureからのSendGridの利用方法 | SendGridブログ](https://sendgrid.kke.co.jp/blog/?p=2621)
 - [AzureのMarketplaceからSendGridを利用してみる](https://qiita.com/yotan/items/e89c6a89b0c2fbec4a4a)
 - [Microsoft AzureのMarketplaceでSendGridを利用するまで](https://qiita.com/kikutaro/items/6461533851a06b341087)



もしくは[Microsoft Exchange Online](https://products.office.com/ja-jp/exchange/exchange-online)を使う？
Linuxでの画面輝度調整のスクリプト

##はじめに
この記事は[学生アドベントカレンダー2017](https://adventar.org/calendars/2386)の記事です。

上記のアドベントカレンダーを作った張本人であるのにもかかわらず、記事の投稿が遅れてしまい申し訳ありません。
ブログは遅れましたが、引っ越しの片付けは進みました。

## 作業する場所づくり
まず、PATHが通っているかを確認します。
```echo $PATH```
で確認できます。
すでに通っているPATH以外を追加したい場合は
```export $PATH:追加したいディレクトリの絶対PATH```
```export $PATH:/usr/local/bin```
みたいな感じでできます。

## 輝度の変更
輝度の変更は

```sudo echo 80 > /sys/class/backlight/intel_backlight/brightness```

でできます。
また、どのくらいまで輝度をあげられるのかは。

```cat /sys/class/backlight/intel_backlight/max_brightness```

で見れます。一応最大輝度超えないように気をつけてください。
これでターミナルから輝度調整できますね。

## ショートカットキーに割り当てる
ショートカットキーに割り当てて、輝度を調整するためには押した回数だけ輝度が変化する必要があります。
なので上記のように絶対的な数値を入力するのではなく、現在の値からどれだけ変化するかの値を入力する必要があります。


僕が今使ってるxfce4だと、ショートカットキーに割り当てたコマンドに引数渡せないけど、オプションなら行けるっぽいので、わざわざオプションつけてあげました。

```bash
#!/bin/bash
#画面輝度調整する奴

readonly BRIGHT_PATH='/sys/class/backlight/intel_backlight/brightness'
readonly MAX_BRIGHT_PATH='/sys/class/backlight/intel_backlight/max_brightness'
readonly MAX_BRIGHTNESS=$(( $(cat $MAX_BRIGHT_PATH) - 10 ))
readonly MIN_BRIGHTNESS=10


usage() {
  echo '頑張って'
  exit 0
}
    

check_uplim() {
  if [ $1 -ge $MAX_BRIGHTNESS  ]; then
    echo brightness is max now
    exit 1
  fi
  return 0
}

check_lolim() {
  if [ $1 -le $MIN_BRIGHTNESS ]; then
    echo brithness is min now
    exit 1
  fi
  return 0
}


brightness=$(cat $BRIGHT_PATH)

while getopts :udm OPT
do
  case $OPT in
    u) OPTION_u=True;;
    d) OPTION_d=True;;
    m) echo max brightness is $(cat $MAX_BRIGHT_PATH);;
    \?) usage;;
  esac
done

if [ "$OPTION_u" = "True" ]; then
  check_uplim $brightness
  brightness=$(( brightness += 10 ))
  echo $brightness > $BRIGHT_PATH
  echo brightness is $(cat $BRIGHT_PATH) now
  exit 0
fi

if [ "$OPTION_d" = "True" ]; then
  check_lolim $brightness
  brightness=$(( brightness -= 10 ))
  echo $brightness > $BRIGHT_PATH
  echo brightness is $(cat $BRIGHT_PATH) now
  exit 0
fi
```
これを先ほどのPATHが通ってるディレクトリに配置してください。
その後、`sudo chmod 755 ~~~`と権限付与をして、
`sudo chmod 777 /sys/class/backlight/intel_backlight/brightness`
こっちにも権限与えておきます。

これをキーボードショートカットキーに割り当てたら動いてくれました。やったね。

##最後に
今回、bashを使ってスクリプト書いたの初めてだったので、新鮮で楽しかったです。なんか間違っているところや、普通こう書くよ。みたいなのがあれば教えてください。
おうちDNSをPowerDNSのDockerイメージで(PowerDNSインストール編)

# はじめに

おうち認証局をつくる前にやることといえば内向きのDNSの作成である(ぇ違う)。
直接アドレスバーに打ち込んでいても良いのですが、HTTP/2を使う上でSSLが必須なので、この際だから導入することにした。

ちなみに筆者の環境はArmbian上のDockerのためアーキテクチャがARMであることに注意されたし。

# PowerDNS

[この辺りの記事](https://qiita.com/hondam/items/2f9a9ae0223d40af22f6)が参考になりました。

# Docker Imageの作成

今回はArmv7のCPUを利用する事もあり、既存のDockerイメージを利用する事が出来なかった。

そのため、1からDNSサーバ用のDockerイメージを新規に作成した。

作成したDockerfileとdocker-compose.ymlをGitHubにアップロードした。

https://github.com/whale-shark/PowerDNS4Arm

Arm以外の環境で利用したい場合は、power_dns/Dockerfileの6行目を[https://repo.powerdns.com/](https://repo.powerdns.com/)の記載にしたがって変更すれば動くと思われる。

```dockerfile
echo "deb http://repo.powerdns.com/raspbian jessie-auth-master main" > /etc/apt/sources.list.d/pdns.list; \
```

x86_64環境であれば、[このあたり](https://hub.docker.com/r/pschiffe/pdns-mysql/)のコンテナを利用すれば簡単に準備できるのではと。

# ARM向けのDockerイメージを作成して

今回、初めてARM向けのDockerイメージを作成した。

Docker Hubに上がっているイメージでは、割と動かない物が多く苦戦した。(MySQLとかMySQLとか)

debian-slimやalpineは必要となるテクニックが多く必要なパッケージをインストールするのに試行錯誤で1日くらいかかった。

# 今後

PowerDNS Recursor をいれて本格的なおうちDNSをつくる。
あるWebフロントエンドエンジニアの給料

これは[IT屋お給料リレー Advent Calendar 2017](https://qiita.com/advent-calendar/2017/salary) 3日目の記事である。
個人的にはIT屋ってなんだという感じと、あとで消されそうな記事が揃っているなと思ったがまあいい。

## 今までの給料

基本的に転職によって給料を上げてきた。職種としてはSIer→Webフロントエンドエンジニアという流れ。
スペック的には[高卒Webプログラマのお給料](https://qiita.com/zxcvbnm12345/items/2a11c5efa4260b7b8bb9)と似ている。

|  社|    給料|  平均年間賞与|残業代|みなし残業時間| 勤続年数|
|---:|------:|-----------:|----:|----------:|-------:|
|   1|155,000|      10,000|    ○|         0h|      1年|
|   2|225,000|      60,000|    ☓|        45h|  2年1ヶ月|
|   3|300,000|     600,000|    ☓|        40h|      3年|
|   4|500,000|           0|    ☓|        45h|4ヶ月（現職）|

見て分かるように1社目以外はみなし残業代が入っている。なので給料の欄は2社目以降は基本給ではない。
1社目は偽装請負や社長が出した本を新卒研修のときに読まされたり、人財とか言うSIerだった。2社目以降は割と気に入っている。
みなし残業があるとはいえ自分はやることをやったらとっとと帰っている。なので月の残業時間は平均して10〜15hくらいだと思う。
td-agentを使ってauth.logのInvalidログをslackに投げる

#はじめに
やりたいことは、td-agentを使ってauth.logのInvalidログをslackに投げる、です。
ようするにsshできた、怪しいやつを監視したい！

#実行環境
Ubuntu 16.04.2 LTS

# 必要なものをinstallする
```sh
curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-xenial-td-agent2.sh | sh 
sudo /usr/sbin/td-agent-gem install fluent-plugin-slack
sudo /usr/sbin/td-agent-gem install fluent-plugin-rewrite-tag-filter
```

## td-agent.contを書く

```sh:/etc/td-agent/td-agent.conf
<source>
  @type tail
  path /var/log/auth.log
  tag auth.raw
  format /^(?<message>.*)$/
</source>

<match auth.raw>
  @type rewrite_tag_filter
  rewriterule1 message ^.*Invalid.*$ auth.access
</match>

<match auth.access>
 @type slack
 webhook_url https://hooks.slack.com/services/xxxx/xxxx
 channel hope
 username hoge
 icon_emoji :ghost:
 flush_interval 10s
 message_keys message
 message "%s"
</match>
```

## 権限をよしなにする

```sh:/etc/init.d/td-agent
TD_AGENT_USER=root
TD_AGENT_GROUP=root
```

/etc/init.d/td-agentの実行ユーザーを変えなければならないのがわからず、/var/log/auth.logを666で試して行けたんだけど、権限ダメだよなーどうやって変えるんだろう、って思ってちょっとハマった.

## restart

```sh
sudo systemctl daemon-reload
sudo systemctl restart td-agent
```

#終わり
これは [ネットワークシステム特別講義2](https://aiit.ac.jp/master_program/isa/lecture/pdf/h29/1_1.pdf)の授業で+αの項目で扱いました。
今の現場もそうでしたが、実際のプロジェクトだとこういうのはすでに使われていて、自分で一からやる機会はほぼないので、権限周りでハマったりなどはわりと学びがありました:ok_woman:
Gulpメモ


gulpは、nodejs環境で動作するビルドツール。

ビルドツールといえば、各界隈で多数存在する。

- Java界隈
  - Apache Ant
  - Apache Maven
  - Gradle
- C界隈
  - Make
  - CMake
- Microsoft界隈
  - MSBuild
- nodejs界隈
  - Grunt
  - gulp

[ビルドツールまとめ](https://qiita.com/cognitom/items/db88babebeb869a4a198)

## なぜビルドツールなのか

VSCodeのtasks.jsはビルドツールを使う前提で作られている。

例えば、

+ SCSSのビルド
+ リソースの配置
+ dockerイメージの作成

などの作業を1つのタスクでは記述できず、複数のタスクとして記述する必要がある。
しかし、複数のタスクを連鎖的に実行する手段がない。
そこで、ビルドツールを使用して1つのタスクにまとめる必要がある。

## 入門

https://qiita.com/yoshinariiii/items/8340286ec6f3ed6ff888
2017年 Symfony Meetupまとめ

2017年に開催したSymfony Meetupを振り返ります。

## Symfony Meetupとは？

Symfony MeetupはSymfonyを通じた交流会です。
コミュニケーションや情報交換の場としてご利用いただいております。
Symfony初心者や、Symfony本を読み終わった後に実践でどうしたらいいのかという人のためのサポート、Symfonyに限らずPHPやJS、OOPなど、毎回幅広い話題についてLTや議論が繰り広げられます。

## 2017年Meetup開催履歴

今年は3回開催することができました。
参加いただいた皆様、また会場をご提供いただいた企業の皆様、ありがとうございます。
去年の11回に比べると、開催頻度が低くなってしまい非常に申し訳なく思っております。

|日付|タイトル|開催場所(敬称略)|テーマ|
|:---|:---|:---|:---|:---|
|2017/02/18| Symfony Meetup #16　|サイボウズスタートアップス|レガシーコード改善座談会|
|2017/08/27| Symfony Meetup #17　|ORATTA|設計と実装をテーマに意見交換|
|2017/08/27| Symfony Meetup #18　|サイボウズスタートアップス| Symfony でどう書く？ |

## 2017年開催のMeetupまとめ

各回の様子やLT資料など、詳細は[#symfony_meetup](https://twitter.com/hashtag/symfony_meetup)で確認できます。

個人的には[#18](https://symfony.connpass.com/event/72114/)の「Symfony でどう書く?」というテーマはすごく学ぶことが多かったです。
本や、ネットではなかなか出てこない情報が共有され、より深くSymfonyについて学べました。

特に落合さんのコード解説は非常に勉強になりました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">お題3: Googleフォームライクなユーザーが自由にフォームを作れる機能<br><br>実コードで落合さんからの解説が！！<a href="https://twitter.com/hashtag/symfony_meetup?src=hash&amp;ref_src=twsrc%5Etfw">#symfony_meetup</a> <a href="https://twitter.com/hashtag/symfony_ja?src=hash&amp;ref_src=twsrc%5Etfw">#symfony_ja</a> <a href="https://t.co/t7tNsQmQ6a">pic.twitter.com/t7tNsQmQ6a</a></p>&mdash; せたけいごう (@kseta19) <a href="https://twitter.com/kseta19/status/934299990956023808?ref_src=twsrc%5Etfw">2017年11月25日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 2018年のMeetup
出来る限り年６回開催できるように努力します。
Meetupについて要望があるかたは、 [#symfony_meetup](https://twitter.com/hashtag/symfony_meetup) または [#symfony_ja](https://twitter.com/hashtag/symfony_ja)のハッシュタグをつけてツイートしてください。
今年こそ本当に温泉合宿したい！

## 最後に
[ロンドンで行われた Symfony meetup](https://frasco.io/the-global-php-community-continues-to-toxify-itself-and-we-need-to-halt-it-for-the-sake-of-our-peers-4ec9599fc203)であった出来事は非常に悲しい出来事です。
また、様々な場所で「Symfony vs Laravel」 の悲しい話がありました。

確かにフレームワークとしての思想が違うということは、いろいろ複雑なものがあるのかと思います。
それでも、お互いを理解し、尊重するべきだし、その場としてのSymfony Meetupになればいいなぁーと思っています。
別にSymfony Framework Meetupじゃないんだし、フレームワーク関係なく気軽に参加してもらえれば嬉しいです。

とうことで、今年1年ありがとうございました。
来年もSymfony Meetupをよろしくお願いします。
UIStackView内のView同士でEqualの制約をつけたらhiddenするときやばい


本日2本目のUIStackViewネタです。
1本目→[UIStackViewのトルツメで警告が出るのを防ぐ方法](https://qiita.com/PKPK-Carnage/items/d85bc823b4092975fd3a)

#UIStackViewでhiddenを切り替えてトルツメする時

こんな感じの画面を組みます。
黄色部分がボタンでUIStackViewに内包された赤と青のUIViewのうち、赤のUIViewのhiddenを切り替えることができます。
レイアウト適当な上にセンスなさすぎという声が聞こえてくる気がしますが耳を塞ぎます。 
![スクリーンショット 2017-12-25 23.47.34.png](https://qiita-image-store.s3.amazonaws.com/0/152335/0e466432-a21a-23c6-3db5-bc4264bb7d70.png "スクリーンショット 2017-12-25 23.47.34.png")

条件は赤のUIViewの高さの制約は300、そして青のUIViewとの間に高さのEqualの制約がつけられています。
想定としては、赤のUIViewが非表示になることで、青のUIViewが赤の位置に来るようになることとします。

![スクリーンショット 2017-12-25 23.51.56.png](https://qiita-image-store.s3.amazonaws.com/0/152335/4d60866a-5344-43e3-0cf2-ef5e8bf0ec8b.png "スクリーンショット 2017-12-25 23.51.56.png")

#iOS11の場合
赤のUIViewのhiddenをtrueにすると、青のUIViewが赤の位置に来ます。
![スクリーンショット 2017-12-26 0.29.12.png](https://qiita-image-store.s3.amazonaws.com/0/152335/f813f859-5b20-f2d1-8ce9-7fb57ac4c0f1.png "スクリーンショット 2017-12-26 0.29.12.png")

#iOS10以下の場合
赤のUIViewのhiddenをtrueにすると、青のUIViewも消えてしまいます。
![スクリーンショット 2017-12-26 0.29.37.png](https://qiita-image-store.s3.amazonaws.com/0/152335/a1d06ff0-f1ce-b556-0583-ba4ce4a73038.png "スクリーンショット 2017-12-26 0.29.37.png")


#原因
UIStackViewが赤のViewのhiddenを切り替えた際に高さの制約を0にしてしまうためEqualで紐づけられた青のUIViewも高さが0になってしまう。
iOS11の場合は、その辺り賢くなっててhiddenになる前の高さでViewの高さを計算してくれるので、何も考えなくていい。

#解決策
青のUIViewの高さの制約に赤のUIViewの高さの制約と同じ値を設定する。
そうすることで、Equalの制約を使わないためiOS10以下とiOS11で共通の動きを実現できる。
しかしEqualが設定できなくなるので不便
numpy.arange and datetime64[D]

```python
Z = np.arange('2016-07', '2016-08', dtype='datetime64[D]')
print(Z)
Z = np.arange('2016-11', '2016-12', dtype='datetime64[D]')
print(Z)
```
```
['2016-07-01' '2016-07-02' '2016-07-03' '2016-07-04' '2016-07-05'
 '2016-07-06' '2016-07-07' '2016-07-08' '2016-07-09' '2016-07-10'
 '2016-07-11' '2016-07-12' '2016-07-13' '2016-07-14' '2016-07-15'
 '2016-07-16' '2016-07-17' '2016-07-18' '2016-07-19' '2016-07-20'
 '2016-07-21' '2016-07-22' '2016-07-23' '2016-07-24' '2016-07-25'
 '2016-07-26' '2016-07-27' '2016-07-28' '2016-07-29' '2016-07-30'
 '2016-07-31']
['2016-11-01' '2016-11-02' '2016-11-03' '2016-11-04' '2016-11-05'
 '2016-11-06' '2016-11-07' '2016-11-08' '2016-11-09' '2016-11-10'
 '2016-11-11' '2016-11-12' '2016-11-13' '2016-11-14' '2016-11-15'
 '2016-11-16' '2016-11-17' '2016-11-18' '2016-11-19' '2016-11-20'
 '2016-11-21' '2016-11-22' '2016-11-23' '2016-11-24' '2016-11-25'
 '2016-11-26' '2016-11-27' '2016-11-28' '2016-11-29' '2016-11-30']
```
本番環境のデータが全部消えて無くなってもすぐ復旧できるようにしたい

# Herokuの本番環境がすべて消えて無くなるみたいな怖いことが起こったことはありませんか？

僕はあります。([Herokuでカードの期限切れててアカウントごと消去された話 - yo-log](http://yo-iida.hatenablog.com/entry/2017/08/13/084410))

たいていの人はちゃんとカードの更新とかしてると思うので問題ないと思いますが、万が一アカウントごと消されても余裕の表情で「すぐ復旧できるから大丈夫、そうHerokuならね」と言えるようにするための準備をいくつか書いてみようと思います。

# その1: アプリケーションの設定をTerraform管理にする

復旧するときに面倒なのが、アカウントを取り直してアプリケーションの設定をゼロからやり直すときです。アドオンに何入れてたとかは覚えているかもしれませんが、環境変数などは無理です。

普段からコード管理しておけばいざというときにコマンド一発ですべてを復旧できます。

こんなかんじ。

[yo-iida/heroku-terraform](https://github.com/yo-iida/heroku-terraform)

TerraformのHeroku providerのドキュメントは以下になります。

[Provider: Heroku - Terraform by HashiCorp](https://www.terraform.io/docs/providers/heroku/index.html)

アプリケーション、アドオン、証明書、ドメイン、パイプラインなどの管理ができます。基本の機能は揃っていると思いますので、なにかあったときに備えるという点では運用中のアプリケーションでもやっておくと安心できそうです。

ちなみに、最近HerokuでもDockerが普通に使えるようになりましたが[^1]、まだ普通に画面からポチポチアプリケーションの設定をしている方も多いのではないかという観点で書いております。Dockerで運用しているのであれば、Dockerイメージがあるのでこの話はいらないですね。

# その2: バックアップをとる(Herokuの外に)

アプリケーションが消えた時に復旧のしようがないのがDBなどのアドオンで使っているデータだと思います。

## DB

HerokuだとHeroku Postgresを使うことが多いと思います。Heroku Postgresにはバックアップの機能[^2]があり、定期的にバックアップをとるといったこともできます。

しかし、本番でバックアップをとっているからといって安心してはいけません。アカウントを消去された場合バックアップも消されます。

なので、バックアップをHerokuの外に置くことを考えます。バックアップは、

`heroku pg:backups:download`

でローカルに落とせますが、手元の環境でcronに仕込むみたいなのはいかにもいけてないので、AWSのEC2などにherokuコマンドを実行できるインスタンスを用意して定期的にS3にバックアップデータを置くような仕組みを作るとよさそう。

## その他

その他のアドオンについてはこれといって良い案がないので誰か教えてください。特にDNSなんかはアドオンで使っているものを再設定するのは結構めんどくさいと思います。
AWSであればTerraformで管理できるのでDNSもRoute53にするというような合わせ技で考えるといいかもしれません。

# まとめ

Terraformでコード化して管理すると嬉しいよという話はいいとして、（アカウントを消されるというレアなケースについて）バックアップのバックアップをとるみたいなよくわからない話を書いてしまいすみませんw（と、言いつつバックアップ先にHeroku外のストレージを指定できるオプションがあるとうれしいのでは？という気もする）

個人的には**Heroku Billingメールをちゃんとみるということに尽きる**と思っております。

[^1]: [Heroku で Docker を使う場合の諸注意 - Qiita](https://qiita.com/sho7650/items/9654377a8fc2d4db236d)
[^2]: [Herokuでデータベースのバックアップを行いたい - Qiita](https://qiita.com/kimunny/items/c841bed5df73f0f93067)
Vivaldiブラウザーの薦め


[Vivaldiブラウザー](https://vivaldi.com)とはブラウザーを自分の使い心地が良いようにカスタマイズしたい方向けのブラウザーです。

Opera創業者のテッツナー氏とその同僚だった冨田龍起さんによりVivaldiは創業されました。

# この記事の目的

この記事はVivaldiをお薦めすると共に、アドベントカレンダーに載せる目的のために書きました。アドベントカレンダーを作ることは前から考えていたのですが、年末はいろいろと時間がなくギリギリとなってしましました汗

Vivaldiの紹介に関しましては既にネット上に素晴らしい記事が転がっておりますので、そちらをご参照頂きたいのとともに、25日もギリギリとなってしまったため、1つ私のおすすめの機能を使い方とともにご紹介させて頂きます。(＊ちなみに私はVivaldiの色がサイトのテーマカラーに合わせて変わるのがオシャレで好きです。)

# お薦めの機能と使い方
では早速私のお薦めの機能と使い方を紹介します。
[Webパネル](https://help.vivaldi.com/article/web-panels/)という、お気に入りのような感じでサイトを登録し表示する大人気の機能があります。
実際に御覧ください。左側の時間が表示されている部分がWebパネルです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214830/8fe3f3f1-d20c-a9ba-ca70-50d7373a7f88.png)

私はWebパネルにツイッターなどを表示し、業務中いつでも見られるようにしております。

それは冗談ですが、自分で作ったサイトをGithub Pagesなどで公開し、サイドパネルに登録しておくのがお薦めの使い方なのです！！

例えば、私は業務で行った細かなタスクを夕方の日報を書く時間帯には忘れていたりするので今回[Task Timer](https://gkuga.github.io/TaskStamp/)を作ってみました。

このように記録できます！！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214830/ab4318c9-35fc-2fcc-2321-0ebf797247a6.png)

以上、簡単でしたが「Vivaldiブラウザーの薦め」でした！！
sqrt and emath.sqrt in numpy

```python
A = np.emath.sqrt(-1)
B = np.sqrt(-1)
print(A)
print(B)
print(A==B)
```
```
test.py:5: RuntimeWarning: invalid value encountered in sqrt
  B = np.sqrt(-1)
1j
nan
False
```
# Refs
* [numpy.sqrt](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.sqrt.html)
直進迷路覚え書き

# 直進迷路覚え書き
[総コン Advent Calendar](https://adventar.org/calendars/2584) 最終日，25日目です！

今回は，私が中間発表会で発表した，直進迷宮のアルゴリズムについてお話ししようと思います．
## 直進迷路とは
スタートからゴールを目指すのは普通の迷路と同じですが，プレイヤーが迷路を移動する際，壁にぶつかるまで止まることができないという制約を課した迷路のことを直進迷路と呼びます．なお，公式の資料があるわけではなく，ただなんとなくみんなそう呼んでいるだけです．

要約すると，ポケモンでよく見るやつです．
![こおりのぬけみち](http://pokemongo-master.com/wp-content/uploads/2017/09/original.png)


## 直進迷路作成アルゴリズム
直進迷路を作成する手順は，以下の４つに分解できます．

盤面を定義する
↓
正解のルートをデザインする
↓
デザインの通りに動けるよう，壁を配置する
↓
デザインのルートが最短になるよう，壁を配置する

これらそれぞれについて流れを解説しながら，自動化へのポイントを話せていけたらなと思います．
### 1．盤面を定義する
これは初期条件を決めるということですね．
初めに必要なのは，
- 迷路の盤面の大きさ
- スタートとゴールの位置

になります．今回は10×10の盤面で，左上をスタート，右下をゴールと定義します．
これは普通の迷路と変わりませんね
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/226432/e32084fb-e494-2583-c321-783271d810cb.png)

### 2．正解のルートをデザインする
これも普通の迷路とそんなに変わらないですが，デザインの際は直進しかできないことを忘れてはいけません．それなりに気を付けてデザインしないと，次の段階でエラーになってしまいます．
エラーにならない条件は，以下の通りです．
- 矢印の先のマスを通過点にしない
- 同じマスを平行方向に通らない（交差はOK）
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/226432/125af4aa-e8c0-8a7a-8141-8939726adab2.png)

### 3．デザインの通りに動けるよう，壁を配置する
ここからが直進迷路特有のアルゴリズムです．上記の図の矢印の先に，壁を置きます．こうすることで，このデザインの通りに動けばゴールにたどり着くことが保証されます．
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/226432/1d510ae2-61a5-5322-3629-95875a110d75.png)

ですが，これで迷路が完成したわけではありません．見てわかる通り，まだ最短ルートが残されているからです（図の場合は↓からの→）

### 4．デザインのルートが最短になるよう，壁を配置する
他の最短ルートが成り立たないよう壁を配置します．ここを美しくすると，迷路の評価が高くなる傾向があります．
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/226432/204b2b56-7d7d-dbc9-f0d2-8c631dbbffd8.png)
美しい迷路を作るためのコツとして，以下が挙げられます．
- 矢印を交差させる（ループを作る）
- ゴールを壁に隣接させない
- 露骨な行き止まりを作らない

上2つは簡単に自動化できそうです．でも露骨な行き止まりの判定はちょっと複雑そうですね．
## 直進迷路解法アルゴリズム
直進迷路の解を求める方法は，わかってしまえばとても単純です．
ただ，私が片手間に考えたものなので，もっと素早く計算できるアルゴリズムがあるかもしれません．そのときはご一報ください．
### 1.ゴール以外のすべてのマスに"100"を代入する
それぞれのマスを表すint型の配列を用意して，中身を"100"で初期化します．以下の画像では，単純化のために"0"を入れてますが，実際には"100"が入っていると思ってください．
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/226432/5e3c5048-051e-1c24-7ce5-93bc6fb53367.png)

### 2.ゴールに1手でたどり着ける場所に"1"を代入する
その処理をしたのが下の図
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/226432/9bcf0723-c86a-89d3-af2b-716cb9d06bd4.png)
ゴールの左側からしかゴールできないので，Gの左側のマスが"1"になったことが確認できます．

### 3.さきほど代入したマスの左右どちらかに壁があるとき，壁とは反対側の列に"1つ大きい数"を代入する
その処理(ry
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/226432/0a01b901-0945-8e3f-f8d1-9d1aea6bec74.png)
なんとなく感覚はつかめたでしょうか．実は，3の処理を繰り返すと，この迷路を解くことができます．

それでは，3の処理をもう一度行った図を見てみましょう．
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/226432/2a463829-a961-19f5-a57d-3c6fbb5e901e.png)
このときに注意して見てほしいのが，"2"の振られているマスには"3"が振られていないことです．

この数字はズバリ__そのマスからゴールにたどり着ける最短手数__を表しているのです！

つまり，このアルゴリズムは__ゴールまでの最短距離をゴールから逆算することで求めて__います．

### 最終結果
このアルゴリズムで最後まで探索を行うと，以下のようになります．
![009.PNG](https://qiita-image-store.s3.amazonaws.com/0/226432/940e0124-1990-83cf-e2c9-d88b393146d9.png)
この時点でSのマスには"7"が振られており，最短手数は7手であることがわかります．

そして，最短経路はSから見て赤字を踏むように進むというわけです．(ちなみに，この盤面には別解があります．別解を防ぐ作り方はいつかやろうかなと思ってますが今回は触れません)

以上が基本的な直進迷路になります．

## 直進迷路の応用
さて，一番最初に直進迷路の利用例としてポケモンを挙げたわけですが，実は，ポケモンの直進迷路はさらにアレンジが加えられることがあります．
かいりきで動く岩なんかがいい例です．あれがあると，直進迷路の幅が広がります．

直進迷路の応用例として，以下の3つなんかは面白いと思いますね！
- 動く壁
- 開閉扉
- 落とし穴
これらの要素を導入すると，最短経路探索がより高度なものになっていきます．次回は，動く壁と最短経路の関係について，書いていく予定です．
npmを使ってプロジェクトの作成【ログ】

```linux-config

   22  mkdir [ディレクトリ名]
   23  ls -la
   24  cd [ディレクトリ名]
   25  mkdir angular-test
   26  cd angular-test/
   27  npm init
   28  ls -la
   29  ll
   30  ls -la
   31  cat package.json 
   32  npm install @angular/cli 
   33  ls -la
   34  cd node_modules/
   35  ls -la
   36  cd ..
   37  ls -la
   38  cat package
   39  cat package.json 
   40  git init
   41  ls -la
   42  git status
   43  echo node_modules >> .gitignore
   44  git status
   45  echo package-lock.json >> .gitignore
   46  git status
   47  git add
   48  git add .
   49  ls -la
   50  git status
   51  cat .git/config 
   52  git remote add origin [リポジトリURL]
   53  cat .git/config 
   54  git commit -m "init commit"
   55  git config user.name "[名前]"
   56  git config user.email [メアド]
   57  cat .git/config 
   58  git status
   59  git push -u origin master
```
AI関連の情報収集に役立っているサイトなど。

日々投稿されるAI関連の情報。
私は、定期的に情報収集しており、その中でよく見るサイトやSNSアカウントをまとめていきます。

# メディア
### AINOW

http://ainow.ai/


# SNS(Twitter)


### 松尾 豊
https://twitter.com/ymatsuo

### 岡野原 大輔
https://twitter.com/hillbig

### aidiary
https://twitter.com/sylvan5

### Demis Hassabis
https://twitter.com/demishassabis

### arXiv 論文メモ
https://twitter.com/kavvase

# Community(Facebook)

### 全脳アーキテクチャ
https://www.facebook.com/groups/whole.brain.architecture/?fref=ts

### 全脳アーキテクチャ若手の会
https://www.facebook.com/groups/713921892010595/

### 人工知能研究コミュニティ AI Academy
https://www.facebook.com/groups/1892746874314837/?fref=ts

### 人工知能研究会 / AIR
https://www.facebook.com/groups/1024547137580925/?fref=ts

### 人工知能 研究会グループ
https://www.facebook.com/groups/teamaisupporters/?fref=ts

### 随時更新中
numpy.seterr and numpy.errstate

```python
defaults = np.seterr(all="ignore")
Z = np.ones(1) / 0
print(Z)
# Back to sanity
_ = np.seterr(**defaults)
print(_)
# An equivalent way, with a context manager:
with np.errstate(divide='ignore'):
    Z = np.ones(1) / 0
    print(Z)
    Z = np.ones(1) / 0
print("after with:")
Z = np.ones(1)/0
print(Z)
```
```
[ inf]
{'over': 'ignore', 'divide': 'ignore', 'invalid': 'ignore', 'under': 'ignore'}
[ inf]
after with:
test.py:16: RuntimeWarning: divide by zero encountered in divide
  Z = np.ones(1)/0
[ inf]
```
# Refs
* [with構文とは何なのか](http://reiki4040.hatenablog.com/entry/20130331/1364723288)
お気に入りのキーボード、マウス、コーヒー

## 概要
☆メリークリスマス☆
この記事は「[キーボードとマウスとコーヒーと Advent Calendar 2017](https://qiita.com/advent-calendar/2017/keyboard_mouth)」の25日目の投稿です。
日々、自分が使用しているガジェットたちを紹介します。
飛び入りで失礼いたしますm(_ _)m



## 会社編

![IMG-1484.jpg](https://qiita-image-store.s3.amazonaws.com/0/139532/57d8ac15-fa21-13f3-f24f-26bb0128996c.jpeg)

### キーボード
#### 東プレ REALFORCE 91UBK-S
会社で使っているMac Book Pro 15インチの上に乗せて使っています。
爪を立てれば干渉することはありません。
横幅もほぼ同じ（左右5mm出る程度）なので快適に使えております。
職場で使う前提だったので静音の-Sをチョイスしました。

### マウス
#### Apple Magic Trackpad
旧式のトラックパッドです。
キーボードをPCの上に乗せているためトラックパッドが使えません。
右側に配置できるので使いやすくなりました。

### コーヒー
#### FamilyMartCollection ストレートティー
コーヒーでなくすみません、、ファミマブランドのアイスティーです。
無糖ですっきりしてるのでゴクゴク飲めます。
930mlの大容量も◯



## 自宅編

![IMG-1485.jpg](https://qiita-image-store.s3.amazonaws.com/0/139532/a3d0c8fb-fb0b-30bb-ee4a-8173951a864d.jpeg)

### キーボード
#### Razer Ornata
PCでゲームをやるのでゲーミングキーボードです。
Ornataはメカ・メンブレンというRazerが設計開発した新しいキースイッチです。
カチカチ音がなり適度な打感でお気に入りです。

### マウス
#### Razer DeathAdder Elite
マウスもゲーミング用です。
ゲーミング用としてはオーソドックスなものです。
握りやすかったのでこれをチョイスしました。

### コーヒー
#### ネスカフェ エクセラ ボトルコーヒー 甘さひかえめ
今まで飲んできたコーヒーの中で一番スッキリしているのでお気に入りです。
甘さが欲しい時は牛乳を入れて調整しています。

## まとめ
実はスピーカーもヘッドセットもワイヤレスイヤフォンもRazer製。
Razerサイコー！
それでは Have a Happy New Year!
今年の振り返りと来年の抱負

この記事は、[Rails Girls Japan Advent Calendar 2017 最終日]
(https://qiita.com/advent-calendar/2017/railsgirlsjapan)の記事です。
[去年](https://qiita.com/advent-calendar/2016/railsgirlsjapan
)に引き続きの参加です。

ということで、今年1年のRailsGirlsに関係した振り返りと、来年の抱負（的なもの）を書こうかと思います。
（最終日だけど、割と普通な感じです・・・）

# 一応、自己紹介
@yadaita です。Nagoya 1st〜4thのオーガナイザーやってます。
関西圏で開催されているRails Girlsでも、コーチでお手伝いしたりしています。
くまモン好きです。（←超重要。）

# ということで、今年1年振り返って...

## 参加したRailsGirls
今年は２つのRailsGirlsに参加しました。

**Kitakyushu 1st(2017/3/10-11)**
九州初開催のRailsGirls。コーチとしてお手伝いさせていただきました。
開催のお手伝いの一環として、オーガナイザーの方には、Nagoya3rdに見学に来ていただいて、RailsGirlsの雰囲気（の一片）を感じていただいたこともあったので、コーチとしても
開催のお手伝いできて良かったです！

**Kyoto 8th(2017/11/24-25)**
事前〜当日で、スタッフ（裏方）をやってました。沢山の方々の協力をいただき、
無事開催することができました。ありがとうございます！
今回得られた教訓を次回以降に活かせるといいなあ。。。としみじみ思っています。
（・・・もう１ヶ月経ったのか・・・）

## その他起こった出来事（？）
**関西圏でのRailsGirls、自分の用事と被りまくった・・・**
kyoto 8th以外では、Osaka 4th、Kyoto 7th、Kobe 3rdがあったのですが、
自分の用事と被りまくりで、コーチ応募すらできず...(遠い目)
用事自体は仕方ないので、とりあえず来年は被らないことを祈っとこう・・・ 


# 来年の抱負
## まずは[Nagoya 4th](http://railsgirls.com/nagoya)
オーガナイザー頑張ります。2018/1/26,27開催です！

## 最初の1歩目の背中を押すお手伝い
「Rails Girlsのオーガナイザーやってみたい」とか「Rails Girlsに参加してみたい」とか思っても、最初の1歩目は、ものすごくエネルギーがいることだと思っています。
（私自身もそうだった・・・）
なので、最初の１歩目がなかなか踏み出せない人の背中を（ドーンと）押すお手伝いができるといいなあ・・・と思ってます。

例えば、「Rails Girlsのオーガナイザーやってみたい！」という人を見つけたら、見つけ次第オーガナイザーグループ紹介するとか（← 今もやっているけど・・・）、
「Rails Girlsに参加してみたい」という人を見つけたら、直近のRailsGirlsの案内や
ちょうど近場でやっているようならば応募の手助け（Doorkeeperの手ほどきから）するとか。

## とっかかりのハードルを少し下げるお手伝い
Rails Girlsでも、どうしてもターミナル（コマンドプロンプト）が必要だったり、
なかなかPCを触る機会がない普段の生活ではお目にかかりにくいものを使うことになるので、
https://github.com/railsgirls-jp/materials/blob/master/Command_Cheatsheet.pdf
みたいなものを充実させて、最初のハードルをちょっとでも下げていけるといいなあ・・・と思っています。

## Rails Girls Japanメンバーとしての活動
・・・できるところから頑張ります・・・（汗）


# 最後に。
直近のRailsGirlsとして、 [Rails Girls Nagoya 4th](http://railsgirls.com/nagoya)を、2018/1/26,27に開催します！！
1/11まで申し込み募集中ですので、もしプログラミングに興味を持っている女性が
周囲にいましたら、参加をすすめてみてください！

また、名古屋以外の他の地域でも随時開催されていきますので、定期的に
http://railsgirls.jp
をチェックしてみてください！
Java - JTableの作り方

# 考え方
1. 初期データ構造を作る（カラムとデータ）
2. DefaultTableModelを作成
3. JTableを作成
4. JScrollPaneに入れる
5. JFrameに入れる
6. 描画する

# サンプルコード
1, データ構造を作る

```
String[] columnNames = { "1", "2", "3", "4" };

String[] data1 = { "A", "B", "C", "D" };
String[] data2 = { "E", "F", "G", "H" };
String[] data3 = { "I", "J", "K", "L" };
String[] data4 = { "M", "N", "O", "P" };
String[] data5 = { "Q", "R", "S", "T" };

String[][] data = { data1, data2, data3, data4, data5 };

```
2, DefaultTableModelを作成

```
DefaultTableModel model = new DefaultTableModel(data, columnNames);
```

3, JTableを作成

```
JTable table = new JTable(model);
```

4, JScrollPaneに入れる

```
JScrollPane spane = new JScrollPane(table);
```

5, JFrameに入れる

```
JFrame frame = new JFrame("Title");
frame.setSize(500, 500);
frame.add(spane);
```

6, 描画する

```
frame.setVisible(true);
```
spitsh(Spook in the Shell)で遊ぶ

こんにちは、25日目の投稿になります。

今日はPerl 6(nqp)で記述されたOSSである[spitsh](https://github.com/spitsh/spitsh)で遊びたいと思います。
spitshは"Spook"という言語をコンパイルして、シェルスクリプト互換の命令文を出力することができます。このコンパイラはnqpで書かれているようです。

# Spitshのインストール

zefを使います:

```
$ zef install Spit
$ spit eval 'say "hello world"'
```

# dockerのインストール

+ 私の環境はDebian Stretchなので、これを前提に進めていきます

+ まず次のページの手順に従ってdockerを入れてください: 
  + https://docs.docker.com/engine/installation/linux/docker-ce/debian/

+ その後、sudoじゃなくても実行できるようにするために次の手順を実行してください:
  + https://docs.docker.com/engine/installation/linux/linux-postinstall/ 
  + `3.`のログアウト＆ログインを忘れずに実行しましょう (自分は忘れて若干詰まりました)

# Synopsis(の一部)の実行

次のコマンドでは、centosの環境において、ncコマンドがインストールされてなかった場合にそれを行うためのSpookプログラムを生成します:

```
$ spit eval --os=centos  '.install unless Pkg<nc>; ok Cmd<nc>,"nc command exists now"'
```

実行結果:

```
BEGIN(){
  e(){ printf %s "$1"; }
  exec 4>/dev/null
  installed(){ yum list installed "$1" >&4 2>&4; }
  install(){ yum install -y $1 >&4 2>&4; }
  exists(){ command -v "$1" >&4; }
  exec 3>&1
  say(){ printf '%s\n' "$1" >&3; }
  note(){ printf '%s\n' "$1" >&2; }
  die(){ note "$1" && kill "-TERM" $$ >&4; }
  ok(){ test "$1" && say "✔ - $2" || die "✘ - $2"; }
}
MAIN(){
  if ! installed nc; then
    install nc
  fi
  ok "$(exists nc && e 1)" 'nc command exists now'
}
BEGIN && MAIN
```

次は、dockerで実行してみましょう:

```
$ spit eval --in-docker=centos '.install unless Pkg<nc>; ok Cmd<nc>,"nc command exists now"'
```

実行結果:

```
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
85432449fd0f: Pull complete 
Digest: sha256:3b1a65e9a05f0a77b5e8a698d3359459904c2a354dc3b25ae2e2f5c95f0b3667
Status: Downloaded newer image for centos:latest
Installing pacakges: nc
warning: /var/cache/yum/x86_64/7/base/packages/libpcap-1.5.3-9.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Importing GPG key 0xF4A80EB5:
 Userid     : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>"
 Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
 Package    : centos-release-7-4.1708.el7.centos.x86_64 (@CentOS)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
✔ - nc command exists now
```

# Synopsis以外のコマンドの実行

興味のある方は`/doc`ディレクトリを見てみましょう: https://github.com/spitsh/spitsh/tree/master/doc

まだ未完成な部分が多そうですが今後に期待です。

# さいごに

これで、2017年のPerl 6アドベントカレンダーは終わりになります。
ここまで読んでくださった読者の皆様ありがとうございます。
そして、お忙しい中寄稿してくださった @AnaTofuZ さん、@debility さんありがとうございました。
numpy.intersec1d

```python
Z1 = np.random.randint(0,10,10)
Z2 = np.random.randint(0,10,10)
print(Z1)
print(Z2)
print(np.intersect1d(Z1,Z2))
```
* e.g.

```
[9 4 4 8 5 7 0 5 8 3]
[6 5 6 4 2 0 7 6 1 5]
[0 4 5 7]
```
# Refs
https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.intersect1d.html
uniform and copysign in numpy

```python
Z = np.random.uniform()
print(Z)
Z = np.random.uniform(-10,+10,10)
print(Z)
X = np.abs(Z)
print(X)
X = np.ceil(X)
print(X)
print (np.copysign(X, Z))
```
* Example

```
0.297774430482
[-5.31026009  9.98449158  3.076944    7.08218499  5.61464144  4.22338776
 -5.8796651   0.59692508 -4.31708105 -4.49341327]
[ 5.31026009  9.98449158  3.076944    7.08218499  5.61464144  4.22338776
  5.8796651   0.59692508  4.31708105  4.49341327]
[  6.  10.   4.   8.   6.   5.   6.   1.   5.   5.]
[ -6.  10.   4.   8.   6.   5.  -6.   1.  -5.  -5.]
```
# Refs.
* [一様分布](https://ja.wikipedia.org/wiki/%E4%B8%80%E6%A7%98%E5%88%86%E5%B8%83)
* [分布様式](https://ja.wikipedia.org/wiki/%E5%88%86%E5%B8%83%E6%A7%98%E5%BC%8F)
* [copysign](http://pppurple.hatenablog.com/entry/2016/04/24/230450)
自然非言語処理第２２日目：クロスモーダルな非言語処理（応用編）

最近のVRってすごいですよね。

特にサマーレッスンって言うゲーム。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78052/f1a41a8a-bf3a-8b1f-5b57-46d4d296c738.png)
図 サマーレッスンのイメージイラスト（[1]より引用）

おっさんがめっちゃかわいい女子高校生に（学業についての）あんなことやこんなことを教えることができます。
あんなことやこんなこと教える際にめっちゃ至近距離で顔を近づけるのですが、ふとそんなときになぜか女性の息遣いを感じるらしいのですよね[2]。

*VRだから風なんて出ないのにね*

**はい**

我々は複数の感覚を統合して刺激をマルチモーダルで認識し世の中を把握しています。
たとえば、会話するときには聴覚だけではなく視覚も使って認識したり、
異性の顔に近づくときは視覚だけではなく当然呼吸の息遣いなどを皮膚感覚で感じる事があるわけです。
~~そんなに異性に顔を近づけたことねぇよという方はもしかして私よりも悲しい人生を送っているのでしょうか~~

しかし、VRでリアルな女性が目の前にいる状態を再現して、実は呼吸の息遣いは出ていないとするとどうなるのでしょうか。
実は錯覚を起こして、息遣いが感じられるようです。

この現実世界をマルチモーダル認識する限りでは起きないのだけれど、
一部の感覚を欠損させる特殊な状況下に置かれた際に脳が作り出す現象を
**クロスモーダル現象**と言います。

# クロスモーダル現象の例
- 腹話術
- McGurk効果
- ラバーハンド錯覚
- 幻肢痛

# 実装： 実践！McGurk効果
McGurk効果を応用して、バーチャルエージェントと音声合成を使ってクロスモーダル現象を自力で起こしてみましょう。
**（時間があったらね）**

# まとめ
今回はマルチモーダル認識が原因で引き起こる現象、クロスモーダル現象を説明しました。
このクロスモーダル現象がダメなことばかりではなく、うまく使えば、少ない感覚で多くの情報を引き出せるというメリットがあります。
このため、最近ではVRなどを通して研究が活発になっています。

[1] http://dic.nicovideo.jp/a/%E3%82%B5%E3%83%9E%E3%83%BC%E3%83%AC%E3%83%83%E3%82%B9%E3%83%B3
[2] https://fulldive.info/column/crossmodal-perception
2017年度 Advent Calendar のまとめ


本記事は ETロボコン Unofficial Advent Calendar の最終日の記事です。


## まずは書いてくれた人ありがとう
今年はカレンダーの作成が遅れた上に、更に告知も遅れたこと、個別にお声がけもほとんどできていなかったことなどが積み重なってしまったので、どうなることかと思っていましたが、投稿いただいた方どうもありがとうございました。


## 待ち人来たる
「今年の活動中、過去のAdvent Calendarを読んで参考にさせて頂いたので、Team ASaGiもブロック並べの攻略を中心に、得られた知見やノウハウを公開したいと思います。」
[Team ASaGiさんのエントリー](https://qiita.com/TeamASaGi/items/fae6296d3b012f01fb7f)の一文です。
超大作が突然アップされていて驚いたのですが、さらに上記一文に感涙でした。過去記事を投稿してくださった方は同じ気持ちだったのではないでしょうか。
今年もたくさんの有益な情報を書いてくださっているので、来年もこのようなチームが現れることを心待ちにしています。

そして、ETロボコンシミュレータについて書いてくださった@tsukamoto17さん、実は去年もお願いしたのですが、もうちょっと完成度を高めてからということで辞退されてしまいました。そして今年、見事に大作を作り上げて投稿してくれました。

あと、地区大会での活躍を拝見して、お声がけしたいけど連絡先知らないしなーと思っていたら、Twitterでお見かけして突然お声がけしてしまったにもかかわらず快諾いただいた @tiger_828 さんも試験で忙しかったところ、ありがとうございました。

## デカタイヤ情報

CS大会に行けなかったチームにとって、@jtFuruhataさん自ら来年度のタイヤ情報を書いていただけたのはありがたかったことでしょう。

ちなみに、githubの方で公開されている走行体の「非公式」組立図も更新されてますね。
https://github.com/ETrobocon/etroboEV3/tree/master/BuildingInstructions
こちら READ ME にも書かれてるとおり、（かつてタッチセンサーの位置が逆だったこともあるように）正式な走行体とは組み方が多少異なる場合があるので、注意してください。

さらに、サンプルコードを作成されてる最速ダミーカー @pulmaster2さんのコード解説記事も、とても充実しています。


## 難所攻略法
偶然にもアドバンストの二大難所について書いてくれました！たとえ難所が大幅に変更になったとしても基本的な考え方はとても参考になるでしょう。

## UMLの仕様
「UMLの仕様を読もう」という記事もありました。

UMLの仕様自体は、英語なら、仕様を作成されているOMGという団体のサイトから無料で閲覧できます。
http://www.omg.org/spec/UML
ちょっと古いですが、UML2.0,2.1なら日本語訳書も出版されていました。今は売ってなさそうですが、学生さんなら図書館に行けばあるかもしれませんね。英語はちょっと…という人はこちらを参考にしながら英語版を読むとよいかもしれません。
https://www.amazon.co.jp/UML2-0%E4%BB%95%E6%A7%98%E6%9B%B8-2-1%E5%AF%BE%E5%BF%9C-Object-Management-Group/dp/4274066630


## ツール
実際につかっているツールの仕様もいくつか紹介されていましたね。今年はそこまで手が回らなかったチームの方も、来年に向けて今がチャンス！まずは小さいものから始めましょう。もし、うちだってすごいツール使ってたよ！というチームがあればぜひ紹介してください。[^fn7]

## 記事を書いてくれたOBのブログ

今年は光センサーの話を中心に書いてくれたchihayafuruさんも言わずと知れたOBさんですね。[すねいる ＥＴロボコン日記](https://www.chihayafuru.jp/etrobo/)は光センサー周りを中心に丁寧に書かれているし、EV3もキャッチアップしているので一読をおすすめします。

[NoriyukiMizuno](http://blog.amateur-factory.jp/)さんもETロボコン参加者向けに大作を書いてくださいました。ちなみに去年のAdvent Calendarにもいくつか書いてくれていますよ。
[今年の記事](http://blog.amateur-factory.jp/?eid=1444291)にある「「業務系」の概念/クラスモデル」よく見ると、「こちらの図は不十分なものしかできてませんでした…」ってありますね。
一からモデルを書くのは難しいと思ってる人がいたら、このモデルを完成させてみてはどうでしょうか。

## 来年度に向けて今からがんばろう

今年は「オフシーズンに何をするといいか」のヒントをくれたエントリーがいくつかありましたね。

過去にも、2015年度のカレンダーの[ETロボコン2016で勝つために](http://ylgbk.hatenablog.com/entry/2015/12/25/000000)という記事、発起人のy_uuuさんが書かれたものですが、こちらも「翌年度のためにシーズンオフに何をしたらいいか」が書かれています。今でも十分に通用する内容なので、こちらも参考にするとよいでしょう、


## 最後に


続けるうちに、このカレンダー独自ルールができてきました。そのうちの一つに「Advent Calendar本来の意味にこだわらず、空き枠がある限りいつでも書いて良い」というのがあります。年末進行で忙しかったけど冬休みなら時間とれそうという方、ぜひチャレンジしてみてください！
また、もしも枠がいっぱいになった後に記事を書かれた方がいたらお知らせいただけるとリンクさせていただきます。

今年書いていただいた記事がとても良かったので、来年もAdvent Calendarを続けたいと思いました。来年度、このカレンダーの記事が参考になったら、小さな気づきでも十分なので、今度は次の参加者のために記事を書いてみてください。

そして、このような素晴らしい企画をETロボコンに運んできてくれた@Y_uuuさんに改めてどうもありがとう！[^fn5]



[^fn5]: 去年のコピペみたいだけど、他に良い言葉が思いつかなかったので・・・。
[^fn7]: 空き枠はまだありますよ
ArchlinuxのVirtualboxで「Failed to insert 'vboxdrv': Exec format error」となるとき

ある日、Linuxの起動メッセージを見たら赤い謎の部分がある。
怖いのでsystemctlで見てみたら、なんと`systemd-modules-load.service`が起動時にエラーを起こしているみたいで、確認してみたらこんな表示が。

```
12月 25 22:38:00 archlinux systemd-modules-load[3217]: Failed to find module 'acpi_call'
12月 25 22:38:00 archlinux systemd-modules-load[3217]: Failed to find module 'vboxdrv'
12月 25 22:38:00 archlinux systemd-modules-load[3217]: Failed to find module 'vboxpci'
12月 25 22:38:00 archlinux systemd-modules-load[3217]: Failed to find module 'vboxnetadp'
12月 25 22:38:00 archlinux systemd-modules-load[3217]: Failed to find module 'vboxnetflt'
12月 25 22:38:00 archlinux systemd[1]: systemd-modules-load.service: Main process exited, code=exited, status=1/F
12月 25 22:38:00 archlinux systemd[1]: systemd-modules-load.service: Failed with result 'exit-code'.
12月 25 22:38:00 archlinux systemd[1]: Failed to start Load Kernel Modules.
```

そして、案の定VirtualBoxで仮想マシンが起動しない。

# 解決方法

原因は、Linuxのカーネルをデフォルトから変更していたことでした。
自分は`Linux-pf`を導入していたのでそれが問題です。
pacmanでインストールできるvirtualvoxは、デフォルトで`virtualbox-host-modules-arch`というパッケージを依存とします。これはvirtualboxが起動に必要なカーネルのモジュールなのですが、デフォルトのlinuxカーネルにしかインストールされません。
なので、かわりに`virtualbox-host-dkms`をインストールする必要があります。

```
$ sudo pacman -S virtualbox-host-dkms
```

インストールするときに、「これはvirtualbox-host-modules-archと衝突するからvirtualbox-host-modules-arch消しとく？」みたいな表示があるので問答無用で消します。

これで無事エラーは出ず、仮想マシンも起動できるようになりました。
やったね！！





**っていうか[archlinux wiki](https://wiki.archlinux.jp/index.php/VirtualBox)に書いてあるじゃん！！！！**
nvmで、Node.jsとnpmのインストール（Mac）

```linux-config

# nvmのインストール
git clone git://github.com/creationix/nvm.git ~/.nvm

# 設定の読込
echo "source ~/.nvm/nvm.sh" >> ~/.bash_profile && source ~/.bash_profile

# nvmのバージョン確認
nvm --version

# install 可能なnode確認
nvm ls-remote

# v8.9.3のインストール（Latest）
nvm install v8.9.3

# インストールされたか確認
node -v

# npmも確認
npm -v

```
.bash_profileと.bashrcのまとめ


# はじめに
bashを使うにあたり、使用環境をユーザ好みにカスタマイズができる。

- .bash_profile
- .bashrc

この２つが設定ファイルである。
それぞれのファイル設定の使い分けをまとめる。

# .bash_profile
**ログイン時**に1回、実行される。
例えば、ターミナル.appを起動した際に読み込まれる。

このファイルには具体的に何を設定すれば良いのかは、

- 環境変数（exportで宣言する変数）

を設定すると良い。

# .bashrc
**シェル起動時**に１回、実行される。
コマンドライン上で**bash**と叩くと再度.bashrcが読み込まれる。（.bash_profileは読まれない）
シェルを起動する度に毎回設定したい場合はこのファイルに設定を入れる。

このファイルには具体的に何を設定すれば良いのかは、

- エイリアス
- シェル関数
- コマンドラインの補完

を設定すると良い。


#設定ファイルをつくる

上記2つのファイルはどこに配置しているのか。

```
~/.bash_profile
```

```
~/.bashrc
```

ともにホームディレクトリにある。
しかし人によってはファイルがない場合もあるよう。（私は２つともなかった）

、、、なので作ります。
**touch**コマンドで空のファイルを作成する

```
$ touch ~/.bash_profile
```

```
$ touch ~/.bashrc
```
ファイルができたことを確認

```
$ ls -a

.bash_profile		.viminfo		Public
.bash_sessions		Applications		VirtualBox VMs
.bashrc
```

これで設定ファイルができた。
どのような設定を行うかはまだ別のエントリに。。。

#参考
[本当に正しい .bashrc と .bash_profile の使ひ分け](https://qiita.com/magicant/items/d3bb7ea1192e63fba850)
[.bash_profile と .bashrc は何が違うの？使い分けを覚える](https://neos21.net/blog/2017/02/12-02.html)
自然非言語処理第２４日目：意識そのものの非言語処理（応用編）

![mediation.jpg](https://qiita-image-store.s3.amazonaws.com/0/78052/96624ab6-9d2a-8c1f-7395-681573ac049f.jpeg)

あなたには意識はありますか？
というか意識ってなんですか？

そんなこと考えちゃうとか*意識高い*ですね！

**はい**

今回は現状不可能だと考えられている他人との意識の共有について議論したいと考えております。

# 意識って何さ

>意識とは、私たちが、夢を見ない眠りから覚めて、再び夢のない眠りに戻るまでの間持っている心的な性質のことである

と哲学者ジョン・サールは言っています。
ジョン・サールの言うとおりに解釈すると、意識があるときには少なくとも起きているようです。この起きている具合を覚醒度といいます。
また、意識のあるときは感覚から刺激を認識することができます。また、認識するだけではなく、赤い林檎などのあかさを知覚できると思います。この知覚をクオリア（感覚質）といいます。
逆に、入力だけではなく出力も考えると、意識のあるときは随意運動を起こすことができます。
以上が意識の働きだと思われます。
ただ、その働きも覚醒度が落ちたり、脳の機能障害が起きてしまうと、意識の度合いが下がってしまうと考えられます。
その場合はグラスゴー・コーマ・スケールなどで意識を定量化することがあります。

それにしても意識とは他人と共有できるものなのでしょうか。
コミュニケーションとは記号のうち、記号表現だけを相手に伝え、記号内容を相手の中に復元させるというものでした。
しかし、意識そのものは記号内容そのものであり、コミュニケーションでは記号内容そのものは他人と共有できません。
したがって、コミュニケーションにより意識の内容そのもの、たとえばクオリアなどを伝えることは現代科学ではできないように思えます。

#意識のメカニズム
**意識が生じる原因はいまだに解明されていません。**
意識が生じる原因はわからないのですが、意識と相関している脳活動なら少しずつ分かってきています（c.f. 因果関係と相関関係）。
この脳活動を**意識に相関した脳活動(NCC)**といいます。
意識に相関した脳活動は実はこれまでにたくさんしてきました。
たとえば、赤いリンゴを見たときに下側島皮質が活動すると認識できるだとか、体性感覚野が活動すると知覚できるだとか、運動野などが活動すると随意運動を起こせるだとかたくさんしてきました。
つまり、意識とはすごく分散されたシステムであることはわかります。
でも、たとえばその下側島皮質をディープラーニングのようなアルゴリズムを持った機械で置き換えてしまうとどうなるのでしょうか？
なんか意識はそれでも保てそうな気がします。
ただ、脳を起きさせる部分を取り除いちゃうとダメなのでは発送したあなた、さすがです。
脳全体の覚醒度を制御する脳幹網様体賦活系という部分を取り除くと、意識がなくなります[1]。
しかし、脳幹網様体賦活系をディープラーニングのようなアルゴリズムを持った機械で置き換えてしまうとどうなるのでしょうか？

こうやって全部機械で置き換えてしまうとどうなってしまうのでしょうか。

現代科学では謎のままです。

なお、意識のメカニズムに関する有名な仮説として統合情報理論（IIT）がありますが、
説明するのがすごくややこしいため今回は紹介しないことにしました。
興味のある方は調べてください。

# 意識を伝える方法とは
子供の頃からおそらく脳をくっつけないと意識は共有できないと思われます。
そういう意味では脳活動を共有している双子の姉妹は意識を伝えあっていることができているのだと思います。
しかし、その意識を我々にそのまま伝えることは現代ではできないでしょう。
たとえば、意識の一部であるクオリアを共有することを考えてみると、同じ赤いリンゴを同じ視点で見てても、個々人では脳活動が微妙に異なるため、どのような脳活動を引き起こせば、同じクオリアを共有できるのかよくわかりません。

#実装: プログラミングの限界
我々には人工意識なるものを作成することはできます。
しかし、それが人間の意識とどう違うのかは、我々にはわかりません。
プログラムとはあくまで量を操作するための技術です。
しかし、クオリアを含む意識とは質の世界の話なのです。
我々がこの壁を超えなければ、つまり、質そのものを取り扱う技術を確立しなければ、この問題には太刀打ち出来ないと考えられます。

#まとめ
今回はコミュニケーションで取り扱えない意識を題材に現代科学の限界を紹介しました。

次回はこれまで１ヶ月に渡る非言語処理を１日でわかるように総まとめしましょう。

#参考文献
[1] http://bsd.neuroinf.jp/wiki/%E8%84%B3%E5%B9%B9%E7%B6%B2%E6%A7%98%E4%BD%93%E8%B3%A6%E6%B4%BB%E7%B3%BB
[2] http://bsd.neuroinf.jp/wiki/%E6%84%8F%E8%AD%98
Java 標準ロガー

# 考え方
1. ロガーを作成する。
2. ログを受け取るハンドラーを作成する。
3. ロガーにハンドラーを設定する。
4. ログレベルを設定する。
5. ログを出力する。

# サンプルコード
1, ロガーの作成

```
private static final Logger logger = Logger.getLogger(MyClass.class.getName());
```

2, ハンドラーの作成

```
// ログをファイルで受け取るハンドラー
FileHandler fileHandler = new FileHandler(String filepath, true);
fileHandler.setFormatter(new SimpleFormatter());

// 標準出力ハンドラー
ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(Level.ALL);
```

3, ロガーにハンドラーを設定する

```
logger.addHandler(fileHandler);
logger.addHandler(consoleHandler);
logger.setLevel(Level.ALL);
```

4, ログレベルを設定する

```
logger.setLevel(Level.ALL);
```

5, ログを出力する

```
logger.finest("FNST");
logger.finer("FNR");
logger.fine("FN");
logger.config("CFG");
logger.info("INF");
logger.warning("WNG");
logger.severe("SVR");
```
後輩に聞かれても困らないgulpを使ったsassのコンパイル環境を構築する方法

Ateam Hikkoshi Samurai Inc. Advent Calendar 2017 25日目です。

最後は17新卒のフロントエンド、@diaが担当致します。
よろしくお願いします。

今回はgulpを使ったsassのコンパイル環境の構築について書いていこうと思います。
配属当初、自分あれこれで調べながら環境構築をしておりました。
とにかくwebで調べて環境を作ることはできたのですが、人に教えられるかと言われると、教えられない状態でした。
自分の言葉で説明してより理解をしようと思いこのテーマにしました。

sassをコンパイルするにはgulpが必要→gulpを使うにはnpmが必要→npmを使うにはnode.jsが必要…
お使いイベントかな？

##目次
1.node.jsの導入
2.npmの導入
3.gulpの導入
4.gulpにsassをコンパイルさせる

##node.jsの導入
まずはnode.jsをインストールする必要があります。
sassをコンパイルしてくれるgulpはnpm（パッケージ管理ツール）を使って導入するのですが、**npmを使うためにnode.jsが必要になります。**

実際のインストールには**nodebrew**を使ってnode.jsを導入します。
（nodebrewとはnode.jsのバージョンを管理してくれるツールです。)



nodebrewの導入にはターミナルで以下のコマンドを実行します。

```
$ curl -L git.io/nodebrew | perl - setup
```

curlというコマンドでファイルのダウンロードをしています。
git.io/nodebrewがダウンロード先のURLです。

これでnodebrewもといnode.jsを導入することができました。
ちゃんと導入されているか確認しましょう。
以下のコマンドで確認できます。

```
$ node -v
```

導入に成功していればバージョン情報が表示されます。
これで最初のステップは終了です。

##npmの導入
node.jsが使える環境ができたので、次はnode.jsのパッケージを管理してくれるnpmを導入します。
…と言いましたが、実はnodebrewを導入した段階で既に入っています。

こちらも確認してみましょう。

```
$ npm -v
```

##gulpの導入
さて、次はsassのコンパイルをしてくれるgulpの導入です。
npmを使ってインストールします。

gulpとはタスク管理ツールです。
あらかじめタスクを登録しておくことで、ブラックボックス的に処理を実行するしてくれます。
複雑なフローをすっ飛ばしてコマンド1つで結果が得られるワケですね。素晴らしい。

gulpにはインストール方法が２種類あります。
どこでも使えるグローバルインストールとプロジェクトの中でしか使えないローカルインストールの2つです。

・グローバルインストール：どのディレクトリでもgulpが使える
・ローカルインストール：インストールしたディレクトリ内でしかgulpが使えない

という違いがあります。
「会社で後輩に教える」というシチュエーション前提なら、僕はローカルインストールを選びます。
プロジェクトごとにgulpのバージョンが全て同じとは限らないので、グローバルインストールだと思わぬところで躓く可能性が考えられるからです。



グローバルインストールのコマンドはこちら。

```
$ npm install -g gulp
```

ローカルインストールのコマンドはこちら。
ローカルインストールしたいプロジェクトにターミナル上で移動してから実行してください。

```
$ npm install gulp --save-dev

```


これでプロジェクトにgulpがインストールされました。
以下のコマンドで確認してみましょう。

```
gulp -v
```
次にgulpでsassをコンパイルさせる為のプラグインをインストールします。

```
npm install -D gulp gulp-sass
```

やった、ついにsassのコンパイルができる。
というワケではありません。
gulpはタスク管理ツールなので、タスクに「sassをコンパイルして」という処理を追加してあげる必要があります。

##gulpにsassをコンパイルさせる

gulpfile.jsというファイルを作成します。
ここにsassをコンパイルする為のタスク作成していきます。
ファイルの中身は以下の通り。

```
//プラグインの読み込み
var gulp = require("gulp");
var sass = require("gulp-sass");


//sassのコンパイル
gulp.task("compile", function() {
  gulp.src("scss/*.scss") 　　　　　　　　　　　　　//ファイルの参照先を指定
  .pipe(sass()) 　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　//プラグインの実行
  .pipe(gulp.dest("css"))　　　　　　　　　　　　 //処理を行ったファイルの保存先を指定
});

```

これは「自動でsassをコンパイルして、指定のフォルダに出力する」という意味です。
このタスクに「compile」という名前をつけています。
つまり「gulp compile」とターミナルでコマンドを叩くだけで、勝手に上記の処理をやってくれます。
便利ですね。

これでsassのコンパイル環境が整いました。
後輩に教えると時にスムーズに教えられそうです。

# 追伸
株式会社エイチーム引越し侍では、一緒にサイト改善をしてくれるWebエンジニアを募集しています。エイチームグループのエンジニアとして働きたい！という方は是非、以下のリンクから応募してください。
皆様からのご応募、お待ちしております！！

> [エイチームグループ採用サイト（Web開発エンジニア職）](http://hikkoshi.a-tm.co.jp/recruit/request.php?ea=[ここにクリックを識別するためのkeyを入れる])
IKEAをGoogle Homeと連携してみた！！ ... い

IKEAのLEDも、Google Homeが使えたよ！！っていう記事書きたかったけど、無理でした。
（2017年12月現在）

だいぶ前にGoogle Homeとの連携がニュースになってたのになぁ
http://japanese.engadget.com/2017/05/24/ikea-tradfri-siri-alexa-google/
https://wired.jp/2017/09/04/ikea-smart-home/

# できなかった原因

- IKEA製品だけで対応したい場合、Gatewayがないといけないんだけれど、日本未発売だった。
- Google Homeが日本だと未対応

両方共LED電球とリモコンを購入してから気づいた

ちなみに、Philips Hueと互換性があるらしいので、Hueのブリッジがあれば、Google Homeと連携できるようです。
ブリッジがなかったので、これは試してません。

# とりあえず製品比較

スマート電球の比較。
Google HomeやAlexaに完全対応したら、IKEAのTRÅDFRIのほうが明らかに安いです。
ただ、カラーバリエーションはHueのほうが多そうなので、何をしたいかによって買い分けるといいと思います。

| 製品 | メーカー | 価格帯 |
|---|---|---|
| TRÅDFRI | IKEA | 1799 〜 2499 |
| Hue | Philips | 3672 〜 |

# 単体で使ってみた感想。

TRÅDFRI（スマートLED電球）とリモコン（くるくる回すタイプ）を購入しました。

![tradfri-diao-guang-kitto-iero__0473560_PE614616_S4.JPG](https://qiita-image-store.s3.amazonaws.com/0/9094/1e9d45f2-18b8-f01e-de40-31e3bccad20a.jpeg)


Google Homeと連携できて、声で制御できたら良さそうだなという感じは体験できましたが、やはりできなかったことが悔やまれる。

とりあえず単体でいいから使ってみたいという方は普通のリモコンの方を買ったほうが良さそうです。
今回購入したリモコンはOFFの位置がすごく微妙で少し衝撃があってずれただけでONになってしまいます。

Google Homeと連携ができるようになったら記事を更新したいと思います。
dockerを使ってnwdiagする

# dockerを使ってnwdiagする

## nwdiagとは
テキストファイルからネットワーク図を作成してくれるツールです。
これが...

```blockdiag:sample.diag
nwdiag {
  network dmz {
      address = "210.x.x.x/24"

      web01 [address = "210.x.x.1"];
      web02 [address = "210.x.x.2"];
  }
  network internal {
      address = "172.x.x.x/24";

      web01 [address = "172.x.x.1"];
      web02 [address = "172.x.x.2"];
      db01;
      db02;
  }
}
```
こうなります！
![sample.png](https://qiita-image-store.s3.amazonaws.com/0/88753/207098cc-317d-537d-368e-794097a24389.png)

diagファイルの書き方は下記URL先を確認してください。http://blockdiag.com/ja/nwdiag/introduction.html

## 使い方

1. diagファイルを作成
1. コンテナを使って変換

```bash
docker pull kmd2kmd/blockdiag
mkdir workdir
docker run -it --rm -v $PWD/workdir:/root/workdir kmd2kmd/blockdiag nwdiag -Tsvg sample.diag
```

これでworkdir内にsvgで出力されます。
png,pdfに変換することもできます。
svg以外ではグラデーションが省略されてしまいます。
svgで出力してから他形式に変換することをおすすめします。

|オプション|フォーマット|
|---|---|
|Tpdf|pdf|
|Tpng|png|
|Tsvg|svg|

## あとがき

- コンテナにはnwdiag以外にもblockdiagやactdiagがインストールされていますが動作確認していません。
    - コンテナ容量が600M近くあります...nwdiagのみにするべきだったかなと反省してます。
- NotoSanCJKjp-Regularをコンテナに内蔵しています。Dockerfileを見ればフォントの差し替えは容易なのでお好みで、.blockdiagrcを編集するのを忘れないでください。
Ubuntu 16.04でログイン時のアップデートパッケージ数が更新されない

# アップデートしたのに…

ログインする度に「まだアップデートがある」と言われて気になってしまう、この現象。
経験上、まれに起こる。

[このあたり](https://serverfault.com/questions/265410/ubuntu-server-message-says-packages-can-be-updated-but-apt-get-does-not-update)を見て、
`/etc/update-motd.d/90-updates-available`を実行したら、出なくなった。

# 真因の調査

できておりません…

# 更新
ググると、こっちの方が正しい模様。

```shell-session
$ sudo run-parts /etc/update-motd.d/
```

18.04で更新されなくなって、これも試したものの、更新されず…
結局こうしてしまった。

```shell-session
$ sudo rm /var/lib/update-notifier/updates-available
$ sudo apt update
```
Rails5学習が急につまらなくなった・・・君の名は・・・scaffolding

#何が起きた
「RubyOnRails5アプリケーションプログラミング」
っていう本を使って学習を進めていたんだが・・・急につまらなくなってきた!!

#何がつまらないか
そう。それは第3章に入ってきたところからやってきた。奴がやってきたんだ・・・君の名は・・・

#**scaffolding**!!(スキャフォールディング)
なんだか、自動でMVCを構築してくれる。すげーやつ。

##こいつの何がつまらないかって
完全にぶっちぎられる感が、やる気を失わせる。
だって**覚えることが、重力加速度的にすごい増えていく割に手を動かさなくなる**のだ！！
そう。レースでいうあれだ・・・**周回遅れ感**・・・。
初心者にはきついって・・・山田さん・・・。まだ3章ですぜ・・・・兄貴・・( ;∀;)

#自分なりに考えた。対策

**1.眠い時にやらない**
⇒これは手を動かさなくなる分、頭冴えてないと完全に無駄時間になるから

**2.深入りしない**
⇒これはいちいち考えてたら進まないから

**3.さらっと記憶の片隅に入れる**
⇒これは2.で進んでいってわからなくなる時が必ず来るから、頭の片隅にここら辺に情報あったなーって戻って来るため。
OGP周りではまったこと

#はじめに
LPつくるとき、あれ？あれ？とよくハマるので備忘録に

# Facebook

`http://anapple07.blogspot.jp`を表示したい時

```html
<meta property="og:url" content="http://anapple07.blogspot.jp">
```

と、metaタグに書くと思いますが、 `http://anapple07.blogspot.jp/`のように、後ろにバックスラッシュがついて、ついてないものにリダイレクトする場合、metaタグに`http://anapple07.blogspot.jp/`とかくと、Facebook OGPが表示されません。
twitter cardは同様に書いても表示されました。

#Twitter
Twitter Cardの画像を**更新**するときは、後ろにパラメータをつける、bitlyをかませる、など方法はあるようですが、
とりあえず<https://cards-dev.twitter.com/validator>ここで新しい画像を確認すると、その後のツイートでtwitter cardが更新されます。
Google App Maker ー アプリを別のサイトに埋め込む

App Maker にアクセスする際の URL はとてもわかりづらく長ったらしいです。
例）https://script.google.com/a/macros/howdylikes.jp/s/AKfycbwBQjaeu9QPiZw5G1xJznxW2m6STI9DTpoA-EoyUXao6SOz4vd5beDO/exec

単純にわかりにくいし、「何らかの理由でアプリケーションを作り直したい」となったときに、 URL を再周知したりするのが面倒です。
そのため筆者の場合、iframe で別のサイトに埋め込むようにすることが多いです。

本記事では、そのやり方を解説します。


## 事前準備
DEPLOYMENTS 画面から App Maker の URL をコピーする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/88a355dd-1141-d539-8045-56f484479f21.png)

## 埋め込み方
2種類あります、新しい Google サイトに埋め込む場合と、それ以外の場合です。
※正確には`*.google.com`か`それ以外`になるなので、新しい Google サイトでも URL を変えていた場合は後者になります。


## 新しいGoogleサイトに埋め込む
### Embed を選択し、新しい Google サイトに埋め込む
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/f3347846-4eba-0036-1d93-5ba0d4dd1d69.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/953ff57e-9776-04e8-a409-fa5ccecffba9.png)

### 実際に埋め込んだ画面
iframeで表示しているだけなので普通にアクセスする場合と同様、（最初だけ）認可画面が表示される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/0d6d17d7-b31a-2460-62de-d9d3cc3488a2.png)

認可後は通常通り表示される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/8a2a65ca-e8b0-bf10-f772-9f02e1304005.png)



## 新しい Google サイト以外に埋め込む
新しい Goolge サイト以外の Web サイトに埋め込む場合、何も設定しないとオリジンエラーになって表示できない。

```
Refused to display 'https://script.google.com/a/macros/howdylikes.jp/s/AKfycbwBQjaeu9QPiZw5G1xJznxW2m6STI9DTpoA-EoyUXao6SOz4vd5beDO/exec' in a frame because it set 'X-Frame-Options' to 'sameorigin'.
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/d593192e-849a-e80c-8db7-099464953871.png)

### Allow embedding app を ON にする
APP SETTINGS 画面で `Allow embedding app` を ON にする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/8f63c4df-04cc-4aa8-0bed-563cd88bdc5c.png)

### Allow embedding app をON にした後
再び PUBLISH して画面を表示するとこのように App Maker のアプリが iframe 内に表示される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/5b302094-ec29-c1c0-cf1a-29c33fe92c4b.png)


## 参考サイト
[Allow Apps to be Embedded | Application Settings |  App Maker  |  Google Developers](https://developers.google.com/appmaker/settings#embedding_an_app)
cssセレクター　チートシート

忘れっぽいので。。。。。
##基本
|探したい要素|CSSセレクター|
|:-:|:-:|
|全てのdiv要素|div|
|全てのdiv要素とp要素|div,p|
|全ての要素|*|
|xxxclass|.xxx|
|xxxid|#xxx|
|div要素の直接の子であるp要素|div > p|
|div要素の任意の子要素|div > *|

##属性系
|探したい要素|CSSセレクター|
|:-:|:-:|
|全てのtype属性を持つinput要素|input[type]|
|textというtype属性を持つinput要素|input[type="text"]|
|href属性がhttp://で始まるa要素|a[href^="http://"]|
|src属性が.jpgで終わるimg要素|img[src$=".jpg"]|
|appleという単語を含むsrc属性を持つimg要素|img[src~="apple"]|

##擬似クラス系
|探したい要素| CSSセレクター |
|:-:|:-:|
|アクセスしていない全てのリンク|a:link|
|アクセスした全てのリンク   |a:visited|
|要素の子孫にappleというテキストを含むdiv要素|div:contains("apple")|
|hover属性を持ったa要素   |a:hover   |