OmniAICreator/Qiita-1.07M huggingface dataset:
brew doctorでconfigに関するWarningが出たときの対処法メモ(Homebrewとpyenvが干渉)

####前提
環境 macOS 10.12.6
`homebrew`と`pyenv`両方からpython3を入れた。
brew doctorを実行すると、

##以下のようなWarningがでた
<pre><code>
$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry and just ignore them. Thanks!
、、、
Warning: "config" scripts exist outside your system or Homebrew directories.
`./configure` scripts often look for *-config scripts to determine if
software packages are installed, and what additional flags to use when
compiling and linking.

Having additional scripts in your path can confuse software installed via
Homebrew if the config script overrides a system or Homebrew provided
script of the same name. We found the following "config" scripts:
  /Users/username/.pyenv/shims/python-config
  /Users/username/.pyenv/shims/python3-config
  /Users/username/.pyenv/shims/python3.6-config
  /Users/username/.pyenv/shims/python3.6m-config</code></pre>

##対処方法
<b>.bash_profile</b>にaliasを追加する。

以下コマンドを実行することでbash_profileを編集できます。
(usernameの部分などpathは適宜書き換えて下さい)

<pre><code>echo 'alias brew="env PATH=${PATH/\/Users\/username\/\.pyenv\/shims:/} brew"' >> .bash_profile`
</code></pre>
再起動をして再度brew doctor

<pre><code>$ brew doctor
Your system is ready to brew.
</code></pre>

#####Warningを消し去ることができました!

###参考文献
http://www.task-notes.com/entry/20141223/1419324649
リモートデスクトップ接続時の認証エラー回避方法

リモートデスクトップ接続しようとしたところ、急に次のメッセージが表示され接続出来なくなった。
![error.png](https://qiita-image-store.s3.amazonaws.com/0/97774/a14cb989-dc7c-2642-3eef-66818fac1d80.png)

```
認証エラーが発生しました。
要求された関数はサポートされていません

リモートコンピューター: リモートホスト名
原因はCredSSP暗号化オラクルの修復である可能性があります。
詳細については、https://go.microsoft.com/fwlink/?linkid=866660を参照してください
```

メッセージを見てもいまいち何が原因なのか分からなかったが、ググったところ、どうも2018年5月のセキュリティ更新が原因である模様。
原理挙動は詳しく調べていないが、とりあえず保守できなくなって非常に困るのでパッとできる対応を行った。


## 手順
接続したい側のPCにてローカルグループポリシー(`gpedit.msc`)を開き、次の設定を行う。

* コンピューターの構成
    * 管理用テンプレート
        * システム
            * 資格情報の委任
                * 暗号化オラクルの修復: 有効/脆弱


セキュリティを強化するのは良いけど、こういう変更を急に突っ込むのやめて欲しい...


## 参考
https://blogs.technet.microsoft.com/askcorejp/2018/05/02/2018-05-rollup-credssp-rdp/
Nuxt2をローカルでテストするとnuxt_plugin_swplugin_*がないよと怒られる

## 前置き
チュートリアルにあるコマンドで生成したテンプレートにある、`yarn start`または、`npm run start`で開始するとlighthouseでpwaテスト時にエラーが出て発覚

一応コマンドの中身

```sh
cross-env NODE_ENV=production node server/index.js
```

```javascript:.nuxt/index.js
import 'es6-promise/auto'
import Vue from 'vue'
import Meta from 'vue-meta'
import { createRouter } from './router.js'
import NoSSR from './components/no-ssr.js'
import NuxtChild from './components/nuxt-child.js'
import NuxtLink from './components/nuxt-link.js'
import NuxtError from './components/nuxt-error.vue'
import Nuxt from './components/nuxt.js'
import App from './App.js'
import { setContext, getLocation, getRouteData } from './utils'


