OmniAICreator/Qiita-1.07M huggingface dataset:
PCAはいろいろ使える

PCA（Principal Component Analysis）は、いろいろ使えます。

まず、2次元座標サンプルから中心となる線（主軸）を求めるのに使えます。
主軸が得られれば、2次元サンプル座標から主軸へおろした垂線と主軸の交点が得られます。主軸を基準とした場合、それら交点座標は1次元座標というわけで、2次元から1次元へ次元圧縮したことになります。
また、元の2次元座標サンプル群を主軸が垂直になるまで回転させれば、主軸が垂直な2次元サンプル座標が得られます。
例えば、顔認識して、そのLandmarkをサンプル座標とすれば、顔の中心線を求めて、傾いた顔を垂直にすることに使えます。

3次元での例としては、3次元空間の座標点サンプルから、それらが最もよく収まる2次元平面を求めるのに使えます。
例えば、指を机の上で動かし、手首に加速度センサーとジャイロスコープをつけているとします。この2つのセンサーの値からセンサー装着部位が地球の重力方向を基準として、どう動いたかの、3次元空間内軌跡が得られます。それらからサンプルを取り、PCAで2次元へ圧縮すると、指でなぞった机と平行な平面（机はたまたま重力と直角に交わりますが、机でなく壁でもいい）を得ることができます。さらに、その平面上での2次元軌跡が得られます。（これは、以前、特許出願した発明の実施形態の一部）。

PythonでPCAを使うのは簡単です。

```py
from sklearn.decomposition import PCA

sample = 例えば2次元座標列
pca = PCA(n_components=2) #入力が2次元であることを指示
pca.fit(sample)
if DEBUG: print("pc {}".format(pca.components_)) #主軸等をダンプ
主軸を基準にした2次元座標列 = pca.transform(sample)
```
最強のアウトプット生活を目指して。iPhone音声入力 iPHone Notes Twitter Github Medium IFTTT Zapier などの連携方法を改めて考え直したい

風邪ぎみになるとよくわかる。エネルギー状態が低い時は、Twitterしかすることができない。ものすごく元気な時は、ブログを書きたくなる。MacBookも触りたくなる。これに、Twitterがあまりに楽すぎて、ブログを書かなくなり、MacBookを触れなくなると言う心理も加わる。

とにかくiPhoneの音声入力が楽すぎて、もうこれ以外の表現方法が考えられなくなってくる。最近は、MacBookでキーボードを叩くのすらもどかしい感じがする。それぐらい人間の音声と言うものは、情報伝達能力に優れている。

かつて原始時代、人間は音によってメッセージングをしていた。他の動物も音によってメッセージを送る生き物は多い。鳥とか。猿とか。音は一瞬で伝わる超強力な伝達手段だ。

そして視覚情報でメッセージを送る生き物もいるけれど、僕たちもそれをすることができるけれど、あまり複雑なものは表現することができない。例えば孔雀の羽だって、1つのメッセージしか送ることができないかもしれない。

ちょっと話がそれただろうか。音と言うものの力について語りたかった。iPhoneの音声入力が何が良いかと言うと、とにかくコストの低さを感じるところ。後は持ち運びできる。MacBookのように広げる必要は無い。iPhoneならね。

まだTwitterで自分のツイートを連鎖させる方式に慣れていないので、話が散らかるなぁ。何が書きたかったんだっけ。

そうだ。音と言うものには、一瞬で伝わる、と言う最大のメリットがある。一瞬でメッセージを送ることができる。キーボードを動かすよりもはるかにコストが低い。さらにしゃべることによる癒しの効果も高い。

このプラスとマイナスを差し引いた時に、僕はとてもキーボード入力には戻れないような気がしている。MacBook Air 2018のキーボードもなんだかんだと薄くて、風で手先も動かないし、不器用だし。TwitterとiPhoneの音声入力により、コストの競合状態が変わったのだ。

そして、後は、Twitterからとても重要だと自分が思うもの、大きな塊にする方法、ブログにする方法さえ整えれば良い。なんだかんだといろいろ考えていたけれど、やはり今日の答えは、Twitterを情報発信の基地にすることだ。

例えばiPhoneのメモに書くときのデメリットは、そこからその情報を発信しようとするときに、はてなブログにコピーしたり、画像をアップロードしなおしたりしなければいけない所。

何を入り口にして、何を出口にするかと言うことを、そして途中の駅は何にするか、何を経由するかと言うことも、自分の理想的なアウトプットを実現するためには、ものすごく工夫が必要だ。

特に僕は、データの永続性と言うものを考えてしまうので、単純にはてなブログに投稿してTwitterに共有するだけでは足りない。もっとGoogleやGitハブや、永続性の高い場所にデータを置いて、なおかつ一覧したい。

そして今の答えと言えば、Twitterでつぶやき、これを基本にする。後で1日分をエクスポートしてGitハブやmediumに送る。

後は、最初から大きなトピックを語りたくなったときのために、特例として、やはりiPhoneのノートも使う。いや、はてなブログに直接投稿しても良いかもしれない。

そしてはてなブログにもエクスポート機能があるので、後からあれをなんとかうまく使って、Gitハブなど、永続性の高い場所に送る。

これは本当にパズルみたいな。アウトプットの入り口をMacBookからiPhoneに変えただけで、連鎖的にやりたいことの実現のために、本当に複雑な組み換えが必要になり、1つを組み替えるとまたもう一つ組み変える必要が出てくる。

今朝もずっとぼんやりと考えていたけれど、現時点でのパズルの組み合わせが、だんだんとイメージできてきたように思う。すべてはアウトプットのために。アウトプットイズライフな最近の自分。








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Twitterのリプライと引用リツイートは、人間活動であるサインの送受信に使われている。小さな違いかもしれないが、大きな違い。そのサインを見て、僕らは自分自身の反応を決める。僕らはTwitterのインターフェイスを使いながら、人間同士のサインを読みあっている。

リプライと引用リツイートの違いについて考えている。Twitterの。これはサインとして働く。リプライであれば、本人に直接訴えかけるもの。引用リツイートであれば、放置しても問題ないもの。Twitterのシステムがそれを踏襲する。

単純にユーザインターフェース的な違いは、サービス的な機能の違いは、実はフィルターに過ぎない。上っ面。その中に大いなる人間活動が秘められている。人間活動が乗っかるための、ユーザインターフェイスの違い。

実はTwitterなどのアプリケーションは、99.99%の人間生活のフィルターに過ぎないので、それを0.01%の機能によって、方向付けをするものだ。リプライと引用リツイートの違いは、Twitterをあまり使わない人から見ると取るに足らない違いかもしれないけど、僕らがそこに乗っかっているから、全然違う。

そこには人間同士の暗黙の約束事や、サインの送り愛と言うものが常に行われていて、その意味合いと言うものは、人間活動によって発信され、実は巨大な家の中で常にゆらめき、変動を続けている。

Twitterで引用リツイート、リプライみたいに使うスタイルの人もいる。これは本来のTwitterの狙いとは違うのかもしれないけど、引用リツイートだと、下のツイートが表示されて、自体がわかりやすくなる。だから、間違っているというか、そもそもこれが正しいかも。

逆に引用リツイートが、ちょっと遠くから目線のメッセージ、返信の必要のない独り言チックに使われる方が、Twitter本来の機能と言うよりは、リンゲン活動であるメッセージングにより近いのかもしれない。サインの送りあいだ。

考え事をまとめながらツイートするのがとても心地良い。ホテル阪急インターナショナル前で語る。 https://t.co/UvItDkYl9y

引用リツイートリプライみたいに使う人のサインも、メッセージ。サインとしては、リプライに似ている。これは、Twitterの機能が必ず1つのサインに結びついていない例だ。僕らは昨日サインのように使うけれど、必ずしもサインと機能が同一のものであるわけではない。

結論。Twitterのリプライと引用リツイートは、人間活動であるサインの送受信に使われている。小さな違いかもしれないが、大きな違い。そのサインを見て、僕らは自分自身の反応を決める。僕らはTwitterのインターフェイスを使いながら、人間同士のサインを読みあっている。








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
AzureでVMを構築してRDPを接続するまで

