OmniAICreator/Qiita-1.07M huggingface dataset:
Azure Blob Storage にデータを蓄積しながら、Google Cloud Storage にもデータを蓄積しよう


前々回、前回のブログで、 AWS 上で生成されたデータを、 AWS S3 にストアしながら、 GCP GCS にもデータを流して、ストアする方法を書きました。

- [Apache NiFi を使って Google Cloud Storage にデータを蓄積しよう](https://qiita.com/kkitase/items/408cb9019dd25a74f453)
- [AWS S3 にデータを蓄積しながら、Google Cloud Storage にもデータを蓄積する](https://qiita.com/kkitase/items/e2f778355f76d8685ba4)

今回は、Azure 上で生成されたデータを、 Azure Blob Storage にストアしながら、　GCP GCS にもデータを流してストアする方法を書きます。 GCP GCS をデータレイクにして、 Google BigQuery などで分析を行うことを想定しています。

- GCP 上の NiFi
![ss 2018-03-31 12.52.30.png](https://qiita-image-store.s3.amazonaws.com/0/42406/ac33b25d-3941-f94e-0057-b822b5cb9e82.png)

- AWS 上の　NiFi
![ss 2018-03-31 12.52.28.png](https://qiita-image-store.s3.amazonaws.com/0/42406/abdf1baf-b76d-9c19-e415-c4a942b4d24b.png)

- Azure 上の　NiFi
![ss 2018-03-31 12.52.24.png](https://qiita-image-store.s3.amazonaws.com/0/42406/d749f065-b29b-24b9-37bc-f6c90dcc90b9.png)

## Azure での作業
- Azure 上で仮想マシンを作成

```
sudo yum -y update
sudo yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel
sudo sh -c "echo 'export JAVA_HOME=/usr/lib/jvm/jre-openjdk' >> /etc/profile.d/jdk.sh"
sudo sh -c "echo 'export PATH=\$JAVA_HOME/bin:\$PATH' >> /etc/profile.d/jdk.sh"
source /etc/profile.d/jdk.sh
wget https://archive.apache.org/dist/nifi/1.4.0/nifi-1.4.0-bin.tar.gz
tar zxvf nifi-1.4.0-bin.tar.gz
cd nifi-1.4.0/bin
./nifi.sh start
```

- port 8080 をオープン
- ``http://[ipaddress]:8080/nifi`` にアクセスし、正常に NiFi の UI が表示されるか確認
- Azure Blob を作成
![ss 2018-03-31 13.01.35.png](https://qiita-image-store.s3.amazonaws.com/0/42406/1ab2ebe8-b6ae-25dc-3e0c-7b23563f0dae.png)

- ストレージアカウント名、アクセスキー、コンテナ名を確認
![ss 2018-03-31 12.58.19.png](https://qiita-image-store.s3.amazonaws.com/0/42406/c7f9a259-2891-d2e4-6fda-b3109c8fa17a.png)

- NiFi の　PutAzureBlobStorage Processor を作成し、Property タブで、下記を入力
 + Storage Account Name : ストレージアカウント名
 + Storage Account Key : アクセスキー
 + Container name : コンテナ名
 + Blob : 任意の名前
![ss 2018-03-31 12.51.34.png](https://qiita-image-store.s3.amazonaws.com/0/42406/3f09ba50-aa8c-8476-a43f-50dec474e184.png)

- GenerateFlowFile を作成し、GenerateFlowFIle と　PutAzureBlobStorage 接続し、両　Processor を実行
- Blob で、ファイルが作成されていることを確認


## GCP での作業
- GCP 上にインストールした、 NiFi ``http://[ipaddress]:8080/nifi`` にアクセス
- Input Port を作成
 + Input Port Name : Azure
- PutGCSObject を作成
[Apache NiFi と Google Cloud Storage の連携](https://qiita.com/kkitase/items/408cb9019dd25a74f453) を参考

- Input Port と　 PutGCSObject を接続し、両　Processor を実行


## Azure での作業
- Azure 上にインストールした、 NiFi ``http://[ipaddress]:8080/nifi`` にアクセス
- Remote Process Group を作成
 + URLs : [GCP 上の NiFI の URL]
![ss 2018-03-31 12.43.36.png](https://qiita-image-store.s3.amazonaws.com/0/42406/61878565-c894-385c-eed4-67cd6f120442.png)

- GenerateFlowFile と　Remote Process Group を接続し、To Input で　 Azure を選択
![ss 2018-03-31 12.43.09.png](https://qiita-image-store.s3.amazonaws.com/0/42406/fced03ed-b213-9d50-e39e-3d0c59e28aa9.png)

- Remote Process Group を右クリック、Enable Transmission をクリックし、Remote Process Group を有効に
[AWS S3 にデータを蓄積しながら、Google Cloud Storage にもデータを蓄積する](https://qiita.com/kkitase/items/e2f778355f76d8685ba4) を参考

- GCS　でファイルが作成されていることを確認

以上
Django で Hello World

Django のサイト
[django](https://www.djangoproject.com/)

## Arch Linux で django のインストール

```bash
sudo pacman -S python-django
```


## 確認したバージョン

```text
$ python --version
Python 3.11.3

$ python -m django --version
4.2.3
```

## プロジェクトの作成

プロジェクト proj01
アプリケーション　home
を作成します。

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

>この時点で開発サーバーを動かしてみます。

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

>ブラウザーで　http://127.0.0.1:8000/
　にアクセスすると、Django のディフォールトのページが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/51938234-80a8-216e-63ea-d57830f717b7.png)



 更に設定をすすめます。

>メッセージを表示するプログラムの編集
>次のプログラムに差し替えます。

```py:home/views.py
from django.http import HttpResponse

def index(request):
    str_out = "<p>Good Afternoon</p>"
    str_out += "<p>こんにちは</p>"
    return HttpResponse(str_out)
```

>proj01/settings.py の編集
>'home' を加えます。

```py:proj01/settings.py
INSTALLED_APPS = [
    'home',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
```

>proj01/urls.py の編集

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

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

>home/urls.py の作成

```py:
from django.urls import path

from . import views

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

```

>再び開発サーバーを動かします。

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

>ブラウザーで　http://127.0.0.1:8000/
　にアクセスすると

![django_mar3102.png](https://qiita-image-store.s3.amazonaws.com/0/179446/27d5fc6d-2489-3e69-be4f-a9b6cd803557.png)

静的なファイルを表示するようにするには、
home の下に　static というフォルダーを作ります。

```bash
mkdir home/static
mkdir home/static/images
```

home/static/images　に画像ファイル(linux_logo.jpg)を入れて、それを表示してみます。

http://127.0.0.1:8000/static/images/linux_logo.jpg

![qiita_apr0401.png](https://qiita-image-store.s3.amazonaws.com/0/179446/e236f10f-8200-4842-ef8f-93f6e4b8efc3.png)

## Gunicorn でサーバーを動かす

```bash
gunicorn proj01.wsgi
```

## 外部からアクセスできるようにする

設定

```py:proj01/settings.py
（省略）
ALLOWED_HOSTS = ['*']
（省略）
```

サーバー起動

```bash
python manage.py runserver 0.0.0.0:8000
```

gunicorn

```bash
gunicorn proj01.wsgi -b 0.0.0.0
```
CPANにアイコンを設定する

アカウントを作り直したらやり方を忘れていたので、メモがてらに書いておきます。

# 前提

[PAUSE](https://pause.perl.org/)のアカウントを持っていること。
即ち、CPAN Authorであること。

# やりたいこと

http://search.cpan.org で自作のモジュールのページなどに、自分のアイコンが表示されるようにする。

# やり方

CPANは[Gravatar](https://ja.gravatar.com/)と連動しています。

従って、自分の `@cpan.org` のメールアドレスでGravatarのアイコンを設定しておくと、CPAN上でその画像が表示されるようになります。

# 参考

- [Faces of CPAN « Gravatar Blog](https://blog.gravatar.com/2010/05/05/faces-of-cpan/)
- [CPAN Avatars - perlmonks.org](http://www.perlmonks.org/?node_id=663287)
Slack無料版でプライベートチャンネルをエクスポートする

# slack-dump を使う
Slack無料版のエクスポート機能では、プライベートチャンネルのログを取得できません。
しかし、「slack-dump」というツールを使うと、この課題を解決することができます。
「slack-dump」を使用するには、Go言語の環境をインストールする必要があります。

# Go言語をインストールする
1. [こちら](https://golang.org/dl/)から、インストールします。
2. [こちら](http://golang.jp/install)から、各OSのインストール先を確認できます。

# slack-dump をダウンロードする
「slack-dump」は、[こちら](https://github.com/PyYoshi/slack-dump/releases)からダウンロードします。

# チャンネルのログを取得する
1. [こちら](https://api.slack.com/custom-integrations/legacy-tokens)から、ログを取得したいSlackワークスペースのAPIトークンを取得します。
2. 次のコマンドを実行します：`$ slack-dump -t=APIトークン`
3. 同じディレクトリにログが出力されます。プライベートチャンネルのログも出力されます。

# 参照サイト
https://github.com/PyYoshi/slack-dump
https://blog.pyyoshi.com/2016/10/18/slacknotiyatutoroguwooshou-qing-batukuatupu/
global ビルド

windows10のubuntueだとglobalのバージョンが5.7だったので、6.6.2にしたかったです。5.7だとタグづけに失敗する場合がありました。

https://www.gnu.org/software/global/
https://www.gnu.org/software/global/download.html
http://tamacom.com/global/global-6.6.2.tar.gz
globalのソースコードを入手

https://ftp.gnu.org/gnu/ncurses/
https://ftp.gnu.org/gnu/ncurses/ncurses-6.1.tar.gz
ncureseのソースコードを入手

順番は、ncurses → globalの順でインストールします。

```
tar xfz ncurses-6.1.tar.gz
cd ncurese-6.1/
./configure
make
sudo make install
```

```
tar xfz global-6.6.2.tar.gz
cd global-6.6.2
./configure
make
sudo make install
```

あとは、./configureやmakeに失敗することがあったので、いくつかツールをインストールしました。


apt-getのパッケージを最新版にして

```
sudo apt-get update
sudo apt-get upgrade
```

gcc ,make, autoconf, build-essential,textinfo(makeinfo)をインストールしたと思います。

```
sudo apt-get install gcc
sudo apt-get install make
sudo apt-get install autoconf
sudo apt-get install build-essential
sudo apt-get install textinfo
```
AutoHotkeyでChromeからタイトルとURLを取得するスクリプトを書いてみた

#AutoHotkeyでChromeからタイトルとURLを取得するスクリプトを書いてみた
neokix

#背景
GoogleのURL短縮サービスがなくなるらしいので，もう短縮しないことにして，とにかくURLとタイトルだけ取得できればいいやって思ってる方も少なくないと思います．
ということで，今回はAutoHotkeyでChromeからタイトルとURLを取得するものを書いてみました．

#スクリプト

```autohotkey_get_url
#IfWinActive, ahk_class Chrome_WidgetWin_1
:*:url//:: 						;url//とタイプすると
	Tooltip, Your URL is now copied
	WinGetTitle, vwintitlechrome, 			;Windowのタイトルを取得する
	vwintitle := SubStr(vwintitlechrome, 1, -16)	;ついてくる 【- Google Chrome】 の文字列を削除
	clipboard =
	Send, ^{l}   				        ;意外と知らないCtrl+Lで，URLのバーへ移動
	sleep, 400
	Send, ^{c}
	ClipWait, 5
	url := clipboard
	clipboard = %vwintitle% : %url%
	Tooltip, 
	return
#IfWinExist,
```
ポイントはあえて言うなら，Ctrl＋Lがアドレスバーへの移動···というぐらいでしょうか．
あと，WinGetTitleではGoogle Chromeの文字がつきまとうので，これもSubstringで消します．

毎度ジャンキーなコードですみません．
ブラウジングのお供になれば幸いです．

では!

neokix
Vagrant2.0.3を使ったCentOS7.4の環境構築

# Vagrant2.0.3を使ったCentOS7.4の環境構築

Vagrantを使ったCentOS7の環境構築で、毎回やっている作業をまとめてみます。

## 更新履歴

- 2018年4月22日
 - ~~Vagrant 2.0.4が出ていたので利用してみました。その結果なのかわかりませんが、vagrant sshで`setlocale`関連のwarningが発生していたため、解消する手順を追加。~~  
~~[SSH接続後にsetlocaleに対するwarningが発生する事象への解消方法](#ssh接続後にsetlocaleに対するwarningが発生する事象への解消方法)~~
 - Oracle VM VirtualBox 5.2.10はWondows版のダウンロードが「Windows Installer Soon Available」となっていて、まだ入手できてないので試していません。
- 2018年4月24日
 - `sudo localectl set-locale LANG=ja_JP.utf8`の記述だと、`setlocale`関連のwarningが発生し、`sudo localectl set-locale LANG=ja_JP.UTF-8`だと発生しないことが分かったので、不要な手順を削除。

## 環境まとめ
|＃|環境|概要|
|:--|:--|:--|
|1|ホストOS<br>（クライアントOS）|Windows 10|
|2|ゲストIP|192.168.33.10|
|3|Vagrant|2.0.3<br>*※2018年3月31日時点の最新*|
|4|Oracle VM VirtualBox|5.2.8<br>*※2018年3月31日時点の最新*|
|5|CentOS|7.4<br>利用しているboxはhttps://app.vagrantup.com/centos/boxes/7|
|6|SSHクライアント|TeraTerm|

## VagrantによるCentOS7の環境セットアップ

### centos/7 のboxイメージを利用する

管理者権限でコマンドプロンプトを起動し、カレントディレクトリを任意のディレクトリに移動してから、以下のコマンドを実行します。
※ここからしばらくはWindows環境（ホストOS上）のコマンドプロンプトやテキストエディタを利用した手順です。

```shell
vagrant init centos/7
```

### Vagrantfileの修正

vagrant initしたフォルダに「Vagrantfile」というファイルが生成されるので、以下のように修正します。
メモリのサイズを2GBに変更していますが、デフォルトだとおよそ500MBが割り当てられ、非常に小さいため、最初から設定するようにしています。

```ruby
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--memory", "2048"]
  end
end
```

### vagrant upでCentOS7を起動

最初の起動には少し時間が掛かります。

```shell
vagrant up
```

### CentOSにvimを入れる

CentOS上でテキスト編集する際に **vim** を使いたいのでvimをインストールしておきます。
`vagrant ssh`などを利用して、Vagrantで起動したCentOS7の環境へ接続した状態で後続の処理をします。

```shell
sudo yum -y install vim
```

### CentOSのtimezoneをAsia/Tokyoに変更

TeraTermでCentOS7に接続した状態で、dateコマンドを発行すると、ローカルPCのシステム日時と異なる時間が返却されていることが分かる。
タイムゾーンがデフォルトだとUTCに設定されているため、これをAsia/Tokyoに変更する。

```shell
sudo timedatectl set-timezone Asia/Tokyo
```

### localeを日本に変更

localectl statusコマンドを実行すると、LANG=en_US.UTF-8と出力され、日本になっていない。
これを日本に変更する。

```shell
sudo localectl set-locale LANG=ja_JP.UTF-8
source /etc/locale.conf
```

### yum管理の各種ソフトウェアをアップデート


```shell
sudo yum -y update
```

### 秘密鍵によるSSH接続の設定変更（パスワードのみでログインできるように）

上記手順のままCentOS7の環境構築を進めると、以下ディレクトリ内にある「private_key｝というファイルをTeraTermで接続時に指定する必要が出てきます。
C:\vagrant-work\centos7\.vagrant\machines\default\virtualbox\private_key  

面倒な場合は下記設定ファイルを修正することで、パスワードのみでSSH接続できるようになります。

```shell
sudo vim /etc/ssh/sshd_config
PasswordAuthentication yes  # ←修正箇所
```

### 開発環境として利用する場合、ファイアウォールを無効にしておきたいことがよくあるのでファイアウォールの無効

必要なければこの手順を省いて問題なし

```shell
sudo systemctl stop firewalld
sudo systemctl disable firewalld
```


以上でCentOS7の環境構築初期セットアップが完了です。
ここまで整ったら、あとはCentOS7上でやりたかったことをやっていく感じかと。
scrollIntoView pattern

### fn.scv(element,type);// type is 'top' 'bottom' else be the center
```js
let fn={}
fn.scv=(el,type='top')=>{
 if(type=='top') return el.scrollIntoView({ behavior: 'smooth',block: "start", inline: "nearest" })
 if(type=='bottom') return el.scrollIntoView({ behavior: 'smooth',block: "end", inline: "nearest" })
 /*if(type=='center')*/ return el.scrollIntoView({ behavior: 'smooth'}) 
}
```
Markdownのリンク用に見ているページのタイトルとURLをクリップボードにコピーする

# きっかけ

最近Qiitaの投稿をするようになったが、普段あまりMarkdownを書かないので、いろいろ慣れておらず戸惑った。
最もめんどくさく感じたのが、リンクを貼ること。
[Qiita](https://qiita.com) ←のようにリンクを貼るためには

```markdown:
[Qiita](https://qiita.com)
```

のようにカッコの中にタイトルとURLを記載しないといけない。

# 解決方法（Chrome拡張機能）

そこでググって発見したのが[Copy URL+](https://chrome.google.com/webstore/detail/copy-url%20/capojgaalppngkaagaobmigigcgnidmn?hl=ja)というChrome拡張。

見ているページのタイトルを、フォーマットを指定してクリップボードにコピーすることができる。
こんな感じの設定画面で、フォーマットを指定できる。
<img width="882" alt="スクリーンショット 2018-03-31 12.01.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/70022/be55ce87-c183-190d-3e1c-12a8bbd105b3.png">

```
[${title}](${URL})
```

のように設定すれば、
<img width="584" alt="スクリーンショット 2018-03-31 12.05.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/70022/7cf0da19-0e5b-7d80-a084-6a3f9b836106.png">
こんな感じでコンテキストメニューからタイトルとURLを簡単にクリップボードにコピーできる。

# 最後に

サンプルにもありますが、HTMLに貼れるような書式でコピーするなど、いろいろ使い道はありそう。
Qiitaに投稿するハードルを下げていきたい。
CheckStyle"インライン条件を使用しない"への対応

以下のようなソースがあったときにCheckStyleをすると、
`String foo = hoge();`
`String bar = foo == null ? "" : foo;`
「インライン条件を使用しない。」と警告される。

<font color="999999">CheckStyleの設定を変更すれば、警告を出さなくできるけど、</font>
警告を出さないソースについて調べてみた。
#結論
みんな大好きapache.commonsを使えば良さそう。
`String bar = StringUtils.defaultString(foo)`

###おまけ
`String hoge = BooleanUtils.toString(true, "真", "偽");`
みたいなのも、インライン警告を消すときに重宝しそう。
Linuxでマイクの音量が小さいときに、それを上げる方法

Raspberry Pi 3 にUSBのマイクをさして使用している。

```
$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 1: Device [USB PnP Sound Device], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
```
このマイクから音声が入ってこない。マイクのボリュームが0になっている。

```
$ amixer -D hw:1
Simple mixer control 'Mic',0
  Capabilities: cvolume cvolume-joined cswitch cswitch-joined
  Capture channels: Mono
  Limits: Capture 0 - 16
  Mono: Capture 0 [0%] [0.00dB] [on]
Simple mixer control 'Auto Gain Control',0
  Capabilities: pswitch pswitch-joined
  Playback channels: Mono
  Mono: Playback [on]
```

マイクのボリュームを100%にセットする。

```
$ amixer -D hw:1 sset Mic 100%
Simple mixer control 'Mic',0
  Capabilities: cvolume cvolume-joined cswitch cswitch-joined
  Capture channels: Mono
  Limits: Capture 0 - 16
  Mono: Capture 16 [100%] [23.81dB] [on]
```

試しに録音。 -Vmono でモノラルのVUメーターが表示される。

```
arecord -Vmono -D hw:1 -f S16_LE -c1 -r48000 /tmp/a.wav
```

再生の音量を上げる。

```
$ amixer -c0 sset PCM 100% unmute
Simple mixer control 'PCM',0
  Capabilities: pvolume pvolume-joined pswitch pswitch-joined
  Playback channels: Mono
  Limits: Playback -10239 - 400
  Mono: Playback 400 [100%] [4.00dB] [on]
```

再生。アナログのヘッドホン端子から音が出る。

```
aplay /tmp/a.wav
```

# 関連
[PCMのデータを自分でいじってデジタルオーディオを理解する](http://d.hatena.ne.jp/embedded/20151004/p1)
ドレスト光子で量子コンピュータはつくれるか？(２) 電気自動車用ワイヤレス給電

### [ドレスト光子で量子コンピュータはつくれるか？(1) の続きです。](https://qiita.com/zanjibar/items/b0ecb93f8572ddd0b34b)

###　EV用ワイヤレス給電規格[８５KHからのアプローチ](https://www.toshiba.co.jp/tech/review/2017/03/72_03pdf/f01.pdf)
ドレスト光子は、電磁波の近傍界の振る舞いを活用するものです。電磁波ならば、どの波長ももっている性質です。可視光になると量子力学の世界に踏み込むので更におもしろくなります。でも、可視光だと、ドレスト光子の大きさは、[５０から７０ナノくらいの大きさ](http://offshell.rodrep.org/wp-content/uploads/2018/02/1802R.001v1.pdf)なので、扱いがそこそこ面倒です。そこで、85KH の電磁波を数値シミュレーションを視野にいれて調べるのはどうでしょうか？　８５KHだと、近傍界は、約５８０メートルです。かなり大きいので、近傍界用の構造をつくるのもおそらく可視光よりは楽だと思われます。また、８５KHは、電気自動車（EV)用のワイヤレス給電の規格周波数なので、研究も広くされており、関連の素材も豊富です。また、簡単な工夫で効率をあげる結果がでれば、注目があつまります。

###　まずは、磁界測定から
近傍界は、磁界が主に機能している領域です。ワイヤレス給電は、いままでは、磁界をそのままつかう電磁誘導が主でしたが[MITが提唱した近傍界の磁界の特性を活用した磁界共鳴方式](http://tech.nikkeibp.co.jp/dm/article/COLUMN/20111125/201874/)がほぼ優勢になりました。磁界共鳴方式は、電磁誘導に比べて、離れていても効率よく送電可能で、しかも水中でも送電できます（水と空気の透磁率に差がないため）。ハピネットから、[電飾用のLED送電を行うクロスベース](https://prtimes.jp/main/html/rd/p/000000023.000031422.html)という商品が販売され話題になっています。磁界共鳴方式が優勢になったことで、磁界強度の測定が盛んにおこなわれるようなっています。すでに、測定サービスが提供されるほど、市場が形成されており、[Wave Technologyという会社が測定サービス](https://www.wti.jp/contents/wpt.htm)をやっています。磁界強度測定やシミュレーション用ツールやノウハウは、蓄積されている状況でしょう。[プローブ](https://www.mitutoyo.co.jp/support/service/catalog/01_zahyo/16005.pdf)と、[安価な磁気センサー](http://akizukidenshi.com/catalog/g/gI-09362/)の組み合わせで、精度は低くても簡易に近傍界の３次元での磁界強度測定が可能です。まずは、この種の磁界測定からはじめるのがいいでしょう。

###　しずくのイメージ
ドレスト光子の世界では、直感的なイメージとして光のしずくを使います。磁界共鳴の場合は、直感的なイメージは、共鳴を強調してメトロノームを使うことがあります。ワイヤレス送電の効率を考えるなら、しずくイメージの方が良いでしょう。蛇口（送信コイル）からでた水（磁界エネルギー）が、伝播せず、しずくのようになっているのを、スポンジ（受信コイル）が吸収するイメージです。

###　しずくをつくる（メタマテリアル）
まずは、しずくをつくるところからです。よくある磁界共鳴のコイル構造は単純で、ただ並べているだけです。磁界エネルギーをしずくのようのためておく構造は意識されていないようです。コイルのまわりに、磁界を遮蔽する構造物を配置して、磁界エネルギーが伝播せずに、空間にどんどん蓄積されるような仕組みをまずは、さぐってみましょう。磁界の遮蔽は、[メタマテリアル](http://metamaterials.riken.jp/tanaka/AccomplishmentFiles/MaterialIntegration24-11-09-TTanaka-PlasmonicMetamaterials.pdf)を使うのがよさそうです。共振型メタマテリアルは、閉じていないコイルで、作るのは簡単のようです。メタマテリアルは、８５KHで使うことはあまり想定されていないので、研究している人もすくないでしょう。早いもの勝ちかもしれません。うまく、磁界エネルギーのしずく状態をつくることができたら、どのくらいの速度で空間に磁界エネルギーを送り込めるのか、実験で試して見ましょう。効率のよい送信コイル、メタマテリアルの組み合わせが見つかれば、まずは成功です。

###　しずくをシミュレーションする
実験で、正解がわかったら、次はシミュレーションです。可視光の領域まで応用できる数値シミュレーションができたら大成功です。数値シミュレーションには、[FTDT法](http://www.engineering-eye.com/rpt/r063_jsces200805_02/pdf/r_keisan200805_02.pdf)がよくつかわれますが、[CIP法](http://www.fedu.uec.ac.jp/~levuhung/cip_method_jp.pdf)もよいかもしれません。まずは、単純なコイルからはじめて、しずくをつくりやすいコイルをさぐり、遮蔽物（メタマテリアルなど）をなんとか扱えて、実験結果とある程度整合性がとれれば、かなりの成功です。

###　しずくを維持する(エアバッテリー)
蛇口を閉じても、しずくは残ります。磁界共鳴で送電側で、電源のスイッチをオフにしたらどうなるのでしょうか？　ドレスト光子の世界では、ナノ構造に光がまとわりつくと表現されていますが、同じようなことは、磁界共鳴の周波数帯でもおこるのでしょうか？　電源を切っても、磁界エネルギーが十分な量で空間に残り、しばらく維持されるとするならば、空間にエネルギーをためているとも言えます。命名するなら、エアバッテリーでしょうか？　コイル周辺の遮蔽物（メタマテリアル）の構造によっては、面白い現象がありえるかもしれません。

###　しずくをスポンジ（受信コイル）ですいとる
空間に広がっている磁界エネルギーをスポンジのようにすいとる効率のよい受信コイルをさぐるのが、次のステップです。受信コイルは、しずくを作る必要はないですが、効率よく広い範囲の磁気エネルギーを吸い取る必要はあります。ここまで、できて、効率がよい可能性が提示できれば大成功でしょう。

###　しずくの量子化
この議論の最終的な目的は、ドレスト光子で量子コンピュータをつくることです。そこで、このしずくをつかって、量子コンピュータができるかの可能性をさぐりたいところです。しずくをレーザーのように、いわばボーズ凝縮した状態として扱うことができれば、巨大なので、扱いは楽です。量子相関があるまま、しずくを小分けすることができたりするならば、もしかすると量子コンピュータをつくれるかもしれません。
[Mathematica]データの読み込みと保存

#はじめに
この記事はMathematicaで計算や処理を行う際に用いるデータの読み込みや、結果の保存について書いたものです。

なお、私が使っているMathematicaはVerが11.1.1でPCのOSはWindows7ですので、macOSの方は若干方法が異なる部分があるかもしれません。

#読み書きするディレクトリの指定
早速方法を書いていきますが、まずは読み書きするディレクトリを指定する必要があります。そのためにはSetDirectoryを用います。例えばCドライブ内の"qiita"という名前のディレクトリに読み書きした場合は

```Mathematica:SetDirectory.nb
SetDirectory["C:\qiita"]
```
とします。

この際Windowsの場合以下の図に示すように、エクスプローラーで赤枠で囲った部分をクリックし、コピーすると楽にディレクトリパスを得ることができます。

![getPath.png](https://qiita-image-store.s3.amazonaws.com/0/239294/a77e864a-cdd3-f773-e067-f5e9e337636e.png)

#データの読み込み
読み書きするディレクトリを指定したら、次はデータの読み込みです。データを読み込むにはImportを用います。例えば"result.dat"というデータを読み込む場合は

```Mathematica:import.nb
data = Import["result.dat"]
```

とすると"data"に"result.dat"を代入することができます。そして、この"data"を用いて計算や処理を行います。

ちなみにMathematicaは様々なデータ形式に対応しているので、拡張子を画像や動画、音声といったものにしても基本的に問題ありません。**ただし、動画などの場合は容量が大きくなるので、読み込みに時間がかかる場合があります。**

#データの保存
最後にデータの保存です。データの保存にはExportを用います。解析結果が"data2"に代入されているとし、これを出力するには

```Mathematica:export.nb
Export["analysisResult.dat", data2]
```
とします。Export[保存するデータ名と拡張子,保存するデータが入っている変数の名前]とすることでSetDirectoryで指定している場所に保存することができます。

**保存したい場所が読み込んだデータがあった場所でない場合、Exportする前に再度SetDirectoryを用いて別のディレクトリを指定する必要があります**ので、その点は注意が必要です。

#まとめ
Mathematicaでデータを読み書きするには以下の手順となります。

1."SetDirectory"で読み書きするディレクトリを指定
2."Import"を用いて読み込み、変数に代入
3.代入した変数を用いて解析・処理
4."Export"を用いて3の結果を保存

これらの手順はMathematicaを用いる際の基本となりますので、押さえておくとよいでしょう。

最後までお読みいただきありがとうございました。
Python3 Turtle Race dashlineを書いてみたい....

Python独学初心者です。
for文を使って、もっと簡単にコードを描きたいです。
以下画像の緑枠部分をもっと簡単に書きなおしたいです。

どなたかアドバイス頂けたら幸いです。

![turtle_Race.png](https://qiita-image-store.s3.amazonaws.com/0/240318/6f4f3487-73d0-4f96-09b5-ee75c66d5ad0.png)
～ これだけ解けば十分闘える！過去問精選 10 問 ～ の8問目 Otoshidama をPHPで

## すでにPHPの記事があった orz

Qiitaで珍しくAtCoderの記事が話題になっていました。

[AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～](https://qiita.com/drken/items/fd4e5e3630d0f5859067)

これのPHPで解いてみた版を書こうと思ったら、[もうありました orz](https://qiita.com/rock619/items/3c4cc60416c94d081c54)

ただ、特に解説とかなかったので、書いてみても良いかなぁ、と。

過去問と言っても、だいたい解いちゃってるかなぁ、なんて思っていたんですが、8問目以降の300点問題は全部やってませんでした。

そんな訳で、今回は8問目を。

```
お年玉の合計金額とお札の合計枚数が与えられるので、
1万円札と5000円札と1000円札それぞれの枚数を1例出力せよ。

実現不可能な場合は「-1 -1 -1」を出力せよ。
```

という問題です。

1万円札と5000円札の枚数を仮に決めれば、1000円札の枚数は必然的に求まりますので、 O(n^2) で計算可能です。

もちろん、その場合には、時間制限に引っかかります。

```php
<?php
fscanf(STDIN, "%d %d", $N, $Y);
 
for ($k10 = 0; $k10 * 10000 <= $Y; $k10++) {
    for ($k5 = 0; $k10 * 10000 + $k5 * 5000 <= $Y; $k5++) {
        $k1 = ($Y - $k10 * 10000 - $k5 * 5000) / 1000;
        // printf("k10:%d k5:%d k1:%d\n", $k10, $k5, $k1);
        if ($k10 + $k5 + $k1 == $N) {
            echo "{$k10} {$k5} {$k1}" . PHP_EOL;
            exit;
        }
    }
}
echo "-1 -1 -1" . PHP_EOL;
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90217/a4a2b354-3429-4c38-9b2d-f3a6b85cf134.png)

<font color=red>**引っかかりませんでした ((((;ﾟДﾟ))))ｶﾞｸｶﾞｸﾌﾞﾙﾌﾞﾙ**</font>

とは言え、実行時間が442ms(0.442秒)かかっています。
もうちょっと工夫してみましょう。

## もうちょっと工夫して高速化

まず、1万円札の枚数だけ、仮に決めます。
残りを一旦、1000円札だけにします。
その後に、1000円札を5000円札に交換する儀式をすることにします。
変動するのは1万円札の枚数だけなので、計算量は O(n) です。

1000円札を5000円札に交換する儀式をすると、1000円札 **5** 枚が5000円札 **1** 枚になるので、 1回儀式を行うたびに、お札の合計が **4** 枚減ります。
つまり、1万円札と1000円札の時点で、Nより **4の倍数枚** 多い場合は、儀式によってピッタリの枚数にすることができます。
(※計算上、お札が0枚未満になる場合は除外します)

最初のプログラムでは、5000円札もループしていましたが、今回は5000円札の枚数を1回の計算で求めているので、高速になるはずです。

コードで書くと、こんな感じです。

```php5
<?php
fscanf(STDIN, "%d %d", $N, $Y);
 
$answer = "-1 -1 -1";
 
$k10max = floor($Y / 10000);
for ($k10 = 0; $k10 <= $k10max; $k10++) {
    $k1 = ($Y - $k10 * 10000) / 1000;
    if ((($k10 + $k1) - $N) % 4 == 0) {
        $k5 = (($k10 + $k1) - $N) / 4;
        $k1 -= $k5 * 5;
        if ($k5 < 0 || $k1 < 0) continue;
 
        $answer = "{$k10} {$k5} {$k1}";
        break;
    }
}
 
echo $answer . PHP_EOL;
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90217/842a9d47-4fdb-133e-b6d4-cd74f538f7ac.png)

実行時間が9ms(0.009秒)になりました。
ざっくり計算すると50倍くらいの速さで計算が終了したことになります。

……では！
【Oracle】VARCHAR型。2があって1はないのか？

# １.はじめに
最近、この本でOracleのアーキテクチャについて学んでいる。

[プロとしてのOracleアーキテクチャ入門【第2版】（12c、11g、10g 対応）](http://www.sbcr.jp/products/4797384086.html)

学習するなかで、OracleにはCHAR型、VARCHAR2型、NCHAR型、NVARCHAR2型の4つの文字データ型があるという解説があり、VARCHAR型は「2」があって「1」はないのか？ MySQLはVARCHAR型で「2」とかついてなかったよな？と疑問になったので調べてみた。
あと、常々日本語でなんと呼べば良いかも気になっていたので調べたのと、改めて「VAR」ってなんやねんって思い始めたのでそれも調べた。

##　4つの文字データ型の概要
| 種類| 最大値 |説明|
|:-----------|:------------|:------------|
|CHAR|2000|固定長文字列|
|VARCHAR2|4000|可変長文字列|
|NCHAR|2000|Unicodeのみサポートする固定長文字列|
|NVARCHAR2|4000|Unicodeのみサポートする可変長文字列|


#2．VARCHAR型。2があって1はないのか？
以下のスレッドに回答を見つけたので、以下引用

　[スレッド: VERCHAR とVERCHAR2について](http://otn.oracle.co.jp/forum/message.jspa?messageID=8043540)
>>VERCHARとVERCHAR2がORACLE9iのマニュアルで同義と記述ありました。
>まったく同じ物と考えて良いのですか？
>又、なぜ２つの型が存在するのか教えて頂けたらと思います。

>
VERCHAR2はVERCHARの発展形です
今後、VERCHARはサポートされなくなると言われてますのでVERCHAR2を使用した
ほうが良いでしょう 

なるほど、元々はVARCHARがあり現在は使われなくなって、その発展形のVARCHAR２が使われていると。。。そら、シンプルに考えるとそうですよね。

VARCHARとVARCHAR２の違いがあるような感じの説明を見かけましたが、２０１８年現在ではそこら辺の違いを意識する必要はなくなっているんですかね。。。

# 3.日本語で何と呼べばいいか？
自分は、「バーチャー」って呼んでいるが、年配の方は「バーキャラ」って呼んでいる人が多い印象。もしかして俺、間違ってる？と常々思っていたので調べてみた。

以下のQ&Aサイトのベストアンサーがしっくりきたので、以下引用。
　
　[char を何と読みますか？](https://teratail.com/questions/44525)

>
結局、先に日本語読みに変換してから省略するか、 
省略してから日本語読みにするかの違いだけという気がします。

>
「character」省略→「char」日本語読み→「チャー」 
「character」日本語読み→「キャラクタ」省略→「キャラ」

どっちでもOK!

# 4.改めてVARってなんやねん？

2があってなんで1がないねんと思って気になってみると、そもそも「VAR」ってなんやねんって気がしてきたので調べてみた。以下引用。

 [VARCHARって・・　あーそういう意味だったのねの巻](https://blog.trippyboy.com/2011/mysql/varchar%E3%81%A3%E3%81%A6%E3%83%BB%E3%83%BB%E3%80%80%E3%81%82%E3%83%BC%E3%81%9D%E3%81%86%E3%81%84%E3%81%86%E6%84%8F%E5%91%B3%E3%81%A0%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%AD%E3%81%AE%E5%B7%BB/)


>VARiable CHARacter
ヴァリアブル　キャラクター

「可変長」ってことですね。調べてから思い出したけど、MySQL触ってた時も1回調べた気がする。。。
jenkinsからlambdaをデプロイ


jenkins→s3→lambdaでやっています．

1.jenkinsでlambdaにデプロイするzipファイルを作成しておく
2.そのzipファイルをS3にアップロード
3.S3にあがったzipファイルをlambdaにデプロイする
といった流れです．

＊jenkinsがのっているインスタンスには，lambdaへのフルアクセスとS3のフルアクセスが許されている状態です．
＊すでにlambdaファンクションがあって，そのファンクションをzipファイルの内容で更新するイメージです．

```
aws s3 cp zipファイル名.zip s3://バケット名/バケット以下のパス/zipファイル名.zip
aws lambda update-function-code --function-name lambdaファンクション名 --s3-bucket バケット名 --s3-key バケット以下のパス/zipファイル名.zip --region リージョン名
```

一回S3にアップロードしなくてもいいよ！って場合はこちら．

```
aws lambda update-function-code --function-name lambdaファンクション名 --zip-file fileb://zipファイル名.zip --region リージョン名
```

aws cli使わなくても，jenkinsにプラグインがあるのでやり方はいろいろありそうです．
(jenkinsのバージョンが古くてjenkinsのプラグインはためせなかった...)
[Summary] what is the difference between .cc and .cpp??

Some guy said that it doesn't matter when we compile it, any of them will be recognised as C++ file.
But thing is we should make a rule for it when we work on certain scale of project.
So I found nice answer to my Q here on Stackoverflow.

Link: https://stackoverflow.com/questions/1545080/c-code-file-extension-cc-vs-cpp
>GNU GCC recognises all of the following as C++ files, and will use C++ compilation regardless of whether you invoke it through gcc or g++: .C, .cc, .cpp, .CPP, .c++, .cp, or .cxx.
Note the .C - case matters in GCC, .c is a C file whereas .C is a C++ file (if you let the compiler decide what it is compiling that is).
GCC also supports other suffixes to indicate special handling, for example a .ii file will be compiled as C++, but not pre-processed (intended for separately pre-processed code). All the recognised suffixes are detailed at gcc.gnu.org
bower インストール

### nvmインストール
nodeを管理するnvmをインストールする

```
git clone git://github.com/creationix/nvm.git ~/.nvm
```

パスを通す

```
cd ~
vim .bash_profile

下記を追加
if [[ -s /home/{ユーザディレクトリ}/.nvm/nvm.sh ]] ; then source /home/{ユーザディレクトリ}/.nvm/nvm.sh ; fi

source .bash_profile
nvm --version
```

versionが表示されればOK

### nodeインストール

```
nvm install v9.10.0
node- v
```
versionが表示されればOK

### bower インストール

```
npm install -g bower
bower -v
```

versionが表示されればOK

### bower 設定
bower.jsonを作成する

```
bower init
```

これで設定は完了

試しにjqueryをインストールする。

```
bower install jquery --save
```

**bower_components** 配下にインストールされる。
webrootにコピーが必要。

```
cp bower_components/jquery/dist/* webroot/js
```


また bower install すると bower.jsonに設定に従いインストールされるので
bower_components はgit管理から外しておく。

```
vim .gitignore

# bower
bower_components/*
```
console.log()をショートカットコマンドで！！　visual studio code

以下でctrl+gでcosole.logを出せます．
デバッグする際に便利です．

```
{
  "key": "ctrl+g",
  "command": "editor.action.insertSnippet",
  "when": "editorTextFocus",
  "args": {
    "snippet": "console.log($1)$0;"
  }
}
```
Expressを用いた簡単なAPIの作り方　まとめ

#概要
Expressを用いたNode.jsサーバにより、簡単なAPIを作る方法をまとめたいと思います。
おそらく、Expressだけで動作するアプリを作る人はいないかと思いますので、それぞれ自分の環境にライブラリを入れていただく形になるかと思います。
#使用例

#Node.jsとは
Node.js
https://nodejs.org/ja/
Node.js® は、Chrome の V8 JavaScript エンジン で動作する JavaScript 環境です。
Node.js は、軽量で効率的に動作する非同期型のイベント駆動モデルを採用しています。
Node.js のパッケージ管理マネージャである npm は、世界で最も大きなオープンソースのライブラリエコシステムです。
#Expressとは
Express.js
http://expressjs.com/ja/
Express は、Web アプリケーションとモバイル・アプリケーション向けの一連の堅固な機能を提供する最小限で柔軟な Node.js Web アプリケーション・フレームワークです。
#手順
任意のディレクトリを作りましょう。
ここではexpress-node-exampleとします。
`$ mkdir express-node-example`
ディレクトリへ移動しましょう。
`$ cd express-node-example`
node.jsを用いるためにnpmをinitします。
`$ npm init`
Expressをインストールします。
`$ npm install express --save`

#プログラムを記述
メインで走らせるプログラムと、それぞれのURLで実行するプログラムを別々にしたほうがいいと思います。
ここでは、express-example.jsにAPIのルーティングを、express-exports.jsに実行内容を記述していきたいと思います。

```javascript:express-example.js
//expressを使用するのでその設定
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
//処理を記述した外部ファイルを参照
var export_func = require("./express-exports");

// urlencodedとjsonは別々に初期化
app.use(bodyParser.urlencoded({
  extended: true
}));
app.use(bodyParser.json());
//listenします。カッコ内の数字を変更することで解放するポート番号を変更できます。
app.listen(3000);
//確認のためコンソールに出力します。
console.log('Server is online.');
//app.getでGETすることができます。最初の引数を変更することでURLが変更できます。二つ目が実行内容です。
app.get('/get-example', function(req, res) {
  export_func.get_example();
})
//app.getでPOSTすることができます。最初の引数を変更することでURLが変更できます。二つ目が実行内容です。
app.post('/post-example', function(req, res) {
  export_func.post_example(req.id, req.name);
})

```
```javascript:express-exports.js
//出力用のjsonを作成します。
var json_example = [
      {
           "id": "1",
           "name": "example_json_1",
       },{
           "id": "2",
           "name": "example_json_2"
       }
   ]
//GETの例です。jsonの中身を出力します。
exports.get_example=function(res, req, next){
   res.json(json_example);
}
//POSTの例です。jsonにデータを追加することができます。
exports.post_example = function(id, name) {
   json_example = [
     {
          "id": id,
          "name": name
      }
   ]
}

```
# プログラムを実行
`$ node stripe-express.js`
でnode.jsサーバを立ち上げます。
別のコンソールにおいて下記のコマンドを実行します。
### GET
`$ curl -X GET http://localhost:3000/get-example'`
### POST
`$ curl -X POST http://localhost:3000/post-example -H "Accept: application/json" -H "Content-type: application/json" -d '{ "id" :"3" "name":"example_json3"}'`
`'{ "id" :"3" "name":"example_json3"}'`という部分を変更することで。POSTする内容を変更することができます。
開発環境でブラウザからルート定義を確認する方法

個人的に非常に便利だと思ったのでメモします。
RailsでWebアプリを開発するとき、初心者の僕はパスを書くためにルート定義やURLヘルパーを確認することが多いです。
今まではターミナルで
```rails routes```
で調べていました。
しかしルート定義が多くなったりすると、わざわざ確認の時だけターミナル大きくしたり、表示してから自力で探すまで時間かかったりします。
そこで、railsの本を読んでみると、ルート定義をブラウザで確認する方法が書かれていました！

##ブラウザでのルート定義確認方法
方法はローカルでサーバ起動の状態で
http://localhost:3000/rails/info/routes
にアクセスします。
するとルーティングがブラウザで確認できます！

表示内容はターミナルと同じく、左から
-URLヘルパー
-HTTPメソッド
-URLパターン（Path)
-コントローラーアクション
となっています。

##ここが便利
まず表示がとても速いです(待ち時間ほぼ0)
またURLパターン(Path)の下に検索フォームがあります。
それを使うと、パターンで検索ができるのです！
例えばフォームに"sing_out"と入れると、URLパターンにsign_outが含まれるものが上に表示されます。なので定義が多くなってきて、特定の文字が含まれるルートだけ確認したい、ヘルパーを確認したいという時なんかは非常に便利！

個人的にはこっちを使っていきたいです。

###参考
山田祥寛,「Ruby on Rails5 アプリケーションプログラミング」
Qiita > syntax-highlighting > bashとshell-sessionの違い


## 比較１

### shell-session

```shell-session
$ ls -lrt
$ history
 2052  cd 170722_learn_realm_imagm/
 2053  ls
 2054  python3 learn_mr_mi_170819.py 
```

### bash

```bash
$ ls -lrt
$ history
 2052  cd 170722_learn_realm_imagm/
 2053  ls
 2054  python3 learn_mr_mi_170819.py 
```

### どちらを使うか?

プレビュー画面では下図のように違いが分かりやすい。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/bce69531-af71-cc05-eb5c-54be54f056c1.png)

記事になった時点で見やすさが低下しているように思われる。

- コマンドの色がなくなる
- 実行結果の薄色表示がなくなる (shell-session)
- オプションに色がつく
    - `-lrt`に目がもってかれる

読者の読みやすい書き方：未調査


## 比較2

```bash:keep_env_180106_exec
#!/usr/bin/env bash

addacfg="-grid 32 -eq_rad 4.24478229"

echo $addacfg
```

上記を実行した場合。

```shell-session:shell-session
$ bash -x keep_env_180106_exec 
+ addacfg='-grid 32 -eq_rad 4.24478229'
+ echo -grid 32 -eq_rad 4.24478229
-grid 32 -eq_rad 4.24478229
```

```bash:bash
$ bash -x keep_env_180106_exec 
+ addacfg='-grid 32 -eq_rad 4.24478229'
+ echo -grid 32 -eq_rad 4.24478229
-grid 32 -eq_rad 4.24478229
```

```txt:txt
$ bash -x keep_env_180106_exec 
+ addacfg='-grid 32 -eq_rad 4.24478229'
+ echo -grid 32 -eq_rad 4.24478229
-grid 32 -eq_rad 4.24478229
```
Emacs: buffer-menu-direct-jump

# ショートカット機能(ジャンプ機能)
[2月に公開した buffer-menu-color.el](https://qiita.com/s-fubuki/items/d2d2d831ef336a247d02) ですが、初回起動時の最初だけうまくトグルせず R(R), R(R)... と連続してしまうバグが見つかったので直しました。
ちなみに今では `S` でキーボードからもソートができるようですね。

それだけでは何なので、ショートカット機能も追加しておきました。
行頭(C のカラム)にジャンプ用の1文字のラベルが表示されそのキーでバッファが開けます。

![buffer-menu-direct-jump-ss.png](https://qiita-image-store.s3.amazonaws.com/0/239081/f8faeee8-9b9a-356e-6d17-4e46145e4978.png)

自分の場合 Buffer 選択には通常 ido を使い、buffer-menu を使うのはバッファの整理をするときなので、移動で使う場面はあまりないのですが、メニューを開いているときはそこからバッファを開くこともあるので、そんなときカーソル移動が面倒な場合が多々あるのでそれなりに使えます。

# ダウンロード
[ここからダウンロード](https://gist.github.com/s-fubuki/551f1ba58dc4bd202665a19d588ca40e)し、
`load-path` の通ったディレクトリに置き、 `init.el` 等に以下の一文を追加します。

```emacs-lisp:sample
(require 'buffer-menu-color)
```

# 使い方
buffer list が表示されているとき `j` を押すと行頭にズラっと青反転した文字が出るので、開きたいバッファの文字キーを押します。

文字が設定されていなかったり(後述)、画面に表われない文字を押すとこのモードから抜けます。
メニューが画面内に表示しきれていない場合は `SPACE` や `BS` で画面がスクロールします。

# 設定できる変数

## buffer-menu-direct-jump-table 
ショートカットに使うキーが1文字列としてまとめてセットされています。
ここで設定した文字数よりバッファの数が多いと溢れた部分には対応しません。
大文字小文字は区別されます。

## buffer-menu-direct-jump-face
face が指定できます。

## buffer-menu-direct-jump-function
実行する関数の設定です。ラベル行に移動してから実行される関数なので、`'ignore` にしておくとカソール移動のみにできます。

## buffer-menu-direct-jump-scroll-keys
スクロールするキーが設定されています。

# 動作確認している Emacs のバージョン
> GNU Emacs 25.3.1 (i686-w64-mingw32)
>  of 2017-09-18"
Javaの新しいリリースモデルとサポートポリシーの変化

# Javaの新しいリリースモデルとサポートポリシーの変化
*この記事は2018年3月30日時点で確認した情報を基に作成しております。*

2017年9月に **Java9** がリリースされ、2018年3月に **Java10** がリリースされ、2018年9月には **Java11** がリリースされる。
Java9以降は、毎年3月と9月の年2回メジャーバージョンアップを行うようなリリースモデルで運用されていくとのこと。  
また、1月，4月，7月，10月の年4回、バグフィクスやセキュリティ対策に対応したマイナーバージョンが提供される。
参考記事：http://www.oracle.com/technetwork/jp/java/eol-135779-ja.html
**LTS:Long Term Support**

## 無償ダウンロードのJDKについて

一般に公開され、無償でダウンロードが可能だったOracleJDKだが、Java10を最後に、Java11からは有償契約しないとサポートを受けられない。
*※「サポートを受けられない」という表現は、現状分かっている範囲だと、セキュリティ関連の脆弱性が発見された場合に公開されてきたパッチが、有償契約している利用者にのみ提供されるようになる。というもの。*

## OracleJavaのバージョンとそのバージョンのサポート終了時期など

* OracleJava 7
 * 2015年4月に無償サポート終了
* OracleJava 8
 * 2019年1月に無償サポート終了
* OracleJava 9
 * 2017年9月にリリースされた。
 * 2018年3月に無償サポート終了
* OracleJava 10
 * 2018年3月にリリースを予定。
 * 2018年9月に無償サポート終了
* OracleJava 11
 * 2018年9月にリリース予定。
 * 無償版はなし！！
 * 有償サポートとしてはPremierSupport：2023年9月　ExtendedSupport：2026年9月

## OpenJDKならどうだろう

無償提供される「OpenJDK」であれば、費用が発生せずに利用できるのではないか？という観点だと。。。

* OpenJDKは6カ月ごとにメジャーバージョンアップされ、バージョンアップの度にその時点で旧バージョンはサポート終了となる。
* 商用ライセンスのOracle JDKには、無償版にはないJavaのプロファイラのFlight RecorderやMission Controlといったツールが提供おり、今まではOracleJDKとOpenJDKに差があったが、これらの差が無くなるように、OpenJDK側にも機能を含めるよう進行中とのこと。
* RedHatEnterpriseLinuxの利用ユーザについては、そのOSに含まれるOpenJDK8についてのみ、2020年10月までサポートするとのこと。<br>
※ただし、それ以降のOpenJDKについて、RedHat社の見解は出ておらず、サポートされない見込みが高い。

なので、上記のことを踏まえると、無償利用を前提にJavaを使い続ける場合、次のようなことを検討する必要がある？

* セキュリティパッチが適用されないOpenJDKをバージョンアップせずに使い続ける。  
たまに最新版にバージョンアップしてその都度費用が発生する。
* セキュリティは強化したいから、OpenJDKを使い続けるために、半年に1回バージョンアップ対応を実施する。

こんなこと続けられるのだろうか。。。

## 有償サポートの価格

Javaの有償サポートには以下3つが存在
* Java SE Advanced Desktop
* Java SE Advanced
* Java SE Suite

サーバーサイドの利用の場合、一般的には「Java SE Advanced」が当てはまる。（単にSuiteが高いのでAdvancedかなと）
Java SE Advancedの価格は次の通り。

* Processor License
 * 60万円
 * サーバーのプロセッサ数に比例したライセンス。<br>一般的に使用ユーザー数が多い場合に有利です。
 * 搭載されているプロセッサ数で算出
 * **マルチコアプロセッサの場合は製品によりコア係数の適用が必要**
 * ProcessorLicense以外に「Named User Plus(NUP)ライセンス」というのがあり、アクセスユーザ数の総数に対して掛かるライセンス形態もある。
* Software Update License & Support
 * 13万2千円
 * Premier Supportを受けるために必要となる年間のライセンス費用。<br>つまり、毎年必要。

参考：https://www.oracle.com/assets/e-pl101005-101005a-n-176288-ja.pdf
参考：http://www.oracle.com/technetwork/jp/ondemand/database/db-new/oracle-license-abc-2704758-ja.pdf
参考：https://www.oracle.com/assets/software-technical-support-policies-079764-ja.pdf
SDカードから消失したファイルをサルベージした話

#背景
スマホの調子が悪くなったので電源を切って入れ直したら、SDカードの、写真を入れていたフォルダだけがきれいに消失した。
サルベージしたら、だいたい戻ってきた気がするので、備忘録として、また、同じ憂き目に遭った人のお役に立てればと、文章に残すことにした。

なお、筆者の環境は、Arch Linuxを使用している。
(たぶん、使ったソフト自体はWindowsやMacでもあると思う)

#免責事項
- 本記事によって生じたいかなる損害も筆者は保証できません。どうしても必要なデータが消失した場合は専門家などに相談されることを強くお勧めします。(筆者はデータ復旧の専門家を利用したことがないため、ご紹介することはできません。ご了承下さい)
- 異常が発生しているディスクやSDカード等に対し不用意な操作をすると、事態が悪化する可能性があります。本記事で紹介している操作を行うかどうかは、ご自身の自己責任でご判断ください。
- 本記事はコンピュータオタク向けです。また、コメント欄などで助けを求められても、力になれない可能性が高いです。ご了承下さい。

# TL;DR
ddrescueとphotorec最高

# ディスクをダンプする
壊れている可能性があるカードをいつまでも触り続けるのは怖いので、まずは、カードの中身をファイルに書き出しました。
書き出す先(通常は、PCのSSDなりHDDなりになるかな、と思います。場合によっては他の同容量のSDカードだったりするかもしれません)には、カードまるまるのディスク容量が必要です。
(8GBのカードなら、たとえ1GBしか使っていなくても8GB全部の空き容量が必要になります)

SDカードを差して、マウントはしない状態にしました。

最初は`dd`コマンドでバックアップしていたのですが、途中でI/Oエラーが起きました。
何度か試しましたが、別のところでI/Oエラーが起きたり、同じ箇所でI/Oエラーが起きて同じファイルサイズになっても、sha1を取ると違ったりしました。

`dd`はしんどそうなので別の方法を探すと、`ddrescue`コマンドを知りました。
https://superspeed-fall.com/entry/2015/03/26/224512

ミスって書き換えちゃったときのために、取り出したイメージを念の為コピーとっておきました。

# ファイルを救出する
もうSDカードは抜いちゃって大丈夫です。この後の操作は、取り出したイメージに対してやっています。
イメージ書き換えちゃったら、コピーとっといたやつを上書きしなおしてます。

`fsck.vfat` では、出てきませんでした。
調べたら `testdisk` と `photorec` を知りました。
`testdisk` で消したファイルが復活できるっぽいですが、残念ながら、目的のフォルダは見つかりませんでした。

次に `photorec` を試しました。Arch Linuxでは、testdiskといっしょに入ってきました。
https://pctrouble.net/software/photorec.html
どうやら
https://www.cgsecurity.org/wiki/PhotoRec
を見る限り、JPEGのヘッダっぽいものを片っ端から探して復旧するみたいです。

PhotoRecを使うと、消失したファイルが復旧できました。
(全部できたかどうかは、元々の数を把握していないので分からないですが、概ねできている印象です)

ファイル名は無茶苦茶になりますが、どうやらファイルのタイムスタンプはEXIF情報に合わせてくれたっぽいです。
ただ、たまにEXIFの日付が変なファイルもありました。

#ファイル名をタイムスタンプに合わせる

ファイル名があまりに分かりにくく、ソートとかもしづらいので、ファイル名をタイムスタンプにリネームするスクリプトを書きました。

```py3:rename.py
import datetime
import os

def pathsplit(path):
    dirname = os.path.dirname(path)
    basename = os.path.basename(path)
    root, ext = os.path.splitext(basename)
    return dirname, root, ext

def pathjoin(dirname, root, ext):
    s = os.path.join(dirname, root)
    if root and ext:
        s += ext
    return s

def get_newpath(current_path):
    stat = os.stat(current_path)
    d, r, e = pathsplit(current_path)
    timestr = datetime.datetime.fromtimestamp(stat.st_mtime).strftime('%F_%H%M%S')
    suffix = ''
    n = 1
    while 1:
        newpath = pathjoin(d, timestr + suffix, e)
        if os.path.exists(newpath):
            suffix = '_%03d' % (n,)
            n += 1
        else:
            return newpath

for p in os.listdir():
    os.rename(p, get_newpath(p))
```

#まとめ
復活できてよかった。ddrescueとphotorec最高。
Ubuntu > apt-get dist-upgradeの一次情報? > man apt-get > DESCRIPTION

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
```

### 関連

- [Ubuntu > Ubuntu 16.04.3 LTSをUbuntu 16.04.4 LTSにアップデートする | TensorFlowの環境はそのままに](https://qiita.com/7of9/items/405fe2998d680bb1ef54)


### dist-upgradeの一次情報

Ubuntuを16.04.3 LTSから16.04.4 LTSにアップデートする時に気になったdist-upgrade。

これは何か?
一次情報はどこか?

https://askubuntu.com/questions/215267/will-apt-get-dist-upgrade-upgrade-my-system-to-newer-version

man apt-getで説明があるとのこと。

英語のmanを見てみた。


```txt
$ LANG=C man apt-get
...
DESCRIPTION
...
       update
           update is used to ...
       upgrade
           upgrade is used to ...
       dist-upgrade
           dist-upgrade in addition to performing the function of upgrade, also ...
```


それぞれの説明がある。


### 謝辞

@shiracamus さんにsyntax-highlightingの違い(bash, shell-shession, text)を教えていただきました。

情報感謝です。
Mac VisualStudio Codeを使う理由

# なぜVSCodeなのか
私は、Atomを使ったことがあります。
Sublimeも評価版を触りました。
あとは、UbuntuのGeditを拡張してターミナルを出したりしていました。
結論として、VSCodeにたどり着きました。

今から個人的に感じたことを書きます。

# 結論から
## VSCodeのメリット
- 普通にIDEレベルのデバッグ環境を整えられる
- ターミナルの起動やGITやMarkdownなどプリインストールだけで非常に使いやすい(Atomなどで複数インストールした後の状態がデフォルト)
- 起動が速い！(Atomより軽い！,Sblimeの方が速いかも...)
- 無料！(大事)
- ターミナルの起動は、本当に速いし(気持ちがいい)
- ターミナルの色やフォントをエディタに合わせてくれる(気持ちがいい)
- Keybind変え方が分かりやすく便利(大事)

## VSCodeのデメリット
- カレントディレクトリに設定が必要(面倒)
- 設定をミスるとデバッグがうまく動かない(C言語は難しい)

# 他のテキストエディタじゃない理由

## Atomじゃない理由
Atomの欠点は、起動が遅いところとインストールできるものは豊富でも安定していなかったりします。
一つの例としてAtom上でターミナルを起動すると
フォントなどが若干変な感じになる。しかも起動は遅い。
など

## SublimeTextじゃない理由
お金がかかります。
最近は、無料で多くのことができるので
あえてお金を払う気にはなりません。

## Geditじゃない理由
起動は、結構早いです。メモ帳速度くらいです。
ただ、Ubuntuしか使いにくい点(Macでインストールしたが苦労したし、依存関係のパッケージめちゃ多かった。)
WindowsでもMacでもLinuxでも使えるものを選ぶべき
Mac VisualStudio Code コマンド起動！！

# VisualStudio CodeをMacでコマンド起動するやり方

## PATHを通す
.bash_profileなどの一番下に追記しておく

```:bash_profile
export PATH=$PATH:/Applications/Visual\ Studio\ Code.app/Contents/Resources/app/bin/
```
これで「code .」使えます。
UIKeyboardType 一覧


# はじめに
UIKeyboardの種類一覧をまとめました。(2018/03/31 現在)

## UIKeyboard一覧
![IMG_0230.jpg](https://qiita-image-store.s3.amazonaws.com/0/235001/d2261ecb-2e85-07fd-d59b-085a95d6152d.jpeg)![IMG_0231.jpg](https://qiita-image-store.s3.amazonaws.com/0/235001/34a79c5e-3798-326e-68fa-05eb82813ba6.jpeg)![IMG_0232.jpg](https://qiita-image-store.s3.amazonaws.com/0/235001/ac4ff97f-199c-49e9-d118-764a6b3985eb.jpeg)![IMG_0235.jpg](https://qiita-image-store.s3.amazonaws.com/0/235001/4e7d52c4-9a77-9bee-94fc-0e897271333e.jpeg)![IMG_0236.jpg](https://qiita-image-store.s3.amazonaws.com/0/235001/951aa450-0fff-165e-5719-23da9d736a43.jpeg)![IMG_0237.jpg](https://qiita-image-store.s3.amazonaws.com/0/235001/65127621-16d2-22e1-7bbb-22935530f764.jpeg)
![IMG_0238.jpg](https://qiita-image-store.s3.amazonaws.com/0/235001/434392a4-07f2-86bb-a07c-e148ccbb721e.jpeg)![IMG_0239.jpg](https://qiita-image-store.s3.amazonaws.com/0/235001/b354cdda-7012-6381-5300-d0c4d8a9f693.jpeg)![IMG_0240.jpg](https://qiita-image-store.s3.amazonaws.com/0/235001/d496bcbe-8efc-b1bd-83df-e82123f1a4e1.jpeg)![IMG_0241.jpg](https://qiita-image-store.s3.amazonaws.com/0/235001/b35072bb-94ba-fa4c-63f1-0f956137764f.jpeg)![IMG_0242.jpg](https://qiita-image-store.s3.amazonaws.com/0/235001/5c589c6b-011f-18bb-b78c-9ab6cf602a9f.jpeg)
NotSupportedException は設計に問題あり？　そして Entity Framework の問題点

# はじめに

あまり否定的なことは書きたくないのだが、この記事を読まれる方の問題提起となればと思ってアンチ パターンと思えるこのことについて、僕の考えを書く。まずは言語とかフレームワークに依存しない、設計全般の話題について。

# 例外というものについて

まず、プログラミングで言う「例外（Exception）」は、当然ない方がよい。プログラミングの人的ミスはバグと言われ、私たちが十全ではない以上、どこにでも潜んでいるものである。このバグを減らすために昔から様々な工夫がされてきた。その一つが静的言語というアプローチだ。C# などの静的言語の優れたところは、プログラムの実行時ではなく、コード開発中にプログラムを解析させることによって、その時点でバグ（間違い）が発見できることだ。そう、コンパイルができない、つまりプログラム自体が作成できないのだ。

「例外（Exception）」というのは、実行時に起こりうる、言わば障害である。月日が想定されるところに 13 月とか 32 日とかが入る余地があると、それは障害となるため、「例外」を発生させるような仕組みになっている。例外が想定されるところは、その例外を捕獲（catch）するように組んでおき、例外の場合の対処を書けば、障害を克服できる。しかし、本当は例外自体が起こらない方がよいのである。たとえば、先ほどの例ならば、あらかじめ月には 1～12 しか入らない、日付には 1～31 しか入らない部品など（組み込み型の DateTime など）を使えば、先ほどの月日の範囲についての例外のことは考えなくてよくなる。

# なぜ NotSuppotedException を設計に問題ありというのか？

さて、題名に「NotSupportedException は設計に問題あり？」と書いた。問題ありと言おう。なぜか？　この例外の意味は、「実行時に、サポートされていない機能が使われていてダメ！」ということだ。サポートされていない機能ならば、本来なら実行時ではなく、開発時にそれが使えないようにしておくのが良い設計だからだ。そうすれば実行時になってダメです、なんてことにはならない。

なのに、だ。NotSuppotedException が吐かれるということはつまり、開発時にはいかにも実行できそうな顔をしておいて、実行時にエラーとなる、というバグを潜在させるアプローチがこの例外なのだ。これは、静的言語の利点を無駄にしてしまう。

# Entity Framework の欠点

さて、ここまでが設計デザインについて、言いたかったことだ。ここからは、よくないと思われる一例を挙げる。

Entity Framework というモノがある。これは、データベースなどを LINQ という統一された手法で、操作する技術だ。LINQ は表面的には SQL のように割と宣言的に、同一構造の複数データを相手に、こういうデータを取得したいという風に書ける。メモリー内に格納されているデータについて、LINQ は素晴らしい機能を提供している。しかし、問題は、表面的に同じ LINQ の書き方をしながら、データベースにアクセスする Entity Framework などである。Entity Framework が超カシコクて、メモリーにアクセスするのと同様に LINQ でスイスイと書けるならばよい。しかし問題は深刻だ。複雑な LINQ でも確かにスイスイと書ける。コンパイルは通り、プログラムができあがる。そしてそれを実行すると…… NotSupportedException が出て止まってしまうのだ。

何が起こったのか？　つまり、Entity Framework は、そこまで賢くなく、機能に制限が大あり！　ということなのだ。使える機能に制限があるならば、制限した機能を使って書くことができないようにデザインするべきなのだ。ここに落とし穴がある。どんな複雑な LINQ を書いてもスイスイと超賢く翻訳してくれるのなら問題はない。

メモリーについての LINQ、つまり LINQ to Object は、とてもよくできている。IEnumerable(T) という型（同一構造の複数データ）を相手にしている。Entity Framework が提供する LINQ は、LINQ to Entities と言って、IQueryable(T) を相手にしているのだ。実際には同一構造の複数データに直接アクセスするのではなく、それを取得するエンジンに対する命令を生成して投げているところが違う。つまり、LINQ を SQL などの命令に翻訳しているのだ。そして、これを使う場合、その翻訳がうまくできているのか、効率よく翻訳できているかをチェックしなければならないのだ。そのチェックは……　実行しなければチェックできないのだ。

だから、データ ベースについての単純ではない問い合わせについては Entity Framework を使用するのは、私はあまりお勧めしない。

# では、どうすればよいか？

では、SQL 文字列を埋め込むのか？　いや、それなら Entity Framework の方がずっとマシである。文字列でしかない SQL など、実行時しか解析されない。

オススメの方法はこれである。→ 複雑な操作はユーザー定義関数（ストアド ファンクション）やストアド プロシージャーなどをデータベース上に SQL で作成しておき、それを Entity Framework で呼び出す方法である。この方法であれば、SQL は開発時に解析されるし、無理して複雑な LINQ を書いて怒られたり、チェックしたりする必要もない。

Entity Framework すべてを否定しているわけではない。要はバグを生みにくいように工夫して使えばよいのだ。

また、ライブラリーを作成するときには、なるべく実行時の例外を減らす工夫をしたいものである。
socatで仮想シリアルポートを作る

ソケットをいじくり回すのに便利なsocatですが、
仮想シリアルポートの操作にもとっても便利でした。

元ネタ：
create virtual serial port with socat in linux
https://www.youtube.com/watch?v=iFmD-CeB96A

なお、この記事のコードは、
Windows10のVirtualbox上のArch Linuxと、Python3.6.4でテストを行っています。

## 仮想シリアルポート作成
```shell
$ socat -d -d pty,raw,echo=0 pty,raw,echo=0
2018/03/31 01:36:38 socat[8626] N PTY is /dev/pts/14
2018/03/31 01:36:38 socat[8626] N PTY is /dev/pts/15
2018/03/31 01:36:38 socat[8626] N starting data transfer loop with FDs [5,5] and [7,7]
```
これで、`/dev/pts/14`と`/dev/pts/15`の2つのシリアルポートが内部的に繋がっていることになります。

テストのために、他に2つのシェルを開き、それぞれで以下のコマンドを実行します。

```shell
$ cat < /dev/pts/14
```
```shell
$ echo "Pseudo serial port test" > /dev/pts/15
```

catしているほうのシェルで、echoした文字列が確認出来るかと思います。
`14`と`15`という数字は、上でsocatを実行したときのログを参照し適宜変更する必要があります。

## シリアルポートにアクセスするプログラムのテストに

作成した仮想シリアルポートは、実シリアルポートと同様の方法でアクセスが可能です。
ここでは、PythonのPyserialとの接続をテストしてみます。

まずはPyserialの送信を。

```python:入力
import serial
port_name = '/dev/pts/15'

sp = serial.Serial(port_name, 9600)

message = 'Test message from pyserial\n'

sp.write(message.encode('ascii'))
sp.close()
```
```shell:出力
$ cat < /dev/pts/14
Test message from pyserial
```

次はPyserialの受信を。

```shell:入力
$ python -c "print('Test message from shell')" > /dev/pts14
```
```python:出力
import serial

port_name = '/dev/pts/15'

sp = serial.Serial(port_name, 9600)

line = sp.readline()
print(line)
sp.close()
```

こんな感じで、各種シリアルポートの送受信テストに気軽に使えるかと思います。
Mac OSにLaravelローカル開発環境構築

## 概要

Macのローカル環境でLaravelの開発環境を構築する際に、詰まったのでメモを残しておく

## 環境

|名前|バージョン|
|:--:|:--:|
|php|7.1.0|
|Laravel|5.5|


## 手順
※phpのinstallは[phpbrewでphpをインストールするときに詰まったこと](https://qiita.com/da-sugi/items/60b3c7a6ba1634f3341c)を参考にして下さい。

### composerインストール

```
$ brew install homebrew/php/composer
```

#### :new:**<font color="red">2018/7/20更新</font>**

```
Error: homebrew/php was deprecated. This tap is now empty as all its formulae were migrated.
```

上記のようなエラーが出る人は下記コマンドを実行してみてください。

```
$ brew install homebrew/core/composer
```

##### **補足**

`homebrew/php` => `homebrew/core`に移行されたみたいです。

```
$ brew search composer
==> Formulae
composer ✔

==> Casks
composercat

If you meant "composer" specifically:
It was migrated from homebrew/php to homebrew/core.
```

### Laravelのinstall

Composerを使用して、Laravelのインストーラーをダウンロード

```
$ composer global require "laravel/installer"
```

### パスを通す

下記設定を`~/.bashrc`にコピペする。

```
export PATH="$PATH:$HOME/.composer/vendor/bin"
```

一度読み込む

```
$ source ~/.bashrc
```

### プロジェクト作成

laravel newコマンドで、プロジェクトを作成する。

```
$ laravel new {プロジェクト名}
```

### ローカル開発サーバ起動

```
$ php artisan serve
```

#### <font color="red">エラー発生!!</font>

上記手順で進めて行くと下記のようなエラーが出ていた。

```php
PHP Warning:  require({project_name}/vendor/autoload.php): failed to open stream: No such file or directory in {project_name}/artisan on line 18
```

内容を見るとプロジェクト内に`vendor/`というディレクトリが作成されていないってことが問題みたい。

↓確かになにも出力されなかった。。。↓

```
$ ls | grep vendor
```

## 対策
### laravelコマンドじゃなくてcomposerでプロジェクトを作成する

[Laravelのartisanコマンドまとめ](https://qiita.com/LowSE01/items/98010f17c1721696c288)を見るとlaravelコマンドがあまり良くないと記載されている....->理由は追えてません...orz

ということでcomposerコマンドでプロジェクトを作成する。

```
$ composer create-project --prefer-dist laravel/laravel {プロジェクト名}
```

`vendor/`が作成されて、ローカル開発サーバも無事起動できた🎉

##### vendor/確認

```
$ ls | grep vendor
vendor
```

##### ローカル開発サーバ起動

```
$ php artisan serve
Laravel development server started: <http://127.0.0.1:8000>
```


### `http://127.0.0.1:8000`にアクセスしてLaravelページが表示された

<img width="1440" alt="スクリーンショット 2018-03-31 2.14.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/133737/bb6903da-f117-bee5-9b01-1f4acfe3ce17.png">

### **おわり**
プログラマではないけどオブジェクト指向についてのメモ

※記載内容はメモとして作成しているため、修正が必要な部分があるかもしれません。


####**オブジェクト指向とは**
プログラマではありませんが、このオブジェクト指向について思ったことをメモします。

オブジェクト指向というと何をイメージしますか。
私はプログラマではないのであまり意識しませんでしたが、とある本にＣ言語でストラクト
と呼ぶと記述されていました。

ストラクトとは構造体です。簡単に言うと、まとめられるものはまとめて、ブロック化する。
使えるブロックは再利用する。

インフラエンジニなので、コンフィグファイルに接する機会があります。
よくよく見ると、コンフィグファイル自体がオブジェクト指向となっているんですね。
変数指定であったり、オブジェクト指定（まとめられたもの）であったり、両方が混じって
いたりと様々ですが。。。。。。

ＬＵＮＵＸをプログラムとして観察すると構造化されています。

あまり意識しない人が多いかもしれませんが、大量のコードの集まりなので普通はまとめら
れるものはまとめますよね。
このことをＣ言語では構造化というそうです。オブジェクト指向のことですね。

また、一人の人に理解できるコードの限界は１万行と言われているそうです。
人の脳の限界にに合わせて、ブロック化することが効率的ということですね。

なんでもそうですが、まとめて整理する。
これはコードも同じということです。