OmniAICreator/Qiita-1.07M huggingface dataset:
MQL on Vim ( VimでMQLをかいてみる ）

# Summary

MQLという言語をVimで書いて実行する環境を作ってみましたっ

![foo.gif](https://qiita-image-store.s3.amazonaws.com/0/149269/7904d9bf-51c2-3922-50ab-9792e086ca4a.gif)


## Thanks

```text
// twitter
@haxe
@matthn
@raa0121
```

## Environment

```shell
$ sw_vers 
ProductName:    Mac OS X
ProductVersion: 10.13.3
BuildVersion:   17D47

$ wine --version
wine-3.0

$ mono --version
Mono JIT compiler version 5.4.1.6 (tarball Mon Dec 11 14:59:42 GMT 2017)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
    TLS:           normal
    SIGSEGV:       altstack
    Notification:  kqueue
    Architecture:  amd64
    Disabled:      none
    Misc:          softdebug 
    LLVM:          supported, not enabled.
    GC:            sgen (concurrent by default)


$ wine cmd
Microsoft Windows 10.0.15063 (3.0)

Z:\Users\callmekohei\.config\>
```

## MetaEditorに F5 を送る

こんな感じ（`F#`という言語で書いてます）

```fsharp:abc.fsx
open System.Runtime.InteropServices
open System.Windows.Forms

[<DllImport "user32.dll">]
extern nativeint FindWindow(string className, string windowName)

[<DllImport "user32.dll">]
extern bool SetForegroundWindow(nativeint hwnd)

FindWindow("MetaQuotes::MetaEditor::5.00", null) |> SetForegroundWindow |> ignore
SendKeys.Send "{F5}"
```

## Quickrunの設定と`Bash script`

```vim
 let g:quickrun_config.mql4 = {
        \  'exec': [ '%c %o %s:p:t' ]
        \ ,'command':'bash'
        \ ,'cmdopt' :'$HOME/tmp/quickrunMQL/quickrunMQL.bash'
    \}
```
`^M`は `ctrl V` -> `ctrl M` で入力する

```bash:foo.bash
# ===========================================================================
#  FILE    : foo.bash
#  AUTHOR  : callmekohei <callmekohei at gmail.com>
#  License : MIT license
# ===========================================================================

file=$1
MetaTraderHOME=("$WINEPREFIX/drive_c/Program Files/OANDA - MetaTrader")
MetaEditor=("${MetaTraderHOME[@]}"/metaeditor.exe)
SendsKeyCMD=$(cd $(dirname $0) && pwd)/quickrunMQL

wine "${MetaEditor[@]}" /s /log:foo.log /compile:$file 2>/dev/null
iconv -f utf-16 -t utf-8 foo.log | sed -e "s/^M//g" > bar.log

echo "───── MetaEditor Compiler ─────"
cat bar.log

if cat bar.log | fgrep 'Result 0 error(s), 0 warning(s)' 1>/dev/null ; then

    echo "───── MetaTrader Terminal ─────"
    echo $SendsKeyCMD | wine cmd 1>/dev/null
    echo $SendsKeyCMD | wine cmd 1>/dev/null
    echo $SendsKeyCMD | wine cmd 1>/dev/null
    cat "${MetaTraderHOME[@]}"/MQL4/Logs/$(date +"%Y%m%d").log | tail -4 | sed -e "s/\\^M//g"

fi

rm foo.log
rm bar.log
```

## 課題

とりあえず動く、という程度なのでもっと洗練させたい

```
TODO: 2018/05/29
もうすこしわかりやすく書く！
```
【Vagrant + CentOS 7】のまっさらな状態からLaravel5.5をいれて動かすまでに詰まったことをメモ

ちょっといろいろあって、ローカル環境としてVagrantにまっさらなCentOSをいれてLaravel動かそうとしたんですがいろいろ苦労したのでメモ。

# apacheとPHPインストールしたけどhttpアクセスできない

CentOSにapacheとかPHPとかMySQLをインストールする方法はたくさん公開されているので、それほど困らずにインストールできました。
https://qiita.com/shiromegane/items/b782ce64f5c54fd54a60
こちらが参考になりました。
基本的にはyumで、最新のがほしいときはリポジトリ登録してインストールしていく感じです。

そんなこんなで、Webサーバ側のプログラムを一通りインストールしたのですがそこで問題が発生
`http://IPアドレス/` にアクセスしたけどサイトが開かないというエラーが発生

https://qiita.com/junqiq/items/a19d3ea48b072a1b28d3
こちらのCASE1が当てはまったので
`sudo systemctl restart network.service`
で解決できました。
でも、再起動のたびにエラーになるので、Vagrantfileに

```ruby:Vagrantfile
config.vm.provision "shell", run: "always", inline: "systemctl restart network.service"
```
を書いて解決。

※実は、上記の前に、
`ip addr`
をしても、eth1が出てこないという現象に遭遇。こちらはどうやってもなおらなくて、一度（泣きながら） destroyしてupしなおしたら出てきました。


# composerでエラー
今回は他のところである程度つくりすすめたアプリをcloneする形でインストールしたのですが、ファイルを持ってきて
`composer install`
したんですが、そのままだとエラー。
vendorディレクトリに、`autoload.php`がないというエラーだったので
`composer dump-autoload`
をしてautoload.phpを作成したら動きました。

# node.js　新しいRPMを登録しても古いものがインストールされる

node.jsのインストールのときに、最新版をいれようとしてハマりました
https://qiita.com/robitan/items/a684a81214767c21a560
↑ここの方法で解決

# npm install でエラー
nodeとnpmの最新版インストールはいろいろ情報があるので、問題なくできたのですが、
実際に
`npm install`のときにエラー

https://qiita.com/horikeso/items/39beb56b81b321a03f31
こちらを参考に

`npm install --no-optional`

# npm run dev でエラー　

インストールおわって
`npm run dev`
動かしてみたら、またエラー

結果として、デフォルトのpackage.jsonに加えて
prettier、js-beautify、bootstrap-sassをインストールしたら、動きました。

`npm install prettier`
`npm install js-beautify`
`npm install bootstrap-sass`



# Laravel動かしたらエラー
で、実際に動かしてみたら、またエラー
ログやキャッシュが書き込めない。的なエラーだったので、該当ディレクトリのパーミッションを変更しようとおもって
`chomod`したけど、権限が変わらない・・・

Vagrantfileで指定したパーミッションが優先されるっぽい。

```ruby:Vagrantfile
config.vm.synced_folder ".", "/var/www", mount_options: ['dmode=777','fmode=777']
```
強引だけど解決。

そんなこんなでなんとか動かすことができました。


# 参考にさせていただいた情報
https://qiita.com/junqiq/items/a19d3ea48b072a1b28d3
https://qiita.com/kyophp/items/0110d4307eff747c7092
https://qiita.com/horikeso/items/39beb56b81b321a03f31
https://qiita.com/happy_ryo/items/64fc937a1bdf3ef531a9
https://qiita.com/tbpgr/items/67125ea883409ae5fd51
https://qiita.com/robitan/items/a684a81214767c21a560
配布用 VirtualBox 仮想マシンイメージを作成する

# 概要

一般利用者に配布することを想定した仮想マシンイメージを作成する場合、2つの問題点があります。

* 配布側がパスワードを設定していると、パスワードを変更しないまま使う利用者が多発して、セキュリティ問題を引き起こしやすい。
* 仮想マシンイメージのファイルサイズはきわめて大きいため、サーバに負担をかけやすい。

そのため、本稿では、

* 配布側はパスワードを設定しない。利用者の初回ログイン時にパスワード設定を強制する。
* 仮想マシンイメージのファイルサイズをできるだけ縮小する。

方法を説明します。

なお、ゲスト OS は Debian 系であること、ホスト OS は Linux 系であること、を前提とした記述になっていますので、他の環境に適用する場合には適宜に読み替えて頂くようにお願いします。

# 仮想マシンイメージの作成

## OS のインストール

既存の記事が多数ありますから、どれか適当な記事を参考にして下さい。

* [VirtualBox（Windows10）上に Debian/Jessie をセットアップする（インストール編1）](https://qiita.com/tetsukuz/items/028519c436ff621f80f3)
* [VirtualBox に Ubuntu16.04 をインストール](https://qiita.com/ykawakami/items/4bae371932110b2e25e3)

## VirtualBox Guest Additions のインストール

(1) open-vm-tools パッケージがインストールされている場合は、アンインストール・再起動しておきます。

```shell-session
sudo dpkg --purge remove open-vm-tools
sudo reboot
```

(2) VirtualBox 上で、「デバイス」→「Guest Additions CD イメージを挿入」とメニューを選択して，ゲスト OS から CD イメージが見えるようにしておきます。これで、ゲスト OS 側からは `/media/cdrom0/` 以下にイメージが見えるようになっているはず。

(3) 以下のコマンドを実行。

```shell-session
sudo apt-get update
sudo apt-get install linux-headers-amd64 build-essential
sudo sh /media/cdrom0/VBoxLinuxAdditions.run
```

なお、インストールされている VirtualBox Guest Additions のバージョンは、以下のコマンドで確認できます。

```shell-session
VBoxControl --version
```

# 仮想マシンイメージのファイルサイズを縮小

本稿では、一般利用者のログイン用ユーザを `example` というアカウント名であることにします。必要に応じて、適当なアカウント名に変更して下さい。

(1) ゲスト OS 上で、ログイン用ユーザを `sudo` グループに加えておく。

```shell-session
sudo apt-get install sudo
sudo adduser example sudo
```

(2) ゲスト OS に、空き領域を開放するためのコマンド `zerofree` をインストールしておく。

```shell-session
sudo apt-get install zerofree
```

(3) ゲスト OS の `root` アカウントのパスワードを一時的に設定しておきます。

```shell-session
sudo passwd root
```

(4) ゲスト OS を再起動して、シングルユーザモードに入ります（この時、前段で設定した `root` アカウントのパスワードが必要になります）。その上で、以下のコマンドを実行して、空き領域を開放します。

```shell-session
mount -n -o remount,ro -t ext4 /dev/sda1 /
fsck.ext4 -f /dev/sda1
zerofree -v /dev/sda1
mount -o remount,rw -t ext4 /dev/sda1 /
```

(5) ゲスト OS の `root` アカウントのパスワードを削除し、さらに `root` アカウントをロックします。

```shell-session
passwd -d root
passwd -l root
```

これで、この仮想マシンに `root` アカウントでログインすることはできなくなったはずです。

(6) ゲスト OS のログイン用ユーザ `example` のパスワードを空にして、かつ期限切れに設定します。

```shell-session
passwd -d example
passwd -e example
```

これで、次回に `example` ユーザでログインする時に、自動的にパスワード設定が強制されます。

(7) ゲスト OS 上のコマンドライン履歴など機微情報を削除しておきます。

```shell-session
history -c
```

(8) ゲスト OS を停止します。ステップ(4)からここまでが、シングルユーザモードでの作業になります。

```shell-session
shutdown -h now
```

(8) ホスト側で以下を実行して、ディスクイメージを小さくします。

```shell-session
VBoxManage modifyhd 仮想マシンイメージ名.vdi --compact
```

(9) 配布用にディスクイメージを圧縮します。

```shell-session
7z a -tzip 配布用ファイル名.zip 仮想マシンイメージ名.vdi
```

なお、手元で試した限りでは、zip コマンドはファイルが大きすぎて異常終了するので使えませんでした。
プルリクエストで表示される差分の仕組みを GitHub に問い合わせてみた

## 背景

私の知識不足でもありますが、これまでプルリクエストで表示される差分は、ブランチ間のコミット、ソースコードの"差"である、という間違った認識を持っていました。

先日プルリクエストを作成したときに表示されたコミットとソースコードの差異が、from と to の、どちらにも存在していたことを不思議に思い、 GitHub に問い合わせをしてみました。

英語が苦手なので、回答に対する認識が合っているか不安です...。あと、もし失礼な表現とか送っていればすみません。

## GitHub 問い合わせ
問い合わせフォームは下記URLです。
https://github.com/contact

下記 GitHub からの返事です。

```
Hi there,

Thanks for reaching out! This sounds like expected behavior, as we show the three-dot diff, or the difference between the most recent version of the head branch and the base branch at the time the head branch was created:

https://git-scm.com/docs/git-diff#git-diff-Comparingbranches

It sounds like you'd rather see a two-dot diff, which would show the changes between the most recent versions of each branch. If you'd like, you can merge the base branch back into the head branch. That would be more likely to show you what you're expecting to see.

Hope that helps clear up some of the confusion!

Regards,
*****
@********
GitHub Support


>Hi, GitHub Support.
>
>I wanted to ask difference of Pull-request.
>
>The other day GitHub page showed me differences of code+ and commit, when I created Pull-request (from to master-branch from feature-branch).
>But, master-branch had alredy the commits (same hash) and the codes (same number of lines) .
>Of cource, feature-a-branch also have it too. I thought it's not difference.
>
>Probably I guess it’s happened by construction(order of hash) of git-log.
>Is something wrong? Could you tell me what to do?
>
>I look forward to your response.
>
>Regards,
>Kenji Ichihashi=
```


## プルリクエストの差分
GitHub のプルリクエストはブランチ間の差 ( $git diff develop..feature ) ではなく、
両ブランチの先祖(どちらからも参照できるコミット, 派生したところ?)と HEAD の差分( $git diff develop...feature ) で作られているそうです。

今回は、少し特殊なフローで Git を運用をしているリポジトリだったので、意図しない形の差分が表示されてしまいました。
ブランチ間の純粋な差分を見たい場合は、あらかじめ to のブランチを from のブランチへマージしてからプルリクエストを作成すればいいそうです。


※参考: [git diffコマンドで比較する時のダブルドット(..)とトリプルドット(...)の違いとは？]( https://yakst.com/ja/posts/4116)



## さいごに
問い合わせに対して、GitHub からの返信は1営業日ほどで返ってきて、素晴らしい対応でした。

ただ、問い合わせをすべき内容、すべきでない内容、もしかしたらポリシー的なものがあるかもしれません。
もし、何かご存知のかたいらっしゃいましたら、ご教示いただけると幸いです。

----

### 過去に書いた Git関連の記事 :arrow_double_down: 

[Qiita-何も知らない人がGitとGitHubを独学で知る](http://qiita.com/iKenji/items/367e8344490dd37e14f0)
[Qiita-git checkout できないとき、私はこうしてます。](http://qiita.com/iKenji/items/c03bd6e72f57291da24c)
[Qiita-ブランチ間の差分をコミット単位で知る・見る](https://qiita.com/ikenji/items/fecd39966bbf463da3f4)
[Qiita-git 差分を見る](https://qiita.com/ikenji/items/42248085c4f4b55660d6)
Azure ADユーザのパスワードリセットができないときの対処

Azure Active Directoryユーザのパスワードリセットしようとした際にエラーメッセージが出て少しハマったので、発生事象と対応を残しておきます。

# こんなエラーメッセージが

```
現在のアクセス許可では、このユーザーのパスワードをリセットできません。再試行する前に、自分とユーザーのアクセス許可を確認してください。
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/1666dd66-c9d6-e440-cf36-027923e30f22.png)

# やったこと

リセット対象ADユーザのプロファイルで「サインインのブロック」が「はい」になってました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/59cf0d48-1f20-a30a-1bf8-b42cecbe4275.png)

削除しようとしたユーザの権限周りかなーと思いましたが、サインイン禁止にしているユーザはパスワードリセットできないようですね。

サインインできるように設定したら問題なくリセットできました！
Raspberry Piをいじっているときによく使うコマンド等

## この記事について…

普段はRaspberry Piとは無縁なプログラマだったんですが、斯く斯く然々で色々やってみることになりました。普段はWindowsしかいじらないのでLinuxは超初心者ですが、備忘録を兼ねてよく使うコマンド等を纏めておきます。
尚、2018/05/17現在 Raspbian Stretch Lite 2018-04-18リリースを使用しています。

## コマンド

```sh
# Raspbian固有の設定ツール SSHやSPIの有効化、ホスト名の変更等だいたいできます
$ sudo raspi-condig

# パッケージ操作
# 更新
$ sudo apt update && sudo apt -y upgrade && sudo apt -y autoremove && sudo apt -y autoclean
$ sudo apt -y dist-upgrade
# インストール、削除
$ sudo apt install package_name
$ sudo apt remove package_name
# インストール済み一覧
$ apt list --installed

# SSH鍵の作成
$ ssh-keygen -t rsa -b 4096 -f id_rsa_file_name -C "abc@sample.com"

# アクセス権限の変更
$ chmod 666 file_path

# プロセス管理
# 表示(auxはオプション)
$ ps aux
# 強制終了
$ kill process_id

# パフォーマンスモニタリング
$ top
  # topコマンド実行中、下記のショートカットで表示状態変更可能
  # Shift+P : CPU使用率順
  # Shift+M : メモリ使用率順
  # Shift+T : 実行時間順

# 外部ストレージマウント
$ sudo fdisk -l # パーティションの状況を調べる、/dev/sda*を探す
$ sudo mkdir /mnt/usb1 # 任意のディレクトリ作成
$ sudo chmod 777 /mnt/usb1 # 本来は適切なアクセス権限を与える
$ sudo blkid /dev/sda1 # UUID確認
  # ...UUID="xxxxxxxx-xxxx-...xxxx"...
$ sudo vi /etc/fstab # fstab追記
  # ext4の場合
  # UUID=xxxxxxxx-xxxx-...xxxx /mnt/usb1 ext4 defaults,noatime,nofail 0 0
  # FAT32の場合
  # UUID=xxxxxxxx-xxxx-...xxxx /mnt/usb1 vfat user,rw,noatime,nofail,umask=111,dmask=000 0 0
$ sudo reboot # 再起動すると自動マウント
$ df # マウントされたことを確認
$ vi /mnt/usb1/a.txt # rootでなくても読み書き可能

$ sudo mount /dev/sda1 /mnt/usb1 # 手動マウント
$ sudo umount /dev/sda1 # 手動アンマウント

# Gitインストール
$ sudo apt install git
$ git config --global user.name "abc defg"
$ git config --global user.email "abc@sample.com"

# シャットダウン・再起動
$ sudo shutdown now
$ sudo reboot
```

## 設定

- 固定IPアドレスの設定

```conf:/etc/dhcpcd.conf
  .
  .
# ファイル末尾に以下を追記
interface eth0
static ip_address=xxx.xxx.xxx.xxx/xx
static routers=xxx.xxx.xxx.xxx
static domain_name_servers=xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx
```

- Wi-Fi設定

```sh
$ cd /etc/wpa_supplicant
# wpa_supplicant.confのアクセス権限を一時的に変更
$ sudo chmod 666 ./wpa_supplicant.conf
$ sudo wpa_passphrase SSID password >> wpa_supplicant.conf
$ vi wpa_supplicant.conf # 後述のように内容を変更
$ sudo chmod 600 ./wpa_supplicant.conf
```

```conf:./wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
        ssid="SSID"
        #psk="password" # この行は平文パスワードなので削除
        psk=xxxxxxxxxx
        scan_ssid=1 # ステルスSSIDを使用している場合はこの行を追加
}
```

## お役立ち情報

- Raspberry Pi初回起動時からSSH接続したい場合は、`/boot/ssh`という**ファイル**(拡張子なし)をWindows Explorer等からSDカードのbootフォルダに直接作成するとSSHが有効になる

## 参考

> USBメモリのマウント
> <https://mmbrothers.exblog.jp/16948851/>
> Linuxパフォーマンス調査などで使うコマンドメモ
> <https://qiita.com/toshihirock/items/0e0b20064730469e93e6>
> topコマンドで覚えておきたい使い方14個
> <https://orebibou.com/2015/07/top%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E8%A6%9A%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E4%BD%BF%E3%81%84%E6%96%B914%E5%80%8B/>
vue.js+Nuxt.jsで構造化データマークアップをしてみた

# 構造化データマークアップとは
構造化データとは「更新日」や「著者」などのサイトの情報を構造的に示すことの出来るデータ構造です。
これを記載することでGoogleが単なる文字列としてではなくデータ構造としてサイトを認識することが出来るようになり、パンくずから料理のレシピまで検索結果をリッチに見せてくれるようになります。
必須と言わないまでも、SEO対策の１つとしてよく使われる方法ですね！

# 構造化データの3つの方法
構造化データの記載方法には以下の３種類があります。

- JSON-LD
- microdata
- RDFa

下の例を見てもらえればわかりますが、microdataとRDFaは実際に表示に使用するタグの中にデータを埋め込んでいきます。そのため記述が分散して見づらくなってしまったり、データとしてだけ入れ込みたい場合にhiddenな要素を作る必要があったり、非常に見づらくなってしまいます。
GoogleとしてもJSON-LDを推しているようなのでJSON-LDでの記載方法について調べてみました。

## JSON-LDの例
```html
<script type="application/ld+json">
{
  "@context": "http://schema.org",
  "@type": "MusicGroup",
  "event": [{
    "@type": "Event",
    "location": "Memphis, TN, US",
    "offers": "ticketmaster.com/foofighters/may20-2011",
    "startDate": "2011-05-20",
    "url": "foo-fighters-may20-fedexforum"
  }
}
</script>
```
## microdataの例
```html
<div itemscope itemtype="http://schema.org/MusicGroup">
<h1 itemprop="name">Foo Fighters</h1>
<div itemprop="video" itemscope itemtype="http://schema.org/VideoObject">
  <h2>Video: <span itemprop="name">Interview with the Foo Fighters</span></h2>
  <meta itemprop="duration" content="T1M33S" />
  <meta itemprop="thumbnail" content="foo-fighters-interview-thumb.jpg" />
  <object ...>
    <param ...>
    <embed type="application/x-shockwave-flash" ...>
  </object>
  <span itemprop="description">Catch this exclusive interview with
    Dave Grohl and the Foo Fighters about their new album, Rope.</span>
</div>
</div>
```
## RDFaの例
```html
<div vocab="http://schema.org/" typeof="MusicGroup">
<h1 property="name">Foo Fighters</h1>
<div property="video" typeof="VideoObject">
  <h2>Video: <span property="name">Interview with the Foo Fighters</span></h2>
  <meta property="duration" content="T1M33S" />
  <meta property="thumbnail" content="foo-fighters-interview-thumb.jpg" />
  <object ...>
    <param ...>
    <embed type="application/x-shockwave-flash" ...>
  </object>
  <span property="description">Catch this exclusive interview with
    Dave Grohl and the Foo Fighters about their new album, Rope.</span>
</div>
</div>
```

ref) http://schema.org/interactionStatistic

# JSON-LDでの記載方法
headの中でscriptを埋め込んでいきたいため、各pagesの`<script>`内でheadを指定していきます。
しかし Nuxt.jsでは各プロパティをsanitizesして表示するため、そのままだとescapeされてしまいます。
ですのでそれを無効化するために`__dangerouslyDisableSanitizers`を使用していきます。

```pages/index.js
<script>
  export default {
    ...
    head () {
      return {
        __dangerouslyDisableSanitizers: ['script'],
        script: [{
          innerHTML: `{
            "@context": "http://schema.org",
            "@type": "Article",
            "author": "${this.currentPost.fields.author}",
            "name": "${this.currentPost.fields.title}"
            "datePublished": "${this.currentPost.fields.publishDate}"
          }`,
          type: 'application/ld+json'
        }]
      }
    },
    ...
```

# まとめ
非常に簡単で、コードとしてもシンプルに対応できました！
今は簡単なWebsiteなら本当に一瞬で出来るため、便利な時代ですね。

# 参考
- How correctly use ld+json scripts
  - https://nuxtjs.cmty.io/nuxt/nuxt.js/issues/c1022
Simple to use Evernote ( Evernoteのシンプルな使い方 )

# Summary

Simple to use Evernote ( Evernoteのシンプルな使い方 )
あくまでも個人的メモ。。。
もしくはこんな方法もどう？とかあれば教えてくださいっ！

## Environment

```shell
ProductName:	Mac OS X
ProductVersion:	10.13.4
BuildVersion:	17E202
```

## Install

```shell
$ brew cask install evernote
```

## Setteing of Evernote

Simple Veiwing ( シンプルに表示 )

```text
View > Hide Tab bar
View > Hide ToolBar
View > Side List View
```

こんな感じ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149269/399a579f-e5ac-1945-bb17-421c0ae0debb.png)


## Term ( 用語 )

```
Window   -> terminal
NoteBook -> folder or directory
Note     -> file
Tag      -> file location pointer
```

## Keyboard shortcuts

下記のショートカットは必須！絶対に身につけるべし！

create

| shortcuts      | To              |
| :------------- | :-------------  |
| Window         | cmd + alt + n   |
| Note           | cmd + n         |
| Tag            | cmd + ctrl + t  |
| Folder         | cmd + shift + n |

view

| shortcuts      | To             |
| :------------- | :------------- |
| Notes          | cmd + alt + 0  |
| Folde r        | cmd + alt + 1  |
| Tag            | cmd + alt + 2  |
| Back           | cmd + [        |
| Forward        | cmd + ]        |

jump

| shortcuts      | To             |
| :------------- | :------------- |
| general        | cmd + j        |
| folder         | cmd + alt + j  |

edit note

| shortcuts      | To               |
| :------------- | :-------------   |
| add tag        | cmd + ‘          |
| move folder    | cmd + ctrl + m   |
| paste          | cmd + shift + v  |
| title          | cmd + l          |
| edit           | cmd + l + return |


## Excersice

下記のエクセサイズを１０回ぐらいやって感覚で覚えること！

```text
01. create Foo_ folder
02. create foo_, bar_ and baz_ tags
03. create foo, bar, baz files
04. add tags
05. move notes to Foo_ folder
06. jump Foo_ folder
07. filter foo_ tags
```

answer

```text
01. cmd + shift + n
02. cmd + ctrl  + t
03. cmd + n
04. cmd + '
05. cmd + ctrl + m
06. cmd + j
07. click tags icon
```

## Noteの整理 ( フォルダにわける )

![foo.gif](https://qiita-image-store.s3.amazonaws.com/0/149269/76d0de7d-ac10-32ce-eba1-d96218f53bdb.gif)


（その１）Slide bar を利用して整理する！

```
// display slide bar
cmd + alt + s

// expand folders
click NoteBooks

// move note to Notebooks
drag note and drop to Notebooks
```

（その２） Move note to コマンドをつかう

```
cmd + ctrl + m
```

## Search

```
まずは jump で検索 ( cmd + j )

フォルダで検索 ( cmd + alt + j ) 

最後にどうしようもないときはNote検索 ( cmd + ctlr + e )
```
Androidでadbを使ってスマホのバックアップ

# アプリの個別バックアップ

## 前提

- USBでスマホとPCを接続しデバッグモードにしていること
- adb devicesでデバイスを認識していること

## 結論

```shell
for buf in $(adb shell pm list packages -e -3 | cut -d':' -f2 | sed -e 's/\r//'); adb backup -f ${buf}.ab -apk -obb ${buf}
```

スマホ画面からパスワードを1アプリ毎に設定することで，バックアップがPC側のカレントディレクトリに作成される．

## 説明

有効にしているアプリのリスト（パッケージ名）を取得

```shell
adb shell pm list packages -e
```

出力はこんな感じ

```
package:ecareme.asuswebstorage
package:skype.raider
...
```

出力のうち「:」より右をPKGNAMEとすると，

```shell
adb backup -f FNAME -apk -obb -shared -system PKGNAME
```

ここでFNAMEはバックアップファイル名で省略するとbackup.abというファイル名になる．
最近のデバイスは自動で暗号化機能がONになっているためか，パスワードを設定しないとバックアップを開始してくれないので，かなり面倒くさい．

復元は

```shell
adb restore FNAME
```

以上をシェルスクリプト化する．
ただ，毎回パスワード入力を求められて，やっぱし恐ろしく面倒くさい．

```shell
for buf in $(adb shell pm list packages -e -3 | cut -d':' -f2 | sed -e 's/\r//'); adb backup -f ${buf}.ab -apk -obb ${buf}
```

Heliumはこの辺をアンドロイドアプリとして動作させることで自動入力させているのだと思われる．

# 内蔵ストレージのバックアップ

## 前提

- 上の前提（USBでデバッグモードで接続）に加え，
- ディレクトリをpullするだけでは，文字コード問題やパス長問題が発現するので，端末上でzip圧縮して転送する．
  端末上でのzip圧縮は，色々なアプリがあるので適当に．
  (参考までに，私は[X-plore File Manager](https://play.google.com/store/apps/details?id=com.lonelycatgames.Xplore)を使っている)
- /sdcardにFILE.zipが保存されているとする．例えば/sdcard/Music→/sdcard/Music.zipなどに圧縮しておいておく．無圧縮でも良い．

## 結論

以下でPCの/sdcard/直下にあるzipを全て落とし，削除する．

```shell
for f in $(adb shell ls /sdcard/ | grep zip | sed -e 's/\r//g'); adb pull /sdcard/$f .
for f in $(adb shell ls /sdcard/ | grep zip | sed -e 's/\r//g'); adb shell rm /sdcard/$f
```
PostgreSQL 11がやってくる！(2) - システムカタログの差分を見てみる

## はじめに

にゃーん。

前回は、PostgreSQL 10とPostgreSQL 11の設定パラメータの差分を探ってみた。

今回は、PostgreSQL 10とPostgreSQL 11のシステムカタログの差分を見てみる。PostgreSQLではDDL＝システムカタログと言ってもいいくらい密接な関係がある。なので、システムカタログの差分を見ることによって、どんなDDLの追加や変更があったのかを、想像することができたりする。また、PostgreSQLの挙動を監視するための稼動統計情報ビューの差分を見ることで、PostgreSQL監視用のスクリプトへの影響も事前に調査することもできたりする。

じゃあ早速見てみよう。

## テーブル/ビュー単位の変更

なんと、現時点ではテーブル/ビュー単位での変更差分はなかった。

ハッシュパーティションがPostgreSQL 11で入ったけど、既存のパーティション用システムカタログの枠で管理できるってことなんかな。あと、新規の稼動統計情報ビューもなさげか。

## 列単位の変更

列の追加や変更はそれなりに多い。

| 表/ビュー名          | 変更箇所                                                     | メモ                                                         |
| -------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| pg_aggregate         | aggfinalmodify, <br />aggmfinalmodifyの追加                  | 遷移状態の値の保持(読み込みのみ、書き込みあり)に関するフラグかな？<br />CREATE AGGREGATEに影響があるんだろうか。 |
| pg_attribute         | atthasmissing, attmissingvalの追加                           | 後で列が追加されたときのDEFAULT値の情報。フラグ(atthasmissing)とその値(attmissingval)なのかな。<br />もしかすると高速ALTER TABLE機能が入ったってことなんだろうか(実テーブルへの変更がかからない |
| pg_class             | relhaspkeyの削除<br />relrewriteの追加                       | 従来、主キー存在チェックにはrelhaspkeyを使ってたけど、11からはpg_indexを使いなさいよ、とリリースノートには書いてある。<br />relrewriteについては、「 表リライトを必要とするDDL操作中に新しいリレーションが書き込まれる場合、これには元のリレーションのOIDが含まれる。内部的な（一時的な？）情報らしいので、普段は0しか入らないっぽい？ |
| pg_constraint        | conparentidの追加<br />conincludingの追加<br />pg_constraint_conparentid_indexインデックス(btree)の追加 | conparentidはパーティション表の制約に関する情報っぽい。<br />conincludingは、制約付き列と同じインデックスに含まれる非制約列のリスト・・・どういうときに使うのか、まだよくわかってない。 |
| pg_index             | indnkeyattsの追加                                            | 索引のキー列の数、らしい。今までなかったんだー。             |
| pg_partitioned_table | partdefidの追加                                              | デフォルトパーティションに該当するpg_classの値。そっか、デフォルトパーティションって11からだっけか。 |
| pg_proc              | proisagg, proiswindowの削除<br />prokindの追加               | いままで集約関数やウインドウ関数かどうかをフラグで管理していたけど、プロシージャの追加も含めて、11からはcharで種別をもつようになったっぽい。<br />通常関数はf、プロシージャはp、集約関数はa、ウィンドウ関数はw |
| pg_publication       | pubtruncateの追加                                            | ロジカルレプリケーションの対象にTRUNCATEが追加されたから、そのフラグかな。 |
| pg_stat_wal_receiver | sender_hostの追加<br />sender_portの追加                     | レプリケーション送信元のホスト名とポート番号が参照できるようになったみたい。 |



## おわりに

これは現時点(beta1)時点の調査なので、正式版リリース時点では多少変わっている可能性はあるので、今後のbetaリリースタイミングで、再調査は必要かもしれない。

あと、システムカタログの差分から、PostgreSQL 11の新機能や変更内容の一部が読み取れるのはいつもながらに面白いなあ。システムカタログの差分自体は、表/ビュー単位の追加ならともかく、列の変更だけだとリリースノートに掲載されないこともあるので、こういう調査はそれなりに大事だと思ってはいる。
WindowsでJupyter NotebookによるKeras開発環境を構築する

# この記事について
WindowsでJupyter NotebookによるKeras開発環境を構築するためのツールインストール方法について記載します。

# インストール

## Anacondaのインストール

### ダウンロード

下記サイトより、Anaconda (miniconda)をダウンロードして、任意のフォルダにインストールします。
[Miniconda](https://conda.io/miniconda.html)

Anacondaの仮想環境を作成します。スタートメニューからAnaconda3 -> Anaconda Promptを起動します。

### 仮想環境の作成

Anacondaでは仮想環境を構築することができます。これにより、バージョン違いのフレームワークを使い分けるなどを行いたい場合に管理が行いやすくなります。今回は、keras実行用の仮想環境を構築するため、起動後、以下のコマンドで「mykeras」という名前の仮想環境を作成します。

```
(C:\Anaconda3) C:\Users\username> conda create -n mykeras python=3.6
```

作成に成功すると、'conda info --envs'で環境一覧を確認できます。

```
(C:\Anaconda3) C:\Users\username>conda info --envs
# conda environments:
#
mykeras                  C:\Anaconda3\envs\mykeras
```

仮想環境をアクティベートします。(mykeras)と仮想環境の名称が表示されていれば成功です。

```bash
(C:\Anaconda3) C:\Users\username> activate mykeras

(mykeras) C:\Users\username>
```

## Jupyter NotebookとKerasのインストール

(mykeras)になっていることに注意して、下記コマンドをAnaconda Promptに入力します。

```bash
(mykeras) C:\Users\username> conda install notebook
(mykeras) C:\Users\username> conda install keras
```

可視化ライブラリ(matplotlib)をインストールします。(Option)

```bash
(mykeras) C:\Users\username> conda install matplotlib
(mykeras) C:\Users\username> conda install graphviz
(mykeras) C:\Users\username> conda install pydot
```

これで構築は完了です。

# Jupyter Notebookを起動する

スタートメニューより、Anaconda3 -> Jupyter Notebook(mykeras)をクリックします。ブラウザにJupyter notebookが表示されます。


# 補足

**仮想環境について**

condaで仮想環境を作成すると以下の場所に環境ごとのライブラリを保存するためのフォルダが作成されます。

```
C:\Anaconda3\envs
```

また、仮想環境をactivateすると、PATH等に一時的に実行中の仮想環境用のフォルダへのパスが追加されます。これにより、呼び出されるコマンドやライブラリを変更する仕組みになっています。

```
(mykeras) C:\Users\username> path
PATH=C:\Anaconda3\envs\mykeras;C:\Anaconda3\envs\mykeras\Library\mingw-w64\bin;・・・
```


**matplotlibのマジックコマンド**

matplotlibで描画したグラフを表示するためには、jupyter notebookのコード入力に以下のマジックコマンドを入力します。

```bash
%matplotlib inline
```

**外部エディタでモジュールを編集する場合のマジックコマンド**

読み込んでいるモジュールを外部エディタで編集した場合、デフォルトでは再読み込みされずに、編集が有効になりません。モジュールを実行毎に再読み込みするには、以下のマジックコマンドを入力します。

```bash
%load_ext autoreload
%autoreload 2
```


# Reference

<https://www.infiniteloop.co.jp/blog/2017/11/learning-keras-01/>
はてなダイアリー to Markdown > v0.5 > Tex:表記対応



[はてなダイアリー to Markdown > v0.4 > テーブル表記対応](https://qiita.com/7of9/items/bf4b24b3ad89b533c5a1)
の続き

v0.1は[こちら](https://qiita.com/7of9/items/4e5c586431871e24ad33)

### 関連

- [Python > regex > 書式文字列("[Text:"と"]")だけを置換する](https://qiita.com/7of9/items/f6f32676c1a55330ce5c)

### code v0.5

```
[Tex:Z_c = \frac{1}{2 \pi f C}]
```

を下記のように置換する。

<pre>
```math
Tex:Z_c = \frac{1}{2 \pi f C}
```
</pre>

https://ideone.com/Xc5FIH

```py
import sys
import re

# on Python 3.5

'''
v0.5 May, 29, 2018
   - add conv_tex()
v0.4 Apr. 25, 2018
   - add conv_tableFormat()
v0.3 Apr. 25, 2018
   - conv_super_pre_notation() takes cpp notation
v0.2 Apr. 25, 2018
   - add conv_super_pre_notation()
   - add conv_sublist()
v0.1 Apr. 24, 2018
   - sub list is converted to Markdown style
'''


def conv_tex(intxt):
    if r"[Tex:" in intxt or r"[tex:" in intxt:
        wrk = re.sub('\[Tex:', r'```math\r\n', intxt)
        wrk = re.sub('\[tex:', r'```math\r\n', wrk)
        wrk = re.sub(r']', r'\r\n```', wrk)
       	return wrk
    return intxt


def conv_sublist(astr):
    if "---" in astr:
        astr = astr.replace("---", SPACE4 + SPACE4 + "-")
    if "--" in astr:
        astr = astr.replace("--", SPACE4 + "-")
    return astr


def conv_super_pre_notation(astr):
    astr = astr.replace(">||", "```")
    astr = astr.replace(">|cpp|", "```cpp")
    astr = astr.replace(">|c|", "```c")
    astr = astr.replace("||<", "```")
    return astr


def getTableFormat(numVertical):
    wrk = "|"
    for loop in range(numVertical - 1):   # -1: except for first
       wrk += ":-:|"
    return wrk


def conv_tableFormat(astr):
    global countTbl
    if "|" in astr:
        countTbl += 1
        if countTbl == 2:
            num = astr.count('|')
            fmt = getTableFormat(num)
            return fmt + "\r\n" + astr
    else:
        countTbl = 0
    return astr
    
# read from stdin
lines = sys.stdin.readlines()

SPACE4 = "    "

countTbl = 0  # Table format counter
for elem in lines:
    wrk = conv_sublist(elem)
    wrk = conv_super_pre_notation(wrk)
    wrk = conv_tableFormat(wrk)
    wrk = conv_tex(wrk)
    print(wrk, end='')

```

下記のようになる。

<pre>
|A|B|C|
|:-:|:-:|:-:|
|A|B|C|
|A|B|C|
テスト
|A|B|C|
|:-:|:-:|:-:|
|A|B|C|
|A|B|C|

- A
    - B
        - C

```cpp
// some cpp program
```

```math
Z_c = \frac{1}{2 \pi f C}
```

```math
Z_c = \frac{1}{\omega C}
```

[[[AAA]]]
</pre>

### code v0.5のバグ

- `//-----`というコメントは`//        -        -        -        -        -`に変換される
AutoCADのVBAマクロで、モデル空間のテキストに、google検索のハイパーリンクを付与してみる


# 作成理由
モデル空間、レイアウト空間（＝ペーパー空間）の中にある複数あるテキストにgoogle検索のハイパーリンクを付与したい。

## 条件
- windows10
- AutoCAD2017
- Google検索APIのURLのハイパーリンクを付与
- 自分の環境では動きました。


# VBAその１：モデル空間にハイパーリンク付与
``` vb
Sub モデル空間のテキストに一括ハイパーリンク()
   Dim acDoc As AcadDocument
   Dim acEnt As AcadEntity
   Dim setdata As String
      
   For Each acDoc In Documents
      For Each acEnt In acDoc.ModelSpace'->ModelSpace(=モデル空間)の中のCad要素（acEnt）を抽出
         If (TypeOf acEnt Is AcadText) Or (TypeOf acEnt Is AcadMText) Then
            acEnt.Hyperlinks.Add "https://www.google.com/search?q=" & acEnt.TextString, acEnt.TextString
         End If
      Next acEnt
   Next acDoc
   MsgBox "終了"
End Sub
```


# VBAその２：複数レイアウトにハイパーリンク付与

``` vb
Sub 複数レイアウトテキストにハイパーリンク()
    Dim acDoc As AcadDocument
    Dim acEnt As AcadEntity
    Dim setdata As String
    Dim i, num As Integer
     
    num = ThisDrawing.Layouts.Count'->レイアウト数を変数numに格納する。
                  
    MsgBox num & "ﾚｲｱｳﾄ数"
    
    For i = 0 To num
    ThisDrawing.ActiveLayout = ThisDrawing.Layouts.Item(i)
    Debug.Print ThisDrawing.Layouts.Item(i).Name
    
    For Each acDoc In Documents
        For Each acEnt In acDoc.modelSpace
            If (TypeOf acEnt Is AcadText) Or (TypeOf acEnt Is AcadMText) Then      
            acEnt.color = acRed'終わったらチェックの為、テキストに赤色にしてみる。
            acEnt.Hyperlinks.Add "https://www.google.com/search?q=" & acEnt.TextString, acEnt.TextString
            End If
        End If
      Next acEnt
   Next acDoc
   Next i
   
   MsgBox "終了"
End Sub
```
[WIP]Firebase MLKit beta custom model使ってみた


# ドキュメント
https://firebase.google.com/docs/ml-kit/ios/use-custom-models?hl=ja

# tfliteを用意する
これ見ながらMobileNetのをコンバート
http://blog.gclue.com/?p=836

# コード

```swift
    let conditions = ModelDownloadConditions(wiFiRequired: true, idleRequired: true)
    let cloudModelSource = CloudModelSource(
      modelName: "mobilenet_v1_1_0_224",
      enableModelUpdates: true,
      initialConditions: conditions,
      updateConditions: conditions
    )
    let registrationSuccessful = ModelManager.modelManager().register(cloudModelSource)
    
    guard let modelPath = Bundle.main.path(
      forResource: "mobilenet_v1_1_0_224_local",
      ofType: "tflite"
      ) else {
        // Invalid model path
        return
    }
    let localModelSource = LocalModelSource(modelName: "mobilenet_v1_1_0_224_local",
                                            path: modelPath)
    let registrationSuccessful2 = ModelManager.modelManager().register(localModelSource)
    
    print(registrationSuccessful)
    let options = ModelOptions(
      cloudModelName: "mobilenet_v1_1_0_224",
      localModelName: "mobilenet_v1_1_0_224_local"
    )
    let interpreter = ModelInterpreter(options: options)
    let ioOptions = ModelInputOutputOptions()
    do {
      try ioOptions.setInputFormat(index: 0, type: .uInt8, dimensions: [1, 640, 480, 3])
      try ioOptions.setOutputFormat(index: 0, type: .float32, dimensions: [1, 1000])
    } catch let error as NSError {
      print("Failed to set input or output format with error: \(error.localizedDescription)")
    }

    let input = ModelInputs()
    do {
      let image = UIImage(named: "hoge.jpg")!
      var data: Data  = UIImageJPEGRepresentation(image, 1.0)!
      // Store input data in `data`
      // ...
      try input.addInput(data)
      // Repeat as necessary for each input index
    } catch let error as NSError {
      print("Failed to add input: \(error.localizedDescription)")
    }
    
    interpreter.run(inputs: input, options: ioOptions) { outputs, error in
      print(error)
      guard error == nil, let outputs = outputs else { return }
      // Process outputs
      // ...
      let probabilities = try? outputs.output(index: 0)
      print(probabilities)
    }
```

多分こんな感じ

# GTMSessionFetcherで落ちる

なんかおかしいので`invokeOnCallbackQueue`のコールバックのスレッドをメインスレッドに書き換える。
`dispatch_group_async(_callbackGroup)`ここ GTMSessionFetcher.mの2356行目

# リモートモデル

取得出来なかった。

```
com.firebase.ml
Failed to load cloud model.
```

モデル名が駄目なんだかな…

# ローカルモデル

`nnapi error: unable to open library libneuralnetworks.so`


上手くいったら追記する
nginxの設定ミスで起こるreferer/origin検証の問題

# はじめに
この記事は下記リンクの日本語翻訳記事です

https://github.com/yandex/gixy/blob/master/docs/en/plugins/origins.md

翻訳が誤っている場合はコメントか[@no1zy_sec](https://twitter.com/no1zy_sec)までお知らせいただけると幸いです。

## [origins] nginxの設定ミスで起こるreferer/origin検証の問題
`Referer`や`Origin`ヘッダの検証に正規表現を使用するのは珍しいことではありません。よく`X-Frame-Options`ヘッダ(クリックジャッキングの保護) または Cross-Origin Resource Sharing(CORS)を設定するために必要とされています。

## この設定の最も一般的な間違い
* 正規表現の間違い
* サードパーティのオリジンを許可している

## どうやって見つけるか

1. `$http_origin`　または `$http_referer`のチェックを担当している全ての`if`ディレクティブを探し出してください。
2. 正規表現が安全なことを確認してください。

設定ミスの例:

```nginx
if ($http_origin ~* ((^https://www\.yandex\.ru)|(^https://ya\.ru)$)) {
	add_header 'Access-Control-Allow-Origin' "$http_origin";
	add_header 'Access-Control-Allow-Credentials' 'true';
}
```


## 対策
* 正規表現を修正するか、正規表現の使用をやめる
* `Referer`ヘッダの検証に正規表現を使用する場合、[ngx_http_referer_module](http://nginx.org/en/docs/http/ngx_http_referer_module.html)を使用することができる場合があります。
* 正規表現ではなく`map`ディレクティブを使用する方が優れている場合があります。

## 関連リンク
[nginxの設定ミスで起こるHTTP Splitting](https://qiita.com/no1zy_sec/items/fe7c44b5a0fdd4807bbe)
[nginxの設定ミスで起こるSSRF](https://qiita.com/no1zy_sec/items/2718f4a99bb8368ac374)
[nginxの設定ミスで起こるパス トラバーサル](https://qiita.com/no1zy_sec/items/e541f1c838874ff400bb)
[nginxの設定ミスで起こるMultiline response headers](https://qiita.com/no1zy_sec/items/da280cb5c1e154babe2a)
[nginxの設定ミスで起こるレスポンスヘッダの出力不備](https://qiita.com/no1zy_sec/items/b786abcba5d796ccc300)
[nginxの設定ミスで起こるHostヘッダフォージェリ](https://qiita.com/no1zy_sec/items/dfccd91cf76bf73b7754)
[nginxの設定ミスで起こるリファラの検証不備](https://qiita.com/no1zy_sec/items/9d73f4923ebef1598e7d)
Changing columns for table "hogehoges" requires Doctrine DBAL; install "doctrine/dbal".

# 事象
既存のテーブルのカラム情報(デフォルト値・Null許可等)を変更しようとした際、以下のようなエラーが出る。

```shell
$ php artisan migrate
In ChangeColumn.php line 30:
  Changing columns for table "hogehoges" requires Doctrine DBAL; install "doctrine/dbal".
```

# 解決方法
doctrine/dbalをインストールしなさいと言われているので、
composerでinstallするだけでよかった

```shell
$ composer require doctrine/dbal                                                                                                            ~/projects/Hoge
    Using version ^2.7 for doctrine/dbal
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 5 installs, 0 updates, 0 removals
  - Installing doctrine/collections (v1.5.0): Downloading (100%)
  - Installing doctrine/cache (v1.7.1): Downloading (100%)
  - Installing doctrine/annotations (v1.6.0): Downloading (100%)
  - Installing doctrine/common (v2.8.1): Downloading (100%)
  - Installing doctrine/dbal (v2.7.1): Downloading (100%)
doctrine/cache suggests installing alcaeus/mongo-php-adapter (Required to use legacy MongoDB driver)
Writing lock file
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: laravelcollective/html
Package manifest generated successfully.
```

もう一度。

```shell
$ php artisan migrate
Migrating: 2018_05_28_131641_add_options_to_hogehoges_table
Migrated:  2018_05_28_131641_add_options_to_hogehoges_table
```

成功。

# 所感
なんでこんな機能最初からインストールされてないんだろう・・・
カラムの情報変更とか結構やらないのかな

と思ってたけど、最初からちゃんとDBの設計ができていれば使わないのかー
Spring Securityとは？？

セキュリティのFiliterには２種類のフローがある

    - ログインせずに
        - ログインページにアクセスする場合
        - ログインが必要ないページにアクセスする場合
    - ログインした状態で
        - ログインページにアクセスする場合（ほぼない）
        - ログインが必要ないページにアクセスする場合
        - ログアウトページにアクセスする場合

## 認証を求めるページの処理を行う場合
- これは特定のURLでのみ発動する（1個）
    - ログインURLなど

- 実際に処理をするのはAuthenticationManagerが行う
    - Managerが順番に子供のAuthenticationProvider(認証手形発行所)を呼び出して処理を行う
        - 発行所の粒度は？？？
    - 認証が通らなかった場合、何もしない（次のフィルタに飛ばす）
    - 認証が通った場合、SecurityContextHolderにThreadLocalで保存する
        - ThreadLocalとは？
- ThreadLocalに保存されたら、その値を[0]のHttpSessionContextIntegrationFilterに返し、そのクラスの中でSecurityContextHolderから手形を取り出し、Sessionに保存される
    - 手形がない場合はエラー画面へ飛ばす（次には行かない）
    - その後で認証後の処理（リダイレクト）を行う。
        - Sessionに保存できたら「認証OK」のURLへ飛ばす（だいたいトップ画面）
        - 保存できなかったらエラー画面へ飛ばす（だいたいエラーページ）

認証を求めるページの場合は、ここまでの処理で完結する

### ポイント
- 認証手形は、ThreadLoacal -> Sessionの順番で保存される
- 認証後どこの画面に飛ばすかを司っているのはAuthenticationManager


## 認証を求めないページの処理を行う場合
- 上記の処理は、マッチしたら何かをする、マッチしなければ次に進める、という意味の処理になる

- AnonymousProcessingFilterはAuthenticationManagerをスルーした（該当ではない）URLでのみ発動する
    - ここで、認証手形を発行されていない（ThreadLocal->Sessionに保存されていない）場合、認証手形ではなく、Anonymous認証手形というものを発行する
    - Anonymous認証手形が発行されたら、AuthenticationManagerと同じように[0]のSecurityContextHolderにThreadLocalに手形が保存される
- RequestExceptionTranslationFilterでは、次のFilterSecurityInterceptorでエラーをスローされた場合に発動する
    - エラーがない場合は、そのまま何もしない（次のAccessDecisionManagerの処理が行われる）
    - エラーがある場合は、AccessDecisionManagerからエラーがスローされ、AccessDenyExeption例外を発生させる。
        - ここで何のエラー（認証手形？Anonymous認証手形？）かをチェックし、Anonymous認証手形の派生クラスからのエラーの場合は例外処理を行う
            - だいたいログイン画面へ遷移させる
- FilterSecurityInterseptorでAnonymous認証手形が発行されたアクセスを許可するかを確認している
    - その子供のAccessDecisionManagerのRole Voterたちが一人づつ確認する
        - 全員が許可する場合や1人だけ許可すれば通る場合などのパターンがある
        - 問題がある場合は、前の処理のRequestExeptionTranslationFilterにエラーがスローされる
        - この許可する人たち（Role Voter）は任意で作れるものとデフォルトのものが存在している？？？？

### ポイント
- RequestExeptionTranslationFilterは受け身
    - 次の処理でエラーをスローされるのを待っている
- RoleVotorはログインしている（認証手形）を発行されたアクセスに対してもチェックすることが可能
    - つまり処理の挙動を変化させることができる
    - 処理の結果は（何の）エラーを返すかどうかを決定できる

## 参考
> https://sites.google.com/site/soracane/home/springnitsuite/spring-security/spring-securityno-naibu-dousa
Emacsでwindowをおっきくしちゃう

iTerm2だと、1つのPaneを最大化（他のPaneは隠す）することが簡単にできます（`cmd+shift+enter`）。
Emacsでもできないかな〜と思ってやってみました。大きなファイル読むときとかに意外と便利です！

＊最新版はここに置いておきます。
[blue0513/instant-maximized-windw](https://github.com/blue0513/instant-maximized-window)

## 何ができるの？

こんな感じに、4分割した画面の1つをパッと最大化できます。
このとき他の画面を破壊しないのがポイント。

![emacs-maximize.gif](https://qiita-image-store.s3.amazonaws.com/0/144707/c85f92c5-f179-8c79-ebe1-857a9ebf6fe5.gif)

## 使い方

[Github](https://github.com/blue0513/instant-maximized-window)から`git clone`して、以下を`init.el`に書けばOK！

```elisp
;; pathが通ってなかったらこれを書く
(add-to-list 'load-path "YOUR PATH")

(require 'instant-maximized-window)

;; お好きなように
(global-set-key [YOUR FAV KEY] 'window-temp-maximize)
```

## どうやってるの？

めっちゃ簡単です。

```elisp
;; 画面のが最大化されている or NOTの状態を保持
(defvar is-window-maximized nil)

;; 1. 最大化されている場合
;;  -> `balance-windows` で画面のバランスを調整
;; 2. 最大化されていない場合
;;  -> `maximize-window` で画面を最大化

(defun window-temp-maximize ()
  (interactive)
  (progn
	(if is-window-maximized
	(balance-windows)
	  (maximize-window))
	(setq is-window-maximized
	  (not is-window-maximized))))
```

いい書き方とかあればぜひpull reqで教えてください :bow:
nginxの設定ミスで起こるレスポンスヘッダの出力不備

# はじめに
この記事は下記リンクの日本語翻訳記事です

https://github.com/yandex/gixy/blob/master/docs/en/plugins/addheaderredefinition.md

翻訳が誤っている場合はコメントか[@no1zy_sec](https://twitter.com/no1zy_sec)までお知らせいただけると幸いです。


## [add_header_redefinition] add_headerディレクティブによるレスポンスヘッダの再定義

残念なことに、多くの人々はディレクティブがどのように引き継がれるかを知りません。
ネストされたレベルに新しいレスポンスヘッダ追加しようとしているとき、add_headerディレクティブを誤って使用する人がよくいます。この機能はNginxの[ドキュメント](http://nginx.org/en/docs/http/ngx_http_headers_module.html#add_header)で言及されています。

> There could be several add_header directives. These directives are inherited from the previous level if and only if there are no add_header directives defined on the current level.

日本語訳:
いくつかの`add_header`ディレクティブがある可能性があります。これらのディレクティブは現在のレベルに`add_header`が無い場合のみ、以前のレベルから引き継がれます。

そのロジックは非常に単純です。ヘッダーをとあるレベル( `server` セクションなど)に設定して、`location`などの低いレベルに他のヘッダーを設定すると、最初のヘッダーは破棄されます。

### 簡単なチェック
* 設定:

```nginx
server {
  listen 80;
  add_header X-Frame-Options "DENY" always;
  location / {
      return 200 "index";
  }

  location /new-headers {
    # Add special cache control
    add_header Cache-Control "no-cache, no-store, max-age=0, must-revalidate" always;
    add_header Pragma "no-cache" always;

    return 200 "new-headers";
  }
}
```

* `/`にリクエストをする (`X-Frame-Options`ヘッダがserverのレスポンスヘッダにあります。)

```nginx
GET / HTTP/1.0

HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Mon, 09 Jan 2017 19:28:33 GMT
Content-Type: application/octet-stream
Content-Length: 5
Connection: close
X-Frame-Options: DENY

index
```

* `/new-headers`にリクエストをする (`Cache-Control` と `Pragma`ヘッダはありますが、`X-Frame-Options`ヘッダがありません。)

```nginx
GET /new-headers HTTP/1.0


HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Mon, 09 Jan 2017 19:29:46 GMT
Content-Type: application/octet-stream
Content-Length: 11
Connection: close
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache

new-headers
```

## 対策
いくつかの解決策があります。

* 重要なヘッダーを複製します。
* あるレベルで全てのヘッダーを設定する(`server`セクションがおすすめです)
* [ngx_headers_more](https://www.nginx.com/resources/wiki/modules/headers_more/)モジュールを使用する。

## 関連リンク
[nginxの設定ミスで起こるHTTP Splitting](https://qiita.com/no1zy_sec/items/fe7c44b5a0fdd4807bbe)
[nginxの設定ミスで起こるSSRF](https://qiita.com/no1zy_sec/items/2718f4a99bb8368ac374)
[nginxの設定ミスで起こるパス トラバーサル](https://qiita.com/no1zy_sec/items/e541f1c838874ff400bb)
[nginxの設定ミスで起こるMultiline response headers](https://qiita.com/no1zy_sec/items/da280cb5c1e154babe2a)
[nginxの設定ミスで起こるreferer/origin検証の問題](https://qiita.com/no1zy_sec/items/93f1efe3c58102807de8)
[nginxの設定ミスで起こるHostヘッダフォージェリ](https://qiita.com/no1zy_sec/items/dfccd91cf76bf73b7754)
[nginxの設定ミスで起こるリファラの検証不備](https://qiita.com/no1zy_sec/items/9d73f4923ebef1598e7d)
npm versionコマンドで出来ること。

## 調べた経緯
自分でnpmパッケージを作ったので、パッケージのバージョン番号を更新する場面があって初めて`$ npm version`というコマンドを使うようになりました。

`$ npm version`コマンド自体は、引数に応じて`package.json`のバージョン番号（`version`要素）の値を更新・Gitコミットし、そのバージョン番号の名前を持ったGitのタグを作成するコマンドです。

しかし、[公式ドキュメント](https://docs.npmjs.com/cli/version)に詳細が書いてあるものの、引数の種類が多く、何が起こるのかパッと見ただけでは自分にはわからなかったので、ローカルで各コマンドを実行しつつまとめました。

## 引数について
公式ドキュメント上には`npm version`コマンドの引数は下記の9個があります。

+ `<newversion>`
+ `major`
+ `minor`
+ `patch`
+ `premajor`
+ `preminor`
+ `prepatch`
+ `prerelease`
+ `from-git`

大きく分けると`from-git`と`from-git`<b>以外</b>の２種類に分けられるそうです。

### `from-git`
名前の通り、git上で設定された最新のタグを読んで、そのタグのバージョン番号をnpmパッケージのバージョンとして設定するコマンド。

### `from-git`以外
コマンド実行時点でパッケージに設定されているバージョン番号から新しく設定するコマンド。

`<newversion>` となっている部分は、 `from-git`以外のものを指すようです。

```
<newversion> = major, minor, patch, premajor, prepatch, prerelease
```
というようなイメージのようです。
（もし違っていたらすみません、その際にはツッコミをお願いします:pray:）

#### `<newversion>`対応表

`<newversion>`（`from-git`以外）のコマンドを実行する時のパッケージのバージョンが`1.0.0`であった場合、下記の表の通りになります。

コマンド  | 実行後のバージョン番号
:-- | :--
$ npm version major | **2**.0.0
$ npm version minor | 1.**1**.0 
$ npm version patch | 1.0.**1**
$ npm version premajor | **2**.0.0<b>-0</b>
$ npm version preminor | 1.**1**.0<b>-0</b>
$ npm version prepatch | 1.0.**1-0**
$ npm version prerelease | 1.0.**1-0**

#### `$ npm version prerelease` について
上記の表にまとめた時に、`prepatch`と`prerelease`がなぜ同じバージョンになるのかがわかりませんでした。

ですが、`prerelease`について検索したところヒットした、Stack Overflowの「[What is the convention for versioning npm packages prior to 1.0.0?](https://stackoverflow.com/questions/28421489/what-is-the-convention-for-versioning-npm-packages-prior-to-1-0-0)」というスレッドで、
> **prerelease**
>Lets say your package starts at version 0.0.0
>`npm version prerelease => 0.0.1-0`
>`npm version prerelease => 0.0.1-1`
>Basically just bumps the number after the dash

という記述があり、`prerelease`コマンドは、ダッシュの後の番号（プレリリース版としてのバージョン番号）を上げる時に使用するコマンドとようやく理解できました。

コマンド実行時のバージョン番号が`1.0.1-0`であった時に、再度実行したときには下記の表のように挙動が異なることを確認できました。

コマンド  | 実行後のバージョン番号
:-- | :--
$ npm version prepatch | 1.0.**2**-0
$ npm version prerelease | 1.0.1-**1**

## 参考ページ
+ [version | npm Documentation](https://docs.npmjs.com/cli/version)
+ [node.js - What is the convention for versioning npm packages prior to 1.0.0? - Stack Overflow ](https://stackoverflow.com/questions/28421489/what-is-the-convention-for-versioning-npm-packages-prior-to-1-0-0)
+ [セマンティックバージョニング 2.0.0 | Semantic Versioning](https://semver.org/lang/ja/)
VBAでAPI呼び出し時のエラー番号をFormatMessageを使って、エラーメッセージに変換する。

VBAでAPIを呼び出した場合の Err.LastDllErrorを FormatMessageを使って、エラーメッセージに変換します。
持てる限りの力技を使ってみました。
FormatMessageにより、メッセージ文字列のポインタが渡されるので、これをSysAllocStringを使って、BSTRに複写したうえで、VBAの文字列型変数に割り当てます。

```vb
Private Declare PtrSafe Function FormatMessage Lib "Kernel32.dll" Alias "FormatMessageW" ( _
    ByVal dwFlags As Long, _
    ByVal lpSource As LongPtr, _
    ByVal dwMessageId As Long, _
    ByVal dwLanguageId As Long, _
    ByVal lpBuffer As LongPtr, _
    ByVal nSize As Long, _
    ByVal Arguments As LongPtr) As Long
     
Private Declare PtrSafe Sub RtlMoveMemory Lib "kernel32" ( _
    ByVal Destination As LongPtr, ByVal Source As LongPtr, ByVal Length As LongPtr)
Private Declare PtrSafe Function SysAllocString Lib "OleAut32.dll" (ByVal psz As LongPtr) As LongPtr
Private Declare PtrSafe Function LocalFree Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr

Function GetApiErrorText(ByVal Code As Long) As String
    Const FORMAT_MESSAGE_ALLOCATE_BUFFER As Long = &H100&
    Const FORMAT_MESSAGE_FROM_SYSTEM As Long = &H1000&
    Const FORMAT_MESSAGE_IGNORE_INSERTS As Long = &H200&
    'MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)の計算済みの値を宣言
    Const MAKELANGID_LANG_NEUTRAL_SUBLANG_DEFAULT As Long = &H400
    Dim lpMsgBuf As LongPtr
    
    
    FormatMessage _
        FORMAT_MESSAGE_ALLOCATE_BUFFER Or _
        FORMAT_MESSAGE_FROM_SYSTEM Or _
        FORMAT_MESSAGE_IGNORE_INSERTS, _
        0, _
        Code, _
        MAKELANGID_LANG_NEUTRAL_SUBLANG_DEFAULT, _
        VarPtr(lpMsgBuf), _
        0, _
        0
                  
    Dim lpNewString As LongPtr
    GetApiErrorText = vbNullString
    lpNewString = SysAllocString(lpMsgBuf)
    LocalFree lpMsgBuf
    RtlMoveMemory VarPtr(GetApiErrorText), VarPtr(lpNewString), LenB(lpNewString)
   
End Function
```

使い方の例です。

```vb
Sub Main()
    ' Err.LastDllError を引数に代入するのが本来の使い方ですが
    ' ここで代わりに1を代入します。
    Debug.Print GetApiErrorText(1)
End Sub
```
winnt.hのMAKELANGIDマクロをVBAに移植

VC++でリソースを取り扱うようなコードのサンプルでMAKELANGIDマクロを見かけることがあります。
これを、VBAにしようと思うと、C++でのWindowsAPIの呼び出し以上に移植に苦労したので、メモとして残します。

ちなみに、winnt.hではMAKELANGIDマクロは以下のように定義されています。

```winnt.h
#define    MAKELANGID(p, s)       ((((WORD  )(s)) << 10) | (WORD  )(p))
```

sを10ビットシフトして、pと論理和を取りますが、VBAではこれがなかなか難しいです。
ビットシフトできないので、2^10倍したものをLong型で受けて、 &hFFFF& と論理積をとることで、Integer型相当部分だけを抜き出しました。

```vb:VBA

Function MAKELANGID(p As Integer, s As Integer) As Integer
    Dim lngTemp As Long
    lngTemp = (ShortToLong(s) * 1024) And &HFFFF&
    MAKELANGID = (lngTemp + ShortToLong(p)) And &HFFFF&
End Function

Function ShortToLong(ByVal Short As Integer) As Long
    ShortToLong = Short And &HFFFF&
End Function
```