/* Plugins */
import nuxt_plugin_swplugin_708a52a3 from 'nuxt_plugin_swplugin_708a52a3' // Source: ./sw.plugin.js (ssr: false)
```
この```nuxt_plugin_swplugin_708a52a3```がないって怒られた。

## 解決策
https://pwa.nuxtjs.org/modules/workbox.html
pwaはworkbox(サービスワーカーをラップしたライブラリ)を使っていて、そこを辿ってたら、これじゃね？的な感じで発見した。
ですので、pwaテストをする場合は、`nuxt build && nuxt start`する必要がある

## 最後に
そもそも`nuxt_plugin_swplugin_708a52a3`とかの名前解決ってnuxtはどうやってるんだろう。。。？
[Google Maps Platform]既存サービスが2018年6月11日までにやらなければいけないことと新料金体系の比較


2018年5月3日に [Action Required] Important changes to your Google Maps APIs account のタイトルでメール通知があり、以下記事のアナウンスがありました。
[Introducing Google Maps Platform](https://mapsplatform.googleblog.com/2018/05/introducing-google-maps-platform.html?utm_source=em-anncmt&utm_medium=em&utm_campaign=fy18-q2-global-adhoc-email-cs-maps_none_maps_spicestandardplanwithbilling&utm_content=global%7Cen%7Chybr%7C%7C%7C%7C%7C%7C)

2018年6月11日からサービスが一新され、アカウントが紐付いてないAPIキーまたはAPIキーを利用してないアクセスはできなくなるとのことでした。

## 主な変更内容
・「Google Maps API」から「Google Maps Platform」に名称変更

・利用するにはAPIプロジェクトと課金アカウントの紐付けが必要

・料金体系は「標準プラン・プレミアムプラン」から単一のプランのみに変更
新プランでは月額200ドルまでの利用は無料

・18に分かれていたMapsAPIが3つのプロダクトに集約（Maps, Routes, Places）

## 既存サービスが2018年6月11日までにやらなければいけないこと
・移行ツールを利用して、APIプロジェクトと課金アカウントを紐付ける。
※ Google cloud platformでクレジット登録されている前提
※ 既存のAPIキーの値は変わらない

・既存のコードは改修の必要なくそのままで動作する。APIキーを利用しないアクセスは不可。

## APIプロジェクトと課金アカウントの紐付け手順
1.移行ツール（以下のURL）にアクセスする。
https://cloud.google.com/maps-platform/user-guide/

2.「Overview」内の「TRANSITION TOOL」ボタンをクリック

![trasitiontool](https://s3-ap-northeast-1.amazonaws.com/yrowqiita/trasitiontool.png)


3.別ページ遷移後、少し時間を置いた後、認証画面が表示され「AUTHORIZE」ボタンをクリック（すみませんスクショを撮り忘れました。）


4.利用中のAPIプロジェクトが並んで表示され、「Add Billing」ボタンをクリック
![trasitiontool1](https://s3-ap-northeast-1.amazonaws.com/yrowqiita/trasitiontool1.png)

5.「Add Billing」ボタンが「Check API Keys」ボタンに変われば完了
![trasitiontool2](https://s3-ap-northeast-1.amazonaws.com/yrowqiita/trasitiontool2.png)


## 新料金体系について
「[既存の料金体系](https://developers.google.com/maps/pricing-and-plans/)」 と 「[新しい料金体系](https://cloud.google.com/maps-platform/pricing/sheet/)」について、~~月額200ドルで、これまでの無料プランで利用できる範囲は変わらないか若干増えてる感じです。ただ無料枠を超えた場合の課金料金が高くなったようです。~~ これまで**無料で利用できたことが大幅に削減**されました。[料金ページのトップ](https://cloud.google.com/maps-platform/pricing/)（カルーセル部分）で200ドルでできることを紹介しています。

例）WebのDynamic Mapsは~~25,000回／月~~ 25,000回／日から28,000回／月に変わり、超過時の1,000回あたりの料金が0.5ドルから7ドルとなった。

**※記載内容が誤っておりコメントの指摘を受けて訂正しました。**

以下はMapsの新料金（他にRoutes, Placesがある）
![mappfpricing](https://s3-ap-northeast-1.amazonaws.com/yrowqiita/mappfpricing.png)

## 参考にした記事
[Google MapsがそのAPIの構成と課金方式を抜本的に変えて単純化、月200ドルぶんまで無料  |  TechCrunch Japan](https://jp.techcrunch.com/2018/05/03/2018-05-02-google-revamps-its-google-maps-developer-platform/)

[新しい Google Maps Platform では APIキーなしの呼び出しはサポートされなくなります](https://qiita.com/amay077/items/333a5bbf4e5fa52512fb)
kotlinのMapでハマったのでメモ

##結論

Kotlinでコレクションに対して.toMapを使うと単純な再帰処理より高度な操作ができる。

##経緯

kotlinで他人のコード見てたら見たこと無いMapの使い方を見たのメモ

```Kotlin
val users = listOf(User(id = 5, name = tanaka), User(id = 7, name = sato))
val usersMap = users.map { it.id to it }.toMap()
```

で型は

```Kotlin
Map<Int, User>
```
となりidが外に出るわけだけど今までmapをfor文の代わりにしか使ったことなかったので何のためにidを分けて使うのかわからなかった。

例えば1~100の間でidが連続していなかった場合デフォルトで用意したUserのデータを入れたい時

```Kotlin
listOf(1-100).map { id ->
  if (usersMap.get(id) == null) {
    defaultUser
  }
  usersMap.get(it)
}
```

といった具合にからのデータを挿入できる
for文で条件分けるよりスマートなはず

enumクラスでデフォルトのデータを用意していてユーザーからの入力がない場合にはこちらが用意したデータを挿入したい場合に結構使える
Laravel5.4コマンド集

# Laravelのコマンド一覧
趣味程度に入れているLaravelのコマンドを纏めています（備忘録的な意味も込めて。。。）

# Laravelプロジェクト作成
```
composer create-project laravel/laravel --prefer-dist project-name
```

# Artisan関連
## コマンド一覧
使えるコマンド一覧は下記でチェック

```
php artisan list
```

## Laravelバージョンチェック

```
php artisan --version
```

## マイグレーション
マイグレーションとは、データベースの定義ファイルから自動的にテーブル等を作成してくれること。
Laravelでも下記コマンドでマイグレーションやってくれるんですが、事前に定義ファイルを作成する必要がるのでお忘れなく。

```
php artisan migrate
```

ちなみに、既存のテーブル定義を更新する場合は以下でOK

```
php artisan migrate:refresh
```

既存のテーブル構造と整合性が取れない修正の場合はエラーになっちゃうので、その場合は一度DROP TABLEしてから試してみてください。
また、既存テーブル構造を変更してmigrate:refreshすると、レコードも初期化するので実行する際は注意してください


## Laravel内包のAuth機能作成

```
php artisan make:auth
```
Laravel内包のAuth（認証）機能を使う場合は、以下のコマンド一発で以下機能を作成してくれます。

- ログイン
- ログアウト
- パスワードリセット（メール送信）


## ルーティング確認

```
php artisan route:list
```

## コンフィグ更新

```
php artisan config:clear
php artisan config:cache
```

## 新規コントローラ作成

```
php artisan make:controller NewPagesController 
```

実行すると、**app/Http/Controllers/**　配下にコントローラが作成されます。


# 新規モデル作成

```
php artisan make:model NewModel
```

## マイグレーションファイル作成

```
php artisan migrate:make [file_name]
```

## マイグレーション実行

```
php artisan migrate
```

## マイグレーションのrollbackと実行を同時

```
php artisan migrate:refresh
```

## Composerの新規作成

```
php artisan make:provider ComposerSeriviceProvider
```

まだまだ追記途中なので、徐々に増やしていきます。。。
gmail > UI > 2018年5月11日現在の「新しいgmail」> 表示間隔 > 最小 > 有効になるのは横ピクセル 970以上? | naming:新しいXXX

```txt:動作環境
Windows 10 Pro (64bit) バージョン 1803 (April 2018 Update)
Google Chrome バージョン: 66.0.3359.170（Official Build） （64 ビット）
```

### 症状

2018年5月11日現在の「新しいgmail」のUI。

「表示間隔」を「最小」にしても１行表示にならない。

### 対処1 > ブラウザの横サイズを増やす (10ピクセル)

1920ピクセルの横幅のモニタで横2分割表示(960ピクセル）だと１行表示にならない。

横ピクセルを970程度以上にすると１行表示になる。
(10ピクセル程度増やす）

### 対処2 > 左上の「メインメニュー」ボタンを押す

左上にある「メインメニュー」ボタンを押す (横三本線のボタン。Gmailアイコンの左側に位置する)。
左メニューがアイコン表示になり、右側の一覧は１行表示になる。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c28679ad-2b31-8693-a24b-d007c0e641c0.png)


アイコン表示になった左メニューはマウスオーバーで展開表示される。

#### 1行表示と複数行表示の切替え > メインメニューボタン

メインメニューボタンをクリックすることで「1行表示」と「複数行表示」を切替えできる。

１行表示でタイトルが読めない時に複数行表示に変更。タイトル確認後に１行表示に戻す、といった操作が簡単にできる。


### レガシーモニタ?

1920ピクセルモニタでの横2分割表示は、新しいUIや新しいサービスでおざなりにされる傾向がある。

デザイナーがそういう視点を持たなくなっているのは残念でならない。

### naming

「新しいiPad」「新しいgmail」「新しいXXX」。

数か月後に新しくなくなる「新しい」namingは滅びるとよい。
さくらのレンタルサーバ、スタンダードプラン以上でパスワードなしの s{sh,ftp,cp} ログインさせる

パスワードなしの認証は、__危険💣__な場合があるので下記の手法にて起こりうる__障害や被害等、一切の関知をしない__ので、適応に際しては__自己責任の範疇__で行ってください。

この記事の利用想定としては、シェルスクリプト実行中に転送等をさせる事。

#🙋クライアント側の鍵作成
```sh
ssh-keygen -b 521 -t ecdsa -f .ssh/NoPass -P `` -C "ホスト名 作成年月日 コメントをここに書く"
```
* ssh-keygen で使ったスイッチの解説
<dl>
<dt>-b</dt><dd>生成する鍵のビット数を指定
2の二乗を指定(鍵の種類によっては固定長だったり二乗定数が指定できない)</dd>
<dt>-t</dt><dd>生成する鍵の種類を指定(rsa1,dsa,ecdsa,rsa等)</dd>
<dt>-f</dt><dd>鍵を格納するファイル名を指定</dd>
<dt>-P</dt><dd>パスフレーズを指定</dd>
<dt>-C</dt><dd>コメントを追加</dd>
</dl>
詳細は man を参照の事
[ssh-keygen(1)](http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=ssh-keygen&dir=jpman-9.1.2%2Fman&sect=0)

#🔏生成した公開鍵を当該サーバへ登録
ここで生成された、~/.ssh/NoPass.pub の内容を、パスワードなしでログインさせたいサーバの ~/.ssh/authorized_keys に追記する。

```sh
cat ~/.ssh/NoPass.pub | ssh "当該サーバ" 'cat >> ~/.ssh/authorized_keys'
```

#💻ログイン方法
ログインの際は秘密鍵ファイルを指定しないと、通常ログインしてしまうので注意。

```sh
ssh -i ~/.ssh/NoPass -l ユーザ名
scp -i ~/.ssh/NoPass /usr/local/share/certs/ca-root-nss.crt ユーザ名@www3***.sakura.ne.jp:
sftp -i ~/.ssh/NoPass ユーザ名@www3***.sakura.ne.jp
```

余談だが、さくら🌸のレンタルサーバ以外にも当然 ssh のシェルが解放されているサーバへは、同様の手順でパスワードなしのログインが可能🆗となる。
Conda環境をアクティベイトしたときに特定の処理を実行させる方法

# はじめに

Anaconda Pytonn を使っていて Conda環境を作成したときに、
そのConda環境をアクティベイトしたタイミングで、
環境変数を設定するといったように特定の処理を行ないたい場合があります。

この方法についての備忘録です。

# Condaのディレクトリ構造 

Anaconda Python を /home/iisaka/conda/x64 にインストールしたとすると、
次のようにディレクトリが展開されます

```shell
$ tree -L 1 /home/iisaka/conda/x64
/home/iisaka/conda/x64
├── bin
├── conda-meta
├── envs
├── etc
├── include
├── lib
├── LICENSE.txt
├── pkgs
├── share
└── ssl

9 directories, 1 file
```

## Conda環境のアクティベイト/ディアクティベイト

Conda環境を作成すると ${_CONDA_ROOT}/envs 以下に 環境名のディレクトリが作成されます。

```shell
$ conda create -y -n demo
```

Conda環境をアクティベイト/ディアクティベイトするタイミングで、
base環境にある activate と deactivate が実行されます。


このスクリプトは次のようになっています。


```shell
$ cat /home/iisaka/conda/x64/bin/activate
#!/bin/sh
_CONDA_ROOT="/home/iisaka/conda/x64"
\. "$_CONDA_ROOT/etc/profile.d/conda.sh" || return $?
_conda_activate "$@"
```


```shell
$ cat /home/iisaka/conda/x64/bin/deactivate
#!/bin/sh
_CONDA_ROOT="/home/iisaka/conda/x64"
\. "$_CONDA_ROOT/etc/profile.d/conda.sh" || return $?
_conda_deactivate "$@"
```

# Conda環境毎に処理を実行させるように修正

これを次のように修正すると、
${_CONDA_ROOT}/envs/環境名 以下の
/etc/activate.h と etc/deactivate.h が
アクティベイト/ディアクティベイトのタイミングで実行されるようになります。


```shell
$ cat /home/iisaka/conda/x64/bin/activate
#!/bin/sh
_CONDA_ROOT="/home/iisaka/conda/x64"
\. "$_CONDA_ROOT/etc/profile.d/conda.sh" || return $?
if [ -f "$_CONDA_ROOT/envs/$1/etc/activate.sh" ] ; then
  \. "$_CONDA_ROOT/envs/$1/etc/activate.sh" || return $?
fi
_conda_activate "$@"
```

```shell
$ cat /home/iisaka/conda/x64/bin/deactivate
#!/bin/sh
_CONDA_ROOT="/home/iisaka/conda/x64"
\. "$_CONDA_ROOT/etc/profile.d/conda.sh" || return $?
if [ -f "$_CONDA_ROOT/envs/${CONDA_DEFAULT_ENV}/etc/deactivate.sh" ] ; then
  \. "$_CONDA_ROOT/envs/${CONDA_DEFAULT_ENV}/etc/deactivate.sh" || return $?
