OmniAICreator/Qiita-1.07M huggingface dataset:
zshで実行したコマンドのログを残す

シェルをzshに移行したので、zshでのコマンドログの取り方をメモ。
How to save command logs on zsh.

```logging.zsh
#!/bin/zsh

export HISTFILE=~/.zhistory  # fc on line 8 won't run without it
DATE=`date +%F`
YESTERDAY=`date +%F -d '1 days ago'`
TIME=`date +%F_%T_%N`
fc -R  # also necessary for line 8, not sure how
fc -l -D -t "%F_%T" 0 >> ~/log/zraw/"$TIME"  # -D for time elapsed for each command, 0 to obtain the entire list

# just to prevent the error not being able to find these files
touch ~/log/zdaily/"$DATE"
touch ~/log/zdaily/"$YESTERDAY"

# using awk to extract today's entries
cat ~/log/zdaily/"$DATE" ~/log/zraw/"$TIME" | awk '$2 ~ /'"${DATE}"'/' | sort -k 2 | uniq > ~/log/zdaily/"$DATE"

# also have to extract yesterday's entries, because there can be some commands yet to be logged, no matter how often you run this script.
cat ~/log/zdaily/"$YESTERDAY" ~/log/zraw/"$TIME" | awk '$2 ~ /'"${YESTERDAY}"'/' | sort -k 2 | uniq > ~/log/zdaily/"$YESTERDAY"
```
1. このスクリプトをどこかに保存する（ここでは~/logging.zshとする） / The zsh script above somewhere (~/logging.zsh for the purpose of this post)
1. ```chmod u+a ~/logging.zsh```で実行可能にする。 / execute ```chmod u+a ~/logging.zsh``` So that the script can run.
1. ```mkdir ~/log/zraw/ ~/log/zdaily```を実行して保存先のディレクトリを作成しておく。 / Execute ```mkdir ~/log/zraw/ ~/log/zdaily``` to prepare the log directories.
1. ```0 23 * * * zsh -l -c '~/logging.zsh'```という内容を適当に```mycron```とでもファイル名をつけて保存。この例では毎日23:00に実行される。スケジュールを変えたい場合はcrontabの書き方を調べて変更。何回実行してもlog/zrawにデータが重複して溜まる以外には問題ない。 / Save ```0 23 * * * zsh -l -c '~/logging.zsh'``` as ```mycron``` (can be any filename though). It runs at 23:00 every day in this example. Check how to write crontab to change the schedule. You can run it as often as you like as long as you're fine with somewhat duplicated date in log/zraw
1. ```crontab mycron```としてcronにジョブを取り込む。**このとき、すでにcronに入っているジョブは上書きされて消えるので注意。```cron -l```で確認できる。** / Execute ```crontab mycron``` to import the job to cron. **Keep in mind that pre-existing jobs (hit ```cron -l``` to check) in cron will be overwritten**

このスクリプトを実行するたびのコマンド履歴が丸ごと~/log/zraw/に保存され、毎日その日の分だけを取り出したものが~/log/zdaily/に保存される。上の手順で示したようにcronで実行することを推奨。.zlogoutに書いておくような方法だとログインしない限り保存されないが、このスクリプトの~/log/zdaily/への日ごとの保存が取りこぼしを起こさないためには最低毎日一回は実行される必要がある。
The entire command history is saved in ~/log/zraw/ every time you execute this script, and each day's records are separately saved in ~/log/zdaily/. Using cron is preferable to run it to other ways such as using .zlogout, because you must run this script at least once a day to save daily logs in ~/log/zdaily/, which isn't guaranteed if you just run when you log out.

**References**
https://superuser.com/questions/527299/how-to-call-history-fc-from-a-zsh-script
http://qiita.com/takc923/items/8409a76e8a660f9f329f
http://d.hatena.ne.jp/ozuma/20120711/1342014448
http://qiita.com/jmatsu/items/0a5d80abe188b09644c1
https://stackoverflow.com/questions/15374752/get-yesterdays-date-in-bash-on-linux-dst-safe
Nuxt.js ってどう読むんですか？

ユニバーサルな Vue.js アプリケーションを作るためのフレームワーク [Nuxt.js](https://ja.nuxtjs.org/) について、読み方が分からないという質問を Vue.js コミュニティの Slack で立て続けに目にしたので書きました。

### nʌkst（ナクスト）と読む

作者の方に直接訊いてみたところ `nʌkst（ナクスト）` と読むそうです。

* [How to pronounce Nuxt? ・ Issue #355 ・ nuxt/nuxt.js](https://github.com/nuxt/nuxt.js/issues/355)

### 余談

とはいえ、作者の方が下記の動画で Nuxt.js を紹介しているのですが、「ヌクスト」と発音しているようにも聞こえますね...

* ["Introduction to Nuxt.js" by Alex & Sébastien Chopin - YouTube](https://www.youtube.com/watch?v=NVjbY_TkDd4)
CommonLispのash関数でビット演算

## ash関数概要

* ash関数は、第一引数の整数を第二引数分だけビット移動する関数。
* 例えば、第一引数に１０を指定して、第二引数に１を指定すれば１ビット左に移動するので、20となる。
* まあ１ビット移動すると２倍、２ビット移動すると４倍だ。確か。そうだよね？？
* 逆に、右に移動すると２分の１、４分の１となる。

```lisp
;左シフト演算
(ash 5 1) ;10

(ash 10 1) ;20

(ash (+ 5 2) 2) ;28

;右シフト演算
(ash 5 -1) ;2

(ash 10 -2) ;5

(ash (+ 5 2) -2) ;1
```

|整数|シフト|2進数|2進数シフト後|整数シフト後|
|---|---|---|---|---|
|5|2ビット左シフト|101|1010|10|
|10|2ビット左シフト|1010|10100|20|
|5+2|４ビット左シフト|111|11100|28|
|5|2ビット右シフト|101|10|2|
|10|2ビット右シフト|1010|101|5|
|5+2|4ビット|111|11|3|

## 所感
* 関数一つ調べても日本語の記事は全然でてこない。。
* 調べたことは逐次Quitaに上げといたほうが個人的な資産になりそう（笑）
SimpleDateFormatのparseでコケるときに確認すること

Javaで `Thu, 13 Jul 2017 18:00:15 +0900` こういう形式の文字列をDate型に変換したいとき、ありませんか？

こんな感じで

```java
public class Main {
    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z");
        System.out.println(sdf.parse("Thu, 13 Jul 2017 18:00:15 +0900"));
    }
}
```

SimpleDateFormatのparseメソッドを使うと実現できる…といろんな記事に書いているのですが、実際に実行すると

```
Exception in thread "main" java.text.ParseException: Unparseable date: "Thu, 13 Jul 2017 18:00:15 +0900"
	at java.text.DateFormat.parse(DateFormat.java:366)
	at Main.main(Main.java:15)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
```

こんな感じの例外が発生してしまいます。

そこでこのように書き換えます。

```java
public class Main {
    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
        System.out.println(sdf.parse("Thu, 13 Jul 2017 18:00:15 +0900"));
    }
}
```

3行目、SimpleDateFormatのコンストラクタの第二引数にLocaleを渡しています。

これでちゃんと `Thu Jul 13 18:00:15 JST 2017` という出力が得られます。

## 原因
原因についてはこの記事で触れましたので、もし興味がありましたらご覧ください。

[SimpleDateFormatのparseでコケるときに確認すること #60 - ゆるふわ技術日誌](http://yurufuwa-tech.hatenablog.com/entry/2017/07/13/222455)
Linuxにphantom jsのインストール


まずDLと解答

```zsh
sudo wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2


sudo tar jxfv phantomjs-2.1.1-linux-x86_64.tar.bz2
```

/usr/local/srcに移動して、リンクを設定


```zsh
cd /usr/local/src
sudo mv ~/phantomjs-2.1.1-linux-x86_64 .

sudo ln -s phantomjs-2.1.1-linux-x86_64 phantomjs

sudo ln -s /usr/local/src/phantomjs/bin/phantomjs /usr/local/bin/phantomjs
```


あとはphantomjsのverを確認してちゃんと入っているのを確認

```
phantomjs -v
```
windows10にNode.jsをインストールする

Windows10にNode.jsをインストールする方法を記載。

# 目次
1. インストーラーをダウンロードする
2. Node.jsをインストールする
3. インストール完了を確認する

# 本編
## インストーラーをダウンロードする
Node.jsのHP（以下のURL）よりインストーラーをダウンロードする。
https://nodejs.org/en/download/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/120715/074866c4-1197-438d-362f-0a8b6d428170.png)

## Node.jsをインストールする
ダウンロードしたインストーラーを展開し、インストールを行う

Nextをクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120715/9c8a1d62-6407-5949-b1c6-f701adec937f.png)

承諾のチェックを入れ、Nextをクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120715/7cd24c40-7553-3cbf-78fd-04a188118694.png)

インストール先を選択し、Nextをクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120715/ca1c0935-49ac-c9b0-49af-ed826573627b.png)

インストールしたいコンポーネントを選択し、Nextをクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120715/7d03bcca-077a-d6c2-7b4e-04a4e675fdaa.png)

