OmniAICreator/Qiita-1.07M huggingface dataset:
この不親切な手順に救援を　其の２

KB4074588 の被害に遭われた方が多いと思います。
Ask CORE のブログで対処方法が出ていましたが
オフラインでの対応手順をバッチ化してみました。

やり方は
①　インストールメディアをＵＳＢメモリで作成。
　　※ ８ＧＢでＯＫ。
　　※ インストール先と同じＯＳで同じビット数で作成。
② 「Z.cmd」と「C:\Windows\system32\CHOICE.exe」をＵＳＢメモリのルートにコピー。
　　※ コピー先は、Setup.exe のある所です。
③　ＵＳＢメモリで起動して、言語選択画面で Shift + F10 を押します。
④　コマンドプロンプトが表示されたら「Ｄ：￥ｚ」（半角）と入力後、Ｅｎｔｅｒ。
　　バッチが起動しなかったら「Ｅ：￥ｚ」、「Ｆ：￥ｚ」、「Ｇ：￥ｚ」のように
　　ドライブレターを変更して実行して下さい。
⑤　バッチが起動したら、ＯＳのドライブを聞かれるので「Ｃ」等を入力。
⑥　パッケージが表示され、アンインストールを聞かれるので
　　目的のパッケージが表示されるまで毎回「Ｎ」を押し、最後に「Ｙ」を押す。
⑦　全パッケージの表示が終わると、シャットダウン等を聞かれるので「Ｓ」を押す。

更新プログラム適用後、USB デバイス（キーボード及びマウス）が使用できなくなる事象について
https://blogs.technet.microsoft.com/askcorejp/2018/02/23/usb_device_problem_after_update/