fi
_conda_deactivate "$@"
```

# 制限事項

次のように環境変数を設定するときは注意が必要です。

```shell
$ cat /home/iisaka/conda/x64/envs/demo/etc/activate.sh
_SAVE_CUDA_ROOT=${CUDA_ROOT}
CUDA_ROOT=/usr/local/cuda-8.0
exoprt CUDA_ROOT
```

```shell
$ cat /home/iisaka/conda/x64/envs/demo/etc/deactivate.sh
if [ ${_SAVE_CUDA_ROOT} != "" ] ; then
    CUDA_ROOT=${_SAVE_CUDA_ROOT}
    exoprt CUDA_ROOT
    unset _SAVE_CUDA_ROOT
else
    unset CUDA_ROOT
fi
```

conda環境をアクティベイトするときに次の方法ではうまく処理できません。


```shell
$ conda activate demo
$ echo $CUDA_ROOT
```


source コマンドでアクティベイトするようにすると期待通りになります。

```shell
$ source activate demo
$ echo $CUDA_ROOT
/usr/local/cuda-8.0

$ source deactivate
$ echo $CUDA_ROOT
```
gmail > スヌーズアイコンが見えない > スレッド表示(Conversation View)をオンにした時だけ見える

```txt:動作環境
Windows 10 Pro (64bit) バージョン 1803 (April 2018 Update)
Google Chrome バージョン: 66.0.3359.139（Official Build） （64 ビット）
```

### 症状

[メールをスヌーズする](https://support.google.com/mail/answer/7622010?vid=0-74724191661-1526002656332)

上記に書いているスヌーズアイコンが表示されない。

### 情報

https://productforums.google.com/forum/#!topic/gmail/pVAbMtUAH6E
> You need to have Conversation View enabled, at this time.

バグでConversation Viewにしないと見えないとのこと。

Conversation Viewは「スレッド表示」のこと。

### 対処

1. gmailを開く
2. ギアマークを選択 (設定)
3. スレッド表示ONを選択
4. 設定を保存する

上記にてスヌーズアイコンが見えるようになった。

しかしながら、スレッド表示は自分の希望する動作でないので、この機能は使わないだろう。

### 検索用キーワード

- snooze
linuxでpyenvを使っていてgitkでUTF-8フォントを選択できずに文字化けする時の対処

# 背景

今までは問題になったことがなかったのだが，最近新しくpyenvで環境構築したanaconda3-5.1.0の下でgitkを起動したら，ロケールはUTF-8なのにマルチバイト文字が\uxxxみたいな文字列になってしまって表示できなくなった．

# 結論

wish が anaconda で入れられたものを使っていたため /usr/bin/wish が使われるように設定を変えたら直った．
具体的には``~/.pyenv/shims/wish``を``/usr/bin/wish``のシンボリックリンクで置き換えたらOK．

# 色々やったこと

色々調べてみると，gitkの中でwishを呼び出す部分が古いwishを呼び出している場合にフォントに影響があるという記事を見付けたので，これが何を指しているか調べてみることにした．
[gitk でアンチエイリアスの効いたフォントを \- mooz deceives you](http://d.hatena.ne.jp/mooz/20090816/p1)

```sh
grep wish $(which gitk)

    exec wish "$0" -- "$@"
    (後略)

which wish

    /home/USERNAME/.pyenv/shims/wish
```

こ の せ い か ！
shimsの下のwishも/usr/binのwishも同じ8.6ぽいんだけどな…と思いつつ/usr/binを使わせてみる．

```sh
PATH=/usr/bin:$PATH gitk
```

この時は，UTF-8対応フォントが選択され，マルチバイト文字が表示される．

anaconda3-4.4.0時代には少なくともwishなど入ってなかったので，こいつを消しても良いかどうか判別できず，とりあえずリネームして/usr/bin/wishへのシンボリックリンクを置いておくことにして解決した．

```sh
cd ~/.pyenv/shims
mv wish wish.orig
ln -s /usr/bin/wish
```
業務高速化計画１：「分からない言葉をブラウザで検索する」を高速化してみた

プログラミングをしていると、まだまだ初心者なので分からない単語がたくさん襲いかかってきます。

今回は、「分からない言葉をブラウザで検索する」の高速化について記します。


「分からない言葉をブラウザで検索する」手順はこちら
1. 分からない言葉をコピーする
2. 新しいタブを開く
3. 分からない言葉をペーストする
4. 検索する
5. タブを閉じる

です。

#業務高速化計画１：「分からない言葉をブラウザで検索する」を高速化してみた（Windows版）

手順通りにショートカットキーを紹介します。
4.検索するに関しては、ショートカットキーとかじゃないけど笑
この手順通りにやったら、知らない単語、意味を忘れた言葉とかを速攻で検索できます！！という意味です！！

| 手順       |      ショートカットキー | 
|:-------------------------|------------------:|
| 1. 分からない言葉をコピーする  | Ctrl + C|
| 2. 新しいタブを開く          | Ctrl + T |
| 3. 分からない言葉をペーストする| Ctrl + V|
| 4. 検索する             | Enter|
| 5. タブを閉じる          | Ctrl + W|



#業務高速化計画１：「分からない言葉をブラウザで検索する」を高速化してみた（Mac版）


手順通りにショートカットキーを紹介します。
もう一回いいますが、4.検索するに関しては、ショートカットキーとかじゃないけど笑
この手順通りにやったら、知らない単語、意味を忘れた言葉とかを速攻で検索できます！！という意味です！！

| 手順       |      ショートカットキー | 
|:-------------------------|------------------:|
| 1. 分からない言葉をコピーする  | Command + C|
| 2. 新しいタブを開く          | Command + T |
| 3. 分からない言葉をペーストする| Command + V|
| 4. 検索する             | Enter|
| 5. タブを閉じる          | Command + W|


です！
「検索する」のショートカットキーはEnterなんや！って思わないでくださいww
この手順でやったときに、Enterで検索できるっていうだけです。


#新しいタブを作る必要がない方はこちら
今のタブで検索したいという方もいらっしゃるでしょう。そのような方はこのショートカットキーがオススメです

URLとか表示されているところに移動するショートカットキー
Windows → Ctrl + L
Mac → Command + L

めっちゃ便利！！

初心者の人とかは、使ってみるといいと思います。
Set a filename alias in Azure Blob Service 

This article is a translation from https://qiita.com/kawasaki/items/918462f7d98fe61e3e61 .
***
# What I want to do is ...
to set a filename alias for a file stored in Azure Blob Service so that I can download the blob by an arbitrary name.

## Situation
* The target file is already stored in Azure Blob Service with the name "file1234"
* The file should be downloaded as "manual.pdf" 
* You cannot realize it through the Azure GUI interface as of May, 2018

## Code

```ruby
#!/usr/bin/env ruby

require "azure"  

Azure.config.storage_account_name = "myaccountname"
Azure.config.storage_access_key = "Rfof7hZYw7oj.......uKbI1nPGoUkc0yFvA=="

Azure::Blob::BlobService.new.set_blob_properties(
  "mycontainer", 
  "file1234",
  { blob_content_disposition: "attachment; filename=manual.pdf" }
)

```

## Explanation
- require "azure"  
Require Azure library provided by Microsoft. It's not included in the ruby standard library. So, you should install it before you call it by doing "sudo gem install azure" or writing a Gemfile and "bundle install"
- Two lines of Azure.config
are the necessary information to use Azure. "myaccountname" in the first line is the name you specified when you made the Blob service resource and the second line is your access key which you should keep secret and you can get it from the "Access keys" menu in your storage account.
- Azure::Blob::BlobService.new.set_blob_properties  
Set the property of the blob "file1234" in the target container "mycontainer". The information you specify here will be used in the Content-Disposition header in the HTTP response.

## Test environment (May 8, 2018)
|System or library  |Version  |
|---                |---:     |
|Ruby               |2.3.1    |
|azure (ruby gem)   |0.7.10   |
manの上位互換コマンド一覧(tldr/howdoi/how2)メモ

## tldr

コマンドのEXAMPLEがたくさん見れる

```
cd /usr/local/bin
sudo curl -o tldr https://raw.githubusercontent.com/raylee/tldr/master/tldr
sudo chmod +x tldr
```

```
tldr tar
```

## howdoi

StackOverflowを検索できる

```
sudo -HE pip install howdoi
alias h='function hdi(){ howdoi $* -c -n 5; }; hdi'
```

```
h tar
```


## how2

StackOverflowを検索できる
網羅的

```
sudo apt install npm -y
sudo npm install -g how2
```

```
how2 tar
```

SPACEとESCで操作する
macOSでC#の逆コンパイル

Windowsだと色々手段があるようですが、macOSでさくっとC#の逆コンパイルをする情報があまりなかったので、手順をまとめてみます。
[ILSpy](https://github.com/icsharpcode/ILSpy)というオープンソースの.Netアセンブリのデコンパイラを利用します。


##手順

###1.  .Net SDKのインストール
下記ページから.Net SDKをダウンロードして、インストーラを起動してインストール
https://www.microsoft.com/net/learn/get-started/macos


```bash
# シンボリックリンク
$ ln -s /usr/local/share/dotnet/dotnet /usr/local/bin

# 確認
$ dotnet -h
.NET Command Line Tools (2.1.200)
...
```

###2. ILSpyのインストール

```bash
$ git clone https://github.com/icsharpcode/ILSpy.git