インストールボタンをクリックし、インストールを開始する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120715/4d460254-e536-84a7-3492-3423df5b2e90.png)

インストールが完了。Finishをクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120715/dfbdb18a-d428-a15a-aa6e-bb7d14cf5149.png)

以上でインストールは完了。

## インストール完了を確認する
コマンドプロンプトからインストールされたNode.jsとnpmを確認する。

コマンドプロンプトを起動する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120715/6822edca-8422-3ba2-ea96-9908daf87ab2.png)

以下のコマンドより、Node.jsが入っていることとバージョンを確認する。
``` node --version ```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/120715/75abaa03-49d7-d929-5e18-f9a7fcc8f41b.png)

以下のコマンドより、npmが入っていることとバージョンを確認する。
``` npm --version ```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120715/80b39c4a-7e0e-a6ac-eeb0-5c9985bf3fa9.png)

## 参考
npmとは？
http://better-than-i-was-yesterday.com/what-is-npm/
golangのお勉強13+goa


## Example

実は公式のサンプル集みたいなのを見ると結構いいかも。。
でも、最終日付を見るとあまり更新されてないのは不安かも。。

公式のレポジトリ一覧。

goa
https://github.com/goadesign

gormaをつかったバージョンのgoa-celler
gormaをグローバル変数にしてるのね。
サイトの説明ではコンテキストかコントローラー経由って書いてあったけどグローバルでもいいってことかしら。

goadesign/gorma-cellar: Same design as goa-cellar, but with the added gorma integration
https://github.com/goadesign/gorma-cellar

小さな事例集、より完全な例はgoa-cellerって書いてあるけど、補完する例を含むなら見る価値あるかもな。

goadesign/examples: Examples for goa showing specific capabilities
https://github.com/goadesign/examples

ワインセラー。事例を紹介するための簡易サービスの実装という感じかな。

goadesign/goa-cellar: goa winecellar example service
https://github.com/goadesign/goa-cellar

## 認証(JWT)

google openIDの認証のJWTと通常のJWTが異なるので、
`goagen js`したコードは親和性が低そう。
どうしようかなあ。。

## 自作パッケージで`codegen js`の事例

おー、なるほど。すごい。
最終的には`swagger-codegen`を紹介していた。
swaggerベースの場合、認証にまで対応できるのかな。。
どれがいいのか検証なのかなあ。。うーん。

goaのdesignからもっといいJSコードを生成する — そこはかとなく書くよん。
http://tdoc.info/blog/2017/06/19/goa_gen_js.html

## jsについては一旦シンプルにしておく

認証などは面倒なので後回し。
多分publicに出力してやるパターンとかpath調整は可能だろう。

```sh:bash
goagen js
```

```Go:design.go
var _ = Resource("js", func() {
	Origin("*", func() {
		Methods("GET", "OPTIONS")
	})
	Files("/js/*filepath", "js")
})
```
Unityでintのプロパティをアニメーションさせたいときの対策

UnityのAnimationで数値を変化させたいとき、変数がfloatならいつもの通り数値を変更するだけでアニメーションに記憶させることが出来るんだけど、変数がintだった場合、Animationにキーフレームを生成することが出来ない。
なんでだよ。

しょうがないのでfloatの変数を持ったコンポーネントを自作してintにキャストして目的のプロパティに入れる。

以下コード。
（Anima2DのSprite Mesh Instance の表示順を変更したかったとき。
適宜置き換えて見て下さい。）

```

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Anima2D;

[RequireComponent(typeof(SpriteMeshInstance))]
[ExecuteInEditMode]
public class SpriteMeshInstanceHelper : MonoBehaviour {

	private SpriteMeshInstance spriteMeshInstance;
	public float orderInLayer;

	// Use this for initialization
	void Start () {

		spriteMeshInstance = GetComponent<SpriteMeshInstance>();
	}
	
	// Update is called once per frame
	void Update () {

		spriteMeshInstance.sortingOrder = (int)orderInLayer;
	}
}
```

ちなみに[ExecuteInEditMode]をつけることにより、シーンビューでアニメーションを変更中にも見た目の変更が反映されます！
やったね！
C++ Builder XE4, 10.2 Tokyo > シャットダウン時の処理 > WM_QUERYENDSESSION | WMQES.Result = false;「このプログラムによりシャットダウンできません」になる

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)
```

WM_QUERYENDSESSIONを使っているプログラムを理解しようとしている。

以下のようなものを作ってみた。

```Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
private:	// ユーザー宣言
public:		// ユーザー宣言
	void __fastcall TForm1::WMQueryEndSession(TWMQueryEndSession &WMQES);
	__fastcall TForm1(TComponent* Owner);

BEGIN_MESSAGE_MAP
	VCL_MESSAGE_HANDLER(WM_QUERYENDSESSION,TWMQueryEndSession,WMQueryEndSession);
END_MESSAGE_MAP(TForm)
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
```

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::WMQueryEndSession(TWMQueryEndSession &WMQES)
{
        // 希望の処理をここに書く

	WMQES.Result = false;  // これがあることにより、「このプログラムによりシャットダウンできません」になる
}
```

### 関連

「 Windows自体（OS自体）の終了を感知する 」
http://mam-mam.net/mytech/show.php?cd=40
IntelliJ の Spring Boot を使ったプロジェクトで読み込む設定ファイルを動的に変更する方法

デフォルトでは Spring Boot は `src/main/resources` の下にあるファイル `application.yml` を設定ファイルとして読み込みます。この設定情報を環境によって (e.g. 開発環境やステージング環境) 分けたいとしましょう。その場合、プロファイルを設定するのが簡単です。

例えば `src/main/resources/myconf.yml` が存在するとします。その場合は、プロファイルに `myconf` を指定することで、この設定ファイルが読み込まれます。このファイルは標準の `application.yml` よりも優先度が高く、同じ項目が両方のファイルに存在する場合は `myconf.yml` の内容の方が採用されます。

JVM の起動オプションを次のようにすることで `myconf.yml` を読み込むことができます。

```
-Dspring.profiles.active=myconf
```

もしも複数のプロファイルを指定したい場合、単純に `,` 区切りにすれば大丈夫です。

```
-Dspring.profiles.active=myconf1,myconf2
```
Java 使いが Go言語を一日使って思ったこと


## はじめに
タイトルに1日と書いていますが、はじめたのは一昨日くらいで、トータル8時間くらいはしたかな？と思ったので所感的なことをまとめます。

## 文字列の結合
よくループ中の文字列の結合に"+"は．．．的な記事を見かけますが、それではなく、文字列 + 数値の組み合わせのケースです。

Java だと

```java
int bread = 13;
System.out.println("おまえは今まで食ったパンの枚数をおぼえているのか？");
System.out.println(bread + "枚 私は和食ですわ");
```

的な書き方をするけど。

Golang だと（すみません import とか省きます）

```go
bread := 13
fmt.Println("おまえは今まで食ったパンの枚数をおぼえているのか？")
fmt.Printf("%d枚 私は和食ですわ\n", bread)
```

となる。

あとは型を変換したり。

```go
bread := 13
breadStr := strconv.Itoa(bread)
```

## 三項演算子がない
ちゃちゃっと三項演算子で値返したいと思って書いたらシンタックスエラー。
ないのね．．．

