OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon Alexa




[失敗しないAlexa開発者アカウントの作り方 ｜ Developers\.IO](https://dev.classmethod.jp/voice-assistant/how-to-safety-create-alexa-developers-account/)をまずは行う。


[アマゾン アプリ 開発者ポータル](https://developer.amazon.com/edw/home.html#/)

![Kobito.9mwo1a.png](https://qiita-image-store.s3.amazonaws.com/0/49910/750721af-5ba1-1a50-b632-1c44b52b333b.png "Kobito.9mwo1a.png")




[Alexa \| アレクサ\| Amazon開発者ポータル](https://developer.amazon.com/ja/alexa)



![Kobito.EykdPb.png](https://qiita-image-store.s3.amazonaws.com/0/49910/00cd24d8-45ad-34ff-88c4-a5ad444a44a9.png "Kobito.EykdPb.png")


プロフィールを新規作成するをクリック



セキュリティプロファイル名
Sample Profile


セキュリティプロファイル名
Sample Profile Description


![スクリーンショット 2018-03-17 19.04.40.png](https://qiita-image-store.s3.amazonaws.com/0/49910/7425a778-880e-57b0-4304-ad843c42b4ce.png "スクリーンショット 2018-03-17 19.04.40.png")





同意して作成



## セキュリティプロファイルの有効化

[アマゾン アプリ 開発者ポータル](https://developer.amazon.com/lwa/sp/overview.html)


![Kobito.eyDFdS.png](https://qiita-image-store.s3.amazonaws.com/0/49910/c55f0c21-77b7-516c-f680-fd4d53e886e2.png "Kobito.eyDFdS.png")


![Kobito.5tvV2o.png](https://qiita-image-store.s3.amazonaws.com/0/49910/e0b6987d-d2c5-1b31-44b2-0f867d70c66a.png "Kobito.5tvV2o.png")


「Consent Privacy Notice URL」にダミーURLを指定し、「Save」をクリックする。
Ionicフレームワークを使わずにIonicのアイコンのみAngularで使う


# 概要
- UIフレームワークのIonic(アイオニック)のフォントアイコンは魅力的
- でも今回はIonic Frameworkは使わずに、生のAngularフレームワークのみとかでIonicのフォントアイコンを使いたい、、、

という方向けのTips。

Ionicのicon fontのみを用意してくれている[ionicons](http://ionicons.com)があり、これを利用すればIonicのアイコンも簡単に利用できます。今回は既存Angularプロジェクトに入れるパターンを想定。[方法1](https://qiita.com/nt_tn/items/76ef48b11f77ff36f069#%E6%96%B9%E6%B3%951-cdn%E3%81%A7%E6%8C%81%E3%81%A3%E3%81%A6%E3%81%8F%E3%82%8B)はAngular以外でもそのまま転用できます。


# 環境
- Angular2以上のお話(1系のAngularJSではない)
- Angularのバージョン 5.2.7
 (Nodeのバージョン 6.11.4)


# [方法1] CDNで持ってくる
これはAngularの使用の有無に関係なく利用できる<head>タグ内に埋め込むだけの方法です。
Angularの場合は、index.htmlの<head>のタグ内に、以下のコードを埋め込めば導入できます。

```
<link rel="stylesheet”  href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
```

[参考] httpで取得したい場合は以下のURLで指定するhttp://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css


# [方法2] npmでインストール
angular-cliを利用している前提。

## 手順1
以下のコマンドでnpm install。

```
npm install ionicons@'2.0.1' --save
```

## 手順2
Angularプロジェクトの".angular-cli.json"のstylesのところに、"../node_modules/ionicons/scss/ionicons.scss"を追加

```
"styles": [
    ...,
    "../node_modules/ionicons/scss/ionicons.scss"
],
```



# 確認
方法1もしくは方法2で導入が終わったら、導入が無事できているかを確認します。html側の追加やCSS側の追加などいくつか方法はありますが、今回はhtml側でclassを追加する方法で確かめます。


任意のcomponentのTemplateファイルで以下のコードを追加します。

```
<i class="ion-social-angular"></i>
```

追加した部分に、Angularのアイコンが表示されていれば導入は成功です。



## 参考
### ionicons
http://ionicons.com で、使いたいアイコンをクリックすると、Class名が出てくるので、それを上記のように、classに記述すればOK。
ゲームをスクリプトで自動制御しよう

```math
\def\textsmall#1{%
  {\rm\scriptsize #1}
}
```
#####免責
- $\textsmall{あなたに対して何も保証しません。}$
- $\textsmall{あなたに対して一切責任を負いません。}$
- $\textsmall{あなたが利用（閲覧、投稿、外部での再利用など全てを含む）する場合は、自己責任で行う必要があります。}$
- $\textsmall{利用の結果生じた損害について、一切責任を負いません。}$
- $\textsmall{あなたの適用される法令に照らして、利用が合法であることを保証しません。}$
- $\textsmall{コンテンツとして提供する全ての文章、画像、音声情報について、内容の合法性・正確性・安全性等、あらゆる点において保証しません。}$
- $\textsmall{リンクをしている外部サイトについては、何ら保証しません。}$

#はじめに
当記事ではLuaスクリプトによって、ゲーム制御する手法を紹介します
モノ自体は初歩的でプログラミングの経験のある人にはすんなりできると思います
説明は少し雑にしておきます　需要があれば詳細にします

下記の動画はスクリプトを使用してゲーム操作をしています。つまり私は操作していません。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Lua COD4 001 <a href="https://t.co/L0HHzg3M5N">https://t.co/L0HHzg3M5N</a> <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a>さんから</p>&mdash; 山田錦 (@qwertyxxxxg) <a href="https://twitter.com/qwertyxxxxg/status/974947684766199808?ref_src=twsrc%5Etfw">2018年3月17日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


#できること
- 一つのボタンへ二つ以上のボタンの機能を割り当てられる
-  正確に同じ操作を何度も繰り返すことができる
    - すなわち、不足したデバイスのボタンやプレイヤースキルを補うことができる
    簡単に言うと１ボタンで波動拳を撃てたり、複雑なコンボも繰り出せる
    - 単純なスマホゲーの面倒なルーチンワークやゲーム開発におけるめんどくさいデバッグ作業を人間の代わりに負担させることができる
- 凡人程度のプレイヤースキルでは不可能な操作もできる

#苦手なこと
- ランダムな要素が絡む操作
- タイミングを判断する
- 長い時間、手順の操作

#おわりに
気分がのれば続きを書きます
仮想マシンを借りてゼロから環境構築、記事まとめ（IDCFクラウド, CentOS7, SSH/HTTP接続, Apache, Tomcat, Java, MySQL, Terminal）

# 仮想マシンはIDCFクラウド
[ご利用の流れ] ( https://www.idcf.jp/cloud/order.html )
[ご利用ガイド] ( https://www.idcf.jp/help/cloud/guide/ )
[めちゃ楽ガイドPDF] ( https://www.idcf.jp/help/cloud/guide/pdf/IDCFCloud_installation_guide.pdf )
CentOS7の導入、SSH、HTTP、ファイアウォールの設定まで、めちゃ楽ガイドどおりに進めれば設定できます。
僕はめちゃ楽ガイド通りに進めた際にSSH接続ができなく、以下自分で調べた方法を取ることにしました。

## CentOS7.xでのSSH/HTTP (Apache)
yum install httpdでApacheが入ってくる
[CentOS7.x 基本設定メモ](https://qiita.com/zaburo/items/c07a7fa6fa82e97f6b10)
[ssh接続の基本(公開鍵認証方式)](https://qiita.com/forestsource/items/86197c30728a29365ef0)
[Linux(CentOS7)でSSHを利用する。](http://www.server-memo.net/centos-settings/system/passwd.html#passwd)
[5分で終わらせるCentOS7のfirewalld設定](https://qiita.com/haminiku/items/56fcb578d86abcd0b571)

[IDCFクラウドでサーバー起動とSSHによるアクセスまで](https://www.pochaneko.com/160929_idcf-server-ssh/)
その後の設定まで別記事にまとめてくださっています。

## パーミッション周りを疑う時に見る記事
[SSHでどうしても鍵認証できないときに見るもの](https://qiita.com/fukusuke/items/6eb9f8593a296a95798c)
[SSHが鍵認証されないとき、パーミッションを疑え。](http://takuya-1st.hatenablog.jp/entry/20090216/1234742055)

.ssh/, id_rsa, authorized_keys だけではなく、
ログイン先のホームディレクトリのパーミッション(他人が書き換えてはならない)も関係します(補足)


## yum / rpm について簡単に勉強
[初心者の頃に知っておきたかった rpm と yum の違いと使い分け](http://blog.inouetakuya.info/entry/20111006/1317900802)
[【初心者にもわかる】rpmとyumの違いと使い分け一通り](https://eng-entrance.com/linux-package-rpm-yum-def)


# JDKをインストール
bitを確認
[CentOSでOSが64bitか32bitの確認方法](http://www.server-memo.net/tips/os-bit.html)

今回はOpenJDKをインストール
[CentOSにJDKをインストール](http://vayacico.hatenablog.com/entry/2016/02/09/204703) 
[OpenJDK 8 インストール](https://www.server-world.info/query?os=CentOS_7&p=jdk8&f=2)

## あとやりたいこと
### ①Tomcat, MySQLは後で追記します
### ②色々設定ができたらAnsibleに落とし込みたいと思います
### ③余裕ができたらElastic Search, Redisも建てます
### ④環境は複数用意したい
[ステージング環境とは？開発環境、検証環境との違いと役割](http://www-creators.com/archives/780)

## ターミナル環境
[Windowsターミナルソフト + Rlogin が最高すぎる！！](https://qiita.com/murachi1208/items/d6e4ce7ba75f1625fe51)
[~/.ssh/config で簡単に複数ホストへのSSH接続を管理する](http://superbrothers.hatenablog.com/entry/20090730/1248971671)
[【 ターミナルを使いやすく。】簡単なshell設定をしよう（VSCode対応）](https://qiita.com/maekun/items/f141e388f2893dd753b6)
[さいつよのターミナル環境を構築しよう](https://qiita.com/b4b4r07/items/09815eda8ef72e0b472e)
WordPress Popular Postsプラグインの日付やカテゴリーのリンクを外す方法


WordPressで記事をビュー数（閲覧数）順に表示する[WordPress Popular Posts](https://ja.wordpress.org/plugins/wordpress-popular-posts/)というプラグインがあります。
設置も管理も分かりやすく簡単にランキング形式に記事を表示できる便利なプラグインですが、記事をカード型で表示する時に日付やカテゴリーのリンクがいらなくなるケースがあります。

![スクリーンショット_2018-03-17_17_54_16.png](https://qiita-image-store.s3.amazonaws.com/0/62022/a7cdcaf0-216b-f635-b67d-6dd972242512.png "スクリーンショット_2018-03-17_17_54_16.png")


WordPress Popular Postsにはテンプレートタグが用意されているので任意の場所に記事のタイトル・カテゴリー・日付などを表示できますが、一部にリンク有り・無しを選択できないタグがあります。

今回はそれらのリンクを削除する方法の記事になります。

## 仕様

- WordPress検証バージョン： 4.8.5
- WordPress Popular Posts検証バージョン： 4.0.11

## カスタマイズ

プラグインをインストールしたらプラグインのディレクトリ内の```includes```ディレクトリ移動します

```WordPressディレクトリ/wp-content/plugins/wordpress-popular-posts/includes ``` 

```includes``` 内にある ```class-wordpress-popular-posts-output.php``` というファイルを編集します。
※編集が不安な方は編集前にバックアップを取っておいてください。

ファイルを開いたら、 **565行** あたりにある以下のコードを見つけてください。

```php:class-wordpress-popular-posts-output.php
$post_tax .= "<a href=\"{$term_link}\" class=\"{$taxonomy} {$taxonomy}-{$term->term_id}\">{$term->name}</a>, ";
```

こちらを以下のように編集してください。

```php:class-wordpress-popular-posts-output.php
$post_tax .= "<span>{$term->name}</span>, ";
```

```<a>...</a>``` がリンクタグにあたるので、それを```<span>...</span>``` に書き換え、不要となったリンク先 ```href="..."``` 表記を削除しています。

これでリンクが外れました。

![スクリーンショット_2018-03-17_18_18_43.png](https://qiita-image-store.s3.amazonaws.com/0/62022/6916ecbd-ffed-70c8-dd9d-296e40a3f57e.png "スクリーンショット_2018-03-17_18_18_43.png")

以上になります。
参考になりましたら幸いです。
ArcGISのツールを作る際に発生した怪奇現象

これの話
https://qiita.com/MALORGIS/items/dd580684c093ee499b1e
python2/3両対応 ArcMap/Pro両方で動かすものとして作成しているので回避しにくい部分もあるのですが...

### 再現性のないSQLiteロック

ArcGISからSQLiteにデータを保存して、SpatialiteでデータをいじりたいのでArcPyで適当にコードを書きました。　　
ArcGISで自動的に追加されるPythonのSQLiteパッケージは古く新しいSpatialiteが使えません。
と言うことでSQLite3.exeを直接使用して処理を実行したい状態です。
またArcPy Toolboxとして作成しているので実行プロセスはArcMap.exeとかになりますしSQLite3は子プロセスとして親プロセス側で管理されます。

再現用のコードです。コマンドラインから実行して
` c = msvcrt.getch()` で処理を止めてSQLite 3でSQLを実行すると` fc` の<font color="DarkRed"><b>レコード数に応じて</b></font>`database is locked`になります。
10件程度のデータでやると何故か起きません。。

```python
import sys
import os

import msvcrt

import arcpy

sqlite_file = r'C:/temp/test.sqlite'
fc = r"C:/temp/JPN.gdb/JPN80_3857_Points"

arcpy.CreateSQLiteDatabase_management(sqlite_file, 'SPATIALITE')

arcpy.env.workspace = sqlite_file
arcpy.arcpy.CopyFeatures_management(fc, 'copyfc')

print('press any key...')
c = msvcrt.getch()
print('you entered', c)

arcpy.Delete_management(sqlite_file)
```

「press any key...」が出てる間に実行するコマンド

```
sqlite3 C:\temp\test.sqlite

CREATE TABLE test (id INTEGER PRIMARY KEY);
```

なぜ件数に応じて再現性が変わるかは謎です。。。:question::question:
もしかしたらデータ構造化も知れませんがそれでも謎です。:question::question:

### ロックへの対処

処理を進めると`arcpy.Delete_management(sqlite_file)`はちゃんと通ることからArcMapはちゃんと管理しており、「おめーに使わせねーわ」という状態のようです。
（´-`）.｡oO（ jャイアンかよ、畜生:persevere:）

英語でいろいろ情報はあるのですが`delete arcpy`でインポートしたパッケージを一回クリアするとか色々面白いです。
<b>arcpy.disconnectみたいなんないんですかね？まじで</b>:anger:

ArcGIS Proはこのツールがあるようですがファイルに有効か分かりません。
http://pro.arcgis.com/ja/pro-app/tool-reference/data-management/clear-workspace-cache.htm

都合、ArcGISが握っているSQLiteファイルを無視して、コピーしましたとさ。

### WTF:-1:
そしてArcGIS Proで試した時、`arcpy.Delete_management(sqlite_file)`でコケました。
ロックしてんのあんただよ...

たぶん<b>ドM</b>:u7981:なのか<b>地縛霊</b>:skull:か何かなんだと思います。

とりあえず`try catch`と言う結界を貼って閉じ込めておきましたが、tempフォルダから消すことは出来ませんでしたとさ。
Pythonのforループでメモリリークした時の対策

自分のトラブルシューティングのメモ。

# 起こった現象

KerasでモデリングするPythonコードを書いたのだが、その中でfor文でデータセットの組を変えながら動かしていくと、3ループ目でメモリリークでエラーが出る。
`Keras: ResourceExhaustedError (see above for traceback): OOM when allocating tensor with shape`
1周目を見ているとメモリは50%程度の使用率なのだが、2週目には95%を超え、3週目で落ちてしまう。
実行時間を見ると、1週目は40分くらいで計算が終わっているが、2週目は2時間以上かかっている。キャッシュが発生しまくっている模様。
(なお、OSはWindows8.1, PythonのバージョンはPython 3.6.0[Anaconda])


# 対策前のコード

main.py (概要だけ)

```main.py
if __name__ == '__main__':
    for i in range(0, 30):
        mykeras(i)
```

mykeras()の引数に0, 1, 2, ...と入れて実行していく。
これをコマンドプロンプトから、`python main.py`で実行していた。
i=2でエラーになる。i=2が問題なのかと思ったが、range(4, 10)とかにしても同じエラーで落ちる。やはりループ回数の問題らしい。


# 想定される原因

forループの時にGCが働いていないっぽい。前のループでのオブジェクトがメモリを専有したままになっているのではないか。
Pythonではこの辺の挙動は遮蔽されているので、本当の原因はよくわからないが……

# 取った対策

Pythonでfor文回すのをやめる。
Pythonで1周動かすなら問題ないようなので、ループ処理をバッチファイルで制御する。


# 対策後のコード

exec.bat

```exec.bat
cd /d %~dp0
for /l %%n in (0,1,29) do (
  python main.py %%n
)
```

main.py (概要だけ)

```main.py
import sys
args = sys.argv
i = int(args[1])
if __name__ == '__main__':
    mykeras(i)
```

これで、myfunc()の引数のを0, 1, 2, ...と代入しながら、実行できる。
main.pyの処理が1回完了するごとにPythonのプロセスを落とすので、最初に挙げたようなメモリリークの問題は解消された。

# 感想

Pythonでも手動でGCする方法はあるようなので、調べてみたほうが良いだろうか (あまり使わないほうが良いとも聞く)。
以前に、Rでメモリリークで悩んだことがあった。その時には思い至らなかったが、実は同じ現象かもしれない。
いずれにせよ、RやPythonの中で解決する方法＝メモリを効率的に使う方法があるならば、それも知っておきたい。
var（型推論）の利用指針について

## `var`（型推論）とは

メソッド内のローカル変数を宣言する際に型宣言の代わりに使用することができます。
コンパイラが自動で型を判断してくれます。

```c#
var i = 10;
// int i = 10; と同じ
```

長い型名の代わりに `var` を使うとコードをスッキリします。

```c#
var dict = new Dictionary<string, int>();
//Dictionary<string, int> dict = new Dictionary<string, int>();
```

あくまで**『暗黙の型指定』**であって型がないわけではありません。
以下のコードはコンパイルが通らないので安心して使用できます。

```c#
var i = 10;
i = "10"; // <-コンパイルエラー。

var hensu; // <- コンパイルエラー。右辺から推論できない。
```

型を明示したコードと `var` を使ったコードは機能的には全く同じです。

## `var` の使用が推奨される場面

### 変数の型が右辺から明らかである場合

以下のように型が明示的な場合には `var` を使用します。


```c#
var i = 10;

var msg = "Hello";

var hero = new Hero { ID = 10, Name = "magneto"};

var apple = new { Name = "王林", price = 100 };  // ※匿名型
```

### `for` および　`foreach` ループでのループ変数の型宣言

- `for` ループの初期化

```c#
for (var x = 1; x < 10; x++) {...}
```

- `foreach` のループ変数の初期化

```c#
foreach (var item in list) {...} 
```

## `var` が非推奨なところ

右辺から型が明らかでない場合、`var` は推奨されません。
以下の例では `result` はユーザ定義の `Result` オブジェクトかもしれませんし、ただの文字列かもしれませんし型がよくわかりません。

```c#
var result = MyClass.GetInfo();
```

また複数の数値型を混在する場合にも `var` は避けられる傾向があるようです。

```c#
var nums = new[] { 1, 2, 3, 4, 5 };
```

`nums` の型は `int[]` になりますが、これに少数が混じれば `double[]` になります。
これにより不具合が発生するかもしれませんが、型を明示していれば防ぐことができます。

## `var` の間違った使い方

### 型が分からないから変数名に型名を含める

変数名に含まれた型が正しいという保証はありません。
型が変わったのに放置されたままになった場合、読み手を混乱させます。

```c#
var intState = GetState(); 
```

### `dynamic` の代わりに `var` を使用する

冒頭でも書きましたが、 `var` はあくまで暗黙の型指定であって型付けは明示的に宣言した場合と全く同じです。
`dynamic` は動的型付け変数を定義するものなのでそもそも用途が異なります。

## IDEの補助

今までの説明と矛盾するかもしれませんが、以下のような場合、でも `var` はよく使われます。
通常、読み手は `GetProductByID` の戻り値は `Prodcut` 型と推測できます。

```c#
var product = GetProductByID(12);
```

Visual Studioならマウスを合わせるだけで型がポップアップされますし、 `var`にカーソルを合わせて定義にジャンプすればで型の詳細がわかります。
ただ、GitHub 等では型が明示されないので読みにくいかもしれません。
また、命名規則にいい加減な開発者が、 単数を返す関数名なのにコレクション型`List<Product>` など読み手が予想しない型を返していた場合でも気づきにくくなります。

## チームのレベル感

上記の通り、 `var` は『型が明示的』な場合に使われることが多いですが、型が明示的の基準が開発者によって異なるかもしれません。

例えばLINQです。

```c#
var list = new List<MyClass>() {...};
var query = list.GroupBy(item => item.Category); // 集約keyはint型とします。
```

慣れた開発者なら一目で `query` の型は `IEnumerable<IGrouping<int, MyClass>>` と理解できます。
LINQ に詳しくない開発者はコードの戻り値を理解するのは難しいかもしれません。
この他にも `File.ReadLines()` が `IEnumrable<string>` を返すなど慣れた人には当たり前と思うことも他の開発者にはわからないかもしれません。

命名規則がしっかりしていて使用するライブラリがチームに浸透しているならこのような `var` の使用はアリだと思います。

## 参考

- [C# のコーディング規則 - MicroSoft](https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/inside-a-program/coding-conventions#implicitly-typed-local-variables)
- [暗黙的に型指定されるローカル変数 (C# プログラミング ガイド)](https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/implicitly-typed-local-variables)
- [[雑記] 型推論の是非](http://ufcpp.net/study/csharp/sp3_var.html#pros_and_cons)
- [var の使いどころ](https://qiita.com/hollydad/items/1516a3f13147a754b9db)
- [【JDK 10】varを使った型推論](https://qiita.com/chooyan_eng/items/f01c336359bc08cfa4b0)

以上、C# の `var` についてまとめました。
Javaでも `var` が導入されるらしく、C#でも改めて使いどころ、利用指針を考えました。
（※ パッと見似ているようですがJavaの `var` が C# と同じかはわかりません。）
Alexa skill kit CLI からスキルを申請

# 概要
* あえてマネジメントコンソールを使わずにAlexaスキルを申請しました。
* スキル申請のためにAlexa Skill Kit Command Line Interfac(ask-cli)を使います。

# Makefileの作成
コマンドを打つのは正直めんどくさいので、ask-cli周りの処理をMakefileに固めます。
ポイントはGithubにアップするであろうファイルなのでskill_idを晒したくないという思いがあります。
そこで、skill_idはconfigファイルから取得してsubmitしています。

```Make:Makefile
all:
	ask deploy -p default

l:
	ask lambda upload --function {ラムダの名前} -s ./lambda/custom

log:
	ask lambda log --function {ラムダの名前} --start-time 1hago

submit:
	$(eval SKILLID := $(shell cat .ask/config | jq '.deploy_settings.default.skill_id'))
	ask api submit --skill-id $(SKILLID)
```

# Submit（スキルの申請）
* あとはMakeコマンドを叩くだけです。
* 無事成功していたら登録してあるメールアドレスに申請受付メールが届きます。

```shell
$ make submit
ask api submit --skill-id "amzn1.ask.skill.xxxxx"
Skill submitted successfully.
```

# まとめ
* ask-cli便利！！
* Developer Portalに入ることなく、コマンドベースでスキル更新・申請ができるようになっています。
* 是非使ってみてください。
Common Lispまとめ


# 本記事について

本記事は私がCommon Lispについて調べたことの備忘録的まとめです。

# Common Lisp まとめ

## 環境構築

### QuickLisp

1. [公式](https://www.quicklisp.org/beta/)からquicklisp.lispをホームディレクトリにダウンロード

2. 以下コマンドを実行

```sh
(load "./quicklisp.lisp")
(quicklisp-quickstart:install)
(ql:add-to-init-file)
```

### Lisp + Vim

* [Steel Bank Common Lisp + vim + slimv](https://qiita.com/kedama17/items/93ae7ccd1839f4bbb567)

* [Steel Bank Common Lisp + neovim + vlime](https://qiita.com/kedama17/items/8c6f068c0cf90a5b481a)

## プロジェクト作成

### cl-projectを使う方法

```cl
(ql:quickload :cl-project)
(cl-project:make-project #p"myproj/")
```

## データ型

### 型を判定したい／取得したい

* 型を判定

```cl
(defvar *x* 1)
; => *x*
(typep *x* 'integer)
; => T
```

* 型を取得

```cl
(defvar *x* 1)
(type-of 1)
; => FIXNUM
(type-of *x*)
; => FIXNUM
```
Linux で仮想的に IP アドレス重複環境を構築する

# はじめに
Linux で `brctl` と `netns` を用いて、IPアドレスが重複したホストが存在する環境を仮想的に構築します。
![dup.svg.png](https://qiita-image-store.s3.amazonaws.com/0/31573/bef92a0e-af15-01cc-a06d-90524c493a52.png)


# 必要なもの
- brctl コマンド
    - Arch Linux なら pacman -S bridge-utils で入ります。

# 構築
### 仮想スイッチの作成
```bash
brctl addbr yabai

ip link set dev yabai up
ip a a 192.168.100.10/24 dev yabai
```

### veth(仮想 LAN ケーブル)の作成
```bash
ip link add y-to-ns1 type veth peer name ns1-to-y
ip link add y-to-ns2 type veth peer name ns2-to-y
```

### 仮想ホストの作成
```bash
ip netns add ns1
ip netns add ns2
```

### 仮想配線
```bash
ip link set ns1-to-y netns ns1
ip link set ns2-to-y netns ns2

brctl addif yabai y-to-ns1
brctl addif yabai y-to-ns2
```

### リンクアップ + IP アドレスの割当
```bash
ip link set dev y-to-ns1 up
ip link set dev y-to-ns2 up

ip netns exec ns1 ip link set dev ns1-to-y up
ip netns exec ns1 ip addr add 192.168.100.4/24 dev ns1-to-y

ip netns exec ns2 ip link set dev ns2-to-y up
ip netns exec ns2 ip addr add 192.168.100.4/24 dev ns2-to-y # dup!
```

### コマンドまとめたやつ
```
brctl addbr yabai

ip link set dev yabai up
ip a a 192.168.100.10/24 dev yabai

ip link add y-to-ns1 type veth peer name ns1-to-y
ip link add y-to-ns2 type veth peer name ns2-to-y

ip netns add ns1
ip netns add ns2

ip link set ns1-to-y netns ns1
ip link set ns2-to-y netns ns2

brctl addif yabai y-to-ns1
brctl addif yabai y-to-ns2
ip link set dev y-to-ns1 up
ip link set dev y-to-ns2 up

ip netns exec ns1 ip link set dev ns1-to-y up
ip netns exec ns1 ip addr add 192.168.100.4/24 dev ns1-to-y

ip netns exec ns2 ip link set dev ns2-to-y up
ip netns exec ns2 ip addr add 192.168.100.4/24 dev ns2-to-y # dup!
```

# 検証
```console
$ sudo arping -I yabai 192.168.100.4 -c 1
ARPING 192.168.100.4 from 192.168.100.10 yabai
Unicast reply from 192.168.100.4 [B2:37:33:07:94:33]  0.562ms
Unicast reply from 192.168.100.4 [A2:7E:B4:EC:B1:9D]  0.581ms
Sent 1 probes (1 broadcast(s))
Received 2 response(s)
```
異なる MAC アドレスのホストから Reply が来れば成功です。
Dockerでローカル開発環境用MySQLサーバを動かす

docker-composeを使うことで
ローカル開発環境用のMySQLの
起動＆DBの初期化(テーブル作成＆初期データ投入)を１コマンドで実行できます

構成ファイルをgitリポジトリで管理することで、
開発者各自がローカル開発環境のDBを簡単に最新化できるようになり
開発効率の向上も期待できるのではないでしょうか

サンプルをGithubで公開しました
https://github.com/rkunihiro/docker-development-db

## ファイル構成と内容

```:ディレクトリ構成
|
+-- conf … MySQLコンテナの設定ファイルディレクトリにマウントされるディレクトリ
|    |
|    +-- custom.cnf … MySQLの設定ファイル
|
+-- init … MySQLテーブル作成＆初期投入データSQL
|    |
|    +-- 00-create-tables.sql … テーブル作成SQL
|    |
|    +-- 01-fixture.sql … 初期データ投入SQL
|
|-- logs … MySQLコンテナのログ出力ディレクトリにマウントされるディレクトリ
|
+-- docker-compose.yml

```

```yaml:docker-compose.yml
version: '3.2'

services:

  mysql: # Mysql container
    container_name: development-mysql
    image: mysql:5.7
    restart: always
    volumes:
      - ./conf:/etc/mysql/conf.d
      - ./logs:/var/log/mysql
      - ./init:/docker-entrypoint-initdb.d
    environment:
      MYSQL_ROOT_PASSWORD: rootPassword
      MYSQL_DATABASE: sample
      MYSQL_USER:     test
      MYSQL_PASSWORD: passwd
      TZ: Asia/Tokyo
    ports:
      - 3306:3306

  pma: # phpMyAdmin container
    container_name: development-pma
    image: phpmyadmin/phpmyadmin:latest
    restart: always
    environment:
      PMA_USER: root
      PMA_PASSWORD: rootPassword
    ports:
      - 8080:80
    links:
      - mysql:db

```

## 使い方
ターミナルアプリケーションを起動し
docker-compose.ymlファイルがあるディレクトリに移動して以下のコマンドを実行します

### 起動
```sh:
$ docker-compose up -d

```

### 一時停止
```sh:
$ docker-compose stop

```

### phpMyAdminを使う

- Webブラウザで `http://localhost:8080/` にアクセス

### 開発中のプログラムからDocker上のMySQLに接続する設定

|設定項目|設定値|
|:---|:---|
|Host|localhost|
|Port|3306|
|DB|sample|
|User|test|
|Pass|passwd|
- 変更していない場合の設定値です


### テーブル構成やデータの修正時

- initディレクトリ配下のSQLを修正する
  - phpMyAdminを使用してエクスポートした物をSQLファイルに上書きするなど
- 下記の再起動コマンドを実行

### DB名や接続ユーザ名・パスワードを変更

- `docker-compose.yml`の  
  `MYSQL_DATABASE`,`MYSQL_USER`,`MYSQL_PASSWORD`を変更
- 下記の再起動コマンドを実行

### 再起動 （設定ファイルやSQLを修正した/更新された場合）
```sh:
$ docker-compose down

$ docker-compose up -d

```

その他、不明点などありましたらコメントにてお寄せください
DebianのlocalでVirtualHost使うときのメモ

毎回記憶も物理メモも吹き飛んでるので、メモです。

# 雑に
1. /etc/apache2/sites-available にconfを書く
2. a2ensiteする
3. /etc/hosts にServerName足す
4. apache restart
5. ファイルのパーミッション修正

#具体的に

http://local.test にアクセスしたとき、
/var/www/test/public_html/index.php が動作することを目標にします。

## sites-available conf

`/etc/apache2/sites-available/local.test.conf` を作成し、以下の通り書き込みます。

```
<VirtualHost *:80>
    ServerName local.test

    DocumentRoot /var/www/test/public_html/

    <Directory /var/www/test/public_html/>
        Options FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
       
```

## a2ensite

次のコマンドを打ち込みます。

```bash
sudo a2ensite local.test.conf
```
/etc/apache2/sites-enabled にlocal.test.confができていることを確認して下さい。


## /etc/hosts

/etc/hostsファイルの先頭に次のようにlocal.testを追加します。

```
127.0.0.1       localhost local.test
```

これがないとApacheはlocal.testのアドレスを探しにネットの海へ旅立ちます



## Apache restart
次のコマンドを打ちます。

```
sudo /etc/init.d/apache2 restart
```

## パーミッション

```bash

mkdir /var/www/test/public_html -p
echo "nya-n!" > /var/www/test/public_html/index.php

sudo chown www-data:www-data /var/www/test/public_html/ -R
sudo chmod 764 /var/www/test/public_html/ -R
```

## おわり

http://local.test にアクセスして"nya-n!"と表示されたら成功です。
ノンエンジニアのための初めてのGulp

## はじめに
この記事はGulpをまずは使ってみたい！というレベルの人向けの記事です。
Gulpの設定を自分で作りたい方は対象外となりますので、ご了承ください。

※node.jsのインストール方法など、もっと良いやり方はありますが、プログラムを書いたりターミナルを触ることに慣れていない人向けなので、最低限のやり方でご紹介させて頂きます。

## Gulpを触ってみよう！
### 使えるようにする準備
#### 1. node.jsをインストール。
node.jsは https://nodejs.org/ja/ からインストーラーをダウンロードしします。
バージョンが2つありますので、お好きな方を選択してください。

![node.jpg](https://qiita-image-store.s3.amazonaws.com/0/244261/c130e336-584c-c9ab-6a01-998c4f026eb6.jpeg)

　※私は右側の最新版を使用しています。

ダウンロードが完了したら、インストーラーを起動し、画面の案内に沿ってインストールします。
（特に設定を変更する必要はございません。）

#### 2. node.js、npmがインストールされたことを確認
Macならターミナル/Windowsならコマンドプロンプトを起動し、下記コマンドを入力します。
これらコマンドは、それぞれのバージョンを確認するコマンドです。

- node.jsの確認方法

```terminal:command
node -v
```

- npmの確認方法

```terminal:command
npm -v
```
![terminal_mod.jpg](https://qiita-image-store.s3.amazonaws.com/0/244261/508e2ce3-010d-5cfc-15aa-0c6f70e0d042.jpeg)


成功すると、このようにバージョンが表示されます。

#### 3.gulpをグローバルにインストールする
下記コマンドをターミナルに入力します。

```terminal:command
npm install -g gulp
```
※もしエラーになった場合は、管理者権限で実行してみてください。

```terminal:command
sudo npm install -g gulp
```

#### 4.https://github.com/aki0923f/my_template をダウンロードして任意のディレクトリに格納
私の方でGulpがすぐに使えるファイルをご用意いたしました。
こちらをダウンロードし、任意のフォルダに格納してください。
ここでは例として、Desktopに置きます。

```:ディレクトリ構造
/Users/aki-f/Desktop/my_template-master/
```

#### 5. ターミナル（コマンドプロンプト）でダウンロードしたディレクトリに移動し、必要なパッケージをインストールする。
Macならターミナル/Windowsならコマンドプロンプトを起動し、下記のように4.でダウンロードしたフォルダに移動します。

```terminal:command
cd /Users/aki-f/Desktop/my_template-master/
```

その後、下記コマンドを入力し、パッケージをインストールします。（結構時間かかります。）

```terminal:command
npm install
```

#### 6. gulp で起動する。
インストールが完了したら、下記コマンドを入力することでGulpを起動することができます。

```terminal:command
gulp
```

無事ブラウザで下記の画面が開けたら、成功です！
![screen.png](https://qiita-image-store.s3.amazonaws.com/0/244261/1be55e61-c107-26e0-dcd3-9692a9a34075.png)

### もう一度Gulpを起動したい時
一度PCをシャットダウンした等・・・Gulpを落としてからもう一度立ち上げた際は、下記の手順で起動できます。
1. ターミナルを起動し、5.で行ったディレクトリ移動を行う。
2. `gulp`と入力し実行

## 2回目〜のGulpの使用方法
上記4〜6を行うことで、Gulp環境を構築できます。

## 画像軽量化のタスク起動方法
画像軽量化タスクは常時起動しているとめちゃくちゃ重たくなってしまったので、watchタスクに入れておりません。
画像を保存する度に、ターミナルで下記コマンドを実行してください。

```terminal:command
gulp optimizeImage
```

## その他補足
https://github.com/aki0923f/my_template 内のファイルの使用方法は README.md に記載しておりますので、併せてご覧ください。

また、何か改善点やお気づきの点がございましたらフィードバック頂けますと嬉しいです。
Raspberry Pi3を購入 ～ノートPCからの設定

Raspberry Pi3を買いました。
買った後に、ノートPCしなかいので、ディスプレイ、キーボードを直接接続できないことに気づきました。困った。

# Raspberry Pi3の購入
どこで買うか悩んだのですが、[日経BP](http://trendy.nikkeibp.co.jp/pcls/raspi/)のサイトから購入しました。最初なのでよくわからないので、何かあった時に少しでも対応が良さそうなところを考えました。
本体、ケース、スターターキット（電源、OS書き込み済microSD、HDMI)を購入しました。

# 接続
ノートPCのHDMI端子は出力用で繋げないし、キーボードも使えないということで、ssh接続できないかと試しましたが、初期値ではssh接続できなくなっているようです。

準備したもの

* HDMI端子付きテレビ（最近はほとんど付いているのかな、うちのテレビにもついていました。）
* LANケーブル
* HDMIケーブル
* USBマウス

大まかな流れです。

1. テレビでは、マウスの操作のみ可能。SSH接続の設定はマウスで可能なためSSH接続の設定まで行う。
2. ノートPCからSSH接続する。以降、テレビ、HDMIケーブル不要
3. Wi-Fiの設定を行う。以降、LANケーブル不要
4. リモートデスクトップの設定

あらかじめ、ノートPC側にTeraTermなどのssh接続用のソフトをインストールしておく必要があります。

## テレビでの初期設定
それぞれのケーブルを接続し、電源を入れます。OS書き込み済のmicroSDのためしばらく待つとテレビにインストール画面が表示されました。

* 下の言語が「日本語」になっていることを確認
* 一番上のRaspbianにチェックを入れ、「インストール」ボタンをクリック
* 確認画面が表示されるので、「はい」をクリック

かなり時間がかかりますが、OSがインストールされます。

### SSH設定
SSH接続の設定を行います。SSH接続の設定は、マウスのみで行えます。
Raspberryマーク → 設定 → Raspberry Piの設定の順にメニューを選択します。

![raspberry_set.png](https://qiita-image-store.s3.amazonaws.com/0/212365/d50e0cc2-6093-c8e9-b31b-c1f18f577d36.png)

設定画面から「インタフェース」タブを選択
SSHを「有効」に設定する。

### ローカライゼーション設定
ついでに、「ローカライゼーション」タブの設定も行いました。
ロケールの設定　言語-ja、国-JP、文字セット-UTF-8
タイムゾーン　地域-japan
キーボードの設定　Country-日本、Variant-日本語
無線LANの国設定　JP Japan

以上で、ノートPCからssh接続可能となるので、テレビ、HDMIケーブルは不要です。

## ノートPCからの接続
### 接続
Raspberry PiのIPアドレスは、DHCPで取得されるため、自分のノートPCのアドレスから類推し接続しました。
まず、ipconfigコマンドで自分のノートPCのIPアドレスを確認、同じネットワークアドレス内のIPアドレスを順にpingを打っていけば私の環境ではすぐに見つかりました。

Tera TermでIPアドレスを入力し接続
ユーザ名：pi
パスワード：raspberry

### パスワードの変更
接続後、セキュリティのため、すぐにパスワードを変更します。

```
pi@raspberrypi:~ $ sudo raspi-config
```

以下を選択し、パスワードを変更します。

```
 1 Change User Password           Change password for the current u
```

もっとセキュリティを強化する場合は、ssh鍵の設定を行ってください。

### Wi-Fiの設定
続いて、Wi-Fiの設定を行いました。
Network Optionsを選択

```
2 Network Options                Configure network settings
```

Wi-fiを選択

```
N2 Wi-fi                         Enter SSID and passphrase
```

SSID、パスワードの順に入力します。
Wi-Fiからの接続は、別のIPアドレスとなったため、接続し直しました。
これで、LANケーブルは不要です。

### リモートデスクトップの設定
Raspberryに、xrdpをインストールします。

```
pi@raspberrypi:~ $ sudo apt-get update
pi@raspberrypi:~ $ sudo apt install tightvncserver
pi@raspberrypi:~ $ sudo apt install xrdp
```

日本語キーボート対応には以下を実施しておくとよいようです。
```
cd /etc/xrdp/
sudo wget http://w.vmeta.jp/temp/km-0411.ini
sudo ln -s km-0411.ini km-e0010411.ini
sudo ln -s km-0411.ini km-e0200411.ini
sudo ln -s km-0411.ini km-e0210411.ini
sudo service xrdp restart
```

これで、ノートPCからリモートデスクトップ接続が可能となります。
ただし、root権限が必要なメニューは利用できないようです。とりあえず、ターミナルからsudoでコマンドベースで実行かな。

無事環境が整いました。HDMIケーブルは最初しか利用しませんでした。今後は、ノートPCとテレビの接続に使うか、
これからが本番です。Raspberry Pi3にセンサーを接続し、データを取得、データの分析が行いたいと考えています。

※環境によっては、上記の通りでは対応できない場合も考えられます。購入の際は、ご自身の責任でお願いします。
PHPビルトインサーバーの使い方とnamespaceについて

## Macに入っていたバージョンは7.1.7だった

CLIで勉強でもすっかと思ってバージョン確認してみた。

```
$ php -v
PHP 7.1.7 (cli) (built: Jul 15 2017 18:08:09) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
```

* phpコマンド通ったので何かで入れてたのか・・・？
* Macって標準で入ってた。
* せっかくだしつかおう。

## PHPのビルドインサーバー機能を使う

最近良く知られるようになったがPHPには簡易的なサーバー機能がある。

とても簡単にできるのでテストとかにはちょうどいいが、動作モードや権限が違うためApacheなどのサーバー用アプリの開発には向いていない。

開発に使うというよりは手軽に始めたい人向けと言える。

ちなみに、公式のページでは以下のような文が掲載されている。

> 警告
> このウェブサーバーは、アプリケーション開発の支援用として設計されたものです。 テスト用に使ったり、制約のある環境でアプリケーションをデモするために使ったりすることもできるでしょう。 あらゆる機能を兼ね備えたウェブサーバーを目指したものではないので、 公開ネットワーク上で使ってはいけません。

コマンドはこうなってる。

```
$ php [options] -S <addr>:<port> [-t docroot] [router]
```

* [options]
    * サーバー起動時のPHPの設定値などの指定だと思う（適当Â
    * テスト程度では特に必要ないのでは？？
* &lt;addr&gt;
    * アドレスの指定、よく見かけるのは`localhost`とかの指定
* &lt;port&gt;
    * ポートの指定、`8080`とか`80`とか`4649`とか**好きなの入れたらいいんじゃない？**
* [-t docroot]
    * ドキュメントルート
    * サイトのトップページとか置いているところ
* [rooter]
    * HTTP Requestを処理するPHPスクリプトを指定できる。
    * リクエストに対して特別なことをしたいときだけ必要なんじゃない？

というふうに、結構複雑なこともできそうだけど、ぶっちゃけ業務では使うなっちゅ～ことですな。

なのでrouterなんかいらんのとちゃう？

まあ、使うならこんな感じのコマンドになるわけだ。

```
$ php -S localhost:8080 /path/to/document/root
```

---

# PHPのnamespaceを使っていこう

PHPの関数読み出しの機能にnamespaceという物がある。

Pythonでいうとモジュールが近いだろう。

C#のネームスペースとは違うかな？

よくわかってないので軽くやっとこう。

## まず読み出すClass関数を適当に作ろう

* 作業ディレクトリに`libs`ディレクトリを作る。
* その中に`Myclass.php`を作る。

```php
<?php
namespace libs;

class MyClass {
    static function test() {
        echo 'echo in MyClass';
    }
}
```

## 呼び出しする

* `lisb`と同じ階層に`index.php`を作る。

```php
<?php

// import class file
require __DIR__ . '/libs/MyClass.php';

// call test function on MyClass
libs\MyClass::test();
```

* `\`はバックスラッシュ。
    * windowsだと`￥`マークだったりするんだけど、Macだと区別されるので気をつけよう。
    * windows環境の場合は`￥`マークでも問題ないがMac環境ではハマるかもしれない。


## useキーワードはいらないの？

混乱する原因と言うか、なんというか。。ｗ

HTMLで言うところの`basename`のような使い方と`Python`の`from`キーワードのような使い方ができる。

### basenameのような使い方

長いnamespaceや途中まで一緒のnamespaceを省略するために使用する。

```php
<?php
namespace App\Lib\Mail {
    function AnalizeHeader {...}
    function DecordBody {...}
}
```

```php
require __DIR__ . '/libs/Mail.php';
use App\Lib\Mail as Mail;

Mail\AnalizeHeader();
Mail\DecordBody();
```

## Pythonのfromのような使い方

クラス名まで指定して使用する

```php
require __DIR__ . '/libs/MyClass.php';
use libs\MyClass;

MyClass::test();
```
curl で作る簡易 API クライアント

## too long; don't write :P

なんか色々かけるかと思ったけど、あまり書くことが無いことに気がついた←
のでスニペットをペッてして終わりにする。

最近というか、定期的に [curl のオプション集](https://qiita.com/takayukioda/items/edf371b3566bea64d046) にイイネが付くから、こういうのも需要あるかな〜と思った次第。

あまり凝った事をせずに、ある程度の部分を決め打ちで作ってしまうようなモノであれば curl だけでも十分実用的な API クライアントができた。Cookie を使っているのは認証にセッションを使っているからだけど、token で認証するのであれば `-H` オプションでヘッダーを追加すれば OK。
他にも、リクエストが `json` 形式をサポートしていなければ `--data-urlencode` オプションで個別に渡せば対応できる。

```bash
readonly COOKIE_FILE=/tmp/cookie.txt

post() {
  local item_id=$1
  local value=$2
  local params=$(cat <<-EOS
{ "some": "${value}",
"number": 123,
"array": [1,2,3] }
EOS
)

  curl -c $COOKIE_FILE -b $COOKIE_FILE \
    -X POST \
    -H "Content-Type: application/json" \
    --data "${params}" \
    https://example.com/api/items/${item_id}
}

post 6 "value with space"
```
GoogleAnalyticsを実践してみた（導入編）

<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-116132394-1"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'UA-116132394-1');
</script>

某金融会社のシステム部門に勤めるweb系エンジニアの自分が、webマーケティングの方面へ徐々に方向転換したくなったため、無料の分析ツールであるGoogleAnalytics(以下GA)を実践したときの備忘録です。

GAに登録～簡単な静的サイトにタグを埋め込むまでの**導入編**。

アウトライン ~GAを導入するための3STEP~

 1. トラッキングIDを取得する
 2. GAタグをサイトに埋め込む
 3. GAコンソールで確認する


## 1. GAトラッキングIDを取得する

`Googleアカウントを持っていないとGA利用できないみたいので持ってなかったら作ってください`

### [GA公式サイト](https://analytics.google.com/analytics/web/)で使用開始する
ページに使用開始ボタンがあるのでそれをクリック

### アカウント情報を入力する
アカウント名、分析するWEBサイト名、サイトのURL、タイムゾーン（日本でいいはず）を入力する。
![create_googleanalytics_account_.png](https://qiita-image-store.s3.amazonaws.com/0/56388/ae9d4d2c-49ba-8170-d209-63c3f86ff071.png)


### GAトラッキングIDを確認
ログイン後のページに書いているので確認する。
`<!-- Global site tag (gtag.js) - Google Analytics -->`から始まるスクリプトがある。
![show_account_info.png](https://qiita-image-store.s3.amazonaws.com/0/56388/5308345a-8f35-b2b6-f7d4-a2739f67370b.png)


## 2. GAタグをサイトに埋め込む

### 簡単な静的HTMLを用意する

### `<html>`の直後にグローバルサイトタグをコピペする
`<!-- Global site tag (gtag.js) - Google Analytics -->`も含める。いろんなタグを埋め込む場合、識別のために

## 3. GAコンソールで確認する

### 実際にアクセスしてみる（[GA公式サイト](https://analytics.google.com/analytics/web/)）

### アクティブユーザー数が「１」になってる！！
![active_1_user.png](https://qiita-image-store.s3.amazonaws.com/0/56388/7fa78d11-a1bf-868d-c5e9-8293e2130a9a.png)
AOJのBinary Searchを解いてみた

こんにちわ
[グローバルセンス株式会社](https://gb-sense.com)のskanehiraです。

今回はAOJの[Binary Search](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_4_B&lang=jp)を解いてみました。
タイトルを見た時に難しいそうだなぁと思いましたが
案外簡単だった…

# **問題**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/66178/fd393aec-f36e-b941-ac87-85332b6cb246.png)

要約すると
２行目の数列に４行目の数列の値がいくつ含まれているかを出力しろ
という内容です。

# ソース
正直1，3行目の入力は要らないかなぁ…
わざわざスキップする処理を入れたくないので。

```java
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        try (Scanner scan = new Scanner(System.in)) {
            // スキップ
            scan.nextLine();

            // 検索対象をmapに格納する
            Map<String, String> map = new HashMap<String, String>();
            for (String num : scan.nextLine().split(" ")) {
                map.put(num, "");
            }

            // スキップ
            scan.nextLine();

            // 検索対象が存在する場合はカウントする
            int count = 0;
            for (String num : scan.nextLine().split(" ")) {
                if (map.containsKey(num)) {
                    count++;
                }
            }

            System.out.println(count);
        }

    }

}
```

# **解き方**

```java
for (int i : targetNums) {
    for (int j : nums) {
        if (i = j) count++;
    }
}
```
２行目と４行目を配列に格納して
ぐるぐる回しながら比較すれば行けるかなぁと思ったのですが
for文を２重にするのは効率悪いなので
mapを使うことにしました。

検索対象をmapのキーにしてキーチェックをした方が処理が早いはず！（検証はしていないが）

他にもっと効率良いやり方ないかな…
Dockerコンテナ上のPythonでファイルのmime-typeを識別したい

# やりたかったこと＆この記事でやること

　Dockerコンテナ上で動作するflaskを使ったWebアプリケーションで、ファイルがアップロードされた時にそのファイルのmime-typeを知りたかった。ダウンロードするときにもmime-typeを指定しないとブラウザで画像表示ができないかも、と思ったため。
　そこで、とりあえずコンテナ上でファイルのmime-typeを取得できるか確認する。

# 構成

* Dockerベースイメージ：[python:3.6.4-alpine3.7](https://hub.docker.com/r/_/python/)
* ファイル識別ライブラリ：[python-magic ](https://github.com/ahupp/python-magic)

# 実装

Githubにて。https://github.com/touka9029/python_magic_docker

ポイントはAlpine Linuxのapk `libmagic`をDockerfileで追加する。
https://pkgs.alpinelinux.org/package/edge/main/x86/libmagic

```Dockerfile
FROM python:3.6.4-alpine3.7

RUN set -e; \
        apk add --no-cache --virtual .build-deps \
            libmagic \
            ; \
        pip install --upgrade pip; \
        pip install python-magic;

COPY testdata /testdata
```

python-magic が使えるか確認。
コンテナ立ち上げ＆コンテナ上でシェル操作

```shell
docker-compose up -d --build
(--略--)
docker exec -ti python_magic sh
```

コンテナ上でpython実行

```
python3
Python 3.6.4 (default, Jan 10 2018, 05:20:21)
[GCC 6.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.

>>> import magic
>>> magic.from_file("testdata/lena.jpg")
'JPEG image data, JFIF standard 1.01, resolution (DPI), density 72x72, segment length 16, comment: "Created with GIMP", baseline, precision 8, 320x320, frames 3'

>>> magic.from_file("testdata/my_icon.png")
'PNG image data, 420 x 420, 8-bit/color RGB, non-interlaced'

>>> magic.from_file("testdata/my_icon.png", mime=True)
'image/png'
```

mime-type取得できました。

# libmagicとはなんぞや？

> This functionality is exposed to the command line by the Unix command `file`.

python-magicのUsageより引用。そもそもpython-magicはUnix commandの`file`を拡張（ラッパー）したライブラリのようです。
`file`コマンドはUnixでファイルの種類を調べる際に使うコマンドのようで、その時に使用しているのが`libmagic`というパッケージなのかな、という認識です。

Windowsで使う場合はlibmagicに代わるdllファイルを所定のフォルダに配置しないといけないようですね。
gccのオプション入力の手間を省く

# 要約
gcc コマンドを実行する際、alias(linux)やバッチファイル(Windows)を用いることにより、オプションの入力の手間を省く方法

# 背景
大学のC言語の授業でソースファイルのコンパイルをする際、オプションをつけることが義務付けられたのだが、毎回入力すると~~めんどくさい~~打ち間違いが起こるため、手間を省く方法を考えてみた。

# 環境
Linux：Ubuntu MATE 16.04
Windows：Windows10

# 授業にて必須または推奨となっているオプション
-o    実行ファイル名を指定する
-lm    数学関数(sin, sqrt etc.)を用いる場合に必要なオプション
-ansi -pedantic 厳格な ANSI仕様でのコンパイルを行う
-Wall    文法チェックで疑わしい箇所を全て表示する

## 例
ソースファイル名がtest.c、実行ファイル名がtest.exeの場合

> C:\\>gcc test.c -o test.exe -lm -ansi -pedantic -Wall

# バッチファイル (Windows)
## 内容
メモ帳などのテキストエディタで下のバッチファイルを作成する
（バッチファイルのファイル名は任意の名前でよい）

```bat:a00_begin_gcc_exe.bat
@echo off

for %%f in (%*) do (
  echo %%f

  if "%%~xf"==".exe" (
    echo --------------------------------

    %%~nxf

    echo --------------------------------

  ) else if "%%~xf"==".c" (
    echo compiling the .c file
    gcc %%~nxf -o %%~nf%filename_exe% -lm -ansi -pedantic -Wall
  )
)

pause
```

## 使い方
### ソースファイルのコンパイル
ソースファイルをバッチファイルにDrag & Dropする
### 実行ファイルの実行
実行ファイルをバッチファイルにDrag & Dropする
## 特徴
- このバッチファイルがフォルダで一番上に表示されるため、名前を "a00_..." とした
- 複数ファイルを同時に指定できる
- ソースファイルと実行ファイルを同時に指定することで、コンパイルと実行を順次に行うことが可能である

# alias (Linux)
## 内容
下の内容を ~/.bashrc に追記し、

```bash:~/.bashrc
function gcc2(){
	FILENAME=$(basename $1);
	CFILE=$(basename $1 .c);
	gcc -o $CFILE.out -lm -ansi -pedantic -Wall $FILENAME;
}

alias gcc2=gcc2
```

```shell-session
$ source ~/.bashrc
```
を行う
## 使い方
### ソースファイルのコンパイル
```shell-session
$ gcc2 test.c
```
## 特徴
- 複数のソースファイルの指定は不可能である
- Tabキーを用いたファイル名の補完が可能である


# 参考文献
『GCCを用いたプログラミング』（大学の授業のハンドアウト）
railsでapiを使ってtwitterフォロー機能を作る

# 仕様

* twitter apiを使って任意のユーザーのフォロー機能を作る。
* ruby on rails

urlじゃなくてapiを使うのはcontrollerで複数の処理を行い、その処理の中でフォローをするという機能を作りたいため。

# twitter OmniAuthでログイン機能を作る

「OmniAuthを利用して、Twitterログイン機能を作る【初心者向け】」
https://qiita.com/To_BB/items/01863aa50d628c069b64

twitter apiはOmniAuthで認証されていないと使えないので上記の記事を元に実装

# twitter gem追加

```
gem 'omniauth'
gem 'omniauth-twitter'
gem 'twitter'
```

# controllerにフォロー機能追加

```ruby
class PostController < ApplicationController
  before_action :twitter_client
  before_action :set_post, only: [:follow,:show]
  def show
  end
  def follow
    @user = User.find_by(id: @post.user_id)
    @client.follow(@user.uid.to_i)
    redirect_to root_path
  end

  private
  def twitter_client
    @client = Twitter::REST::Client.new do |config|
      config.consumer_key = ""
      config.consumer_secret = ""
      config.access_token = ""
      config.access_token_secret =""
    end
  end
  def set_post
    @post = Post.find_by(id: params[:id])
  end
end
```
```routes.rb
get "post/:id/follow" => "post#follow"
```

結構postのidをshowからfollowに渡すのに手間取った。結論URLにidを入れて受け渡しをした。個人的にはapplication_controller.erbにいれた方が他のところでもtwitterapi使えて便利。ただtwitter_clientを毎度そのメソッドの前に行わないといけないのでbeforeで指定するのを忘れずに。

また

```
config.access_token = ""
config.access_token_secret =""
```
はユーザー固有のものになるのでログイン時に取得して保持する必要がある。
[ JavaScript ] ユーザーエージェントを判定し、<body>にクラスを付与する

jQueryを使わず、JavaScriptのみで書いてみる版です。

スマートフォンの時は"sp"
　更にiPhoneの時は"iphone"、Androidの時は"android"

タブレットの時は"tablet"
　更にiPadの時は"ipad"、Androidの時は"android"

それ以外の時は"pc"
を付与します。

##Script

```ua_addclass.js
window.onload = function () {
    var ua        = navigator.userAgent,
        bodyClass = document.body.classList;

    if (ua.indexOf('iPhone') > 0 || ua.indexOf('Android') > 0 && ua.indexOf('Mobile') > 0) {
        // スマートフォン
        bodyClass.add('sp');
        
        if(ua.indexOf('iPhone') > 0)  bodyClass.add('iphone');   // iPhone
        if(ua.indexOf('Android') > 0) bodyClass.add('android'); // Android

    } else if (ua.indexOf('iPad') > 0 || ua.indexOf('Android') > 0) {
        // タブレット
        bodyClass.add('tablet');

        if(ua.indexOf('iPad') > 0)    bodyClass.add('ipad');       // iPad
        if(ua.indexOf('Android') > 0) bodyClass.add('android'); // Android
    } else {
        // PC用コード
        bodyClass.add('pc');
    }
}// window.onload
```
CKeditorで1on1メッセージング機能（チャット）を作って画像をアップロードする

#CKEditorのインストール
footer.phpの

```footer.php
<?php wp_footer(); ?>
</body>
</html>
```

の前に以下を入れる。cdn便利！

```footer.php
  <script src="https://cdn.ckeditor.com/4.9.0/standard/ckeditor.js"></script>
  <script src="<?php echo get_template_directory_uri(); ?>
/js/ckeditor_setting.js"></script>
```

#CKEditorの設定

テーマフォルダにjsフォルダがあったのでそこに
`ckeditor_setting.js`
を作った。

```ckeditor_setting.js
CKEDITOR.replace('editor1',{
  // uiColor: '#fff',
  height: 400,
  scayt_autoStartup: false,
  toolbarLocation: 'bottom',
  forcePasteAsPlainText: true,
  fillEmptyBlocks: false,
  tabSpaces: 0,
  // toolbar: [
  //   ['Image'],
  //   ],
});
```
中身はこんな感じ。


#ckfinderのインストール

https://ckeditor.com/ckeditor-4/ckfinder/
ここからckfinderをダウンロードし、
先ほどのjsフォルダにインストール（コピペ）。

現状の安定版はv4.9.0のようです。

config.phpを編集する。

v4.9.0の場合は、
config.php
29行目
`return false;` を `true` に
69行目
`    'baseUrl'      => '/ckfinder/userfiles/';`
を、WordPressに入れるので
`    'baseUrl'      => bloginfo($url).'/wp-content/uploads/chatmb/',`
とする。



↑　ってので動くと思ったら動かない！！(´；ω；｀)
AutoHotKeyで簡単GUIアプリを作るのだ

## 開発環境を作ろう
AutoHotKeyが無いとはじまらないココでダウンロード

https://autohotkey.com/

書くのはテキストエディタ、メモ帳でもなんでもいいです。
フリーで使えてAHKも対応してるの（色が付いたり）を紹介しておきます。

Visual Studio Code - Microsoft
https://www.microsoft.com/ja-jp/dev/products/code-vs.aspx

サクラエディタ
http://sakura-editor.sourceforge.net/


## とりあえずGUI表示してみる hoge.ahk

```ahk
/*
	hoge.ahk
	AutoHotKeyで簡単GUIアプリを作るのだ
*/

; Config ______________________________________________________________
AppName      := "AutoHotKeyで簡単GUIアプリを作るのだ"
WindowColor  := "55C500"
FontColor    := "FFFFFF"
ControlColor := "FFFFFF"

; GUI _________________________________________________________________
GUI,Color, %WindowColor%, %ControlColor%
GUI, Margin, 10, 10

; ヘッダ
GUI, Font, S18 Bold ; フォントサイズを指定
GUI, Add, Text, C%FontColor% GdevReload, %AppName% ; AppName表示

GUI, Font, S9 Norm
GUI, Add, StatusBar ; ステータスバーをくっつけます
SB_SetText("SB_SetText(""ほげで書き換え"")")

GUI, Show, X0 Y0    ; GUI終わり　とりあえず表示
return

; /GUI ________________________________________________________________

; リロード
devReload:
	Reload
return

; 閉じたりCtrl+Qで終了
^Q::ExitApp
GuiClose:
	ExitApp
return
```
Quiita色でAppNameを表示するダケのアプリが完成しました。

![hoge.ahk.png](https://qiita-image-store.s3.amazonaws.com/0/225187/f54cfd9f-efe4-fa1d-8074-3985224c18ad.png)



ステータスバーもあるし、AppNameをクリックすると自身をリロードします。
とても簡単…

しかしきもちわるい文法ですね
まず代入が:=てなんだよ。
=（イコール）でも代入できるのですが、値が文字列で処理されます。

```
AppName      := "AutoHotKeyで簡単GUIアプリを作るのだ"
AppName      = AutoHotKeyで簡単GUIアプリを作るのだ
```

上記は同じ。クオート省けて一見便利そうだけど、関数とかx + 1とか代入する時文字列にされてよくミスるので、ぼくはahkの代入は:=を使う事にしています。

変数の展開は %Val% です。
% Val　のように %(空白)Val とすると以後が全部展開になるようです。
%(空白)Val1 Val2 Val3…
きもちわるい。

文字列の変数くっつけるのは

hoge := fuga . piyo 

.（ドット）で結合するんだけど 

hoge := fuga.piyo

だとエラーになります。めんどくせぇ。
空白開けてあげましょう。 

コメントは/* コメント */と ;コメント が使えます。きもちわるくない。

; /GUIの下の部分はラベルです。
AppNameをクリックするとリロードする仕組みです。
AppName表示の所でOption GdevReloadで触ったらdevReload:ラベルしろ！と命令しています。
GはきっとGotoのGですね。

GuiClose:はAHKの予約語です。
^はCtrl QはQキー　Ctrl+Qでもここ来なさい　ExitApp

独特な仕様多いけどGUIが簡単に作れるし、exe書き出しもできるので便利かも。

ベースができたので色々なGUIを追加していこうと思います。

つづく

## 参考
AutoHotkey Wiki
http://ahkwiki.net/Top
Google Apps Scriptでサービスアカウントを使いGoogleカレンダーにイベントを登録する

## はじめに

Google Apps Scriptでサービスアカウントを使えないかと思い、ぐぐったら以下の記事が見つかった。

[Google Apps ScriptでService Accountを利用して認証する ~GASを使ってAppEngineのバージョン一覧を取得~](https://qiita.com/soundTricker/items/63da2f5cf98088542821)

サービスアカウントを使えば承認画面不要で、ユーザーに成り代わってGASを実行できるようになります。
これは素晴らしく便利そう……
と思い、参考にしてGoogleカレンダーにイベントを登録するスクリプトを書いてみました。

## 準備

手順として、

1. Google Apps Scriptプロジェクト作成
1. サービスアカウントの作成
1. Google Apps Scriptプロジェクトの設定

がありますが、他の記事で丁寧に説明されているので
以下のすばらしい記事をご参考ください。

[Google Apps ScriptでService Accountを利用して認証する ~GASを使ってAppEngineのバージョン一覧を取得~](https://qiita.com/soundTricker/items/63da2f5cf98088542821)
ほぼこちらの記事のままです。
こちらの手順を進め、最後のコードだけ変更してください。

[サービスアカウントを使ってG Suiteドメイン内のカレンダーにアクセスする](https://qiita.com/mistolteen/items/fc23804c69211a2c8168)
サービスアカウントの作成に関してはこちらが参考になります。

## 注意

サービスアカウントが漏れると非常に危険です。
コメントにあるとおりサービスアカウントは必要なアカウント以外からは閲覧されないようにしましょう。

## ソース

```js
  // 認証情報のJSONを取得
  var jsonKey = JSON.parse(PropertiesService.getScriptProperties().getProperty("jsonKey"));
  
  // カレンダーのスコープを指定
  var serverToken = new GSApp.init(jsonKey.private_key, ["https://www.googleapis.com/auth/calendar"], jsonKey.client_email);

  // カレンダーID（メールアドレス）
  var calendarId = 'xxx@example.com';
  
  // トークンの取得
  var tokens = serverToken.addUser(calendarId).requestToken().getTokens();

  // イベント  
  var payload = {
    "start": {
      "date": "2018-03-07"
    },
    "end": {
      "date": "2018-03-09"
    },
    "summary": "test"
  };
  
  // リクエストの設定 
  var fetchOptions = {'method':'post','payload':JSON.stringify(payload),'contentType':'application/json','headers':{Authorization:"Bearer "+tokens[calendarId].token}};

  //リクエストURLを作成  
  var url = "https://www.googleapis.com/calendar/v3/calendars/" + calendarId + "/events";

  //fetch
  var res = UrlFetchApp.fetch(url, fetchOptions);
```

気をつけるのは、

- payloadをきちんとJSONにすること
- プロジェクトページでAPIを有効にすること

です。（私が全く気づかずはまったところ）

payloadの内容に関してはGoogleのAPIページ右の「Try this API」で実際に試すと間違いがないです。
https://developers.google.com/calendar/v3/reference/events/insert

## 参考

[Google Apps ScriptでService Accountを利用して認証する ~GASを使ってAppEngineのバージョン一覧を取得~](https://qiita.com/soundTricker/items/63da2f5cf98088542821)

thank's @soundTricker 
いつも参考にさせていただいてます。
Swiftで非同期処理を同期処理にする

# 概要
Swiftで非同期処理を同期処理にするtipsです。
例えば画像処理を行うこんな**非同期処理を行うメソッドを同期処理で実行**できるようにします。

```swift
extension UIImage {
    // 非同期処理
    func processAsync(completion: @escaping (_ result: UIImage) -> Void) { }
    
    // 同期処理
    func processSync() -> UIImage { }
}
```

## 非同期処理によるコールバック地獄で可読性が悪くなる

メインスレッドをブロックしないように、別スレッドで処理を実行したりするのに非同期処理は有効です。しかし、複数の非同期処理を実行する場合、ネストが深くなるコールバック地獄になったりして可読性が悪くなります。

```swift
// コールバック地獄の例
image.processAsyncA { resultA in
    processAsyncB(resultA) { resultB in
        processAsyncC(resultB) { resultC in
            processAsyncD(resultC) { resultD in
                processAsyncE(resultD) { resultE in

                }     
            }           
        }
    } 
}

// 同期処理だったらよりシンプルに書ける
image.processSyncA()
    .processSyncB()
    .processSyncC()
    .processSyncD()
    .processSyncE()
```

# DispatchSemaphoreを利用して非同期処理の完了を待つ

[DispatchSemaphore](https://developer.apple.com/documentation/dispatch/dispatchsemaphore)は共有リソースを排他制御するための仕組み（セマフォ）を抽象化したクラスです。セマフォは**共有リソースの残り利用可能数**を値として持ちます。さらに`signal（）`で利用可能数を+1、`wait()`で-1します。つまり、`signal（）`は共有リソースの解放、`wait()`は共有リソースの利用を意味します。`wait()`の実行時にセマフォが0、つまり利用可能な共有リソースがない場合は共有リソースの解放（`signal（）`)の実行を待ちます。

 - [signal()](https://developer.apple.com/documentation/dispatch/dispatchsemaphore/1452919-signal) 
 - [wait()](https://developer.apple.com/documentation/dispatch/dispatchsemaphore/2016071-wait)

[DispatchSemaphore](https://developer.apple.com/documentation/dispatch/dispatchsemaphore)を利用し、非同期処理の実行完了を待つことで、以下のように非同期処理を同期的に実行することができます。

```swift
// 非同期処理
func processAsync(completion: @escaping (_ image: UIImage?) -> Void) { }

// 同期処理
func processSync() -> UIImage? {
    var result: UIImage?
    // セマフォを0で初期化
    let semaphore = DispatchSemaphore(value: 0)
    processAsync() { (image: UIImage?) in
        result = image
        // セマフォをインクリメント（+1）
        semaphore.signal()
    }
    // セマフォをデクリメント（-1）、ただしセマフォが0の場合はsignal()の実行を待つ
    semaphore.wait()
    return result
}
```

# 注意事項
非同期処理を同期処理にすることで、複数の処理が扱いやすくなりました。しかし、冒頭で説明したように重たい処理はメインスレッドをブロックしてしまうので、以下の例のように**複数の同期処理をまとめて非同期にサブスレッドで実行する**ようにします。

```swift
DispatchQueue(label: "hoge", qos: .default).async {
    let result = image.processSyncA().processSyncB().processSyncC()
    completion(result)
}
```
UE4のエンジンとプロジェクトの関連付け

UE4のエンジン複数のバージョンを運用している場合に、C++コードを含むUE4プロジェクトをアーティストなどに配布するときに、プロジェクトとエンジンがちゃんと関連付けされてないと、違うバージョンのエディタが起動してしまったり、ビルド済みのはずなのにコードをビルドしようとしてしまうことがあります。

ていうか、そういう状況になったので、ざっと調査しました。

プロジェクトに関連付いてるエンジンは.uprojectファイルのEngineAssociationのIDで選択されるみたいです。
この辺はヒストリアさんのブログにありました。

[[UE4] エンジンをコードからビルドした場合のバージョン表記](http://historia.co.jp/archives/3113/)

この記事にもある「.uprojectを右クリックしてエンジンを選ぶ」という機能ですが、これが有効になっていないPCがあったりします。詳しく検証してないですが、おそらくEpic Game Launcherなどからインストールせずに直に社内リポジトリなどからUE4を持ってきた場合に有効になっていないんじゃないかと思います。
では、どうやって有効にするかというと、

Engine/Binaries/Win64/UnrealVersionSelector-Win64-Shipping.exe
を実行すれば良いのだと思います。
これを実行して、.uprojcetファイルを右クリックすると無事

![2018-03-17_15h56_33.png](https://qiita-image-store.s3.amazonaws.com/0/147177/17438820-5279-0d22-f684-355883e17035.png)

といったメニューが出てきます。
ここで*Switch Unreal Engine Version*を選んで、そのプロジェクトで実行したいエンジンを選択します。

![2018-03-17_15h57_02.png](https://qiita-image-store.s3.amazonaws.com/0/147177/7cd5e8ed-e27f-c4e6-eeba-59898d5a8929.png)

これで.uprojectファイルをダブルクリックすると希望するUE4のエディターが起動しますが、プロジェクトのバイナリがそのエンジンでビルドされたものでない場合は、プロジェクトコードのビルドが発生します。これをどこで見ているかというと、

UE4 エンジンの Engine/Binaries/Win64/UE4Editor.versionのBuildId
プロジェクトのBinaries/Win64/UE4Editor.modulesのBuildId
このふたつが一致していれば、そのエンジンでビルドされたプロジェクトということで、プロジェクトコードのビルドは実行されません。

```UE4Editor.version
{
	"MajorVersion": 4,
	"MinorVersion": 19,
	"PatchVersion": 0,
	"Changelist": 0,
	"CompatibleChangelist": 0,
	"IsLicenseeVersion": 0,
	"IsPromotedBuild": 1,
	"BranchName": "",
	"BuildId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
}
```

```UE4Editor.modules
{
	"BuildId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
	"Modules": 
	{
		"hoge": "UE4Editor-hoge.dll"
	}
}
```

Engine/Binaries/Win64/UE4Editor.modlues
にも同じBuildIdがありますが、エンジン起動時の照合はUE4Editor.versionの方で行っています。
（4.19での話なので、将来的に変更されるかもしれません）

ということで、エンジンとプロジェクトの関連付けの話でした。