$ cd ILSpy/ICSharpCode.Decompiler.Console/

# ビルド
$ dotnet publish -c release -r osx-x64

$ cd bin/release/netcoreapp2.0/osx-x64/publish/

# 実行権限をつける
$ chmod +x ilspycmd

$ cp -r ../publish/ /usr/local/opt/ilspycmd

$ ln -s /usr/local/opt/ilspycmd/ilspycmd /usr/local/bin/

# 確認
$ ilspycmd -h
```

###3. 実行
```bash
$ ilspycmd test.exe
```
逆コンパイルできた:tada: 

### 環境
macOS Sierra 10.12.5

### 参考
https://github.com/icsharpcode/ILSpy/tree/master/ICSharpCode.Decompiler.Console
https://qiita.com/koki_cheese/items/727577ab830a44050dcc
.appドメインはFirebase hostingとの相性が抜群


これまで作っていたアプリのLPは全てGithub Pagesにアップしていました。
先日Google domainsで `.app` のドメインが取得出来る様になったので自分のアプリのLP用に取得してみました。

## .appドメインとは

> 米Googleは2015年2月25日、インターネットドメイン監督団体ICANN（Internet Corporation for Assigned Names and Numbers）のgTLD（ジェネリックトップレベルドメイン）オークションで、当時のICANNオークション史上最高価格となる2500万1000ドル（約30億円）で、「.app」を落札

[引用](https://www.sankei.com/economy/news/180509/prl1805090026-n1.html)

3年前にGoogleが購入したしたアプリ関連に利用が可能なドメインらしいです。SSLの利用が必須という点が変わっていますね。

## Domainの取得方法

[Google domains](https://domains.google/)のサイトから欲しいドメインを検索します。

![14FB17AC-8E39-4522-B9D9-2E2B0BE2C482.jpeg](https://qiita-image-store.s3.amazonaws.com/0/2846/bb7db02a-d1a8-4d09-b225-ea361e9d1453.jpeg)


欲しいドメインがあれば購入フローに進みます。
ここは省略します。

![5E87FA9D-B201-4577-92D8-B0265649014D.jpeg](https://qiita-image-store.s3.amazonaws.com/0/2846/19addd55-f28f-8c20-d101-aeda926384b5.jpeg)

確認メールが届くので「メールアドレスを確認」をクリックする事でドメインの取得が完了します。

![F8DCC0F3-B962-4785-8AAE-457F7CC23A11.jpeg](https://qiita-image-store.s3.amazonaws.com/0/2846/230c5294-043f-6419-3a54-5b0e5d096bcd.jpeg)


## Firebase hosting

Firebase hostingは静的なHTMLをホスティング可能なFirebaseの機能の一種です。こちらを利用すると自動的にSSLに対応してくれます。（素晴らしい）
また、元々静的なHTMLしか配置出来ませんでしたが、[いつの間にかFirebase functionsにルーティング出来る様になっていました](https://firebase.google.com/docs/hosting/functions?hl=ja)。

## Firebase hostingにリソースをデプロイする

[公式のドキュメント](https://firebase.google.com/docs/hosting/quickstart?hl=ja)を見てもらうが一番良いかと思いますが、

```
npm install -g firebase-tools
```

で`firebase` コマンドをインストールした後でプロジェクトを作成します。

```
mkdir ./project
cd ./project
firebase init
```

どのプロジェクトを作成するか聞かれるので `Hosting` を選択して完了すると `firebase.json` ファイルと `public` ディレクトリが作成されているかと思います。コンテンツはこの中に作成していきます。

`firebase.json` はデフォルトのままだとこんな感じ

```
{
  "hosting": {
    "public": "public",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ]
  }
}
```

この状態で `firebase deploy` を実行するとFirebase上にアップロードが完了します。念のため `<YOUR-FIREBASE-APP>.firebaseapp.com` にアクセスして確認しましょう。

## Firebase hostingにドメインを設定する

Firebase hostingの画面から `ドメインを接続` を選択します。

![1FBCE82E-24EA-49C2-8940-C96D62F44985.jpeg](https://qiita-image-store.s3.amazonaws.com/0/2846/486c9273-ff01-584a-7aab-5d911eba8969.jpeg)


ドメインを入力するとDNSのAレコードに登録する値が指定されます。

![2AAA8E55-522B-46BB-BFAF-1E6F709378D2.jpeg](https://qiita-image-store.s3.amazonaws.com/0/2846/549462f5-4c93-f4af-fa61-20d9a2e02e46.jpeg)


## Google domainsにAレコードを登録する

![5B67A7CC-B37C-4178-ABB8-18ECCE60715C.jpeg](https://qiita-image-store.s3.amazonaws.com/0/2846/ff9e6239-5341-1b06-5b71-5bf2fd0f7a09.jpeg)


Custom resource recordsに先ほどFirebase hostingから指定された値をAレコードに登録します。

![5C9B1184-918E-4B1A-A3E7-24F1B571D77C.jpeg](https://qiita-image-store.s3.amazonaws.com/0/2846/13219160-c796-6e08-e2d5-610611227dcf.jpeg)


## 反映を待つ

ドメインとSSLが反映されるまで暫く待ちます。（昨日試した時はドメインは一瞬で反映されてましたが、SSLの反映までは2時間程待ちました。）

## 取得したドメイン

以前より開発している # TypeとWebCollector用にドメインを取得しました。  

- [https://type-markdown.app](https://type-markdown.app)
- [https://webcollector.app](https://webcollector.app)

です。

# まとめ

これといった難しい手順も無くGoogle domainsで取得したドメインがFirebase hostingで利用可能になりました。
SSLでの利用が必須という事で `.app` ドメインを利用するだけである程度セキュアだという事が担保されるのが個人的には素晴らしいなと思いました。
個人的には今後、Firebase hostingとFirebase functionsを連携して何か動的な機能を作ってみたいなと思いました。
PHP 配列関数を駆使してループを減らす

# 特定のキーの並びに変える
`array_fill_keys()`,`array_merge()`を使う。

```php
$keys = ["hoge", "hogehoge", "piyopiyo", "piyo"];
$keyArray = array_fill_keys($keys, null);
$tmp = [
    ["hoge" => 1, "piyo" => 2, "hogehoge" => 3, "piyopiyo" => 4],
    ["hoge" => 5, "piyo" => 6, "hogehoge" => 7, "piyopiyo" => 8],
];
$array = [];
foreach ($tmp as $val) {
    $array[] = array_merge($keyArray, $val);
}
print_r($array);
```

上記の出力結果

```
Array
(
    [0] => Array
        (
            [hoge] => 1
            [hogehoge] => 3
            [piyopiyo] => 4
            [piyo] => 2
        )

    [1] => Array
        (
            [hoge] => 5
            [hogehoge] => 7
            [piyopiyo] => 8
            [piyo] => 6
        )

)
```

DBから抽出したデーターをPHP側で並び替えたいときとかに使える

# 特定のキーの値のみ抽出
`array_fill_keys()`,`array_intersect_key()`を使う。

```php
$keys = ["hoge","hogehoge"];
$array = ["hoge" => 1, "piyo" => 2, "hogehoge" => 3, "piyopiyo" => 4];
$array = array_intersect_key($array, array_fill_keys($keys, null));
print_r($array);
```

上記の出力結果

```
Array
(
    [hoge] => 1
    [hogehoge] => 3
)
```

# 特定のキーの値のみ排除
`array_fill_keys()`,`array_diff_key()`を使う。

```php
$keys = ["hoge","hogehoge"];
$array = ["hoge" => 1, "piyo" => 2, "hogehoge" => 3, "piyopiyo" => 4];
$array = array_diff_key($array, array_fill_keys($keys, null));
print_r($array);
```

上記の出力結果

```
Array
(
    [piyo] => 2
    [piyopiyo] => 4
)
```

# 多次元配列を再構成
`array_keys()`,`array_fill_keys()`,`array_column()`を使う。

```php
$tmp = [
    ["hoge" => 1, "piyo" => 2, "hogehoge" => 3, "piyopiyo" => 4],
    ["hoge" => 5, "piyo" => 6, "hogehoge" => 7, "piyopiyo" => 8],
];
$array = array_fill_keys(array_keys($tmp[0]), null);
array_walk($array, function(&$val, $key, $tmp){$val = array_column($tmp, $key);}, $tmp);
print_r($array);
```

上記の出力結果

```
Array
(
    [hoge] => Array
        (
            [0] => 1
            [1] => 5
        )

    [piyo] => Array
        (
            [0] => 2
            [1] => 6
        )

    [hogehoge] => Array
        (
            [0] => 3
            [1] => 7
        )

    [piyopiyo] => Array
        (
            [0] => 4
            [1] => 8
        )

)
```

# emptyなものを排除
`array_filter()`を使う。

```php
$array = [0,"hoge",null,"piyo",""];
$array = array_filter($array);
print_r($array);
```

上記の出力結果

```
Array
(
    [0] => hoge
    [1] => piyo
)
```
git rebase時にマージコミットを保持する

単純に`git rebase branch`すると、現在のツリーにあるマージコミット(Merge commits)は消失してしまいます。これを避けるためには、`Preserve Merges`オプションを使います。

```
git rebase --preserve-merges {branch_name}
```

`-p` として省略することもできます。

```
git rebase -p {branch_name}
```

## マニュアルの引用

```
-p
--preserve-merges