Java だと

```java
boolean isOk = true;
String text = isOk ? "OK" : "NG";
```

的なやつ。

Golang だと

```go
isOk := true
text := "NG"
if isOk {
    text = "OK"
}
```

などなど。

## ループ処理は for文のみ
Java8 とかだと StreamAPI とかでメソッドチェーン使ってどんどん書いていくけど、それができない。
拡張for文に近いソレがあるけど、少し注意が必要。

Java だと

```java
String[] array = {"a", "b", "c"};

// StreamAPIとか
Arrays.stream(array).peek(System.out::println);

// 拡張for文とか
for (String text : array) {
    System.out.println(text);
}
```

的なやつ。

Golang だと

```go:NG.go
array := []string{"a", "b", "c"}

for text := range array {
    fmt.Println(text)
}
```

だとダメで

```go:OK.go
array := []string{"a", "b", "c"}

for _, text := range array {
    fmt.Println(text)
}
```

ですね。
for文で使える range は Multiple Return Values なので、1件目の戻り値はインデックス、2件目の戻り値が配列に格納されている値です。
2件目を省略してもエラーにならないので注意が必要です。

## その他のこと
goroutine とか channel とかの非同期まわり、interface{} と型の関係とか、まだあまり触ってないので、もう少し触ってから書こうと思います。

## おわりに
Go言語面白いです！
（と言うか、新しい言語の学習が楽しいのか）

色々と書く時に困ることもありますが、割ととっつきやすいなーと思いました。
Python 3.6 インストール手順【 for Windows 】

# はじめに
ディープラーニングのフレームワーク「CNTK」を使用するために、
Pythonが必要になったので、Pythonをインストールしてみる。

# Pythonインストール手順 (2017/07/13)
## 1. Pythonのインストーラーをダウンロードします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/180432/8dfae734-218a-dd56-5a15-7398540fec7e.png" width="750px">

__TOP__ > __Downloads__ > __Windows__ > __Python 3.x.x__