```bat:z.cmd
@echo off
SetLocal EnableDelayedExpansion

powercfg /? > nul 2> nul && call powercfg /s 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c

CLS
echo;★ ★ ★ 適用されたアップデートをアンインストールする （要：CHOICE.exe） ★ ★ ★
echo;
echo; Windows のあるドライブを探しています・・・
echo;

            Set        "Select_Drive= "
for                   %%D in ( C D E F G H I J K L M N O P Q Q S T U V W   Y Z ) do (
   if      exist      %%D:\ (
       if      exist "%%D:\Windows\system32\cmd.exe" (
              echo;【 %%D 】ドライブに cmd.exe が在ります。多分、これが OS の ドライブかも。
       )
       Call Set         Select_Drive=%%Select_Drive%%%%%%D
   )
)

echo;
echo;  [C,D,E]? のような選択肢が表示されたら
echo;
echo;  C を選択する場合、「 C 」キーだけ押して下さい。
echo;

"%~dp0choice"       /c %Select_Drive% /m "　OS のドライブを指定して下さい "
Call Set OSのドライブ=%%Select_Drive:~!errorlevel!,1%%

echo;
echo;適用されたアップデートを探索しながら選択してアンインストールします。
echo;
echo;  パッケージが表示されたら
echo;
echo;  アンインストール しない 場合、[ N ] キーだけ押す。もしくは６０秒待つ。
echo;
echo;  アンインストール  する  場合、[ Y ] キーだけ押す。
echo;

                                    Set Image-and-Scratch=/Image:%OSのドライブ%:\ /ScratchDir:%OSのドライブ%:\
for /f "delims=" %%0 in         ('Dism %Image-and-Scratch% /Get-Packages') do (
        set  Msg=%%0
   if      "!Msg:~0,11!"=="パッケージ ID : "                                         set "PackageID=!Msg:パッケージ ID : =!"
   if      "!Msg:~0,16!"=="リリースの種類 : Update" (
       "%~dp0choice" /c YN /t 60 /d N                                              /m "　!PackageID!  を アンインストールしますか "
       echo;
       if      !ERRORLEVEL! EQU 1 Dism %Image-and-Scratch% /Remove-Package /PackageName:"!PackageID!" & echo;
   )
)

"%~dp0choice" /c SRT /m "探索終了。この後どうする？ シャットダウン：S、再起動：R、取り合えずこの処理を終わる：T "

if      !ERRORLEVEL! EQU 1                          Wpeutil         Shutdown
if      !ERRORLEVEL! EQU 2                          Wpeutil                    Reboot
```
![z.png](https://qiita-image-store.s3.amazonaws.com/0/98441/b5d22e3d-a459-0ed4-c39b-0f3ae1910481.png)
DI(DependencyInjection)の旨味を知る

DI... 🤔
この言葉聞いてわかります？

ググっても、依存注入... 🤔
最近の`Android`では`Dagger2`を利用したりしてこの依存注入を行っています。

Android developer公式（https://developer.android.com/training/dependency-injection）

今回は`Dagger`の説明ではなく、そもそもDIって実際どんなものなの？という人に向けて説明していければと思います。

今回はそんなDI(DependencyInjection)について以前投稿した[MVVMの旨味を知る](https://qiita.com/pfavill/items/9f0ac7627d454fe7fead)の記事みたいにさらっと書いて行こうと思います。

# 旨味

* クラス間を疎結合にできる 🚀
* テストしやすくなる 🚀

DIは依存注入なのですが少し付け加えると**外部から今まで依存して困っていたものを注入できる**
なんか言い方が痔の薬見たいですね笑

## 例

### DI 無
>**取り外し不可**のバッテリーで動くロボット🤖を想像してください。
このロボットはバッテリーに依存しているといえます。
この場合、もっと強力なバッテリーに交換しようにも交換することができません。
全部分解してバッテリーを取り外しすしか🤮

### DI 有
>**取り外し可能**のバッテリーで動くロボット🤖を想像してください。
ロボットに違うバッテリーを入れて動くか試したい。
このロボットはバッテリーが取り外し可能なため、違うバッテリーに差し替えて**テスト**が簡単👍

## プログラム

ではコードに書く際の考え方を見てみます。
少し説明がごちゃごちゃしてきてしまうので図を作ってみました。

![DI.001.png](https://qiita-image-store.s3.amazonaws.com/0/73994/6fad126a-8287-4c7b-472e-dea0b278fcd1.png)

大体こんな感じで捉えて貰えばいいでしょうか。

>今まで`ClassA`の中でたてられていた`ClassB`のインスタンスを`Constructor` or `Setter`経由でもらう事で外部から注入することができるようになりました。

こうすることで外から自由にインスタンスを渡せるので動的に変更できるという利点があります。
それによって、クラス間が疎結合となりテストなどもしやすくなります。🤩

以上です。
初心者がVBAを1週間使ったから学んだことを書いてみる

#　１週間ほどVBA使ったから初歩的なことまとめておく
上記の見出しの通り、１週間ほどVBAを扱いました。
まったくエクセルすら使ったことがないエクセル初心者です。
初心者とは言っても仕事で扱うため土日で以下の参考書でお勉強をしました。
[世界でいちばん簡単なExcelVBAのe本[最新第2版]ExcelVBAの基本と考え方がわかる本](https://www.amazon.co.jp/exec/obidos/ASIN/4798028673/gene320-22/)
この参考書は、図解等で重要な点を分かりやすくまとめています。
大変読みやすく分かりやすいため、初心者にはおすすめできる参考書だと思います。

## VBAの基礎

**１．変数の定義**

```vb:変数定義.xlsm
Dim <変数> As <データ型>
```
これで変数が定義できます。
データ型を一部抜粋し、以下に記載しておきます。
本当に極僅かですが・・・。

Integer, Long　・・・整数型
Double, Single ・・・小数点が扱える
String　 　　　 ・・・文字列
※データ型に関しては後で編集する際に詳しく追記するかもしれません。

**２．コメントアウト**

```vb:コメントアウト.xlsm
Dim xMen     As String   'X-MENは正義のヒーロー
Dim Bikinman As String   'バイキンマンはアンパンチされる役
Dim Satoshi  As String   'ポケモンの主人公であり、マサラ人
```
コメントアウトは『 ' 』(Shift + 7)でできます。
コーディングの際に変数の意味やメソッドの意味をコメントして残したいと思うことも多くありました。コメントのないソースを読んで理解するのは大変です。
読む人のためにコメントを残してあげましょう。

**３．条件分岐**

```vb:条件分岐.xlsm
Dim num As Integer
num = 10

'============If文============
If num = 10 Then
    'num = 10 の場合はIf～End Ifの間の処理を実行
End If

'=========If Else文==========
If num > 10 Then
    'num > 10 の場合はIf～Elseの間の処理を実行
Else
    'num > 10 の場合はElseからEnd Ifの間の処理を実行
End If

'==========IfElse文==========
If num > 10 Then
    'num > 10 の時はIf～ElseIf処理を実行します
ElseIf 5 <= num And num <= 10 Then
    '5 <= num And num <= 10 の時は
    '1つ目のElseIf～2つ目のElseIfの間の処理を実行します
Else
    '変数numが上の2つの条件に当てはまらない場合
    'Else～End Ifの間の処理を実行します
End If
```

IF文は**Ifで始まりEnd Ifで終わる**という決まりがあります。
**If 条件　Then**
で条件と合致した場合はIF文の中を処理してくれると覚えておけば初心者の場合はOKです。
**ElseIf**は条件を細かく設定して処理を行えると覚えておけば大丈夫だと思います。

**４．繰り返し処理**

```vb:繰り返し処理For文.xlsm
Dim i   As Integer  '繰り返し変数
Dim sum As Integer  '総和を格納する変数

'sumの初期化
sum = 0

'1～10までの総和を求める
For i = 1 To 10
    'For～Nextの間に書かれている処理を繰り返します！
    sum = sum + i
Next
```
上記のプログラムは、１～１０までの数値の総和を求めるプログラムになっています。
For文は記述する際に、**ForとNextで繰り返したい処理をサンドイッチする**という決まりがあります。
『i = 1 To 10』は**変数 i に１～１０までの数字を順番に代入する**役目になっています。
そのため、上記のプログラムでは**For～Nextの間の処理を10回行う**プログラムになっています。

では、次のFor文ではどのようなループをするでしょうか？

```vb:繰り返し処理For文.xlsm
Dim i   As Integer  '繰り返し変数
Dim sum As Integer  '総和を格納する変数

'sumの初期化
sum = 0

'1～10までの総和を求める
For i = 1 To 10 Step 2
    'For～Nextの間に書かれている処理を繰り返します！
    sum = sum + i
Next
```
ひとつ前のプログラムと違うところは**Step 2**がFor文の条件の後ろに指定されているところですね。勘の良い人ならなんとなく気づいていると思いますが、 
『i = 1 ⇒ 3 ⇒ 5 ⇒ 7 ⇒ 9』と、一番最初に変数 i に代入される**i = 1から2つ飛ばしに数値が代入**されています。
簡単に言うと、条件で使用される変数をStepで指定した数値の間隔で、変数に格納されるみたいです。

#最後に
VBAは学んで1週間のひよっこです。
至らない点も多々あると思います。
何か間違い等の不備がある場合は、指摘いただけると幸いです。
こんなひよっこが、このような場所でアウトプットをした理由として、以下の理由があります。
私は2017年9月に新卒で現在の会社に入社しました。
研修は無く、即客先に飛ばされ、自社の上司からも基礎的なことすら教えてもらいない状況です。少しでも、右も左も分からない方への手助けになれたらと思い、こちらの記事を書きました。
VBAはもう少し学んだこともあるため、2つくらい記事を書く予定です。
[Python] 開発用ローカルサーバをそのまま運用にしちゃう超簡単サーバ

# 背景
Pythonには、ワンライナーで開発用ローカルサーバを立ち上げるコマンドがあります。

```py
#ワンライナーで以下を実行。（python3の場合）
python -m http.server 8000
#補足：python2の場合は以下
python -m SimpleHTTPServer 8000
#終了時は、ctrl + c で停止
```

ブラウザから「 http://localhost:8000 」にアクセスすれば、
起動ディレクトリの中身またはIndex.htmlを返します。

ここまで、またはコレをスクリプト化する程度までは、
多数の諸先輩の記事があるのですが、
今回は、このまま簡単な運用可能サーバにしてしまおう、というテーマです。


# 本投稿の内容

 本投稿は、内部サーバなど軽度なもので良い場合に、
 python http.server をそのまま簡単なサーバとして公開するTips ＆ スクリプトです。
 
 * コンソールを終了するとサーバも終了、にならないようにする。
 * 起動ログ/アクセスログをファイル出力する。（アクセス状況を知りたい）
 * WindowsとLinuxどちらでも動くようにして、Windowsでの味見も可能にする。
 * cronなどからの呼び出しにも対応しやすいようにする。

 
# 起動コマンドのTips
運用はlinux上で行うことを想定しています。
コンソールやsshを終了するとサーバも終了、ということにならないように、
以下のような形で起動することが一つのTipsです。
（pythonスクリプトファイル名を「http_server.py」とします。）
以下のようにnohupをつけて起動してください。バックグラウンド実行されます。

```shell-session:起動方法
nohup python http_server.py &
```

```shell-session:停止方法
#python http_server.py のプロセス番号を見つける
ps -ef | grep http
#見つけたプロセス番号をkillする
kill 99999(上記で見つけたプロセス番号)
```

# アクセスログ付、簡易公開用スクリプト
Python3系のコードです。
運用に乗るように、cron起動、windowsとの共通コード、
アクセスログや起動ログの出力、などの様々な小さな工夫をしています。
詳細はコードのコメントをご参照ください。コメントを除けば短いコードです。
内部利用のためのサーバなど、簡単なサーバはこれで十分でしょう。
アクセス数なども後で解析出来るため、ログの出力は特にオススメです。
POSTに対応することもできますが本投稿の趣旨と外れるため割愛します。

```py:http_server.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
from datetime import datetime
from http.server import HTTPServer, SimpleHTTPRequestHandler

#このpyファイルが存在するディレクトリパスを取得します。
#ファイル出力先を絶対パスにすることで、cronからの実行時などにも対応しやすくなります。
script_dir = os.path.abspath(os.path.dirname(__file__))

#本来はログのローテ等を考えるべきですが、簡易サーバなので、
#起動時の日付をファイル名にして、そのファイルにログを書き続けます。
#適宜リブート運用をすれば、１ファイルが超重くなることは避けられます。
#また、Windows,Linuxどちらの環境でも動くように、ファイルセパレータは「os.path.sep」で扱います。
logfilename = script_dir + os.path.sep + 'log_httpserver_' + datetime.now().strftime("%Y%m%d") +'.log'

#ログ出力を簡単に行うため、標準出力の情報を全てログに追記(a)出力することにします。
buffer = 1
# 通常のprintログなどの出力はstdoutです。
sys.stdout = open(logfilename,"a",buffer)
# 127.0.0.1 - - [23/Feb/2018 12:47:09] "GET / HTTP/1.1" 200 - などのアクセスログはstderr側に出力されます。
sys.stderr = open(logfilename,"a",buffer)

#自分自身で試す場合など他者にアクセスさせない場合は、localhostで起動しましょう。
#空白にすれば、ドメイン名やIPアドレスなどで他のマシンからアクセスできます。
#host = 'localhost'
host = ''
port = 8000
httpd = HTTPServer((host, port), SimpleHTTPRequestHandler)

#サーバ起動時のログを出力
print(' === Server Start!! === ', datetime.now().strftime("%Y/%m/%d %H:%M:%S") )
print('serving at port', port)
print('logfile = ' + logfilename)

#実際にサーバを起動します。
try:
    httpd.serve_forever()
except:
    print(' === Server Stopped === ', datetime.now().strftime("%Y/%m/%d %H:%M:%S") )

```



以上
"Symbol not found: _PyUnicodeUCS2_AsASCIIString"エラーの解決法

## 状況

TensorFlowの学習済みモデルをCoreML用のモデルに変換するツール[tfcoreml](https://github.com/tf-coreml/tf-coreml)をインストールし、実行しようとすると下記のようなエラーに遭遇しました。


```
(tensorflow_coreml) $ python converter.py 
```

> ImportError: dlopen({path-to-tensorflow}/lib/python2.7/site-packages/tensorflow/python/_pywrap_tensorflow_internal.so, 6): Symbol not found: _PyUnicodeUCS2_AsASCIIString


tensorflowのimportに失敗してるようなので、確認してみます。

```
(tensorflow_coreml) $ python
```

```
>>> import tensorflow
```

結果は同様のエラー。

ちなみに上記環境でのpythonバージョンは`2.7.11`です。

python `3.5.x`で同様の手順をやってみたところ、`import tensorflow`は動作しました。ただし、tf-coremlでは[3.xはサポートされてない](https://pypi.python.org/pypi/tfcoreml/0.1.1)ので、**2.xで動かす必要**があります。


## 解決法

"Symbol not found: _PyUnicodeUCS2_AsASCIIString"でググってみて出てくるラインナップを見ると、tf-coremlの問題というよりも、**macOS 10.13 High Sierraの問題**のようです。

[この回答](https://github.com/pyenv/pyenv/issues/518#issuecomment-199827456)を見て、以下を実行しました。

```
$ CFLAGS="-I$(brew --prefix readline)/include -I$(brew --prefix openssl)/include" \
> LDFLAGS="-L$(brew --prefix readline)/lib -L$(brew --prefix openssl)/lib" \
> PYTHON_CONFIGURE_OPTS=--enable-unicode=ucs2 \
> pyenv install -v 2.7.11
```

あれやこれやオプションをつけてpyenvの`2.7.11`をインストールし直してるようです。

このpyenv環境下でもう一度TensorFlowのインストールからやり直すことで、先ほどのimportが通るようになり、tfcoremlも入れ直して動くようになりました。
AWS SDK for PHPのドキュメント(日本語)が一部誤ってるくさいので正しいやり方載せときますね

# やりたいこと
S3のバケットから複数のオブジェクトを削除したい by PHP

# 参照したドキュメント
これ↓
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/DeletingMultipleObjectsUsingPHPSDK.html
→latestって書いてあるから多分古いドキュメントではないと思う。

# やり方

###誤
ドキュメントに書いてあったやり方。

```PHP
// ファイルのパスを取得して
$keys = $s3->listObjects(array('Bucket' => $bucket))
    ->getPath('Contents/*/Key');

// これで取得出来るらしい
$result = $s3->deleteObjects(array(
    'Bucket'  => $bucket,
    'Objects' => array_map(function ($key) {
        return array('Key' => $key);
    }, $keys),
));
```
やってみたけど、何度やっても引数間違ってんでオマー！って怒られる。。

###正
エラーメッセージとソースコード見て原因探ってったら`'Delete'`ってゆーキーが必要だったらしい。

```php
$s3->deleteObjects(array(
  'Bucket'  => $bucket,
  'Delete' => [
     'Objects' =>
         array_map(function ($key) {
             return array('Key' => $key);
         }, $keys)
  ]
));
```

ちなみに、上記の$keysはS3上のファイルパスの配列。

英語のドキュメントには`'Delete'`ってゆーキーがあった。

気をつけんとね。
ブレンダーのビルドです。

![11.PNG](https://qiita-image-store.s3.amazonaws.com/0/238380/474be9e4-cc2f-1d81-bf63-56ec854622d2.png)
分かる方、お願いします。

一応、3DCGソフトのブレンダーをdlすることは出来たのですが
今度はCMakeのConfigure をクリックしますのところで
エラーが発生して作業が止まってしまいました。

Generating done という文字が表示されれば
プロジェクトファイルの作成に成功していますとのことなのですが

エラー表示が出てしまいまして中断してしまった状態です。
バージョンのミスマッチか何かでしょうか。

詳しく分かる方、よろしくお願いします。
railsのDBをMySQLに変更する④～RailsのDBを途中からMysqlに変更するには～

##環境
□OS:Windows10 home
※bash on ubuntu on windows
□旧DB：SQLite
□新DB：Mysql5.7

##手順

####①Gemfileの編集
GemfileにMysql2を追加する

```
gem 'mysql2'
```

####②データベースの設定ファイルを編集する

```database.yml
  adapter: mysql2
  encoding: utf8
  database: TWINS_COM
  pool: 5
  username: root
  password:
  host: localhost
```


####③bundle installを実行

```
$ bundle install
```


####④データベース作成

````
$ bundle exec rake db:create
$ bundle exec rake db:migrate
```

これで変わった。
pythonプログラマ限定　特許等の知財についての質問があれば答えるよ　その2

弁理士のcofです。
弁理士は、知財（知的財産）の専門家です（弁理士法1条)

知的財産権とは、特許、意匠、商標、著作その他の権利で、要はソースコードやらアルゴリズム等、頭を使って生まれた何かを守る制度です。
おそらくプログラマの方は結構これらの知財の恩恵に授かる立場にいると思うのですが、私の実感として知財は蔑ろにされているような印象も受けます。あまりこのような状態は良くないと思います。そういう背景もあって、今回も、プログラマの方がなにか疑問な点を持っていれば弁理士の立場からできる限りの範囲でお答えしたいと思います。
若干文章はかたいものの、私本人は非常に柔らかいので、何かご質問があればご遠慮なくコメントにてご質問ください。
railsのDBをMySQLに変更する③～mysqlコマンドでCan't connect to local MySQL server through socketエラー～

##環境
□OS:Windows10 home
※bash on ubuntu on windows
□Mysql5.7

##経緯
以前Windows環境でMysqlをインストールし、エラーを解消して繋がるようになったのだが、PC再起動で再度同様のエラーが出るようになったため、Mysqlの再インストールを行った。

##手順
しかし、再インストールをした。
インストール手順はこちらを参考にした。
http://d.hatena.ne.jp/hilapon/touch/20160622/1466566221


Mysqlのサービスは問題なくstartしたが、mysqlの起動確認をしたらエラー発生した。

```
$mysqladmin ping

mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through socket '/var/run/mysql/mysql.sock' (2)'
Check that mysqld is running and that the socket: '/var/run/mysql/mysql.sock' exists!
```


ソケットがないと言われているのでソケットファイルを作ってみた。

```
$touch /var/run/mysql/mysql.sock
```

しかし、最後の(2)が(111)に変わっただけで同様のソケットが繋がらないエラーのまま。

```
$mysqladmin ping

mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through socket '/var/run/mysql/mysql.sock' (111)'
Check that mysqld is running and that the socket: '/var/run/mysql/mysql.sock' exists!
```


次のコマンドでMysqlのソケットの参照ファイルを開き、『mysql』となっていた文言を『mysqld』に変更した。

```
$sudo vi /etc/mysql/my.cnf
```

```my.cnf
[client]
socket=/var/run/mysqld/mysqld.sock
[mysqld]
socket=/var/run/mysqld/mysqld.sock
```


Mysqlの起動を確認したら、繋がっていることが確認できた。

```
$mysqladmin ping

mysqld is alive'''
資料作りのためのmatplotlib入門(2) 2次元contour図

前回:https://qiita.com/Bluepost59/items/f2b0a1a8449440de6a1b

前回に引き続いて、今度はcontour図の書き方を概説しようと思う。


![contour.png](https://qiita-image-store.s3.amazonaws.com/0/107045/394686bb-961d-8a29-df12-58bd8d8761b1.png)

図：contour図の例

#想定しているデータ形式
x,yの2次元系の温度分布のようなデータをカラーでプロットする場合を考える。たとえばfortranで出すとしたら、次のようなコードで出力されたものを考える。

```fortran
do i = 1,Nx
   do j = 1,Ny
      write(UNITNUM,*) i,j,A(i,j)
   end do
end do
```
この場合、出力されるデータの並びは次のようになる。

```
1 1 0.000
1 2 1.000
...
1 10 0.424
2 1 0.242
...
10 10 0.551
```
(10というのは適当に決めました)

# データの整列
loadtxtで読むところまでは前回と同じだが、今回は3列であり、その上データの並びも折り返しを含むややこしい形になっている。

##必要なデータ
contour図のプロットには、<b>同じサイズを持つ</b>3つの2次元NumPy配列が必要である。

* 各メッシュの横軸の値のリストx（同じ行では同じ値となる）
* 各メッシュの縦軸の値のリストy（同じ列では同じ値となる）
* 各メッシュのプロットしたい量の値のリストz

（[参考サイト](http://d.hatena.ne.jp/y_n_c/20091122/1258904025) にわかりやすい図がある。）

このうち前の2つx,yは、1次元リストから生成するためのメソッドが用意されている。そのため基になる1次元リストを生成しなければならないが、方法としては

* サイズを用いてリスト内包表記などで抽出する
* ```Numpy.linspace```を使う

などがある。

得られた1次元リストをpcolorメソッドで使えるような形にするには、numpyのmeshgridメソッドを使う。

```x,y = np.meshgrid(x,y)```

##リストの整列
zはloadtxtした時点では1列に並べられているため、```numpy.reshape```を用いて適切なサイズにしたのち、場合によっては転置する必要がある。

先の例ではzはyがny個書き出され、それをnx回折り返している。そのため列数がnyとなり、そのため<b>サイズは(nx,ny)とする</b>。

ただしプロットするデータは行がy、列がxに対応している。そのため<b>行列を転置する必要がある</b>。

## pcolorとcontour
今回作るのはcontour図なので、直感的には「前回はpyplot.plotとしたところをpyplot.contourとするとよい」と思われる。ただし、contourは等高線をつないだ図になるので、カラーバーが不連続になってしまう。

そのため、gnuplotのpm3dに対応する連続的な温度図のようなものを出すにはpyplot.pcolorを使う。

#サンプルスクリプト

https://gist.github.com/Bluepost59/1f844f0aa9914b2b622c192e5c969edc

```python:contour.py
import numpy as np
import matplotlib as mpl
mpl.use('Agg')
import matplotlib.pyplot as plt

nx = 100
ny = 200

mydata = np.loadtxt('mydata.txt')
xx = np.linspace(0,nx,nx)
yy = np.linspace(0,ny,ny)

xx,yy = np.meshgrid(xx,yy)

zz = mydata[:,2].reshape(nx,ny).T

myfig = plt.figure()
myax = myfig.add_subplot(1,1,1)

myim = myax.pcolor(xx,yy,zz)
myfig.colorbar(myim)

myfig.savefig('contour.png')
```

#参考サイト
* http://d.hatena.ne.jp/y_n_c/20091122/1258904025<br>メッシュの構造が分かりやすく解説されている。
ビットコインのヒストリカルデータ（1分毎）の取得

#はじめに
　今更ながらですが、ビットコインの価格をディープラーニングを用いて予測しようと思います。また、対象にビットコインを選択したのは以下の理由です。

 - マーケットデータが安価に手に入ること（例えば、株価を予測しようとすると、株価だけではなく他の情報も必要となります。その情報はBloombergなどの情報ベンダから買う必要があります）
 - ファンダメンタルズ等の価格以外の情報が少ないこと（センチメントなどの情報は必要だと思いますが、一応今回の予測では対象に含めない予定です）
 - 話題性があること（いい意味でも、悪い意味でも）

この投稿ではまずはデータの取得から始めたいと思います。

#目次
1. ティックデータの取得
2. ティックデータの1分毎の終値への変換

# 1.ティックデータの取得
　JPYBTCのヒストリカルデータ（1分毎）は簡単に手に入るだろうと思っていましたが、そう簡単にはいきませんでした。そもそも過去の情報を提供していなかったり、過去の情報が取得できるAPIを提供している取引所でも、実際に取得できるのは日次などの間隔が大きい場合がほとんどです。
　また、[cryptowatch](https://cryptowatch.jp/)は1分毎のデータが実際に取得できるのですが、チャートに見えている以上過去のデータは取得できないらしく、1週間前のものは取得できません。
　データが1週間もないとなるとかなり問題で、オーバーフィッティングしてしまう可能性もありますし、そもそものデータの信頼性の問題もあります。
　そこで、以下のサイトで過去からの膨大なティックデータを発見したので、それを処理して1分毎のデータに変換することを考えます。

https://api.bitcoincharts.com/v1/csv/

# 2. ティックデータの1分毎の終値への変換
　以下のコードによりティックデータから1分毎の終値のデータを生成します。期間を2月からとしているのは、2月以前はかなり不安定な動きをしていたので、とりあえずは省いています。

```python
import pandas as pd
from datetime import datetime, timedelta

filename = 'bitflyerJPY.csv'
header = ['timestamp', 'price', 'volume']
df = pd.read_csv(filename, names = header)
df = df.drop(['volume'], axis=1)
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='s')
df_2 = pd.DataFrame()
start_date = datetime(2018, 2, 1)
n_date = 30

for i in (start_date + timedelta(minutes = x) for x in range(60 * 24 * n_date)):
    df_2 = df_2.append(df.loc[(df['timestamp'] > i).idxmax()], ignore_index=True)
    df_2.iat[-1, 1] = i

df_2 = df_2.set_index('timestamp')
df_2.to_csv('bitflyerJPY_2.csv', index=True)
```

上記のプログラムを実行後、4時間くらいで（もっと効率の良い書き方があれば教えてください）
以下のように1分ごとの終値を取得することができました。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/230223/e78fdf11-ff2e-1782-2ace-d35600bd0db0.png)

以上です。
ThinkPad X1 Carbon にハードディスクパスワードを設定して指紋で認証する

![thinkpad-setup-security-password.png](https://qiita-image-store.s3.amazonaws.com/0/67627/ced3f43a-a2a9-7d4b-80d6-c0c9760fd531.png)

ThinkPad X1 Carbon にハードディスクパスワードを設定して指紋で認証する方法をメモっとく。[ThinkPad X1 Carbon で Red Hat Enterprise Linux のインストーラーを起動する](https://qiita.com/takuya0301/items/0570001e8d6da621326a)の番外編。

盗難・紛失などによる情報漏洩リスクを考えるとハードディスクパスワードを設定しておいた方がいい。
また、ThinkPad X1 Carbon ではハードディスクパスワードと指紋を関連付けることができるので、普段は指紋認証をすることでパスワード入力は不要にできる。

# 指紋を登録する

プリインストールされている Windows 10 で指紋を登録する。
残念ながら BIOS から設定することはできない。
公式のドライバーはないようなので Red Hat Enterprise Linux から設定することもできなさそう。

# ハードディスクパスワードを設定する

1. ThinkPad X1 Carbon を起動する
2. ロゴ画面で F1 キーを押下する
3. ThinkPad Setup が起動したら、Security を選択して Enter を押下する
4. Security のタブに切り替わったら、Password を選択して Enter を押下する
5. Password の内容に切り替わったら、Hard Disk1 Password を選択して Enter を押下する
6. Setup Confirmation のダイアログが表示されたら、User を選択して Enter を押下する
7. Hard Disk1 Password のダイアログが表示されたら、パスワードを入力して Enter を押下する（記号はパスワードの文字として使用できないようなので注意する）
8. Setup Notice のダイアログが表示されたら、Enter を押下する
9. Setup Notice のダイアログが閉じたら、F10 を押下する
10. Setup Confirmation のダイアログが表示されたら、Yes を選択して Enter を押下することで ThinkPad Setup を終了する

これで起動時にハードディスクパスワードの入力が求められるようになる。ハードディスクパスワードを失念すると起動できなくなるので注意して設定すること。

# ハードディスクパスワードと指紋認証を関連付ける

1. ThinkPad X1 Carbon を起動する
2. 指紋認証を求めるプロンプトが出たら指紋をスキャンする
3. ハードディスクパスワードを入力する

これで次回起動時からは指紋認証によってハードディスクパスワードの入力がスキップされるようになる。

---

ThinkPad X1 Carbon にハードディスクパスワードを設定して指紋で認証する方法を説明した。セキュリティ強化のためにもぜひ設定してみてほしい。

# 参考文献

https://download.lenovo.com/pccbbs/mobiles_pdf/x1_carbon_5th_ug_ja.pdf
pyenvでinstallしたanacondaをpycharmで使うための設定

# やりたいこと
pycharmでコード書くにあたり、
pyenvでインストールしたanacondaを使いたかったんだけど、
anacondaに入ってるはずのモジュールをimportしようとしたら怒られました。 (´・ω・｀)

<img width="560" alt="スクリーンショット 2018-03-09 23.25.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/45214/14406f67-496e-d89c-e24d-97d9ae43c6c7.png">

具体的なエラー文は以下の通り。

```
No module named requests less... (⌘F1) 
This inspection detects names that should resolve but don't. Due to dynamic dispatch and duck typing, this is possible in a limited but useful number of cases. Top-level and class-level items are supported better than instance items.
```

これを何とかします。

# 環境
- macOS 10.13
- pyenv 1.2.1
- anaconda 3.5.0.1 (pyenvで入れた)
- pycharm 2017.3.3

# 対応方法 (前半)
1． pycharmのメニューから `file -> Default Settings -> Project Interpreter` を開く
1. 歯車アイコンクリック -> `Add local...` を選択
2. `Existing environment` を選択
3. `Interpreter` の `...` アイコンクリック
4. `~/.pyenv/versions/anacondax-x.x.x/bin/python3` を選択
5. (そーするとこんな感じになる)
<img width="1018" alt="スクリーンショット 2018-03-09 23.38.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/45214/0f5fcee9-3779-7f8b-f450-b5de8d5850a2.png">

---

# 対応方法 (後半)
ここまでやったら `import requests` の下の「エラーだよ★」波線は消えたんだけど、代わりに Pycharm のエディタ上に
`No Python interpreter configured for the project (Configure Python Interpreter)` って出るようになった。

<img width="1019" alt="スクリーンショット 2018-03-09 23.50.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/45214/6afe5ce4-0e61-9655-9e50-9df4ac3fa692.png">

このままだと (´・ω・｀) なので対応する。

1. `Configure Python Interpreter` をクリック
1. `Project Interpreter` が表示される
1. `Project Interpreter` の ▼アイコンクリック
1. さっき指定した `Python x.x` が出てくるので、ソレを選んで `OK` する

<img width="1021" alt="スクリーンショット 2018-03-10 0.04.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/45214/d8b65d7a-3d2c-8cc2-5bdb-c01452f761a5.png">

---

無事 動くよーになりましたーうれしい！　ヽ(oﾟωﾟo)ﾉ
Doc2vec, K-meansを用いた文書クラスタリング

#　流行りのDoc2vecを使って文書クラスタリング
みなさん、元気に自然言語処理〜！？
流行りのWord2vecの文書版、Doc2vecでクラスタリングしてみました。ベクトルさえあればクラスタリングは簡単にできます。
なんらかの方法でベクトル、またはベクトルをつくってくれるモデルを取得しましょう。

Doc2vecを行う際は[ここ](https://qiita.com/asian373asian/items/1be1bec7f2297b8326cf)を参考にすると良いと思います。モデルが簡単に手に入ります。

```python:generate_model.py
#coding: UTF-8
from gensim.models.doc2vec import Doc2Vec
from gensim.models.doc2vec import TaggedDocument
import sys

f = open(sys.argv[1],'r')#空白で単語を区切り、改行で文書を区切っているテキストデータ

#１文書ずつ、単語に分割してリストに入れていく[([単語1,単語2,単語3],文書id),...]こんなイメージ
#words：文書に含まれる単語のリスト（単語の重複あり）
# tags：文書の識別子（リストで指定．1つの文書に複数のタグを付与できる）
trainings = [TaggedDocument(words = data.split(),tags = [i+200]) for i,data in enumerate(f)]

# トレーニング（パラメータについては後日）
m = Doc2Vec(documents= trainings, dm = 1, size=300, window=8, min_count=10, workers=4)

# モデルのセーブ
m.save(sys.argv[2])

```

モデルが完成したら、あとはモデルから二次元のテンソル(行列)を抽出してリストに格納します。
そしたらk-means実行です。

```python:execute_clustering.py

from gensim.models.doc2vec import Doc2Vec
from gensim.models.doc2vec import TaggedDocument
from sklearn.cluster import KMeans
import sys
from collections import defaultdict
import numpy as np
import matplotlib.pyplot as plt


#モデルを読み込む
#モデルは絶対パスで指定してください
m = Doc2Vec.load('~/hogehoge.model')

#ベクトルをリストに格納
vectors_list=[m.docvecs[n] for n in range(len(m.docvecs))]

#ドキュメント番号のリスト
doc_nums=range(200,200+len(m.docvecs))

#クラスタリング設定
#クラスター数を変えたい場合はn_clustersを変えてください
n_clusters = 8
kmeans_model = KMeans(n_clusters=n_clusters, verbose=1, random_state=1, n_jobs=-1)

#クラスタリング実行
kmeans_model.fit(vectors_list)

#クラスタリングデータにラベル付け
labels=kmeans_model.labels_

#ラベルとドキュメント番号の辞書づくり
cluster_to_docs = defaultdict(list)
for cluster_id, doc_num in zip(labels, doc_nums):
    cluster_to_docs[cluster_id].append(doc_num)

#クラスター出力

for docs in cluster_to_docs.values():
    print(docs)

#どんなクラスタリングになったか、棒グラフ出力しますよ
import matplotlib.pyplot as plt

#x軸ラベル
x_label_name = []
for i in range(n_clusters):
    x_label_name.append("Cluster"+str(i))

#x=left ,y=heightデータ. ここではx=クラスター名、y=クラスター内の文書数
left = range(n_clusters)
height = []
for docs in cluster_to_docs.values():
    height.append(len(docs))
print(height,left,x_label_name)

#棒グラフ設定
plt.bar(left,height,color="#FF5B70",tick_label=x_label_name,align="center")
plt.title("Document clusters")
plt.xlabel("cluster name")
plt.ylabel("number of documents")
plt.grid(True)
plt.show()


```

テキストデータの前処理が済んでいれば、面白い結果が得られるかと思います。（手軽なところだとWikipedia）
## でも結局・・・

原理的にWord2vecから発展している感じはないので、そんなにイケてない印象ですた。


自分のツイートが誰のツイートに近いだとか予測する診断サービスなんかに利用できそうですね（）
Lambdaを暖気するやつを作るやつを作った

# 何をするものか

5分おきに任意のLambdaFunctionを起動するCloudWatch Events RuleとLambdaFunction、及びそれを作成するためのCloudFormationのTemplateです。

既にあるLambdaFunctionに対して、`prewarm`というTagを値`true`とともに設定すると、この仕掛けから呼び出されます。

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/117772/d873abdd-e005-a792-9758-155719291986.png)

起動するLambdaFunctionの範囲は、同じアカウントの同じRegion内です。

# 作り方

[こちら](https://github.com/monamu/qiita-lambda-prewarm) からlambda-prewarm-executor.yamlを入手し、CloudFormationでStackを作成してください。

Parameterはデフォルトの設定のままで構いません。
以下の2点はStackのParameterになっているので、一部の振る舞いを変えられます。

* ExecutionSchedule:実行間隔。CloudWatchEvents Ruleの[rate式](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.html#RateExpressions)を使えます。
* TargetLambdaTagName:ここで指定したTagの値がtrueであるLambdaを暖気します。

Stackを作成すると、以下のリソースが作成されます。

* 対象を起動するためのLambdaFunction
* 上記LambdaFunctionを定期的に起動するためのCloudWatch Events
* 必要なIAM Role、Permissionなど

# 使い方

暖気したいLambdaFunctionにTag `prewarm`を値 `true`で設定してください。

起動するときに、以下の値を引数で渡します。

```json
{ "isPrewarm": true }
```
呼ばれたLambdaFunction側で、通常の呼び出しか、暖気による呼び出しかの判定に使用してください。

暖気するLambdaFunctionは非同期で起動し、エラーの判定を行いません（投げっぱなしです）。
サイボウズLiveでエクスポートしたデータをPDFに変換する

## 背景
機能満載のサイボウズLiveが[2019年4月15日をもってサービスが終了](https://live.cybozu.co.jp/about/20171024.html)します。

無料ということもあり、地域活動や家庭内でも利用されている方が多かったのではないかと思います。私自身も子供の保育園で利用していたために、移行先を検討中です。

また、蓄積されているデータはCSVとして出力できますが、そのままでは読みにくいのでどうにかする必要があります。いくつかのサービスはCSVのインポートに対応することを宣言していますが、現状では有料サービスしか見当たらないのがつらいところです。

そこで、CSVをそこそこ読みやすいPDFに変換し、とりあえず掲示板ぐらいは読めるようにしておこうというのが今回の趣旨です。

## 使うもの

+ python3
+ [ReportLab](https://www.reportlab.com/)

## CSV処理
「標準形式」を使用しました。掲示板のカラム定義は以下の通りです。

```
"ID","タイトル","本文","作成者","作成日時","更新者","更新日時","コメント"
```

みたところ問題なさそうですが、「コメント」がやや曲者です。一つの投稿に対して複数のコメントがぶら下がるので、CSVでは以下のように表現されています。

```
--------------------------------------------------
2: 投稿者名 2018/1/1 (月) 00:00

あけましておめでとうございます！

--------------------------------------------------
1: 投稿者名 2017/12/31 (日) 23:59

来年もよろしくお願いいたします

--------------------------------------------------
```

内部的に一個一個のコメントを切り出して扱うために以下の処理を行いました。


```python

 57         for raw_comment in raw_comments.splitlines()[:-1]:
 58             if raw_comment == '--------------------------------------------------':
 59                 marker = True
 60                 continue
 61
 62             m = re.match(
 63                 r'(\d+): (.*?) (\d{4})/(\d{1,2})/(\d{1,2}) (.*) (\d{1,2}):(\d{1,2})',
 64                 raw_comment
 65             )
 66
 67             if marker and m:
 68                 index = m.group(1)
 69                 submitter = m.group(2)
 70                 year = m.group(3)
 71                 month = m.group(4)
 72                 date = m.group(5)
 73                 hour = m.group(7)
 74                 minute = int(m.group(8))
 75                 dt = '{}/{}/{} {}:{}'.format(year, month, date, hour, minute)
 76
 77                 if next_comment:
 78                     next_comment.body = '<br />\n'.join(body[1:-1])
 79                     comments.append(next_comment)
 80
 81                 next_comment = Comment(index, submitter, dt, '')
 82                 body = []
 83
 84             else:
 85                 if next_comment:
 86                     body.append(raw_comment)
 87
 88             marker = False
 89
 90         if next_comment:
 91             body.append(raw_comment)
 92             next_comment.body = '<br />\n'.join(body[1:-1])
 93             comments.append(next_comment)
```

動作としては、セパレータ（`--------------------------------------------------`）の次の行が投稿メタデータに一致した場合に投稿の区切りと判断しています。

## PDF出力

ReportLab の `ParagraphStyle` を利用して出力しています。文の折り返し等は自動的に行われるので便利です。ただし、改行は `<br />` を入力する必要があるため注意が必要です。

また、日本語を表示したい場合には日本語フォントが必要です。今回はIPAゴシックが同じディレクトリにおいてあるものとして処理しています。

一番上に投稿、続いてコメントを降順で出力します。また、投稿ごとに改ページしています。


## ソース

https://github.com/OttyLab/cybozulive-converter

## 今後の予定

+ ReportLabをもうちょっと理解する
+ 目次追加
+ CSV解析とPDF出力の分離
+ 掲示板以外の対応
+ 見た目をかっこよく
UIButtonのAddTargetを書きたくない。


#### やりたいこと

``` .swift

    let b = UIButton()
    b.onTap {
        print("on tap")
    }
```

実装方法はgithubでカンニングした。

##実装
### 黒魔術を使う
 objcのランタイム関数を使ってUIButtonのプロパティーにclosureを保持する構造体追加する

``` .swift 
typealias TapClosure = ()->Swift.Void

class Tapable {
    
    static var key = "ON_TAP_KEY"
    private var base: UIButton
    
    init(_ base: UIButton) {
        self.base = base
    }
    
    var onTouchUpInside: TapClosure? {
        didSet {
            base.addTarget(self, action: #selector(touchUpInside), for: .touchUpInside)
        }
    }
    
    @objc private func touchUpInside(sender: AnyObject) {
        onTouchUpInside?()
    }
}


extension UIButton {
    
    func onTap(_ closure:  @escaping ()->Swift.Void) {
        tapable.onTouchUpInside = closure
    }
    
    private var tapable: Tapable {
        get {
            if let handler = objc_getAssociatedObject(self,  &Tapable.key) as? Tapable {
                return handler
            } else {
                self.tapable = Tapable(self)
                return self.tapable
            }
        }
        set {
            objc_setAssociatedObject(self, &Tapable.key, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
}

```

### NotificationCenterを使う

addObserver(forName:object:queue:using:)メソッドのブロックはコピーが生成される。
observerはどのタイミングでremoveすべきなんだろう・・・

``` .swift
typealias ActionClosure = ()->Swift.Void

extension Notification.Name {
    static let touchUpInsideName = Notification.Name("touchUpInsideName")
}

extension UIButton {
    
    func onTap(_ closure:  @escaping ActionClosure) {
        
        var observer: NSObjectProtocol?
        observer = NotificationCenter.default.addObserver(forName: .touchUpInsideName,
                                                          object: nil,
                                                          queue: nil) { _ in
            closure()
        }

        addTarget(self, action: #selector(touchUpInside), for: .touchUpInside)
    }
    
    @objc private func touchUpInside(sender: AnyObject) {

        NotificationCenter.default.post(name: .touchUpInsideName,
                                  object: self,
                                  userInfo: nil)
    }
}
```




とりあえずonTapメソッドを実装できれば個人的にはOKなのでクロージャーの引数もないしUIButton限定です。

#### 参考

こちらからカンニングしました。

- https://github.com/vhesener/Closures
- https://github.com/takasek/ActionClosurable
[Swift] Google Map Place Pickerを使うときのハマりポイント

Google Place Picker for iOSを使う時にいくつかハマりポイントがあったのでメモ。
# Google Place Pickerってなんぞや？
https://developers.google.com/places/ios-api/placepicker?hl=ja
カレンダーアプリとかで場所を設定したい時に重宝するUIツールです。
基本的には↑のURLにあるサンプルコードを使いたいクラス内にコピペすれば動くはず…なのですがそうではなかったので注意しましょうという話です。

## 前提
マップ表示にあたって現在位置が必要なのでInfo.plistの`Privacy - Location When In Use Usage Description`や`Privacy - Location Always and When In Use Usage Description`を埋めないと当然ながら使えません。
Cocoapodsの`Podfile`に

```
pod 'GooglePlaces'
pod 'GooglePlacePicker'
pod 'GoogleMaps'
```
を追記して`pod install`するのも忘れないようにしましょう。
## Google Place APIとGoogle Map API両方を有効化する
Google Place APIの一部なんだから・・・と思いきやお使いのAPIキーでGoogle Map APIも有効化しないとGoogle Mapが表示されない模様です。
## import GooglePlacePickerしよう
サンプルコードには書いてませんが冒頭で`import GooglePlacePicker`しないとXcodeは認識しません。
## delegateを指定しよう
https://developers.google.com/places/ios-api/placepicker?hl=ja にあるサンプルコードのアタマには

```swift
@IBAction func pickPlace(_ sender: UIButton) {
  let config = GMSPlacePickerConfig(viewport: nil)
  let placePicker = GMSPlacePickerViewController(config: config)

  present(placePicker, animated: true, completion: nil)
}
```

と書いてありますがdelegateが指定されてないのでコレでは動きません。`func placePicker(_ viewController: GMSPlacePickerViewController, didPick place: GMSPlace)`を同じクラスに実装するのであれば

```swift
@IBAction func pickPlace(_ sender: UIButton) {
  let config = GMSPlacePickerConfig(viewport: nil)
  let placePicker = GMSPlacePickerViewController(config: config)
  placePicker.delegate = self
  present(placePicker, animated: true, completion: nil)
}
```

4行目。ちゃんとdelegateを指定しましょうね。

# おわりに
Place Pickerとても便利ですがどうしてAuto Completeが別で存在しているのか謎（ただの下位互換にしか見えない）
rc.localが消えたUbuntu 16.04でコマンド自動実行

tlpの--auto-tuneをしようと思った時、いつもどおりrc.localに書こうとしたら、まさかの存在しないではないですか！？

```
 ~ $ ls /etc/rc.local 
ls: '/etc/rc.local' にアクセスできません: そのようなファイルやディレクトリはありません
```

おそらく、initからsystemd（serviceからsystemctl）にサービス関連が移行されつつあるので、それに関連してのことでしょう。

なので、起動時にコマンドを自動実行するサービスを一個追加しておきましょう。

```
[Unit]
Description=auto start commands in /etc/onboot.sh on boot

[Service]
Type=simple
ExecStart=/etc/onboot.sh
User=vagrant

[Install]
WantedBy=multi-user.target
```
私はこんな感じにしました。

そして

```
$ sudo touch /etc/onboot.sh
```

こんな感じでroot権限でファイルを作ってあげればOK。 

あとはいつもどおり、

```
$ sudo systemctl enable onboot.service 
Created symlink /etc/systemd/system/multi-user.target.wants/onboot.service → /etc/systemd/system/onboot.service.
```


すれば完成。好きなコマンドを、こんどは/etc/rc.localから/etc/onboot.shに突っ込んでどうぞ！

以上！
開発版のUbuntuにアップグレードしたらaptがおかしくなった

まだベータ版にすらなっていないUbuntu17.04にアップグレードしてしまいました。

つまりはyakketyからzestyにしたわけですね。もちろんapt（apt-get）がアップグレードするときに、Ubuntuのサーバーから17.04用のソフトしかダウンロードしない。なのにもちろんベータ版だからソフトなんてひとつもない。なので一切ソフト（パッケージ）のinstall,update,upgradeができなくなってしまったわけです。なのでそれをなんとか直しました。

ようするに、取ってくるソフトの情報をすべて16のものにしてあげればいいのです。

aptのリポジトリ（サーバーの設定）ファイルは、/etc/apt/sources.listにおいてあるので、そこの中の"zesty"と書いてある部分をすべて"yakkety"に直しました、それだけです。これで治りました。

何か不具合というか注意書きですが、GUIソフトの"ソフトウェアとアップデート"の中のチェックボックスはすべてはずしておいてください、なぜなら、こいつらはzestyサーバーにつなげるの用の設定だからです。ちゃんと、yakkety用に繋がっているはずです。たぶん。

以上、アップグレードしたらaptがおかしくなってけど、ファイルの内容を置換しただけで治った話でした。
Ubuntu16.04のNIC名を固定する(変更する)

Ubuntu16.04から、命名規則が変わったりいろいろあったが、自分は判別しやすい用にNICに固定名をつけてるから方法を自分用にメモ

 
/etc/udev/rules.d/99-nic-name.rulesってファイルを作る。99は一番最後に、つまり設定内容が最優先されるってこと。ファイル名の先頭が99で拡張子がrulesならファイル名はなんでもいい（はず）。

内容：

```
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="MACアドレス", NAME="NIC名"
```
 これを難行も書けば大丈夫なはず。

ちなみに自分は、オンボードのイーサーネットをpc-eth0、オンボードの無線ドングルをpc-wlan0、USB接続をusb-wlan0にしている。
NginxでIndex of（ファイル一覧）を表示させる

indexファイルがなかった時に、そのディレクトリ内のファイル一覧を自動表示するNginxの機能を使ってみます。容量単位表示・更新時間のロケール変更も対応。自分用メモ。

server{}でもlocation{}でもいいので、nginx.confに以下を追記する。

```
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
```

 一行目から順に、autoindex有効化、容量を単位付きで表示、時間のロケールをローカルに変更（デフォルトでUTC）にしている。以上。
Open V Switchを触ってみる

どうも。かちおです。最近諸事情でOpenVSwitchを使うことが会ったので備忘録がてら使い方を書きました。


# Open V Switch(おーぷんぶいすいっち)って?
Open V Switchを理解するためには、Open Flowを理解する必要があります。

https://ja.wikipedia.org/wiki/OpenFlow

従来のネットワークスイッチは、自身でルーティングを決定し、実際のパケットを電気的に処理していました。それに対してOpenFlowは、「ルーティングの決定」と「実際のパケットのコントロール」を別々に分けるものです。
※正確には分けたときにお互いが通信しあうためのプロトコル

たとえば、従来のVLANの設定やACL、ルーティングテーブルを、物理的なネットワークスイッチとは別のマシンで処理することができます。
これの何が嬉しいかと言うと、「パケットの処理を決めるのは別のマシン、そしてその処理を実際に行うのはネットワークスイッチ」とすることで、いわゆるスイッチのコンソールから設定する以上の高性能・高機能なルーティングをサーバーなどで実装し、ネットワークスイッチと連携させることができます。それにより従来のL2・L3の区別のない高機能なネットワークスイッチを自作することができます。
(ちなみに、同じ設定のルーターを大量に設定するときとかにも強い

そして今回使用するOpen V Switchは、そのOpenFlowに対応した仮想ブリッジ(スイッチ)となっています。それにより、これを使うことで「超高機能」な仮想ブリッジをサーバー内部に作成することができます。


# 今回やること
実際に高機能を試してみるのは気が引けるのと手間暇的なアレとそもそも自分がOpen V Switchを触り始めてばかりなところがあるので、超初級として今回はOpen V Switchを使って仮想L2スイッチを作ってみます。L2ってなんぞや?って方は、高機能なスイッチハブとでも思っていてください。

# 環境
Ubuntu Server 16.04 LTS + Open V Switch

# インストール

```shell-session:shell
$ sudo apt install openvswitch-switch openvswitch-common
```

# ブリッジの作成

```shell-session:shell
$ ovs-vsctl add-br test01 # test01というブリッジを作成
$ ovs-vsctl add-port test01 eno1 # test01にeno1を接続する
$ ovs-vsctl del-port test01 eno1 # test01からeno1を抜く
$ ovs-vsctl del-br test01 # test01というブリッジを削除
```

# これってもしかして…?
そうです。Linuxの標準仮想ブリッジと使い勝手は同じなのです。高度なことをしなければ手間はかからず、さらにここから複雑な機能をもたせることもできます。
自分も勉強中ですがbrctlを同じように使えるところが気に入ったので、仮想ブリッジを作成するときに積極的に使うようにしています。
今回はL2を作っただけですが、ぜひご自分で拡張していってみてください。この記事がOpen V Switchを知るきっかけになってくれれば嬉しいです。

それでは。
LinuxでVLANを触ってみる

LinuxでVLANの処理をする必要があり、ちょうど良いので方法や仕組みをまとめました。

# VLANって?

https://ja.wikipedia.org/wiki/Virtual_Local_Area_Network

VLANとは、L2でパケットにタグというものをつけて、複数のL2を分割して考えることができます。
本当に単純に、L2パケットにVLANタグを付けているのみです。ちなみにVLANは整数の番号を割り当てることができます。
これの何が嬉しいかと言うと、L3でセグメントをわけなくてもLAN内でL2を擬似的に分割することができちゃったりします。
他にもスイッチの特定のポートとVLANを結びつければVLANを使ってルーティングの設定ができます。

# 原理
基本的に、マシンの物理NICをトランク(すべてのVLANが通れる、というかVLANを気にしない)として、さらに物理NICを通ったあとにVLANがついてるパケットだけをそのVLAN用に作成した仮想NICへとばしてくれます。

# 環境
Ubuntu Server 16.04 LTS

# インストール

```shell-session:shell
$ sudo apt install vlan
```
# 作成

```shell-session:shell
$ sudo vconfig add eno1 10 # eno1を通ったときに10番のVLANパケットがあったときに、eno1.10という仮想NICにそのパケットを飛ばすようにする
$ sudo vconfig rem eno1 10 # eno1.10を削除する
```

めちゃくちゃ簡単ですね。これで生成した仮想NIC(物理NIC名.VLAN番号)を仮想ブリッジに追加したりなんかすれば、ホストとL3スイッチを接続して仮想マシンにしかアクセスできないポートなんかをL2だけで実現することができます。

セキュリティ的にネットワークを分けたいけどルーターのポートは1つしか用意できない!なんてときに使うと幸せになれると思います。

それでは。
Go の関数レシーバが暗黙の型変換される場合とされない場合のまとめ


# tl;dr

* Go の関数レシーバは値型とポインタ型の間で暗黙の型変換が行える場合と行えない場合がある。
* 暗黙的型変換を使うメリットはあまりないので、明示的に型を指定して関数定義をしていったほうが安全。

# 関数レシーバの暗黙の型変換

* Go の関数のレシーバは呼び出し元が[アドレス指定可能](http://golang.jp/go_spec#Address_operators)であれば、値型とポインタ型の間で暗黙の型変換が行われ、簡略な記述で呼び出すことができる。

```go
type T struct {}

// T 型のメソッド
func (t T) V() {
}

// *T 型のメソッド
func (t *T) P() {
}

t := T{}
t.V()
t.P() // t が &t に変換され (&t).P() が実行される

tt := &T{}
tt.P()
tt.V() // tt が *tt に変換され (*tt).V() が実行される
```

# 型変換が行われない場合

* 型変換が行われないのは、主に呼び出し元が値型でマップやインターフェイスの要素であった場合。
* [実行可能なコード](https://play.golang.org/p/xWCG05ec_BV)を以下に記載する。

```go
package main

import (
	"fmt"
	"reflect"
)

type S struct{}

func (s S) V() {
	fmt.Println("V")
}

func (s *S) P() {
	fmt.Println("P")
}

type CanV interface {
	V()
}

type CanP interface {
	P()
}

func main() {
	// 変数の場合 S => *S に型変換される
	s := S{}
	s.V()
	s.P()

	// 変数の場合 *S => S にも型変換される
	ss := &S{}
	ss.V()
	ss.P()

	// スライスの要素の場合 S => *S に型変換される
	l := []S{S{}}
	l[0].V()
	l[0].P()

	// スライスの要素の場合 *S => S にも型変換される
	ll := []*S{&S{}}
	ll[0].V()
	ll[0].P()

	// マップの要素の場合 S => *S に型変換されない
	m := map[int]S{
		0: S{},
	}
	m[0].V()
	// m[0].P() // エラーになるのでコメントアウト

	// マップの要素でも *S => S には型変換される
	mm := map[int]*S{
		0: &S{},
	}
	mm[0].V()
	mm[0].P()

	// インターフェイスの場合 *S => S には型変換される
	f := func(v CanV) {
		v.V()
	}
	f(S{})  // S.V() は定義されているので ok
	f(&S{}) // (*S).V() は定義されていないが *S => S と型変換されて ok

	// インターフェイスでも S => *S には型変換されない
	ff := func(p CanP) {
		p.P()
	}
	// ff(S{}) // S.P() は定義されておらず型変換も行われないのでエラー
	ff(&S{}) // (*S).P() は定義されているので ok

	// reflect 経由でのインターフェイスでも *S => S は変換されるが S => *S の変換はエラーになる
	reflect.ValueOf(S{}).Interface().(CanV).V()
	// reflect.ValueOf(S{}).Interface().(CanP).P()
	reflect.ValueOf(&S{}).Interface().(CanV).V()
	reflect.ValueOf(&S{}).Interface().(CanP).P()
}
```

# なぜ暗黙的型変換が行えないのか

* むずかしいので https://stackoverflow.com/questions/48790663/why-value-stored-in-an-interface-is-not-addressable-in-golang を参照のこと

# レシーバの暗黙的型変換をいつ使うか

* 暗黙的型変換によって関数呼び出しが多少便利になる代わりに、呼び出しできないケースについて気をつけながらコードを書いていくのは割に合わない。
* 基本的に暗黙的型変換に頼らずに明示的に型を指定していったほうが安全。
* この件とは別にレシーバの型をどうするかの指針は[こちら](https://github.com/golang/go/wiki/CodeReviewComments#receiver-type)にあったりするが、例えば構造体なら特別な場合がなければポインタ型を使っておくとかで問題ない。
* おそらくだが構造体の関数呼び出しの際にフィールド参照と同じように値型かポインタ型かを意識せずに行えるようにしたい、という要望からレシーバの暗黙的型変換が実装されているようなきがする。

# おわりに

* まあまあ Go わかっているつもりで [Stack Overflow](https://stackoverflow.com/questions/49162418/using-reflection-to-iterate-over-structs-struct-members-and-calling-a-method-on) で回答をしてみたところ、関数レシーバの暗黙の型変換について全然わかっておらずに微妙な回答をしてしまったのを反省して今回は調べてみた。
* 結局自分ではあまり使わなそうではあるが、初心者だと混乱してしまいそうな機能ではあるので把握しておくことができてよかった。

# 参考URL

* https://github.com/golang/go/wiki/MethodSets#interfaces
[Swift] iOSのバックグラウンド処理について

バックグラウンド処理についていろいろ調べる機会があったのでまとめます。
## 実行環境
- macOS High Sierra
- Swift 4
- iOS 11

# 長時間のタスク実行
iOSのバックグラウンドタスク実行には長時間のものと短時間（概ね180秒以内）のものがあります。

iOSでは一部の例外を除き基本的に長時間のバックグラウンド（常駐）処理が許されていません。バッテリを始めとしたリソース管理の観点からだと思われます。
長時間の処理が許されるのは以下のタスクです。

- 音の再生・AirPlay（音楽を再生するなど）
- 位置情報更新（カーナビアプリはアプリを閉じてもナビし続けますね。）
- 通話
- Newsstand向けダウンロード
- 外部アクセサリとの通信
- Bluetoothアクセサリとの通信
- background fetch
- 通知（Notification）の監視

各々のトピックについては他の記事をあたってください。もう少し詳しいことは[こちら](https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html)に載ってます。（Appleの英語リファレンスですが。）

# 短時間のタスク実行
今回はこちらが本題です。iOSの場合いわゆる常駐処理はできることが限られていますが短時間のタスク実行なら比較的なんでもできます。
Appは通常ユーザーがその画面を閉じたらすぐに処理が止まりますが以下に示すようなコードで画面を閉じられてもある程度処理を続行できます。時間のかかるダウンロード/アップロード処理を継続するのに使うといいですね。

```swift:ViewController.swift
class ViewController: UIViewController {
  // backgroundTaskIDの初期値はなんでも良さそうです。とりあえず0を代入しておきます。
  var backgroundTaskID : UIBackgroundTaskIdentifier = 0
  @IBOutlet weak var button:UIButton!

  override func viewDidLoad() {
    super.viewDidLoad()
  }

  // ボタンが押されたら時間のかかる処理をする。
  // 処理中にユーザがアプリを閉じても大丈夫なようにしたい。
  @IBAction func onButtonTapped(_ sender: UIButton) {
    // 中断されたら困る処理の起点にコレを書く
    self.backgroundTaskID = UIApplication.shared.beginBackgroundTask(expirationHandler: nil)
    self.longTimeFunction()
  }

  func longTimeFunction() {
    // 長い時間かかる処理
    // 処理が終わったらコレを書く
    UIApplication.shared.endBackgroundTask(self.backgroundTaskID)
  }
}
```

`UIApplication.shared.beginBackgroundTask()` が呼ばれるとアプリがバックになっても`UIApplication.shared.endBackgroundTask()`が呼ばれるまでiOSは処理を継続します。[一説によれば](https://ja.stackoverflow.com/questions/31477/timer%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9F%E3%83%90%E3%83%83%E3%82%AF%E3%82%B0%E3%83%A9%E3%82%A6%E3%83%B3%E3%83%89%E3%81%A7%E3%81%AE%E4%BD%8D%E7%BD%AE%E6%83%85%E5%A0%B1%E3%81%AE%E5%8F%96%E5%BE%97?answertab=votes#tab-top)処理の継続限度は180秒とのことですが、状況によりけりだそうです。
`beginBackgroundTask()`はコードにあるように`expirationHandler`を渡すことができます。`expirationHandler`はバックグラウンドの処理時間の期限が迫ると呼ばれるとのことです。「お前もうすぐ死ぬから最後の始末しておけ」ハンドラですね。

# まとめ
iOSでバックグラウンド処理をする方法についてまとめてみました。`beginBackgroundTask()`はバックグラウンド処理を実行するというよりもアプリがactiveの状態で実行中の処理がユーザのアプリ切り替えによって中断されないようにする感じですね。
一般に言われるバックグラウンド/常駐プロセスは用途が制限されています。が、その用途に当てはまるように見せかけることができれば使えてしまうわけですね。だいぶ古いネタではありますが[Facebookが裏で無音を流してバックグラウンド処理をしていた](https://gigazine.net/news/20151016-facebook-app-steal-iphone-battery-life/)というのは有名な話です。

それでは皆さん良いswiftライフを！
Vagrantのソースをvscodeでremoteする方法

※
OS: MAC High Sierra
vagrant-version: 2.0.2

# sshで通信ができていることを確認
[こちら](https://qiita.com/y_arakawa/items/7bb292c999873032e6a4)を実施して、sshログインできることを確認

# sftpのパッケージをインスコ
vscode開いて[こちら](https://marketplace.visualstudio.com/items?itemName=liximomo.sftp)からインスコ

# sftpの設定
シンクしたいフォルダをvscodeで開いておく。

`Command + p`を押して、`>sftp config`を設定

./.vscode/sftp.jsonがあることを確認

# 以下をsftp.jsonに記入
```
{
    "protocol": "sftp",
    "host": "ホスト名",
    "username": "vagrant",
    "remotePath": "/home/vagrant/workspace/シンクさせたい場所",
    "uploadOnSave": false,
    "privateKeyPath": "vagrant ssh-configでIdentityFileのvalueをここに指定"
}
```

ちなみに、`uploadOnSave`のvalueをtrueにすれば、自動でuploadします。

以上です。

参考文献
[sftp](https://marketplace.visualstudio.com/items?itemName=liximomo.sftp)
[vagrantでssh通信する方法](https://qiita.com/y_arakawa/items/7bb292c999873032e6a4)
sh と bash の違い？


- echoの出力が違くてあれ？と思いました。

```sh
sh-3.2$ bash -c "echo -e \"a\nb\nc\""
a
b
c
sh-3.2$ sh -c "echo -e \"a\nb\nc\""
-e a
b
c
```

## バージョンは？

```sh
sh-3.2$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin17)
Copyright (C) 2007 Free Software Foundation, Inc.
sh-3.2$ sh --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin17)
Copyright (C) 2007 Free Software Foundation, Inc.
```

- 同じです...

## 設定は？

```sh
sh-3.2$ bash -c "set -o" > bash.set
sh-3.2$ sh -c "set -o" > sh.set
sh-3.2$ diff bash.set sh.set
23c23
< posix          	off
---
> posix          	on
```

- 設定が一つちがいますね。
Google Cloud Platform操作(Ubuntu 14.04 LTS)

## VMへファイルをアップロードしたい
適当なバケットを作ってファイルをアップロードします。
gsutil cp コマンドを使用します。[VALUES_IN_BRACKETS] は適切な値で置き換えます。

>gsutil cp gs://[BUCKET_NAME]/[OBJECT_NAME] [OBJECT_DESTINATION]

### 逆にVMからファイルをバケットなどにコピーするには？

>gsutil cp (対象ファイル) gs://[BUCKET_NAME]

↓のようなエラーが出た。理解しきれてないけどVMの構築方法次第ではエラーになるらしい。
AccessDeniedException: 403 Insufficient OAuth2 scope to perform this operation. 
Acceptable scopes: https://www.googleapis.com/auth/cloud-platform

対処は下記を実行してGCPにログイン
> gcloud auth login

ブラウザなどを経由してログインして下記へ認証コードを入力すればOK
Enter verification code:

## タイムゾーンを日本にしたい(Ubuntu)

追記予定
vim StatusLineの色を変えて気分を変えよう

#StatusLineてどこのこと?

<img width="562" alt="スクリーンショット 2018-03-09 21.34.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/236727/51c4acbf-6fee-3467-76f6-8acfc7853bb7.png">
vimの下っ側にあるバーです。

使っているテーマによって色は変わりますが、
たまには自分の好きな色にしてみたい。そんな時の設定方法です。

#highlight StatusLine
vimを立ち上げ
`:highlight StatusLine`と打つと

```vim:vim
StatusLine     xxx term=bold,reverse cterm=bold,reverse guifg=black
                   guibg=#c2bfa5  
```

こんな情報が出てきます。設定できる項目ですかね。

色に関しては、guifg guibgの箇所です。

| 項目 | 内容 |
|:-:|:-:|
|guifg   |StatusLineの文字の色   |
|guibg   |StatusLineの帯の色   |
fgはforeground
bgはbackgroundでしょうか。知っている方いたら教えてください。
#色の設定
さて、色を設定する箇所はわかったのですが、
何色に設定したらよいでしょうか?
上記のStatusLineの情報では名前で指定している箇所と16進数で指定している箇所があります。
こだわる方は16進数で指定するのが良いと思いますが、
そんなのはめんどくさい、名前で指定させろよ
っという私のような面倒臭がりは[こちら](https://codeyarns.com/2011/07/29/vim-chart-of-color-names/)を参照ください
vimで使用できるcolornameがたくさん紹介されています。素敵です。
最終的に.vimrcに記述するわけですが、
まずはどんな感じになるかプレビューしたいです。
そういうときは

```:vim
:highlight StatusLine guifg=blask guibg=white 
```

をお試しください。
guifgとguibgの値を先ほどのリンク先を参照して指定してあげると反映されます。
例えば私は緑系が好きなのでこんな感じ

```
:highlight StatusLine guifg=DarkSlateGray guibg=OliveDrab 
```

このコマンドを実行すると、、、
<img width="492" alt="スクリーンショット 2018-03-09 22.18.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/236727/b6dccbd9-2523-3e6b-0297-7a3adf479a96.png">
こんな感じの落ち着いた色に変わりました。
こんな感じで気に入った色の組み合わせができたら

```:.gvimrc
highlight StatusLine guifg=DarkSlateGray guibg=OliveDrab
```
のようにそのまま追記します。
これで、これからmacvimを立ち上げるたびに自分の色に変わってくれます。
たまに色を変えたりすると気分も変わってコーディングが捗るかも、、、

#今回の環境

```
macvim: Custom Version 8.0.1522 (KaoriYa 20180218)
macOS: High Sierra バージョン10.13.3（17D102)
```
Serverless Framework で Function not found で Lambda がデプロイできない時に対処したこと

Serverless Frameworkを使ってLambda関数をAWS上に展開している環境。
ある検証のためにAWS管理画面上からLambda関数を消したのだが、再度デプロイを試みようとすると、

```
$ sls deploy --stage dev -v

...(snipped)...

 Serverless Error ---------------------------------------
 
  An error occurred: MyLambdaFunction - Function not found: arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:my-lambda-function-myLambdaFunction.
```

といった具合に、エラーが出て該当のLambdaのデプロイができなくなった。
困った。

## 原因

Serverless Framework は Cloud Formation を使って対象リソースの管理をしているのだが、手動で消してしまったために同期などの不整合が起きていると思われる。


## 解決方法

似たような症状での議論が、 https://github.com/serverless/serverless/issues/3050 で展開されており、参考になった。
なお、実施すると**API Gateway のエンドポイントが変わるので、注意**。


### 方法１：Cloud Formation のスタックを作り直す

Serverless フレームワークが作った既存のCloudFormationスタックを削除し、デプロイし直して作り直す方法。[こちら](https://github.com/serverless/serverless/issues/3050#issuecomment-321330667)の方が言っている内容である。

1. API Gatewayの「カスタムドメイン名」設定で、対象のLambdaがベースパスマッピングされているならば、そのパスを削除する。（編集→🗑 )
2. S3のデプロイ用のS3バケットも削除する。
3. Cloud Formation で、対象のスタックを削除する。
4. コンソールから `sls deploy` を実行してデプロイしなおす。
5. 1.でマッピングされていたならば、新しい API でマッピングしなおす。

### 方法２：sls remove する。

[こちら](https://github.com/serverless/serverless/issues/3050#issuecomment-280493352)の方が言っている方法だが、先に上の方法を試していたので、残念検証していない。参考掲載まで。
ワンライナーで色相を変えた画像をたくさん作る

知ってると意外と便利かもしれない。ImageMagickを使用したワンライナー。  
色を変えた画像をたくさん作れるので、見てるだけでも結構楽しい。

## コマンド

```
# 環境
$ ls
target.png
$ mkdir results

# 変換スクリプト
$ seq 100 300 | xargs -n1 -I{} convert target.png -modulate 100,100,{} results/target_{}.png
```

## 解説

seqで100-300の数字を作り出し、色相パラメータを変えてコマンドを回す。  
100が通常状態、300まで回すとちょうど色相環一周とのこと。

## 参考

http://imagemagick.rulez.jp/archives/375
俺でもできるAmazon Business請求書払い限度額の上限緩和申請

俺です。
起業まもない俺達が困ることの一つに、法人カードの上限金額が低いという課題があります。
ライフカードつかってるんですけどカード1枚あたりの上限10万円ですよ。
法人利用となると、正直無呼吸待ったなしの金額です。

# そうだAmazon Businessを使おう

そんな俺たちを救う請求書支払い銀行振込コンボがあり、
Amazon Businessでも請求書支払いで決済ができます。ありがとうベゾス。

ただ、1ヶ月以内の[購入可能限度額](https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=201961660#GUID-CAC4B4E3-9AA0-43FB-99DD-BB797AF4B9D8__SECTION_B5572141375D4A8BBB15FEF91A256276)は決まってます。
初期の購入限度額は、弊社のアカウントだと25万円でした。
引っ越しなど、なにかと出費の多い時に25万はこれまた無呼吸なので、
今後ある程度でかい購買処理もさくっとできるようにAWS同様に上限緩和申請をやっときます。

# 購入可能限度額の上限緩和申請方法

[問合せフォームから依頼](https://www.amazon.co.jp/gp/help/customer/contact-us?)します。
Maxいくらまで。というLimitは無かったので適当な値段書いてメール送信ボタンをポチーします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/42755/d294c083-12f1-533d-b22a-1b9bb034eb1f.png)


依頼後、メールで通知が来ます。2018/3時点だと3営業日ぐらいかかるようです。

```
Amazon Businessにご連絡いただきありがとうございます。
請求書払いの上限金額引き上げにつきまして、担当部署に対応を依頼させていただきました。
恐れいりますが、審査には最大3営業日程度のお時間をいただいております。

お急ぎのところ、誠に申し訳ございませんが、担当部署よりEメールにてご案内がございますので、お待ちいただきますようお願いいたします。

その他ご不明な点がありましたら、いつでもご遠慮なくお問い合わせください。
```

# 限度額引き上げの前に

メールで決算報告書クレメンスがクルメンス

```
リクエストいただきました利用可能限度額引き上げについて、より詳細な審査を実施するため、お手数ですが、以下の追加情報をご提出いただきますようお願いいたします。

・決算報告書

ご提出いただく方法

・決算報告書をPDFもしくはJPEG形式で保存してください。
```

# つかいすぎには注意ってことで、

良い決済ライフを！

`完`
bashユーザがPowershellを使うときの注意点

#1.rmやmvのオプション
幸いなことに、`rm`や`mv`といったLinuxで一般的なファイル操作コマンドはデフォルトでエイリアスが差してある。ところがそのオプションについてはそのままでは使えない。

`-vrf`のような一連ねで書く書き方は使えないが、一つ一つ書けば使うことができる。しかし`f`はPowershell側に`force`と`filter`という二つのオプションが用意されているので、フルで書かなければならない。

例1：カレントディレクトリのテキストファイルを`./text`に移動する
bash：`mv -vf *.txt text`
ps：`mv -v -force *.txt text`

例2：カレントディレクトリの拡張子`.tmp`のファイルを削除する
bash：`rm -vrf *.tmp`
ps：`rm -v -r -force *.tmp` 

# 2.コマンドラインのショートカットキー
bashでは`Ctrl+u`でカーソルの左側の文字をすべて消すことができるので、長々と入力したコマンドを全消しするときは使っていた。どうやら普通はF4キーで同じことができるらしい。
ところが僕の環境では使えない。しかたがないので`Ctrl+c`で強制的に次のラインへ移行している。跡が残るのでダサいがしかたない。