Recreate merge commits instead of flattening the history by replaying commits a merge commit introduces. Merge conflict resolutions or manual amendments to merge commits are not preserved.

This uses the --interactive machinery internally, but combining it with the --interactive option explicitly is generally not a good idea unless you know what you are doing (see BUGS below).
```

```
マージコミットが導入したコミットを再生して履歴を平坦化するのではなく、マージコミットを再作成します。マージ競合解決またはマージコミットの手動修正は保存されません。

これは--interactive機構を内部的に使用しますが、--interactiveオプションと明示的に組み合わせることは、あなたが何をしているのか分からない限り、一般的には良い考えではありません（以下のバグを参照）。
```

## 参考

[git-rebase](https://git-scm.com/docs/git-rebase#git-rebase--p)
[Stack Overflow: Git: rebase merge commit
](https://stackoverflow.com/questions/17987873/git-rebase-merge-commit)
gmail > ヘルプフォーラム | 到着メールからフォーラムへの到達手順

gmailのヘルプフォーラム
https://productforums.google.com/forum/#!forum/gmail-ja

フォーラムに投稿するとそのメールが自分のアカウントに届く。
そのメールからはヘルプフォーラムへの直接のリンクは掲載されていない。

### 到着メールからフォーラムへの到達手順

メールからフォーラムへ移動するには以下の手順を必要とする。
1. 「このトピックの登録を解除するにはxxx」をクリック
2. 「トピックの登録を解除する」で「キャンセル」を選択
3. 「Gmailヘルプフォーラム」をクリック

### Qiita記事からフォーラムへの到達手順

1. 「gmail forum」で検索
2. この記事からフォーラムへ移動
VS Codeで言語に関する警告メッセージが出て一瞬びっくりした話

月初にVisual Studio Codeのv1.23がリリースされ（日本ではゴールデンウィーク中だというのに！）、リリースノートもひととおりチェックが終わったある日、いつものようにVS Codeを起動したら、見慣れないメッセージが表示された。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/1630f931-6b31-fc15-0fab-96d97ff1c067.png)

フワッ！？何だこれ？

とりあえず「[詳細情報](https://code.visualstudio.com/docs/getstarted/locales#_marketplace-language-packs)」とやらを見る。

リンクされている箇所はページの途中だったが、とりあえずページの先頭から見てみると、「VS Codeには10種類の表示言語（ロケール）が用意されていて、これらはVS Codeのダウンロードに含まれているから、追加でインストールとかは必要は無いっすよ。それ以外の追加の言語の場合は、マーケットプレイスから言語パック拡張機能をインストールする必要があるけどね。」と書かれている。

うんうん、そうだよね、日本語は今までずっと普通に使えてたから問題なし！

んじゃ、このメッセージは何？ウィルス？？そうか、とうとうVS Codeにもウィルスが出たか！などと思いつつ、元々リンクされていた箇所を読んでみると、「だけどね、今後は**すべての言語**を**マーケットプレイス言語パック**を通じて提供するように変更するよ！んで、将来的には製品内の言語を**削除**すっからよろしくね！（英語はデフォルトとして残すけど）」とのこと！

なるほどねー。
確かにv1.21の時に[言語パックがサポートされた](https://qiita.com/12345/items/71ce73c52cf2232fc10c#%E8%A8%80%E8%AA%9E%E3%83%91%E3%83%83%E3%82%AF)というのは聞いてたけど、それが全言語が対象になり、そして日本語の言語パックの準備ができたのであのメッセージが出たのかー。

ということは、将来的には、新規にVS Codeをインストールする際は、本体＋言語パックを入れないと日本語が表示されないということかー。うーん。

とりあえずインストールしておいた。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/4a4a1c13-7fe8-cd15-4e71-8121abdc2b59.png)
gitでリモートブランチをチェックアウトする方法


```
git checkout -b <ローカルに作りたいブランチの名前> <originから始まるブランチ名>
```

`-b`オプションはブランチの切り替えも同時に行う

リモート含めたブランチのリストは次のコマンドで出力できる

```
git branch -a
```

# 例
```
$git branch -a

  bugfix
  hotfix
* master
  hoge
  remotes/origin/add_menu
  remotes/origin/list_item
  
# この状況でリモートのlist_itemをチェックアウトしたい場合
git checkout -b list_item origin/list_item
```
pythonで音声処理

動画中の音声を編集するために音声を結合したり音量を調整したりする必要があったので、その時調べたことをまとめておきます。

python3.6 + pydub (+ffmpeg)を使っています。

# 動画から音声を抜き出す

これはffmpegを使いました。
pythonからffmpegを呼び出します。

```python

import os, sys
import subprocess

cmd = "ffmpeg -y -i {} -ab {}k -ac {} {}".format(input_file, bitrate, channnel, output_file)
resp = subprocess.check_output(cmd, shell=True)
```


# pydubを使う

ここからpydubを使って音声ファイルを編集します。
インストールは

```
$ pip install pydub
```
で入るから楽！

ただしffmpegが必要なので注意！



#### 音声を読み込む

```python

import pydub
from pydub import AudioSegment

base_sound = AudioSegment.from_file(input.mp3, format="mp3")  # 音声を読み込み
length_seconds = base_sound.duration_seconds  # 長さを確認
base_sound.export("./result.mp3", format="mp3")  # 保存する
```


####１部分を切り出す

```python

first_five_second = base_sound[:5*1000]
last_ten_second = base_sound[10*1000:]
```


#### 音を結合する

```
concated_sound = first_five_second + last_ten_second  # 元の音声の最初と最後を結合
```



#### 効果音をつける（音声を重ねる）

```python

effect_sound = AudioSegment.from_file(effect.mp3, format="mp3")  # 効果音を読み込み
start_time_ms = 5 * 1000  # 効果音を５秒時点から鳴らす
result_sound = base_sound.overlay(effect_sound, start_time_ms)  # ベースの音声に効果音をつける
```



#### 音量を変える

```python

loud_sound = base_sound + 6  # 音量を6dbだけ上げる
quiet_sound = base_sound - 10  # 音量を10db下げる
```


でも、普通「音量を４デシベル上げたい」ってよりは「音量を1.5倍にしたい」って感じじゃないでしょうか？（音声処理を専門でやっている方々は違うかもしれませんが...）

本当にこれでいいのかどうか自信がないので、詳しい方がいらっしゃいましたら教えていただけると嬉しいです。

```python

from pydub.utils import db_to_float, ratio_to_db
ratio = 0.8  # 0.8倍の音量にしたい
quiet_sound = base_sound + ratio_to_db(ratio)
```


これで本当にあっているのかどうか確かめるために、音量を確かめてみました。
でも、音量関係の指標もいくつかあって、

```python

base_sound.rms
base_sound.dBFS
base_sound.max
```

の３つを見つけました。
うーん、どれを参考にすればいいんだろ...


この辺りの話は全く知らなかったので調べてみたら、rmsは

ソース：http://sleepfreaks-dtm.com/dtm-mix-technique/level-metering/
> 簡単に言ってしまえば、平均的な信号レベルの大きさを表す指標ということになります。
> 実効値とも呼ばれ、単位は”dB”です。
> 音圧の大きさの指標として用いられることが多いように思います。

らしい。

そしてrmsってなんの略かと思ったら、機械学習をやっている人ならおなじみのRootMeanSquareの略でした！

ってことは、サウンド全体の平均的な音量を調節するにはこれを使えば良さそう！

自分が持ってる音楽で以下を試しました。

```python

delta = ratio_to_db(0.8)  # 音量を0.8倍にしたい
sound_quiet = sound_base + delta  # 音量を調節
result_ratio = sound_quiet.rms / sound_base.rms
print(resul_tratio)  # 0.7998836532867947が返ってきた
```

元のサウンドと比べてrms値がほぼ0.8倍になっているので、問題なしとします。

sound.maxの値を使って調整するやり方も考えられましたが、返り値の単位がよくわからないので却下。



# 最後に

pydubのソースコードをみてみたら、audioopというモジュールを使ったりして操作しているようです。
https://docs.python.jp/3/library/audioop.html

このあたりは時間があったら調べたい。
systemd-nspawnを使ってSolus on Fedoraを構築

# はじめに
技術書典4にてわかめそばさんが出されていたsystemd-nspawnに関する同人誌を参考に（ほぼコピ）して、Solus上にFedoraコンテナを構築した時のメモです。

# 構成
ホストOS：Solus 3.9995
コンテナOS：Fedora release 27 (Twenty Seven)

# 手順
## dnfのインストールとリポジトリの追加

```shell-session
# sudo epokg install dnf
# sudo mkdir -p /etc/yum.repos.d
# sudo vim /etc/yum/repos.d/fedora.repo
```

```/etc/yum/repos.d/fedora.repo
[fedora]
name=fedora
baseurl=http://ftp.jaist.ac.jp/pub/Linux/Fedora/releases/27/Server/x86_64/os/
enabled=1
```

## コンテナの作成
```shell-session
# sudo mkdir /var/lib/machines/fedora
# sudo dnf groupinstall core --nogpgcheck --installroot=/var/lib/machines/fedora
```

ログインしてrootのパスワードを設定

```shell-session
# sudo systemd-nspawn -D /var/lib/machine/fedora
$ passwd
```
コンテナ側のネットワーク周りの設定

```shell-session
$ echo 'pts/0' >> /etc/securetty
$ echo 'fedora-container' > /etc/hostname
$ systemctl enable systemd-network systemd-resolved
$ ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
$ echo 'DNS=8.8.8.8' >> /etc/systemd/resolved.conf
```

ここまでで外と疎通ができるようになっていはずなので、後は必要に応じてコンテナ上に環境を構築していけば良いかと思います。

# さいごに
## ネットワークについて
2018/05/09時点ではSolusはsystemd-networkに対応していないため、ホストとコンテナでインタフェースを共有するような構成しかできません。
macOS High Sierraでシステムダイアログ中に日本語と英語が混在するのを修正する方法

# はじめに

MacBook AirをHigh Sierraにして、概ね問題なく使っているのですが、いつの頃からログインやシャットダウンで、画面の表示が部分的に英語表記になるので、少し気になって修正方法を試したら修正できたのでメモします。

# Macの言語設定

ターミナルを起動し、以下のコマンドを実行。

```bash
sudo languagesetup
```

実行するとパスワードを求められるので、パスワードを入力すると言語の一覧が表示されます。

```bash
Password:
 1) Use English for the main language
 2) Utiliser le français comme langue principale
 3) Deutsch als Standardsprache verwenden
 4) 以简体中文作为主要语言
 5) 以繁體中文作為主要語言
 6) 主に日本語を使用する
 7) Usar español como idioma principal
 8) Usa l’italiano come lingua principale
 9) Gebruik Nederlands als hoofdtaal