_※今回は、python-3.6.1.exeをダウンロードしました。_
上記の方法で、ダウンロードしたインストーラーは32bit版なので、
64bitの場合は、[python-3.6.1](https://www.python.org/downloads/release/python-361/)ページ下部にある、
__Files__よりお使いのバージョンを指定してダウンロードする必要があります。

## 2. ダウンロードしたインストーラーを実行します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/180432/880fba5b-0b71-9a6e-23e3-589a5b02ec4f.png" width="600px">

<font color="red">※後で、環境変数を通すのが面倒くさいので、「Add Python 3.6 to PATH」の項目にチェックを入れて、「__Install NoW__」をクリックします。</font>

<img src="https://qiita-image-store.s3.amazonaws.com/0/180432/4f3707ae-66cd-5db9-ff47-91d1056b7cc7.png" width="600px">

インストールは、2~3分で終了します。

インストールが終われば、pythonのコマンドパスが通っているか確認します。

## 3. Pythonのバージョン確認を行います。

コマンドプロンプトで、下記コマンドを実行するとPythonのバージョンを確認することができます。
```
$ python --version
```

>Python 3.6.1

以上で、__Python__のインストールが完了しました。

# 終わりに
想像以上に簡単にインストールすることができましたｗ

さて、続いて、CNTKのGET STARTEDを試してみたいと思います！
google chrome便利なwindows ショートカットキー

|操作|ショートカット|
|:-------------------|---------------------:|
|デベロッパーツールを開く|Ctrl+Shift+I または F12|
|タスクマネージャを開く|Shift+Esc|
|新しいウィンドウを開く|Ctrl+n|
|新しいウィンドウをシークレット モードで開く|Ctrl+Shift+n|
|新しいタブを開いてそのタブに移動する|Ctrl+t|
|最後に閉じたタブを開いてそのタブに移動する|Ctrl+Shift+t|
|開いている次のタブに移動する|Ctrl+Tab または Ctrl+PgDn|
|開いている前のタブに移動する|Ctrl+Shift+Tab または Ctrl+PgUp|
|特定のタブに移動する|Ctrl+1～Ctrl+8|
|最後のタブに移動する|Ctrl+9|
|ホームページを現在のタブで開く|Alt+Home|
|現在のタブの閲覧履歴の中で前にあるページを開く|Alt+左矢印|
|現在のタブの閲覧履歴の中で次にあるページを開く|Alt+右矢印|
|現在のタブを閉じる|Ctrl+w または Ctrl+F4|
|開いているすべてのタブとブラウザを閉じる|Ctrl+Shift+w|
|現在のウィンドウを最小化する|Alt+スペース+n|
|現在のウィンドウを最大化する|Alt+スペース+x|
|現在のウィンドウを閉じる|Alt+F4|
|Google Chrome を終了する|Ctrl+Shift+q|
|1画面下にスクロール|space または Page Down|
|1画面上にスクロール|Shift + space または Page Up|
|1画面前に戻る|Alt + 左矢印 または　Backspace|
|1画面先に進む|Alt + 右矢印 または Shift + Backspace|
|リロード|F5 または Ctrl + R|
|ページの最上部へ移動|Home|
|ページの最下部へ移動|End|

間違っている点があれば指摘お願いします。
crowi-plusをEC2(t2.micro)で動かす

最強を超えた最強のWiki [crowi-plus](http://qiita.com/yuki-takei/items/5df9601039ccfc1df01f) をEC2に入れました。
ほぼDockerで一発ですが、メモリ関係でちょっとつまずいたところがあるので共有として。

## EC2インスタンスを立てる

t2.microでOK。
3000番ポートを空けておく。[ここを参考](https://www.ipentec.com/document/document.aspx?page=amazon-ec2-add-rule-to-security-group)
セキュリティ設定する。[ここを参考](http://qiita.com/yangci/items/ef2ab9b6f0d28bad0881)

## サーバでコマンドをたくさん打つ

コマンド打つ

```bash
$ sudo su
# gitをインストール
$ yum install git
# dockerをインストール
$ yum install -y docker
# docker-composeをインストール
$ curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
# 資材をclone
$ git clone https://github.com/weseek/crowi-plus-docker-compose.git crowi-plus
```

プラグインを有効化するためにDockerfileをちょっといじる
こんな感じでコメントアウトをはずす

```bash
# install plugins if necessary

RUN echo "install plugins" \
  && npm install --save \
     crowi-plugin-lsx \
     crowi-plugin-pukiwiki-like-linker \
  && echo "done."
# you must rebuild if install plugin at least one
RUN npm build:prod
```

このままだとメモリが足りなくてElasticsearchで落ちるのでスワップの設定をする

```bash
$ dd if=/dev/zero of=/swapfile1 bs=2M count=1024
$ chmod 600 /swapfile1
$ mkswap /swapfile1
$ swapon /swapfile1
```

docker-compose.ymlをいじってポートの変更をする

```
 ports:
      - 3000:3000
```

起動する

```bash
$ service docker start
$ /usr/local/bin/docker-compose up -d
```

`http://EC2のip:3000`でアクセス
よりRxらしくRecyclerViewの一番下までスクロールした時にロードする実装


同じことをやっている記事はすでに沢山あるのですが、よりRxらしく書ける方法を考えてみました。
使用している言語はKotlinです。

参考にさせていただいた記事:
http://qiita.com/konifar/items/e57c47bfb93d0d40ef59
http://sys1yagi.hatenablog.com/entry/2016/02/23/185543

## 使うもの

- rxjava2
- rxkotlin
- rxbinding-recyclerview-v7
- rxbinding-recyclerview-v7-kotlin

## 実装

まず、シンプルな実装

```kotlin
val layoutManager = LinearLayoutManager(...)

recyclerView
        .scrollEvents()
        .filter { layoutManager.itemCount - 1 <= layoutManager.findLastVisibleItemPosition() }
        .subscribe { loadMore() }
```

これだけです。`rxbinding-recyclerview-v7`先生のおかげでだいぶスッキリ書けました。

さらに、読み込み完了まで追加ロードを止めたい場合は
読み込み完了を通知するSubjectを用意しておいて、

```kotlin
val loadCompletedStream = PublishSubject.create<Unit>()
```

```kotlin
recyclerView
        .scrollEvents()
        .skipUntil(loadCompletedStream)
        .filter { layoutManager.itemCount - 1 <= layoutManager.findLastVisibleItemPosition() }
        .take(1)
        .repeat()
        .subscribe { loadMore() }
```

こうして`skipUntil/take/repeat`をかませてあげます。
あとはロード完了時に`loadCompletedStream.onNext(Unit)`を呼んであげるだけでイベントが再度流れるようになります。

以上です。
CSS3のフォントやテキストに関するプロパティ、こんなのあったんだ

html5の試験勉強をしつつ、自分の知らなかったプロパティを忘備録としてまとめていきます。


#日本語にあんまり関係なさそう系
##スモール・キャピタル
そもそもスモール・キャピタルというものを知らなかった。
アルファベット系の言語を選んだ時に、全部の文字を大文字にして、サイズだけ本文の中で小さくするものだとか。

| プロパティ | 設定 |値|
|:--|:--|:--|
| font-variant  | 同フォントファミリーのスモール・キャピタルを選択  |normal(初期値)<br>small-caps|

例　文頭のYだけ大文字。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/176912/535e3b86-b09e-35c1-663f-32f50141e03d.png)

##アルファベットの大文字・小文字変換
これは知りませんでした。
文章全体を大文字にするか、小文字にするか、頭文字のみ大文字にするかを指定できます。初期値はnoneで入力された状態のまま表示します。

| プロパティ | 設定 |値|
|:--|:--|:--|
| text-transform  | 半角アルファベットの大文字・小文字を変換する |uppercase<br>lowercase<br>capitalize<br>none(初期値)|

none(初期値)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/176912/127dcf51-a313-2a44-44e8-f5a5c07d17d5.png)

uppercase
![image.png](https://qiita-image-store.s3.amazonaws.com/0/176912/11e3ec04-581b-6646-6205-15bdab5d6d18.png)

lowercase
![image.png](https://qiita-image-store.s3.amazonaws.com/0/176912/2c0771e1-59ac-c09b-cf13-e2364c6878d2.png)

capitalize
![image.png](https://qiita-image-store.s3.amazonaws.com/0/176912/640060ce-6357-ee11-f04b-2370109c26e2.png)



##英単語折り返し・ハイフネーション
行の折り返しに関するプロパティ。
英語系など単語ごとに区切りがあるものに関わってくるもの。

| プロパティ | 設定 |値|
|:--|:--|:--|
| word-break  | 行の折り返しをどこでするか |break-all<br>keep-all<br>normal(初期値)|
| hyphens | ハイフネーションの設定 |manual(初期値)<br>none<br>auto|


#spacing系
letter-spacingは知っていましたが、word-spacingは知らなかった。
単語ごとの間隔も設定できるんですね。

| プロパティ | 設定 |値|
|:--|:--|:--|
| letter-spacing  | 文字間隔を設定  |normal(初期値)<br>数値＋単位|
| word-spacing  | 単語単位の間隔を設定  |normal(初期値)<br>数値＋単位|


#文字表記方向系
文字をどちら側から表示するか、unicodeに準ずるのか設定します。
left to right（左から右へ）もしくはright to leftを設定できます。

| プロパティ | 設定 |値|
|:--|:--|:--|
| direction  | 文字表記の方向を指定  |ltr(初期値)<br>rtl|
| unicode-bidi  | 文字表記の方向をUNICODEから組み込むかどうか  |normal(初期値)<br>embed<br>bidi-override|


#所感とか
日本語に関係ないアルファベット制御系が割と漏れている感じがありますね。
表示方向や大文字小文字に関しては忘れないようにしておきたいところです。

#参考書籍
[HTML5プロフェッショナル認定試験 レベル1 対策テキスト＆問題集（マイナビ）』](https://book.mynavi.jp/ec/products/detail/id=38366)
httpd が使用する物理メモリの合計を得る.sh

ps の httpd から pid をとりだして、 /proc/[pid]/smaps から
 PRIVATE だけを足したもの

```bash
echo -e "PID\tRSS\tSHARED\tPRIVATE";
ps -ef | grep httpd | grep -v root | grep -v grep | while read line; do
        args=($line);

        echo -ne "${args[1]}\t"

        cat /proc/${args[1]}/smaps | awk '
                BEGIN{ rss=0; shared=0; private=0; }
                        /Rss/{rss += $2;}
                        /Shared/{shared += $2;}
                        /Private/{private += $2;}
                END{ printf("%.1f\t%.1f\t%.1f\n",
                        rss / 1024,
                        shared / 1024,
                        private / 1024)
        }';
done > /tmp/apache-mem.txt
sort -nk 4 /tmp/apache-mem.txt
echo -e "PID\tRSS\tSHARED\tPRIVATE";
cat /tmp/apache-mem.txt | awk 'BEGIN{i=0; sum=0;}{i+=1;sum+=$4}END{ print "Total: " sum " Mb " i " Processes"}'
```

以下にあるスクリプトがうまくうごかなかったので、すこし手直ししました。

http://progmemo.wp.xdomain.jp/archives/1108
JQueryUIのtablesorterについてのメモ

# tablesorterのソート順について
tablesorterのソート順について、実際に動作させてみた感じをメモ。
細かな用語等モロモロについては以下参照。
https://mottie.github.io/tablesorter/docs/

## デフォルト動作

```js:デフォルト設定
	 $("table").tablesorter({
		headers:{
			0: { sorter: true },
			1: { sorter: true },
			2: { sorter: false }
		},
	}).tablesorterPager(pagerOptions);//option設定は割愛
```

	1. ソート対象カラムの1つ目のデータが数字のみの場合、数値文字（digit）として扱う。数字以外を含む場合文字（text）として扱う。
	   （おそらく初期化時（画面描画時）に一度だけ判定）
	2. 対象カラムをクリック
	   ・文字扱いの場合、naturalSortでソートする。
	   ・数値扱いの場合、numericSortでソートする。

## パーサを指定

```js:デフォルト設定
	 $("table").tablesorter({
		headers:{
			0: { sorter: "digit" },
			1: { sorter: "text" },
			2: { sorter: false }
		},
	}).tablesorterPager(pagerOptions);//option設定は割愛
```

	1. 上記のように"digit"や"text"を指定。
	   →1つ目のデータがどんな値でも指定した文字として扱う。
	2. 対象カラムをクリック
	   ・headersに指定した文字種でソートを行う。

## 文字ソートを任意のソートにする

```js:デフォルト設定
	 $("table").tablesorter({
		headers:{
			0: { sorter: true },
			1: { sorter: true },
			2: { sorter: true }
		},
		textSorter:{
			0: function(a, b, direction, columnIndex, table){return a.localeCompare(b);},
			1: $.tablesorter.sortText,
			3: $.tablesorter.sortNatural,
		},
	}).tablesorterPager(pagerOptions);//option設定は割愛
```

	1. 上記のようにtextSorterプロパティに任意のfunctionや規定のfunctionを指定する。
	2. 対象カラムをクリック
	   ・判定の結果文字（text）扱いの場合、上記で設定したfunctionを用いてソートする。
	   ・判定の結果数値（digit）扱いの場合、numericSortでソートする。
	   （パーサを指定の場合、パーサが"text"の場合は必ずtextSorterの設定に従ってソートする）

## 数値ソートを任意のソートにする

```js:デフォルト設定
	 $("table").tablesorter({
		headers:{
			0: { sorter: true },
			1: { sorter: true },
			2: { sorter: false }
		},
		numberSorter:{
			0: function(a, b, direction, maxColumnValue){return a - b;},
			1: function(a, b, direction, maxColumnValue){return a - b;},
		},
	}).tablesorterPager(pagerOptions);//option設定は割愛
```

	1. 上記のようにnumberSorterプロパティに任意のfunctionや規定のfunctionを指定する。
	2. 対象カラムをクリック
	   ・判定の結果文字（text）扱いの場合、naturalSortでソートする。
	   ・判定の結果数値（digit）扱いの場合、上記で設定したfunctionを用いてソートする。
	   （パーサを指定の場合、パーサが"digit"の場合は必ずnumberSorterの設定に従ってソートする）

# その他設定について

以下のような設定をすると便利と思った。

```js:便利な設定
	 $("table").tablesorter({
		widgets: ['zebra', 'saveSort'],
		widgetOptions : {storage_useSessionStorage : true},
		headers:{
			0: { sorter: true },
			1: { sorter: true },
			2: { sorter: false }
		},
		emptyTo : 'emptyMin',
	}).tablesorterPager(pagerOptions);//option設定は割愛
```

widgetsの"zebra"はテーブルの行を奇数行、偶数行で自動で色を分けてくれる。
widgetsの"saveSort"はソートした列とソート順をページ毎に記憶してくれる機能。
widgetOptionsの"storage_useSessionStorage"はwidgetsの"saveSort"と併用する。ソート順の記憶をセッションストレージに保存するようにする。
指定がない場合はローカルストレージに保存。（ローカルストレージはローカルの物理ファイルに保存するらしい）
emptyToプロパティはデータなし（空文字）のセルの扱いを指定する。emptyMinはデータなしセルを最小として扱う。（昇順ソートでデータなしセルが最初にくる）
typedocハマりポイント

typedocでドキュメントを作成してみたときのハマりポイントの備忘録。

## @types/highlight.jsで Cannot find name 'Node' と言われる

tsconfig.jsonのcompilerOptions.libに`"dom"`を追加します。

```json:tsconfig.json
{
  "compilerOptions": {
    "lib": ["es2015", "es2016", "es2017", "dom"]
  }
}

```

## exportしてない変数とかがドキュメントに表示される

実行時に`--excludeNotExported`オプションを付けます。

```
typedoc --out docs --excludeNotExported
```

## 生成物をgithub pagesで表示したときに下層ページが404になってしまう

`_`で始まるファイルはデフォルトで弾かれるので、github pagesの対象ディレクトリのルートに`.nojekyll`ファイルを置きます。個人的には以下のようにpackage.jsonを設定して、`npm run docs`でドキュメントが生成されるようにしています。

```json:package.json
{
  "scripts": {
    "docs:build": "typedoc --out docs --excludeNotExported",
    "docs:touch-nojeykll": "nodetouch docs/.nojekyll",
    "docs": "run-s docs:build docs:touch-nojeykll"
  },
  "devDependencies": {
    "npm-run-all": "^4.0.2",
    "touch": "^3.1.0",
    "typedoc": "^0.7.1"
  }
}
```
【CodeSandbox】オンラインreact.jsエディター

# CodeSandbox-- 新しいreact.jsオンラインエディターの見た目

jsFiddle、codePenなど色んなオンラインエディターとシェアサービスがありますが、react.jsローカル開発環境のような雰囲気でreact.js開発者に馴染みなオンラインサービスCodeSandboxがあります。

- [CodeSandbox](https://codesandbox.io/s/new)

![pageshot of 'Editor - CodeSandbox' @ 2017-07-04-1704'23.png](https://qiita-image-store.s3.amazonaws.com/0/123446/9e2de0f8-3a83-d826-8e68-fda8213d1d0c.png)

# CodeSandboxの機能

- 複数JSファイルを簡単に追加できる
- 依頼モジュールを追加できる
- プロジェクト一式をダウンロードできる
- プロジェクトを気楽に共有できる

# 他のオンラインエディター

- [jsFiddle](https://jsfiddle.net/reactjs/69z2wepo/)

![pageshot of 'React Base Fiddle (JSX) - JSFiddle' @ 2017-07-04-1716'57.png](https://qiita-image-store.s3.amazonaws.com/0/123446/9f12248f-f27c-bdab-5f40-fa3ffbbf5366.png)


- [jsBin](http://jsbin.com/cuneha/1/edit?js,output)

![pageshot of 'JS Bin - Collaborative JavaScript Debugging' @ 2017-07-04-1715'19.png](https://qiita-image-store.s3.amazonaws.com/0/123446/87f81a2e-b4b9-8c56-427d-0ff94c39ade9.png)


- [CodePen](https://codepen.io/bradleyboy/pen/OPBpGw)

![pageshot of 'React at CodePen' @ 2017-07-04-1739'12.png](https://qiita-image-store.s3.amazonaws.com/0/123446/31ec560c-9316-ea96-9d85-eb83a26fdffe.png)


# 参考記事
[CodeSandbox — An online React editor](https://hackernoon.com/codesandbox-an-online-react-editor-b8945ce095d2)
C++ Builder > Error: [ilink32 エラー] Fatal: ファイル 'SPIN.OBJ' を開けません > #pragma link "Spin"を消す

```txt:動作環境
C++ Builder XE4
```

古いバージョンのプロジェクトをXE4で動かそうとしている。

ビルド時に以下のエラーが出る。

> [ilink32 エラー] Fatal: ファイル 'SPIN.OBJ' を開けません

ドイツ語は分からないが最後の部分が参考になった。
https://www.c-plusplus.net/forum/116988-full
> 
```
remove 
#pragma link "Spin" in source file
```

実際に`#pragma link "Spin"`を削除したらビルドが成功し、実行できるようになった。



### はまった
(2019/03/06追記)

別のobjファイルで同様のエラーに遭遇し、対処に時間がかかった。

同様のエラーが出たらpragmaの定義を消す。
JQuery.off でイベントがうまく消せなかった話

# JQueryでイベントハンドラーを付けたり消したり
JQueryである要素のイベントハンドラーを設定/削除する場合、以下のようにすると思う。

```js:JQueryでイベント設定/削除
	$('#hoge').on("click", function(){
		alert("hogehoge----!!!");
	});

	$('#hoge').off("click");
```

このような方法でイベントハンドラーが削除できなかった。

# function内で動的にon/off
以下のソースのように、onload時にあるボタンにonでイベントを仕掛けて、ある条件の場合はそのイベントを破棄、新たな別の動作をするイベントを張り付ける、といった処理を別のfunctionに切り出し、これを順番に呼び出した。

```js:onloadでイベントを設定
	// セットするファンクション
	function setHoge() {
		$(document).ready(function () {
			$('#hoge').on("click", function(){
				alert("hogehoge----!!!");
			});
		});
	}
	// 破棄/新たに設定するファンクション
	function changeHoge() {
		$(document).ready(function () {
			if ($('#hoge').val() != 'hoge') {
				$('#hoge').off("click");
				$('#hoge').on("click", function(){
					alert("no---hoge----!!!");
				});
			}
		});
	}
```

こうした場合にうまくイベントハンドラーが削除されなかった。。。
（#実際のコードとは異なるため、上記条件で正常に動作するかも。。。動作確認はしていない）

#名前空間(namespace)を設定しon/off
いろいろと調べた結果、以下のようにイベントハンドラーに名前空間を指定できるそうな。
参照：http://semooh.jp/jquery/cont/doc/namespaced_event/

```js:namespace付きでイベント設定/削除
	$('#hoge').on("click.hoge", function(){
		alert("hogehoge----!!!");
	});

	$('#hoge').off("click.hoge");
```

名前空間を付けることで正しくイベントハンドラーの設定/削除ができた。

```js:namespace付きでonloadでイベントを設定
	function setHoge() {
		$(document).ready(function () {
			$('#hoge').on("click.hoge", function(){
				alert("hogehoge----!!!");
			});
		});
	}
	function changeHoge() {
		$(document).ready(function () {
			if ($('#hoge').val() != 'hoge') {
				$('#hoge').off("click.hoge");
				$('#hoge').on("click.hoge", function(){
					alert("no---hoge----!!!");
				});
			}
		});
	}
```
バージョンが上がったAndroid Studioを新規インストールして、でも古いプロジェクトを開く場合

こんにちは。

# 困ったなぁ

Android Studio（以下「AS」と略す）って、どんどんバージョンアップしていますよね。油断すると、お手元のASが古臭くなって、「バージョンアップしてね！てゆーかしろよ！」とダイアログがうるさく表示してきますよね。

ただ、使用中のASをバージョンアップするのではなく、新規にASをインストールした際に、でもでもプロジェクトが古い設定のままだと、そのプロジェクトをオープンした際に「古ぃょ！意味ゎヵんなぃんだヶど!!」とASが苦悶の声でのたうち回ります。

![huruindakedo.png](https://qiita-image-store.s3.amazonaws.com/0/100612/dcb6466e-59de-f3f1-3a1b-876fc0211dbc.png)


あげく、Android SDKの位置も変えちゃったりすると、ASが迷子の悲鳴をあげたりします。

## ケーススタディ

ASのバージョンを古いのから、2.3.3にしたケースで説明します。

# 複数のテキストファイルの複数行を置換するツール「GrepReplace」

まあ、「[GrepReplace](http://services.dreamhive.co.jp/dhappli/grepreplace)」というフリーウェアでなくともいいのですが、複数のテキストファイルの中身に対して複数行の置換を行えるツールを使って、設定が古いプロジェクトを、バージョンが上がったASでも文句言われずにオープンできるようにしましょう。

# しょせんは、テキストファイルのココを置換すれば済むハナシ

一行、否、もはや一箇所を修正するだけで:ok:です。

## ASプロジェクトのルートディレクトリ内にある「build.gradle」

:warning:同名のファイルが、別ディレクトリにも存在していますので、ご注意ください！

```groovy:古いの（例えばver.2.2.3）
classpath 'com.android.tools.build:gradle:2.2.3'
```

```groovy:新2.3.3
classpath 'com.android.tools.build:gradle:2.3.3'
```
あと、ASバージョンアップに伴い、AndroidSDKも変えたのであれば、同じディレクトリ内にある「local.properties」の`sdk.dir`の値も変えましょう。

```java:local.properties(例)
sdk.dir=C\:\\Users\\<ユーザ名>\\AppData\\Local\\Android\\Sdk
```

## "\gradle\wrapper"ディレクトリ内にある「gradle-wrapper.properties」

これも、一行修正するだけで:thumbsup:です。

```java:古いの
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
```

```java:新2.3.3
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
```

## "\app"ディレクトリ内にある「build.gradle」

:warning:上記の同名ファイルと混同しないでくださいね！

```groovy:古いの
// 前略
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
// 中略
    compile 'com.android.support:appcompat-v7:25.1.0'
// 後略
```

```groovy:新2.3.3
// 前略
    compileSdkVersion 25
    buildToolsVersion '26.0.0'
// 中略
    compile 'com.android.support:appcompat-v7:25.3.1'
// 後略
```

途中、略させてもらっていますが、数字の箇所にご注目！ということです。

# ASでそのプロジェクトをオープンした際に

上記の施しをした上でそのプロジェクトをオープンしたとき、すんなりと受け入れてくれればしめたもの。
ですが。
もしかしたら、こんなErrorメッセージが出るかもしれません。

![appimldoesnotexist.png](https://qiita-image-store.s3.amazonaws.com/0/100612/2f087b01-b43a-45b0-c24f-00f8208e4d58.png)

app.imlファイルが存在していないなら、それならそれで、作ってもらえれば済むので、Yesボタンを押しましょう。

# まとめ

1. 古いASを捨てて、新しいASを新規にインストール（ついでにAndroid SDKも）するのは、厭わない。
2. だけど、プロジェクトの設定が古いままだぜ。
3. だったら、AS起動前に、GrepReplaceを使って、古いプロジェクトの諸設定を事前に書き換えておこう。
4. しかもそれがただのテキストファイルだから、楽チンだ。

以上です。
【Laravel】DBのカラム情報から$fillableを作るartisanコマンド


モデルの`$fillable`書くのめんどくさいなぁと思ってまして、DBのカラムから作成できるやつを書いてみました。


まずコマンド作成して

```bash
$ artisan make:command Fillable
```

Kernelの登録もしちゃって

```php:app/Console/Kernel.php
    protected $commands = [
        Commands\Fillable::class,
    ];
```

実装〜

```php:app/Console/Commands/Fillable.php
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;

class Fillable extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'fillable {table} {--all}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Print fillable from migration file for model.';

    private $exceptions = [
        'id',
        'created_at',
        'updated_at',
        'deleted_at',
    ];

    /**
     * Create a new command instance.
     *
     * @return mixed
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $table = $this->argument('table');

        $columns = collect(DB::select("show columns from $table;"))->pluck('Field');
        $this->info('protected $fillable = [');
        foreach ($columns as $column) {
            if ( $this->option('all') || !in_array($column, $this->exceptions)) {
                $this->info("    '" . $column . "',");
            }
        }
        $this->info('];');
    }
}
```

試してみる

```bash
$ php artisan fillable users
protected $fillable = [
    'name',
    'email',
    'password',
    'remember_token',
];
```

idとかcreate_atとかも出したいなら`--all`もつける

```bash
$ php artisan fillable users --all
protected $fillable = [
    'id',
    'name',
    'email',
    'password',
    'remember_token',
    'created_at',
    'updated_at',
    'deleted_at',
];
```

このやり方だと、毎回、Laravelプロジェクトが立ち上がるごとに作んないといけないので、database/migrationsを読むcliを作りたい（いつか）
Splunkでkafkaからデータを取得する

# Overview
kafkaにpushされたデータをsplunk側でpullできるようにする。

#構成
EC2 : m3.large
Kafka : 2.11-0.10.2.0
Splunk : Enterprise 6.6.2
※とりあえず動きだけみたかったので、すべて1台のサーバ上で構築。


#install
インストールについては、kafka公式ドキュメントを参考。
https://kafka.apache.org/quickstart

splunk側はこの記事参照。
http://qiita.com/saeoshi/items/d1db4ca5c9af79e04fed

## zk起動
`./bin/zookeeper-server-start.sh config/zookeeper.properties &`

## kafka起動
`./bin/kafka-server-start.sh config/server.properties`

## topic作成
`bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test`

## test message送信
`./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test`
`aaaa`

##splunk側設定
kafka consumer用のmoduler inputをdownloadしてくる。

https://splunkbase.splunk.com/app/1817/

##Appをinstallする。
web interfaceからmanage app → install app from fileで、先にダウンロードしたファイルをupする。

![Screen Shot 2017-07-13 at 4.40.41 PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/190656/a2a376af-cab4-6764-2c4e-80cff41749d1.jpeg)

##取り込みの設定
Setting → Data inputsから、Local inputの`kafka Messaging`を選択する。
設定は下記の通り。

![Screen Shot 2017-07-13 at 4.43.43 PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/190656/c33f3ea5-a289-9d44-5ec9-f2551699e36f.jpeg)

![Screen Shot 2017-07-13 at 4.44.37 PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/190656/71bc0a1a-0abd-de8d-5184-ac7b9178fe96.jpeg)

##テストしてみる
下記のdmesgをとりあえず、送ってみる。

`
[    5.113147] audit: type=1400 audit(1499923805.268:6): apparmor="STATUS" operation="profile_load" profile="unconfined" name="/usr/bin/lxc-start" pid=646 comm="apparmor_parser"
[    5.113770] audit: type=1400 audit(1499923805.268:7): apparmor="STATUS" operation="profile_load" profile="unconfined" name="/sbin/dhclient" pid=645 comm="apparmor_parser"
[    5.113777] audit: type=1400 audit(1499923805.268:8): apparmor="STATUS" operation="profile_load" profile="unconfined" name="/usr/lib/NetworkManager/nm-dhcp-client.action" pid=645 comm="apparmor_parser"
[    5.113783] audit: type=1400 audit(1499923805.268:9): apparmor="STATUS" operation="profile_load" profile="unconfined" name="/usr/lib/NetworkManager/nm-dhcp-helper" pid=645 comm="apparmor_parser"
[    5.113789] audit: type=1400 audit(1499923805.268:10): apparmor="STATUS" operation="profile_load" profile="unconfined" name="/usr/lib/connman/scripts/dhclient-script" pid=645 comm="apparmor_parser"`


##splunk側の検索
こういう形でsplunk側から検索できる。

![Screen Shot 2017-07-13 at 4.46.04 PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/190656/709fa287-ce64-4805-c5b0-799dff11e5fa.jpeg)

###Memo
hostの設定については、別途configで設定が必要なので、あとでやってみる
【Parallels Desktop】アップデートで UID 0 に非ルートユーザアカウントがあるためにアップデートに失敗した話

# 概要
Parallels Desktopのアップデート時に

「お使いのシステム内の UID 0 に非ルートユーザアカウントがあるため、Parallels Desktopをインストールできません。問題ID: 15476」

というエラーでアップデートができなかったときの対処法

# 前提
macOS Sierra 10.12.5（16F73）
Parallels Desktop 12 for Mac バージョン 12.2.1 (41615)

# 原因の特定

```dscl . -list /Users UniqueID```

で出てきたUIDの一覧で、0に非ルートユーザの割当がないかを確認する。
http://kb.parallels.com/jp/122763

# 対処法

以下のコマンドでUIDを変更する
念のために重複しないように、かつ501以降の数字で指定した。

**uid 変更**
```sudo dscl . -create /users/（変更するユーザ） uid （変更先UID）```
**例**
```sudo dscl . -create /users/hoge uid 502```
http://blog.livedoor.jp/kosugip/archives/1715571.html



参考
http://shige-mon.blogspot.jp/2017/09/parallels-desktop-uid-0-parallels.html
mac OS のグループ、ユーザ作成の周辺コマンド集
http://shige-mon.blogspot.jp/2017/10/mac-os_3.html
MacへのImageMagick6系のインストール

rmagick2.16.0で

bundle installしようとすると 普通に最新版（7系）でインストールするとエラーになる

```
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
```

いくつかやり方があるが、

```
brew install imagemagick@6
```
が一番簡単に解決できた。
Animate CCで動画からフレームレート落としてGIFアニメとかに書き出すのが楽だった

タイトルだけでほぼ終わってるんだけどメモ

Animate CCのステージのフレームレートを10とかに適当におとしてmp4をD&D!
そしたら適当にフレームが間引かれた状態になるのでGIFやスプライトなどで書き出すだけ。
フレーム多すぎたり少なすぎたりしたらフレームレート調整して読み込み直せばOKだと思う。

以上！
テキストの一部分だけ修飾する


## stringsにhtmlタグを記述

```xml:strings.xml
<string name="hoge"><![CDATA[<font color=#f50057><b>ほげ！</b></font>が<br><font color=#304ffe><b>ふが！</b></font>できるようになりました]]></string>
```

## Utilクラスの作成

```java:HtmlCompat
public class HtmlCompat {

    @SuppressWarnings("deprecation")
    @SuppressLint("NewApi")
    public static Spanned fromHtml(String source) {
        if (VersionUtil.isNougatOrLater()) {
            return Html.fromHtml(source, Html.FROM_HTML_MODE_LEGACY);
        } else {
            return Html.fromHtml(source);
        }
    }
}
```
## 使用

```java:activity
text.setText(
        HtmlCompat.fromHtml(activity.getString(R.string.hoge))
);
```

## こんな感じ(xmlの設定も入ってる)

![スクリーンショット 2017-07-13 午後3.48.48.png](https://qiita-image-store.s3.amazonaws.com/0/33553/e8642681-c7ea-2d05-ea18-c7252c2f0098.png)
conv2d_transpose の動作を確認する

# 背景

通常の畳込み(convolution)は、入力された画像の解像度を下げるが、逆にこれを上げるものとして、transposed convolution(以前は deconvolution とも呼ばれていた）がある。TensorFlow だと tf.layers.conv2d_transpose 等でこれを行うが、動作の詳細がわからずもやもやしていた。

# 最もわかりやすい解説

[【保存版】chainerのconvolutionとdeconvolution周りを理解する](http://www.monthly-hack.com/entry/2017/03/03/171543)

これが一番わかりやすかった。具体例をあげて詳しく書いてあるので、もうこれだけ見てもらえれば十分。はい解散。

…というのもちょっと寂しいので、私は TensorFlow で検証してみた。わかりやすくするため、数値は思い切り単純なものにしてある。各自数字を変えて試してみるとよいかもしれない。もし間違いがあればご連絡ください。

# 検証コード

```python
import tensorflow as tf

with tf.Session() as sess:
    inputs = tf.ones([1, 3, 3, 1])
    outputs = tf.layers.conv2d_transpose(inputs, 1, [2, 2], 
        strides=[1, 2], padding='valid',
        kernel_initializer=tf.constant_initializer([[1, 0], [0, 0]]))
    sess.run(tf.global_variables_initializer())
    value = sess.run(outputs)
    print(value)
```

## 実行結果

```
[[[[1.]
   [0.]
   [1.]
   [0.]
   [1.]
   [0.]]

  [[1.]
   [0.]
   [1.]
   [0.]
   [1.]
   [0.]]

  [[1.]
   [0.]
   [1.]
   [0.]
   [1.]
   [0.]]

  [[0.]
   [0.]
   [0.]
   [0.]
   [0.]
   [0.]]]]
```

# 解説

確かに[【保存版】chainerのconvolutionとdeconvolution周りを理解する](http://www.monthly-hack.com/entry/2017/03/03/171543)の通りの動作になっている。

もともとの inputs が、


```math
\begin{bmatrix}
1 & 1 & 1 \\
1 & 1 & 1 \\
1 & 1 & 1 \\
\end{bmatrix}
```

これに対して、

```python
outputs = tf.layers.conv2d_transpose(inputs, 1, [2, 2], 
        strides=[1, 2], padding='valid',
        kernel_initializer=tf.constant_initializer([[1, 0], [0, 0]]))
```

で指定される transposed convolution 操作を行う。

inputs の周辺には、まず幅1でゼロパディングが施され、その上 `strides=[1, 2]` なので、幅方向に大きさ2のストライドを掛ける[^1]。すると以下のように。

```math
\begin{bmatrix}
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 1 & 0 & 1 & 0 & 1 & 0 \\
0 & 1 & 0 & 1 & 0 & 1 & 0 \\
0 & 1 & 0 & 1 & 0 & 1 & 0 \\
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
\end{bmatrix}
\tag{1}
```


`kernel_initializer=tf.constant_initializer([[1, 0], [0, 0]]))` で指定される行列は以下のもの。

```math
\begin{bmatrix}
1 & 0 \\
0 & 0 \\
\end{bmatrix}
```

これについて、2つの対角線でそれぞれひっくり返した(transpose[^2])行列は以下の通り。

```math
\begin{bmatrix}
0 & 0 \\
0 & 1 \\
\end{bmatrix}
\tag{2}
```
結局、行列(1)に対して、行列(2)で通常の convolution を掛ければよい。

答えは、

```math
\begin{bmatrix}
0 & 1 & 0 & 1 & 0 & 1 \\
0 & 1 & 0 & 1 & 0 & 1 \\
0 & 1 & 0 & 1 & 0 & 1 \\
0 & 0 & 0 & 0 & 0 & 0 \\
\end{bmatrix}
```
となって上のプログラムの実行結果と一致する。

[^1]: これは普通の convolution で言うところのストライドとは異なる。が、transposed convolution ではこれをストライドと呼ぶらしい。

[^2]: Transposed matrix といえば、「転置行列」。ただ、これは転置行列とは異なり、右下→左上の対角線に関してもひっくり返している。数学的には、なんと呼ばれる行列なのだろうか？
Excelのワークシートで簡単なマクロを作成する方法。

![cach-tao-1-macro-don-gian-trong-excel.jpg](https://qiita-image-store.s3.amazonaws.com/0/135064/c45593dd-b7af-d410-87f1-a94f5a3c21be.jpeg)

エクセルでの作業上、同じデータを何度も繰り返し使用することがあります。
しかし、大量の数字を一つずつコピペしていたら、膨大な時間がかかります。そんなときに便利なのがエクセルのマクロ機能です。
マクロとはエクセル上での作業を記録し、自動的に実行してくれる機能のことです。
例えば、ルーチン化しているデータの集計作業をマクロで記録すれば、コピペを繰り返さず、ボタンひとつで正確に実行することができます。
今回はマクロの便利な使い方を初期設定からご紹介します。


**マクロ作成の準備**
・[ファイル]を選択する。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/135064/724a624f-3ebd-6ddd-ac13-3898f241aa38.png)


・[オプション]を選択する。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/135064/2f81a835-d7c4-1fa4-f55a-cb15dbd6d404.png)


・[リボンのユーザー設定]を選択し、[開発]にチェックをして[OK]ボタンを押す。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/135064/248b2d1a-4bec-c1c7-39c5-ba7be5468b20.png)

**マクロ作成のステップ**

**ステップ1**
・開発のタグを選択してワークシートでマクロを設定したいところを選択し、[マクロの記録]を押す。
※この例では[TEST1]のセールを選択した。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/135064/b27f67b7-cad7-86f5-1375-35229e0852f5.png)

**ステップ2**
・マクロ名、ショートカットキー、マクロの保存先、説明の空欄に入力して[OK]ボタンを押す。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/135064/daec55b5-f2ea-28ce-6279-ff229f93fb05.png)


**ステップ3**
・挿入のタグを選択してワークシートで選択したセールにフォントの太字、背景の色、フォントの色などを設定し、[OK]ボタンを押す。
![6.png](https://qiita-image-store.s3.amazonaws.com/0/135064/0834f8ac-fb0b-4447-0939-02036e9b2877.png)


**ステップ4**
・ステップ3が終わったら、開発のタグに戻って[記録終了]ボタンを押す。
![7.png](https://qiita-image-store.s3.amazonaws.com/0/135064/0584a3bf-e1d7-13e5-0196-3d6886ecbf12.png)


**ステップ5**
・ステップ2,3,4と同じように設定する。
![8.png](https://qiita-image-store.s3.amazonaws.com/0/135064/4bdb0301-77d4-6c57-a3d9-ffa7054c0e9d.png)


**ステップ6**
・ステップ2,3,4と同じように設定押す。
![9.png](https://qiita-image-store.s3.amazonaws.com/0/135064/c12c3b3b-9d67-72cb-95b9-e9c5622ce7ce.png)


**ステップ7**
・TEST1、TEST2、TEST3にフォントの太字、下線、斜体、背景の色、フォントの色などを設定した状態です。
![10.png](https://qiita-image-store.s3.amazonaws.com/0/135064/009cdaf2-c8cc-cfb9-0b87-20ad08af1392.png)


**ステップ8**
・作成したマクロを反映したいセールに選択し、開発のタグで[マクロ]ボタンを押す。
![11.png](https://qiita-image-store.s3.amazonaws.com/0/135064/ffa95ef5-4757-8cb5-c906-3d52f9a1de20.png)


**ステップ9**
・反映したいマクロを選択し、[実行]ボタンを押す。
![12.png](https://qiita-image-store.s3.amazonaws.com/0/135064/6a61a0b1-eb77-9c56-6bbc-3d56616ba4a7.png)


**ステップ10**
・反映したいマクロを選択し、[実行]ボタンを押す。
![13.png](https://qiita-image-store.s3.amazonaws.com/0/135064/6a27e2c3-e9dc-ba7b-806b-c03b8ceb92fb.png)


**ステップ11**
・反映したいマクロを選択し、[実行]ボタンを押す。
![14.png](https://qiita-image-store.s3.amazonaws.com/0/135064/12052534-33df-5ab3-630b-905c3f6014b5.png)


**ステップ12**
・実行した結果です。
![15.png](https://qiita-image-store.s3.amazonaws.com/0/135064/2b88a23d-1b7c-ffeb-652a-b29c6727dbd0.png)
CSharp > CLS準拠 >uint:CLSに準拠していない

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
```

C# CODING GUIDELINES
http://qiita.com/Ted-HM/items/67eddbe36b88bf2d441d
を読んでいて、ふと目に入った以下の部分。

> uintすなわちSystem.UInt32はCLSに準拠していません。

CLSとは何か。

[CLS 準拠コードの記述 @ MSDN](https://msdn.microsoft.com/ja-jp/library/bhc3fa7f(v=vs.110).aspx)

CLS準拠の必要性などについては以下に紹介されていました。
http://csharper.blog57.fc2.com/blog-entry-29.html
> 全ての.NET言語がサポートしなければならない仕様を共通言語仕様（CLS）と呼ぶ。
CLSは、外部に公開する部分にだけ適用される。つまり、メソッド内の処理コードなどには関係ない。

別の情報として。
https://stackoverflow.com/questions/1828575/why-should-i-write-cls-compliant-code

> The answer is to allow maximum compatibility across .NET languages. CLS is the lingua franca ...
Facebookのテストユーザーを利用してFacebookアプリのテストを自動化する


こんにちはsekitakaです。

Facebookアプリを開発しているとGraph APIを使って投稿する関数のテストなどを実装する必要が出てきます。
はじめは自分のアカウントでテストしたりしましたが、自動化するとなると別の方法を検討する必要がありました。

調べたところFacebookには開発用のテストユーザーを作成する機能があります。
この機能はGUIとAPIの両方で提供されており、テストユーザーの作成と削除ができます。
これを利用してテストの度にFacebookのテストユーザーを生成しテストを実行する事で、テストの自動化に対応することができます。

# GraphAPIのテスト自動化のフロー
1. テスト開始時にFacebookのテストユーザーを作成する
2. 単体テストする
3. Facebookのテストユーザーを削除する

# サンプル
pythonでのテストケースのサンプルは以下のようになります。

```python:sample.py
# coding:utf-8
# !/usr/bin/python
import facebook
import unittest
from unittest import TestCase


# テスト対象関数
# ただメッセージをウォールに投稿するだけ
def post(message, fb_token):
    graph = facebook.GraphAPI(fb_token)
    graph.put_wall_post(message)


class Test(TestCase):
    # Facebookテストユーザー
    FB_USER = None

    FB_APP_ID = 'YOUR_APP_ID'
    FB_APP_SECRET = 'YOUR_APP_SECRET'

    @classmethod
    def setUpClass(cls):
        super(Test, cls).setUpClass()

        # テストユーザーを作成
        app_token = facebook.GraphAPI().get_app_access_token(cls.FB_APP_ID,
                                                             cls.FB_APP_SECRET,
                                                             True)
        graph = facebook.GraphAPI(app_token)
        cls.FB_USER = graph.request(cls.FB_APP_ID + '/accounts/test-users', {
            'permissions': 'public_profile,user_photos,publish_actions'
        }, {},
                                    method='POST')

    @classmethod
    def tearDownClass(cls):
        super(Test, cls).tearDownClass()

        # テストユーザーを削除
        app_token = facebook.GraphAPI().get_app_access_token(cls.FB_APP_ID,
                                                             cls.FB_APP_SECRET,
                                                             True)
        graph = facebook.GraphAPI(app_token)
        graph.request(cls.FB_USER['id'], {}, None, method='DELETE')

    # postが正常に投稿できることをテスト
    def test_post(self):
        print Test.FB_USER
        post("hogehoge", Test.FB_USER['access_token'])


if __name__ == '__main__':
    unittest.main()
```

# まとめ
今回はpythonのサンプルコードをのせましたが、GraphAPIはHTTPベースなので言語を問わず同様の仕組みを作れると思います。
いつの間にかAPIの仕様が変わるといったことも考えられるので、GraphAPIを利用する関数のCIで定期的なテストを実施しておくとよいですね。
MySQLで使いそうな物メモ


MySQLを使う事になったので使いそうな物をメモってみた。

# テーブル一覧を見たい

全スキーマ

```sql
select  table_schema, table_name from information_schema.tables;
```

今のスキーマのみ

```sql
show tables;
```

# index名の一覧を取得する

全スキーマ

```sql
select distinct table_schema,table_name,index_name from information_schema.statistics where index_name  <> 'PRIMARY';
```

対象のテーブルのみ

```sql
show index from information_schema.statistics\G
```

# テーブル定義を読む

```sql
show create table information_schema.statistics;
```

ついでにindexも出てくる

# カラム名一覧を取得したい

```sql
select table_schema, table_name, column_name,data_type from information_schema.columns order by table_schema, table_name, column_name;
```

@ran さんのコメントより

```sql
desc mysql.user;
```

# データ容量を見る 
```sql
select round(sum(data_length) / 1024 / 1024, 1) as 'data_volume(MB)' from information_schema.tables;
```

スキーマごとのデータ容量

```sql
select table_schema, round(sum(data_length) / 1024 / 1024, 1) as 'data_volume(MB)' from information_schema.tables group by table_schema;
```

# ユーザー名一覧

@tokino さんのコメントより

```sql
 select user, host  from mysql.user;
```