#参考にしたサイト
[AzureでWindows仮想マシンを作成してみた](https://cloud.nissho-ele.co.jp/blog/create_vm_with_azure/)
[Microsoft Azure入門　～VM作成編～](https://qiita.com/kuroshibainu/items/d0b7e0cc9f2d66d0a052)
↑画面が変わっていたけど参考に構築できました。

###3389ポートの追加
下記を参考に設定。↓
[NSG で RDP ポートが有効ではないために VM にリモート接続できない](https://docs.microsoft.com/ja-jp/azure/virtual-machines/troubleshooting/troubleshoot-rdp-nsg-problem)

※ただこれだけだと、セキュリティー的に懸念があるので、セキュリティーグループとかもう少し勉強してちゃんと設定したい。

###Microsoft Remote Desktop 10アプリのインストール
Macを使っているので下記のアプリをインストールして、RDPファイルを実行。
[参考：Mac でリモート デスクトップを使ってみる](https://docs.microsoft.com/ja-jp/windows-server/remote/remote-desktop-services/clients/remote-desktop-mac)

※Remote Desktop 8だと手動の設定が必要、、、10だとRDPファイルをダブルクリックで実行できるので便利でした。

###結果
立ち上がりました。
![VM 2019-01-20 09-41-07.png](https://qiita-image-store.s3.amazonaws.com/0/336536/62b29e0f-5706-c556-3be5-49097bc68856.png)
VSCode+PHPのオススメ拡張機能

VSCodeを使ってPHPの開発をする時に、オススメの拡張機能をまとめました。

## PHP IntelliSense

https://marketplace.visualstudio.com/items?itemName=felixfbecker.php-intellisense

コード補完や定義へのジャンプを提供してくれる。

**コード補完**
![completion.gif](https://qiita-image-store.s3.amazonaws.com/0/8028/d02323c9-4f6d-05e7-30e6-a43b3afbac1c.gif)

**定義へジャンプ**
![definition.gif](https://qiita-image-store.s3.amazonaws.com/0/8028/3c852086-99cd-0be8-8b5a-4585e6aab007.gif)

## PHP DocBlocker

https://marketplace.visualstudio.com/items?itemName=neilbrayfield.php-docblocker
class,function,propertyの上の行で`/**`を入力するとコードブロックを補完してくれます。

![Jan-20-2019 09-36-11.gif](https://qiita-image-store.s3.amazonaws.com/0/8028/ee048f26-a4eb-3cd3-544c-d39e29ead88c.gif)

## PHP Class Generator

https://marketplace.visualstudio.com/items?itemName=damianbal.vs-phpclassgen

空のPHPファイルから、namespaceとクラス名を補完したスケルトンを作ってくれます。

![PHP Class Generator](https://media.giphy.com/media/YkYfRwCfT1AUK25s4J/giphy.gif)

## PHP Namespace Resolver

https://marketplace.visualstudio.com/items?itemName=MehediDracula.php-namespace-resolver

コード内に書かれたクラス名からnamespaceのインポートを挿入してくれます。

![upEGtPa.gif](https://qiita-image-store.s3.amazonaws.com/0/8028/eddd6764-9af5-2954-8cf1-7f129e7f06dd.gif)

## PHP import checker

https://marketplace.visualstudio.com/items?itemName=marabesi.php-import-checker

`use`キーワードでインポートしてるけど、使っていないクラスをハイライトしてくれます。

![AuthController_php_—_ecrenew.jpg](https://qiita-image-store.s3.amazonaws.com/0/8028/d3bbd7d9-4c03-48b6-0124-9c84674706a6.jpeg)
設定ファイルから有効行だけ抜き出す

# つまりコメントを取り除きたい

ファイルから、`#`、`;`、`//` で始まる行と空白行を取り除いて出力するスクリプト `nocomment.sh` です。

```shell:nocomment.sh
#!/bin/sh

FILES="-"
[ "$#" -ne 0 ] && FILES="$@"

grep -v -e '^[[:blank:]]*[#;]' -e '^[[:blank:]]*//' -e '^[[:blank:]]*$' ${FILES}
```

# 使い方

引数でファイルを指定するか、標準入力からファイルを読み込ませます。

```shell-session
$ nocomment.sh FILE [FILE...]
$ cat FILE [FILE...] | nocomment.sh
$ nocomment.sh < FILE
```

## 実行例

@n-oshiro さんの先行記事 **「[grepでコメント行および空白行を削除する - Qiita](https://qiita.com/n-oshiro/items/91d807f3151694e6c7a8)」** の実行例を、`nocomment.sh` で処理してみました。

```ruby:/tmp/greptest.rb
#=========================
# ここのコメントは除去されます
#=========================
class Hoge

  # このコメントも除去されます
  def hello
    puts "Hello, World!" # ここのコメントは除去されません
  end

end

# このコメントは除去されます
hoge = Hoge.new
hoge.hello
#=> Hello, World! # これも除去されます
```

を

```bash
$ nocomment.sh /tmp/greptest.rb
```

で処理すると、@n-oshiro さんの**[先行記事](https://qiita.com/n-oshiro/items/91d807f3151694e6c7a8)**と同様に、以下の出力が得られました。

```ruby:output
class Hoge
  def hello
    puts "Hello, World!" # ここのコメントは除去されません
  end
end
hoge = Hoge.new
hoge.hello
```

# ざっくりとした補足

## コメント行を示す文字

多くの設定ファイルやスクリプト言語では、`#` で始まる行がコメント行になります。
php.ini では `;` で始まる行がコメント行になります。
named.conf などは `//` で始まる行がコメント行になります。

別の形式のコメント行に対応するには、grep に渡す -e オプションを追加すれば良いでしょう。

## 複数行にまたがるコメント `/* ... */` には、対応しない

複数行にまたがる `/* ... */` のようなコメントを除くには、追加の実装が必要、もしくは C のプリプロセッサを流用すれば簡単かもしれません。 

```shell-session:例
$ nocomment.sh FILE | cpp -P -
```

と思って試したら、`Include conf.modules.d/*.conf` のような記述で `/*` がコメント開始と判断されてしまいました。[^1] 
汎用性の低下を避けるため、`nocomment.sh` で `/* ... */` へ対応するのはあきらめました。
出力の結果を見て、必要に応じて cpp に食わせてみるような対処が良いと思います。

[^1]: cpp がエラー `error: unterminated comment` を出しました。コメント開始に対応するコメント終了 `*/` が処理したファイル中に無かったため。

## `nocomment.sh` の引数

`nocomment.sh` に与えた引数は、すべて変数 FILES にいったん引き取られ、grep に渡されます。なので、`nocomment.sh` の引数には、ファイルだけでなく grep が解釈できるオプションを指定することも可能です。
変数 FILES の初期値は "-" なので、`nocomment.sh` に引数を与えない場合は標準入力を読み込みます。

# 環境

Unix-like な環境で、GNU grep が使えること。
grep (GNU grep) 2.20 で動作確認済み。

# 参考文献

+ [grepでコメント行および空白行を削除する - Qiita](https://qiita.com/n-oshiro/items/91d807f3151694e6c7a8) / @n-oshiro , 2014
+ [grep(1): print lines matching pattern - Linux man page](https://linux.die.net/man/1/grep)
+ [cpp(1): C Preprocessor - Linux man page](https://linux.die.net/man/1/cpp)
Cによる楕円曲線暗号解読

楕円曲線暗号の解読。学習λ法を発見。Cのプログラムを作成し解読速度を評価。70ビット相当暗号(60ビット44件)の解読が10時間(ρ法)から1秒(学習λ法)に短縮。4万倍の高速化。解読の軌跡群を固定できたのでAIも適用可能。AI学習λ法の試作評価で15万倍の高速化。10月末までに30万倍は確実(2019/10/16:達成)。2020年末目標は100万倍。米国はIoTに使う160ビット楕円曲線暗号は既に解読している可能性が高い。学習λ法は計算機がn倍高速になると、同じ学習時間でnの2乗倍解読は高速化する。AIの適用でも同じ。AIで1万倍高速化すると、同じ学習時間で1億倍解読は速くなる。詳しくは  https://ecc-256.com を参照。
FACTAの阿部前主筆がFACTAから離れΣtoica(ストイカ)を創刊された。創刊号に、本件の記事を掲載させて頂いた。「プレステとAIでIoT暗号破れる」と題し。下記参照。
https://stoica.jp/stoica/18
阿部さんの紹介でCYDEF 2019に参加。https://note.mu/stoica_0110/n/nbb53f0a2654a?magazine_key=m997c910efb80
学習λ法をAIで高速化するのに面白いことを発見。上手く行くと、2倍/年ではなく数十倍/年の高速化向上が有り得る。年内には評価を確定する。来年末(2020/12)の高速化目標を100万倍から1000万倍に10倍高める(2019/11/14)。この値はストイカに記載した国家機関での目標値。1年かかる解読が3秒に短縮。
面白い現象を続々発見(2019/11/21)。λ法自体も高速化できそう。今年中は現象の仕組みを詳細に調査。高速化は来年以降。
政府機関に3回説明したが、IoTの暗号の危機感が薄い。メールでの問い合わせは中国ばかり。来年はIoT関係の政府機関に数回説明予定。それで反応が薄ければ、中国との共同研究も国としてOKと判断。
Django で xlsx を更新してダウンロード

こちらの記事と同様のことを Arch Linux で行ってみました。
[Python + Django でExcelをダウンロードする](https://qiita.com/t-iguchi/items/3fa5bb8977a29bcf94cf)

テンプレートは、次の記事で作成した cities.xlsx を /var/tmp/xlsx
に置きました。　シート名は Cities です。

1) プロジェクトとアプリの作成
>プロジェクト　proj01
>アプリ excelapp1

```bash
django-admin startproject proj01
cd proj01/
python manage.py startapp excelapp1
```

2) excelapp1/urls.py の作成

```py:excelapp1/urls.py
from django.urls import path
from . import views

app_name = 'excelapp1'
urlpatterns = [
    path('', views.index, name='index'),
]
```

3) excelapp1/views.py の編集

```py:excelapp1/views.py
from django.shortcuts import render

import os
import openpyxl
import pprint
from django.http import HttpResponse

def index(request):
    """
      Excel output from template
    """
    # Excelのテンプレートファイルの読み込み
    wb = openpyxl.load_workbook('/var/tmp/xlsx/cities.xlsx')

    sheet = wb['Cities']
    sheet['C4'] = '99999'
    sheet['D4'] = '2019-1-20'

# Excelを返すためにcontent_typeに「application/vnd.ms-excel」をセットします。

    response = HttpResponse(content_type='application/vnd.ms-excel')
    response['Content-Disposition'] = 'attachment; filename=%s' % 'report.xlsx'

    # データの書き込みを行なったExcelファイルを保存する
    wb.save(response)

    # 生成したHttpResponseをreturnする
    return response
```

4) proj01/settings.py の編集

```py:proj01/settings.py
（省略）
INSTALLED_APPS = [
    'excelapp1',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
（省略）
```

5) proj01/urls.py の編集

```py:proj01/urls.py
from django.contrib import admin
from django.urls import path
from django.urls import include

urlpatterns = [
    path('excelapp1/', include('excelapp1.urls')),
    path('admin/', admin.site.urls),
]
```

6) 開発サーバーの起動

```bash
python manage.py runserver
```

7) ブラウザーで
http://127.0.0.1:8000/excelapp1/
にアクセス

テンプレートの xlsx
![xlsx_jan2001.png](https://qiita-image-store.s3.amazonaws.com/0/179446/f2d7ed6d-b057-a9f3-6f0c-639edfbdb22f.png)

更新してダウンロードした xlsx
![xlsx_jan2002.png](https://qiita-image-store.s3.amazonaws.com/0/179446/e8a33f9a-f8ea-ce49-9161-27709b8dc166.png)

コードは、こちらにあります。
[ ekzemplaro/django_xlsx_update
](https://github.com/ekzemplaro/django_xlsx_update)
convnet.jsで自動運転

#概要

convnet.jsで自動運転、やってみた。

#写真

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/o/s/o/osoX.jpg?t=1547941434)

#仕組み

画面下の五つのグレーのポイントで、センサーとして、rgb/256/3で、データを取った。
1000個のデータセットを作った。
convnet.jsでモデルを作って、学習させた。
モデルは、インプット5、アウトプット3の分類器、
隠れ層は、20
アクチベーションは、sigmoid
オプチマイザーは、sgd
学習は、9000回。
正解率は、34.0％

#成果物

http://jsdo.it/ohisama1/osoX

以上。
2019年にレビューアとして改善したいと思う、たった1つのこと

先日、[新人プログラマをレビューで殺さない方法](https://qiita.com/hiraike32/items/32840b11536fa1b78621) を拝読しました。

私は普段レビューアを務めることが多いので、若手の、忌憚のない意見を得られた貴重な記事でした。
投稿者様に感謝いたします。

とはいえ、レビューアの立場としては若手の書いたコードのレビューは色々悩ましいです。

- 具体例を挙げたほうが良いのか？自分で考えさせるべきなのか？
- 「自分で直したい…」という葛藤との戦い （特に進捗が厳しい時）
- 「こんなにたくさん"直せ"と言われたらヘコむかな…」と気を使う

悩みすぎるとレビューという仕事に殺されそうなので（笑）、今年は、たったこれだけを改善したいと思います。

**良い点を探してほめる:thumbsup:**

- レビューイの心理的安全性を確保してあげることが、一番大事かなと。
- レビューイがMerge(Pull) requestを出すときにビクビクするようなことがないようにしたい…
- 若手にとって、そういうレビューが当たり前になれば、彼らがレビューアになった時に同じようにレビューをしてくれるはずなので、良い循環が生まれるのでは。

私は1994年からプログラマとして働いていますが、恥ずかしながら「レビューでほめる」という文化をごく最近知りました。
まだまだ修行が足りないなと思う、今日この頃です。
GLib-GIO-Message: Using the 'memory' GSettings backend. エラーを解消する

# エラー内容
以下のようなエラーが出た

```
 GLib-GIO-Message: Using the 'memory' GSettings backend.Your settings will not be saved or shared with other applications.
```

このせいで、なぜかJupyter notebookのフォントが崩れてしまった。

# 解消法
どうやら環境変数`GIO_EXTRA_MODULES`に`/usr/lib/x86_64-linux-gnu/gio/modules/`を設定すれば良いらしい：

```
export GIO_EXTRA_MODULES=/usr/lib/x86_64-linux-gnu/gio/modules/
```

ただし、一度設定しただけでは次回起動時にリセットされてしまうため、<br>`~/.bashrc`または`~/.bash_profile`にも上記の記述を追記しておく必要があります。
matplotlibでSymPyの数式をLaTeXを使って綺麗に描画

# はじめに
matplotlibでSymPyの数式をLaTeXを使って綺麗に描画したい

```python
import numpy as np 
import matplotlib.pyplot as plt 
import sympy

# おまじない
plt.rcParams['text.usetex'] = True
```
# 準備
```python
x  = sympy.Symbol('x')
xx = np.linspace(0,1,1000)

f  = sympy.sin(sympy.pi*x)
ff = sympy.lambdify(x,f) 

plt.figure() 
plt.plot(xx,ff(xx))
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/35426/9b78d476-42b4-f087-ae18-0c28be791979.png" width=60%>
# LaTeXコマンド
LaTeXコマンドを使うときは$マークで囲います.

```python
plt.title('$f(x) = \sin(\pi x)$')
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/35426/03e18e44-31d7-9e5d-13d9-76b890fb556b.png" width=60%>
# SymPyから変換して描画
sympy.latex()でLaTeXコマンドに変換して$マークで囲います.

```python
plt.title('$f(x) = ' + sympy.latex(f)+'$')
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/35426/487caeb4-f7a6-8775-c56c-c0fc092604f6.png" width=60%>

# コード
https://nbviewer.jupyter.org/gist/ceptreee/068dc2356bce7c6a3eddca99fc221128
アーキテクチャスタイルとは何か

# 概要
ソフトウェアのアーキテクチャの種類について調べようとすると、アーキテクチャスタイルという用語に遭遇する。似た表現としてアーキテクチャパターンがあるため、混乱してしまう人もいるだろう。本記事ではソフトウェアにおけるアーキテクチャスタイルという言葉の定義を検証してみる。
なお、アーキテクチャパターンについては<a href="https://qiita.com/cocoa-maemae/items/f276fe14b9700fdae7bc">アーキテクチャパターンとは何か</a>で検証している。

# スタイル(style)とは
元々はろう板に物を書くための尖筆(スティルス stilus)のこと。その後、徐々に道具から書き方を意味するようになった。さらにそこから転じて服や髪などの型、流行の型などの意味になった。
(*)日本語のスタイルは容姿や体つきを意味するが、英語では同様の意味はない。

# ソフトウェアのアーキテクチャスタイルとは
<a href="https://www.amazon.co.jp/Web%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93-HTTP%E3%80%81URI%E3%80%81HTML%E3%80%81%E3%81%9D%E3%81%97%E3%81%A6REST-WEB-PRESS-plus/dp/4774142042">Webを支える技術 -HTTP、URI、HTML、そしてREST</a>によると、アーキテクチャスタイルは「複数のアーキテクチャに共通する性質、様式、作法あるいは流儀を指す言葉で、別名マクロアーキテクチャパターンとも呼ばれる。アーキテクチャパターンはデザインパターンのようなより粒度の細かいクラス設計などを指す。」と説明されている。

<a href="https://docs.microsoft.com/en-us/azure/architecture/guide/architecture-styles/">Microsoft Azureのドキュメント</a>によると、アーキテクチャスタイルは「ある特徴を持ったアーキテクチャの一種のこと」と説明されている。

<a href="https://en.wikipedia.org/wiki/Software_architecture#Architectural_styles_and_patterns">wikipedia</a>によると、「Architectural StyleはArchitectural Patternと同じものであるという意見と、Architectural Styleは特化したパターンであるという意見がある。パターンとスタイルの大きな違いとしては、パターンは問題の解法として見なされるのに対し、スタイルは問題を解決する必要がないときに用いられる。」と説明されている。


## ソフトウェアのアーキテクチャスタイルの例
<a href="https://www.amazon.co.jp/Web%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93-HTTP%E3%80%81URI%E3%80%81HTML%E3%80%81%E3%81%9D%E3%81%97%E3%81%A6REST-WEB-PRESS-plus/dp/4774142042">Webを支える技術 -HTTP、URI、HTML、そしてREST</a>や<a href="https://docs.microsoft.com/en-us/azure/architecture/guide/architecture-styles/">Microsoft Azureのドキュメント</a>には下記が挙げられている。
- クライアントサーバー
- 階層化アーキテクチャ
- キャッシュサーバー
- パイプアンドフィルター
- REST(クラサバ、階層化、キャッシュなど複数のアーキテクチャスタイルの組み合わせ)
- イベントシステム
- MVC(Model-View-Controller)
- オブジェクト指向(OOA)
- サービス指向アーキテクチャ(SOA)
- マイクロサービスアーキテクチャ
- イベント駆動アーキテクチャ


# 建築のアーキテクチャスタイルとの比較
アーキテクチャスタイルは建築用語としても存在する。ただし、建築用語としてはアーキテクチャスタイルではなく、日本語では建築様式として定義されている。<a href="https://en.wikipedia.org/wiki/Architectural_style">wikipedia</a>の定義によると、建築様式とは「著名な建造物、歴史的な建造物に見られる特徴のことで、構築の手法、建造物の原材料、宗教的な性格などを含む。」と説明されている。


# 結論
ソフトウェアに置けるアーキテクチャスタイルという言葉の定義は、単に複数存在するソフトウェアのアーキテクチャの種類のことを表現しているに過ぎないように思われる。同じような用語としてアーキテクチャパターンがあり、<a href="https://qiita.com/cocoa-maemae/items/f276fe14b9700fdae7bc">こちら</a>で検証してみた。結論としては、アーキテクチャスタイルもパターンも一纏めにしてアーキテクチャパターンで表現しても問題ないように思われる。

# 参考
- https://kotobank.jp/word/%E6%A7%98%E5%BC%8F-145686
- Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)
- https://docs.microsoft.com/en-us/azure/architecture/guide/architecture-styles
- https://en.wikipedia.org/wiki/Software_architecture
urls.pyの振り分け例と呼び出される関数の引数について

# はじめに

Django2.0以降のURLconf(urls.py)に関して、[公式ドキュメント](https://docs.djangoproject.com/ja/2.1/topics/http/urls/)でまだ翻訳されていない箇所を読んで調べた内容を簡単にまとめます（公式ドキュメントの翻訳記事というわけではありません）。

# urls.pyでの振り分け例

```python:
from django.urls import path

from . import views

urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    path('articles/<int:year>/', views.year_archive),
    path('articles/<int:year>/<int:month>/', views.month_archive),
]
```
-  `/articles/2005/03/`というURLの場合、3番目の`'articles/<int:year>/<int:month>/'`にマッチします。
- `/articles/2003/`というURLの場合、2番目の`'articles/<int:year>/'`ではなく、1番目の`'articles/2003/'`にマッチします。Djangoは、**urlpatternsを順に調べて最初にマッチしたパターン**の関数を呼び出すためです。

- `/articles/2003`というURLの場合、最後に`/`が無いため、どのパターンにもマッチしません。

# urls.pyで呼び出す関数の引数について



- 第一引数にはHttpRequestオブジェクトのインスタンスが渡されます。

- `<int:year>`などのパスコンバータが使用されている場合、**その部分がキーワード引数**となります。

```python:
from django.urls import path

from . import views

urlpatterns = [
    path('articles/<int:year>/<int:month>/', views.month_archive),
]
```

例えば、`/articles/2005/03/`というURLの場合、Djangoは`views.month_archive(request, year=2005, month=3)`を呼び出します。

# urls.pyとGETのパラメータ

urls.pyでの振り分けでは、**GETのパラメータを考慮した記述は不要です。**

```python:
from django.urls import path

from . import views

urlpatterns = [
    path('books/', views.BookListView.as_view()),
]
```

例えば、`/books/?page=3`へのリクエストは、上記の`'books/'`にマッチしてくれます。

# 参考

[Django2.1公式ドキュメント URLディスパッチャ](https://docs.djangoproject.com/ja/2.1/topics/http/urls/)
TensorFlow2.0の傾向と対策 〜 TensorFlowの消失

# はじめに
この記事はTensorFlow2.0（以下、TF2.0）のPreview版がPyPIに公開されたことを受け、正式版の公開やその利用に向けて備える記事です。特に、APIの整理に伴って消えたAPIを紹介し、それによってTensorFlowの使い方が大きく変わることの警告を目指します。

また、筆者の属性は、TF歴3年の画像認識屋です。しかし、内容は個人の意見で、別分野の方や別ライブラリユーザーだけでなく、同属性の方からも別の意見が出ると思います。純粋にTF2.0を学びたい方は、他の記事を参考にしてください。
# リンク
* [公式ドキュメント](ttps://www.tensorflow.org/versions/r2.0/api_docs/python/tf)

# tf.keras以外の高レベルAPIの消滅
* tf.layers
* tf.contrib.slim
* tf.contrib.layers（slimはtf.contrib.layersを呼んでいる）

これらがいつからあるのか調べてみると、「[TensorFlowの増大するAPIについて少し考えてみた](https://qiita.com/TomokIshii/items/554b0bd5f328b1bd5210)」という記事が見つかりました。tf.layersがTF1.0で導入され、slimはそれ以前からあったようです。これらを使っている人は層の記述方法を移行する必要があります。

移行先には次が考えられます。

* tf.keras
* keras（以下、生keras）
* sonnet

しかし、生kerasもsonnetも消える予定のAPIを使って実装している部分がありTF2.0対応が必要です。これまでの方法に近い方法でTF2.0をすぐに使うには、tf.kerasしか無いようです。

自分の場合、tf.contrib.layersからsonnetへ移行を検討して、こういう感じに設計するといいのかななどと考えていました。しかし、TFの変わり具合を見て、tf.kerasに屈するかPyTorchに乗り換えるか、そもそも機械学習プログラミングの設計方針を考え直すか、などと再検討することになりました。

# tf.Sessionの消滅
TensorFlowといったらsess.runなイメージですが、tf.Sessionが無くなります。Eagerモードが標準になった影響でしょう。Graphモードも残っていて、そっちはそのままなのだろうと思っていたら、そうではなかったという状況です。

# tf.train.XXOptimizerの消滅
これもtf.kerasに統合されます。しかし、その使い方は元のtf.trainのOptimizerのように、`train = opt.minimize(loss)`して`sess.run(train)`しようにもtf.Sessionがないためできません。

# tf.placeholderの消滅
これはEagerモードの影響です。placeholderは

* 計算グラフの入力の型を定義する
* 入力のノードをオブジェクトとして扱う

というものでした。しかし、前者の目的はtf.TensorSpecと重複し、そもそも後者は、入力の値自体と重複して二度手間なコードを書かないといけない部分でした。そう考えると消えるのが理解できます。

tf.TensorSpecは、Tensorのメタデータ（shape,dtype,name）です。これは次のように使います。

``` python
@tf.function(input_signature=[tf.TensorSpec([None], tf.float32)])
def hoge(x):
    return x * 2

hoge(tf.constant([0., 1., 2., 3.]))
```

tf.functionは、pythonの関数をTensorFlowのグラフに変換するものです（制限はあるようです）。tf.TensorSpecとtf.functionは、それぞれ、tf.contrib.eager.TensorSpecとtf.contrib.eager.defunに相当します。

# tf.global_variables_initializerの消滅
```python
with tf.Session() as sess:
   sess.run(tf.global_variables_initializer())
```
でおなじみですが、これも消えます。

# tf.get_xxの消滅
tf.get_variableやtf.get_collection、その他もろもろが無くなります。もしかするとget_collectionはtf.Graphのメソッドとして残るかも知れません（tf.Graphのドキュメントに、TF2.0で無くなるtf.GraphKeysを使った説明が残っているため、作業中かも知れません）。

# まとめ
色々消えて驚愕しているのですが、現状で何を考えるべきかというと、次のことだと思います。

* 既存コードについて
  * TF2.0に移行しやすいか。どこに修正が必要か。
  * 移行スクリプトやtf.compat.v1で対処できるか。
  * 移行しやすいようにどうリファクタリングするか。
* ライブラリについて
  * TF2.0対応しそうか。
  * 対応しなくても目的は達成可能か。
  * TF2.0版を作成し世の中に貢献することを目指す。
* 新規コードについて
  * TF2.0ではどういう設計が良いか。
  * そもそも、機械学習プログラミングはどうあるべきか。

せっかくTF2.0にあわせてプログラムの書き方を変えないといけないのなら、機械学習プログラミングについて考え直すのもいいかもしれません。
Google製「バックアップと同期」でColaboratoryとローカルjupyterがシームレス接続

備忘録。
【参考記事】JupyterNotebookのデフォルトディレクトリを変更
https://qiita.com/nigimitama/items/a8129e50afcc462e02d6

【課題感】GoogleColaboratoryとローカル環境で別々に作成されるipynbファイルのディレクトリをまとめたい

Colaboratoryを使うとグーグルドライブ上に【ColabNotebook】というファイルが作られ、作成したノートブックはここに入れられます。
一方で、ローカル環境でAnacondaを立ち上げ、ノートブックを作成するとそれらは通常ユーザーフォルダ（例えばC：\User\\****\）の中にぶち込まれます。
Colaboratoryでもローカル環境JupyterNotebookでも同じ.ipynbファイルなのに、ファイルの保存先が異なるために相互に読みこむためには手間がかかります。これをひとつにまとめたい、というのが今回の動機です。

【用意するもの】
・バックアップと同期
Googleのバックアップと同期は、自分のPC上にグーグルドライブのファイルを開設することで、ブラウザを開かずともドライブとPC間でデータのやり取りや保存を可能にしてくれるサービスです。
[バックアップと同期のダウンロード](https://www.google.com/intl/ja_ALL/drive/download/backup-and-sync/)

ダウンロードができるとローカル環境内に
C:\Users\\*****\Google ドライブ\ColabNotebooks
のように新しいディレクトリが作られます。

そして参考記事のように、JupyterNotebookのデフォルトディレクトリを変更('\Colab Notebooks'に指定)すると、グーグルドライブからもローカル環境からも作成したノートファイルを読み込むことができます。

めでたしめでたし。

#追記(2019/1/22)
ディレクトリの設定
ユーザーフォルダの.jupyterフォルダ内にあるJupiter_notebook_config.pyから

```Jupiter_notebook_config.py
#c.NotebookApp.notebook_dir=****honyarara*****
```

という一文を探し出す。これを例えば
<code>c.NotebookApp.notebook_dir = 'C:\\Users\\****\Google ドライブ\Colab Notebooks'

に変更すればOK

やってみて確かに便利になったが、インデントの仕方に違いがあるため、Colaboratoryで書いたプログラムをJupyterNotebookで動かすときに注意が必要。
(2019/3/4さらに追記：Colaboratoryの「ツール」＞「設定」からインデント幅を変更可能。デフォルトはスペース２個分だが、４個にすることでJupyterNotebookでも作動)
SIer常駐SEこそQiita記事をかけ！

こんにちは。

今回の記事ではQiitaに記事をアウトプットを
することのメリットをあげたいと思います。

タイトルではSIerと付けましたが、
全てのエンジニアに共通して言えることだとも思います。

#ノートとしてのメリット#
そもそも私がQiitaに記事を書くようになったのにはきっかけがあります。

まず前提として、人間は忘れる生き物です。
そして、忘れたことを
あーなんかこれ、一年前にやったけどどうやったかな？
と何度も同じことを調べるのは無駄な時間だと思います。

そのため、元々は私はメモ魔で、
(石原さとみさんを仕留めた社長様ほどではないですが)
覚えたことはノートに取るようにしていました。

ただ、ノートって見返すのめんどくさいんですよね。
リンクがないから目当ての内容がすぐ見つからないし、せっかく見つけた良いサイトをブックマークできないし。
何よりソースをわざわざ丸写し
するなんてアホらしいと思うようになりました。

さて、そうなると必然的に
パソコン上にメモを取ることになるのですが、
SIerの出向型SEの場合だと自分のパソコンを出向先に持ち込めない事が多いでしょう。

また、現場も変わることが度々あるので
パソコンでメモをとっても、
せっかく自分で作ったアウトプットが
いつかは無くなってしまいます。

そこで、休日の少しの時間を使って
自分のノート、あるいは参考にしたサイトを
家のパソコンでQiitaの記事にするのです。
※くれぐれも借りてるパソコンからはダメですよ

そして一度、記事にさえしてしまえば
ネット環境さえあれば携帯からでもパソコンからでも記事が見れます。

自分のアカウント名さえ覚えておいて
アカウント名を検索すれば
ログインする必要もなく、
コンプライアンス的にも問題なく
いつでもどこでも自作のノートを見ることができるのです。

#アウトプットするメリット#
また、アウトプットすること自体に
自他共に大きなメリットがあります。

まずは、
①自分で考える
②手を動かして成果物を作り上げる
③人に伝える
というプロセスを踏まえる事で
脳により強く記憶として残すこができます。

ただ読んだだけでわかった気になってしまう事は多いですが
他人へ説明できるレベルまで
自分の頭の中での理解が達して、本当の意味での理解です。

#コメントと言う名のレビューバック#
自分ではわかった気になっている事でも
有識者の方から見れば理解度が浅かったり、
間違っているような事は往々にしてあります。
他人から見ても納得できるまでの理解度にまでしましょう。

私も多くの指摘コメントを頂いてきましたが、
いただけるコメントの一つ一つが自身の理解度を深める有り難い資産になっています。
(まだまだ未熟者ですが

#ポートフォリオとしてのメリット#
さらにこのQiitaの記事は
自分から見た時にはノートですが、
他者から見た時にはあなた自身の立派なポートフォリオにもなるのです。

将来的に転職などを考えているのであれば
その時にあなたが自分の為に作っていた
ノートたちが自身の技術理解のエビデンスとしての効果を発揮する事でしょう

#技術記事としてのQiitaへの貢献#
最初は、
Qiitaに記事を書く。
と思うと尻込みしてしまうかもしれません,

しかし、
Qiitaに上がっている記事の約半数は
いいねが1以下のカス記事なのです。
(自然現象は正規分布ではなく冪乗分布を取るケースが多いです。)

「スタージョンの法則」というものがあります。
「どんなものも、その90%はカス（crud）である」
あなたの記事がカスであろうと、気にすることはありません。
なぜなら他の大多数9割もカスなのだから。

また、SBIホールディングスの北尾社長が
事業戦略の基本観として掲げる、
哲学者ヘーゲルの弁証法の一つに、「量質転化の法則」というものがあります。

カスがある一定の量に達した時には質が転化するのです。
塵も積もれば山となるということですね。

あなたの書いた自分の為のノートは、
行く行くはQiitaへの貢献、そしてIT業界にとっての資産となるのです。

#最後に#
さぁそれではあなたも
今日仕事をしてきて何か学んできたことがあると思います。
早速それをQiitaの記事にしてみましょう。

ただし、利用規約とガイドラインには目を通しましょうね
[利用規約](https://qiita.com/terms)
[コミュニティガイドライン](https://help.qiita.com/ja/articles/qiita-community-guideline)
[良い記事を書くためのガイドライン](https://help.qiita.com/ja/articles/qiita-article-guideline)
※shiracamusさん、コメントいただきありがとうございました。

以上、カス記事でした。
Enzymeでfindを使った際に、仮想ノードと実ノードが検出される場合の対策

久しぶりに `Enzyme` を使った際に、 Shallow Rendering と Full DOM Rendering の挙動の違いで少々ハマった。過去にもつまづいた事例であったため、覚え書きとして書き残す。

# コード
```typescript:Country.tsx
import React from 'react';

interface IProps {
  className:  string;
  greeting: string;
}
class Country extends React.Component<IProps, {}> {
  public constructor(props: any) {
    super(props);
  }
  public render() {
    return (
      <div>
        <span className={this.props.className}>{this.props.greeting}</span>
      </div>
    );
  }
}

export default Country;
```

```typescript:Country.test.tsx
import { configure, shallow, ShallowWrapper, mount, ReactWrapper } from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
import React from 'react';
import Country from '../Country';

configure({ adapter: new Adapter() });

const countryShallow: ShallowWrapper = shallow(<Country
  className="France" 
  greeting="Bonjour"
/>);
const countryMount: ReactWrapper = mount(<Country
  className="France" 
  greeting="Bonjour"
/>);
it('Works', () => {
  expect(countryShallow.find('.France').render().text()).toBe("Bonjour");
});

it('FAILS', () => {
  expect(countryMount.find('.France').render().text()).toBe("Bonjour");
  console.log(countryMount.debug());
});

console.log(countryShallow.debug(), "\n");
console.log(countryMount.debug());
```

# コード解説
`Country` オブジェクトをレンダリングする際、子ノードにクラス名を指定したく、プロパティ `className` を設定した。

# 再現
Full DOM Rendering したノードを探索するため、リファレンスに沿って Shallow Rendering と同様に `find()` を使った。ノードが1つだけ発見されることを期待したが、2つ発見されたためエラーとなった。

```sh
  ● FAILS

    Method “html” is meant to be run on 1 node. 2 found instead.

      19 |
      20 | it('FAILS', () => {
    > 21 |   expect(countryMount.find('.France').render().text()).toBe("Bonjour");
         |                                       ^
      22 |   console.log(countryMount.debug());
      23 | });
      24 |
```

# 原因
Shallow Rendering は、単純に `render()` が返すノードをレンダリングする。他方の Full DOM Rendering では、まず仮想ノードがレンダリングされ、その配下に `render()` が返すノードがレンダリングされる。

```sh
    console.log src/__tests__/App.test.tsx:25
      <div>
        <span className="France">
          Bonjour
        </span>
      </div>

    console.log src/__tests__/App.test.tsx:26
      <Country className="France" greeting="Bonjour">
        <div>
          <span className="France">
            Bonjour
          </span>
        </div>
      </Country>
```

このため、Full DOM Rendering では同じクラス名が2つ存在し `find()` が複数のDOM要素を検出するため、後続の `render()` の実行に失敗した。

# 対策
実ノードのみを得たい場合は `hostNode()` を用いる。この例では `find()` が検出したDOM要素の中から実ノードのみを返すことで結果的に単一ノードが得られ、後続の `render()` が正常に実行される。

```diff:Country.test.tsx
it('FAILS', () => {
- expect(countryMount.find('.France').render().text()).toBe("Bonjour");
+ expect(countryMount.find('.France').hostNodes().render().text()).toBe("Bonjour");
  console.log(countryMount.debug());
});
```
文教モデルdynabook R732 でWindows10とUbuntu18.04のデュアルブート

#はじめに
大学生協で購入したdynabookでUbuntuをデュアルブートしたい。
同じことをやっている先人たちがいましたが、うまくいっていなかったり、CSMブートを使用していたりなど複雑そうだったので、UEFIで起動させることを前提に挑戦してみた。この辺の知識が全然ないので意味わからん事書いてるかもしれません。
　
※失敗してOSが起動できなくなっても責任をとりませんので、バックアップを取るか、メインでないハードディスクを使用するなどしてください。

#環境
PC : TOSHIBA dynabook R732 (文教モデル)
OS : Windows 8 → 8.1 → 10

今回新たにインストールするOS : Ubuntu 18.04

#手順
###１ UbuntuのLive USBを作成
適当なUSBを用意。
OSは[こちら](https://www.ubuntulinux.jp/download/ja-remix)のサイトから、ubuntu-ja-18.04.1-desktop-amd64.isoをダウンロード。
Universal USB Installer などを使用して、Live USBを作成。
詳細は省略。


###２ Windows側の設定
高速スタートアップを無効にしておく。
コントロール パネル\ハードウェアとサウンド\電源オプション\システム設定\"高速スタートアップを有効にする"のチェックを外す。

###３ BIOSの設定
BIOS画面を開き、設定を変更する。
dynabookの場合、PCをシャットダウンしてから起動→F2ポチポチでBIOSの画面に移る

1. Secure Bootを無効にする
2. ブートの優先順位をUSB上位にしておく

PCを起動するときにF12ポチポチで、起動するディスクを選択する画面になるので、2 の設定はしなくてもよい。

###４ Ubuntuのインストール
Live USBからUbuntuを起動、"インストールせずUbuntuを試す"を選ぶ。
GPartedでUbuntu用のパーティションを作る。
/dev/sda4 がWindowsのCドライブになっていて、後ろから40GBを縮小し、空きパーティションとした。

デスクトップのinstall ubuntuからUbuntuをインストール。
途中、インストールの種類では、手動ではなく"Windows Boot Managerとは別にインストール"を選択。
/dev/sda2にgrubがインストールされる（/dev/sda2はもとからあったEFIパーティション）

インストール完了後、再起動しても System BootOrder not found. と出たので再びUSBから"インストールせずUbuntuを試す"を起動。
Terminalを開き、以下のコマンドを入力。

```
$ sudo su
# mount /dev/sda2 /mnt/
# cp /mnt/EFI/ubuntu/grubx64.efi /mnt/EFI/Boot
# rm -r /mnt/EFI/Boot/bootx64.efi
# mv grubx64.efi bootx64.efi
# umount /dev/sda2 
# reboot
```

やったことは、EFIパーティションのsda2をマウントして、
/EFI/ubuntu/grubx64.efiを/EFI/Bootにコピーして、名前をbootx64.efiに変更しただけである。
これでgrubが起動し、ubuntuとWindowsが選べるようになった。

![86811581-FB1D-4F9B-9223-AB22D383062C.jpeg](https://qiita-image-store.s3.amazonaws.com/0/239489/b0917c84-1768-5b5d-2939-14f7a6dcec2d.jpeg)


#おわりに
Ubuntuを起動し、最初のパッケージアップデートをするとまたgrubが起動できなくなったので、上のコマンドを再度実行したら直った。
繰り返しますが、まずはバックアップを取ってから作業するようにお願いします。
Ubuntu18.10にPython+Keras+Tensorflow-gpu環境をつくる

初投稿です。どうぞお手柔らかに...
自分が初心者なので、だいぶゆるい内容となっています。

#nvidia周りを整備
前提条件として、nvidiaのグラフィックドライバがすでに入っている状態から始めます。
##CUDA9.0を導入する
CUDA9.0を下記のサイトからダウンロードします。
https://developer.nvidia.com/cuda-90-download-archive?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1604
今回はUbuntu18.10ですが、Ubuntu16.04版でも問題なく動作しました。
端末(ターミナル)上で

```
$ sudo dpkg -i "ダウンロードしたdebファイル"
```
でインストールします。一応、先程のリンクにあった4つのパッチも当てておきます。
##cuDNN7.4を導入する
下記のサイトからダウンロードします。ダウンロードにはアカウントの登録が必要です。
https://developer.nvidia.com/cudnn
「Download cuDNN v7.4.2 (Dec 14, 2018), for CUDA 9.0」と書かれているリンクをクリックし、
「cuDNN Runtime Library for Ubuntu16.04 (Deb)」
「cuDNN Developer Library for Ubuntu16.04 (Deb)」
「cuDNN Code Samples and User Guide for Ubuntu16.04 (Deb)」
の3つのファイルをダウンロードします。これらはUbuntu16.04版ですが、問題なく動作しました。

```
$ sudo dpkg -i "ダウンロードしたdebファイル"
```
の動作を先ほどと同じように3つのファイルについて実行しましょう。
##仕上げ

```
$ export PATH="/usr/local/cuda/bin:$PATH"
$ export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
```
を端末で実行してください。仕上げです。
##おまけ
私がこの操作で使用したファイルはこちらです。なにか問題があったら自分のと確かめてみてください。
*cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64.deb
cuda-repo-ubuntu1604-9-0-local-cublas-performance-update_1.0-1_amd64.deb
cuda-repo-ubuntu1604-9-0-local-cublas-performance-update-2_1.0-1_amd64.deb
cuda-repo-ubuntu1604-9-0-local-cublas-performance-update-3_1.0-1_amd64.deb
cuda-repo-ubuntu1604-9-0-176-local-patch-4_1.0-1_amd64.deb
libcudnn7-dev_7.4.1.5-1+cuda9.0_amd64.deb
libcudnn7-doc_7.4.1.5-1+cuda9.0_amd64.deb
libcudnn7_7.4.1.5-1+cuda9.0_amd64.deb*
#Python側を整備
非Anaconda環境で、Python 3.6.7です。
端末で、

```
$ pip3 install numpy, tensorflow-gpu, keras
```
これで完了です。
#動作確認
Kerasの公式サンプルを使います。gitコマンドについては調べてください。

```
$ git clone https://github.com/keras-team/keras.git
$ cd keras/examples
$ python3 mnist_cnn.py
```
いろいろズラズラと出て、最終的にこんな感じに表示されたら成功です。

```
c: 0.9918 - val_loss: 0.0273 - val_acc: 0.9914
Test loss: 0.0273339375382
Test accuracy: 0.9914
```
##Numpyのインポートでエラーが発生する場合
こんな感じのエラーが...

```
AttributeError: type object 'numpy.ndarray' has no attribute '__array_function__
```
私もこれに一時は悩まされましたが、

```
$ pip3 --no-cache-dir install -I numpy
```
で解決しました。解決しない場合は、Numpyのバージョンを落としてみるといいかもしれません。
#最後に
私の書いたものが誰かの役に立ってくれることを願っています。
ではみなさん、良いTensorflowライフを！
git push origin master を禁止するbash設定

GitHubを使用しているとうっかり `git push origin master` でmasterブランチを上書く事がありますがそれを防ぐためのbash設定の紹介になります。
bashコマンドのフック処理を覚えておくと色々と応用が利きそうなのが試みた動機になります。

## 設定手順
ターミナル上のコマンドをフックするために [bash-preexec](https://github.com/rcaloras/bash-preexec) を利用します。
任意のディレクトリにダウンロードしてください。

```bash
cd ~
git clone git@github.com:rcaloras/bash-preexec.git
```

`~/.bash_profile` に以下のコードを追加して `source ~/.bash_profile` で反映させます。
`origin` 以外に `upstream` も対象にするならif文を追加してください。

```bash
source ~/bash-preexec/bash-preexec.sh

preexec_functions=() # source ~/.bash_profile を複数回実行するとコマンドが複数登録されてしまう
preexec_functions+=(ignore_push_master)

ignore_push_master() {
  if [ "${1}" = "git push origin HEAD:master" ]; then
    echo "Don't use 'git push master' !!"
    kill -INT 0
  fi

  if [ "${1}" = "git push origin master" ]; then
    echo "Don't use 'git push master' !!"
    kill -INT 0
  fi
}
```

## 参考サイト
以下のサイトからヒント、インスピレーションをいただきました。感謝！

* [シェルでコマンドの実行前後をフックする](http://note.hibariya.org/articles/20170219/shell-postexec.html)
* ['git push origin master'禁止にする設定](https://qiita.com/akymrk/items/b46b03b313850e3ae418)
CSVへの直URLからデータを読み込む

# 前略
CSVへの直URLからデータをダウンロードし、データフレーム化します。

# 手順
`requests`でGETし、`io`でテキストをストリームオブジェクトのように扱います。

```python
import requests
import io

url = 'https://raw.githubusercontent.com/ground0state/for_qiita/master/data/iris.csv'
res = requests.get(url).content
df = pd.read_csv(io.StringIO(res.decode('utf-8')), header=0, index_col=0)
```
cloud9の設定。SSH接続でつまづいたのでメモ

#目的
cloud9を利用するのにつまづいたのでメモを残す

#環境
東京リージョンにEC2インスタンスを作って、シンガポールリージョンのCloud9を利用する。

#つまづいた

sshキーをちゃんと登録したのに、どうしてもエラーになってしまう。
![Create a new environment 2019-01-20 01-20-13.png](https://qiita-image-store.s3.amazonaws.com/0/336536/0cf3201c-25f4-2bcc-390c-d63cd9486316.png)


めちゃめちゃ探して下記のサイトにたどり着く。
セキュリティーグループにシンガポールリージョンのIP追加したらいいことに気づく。

[AWS TokyoリージョンでCloud9を使う](https://note.mu/zephel01/n/n0004623fbbdb)

![EC2 Management Console 2019-01-20 01-27-17.png](https://qiita-image-store.s3.amazonaws.com/0/336536/bb5be2aa-5110-a08c-db5e-5746081eaafc.png)

通った！

![Create a new environment 2019-01-20 01-24-58.png](https://qiita-image-store.s3.amazonaws.com/0/336536/b4f6f177-9095-3375-3f17-5c4b421234c3.png)

#結果
無事cloud9を立ち上げることができた！嬉しい！
![test-rails - AWS Cloud9 2019-01-20 00-15-11.png](https://qiita-image-store.s3.amazonaws.com/0/336536/7ab6c2ca-1331-6803-d821-2c0adb265637.png)

#補足
まだ、ElasticIPを設定してなかったので、インスタンスを起動させるたびにパブリックIPが変わっていたので設定しました。
※ElasticIPを作成した後に、アドレスの関連付けでインスタンスを関連づけることを忘れないように！
![EC2 Management Console 2019-01-20 01-36-31.png](https://qiita-image-store.s3.amazonaws.com/0/336536/2a67c578-f728-d904-38a9-962275c99904.png)

SSH接続する際にIPを固定できました！
[C#]配列の要素を一つずつ処理するときにindexも欲しい

配列の要素を一つずつ処理するときに`index`も欲しくなること、ありませんか？

従来であれば

```csharp
var values = new int[] { 5, 4, 3, 2, 1, 0 };
```

このような配列に対して、

```csharp
for (var i = 0; i < values.Length; i++)
{
    var v = values[i];
    // ほげほげ
}
```

のように`for`文を使用するか、

```csharp
foreach (var o in values.Select((v, i) => new { Value = v, Index = i }))
{
    var v = o.Value;
    var i = o.Index;
    // ほげほげ
}
```

のように匿名クラスを使う方法がありました。

前者はちょっとめんどくさいですし、後者は匿名クラスを使うのでアロケーションが気になります。

C# 7.0から使える値タプル(ValueTuple)と分解(Deconstruction)を使用すれば以下のようになります。

```csharp
foreach (var (value, index) in values.Select((v, i) => (v, i)))
{
    // ほげほげ
}
```

まるで別言語のような書き方ですがとてもシンプルになりました:relaxed:
余分な変数を作ってしまわないのもいい感じです:ok_hand:

注意点として、パフォーマンスを追い求めるなら最初のfor文を使用する方法が一番良いです。
これは配列の範囲チェックやそもそも`Select`を行った時点でクラスがアロケートされてしまうからです。
配列の場合は匿名クラスを使うよりかは幾分ましですし、もともと添字でアクセスできないような`IEnumerable`に対してはなかなかいい方法なんじゃないかと思います。
LaravelのBladeでHTMLコードを出力する

# 経緯 
controller側から返却されたhtmlコードをblade側でhtmlコードとして出力したいが、`{{ }}`で変数を囲むとエスケープされた状態で表示されてしまう。

# 解決策
```index.blade.php
{!! $html_code !!}
```
Mojaveにしたらclangが動かないのを解決した

Apple clangから普通のclangに切り替えようとしたとき、clangがエラーを吐いてコンパイルできなくなってしまった。
macOSをMojaveにアップデートしたら起きるmacOS特有のエラーらしく、記事のとおりに試したが解決できずにいたのだが、その原因がわかり解決できたので、今回はその備忘録的なことを書く。

#概要
Emacsのironyを動かしたくて、Apple clangからclangに切り替え。

    brew install llvm

そのあとパスを設定。

だが、EmacsのironyがC++のメンバ関数の補完が動かない…
どういう状況かというと、例えば、下記のようなC++のコードがあったとき、

```cpp
#include<iostream>
#include<vector>
using namespace std;

int main(int argc, char const *argv[])
{
    vector<int> v;
    return 0;
}
```

`v.p`と入力すれば`v.push_back()`と補完されるはずだが、何故かされない…
変数やクラス名の補完は動いているのでEmacsのせいでは無いみたい…

#clangのせいでは？

あれ？と思いclangでコンパイルしたら、

    $ clang++ Test.cpp
    In file included from Test.cpp:1:
    In file included from /usr/local/Cellar/llvm/7.0.1/include/c++/v1/iostream:38:
    In file included from /usr/local/Cellar/llvm/7.0.1/include/c++/v1/ios:215:
    In file included from /usr/local/Cellar/llvm/7.0.1/include/c++/v1/iosfwd:90:
    /usr/local/Cellar/llvm/7.0.1/include/c++/v1/wchar.h:119:15: fatal error: 'wchar.h' file not found
    #include_next <wchar.h>
                  ^~~~~~~~~
    1 error generated.

なるほど…`<wchar.h>`がないから動かない…と怒られてしまった。
原因はxcodeのCommandLineToolsが入ってないかららしい。

    xcode-select --install
    sudo xcode-select --switch /Library/Developer/CommandLineTools/


#もう一度

    $ clang++ Test.cpp
    In file included from Test.cpp:1:
    In file included from /usr/local/Cellar/llvm/7.0.1/include/c++/v1/iostream:38:
    In file included from /usr/local/Cellar/llvm/7.0.1/include/c++/v1/ios:215:
    In file included from /usr/local/Cellar/llvm/7.0.1/include/c++/v1/iosfwd:90:
    /usr/local/Cellar/llvm/7.0.1/include/c++/v1/wchar.h:119:15: fatal error: 'wchar.h' file not found
    #include_next <wchar.h>
                  ^~~~~~~~~
    1 error generated.

動かない…
調査してみたら下記の記事が見つかった。

[Xcode 10 Release Notes](https://developer.apple.com/documentation/xcode_release_notes/xcode_10_release_notes)

[Install failed, "zlib not available" on macOS Mojave](https://github.com/pyenv/pyenv/issues/1219#issuecomment-428700763)

これらによるとMojaveでは`xcode-select —install`してもソフトウェア(?)によってはヘッダファイルのインストールが失敗するみたい

    sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /

#結果

    $ clang++ Test.cpp
    $ ./a.out
    やったぜ

#使用したコード
```Text.cpp
#include<iostream>
#define cout(x) cout << x << endl;
using namespace std;

int main(int argc, char const *argv[])
{
    cout("やったぜ")
    return 0;
}
```
Google Apps Script で XML スプレッドシート 2003 をダウンロードする（メモ）

後で清書予定。

1. XML を扱うには `XmlService` が使える。
2. 任意の処理命令 ( `<?処理命令ターゲット 処理内容?>` ) を付与する方法は見つからなかったので、 `setOmitDeclaration(true)` により XML 宣言を消して必要な処理命令を文字列結合で付与。
3. 各エレメントに対して名前空間を指定し忘れると、 `xmlns=""` が挿入されるので注意。
4. ブラウザで開いてダウンロードさせるには `downloadAsFile` 関数を使う。
5. XML スプレッドシート 2003 の仕様書はたぶん[ここ](https://docs.microsoft.com/en-us/previous-versions/office/developer/office-xp/aa140066(v=office.10))

```js
function doGet() {
  const defaultNamespace = XmlService.getNamespace('urn:schemas-microsoft-com:office:spreadsheet');
  const root = XmlService.createElement('Workbook', defaultNamespace);
  const namespaceSs = XmlService.getNamespace('ss', 'urn:schemas-microsoft-com:office:spreadsheet');
  
  const worksheetElement = XmlService.createElement('Worksheet', defaultNamespace)
      .setAttribute('Name', 'sheet1', namespaceSs);
  root.addContent(worksheetElement);
  
  const tableElement = XmlService.createElement('Table', defaultNamespace);
  worksheetElement.addContent(tableElement);
  
  const rowElement = XmlService.createElement('Row', defaultNamespace);
  tableElement.addContent(rowElement);
  
  const cellElement = XmlService.createElement('Cell', defaultNamespace);
  rowElement.addContent(cellElement);
  
  const dataElement = XmlService.createElement('Data', defaultNamespace)
      .setAttribute('Type', 'String', namespaceSs)
      .setText('test');
  cellElement.addContent(dataElement);
  
  const document = XmlService.createDocument(root);
  const content = XmlService.getCompactFormat().setEncoding('UTF-8').setOmitDeclaration(true).format(document);
  const payload = '<?xml version="1.0"?>' + '<?mso-application progid="Excel.Sheet"?>' + content;
  return ContentService.createTextOutput(payload)
      .setMimeType(ContentService.MimeType.XML)
      .downloadAsFile(Utilities.formatDate(new Date(), 'JTS', "yyyyMMdd'T'hhmmss") + '.xml');
}
```

#参考
* [GASでJSONを返すAPIを作る](https://qiita.com/tfuruya/items/3c306ee03d1ac290bcef)
* [Class XmlService](https://developers.google.com/apps-script/reference/xml-service/xml-service)
VirtualBoxのネットワーク設定を絵で説明する

某新人くんに捧ぐ…

# 前提
まず、私の使用しているWindows PCのネットワークはこんな感じ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/109270/4e9fa58d-b09f-acb1-0add-3dc657f6371a.png)

インターネットには無線LANのアダプタを通して接続しています。
有線LANのアダプタもあります。

# ホストオンリーアダプター
\# VirtualBoxのデフォルトの設定はNATですが、説明しやすさから、まずはこちら。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/109270/c79970d3-3e21-9802-62cd-435cefe1e900.png)

Host-only Adapterは、**仮想的なアダプタ（NIC）をホストOSに作成して、それを通して、VirtualBoxの仮想マシンとホストOSを接続**します。ホストOSからすると、物理的にLAN接続して別の機器を通信しているように見えます。

VirtualBoxの仮想マシン同士も、このloopback interfaceとして作られたアダプタを通して通信するので、ホストOSからパケットを覗くことができます。なお、このネットワークは、ホストOSの物理的なアダプタと関わらないので、仮想マシンがインターネットへ出ることはできません。

# 内部ネットワーク
![image.png](https://qiita-image-store.s3.amazonaws.com/0/109270/f760ee55-127a-a8e6-f0fc-d8e45dc25cc9.png)

こちらは、**VirtualBox内部のスイッチ的なものを通して仮想マシン同士を通信**を可能にします。

ホストOSのアダプタは一切介さないので、ホストOSからパケットを覗くことはできません。また、当然このネットワークもインターネットと接続することはできません。

# NAT
![image.png](https://qiita-image-store.s3.amazonaws.com/0/109270/e5f29556-0285-e3f8-8752-762d27ea60ae.png)

"NAT"は**ホストOSと仮想マシンつなぎ、仮想マシンからインターネットへの接続を可能**にします。Virtual Boxがルーターとして、仮想マシンとホストOSをつなぎ、さらにホストOSが仮想マシンからのパケットをルーティングして、インターネットへと送り出します。ホストOSからは、VirtualBoxの仮想マシンも別のネットワークにいるホストに見えます。

この設定は仮想マシンごとに、OSとの間にルーターがあるイメージなので、仮想マシン同士は接続できません。また、NATを挟んでいるので、そのままではインターネットやホストOSから仮想マシンへアクセスすることはできません（ポートフォワーディングを行ええば可能ですが、ここでは詳細省略）。

仮想マシン同士が接続できないので一見不便ですが、インターネットからアクセスさせるような時、その対象を指定の一台に限定することができます。

# Nat network
![image.png](https://qiita-image-store.s3.amazonaws.com/0/109270/f9184dbf-79ad-3c9c-7076-373739d80a58.png)


NATネットワークは、**VirtualBox内のNAT用ネットワークと、ホストOSとを接続**します。ホストOSやインターネットからの見え方はNATと同じです。

NATと異なり、VirtualBoxの内部ネットワークを作成するので、仮想マシン同士も接続が可能です。

# Bridged
![image.png](https://qiita-image-store.s3.amazonaws.com/0/109270/4b5dac2c-b6b8-9306-428a-b577e6220f69.png)

ブリッジは、**ホストOSの物理アダプタを利用して、仮想マシンとホストOSを接続**します。ホストOSからすると、既存のアダプタで接続しているネットワーク上に、新しく機器が加わったような感じです（VirtualBoxはスイッチ的な役割）。

当然ブリッジ接続した仮想マシン同士の通信は可能です。実際はホストOSの物理アダプタを利用した通信なので、仮想マシン同士の通信はアダプタからパケットが覗けます。また、同じアダプタをつかっているので、当然仮想マシンもインターネットへ接続ができるようになります。

NATと違い、ホストOS同様もろにインターネットにさらされることになる点に注意。

# 組み合わせ例
![image.png](https://qiita-image-store.s3.amazonaws.com/0/109270/4cf9174a-6aad-6d4f-f2be-f0dc06e87736.png)

webサーバーは外からもアクセスできるようブリッジでインターネットへ接続できるようにして、その他はホストオンリーでホストOSとつなげるようにしています。

# 参考
基本的に公式Documentに全て書いてあります。
https://www.virtualbox.org/manual/ch06.html

以上
Mac OS X から Node.js をアンインストールする方法

Atomでsassを使いたくて色々としていましたが、うまくできなかったので一度アンインストールしたくてやってみました。

<h2>npm とは？</h2>
Node Packaged Modules(npm)とはNode.jsのライブラリやパッケージを管理することができるツールです。 ライブラリやパッケージの管理ツールを主にパッケージマネージャと呼びます。 ... Node.jsのパッケージマネージャであるnpmは、Node.jsと一緒にインストールされています。

参考：https://team-lab.github.io/skillup-nodejs/2/4.html

<h2>アンインストール</h2>
下記をterminalにコピペして実行。

```ruby:
lsbom -f -l -s -pf /var/db/receipts/org.nodejs.pkg.bom \
| while read i; do
  sudo rm /usr/local/${i}
done
sudo rm -rf /usr/local/lib/node \
     /usr/local/lib/node_modules \
     /var/db/receipts/org.nodejs.*
```
参考
＞https://stackoverflow.com/questions/9044788/how-do-i-uninstall-nodejs-installed-from-pkg-mac-os-x

その後はNPMも削除。
```ruby:
sudo rm -rf ~/.npm
Onivimのチュートリアル

OnivimのチュートリアルでVimの復習

# モードの切り替え
- i: 挿入モードに。カーソルの位置を編集
- esc: 通常モードに
- o: 挿入モードに。下に行を追加して編集

# 移動
- h: ←
- j: ↓
- k: ↑
- l: →

# 単語単位の移動
- w: 次の単語の先頭へ移動
- e: 単語の最後へ移動
- b: 前の単語の先頭に移動

# 先頭・末尾への移動
- 0: 行頭へ移動
- _: その行の最初の文字に移動
- $: 行末に移動

# 文字単位の移動
- f + [文字]: 次の[文字]まで移動
- F + [文字]: 前の[文字]まで移動
- t + [文字]: 次の[文字]の手前まで移動
- T + [文字]: 前の[文字]の手前まで移動
- ; : 上の検索を繰り返す
- , : 検索を逆方向に繰り返す

# ファイル単位の移動
- G: ファイルの最終行に移動する
- gg: ファイルの先頭に移動する
- [数字] + G: [数字]番目の行へ移動する

# 検索
- / + [文字列]: [文字列]を検索する
- ? + [文字列]: [文字列]を逆方向に検索する 
- n: 次のマッチした文字列に移動する
- N: 逆方向のマッチした文字列に移動する

# Undo, Redo
- u: Undo
- Ctrl+r: Redo

# 文字を削除
- x:カーソル上の文字を削除する

# 削除操作
- dd: 現在の行(全体)を削除する
- dj: 現在の行と次の行を削除する
- dk: 現在の行と前の行を削除する
- dw: 現在の単語を削除する

# 変更操作
- cw: 現在の単語を削除して，インサートモードにする

# コピー&ペースト
- yw: 現在の行をコピーする
- yy: 現在の行(全体)をコピーする
- p: カーソルのあとにペーストする
- P: カーソルの手前にペーストする
【JavaScript 】配列要素の追加と削除

# 配列要素の追加と削除

```javascript:
'use strict';

const arr = [1, 2, 3];
console.log(arr); // [1, 2, 3]

// 配列の先頭に追加
arr.unshift(0);
console.log(arr); // [0, 1, 2, 3]

// 配列の先頭を削除
console.log(arr.shift()); // 0
console.log(arr); // [1, 2, 3]

// 配列の末尾に追加
arr.push(4);
console.log(arr); // [1, 2, 3, 4]

// 配列の末尾を削除
console.log(arr.pop()); // 4
console.log(arr); // [1, 2, 3]
```
※Google Chrome で確認
※ES8
Mac OS Xを手に入れたら絶対インストールするべきアプリ集

## Alfread
https://www.alfredapp.com/

ショートカットキーでいつでもファイルやGoogle検索が行えるようになります。

## Slate
https://github.com/jigish/slate

ショートカットキーでウィンドウをリサイズできるようになります。
### 使い方
https://qiita.com/harhogefoo/items/c25efe531511c3f746ca

## CotEditor
https://coteditor.com/

標準搭載されているテキストエディタよりも機能が豊富なテキストエディタです。

## Clipy
https://clipy-app.com/

コピーしたテキストの履歴からペーストをしたり、登録した定型文をペーストすることができます。

## Karabiner
https://pc-karuma.net/mac-app-karabiner/

キーリピートの速度を標準の環境設定値よりも早くすることができます。
【rails5】configファイル変更時はサーバー再起動が必要な場合あり

##ストロングパラメーターに関するエラーで５日間ほどハマったのでメモ。

ストロングパラメーターで値を受け取ろうとすると、

**ActionController::UnpermittedParameters**

とのエラー。

コードを見直しても一向に解消せず。

先輩から「サーバーの再起動が必要なんじゃない？」と言われ、サーバー再起動。

するとエラーが出なくなりました。

エラーが出ていた原因はconfigディレクトリのapplication.rbに

```
config.action_controller.action_on_unpermitted_parameters = :raise
```

の記述をしていたからでした。

このコードを削除してからサーバーを再起動することで解消出来ました。

```
config.action_controller.action_on_unpermitted_parameters = :raise
```

と記述すると、許可されていないパラメーターが渡された時に、

**ActionController::UnpermittedParameters**

というエラーを出せるようになる。

configファイルの設定は、rails serverを起動した時点で反映される。

なので、一度サーバー起動した後に、configファイル内のコードを書き換えをしてもそのままでは適用されない。

反映したい場合は、一度サーバーを再起動する必要がある。

railsチュートリアルをやっていた時、configの設定をいじった後はサーバーを再起動していたなと思いだしました。。

参考
railsドキュメント 設定ファイルconfigについて
http://railsdoc.com/references/config

サーバーの再起動が必要な変更と不要な変更
https://rereview.hatenablog.com/entry/20180612/1528813991
Mac から Windows に リモートデスクトップした時にコピペが出来ない場合

# コピペが出来るようにする方法

## 最新版の Microsoft Remote Desktop 10 を使っていますか？

使っている Remote Desktop アプリが四角いアイコン場合、それは古い Remote Desktop アプリです。
[‎Mac App Store]([https://itunes.apple.com/jp/app/microsoft-remote-desktop-10/id1295203466) から最新の Remote Desktop アプリ（Microsoft Remote Desktop 10）をダウンロードすれば、コピペができるようになります。
(# 新しいアプリがあるって教えてよ！ Microsoftさん & Appleさん）

| Microsoft Remote Desktop 8 | Microsoft Remote Desktop 10 |
|:-:|:-:|
| <img width="215" alt="MicrosoftRemoteDesktop8.png" src="https://qiita-image-store.s3.amazonaws.com/0/233927/09f03ef1-e90c-a522-b13b-102577ba65f3.png"> | <img width="215" alt="MicrosoftRemoteDesktop10.png" src="https://qiita-image-store.s3.amazonaws.com/0/233927/dd9882a5-bb65-09f4-bf23-951b33e706b6.png"> |

## 新しい Remote Desktop 10 を使っている場合

ごめんなさい、コピペできるようにする方法は分かりません。
Remote Desktop アプリの Redirection 機能（=ファイル共有機能）を利用して、ファイルのやり取りをしてください。

# コピペできなくなった原因やその他の不具合

## コピペできなくなった原因

根拠レスだけど、時期的に原因は [2018 年 5 月の更新プログラム適用によるリモート デスクトップ接続への影響 | Microsoft Japan Windows Technology Support](https://blogs.technet.microsoft.com/askcorejp/2018/05/02/2018-05-rollup-credssp-rdp/) だと思っている。実際、2018年5月頃に作った VM では、問題なくコピペできていた。

## JISキーボード を認識しない

[‎Mac App Store](
https://itunes.apple.com/jp/app/microsoft-remote-desktop-10/id1295203466) 上の Remote Desktop 10 のレビューには、「JISキーボードを認識しない」というレビューが数点あった。
Qiita で良さそう、且つ、分かりやすそうな記事「[Mac からのRDP 接続で日本語キーボードを設定する](https://qiita.com/hidecha/items/33624f6ae57d41f3cd86)」があったので、そちらを参照すればなんとかなりそう。

## さらに新しい Remote Desktop アプリ

問題調査していたときに、Microsoft の[ドキュメント](https://docs.microsoft.com/ja-jp/windows-server/remote/remote-desktop-services/clients/remote-desktop-mac)が見つかったので読んでみると、[ベータ版の Remote Desktop アプリ](https://rink.hockeyapp.net/apps/5e0c144289a51fca2d3bfa39ce7f2b06/)があるとのこと。
MacOS Mojave 10.14 のダークモードをサポートしているらしいので、人柱が好きな人やダークモード教の人は使ってみると良いかも。
また、Microsoft のドキュメントには、[FAQ](https://docs.microsoft.com/ja-jp/windows-server/remote/remote-desktop-services/clients/remote-desktop-client-faq)や[Mac 環境での導入手順](https://docs.microsoft.com/ja-jp/windows-server/remote/remote-desktop-services/clients/remote-desktop-mac)がしっかり作られているので（素晴らしい！）、そちらも読んだほうが良い。

## Microsoft Remote Desktop 9 はどうなったの？
どこにいったの？闇に葬られた？

# 最後に
コピペできなくて困っている人が、この記事を読んでコピペ出来るようになれば幸いです。