10) 주 언어로 한국어 사용
11) Usar português do Brasil como idioma principal
12) Usar o português europeu como idioma principal
13) Brug dansk som hovedsprog
14) Käytä pääkielenä suomea
15) Bruk norsk som hovedspråk
16) Använd svenska som huvudspråk
17) Сделать русский основным языком системы
18) Użyj polskiego jako języka głównego
19) Ana dil olarak Türkçeyi kullan
20) استخدام اللغة العربية كلغة رئيسية
21) เลือกภาษาไทยเป็นภาษาหลัก
22) Vybrat češtinu jako hlavní jazyk
23) Magyar kiválasztása alapértelmezett nyelvként
24) Selecciona el català com a idioma principal
25) Odaberite hrvatski kao glavni jezik
26) Επιλέξτε Ελληνικά ως την κύρια γλώσσα
27) בחר/י עברית כשפה ראשית
28) Selectați româna ca limbă principală
29) Vybrať slovenčinu ako hlavný jazyk
30) Вибрати українську основною мовою
31) Gunakan Bahasa Indonesia sebagai bahasa utama
32) Gunakan Bahasa Melayu untuk bahasa utama
33) Sử dụng Tiếng Việt làm ngôn ngữ chính
34) Utilizar español de Latinoamérica como el idioma principal
 q) Quit
? 
```

日本語を設定するので、「6」と入力すると設定完了。

```
? 6
System Language set to: ja
```

ターミナルを終了し、再起動。

再起動後に、終了のダイアログを表示させてみるときちんと日本語になっていました。

![スクリーンショット 2018-05-11 6.05.05.png](https://qiita-image-store.s3.amazonaws.com/0/114240/1436a931-d4b3-8248-454d-3d9dea92a8c9.png)

できた！

# 追記

どうもこの操作はmacOSのアップデートをする度に実施しないといけないみたい...(-_-;)
Json.NETの操作メモ

覚え書き

## オブジェクトをJSONデータにシリアライズ

```c#
JsonConvert.SerializeObject(objectData);
```

## JTokenをJSONデータにシリアライズ

```c#
jToken.ToString();
```

## JSONデータをパースして、指定した型のオブジェクトに変換
ここでは`Dictionary<string, JToken>`に変換してみます

```c#
JsonConvert.DeserializeObject<Dictionary<string, JToken>>(json);
```

## JTokenを指定した型のオブジェクトに変換
ここでは`Dictionary<string, JToken>`に変換してみます

```c#
jToken.ToObject<Dictionary<string, JToken>>();
```
Juliaでインタラクティブプロット(Slider編)

本稿ではJuliaによるmatplotlibを使ったインタラクティブプロット(Slider編)について紹介します．
基本的には本家サイトにあるmatplotlib.widgetsのサンプルソースの移植版です．

```julia:slider_demo.jl
#Translated from python to julia (reffer to https://matplotlib.org/examples/widgets/slider_demo.html)
#Julia v0.6.2
#PyCall v3.6.4

using PyCall
using PyPlot

const Slider = matplotlib[:widgets][:Slider]
const Button = matplotlib[:widgets][:Button]
const RadioButtons = matplotlib[:widgets][:RadioButtons]

fig, ax = subplots()
subplots_adjust(left=0.25, bottom=0.25)
t = 0.0:0.001:1.0
a0=5
f0=3
s = a0*sin.(2*π*f0*t)
l, = plot(t,s,lw=2,color="red")
axis([0, 1, -10, 10])

axcolor = "lightgoldenrodyellow"
axfreq = axes([0.25, 0.1, 0.65, 0.03], facecolor=axcolor)
axamp = axes([0.25, 0.15, 0.65, 0.03], facecolor=axcolor)

sfreq = Slider(axfreq, "Freq", 0.1, 30.0, valinit=f0)
samp = Slider(axamp, "Amp", 0.1, 10.0, valinit=a0)

function update(val)
  amp = samp[:val]
  freq = sfreq[:val]
  l[:set_ydata](amp*sin.(2*π*freq*t))
  fig[:canvas][:draw_idle]()
end
sfreq[:on_changed](update)
samp[:on_changed](update)

resetax = axes([0.8,0.025,0.1,0.04])
button = Button(resetax,"Reset",color=axcolor,hovercolor="0.925")

function reset_(event)
  sfreq[:reset]()
  samp[:reset]()
end
button[:on_clicked](reset_)

rax = axes([0.025, 0.5, 0.15, 0.15], facecolor=axcolor)
radio = RadioButtons(rax, ("red","blue","green"), active=0)

function colorfunc(label)
  l[:set_color](label)
  fig[:canvas][:draw_idle]()
end
radio[:on_clicked](colorfunc)

show()
```

![スクリーンショット 2018-05-10 22.40.41.png](https://qiita-image-store.s3.amazonaws.com/0/256319/778573ee-9cac-898f-bcf0-96d839c2499f.png)
【Ruby・Rails】三項演算子アレルギーが1分で解消した。+便利な使い方

#三項演算子という言葉にアレルギーがあったがそんな難しい話ではなかった

こんなやつ。

```ruby:三項演算子
params[:remember_me] == '1' ? remember(user) : forget(user)
```


## 三項演算子の中で何が起きているか
これって、

```ruby:三項演算子じゃなく書いた場合

if 条件
  結果1
else
  結果2
end
```
というのを以下のように書いただけ。

```ruby:三項演算子

条件 ? 結果1 : 結果2
```

### つまり



```ruby:

params[:remember_me] == '1' ? remember(user) : forget(user)


#コメントで教えてもらったのですが、カッコをつけたら見やすいです。
(params[:remember_me] == '1') ? (remember(user)) : (forget(user))

#↑↑↑この上下が全く同じ。↓↓↓

if params[:remember_me] == '1'
  remember(user)
else
  forget(user)
end
```

## 便利な使い方

###①値を代入する時に、三項演算子を使う。
```ruby
  if boolean?
    var = '値1'
  else
    var = '値2'
  end
```
三項演算子を使うと、上のコードは以下のようになる。

```ruby

  var = boolean? ? '値1' : '値2'
```

###②三項演算子をメソッドの戻り値にする。

```ruby

  def foo
    do_stuff
    boolean? ? "値1" : "値2"
  end
```

### 参考
感謝します！！
[【Ruby・Rails】三項演算子(条件演算子）を使ってif文をスリムに書こう！](https://qiita.com/lasershow/items/160c854e4256ba596ec5)
Juliaでインタラクティブプロット(Rectangle Selector編)

本稿ではJuliaによるmatplotlibを使ったインタラクティブプロット(Rectangle Selector編)について紹介します．
基本的には本家サイトにあるmatplotlib.widgetsのサンプルソースの移植版です．

```julia:rectangle_selector.jl
#Translated from python to julia (reffer to https://matplotlib.org/examples/widgets/rectangle_selector.html)
#Julia v0.6.2
#PyCall v3.6.4

using PyCall
using PyPlot
const RectangleSelector = matplotlib[:widgets][:RectangleSelector]

function line_select_callback(eclick, erelease)
    #eclick and erelease are the press and release events
    x1 = eclick[:xdata]
    y1 = eclick[:ydata]
    x2 = erelease[:xdata]
    y2 = erelease[:ydata]
    @printf "(%3.2f, %3.2f) --> (%3.2f, %3.2f)" x1 y1 x2 y2
    @printf " The button you used were: %s %s" eclick[:button] erelease[:button]
end

function toggle_selector(event)
    println("Key pressed.")
    if event[:key] in ["Q", "q"] && toggle_selector[:RS][:active]
        println("RectangleSelector deactivated.")
        toggle_selector[:RS][:set_active](false)
    end
    if event[:key] in ["A", "a"] && !toggle_selector[:RS][:active]
        println("RectangleSelector activated.")
        toggle_selector[:RS][:set_active](true)
    end
end

fig, current_ax = plt[:subplots]()                 # make a new plotting range
N = 10                                       # If N is large one can see
x = 0:0.01:N

plt[:plot](x, sin.(.2*π*x), lw=3.5, c="b", alpha=.7)  # plot something
plt[:plot](x, cos.(.2*π*x), lw=3.5, c="r", alpha=.5)
plt[:plot](x, -sin.(.2*π*x), lw=3.5, c="g", alpha=.3)

@printf "\n click  -->  release"

# drawtype is 'box' or 'line' or 'none'
RS = RectangleSelector(current_ax,
                        line_select_callback,
                        drawtype="box",
                        useblit=true,
                        button=[1, 3],
                        minspanx=5,
                        minspany=5,
                        spancoords="pixels",
                        interactive=true)
connect("key_press_event", toggle_selector)
show()
```

![スクリーンショット 2018-05-10 22.36.24.png](https://qiita-image-store.s3.amazonaws.com/0/256319/bdd5a9f9-3c45-b7aa-0c6d-2e5992460088.png)
Railsチュートリアルでログアウトするときのuser.rbとsession_helperとsession_controllerの役割と何を書くべきか

## モデル、コントローラー、コントローラのヘルパーがそれぞれ何をしたいのか混乱したのでまとめ

## やりたいこと
ログアウトした時にcookieの情報を削除するが、
その際のそれぞれのファイルの役割についてまとめ。
(Ruby on Railsチュートリアル 9.1.3 ユーザーを忘れる)


## それぞれに何を書くべきか

**user.rb(モデル)**
DB更新系

**session_helper**
コントローラーに書くとゴチャゴチャするメソッドをまとめる。

**session_controller**
このルーティングで何をしたいのかを明確、簡潔に書く。
中身はヘルパーへgo

※間違っている可能性大なので、
ご指摘ある方是非コメントでお願い致します。


##それぞれの中身

### user.rbの役割

DB上のユーザの持つセッション情報をnilに更新する。

```ruby:user.rb
# ユーザーのログイン情報を破棄する
  def forget
    update_attribute(:remember_digest, nil)
  end
```

### session_helperの役割

Session_helperは
以下の2つで、session_controllerがdestroyした時にメソッドをまとめて呼べるように準備する

```ruby:session_helper.rb
# 永続的セッションを破棄する
  def forget(user)
    user.forget
    cookies.delete(:user_id)
    cookies.delete(:remember_token)
  end

  def log_out
    forget(current_user)
    session.delete(:user_id)
    @current_user = nil
  end
```

### session_controllerの役割

このルーティングにより何をしているのかを明確に示す。
ログアウトしてルートへ飛ぶということのみを記載し、他のゴチャゴチャはhelperに任せる。

```ruby:session_controller.rb

  def destroy
    log_out
    redirect_to root_url
  end
```
Tkinter を初めて使ってみた

# Tkinter とは？

簡単に言えば，Python を使った GUI 構築ツール，と考えていたら良いと思います．

# 空の画面を表示する

まずは，空の画面を表示してみます．

```python3:test1.py
import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.pack()

root = tk.Tk()
root.title("Title")
root.geometry("150x100")
app = Application(master=root)
app.mainloop()

```

# Hello World! を出力

次にターミナルの画面上に Hello World! と表示させるボタンを作ります．

```python3:test2.py
import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.pack()
        self.create_button()

    def create_button(self):
        self.button = tk.Button(self, text="click\nme", command=self.func)
        self.button.pack(side="top")

    def func(self):
        print("Hello World!")

root = tk.Tk()
root.title("Title")
root.geometry("150x100")
app = Application(master=root)
app.mainloop()
```

まだまだ，簡単にしか触れていないですが，
今後また発展させていきたいです.
GitHub flavored markdown をローカルでプレビューする

[Grip](https://github.com/joeyespo/grip) を使う.

1.  Grip をインストール.

    ```sh
    # using pip
    $ pip install -U grip

    # using brew
    $ brew install grip
    ```

2.  プレビューする markdown ファイルを指定して HTTP サーバーを起動.

    ```sh
    $ grip /path/to/foo.md
    ```

3.  ブラウザで `http://localhost:6419/` にアクセスしてレンダリング結果を確認する.
Rails Gems　簡易紹介

Rolify ・・・ 権限管理。どのモデルがどのコントローラーでどの操作をしていいのかを指定できる

Pundit ・・・　リソースに対して、誰が許可されるのかを指定できる

Cancancan ・・・　ユーザに対して、どんなアクションが許可するかを定義する

Rails_admin ・・・管理画面作成
https://qiita.com/baban/items/f751fb05c4d2367878aa

aasm　・・・オブジェクトの状態遷移管理、ステートマシンパターンを追加させてくれる
　　　　[ステートマシンパターンとは]（http://www.techscore.com/tech/DesignPattern/State.html/）
→要はメタプログラミング

enumerize　・・・モデルでenumを使えるようにする
[enumとは](https://www.sejuku.net/blog/26369)

active_model_specilizers　・・・API作成でJSONで返すとき、いらないパラメーターをレスポンスで制御できる。

pg ・・・データベースがpostgreで必要なもの

kaminari ・・・ページネーション機能

carrierwave ・・・画像をアップロード（imagickのインストールが必要)

fog　・・・画像アップロードに必要

mechanize　・・・スクレイピングができるようになる。
Juliaでインタラクティブプロット(Radio Button編)

本稿ではJuliaによるmatplotlibを使ったインタラクティブプロット(Radio Button編)について紹介します．
基本的には本家サイトにあるmatplotlib.widgetsのサンプルソースの移植版です．

```julia:radio_buttons.jl
#Translated from python to julia (reffer to https://matplotlib.org/examples/widgets/radio_buttons.html)
#Julia v0.6.2
#PyCall v3.6.4

using PyCall
using PyPlot

const RadioButtons = matplotlib[:widgets][:RadioButtons]

t = 0.0:0.01:2.0
s0 = sin.(2*π*t)
s1 = sin.(4*π*t)
s2 = sin.(8*π*t)

fig, ax = subplots()
l, = ax[:plot](t, s0, lw=2, color="red")
subplots_adjust(left=0.3)

axcolor = "lightgoldenrodyellow"
rax = axes([0.05, 0.7, 0.15, 0.15], facecolor=axcolor)
radio = RadioButtons(rax, ("2 Hz", "4 Hz", "8 Hz"))

function hzfunc(label)
    hzdict = Dict("2 Hz"=> s0, "4 Hz"=> s1, "8 Hz"=> s2)
    ydata = hzdict[label]
    l[:set_ydata](ydata)
    draw()
end
radio[:on_clicked](hzfunc)

rax = axes([0.05, 0.4, 0.15, 0.15], facecolor=axcolor)
radio2 = RadioButtons(rax, ("red", "blue", "green"))

function colorfunc(label)
    l[:set_color](label)
    draw()
end
radio2[:on_clicked](colorfunc)

rax =axes([0.05, 0.1, 0.15, 0.15], facecolor=axcolor)
radio3 = RadioButtons(rax, ("-", "--", "-.", "steps", ":"))

function stylefunc(label)
    l[:set_linestyle](label)
    draw()
end
radio3[:on_clicked](stylefunc)

show()
```

![スクリーンショット 2018-05-10 22.34.19.png](https://qiita-image-store.s3.amazonaws.com/0/256319/bacf019b-3569-dc69-0b96-41e2563804a4.png)
ド文系がMecabをMacに入れてみた

こんにちは、文系です。
卒論のために形態素解析を試してみたかったのでMecabとやらを入れてみました。
自分が使っているのはMacで、Pythonを使ってみたかったのでバインディングもしました。

今日は、

- Mecabのインストール
- NEologdのインストール
- デフォルト辞書の変更
- Pythonへのバインディング

について書いていきます。
導入記事はいろいろあるけど、私は初歩的なところも理解がなくつまづいたので、かなり優しく記録を残しておこうと思った次第です。

##前提
Python3とHomebrewはインストール済み

##Mecabのインストール

```shell
$ brew install mecab #このあといろいろ始まる
$ mecab -v #インストールできているか、バージョン確認する
mecab of 0.996

$ brew install mecab-ipadic #基本となる辞書をインストールする
$ ls /usr/local/lib/mecab/dic #辞書が入ったか確認する
ipadic
```

##NEologdのインストール
NEologdって、新語や固有名詞を幅広くカバーしている辞書らしい。
例えば、先程入れたipadicのままだと

```shell
$ mecab
よつばとは最高
よ	助詞,終助詞,*,*,*,*,よ,ヨ,ヨ
つば	名詞,一般,*,*,*,*,つば,ツバ,ツバ
と	助詞,格助詞,一般,*,*,*,と,ト,ト
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
最高	名詞,一般,*,*,*,*,最高,サイコウ,サイコー
EOS
```

となるところ、NEologdを使うと

```shell
$ mecab
よつばとは最高
よつばと	名詞,固有名詞,一般,*,*,*,よつばと,ヨツバト,ヨツバト
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
最高	名詞,一般,*,*,*,*,最高,サイコウ,サイコー
EOS
```
となる。
それでは入れ方。

```shell
$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git #NEologdの素材をダウンロード
$ cd mecab-ipadic-neologd #上記でダウンロードしたフォルダに移動
$ ./bin/install-mecab-ipadic-neologd -n -a　-y #インストール
$ ls /usr/local/lib/mecab/dic #辞書が入ったか確認する
ipadic			mecab-ipadic-neologd
```

##デフォルト辞書の変更
今のままではデフォルトがipadicのままなので、NEologdに変更する。

```shell
$ open /usr/local/etc/mecabrc #Mecabのデフォルトの設定ファイルを開く
```
テキストエディタなどで開かれたファイルの5行目あたりにある
`dicdir =  /usr/local/lib/mecab/dic/ipadic/`
を
`dicdir =  /usr/local/lib/mecab/dic/mecab-ipadic-neologd/`
とすると、デフォルトで使われる辞書がNEologdになる。

##Pythonへのバインディング
```shell
$ which pip #pipどこですか
/Library/Frameworks/Python.framework/Versions/2.7/bin/pip #ここです
$ which pip3 #pip3どこですか
/Library/Frameworks/Python.framework/Versions/3.6/bin/pip3 #ここです
```
Python3に繋がっているのはpip3だと分かったので、
`$ 　pip3 install mecab-python3　`
とうつと、PythonからMecabが使えるようになる。
Pythonを開いて、以下のように実行してみてバインディングが成功したか確認する。

```python
>>>import MeCab
>>>m = MeCab.Tagger()
>>>print(m.parse("よつばとは最高"))
よつばと	名詞,固有名詞,一般,*,*,*,よつばと,ヨツバト,ヨツバト
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
最高	名詞,一般,*,*,*,*,最高,サイコウ,サイコー
EOS
```

##参考
・https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md
・兄

文系ならサイトとかを活用するのもありだったが、自分で出来たほうが面白そうと思ったので挑戦してみた。これからもがんばる。
Scrapboxで使えるTeX記法まとめ(目次)

#はじめに
Scrapboxでは**TeX記法**を利用して数式を挿入することができます。
TeX記法のなかでなにが使えるか分からないので、個人的にまとめたいなあと思ってまとめました。**使えることが確認できているものを中心にまとめようと思います。**

このページに書いてないものに関しては、**使えないとみなしていますが**、TeXが得意なわけではないので、**抜けている部分があるかもしれません。**
カテゴリ検索と頭文字検索で探せるようにしました。
下の目次から飛べるようになっています。

さすがにTeX記法を頭文字でまとめたページを乱立させると探すのに大変なので、処置としてこのページにてまとめようと思います。
#お知らせ
カテゴリ検索が尋常じゃない重さのため、
カテゴリごとにページを分けることにします。
暫しお待ちを。

大括弧の仕様変更を受け、各記事の記述をそれに対応しました。
これできるようになったよ等のご報告はコメントでお待ちしてます。

KaTeXで書かれていることを最近知ったので、後日新しい記事を作成すると思います。
その際はよろしくお願いします。



#新しい記事できました
[Scrapboxで数学のノートを(TeX記法で)書く](https://qiita.com/yuki_shipcat/items/92c1ffb44f973bd6cfe6)


#カテゴリ検索
**非常に重いですので、ご注意ください！！！**
[Scrapboxで使えるTeX記法まとめ(カテゴリ検索)](https://qiita.com/yuki_shipcat/items/82e474d55abb4a20b23c)
[Scrapboxで使えるTeX記法まとめ(更新版)](https://qiita.com/yuki_shipcat/items/bb7afb8d53b8d3bd9c13)
**※現在更新が滞っています。上記の数学ノートを書く記事を参照してください！**
#文字検索
[A～B](https://qiita.com/yuki_shipcat/items/adc616bfe75813800c0d)
[C～D](https://qiita.com/yuki_shipcat/items/e5e357d4ac18c38a5225#_reference-f2900710d2a87a291a6c)
[E～G](https://qiita.com/yuki_shipcat/items/2771b2eadf226e3f23de)
[H～K](https://qiita.com/yuki_shipcat/items/ad4716498bfe322b362b)
[L](https://qiita.com/yuki_shipcat/items/5a7b97c2697dd45699a3)
[M～N](https://qiita.com/yuki_shipcat/items/26ad63b16eb2d630ca6f)
[O～Q](https://qiita.com/yuki_shipcat/items/61270932be2359a02276)
[R～S](https://qiita.com/yuki_shipcat/items/a497aa41e4c260f31899)
[T～Z](https://qiita.com/yuki_shipcat/items/946721d752dd1c1d04f0)
[記号](https://qiita.com/yuki_shipcat/items/770e15735d625f326316)

#さいごに
まじめな話、こんなページ作って馬鹿じゃないのと思いました。
時間の無駄すぎてどうしようもないですね。
ですが、何かに役立てられればと思います。


#参考
TeX tutrial
https://www.tutorialspoint.com/tex_commands/index.htm

#更新履歴
(2018/5/11 2:00)A～B完了
(2018/5/11 15:00)C～D完了
(2018/5/12 2:00)E～F完了
(2018/5/12 15:00)G～K完了
(2018/5/12 23:00)L完了
(2018/5/13 1:00)M～N完了
(2018/5/13 1:30)O～Q完了
(2018/5/13 2:40)R～S完了
(2018/5/13 3:30)T～Z完了
(2018/5/13 4:10)文字検索完了
(2018/5/13 20:30)カテゴリ検索完了
(2019/3/26 23:50)大括弧の仕様変更を反映
(2019/5/28 22:00)更新版の作成
(2019/5/30 0:20)数学のノートを書くための記事ができました
Alfredの「Bookmark検索」が便利すぎて、Bookmark整理を辞めた件

# 概要
Alfred 3.5からBrowser Bookmarksという機能がつきました。
というよりは元からあった機能だけども、ブックマークの検索として独立して切り離されたようです。
https://www.alfredapp.com/help/features/bookmarks/

これを設定することでランチャーからブックマークを検索してブラウザで開くことができるようになります。

# 設定方法
## Alfred 3.5未満であればバージョンアップ
「Check for update」からv3.5以上にアップデートしてください。

## Alfredの設定
画像の通り「Freatures->Web Bookmarks」を開き、ブラウザとしてChromeを使ってる方はSourcesの「Google Chrome Bookmarks」のチェックボックスをオンにする。これだけです。
<img width="1212" alt="スクリーンショット 2018-05-11 1.13.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/63214/0d97f61c-a2c5-3e26-e840-7e517f0aa379.png">


# 使い方
chromeのブックマークがランチャーから検索できるかを試すため、テストとしてQiitaのトレンドのページをブックマークバーに入れました。
<img width="1197" alt="スクリーンショット_2018-05-11_1_18_18.png" src="https://qiita-image-store.s3.amazonaws.com/0/63214/18345265-2826-7532-a6dd-e57ecda9a9a9.png">

この状態でランチャーから「qiita」と入力すると、ブックマークバーに登録されたQiitaトレンドが検索に引っかかりました。
あとはこれを選択すればブラウザ上でページが表示されます。
<img width="674" alt="スクリーンショット 2018-05-11 1.21.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/63214/251302b3-9932-1942-f74d-9a0098433e03.png">

# まとめ・感想
Alfred 3.5からBrowser Bookmarksの機能を紹介しました。

この機能を使うまではブックマークに律儀にサイトの種別でフォルダを作って整理をしていました。
ただ、その運用だとこのサイトはどのフォルダに入れようと悩んだり、実際にそのサイトを開こうとすると、あれ？あのサイトどこのフォルダに入ってたっけ？ということが時々ありました。

ランチャーからの検索が使えるようになってから、これらの悩みがほぼ解消されて非常に快適になったので、ブックマークをよく使う方には是非オススメします。
C++でvectorを参照渡し

#C++でvectorを関数に参照渡しをする

```cpp:Box.hpp
/* 中略 */
void Hotaru::hitBox(vector<Box> box, int index) {
    for (int i = 0; i < box.size(); i++) {
        if (index == i) {
            box.erase(box.begin() + i);
        }
    }
}
```

静的配列なら配列名を渡すとメモリ上の配列の先頭アドレスを渡します。
なので関数で値を変更すると本体の配列の値も変更されます。

vectorでも同じなのだろうと思い上記のコードを実行して見ると、boxを渡した元の関数内では値が変更されませんでした。

どうやらboxの値の変更を呼びたし元に反映させるには参照渡しを使うべきだそうです。
実際のコードが以下の通りです（1文字しか変わっていませんが）

```cpp:Box.cpp
/* 中略 */
void Hotaru::hitBox(vector<Box>& box, int index) {
    for (int i = 0; i < box.size(); i++) {
        if (index == i) {
            box.erase(box.begin() + i);
        }
    }
}
```
引数の部分を

```
vector<Box>& box
```

に変更します。
C++の「参照渡し」を使います
こうすることで関数内の変更が呼び出し元のvector自体にも反映されます。

C++のポインタ、参照渡し、値渡しについてはこちらの方が詳しく説明してくださっていたので載せておきたいと思います
[C++ 値渡し、ポインタ渡し、参照渡しを使い分けよう](https://qiita.com/agate-pris/items/05948b7d33f3e88b8967)