OmniAICreator/Qiita-1.07M huggingface dataset:
HomeBrew で tmux 2.5 に East Asian Ambiguous Character パッチを当ててインストール

## 2020/2/5 追記

もう見てる人もいないと思いますがこれは非常に古い文書です。今後は [z80oolong さんの formula](https://github.com/z80oolong/homebrew-tmux) を使用してください。こちらのリポジトリを tap して追加された formula をインストールしたら良いです。

## TL; DR

```console
$ curl -L https://git.io/vdaib | sh
```

コマンドラインにコピペして Enter で OK。

Homebrew の環境を変えてしまうのでできれば以下の説明も読んで下さい。

## tmux のパッチ
[このパッチを利用させてもらっています。](https://gist.github.com/z80oolong/e65baf0d590f62fab8f4f7c358cbcc34)

## やってること

1. `brew update`
2. `brew uninstall -f tmux` -- tmux のアンインストール
3. Formula のあるディレクトリに cd
4. tmux.rb にパッチを当てる
5. brew で tmux をソースからインストール
6. Formula にパッチを当てたときにできたバックアップファイルを削除
7. 修正をコミット
8. `git config branch.master.mergeOptions '--no-edit'` -- マージ時にコミットメッセージの編集をスキップするよう git を設定

### なぜコミットするのか
コミットしておかないと `brew update` できなくなるからです。コミットしておけば `tmux.rb` がアップデートされたときも git がよしなにマージしてくれます。ま、コンフリクトの可能性はありますけどw

### なぜコミットメッセージの編集をスキップするよう設定するのか
これをやっておかないと `tmux.rb` がアップデートされるたびにエディタが起動してマージコミットのメッセージ入力が求められることになります。それを求められて嬉しい人は多分いないはずなのでこのように設定を変えています。

## 余談
実のところ [tmux 2.1](http://qiita.com/__hage/items/5280e072edeb47dc8ada)でなんの不自由もなく使っていました。しかしどうやら[ターミナルでtrue colorが使える](http://qiita.com/delphinus/items/b8c1a8d3af9bbacb85b8)らしいことを聞きました。調べてみたところ以下の条件が揃うと `emacs -nw` を true color 化できることがわかりました;

* iTerm2 3.0 以上 (クリア)
* Emacs (パッチを当てるっぽい)
* tmux 2.2 以上

最後のやつに引っかかったので重い腰を上げたのでした。しかしまだ Emacs の true color 化は実現できていません。

## 参考文献
* [HomeBrew の tmux 2.5 に日本語の文字幅を調整するパッチを当てる](https://gist.github.com/hage/65511bfb1e4983ae16bac3b7156b8b31) 私が作ったものです。`tmux.rb` のパッチやシェルスクリプトをまとめてあります。

* [tmux 2.3 以降において East Asian Ambiguous Character を全角文字の幅で表示する](https://gist.github.com/z80oolong/e65baf0d590f62fab8f4f7c358cbcc34) 実際の tmux へのパッチです。
LINE Botに投稿した画像をLambdaで受けてS3に保存する

#前置き
LINE Botに投稿した画像をS3に保存しようと思いぐぐったものの
『lambda 画像 s3』だと死ぬほどサムネとかリサイズとか系のが引っかかる。
ちゃうねん！LINE Botに投稿した画像を本当にそのまま単純にS3に保存したいだけやねん！その後の加工は別処理でしたいねん！
調べ方が悪いのかなかなかストライクな記事が見つからなかったので、とりあえずいろんな記事のやってる事を継ぎ接ぎした事のまとめ。
Lambdaはnode.js。

#流れ
①LINE Botを使えるようにする
②LambdaでMessaging APIから投げられたリクエストを元に画像を取得する
③LambdaからS3へ画像を保存する

##①LINE Botを使えるようにする
LINE Bot作成まではだいたい下記記事を参考にしてなんとかなったが、若干画面が変わってた。
といっても気合でなんとかなる範囲の変化だったので詳細は割愛。
[LINE Messaging API と AWS Lambda で LINE BOT を作ってみた](http://www.kazuweb.asia/aws/lambda/chatbot)

##②LambdaでMessaging APIから投げられたリクエストを元に画像を取得する
画像取得の記事は下記を参考。
LINE Bot作成周りとかリクエストの中身の説明とか細かく記載されているものの、Messaging APIの前身のLINE BOT APIに関しての内容なので、必要な部分だけを拝借。
とはいえかなり参考になった。
[LINE BOT APIを使ってAWS Lambdaでサーバレスな版画風写真加工BOTを作る(Node.js)](https://qiita.com/akihito_nagai/items/f284ef495da380f368cc)

LINEに投稿した画像は、別の場所に有効期限付きで保存された状態になっているらしい。
そのためLambdaから画像バイナリ取得用のAPIでデータを取ってくる必要あり。

```
var https = require('https');

// 引数のmessage_idは
// event_data.events[0].message.typeが"image"だった場合に
// event_data.events[0].message.idで取得したもの
var get_image = function(message_id,callback){
    
    // Request Headers
    var send_options = {
        host: 'api.line.me',
        path: '/v2/bot/message/'+message_id+'/content',
        headers: {
            "Content-type": "application/json; charset=UTF-8",
            "Authorization": " Bearer " + "{ MY_TOKEN }" // ←ここに自分のトークンを入れる(LINE Developersで発行したやつ)
        },
        method:'GET'
    };
 
    // APIリクエスト
    var req = https.request(send_options, function(res){
        var data = [];
        res.on('data', function(chunk){
          //image data dividing it in to multiple request
          data.push(new Buffer(chunk));
        }).on('error', function(err){
          console.log(err);
        }).on('end', function(){
          // ここに画像取得後の処理を書く
          // この場合は、引数で受け取った画像取得後の処理用callbackを実行
          // dataに画像のバイナリデータが入ってる
          callback(data);
        });
    });
    req.end();
};
```


##③LambdaからS3へ画像を保存する
②で取得した画像データをS3へ保存。
[LambdaでS3にデータを格納する](https://qiita.com/masamasa/items/8b1ffad9fb55ca6e7c10)

```
var AWS = require('aws-sdk');
AWS.config.region = 'ap-northeast-1';
var s3 = new AWS.S3({ apiVersion: '2006-03-01' });

// dataは画像のバイナリデータ
// ②の関数のcallbackがこれになるイメージ
var save_image = function(data){
    var params = {
        Bucket: 'my_bucket', // ←バケット名
        Key: 'test.png', // ←バケットに保存するファイル名
        Body: Buffer.concat(data)
    };
    s3.putObject(params, function(err, data) {
        // 画像保存後の処理
    });
};
```

#終わりに
LINEに投稿した画像処理とかしたい、けどレスポンスは早くしたい、という事でいったん保存とその後の処理を分けたいというのが目的にあった。
今後はその画像処理部分で躓いたら記事書こうと思う。
Bitcoinjの状況(2017年10月)


https://github.com/bitcoinj/bitcoinj




- 現在の最新バージョン:v0.14.5
	- Segwit非対応
	- Segwit対応中のブランチは[segwitブランチ](https://github.com/bitcoinj/bitcoinj/tree/segwit)にある。PRにもSegwit用のアドレス作成関連のプルリクが出ている。８月末で最終更新？っぽくて、いつマージされるかは不明。テストのコードカバレッジ、クラス設計の問題などでマージされていない。

=> segwitブランチをダウンロードして、使ってみてテストして大丈夫そうか確かめる必要あり。


- masterブランチ最新バージョンv0.15(segwit非対応）
	- mavenリポジトリから直接ダウンロードできないため、自分でビルドしてjarファイルをincludeする必要がある。
	- ビルドしようとしたがテストが通らなくてエラーになったのでエラーをスルーするようにしたらビルドできた。

## API等について
- ドキュメントは主にjavadocを参照したほうが良さそう。細かいことはサイトには書いてないので、ソースコードにあるコメントなどが参考になる。

https://bitcoinj.github.io/javadoc/0.14/index.html?overview-summary.html


最小構成でexampleのスクリプト実行


https://github.com/starcharles/bitcoinj-sample

リポジトリのexample/フォルダにサンプルのスクリプトがあるのでそれを使ってみる。


/src/main/java/com/example/BackupToMnemonicSeed.java

を実行


```
gradle run

```

ビルドでmavenリポジトリから大量に関連ライブラリをダウンロードするので時間少しかかる。


### 結果
```
$ gradle run

Starting a Gradle Daemon (subsequent builds will be faster)

> Task :run
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
seed: DeterministicSeed c61dae74f8349506f81bfffca92e0b83388a51ba3aefa2f5ad9969b603b92f62ae954a86b5508fbb45c35ebbc787a3744ed4917abff0c749ba1fa10c72b779e1 rice sad you way merit much deputy steel bike remove invest evidence
creation time: 1507603937
mnemonicCode: rice sad you way merit much deputy steel bike remove invest evidence


BUILD SUCCESSFUL in 7s
2 actionable tasks: 2 executed
```

Seedと対応するニーモニックが生成された。
Gitのユーザー名・Eメールを全フォルダ変更する

`git config --global`の変更だけでなく、各フォルダ内に変更を適用したい場合に使って下さい。

```
$ for F in `find -type d -maxdepth 1`;do pushd $F;  git config user.name {{yourname}}; git config user.email {{yourmailaddr}}; popd; done 
```

{{}}の中は適宜変更してください。
オレオレ証明書なGitlabサーバにGitlab Runner を登録する

Gitlab CIを使ってみようと思ったが
自己証明書を使っているサーバに Gitlab runner を登録するとこで
ハマったので手順をメモ

# 手順
## 1. 証明書を取得

Gitlabサーバに使用されている証明書を取得します
opensslコマンドを使って取得するのが楽そうです

```
$ openssl s_client -connect my.gitlab.domain:443 -showcerts < /dev/null | openssl x509 -outform PEM > /etc/gitlab-runner/certs/my.gitlab.domain.crt
```

`openssl s_client -showcerts` でサーバの証明書を確認することができます。
-showcerts は標準入力からの入力を待ちますので　`/dev/null` 入力することによって
すぐに終了するようにしています。

crtファイルのファイル名はGitlabサーバのドメインと合わせて、
`/etc/gitlab-runner/certs/`以下に配置します。

ここに置いておくことで `gitlab-runner register` コマンドを実行した際に
証明書ファイルを読み込んでくれるようです

## 2. gitlab-runner register コマンドを実行

あとはコマンドを実行するだけです

```
$ sudo gitlab-runner register
```

# その他

実際は docker in docker で動かすので
`/etc/gitlab-runner/certs`をボリュームマウントしてあげたりする

# 参考

https://docs.gitlab.com/runner/register/index.html
https://github.com/ayufan/gitlab-ci-multi-runner/blob/master/docs/configuration/tls-self-signed.md
https://gitlab.com/gitlab-org/gitlab-runner/issues/1388
npmのインストール手順

## 概要
npmのインストール手順です。

## 環境
- CentOS7.2
- node v6.11.3
- npm 3.10.10
- OpenSSL 1.0.2k-fips  26 Jan 2017

## 依存関係のインストール

```
$ sudo yum install -y libfontconfig.so.1 fontconfig
$ sudo yum update -y openssl
```

## npmのインストール

```
$ sudo yum install -y epel-release
$ sudo yum install -y --enablerepo=epel nodejs npm
```

### npm init

`Is this ok? (yes) yes`でyesと答える以外はとりあえず空白解答でデフォルト設定にする。
これで、package.jsonが生成される。
実行した場所にファイルとかディレクトリが生成されるので、適宜場所を移動してから実行してください。

```sh
$ npm init

This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg> --save` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
name: (contents)
version: (1.0.0)
description:
entry point: (index.js)
test command:
git repository:
keywords: # パッケージを公開した場合、npm searchでの検索キーワードをスペース区切りで設定する
author:
license: (ISC)
About to write to /home/vagrant/contents/package.json:

{
  "name": "contents",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}


Is this ok? (yes) yes
```

## インストール例
例として、PhantomJSをインストールする。

```
$ sudo yum install -y bzip2
$ npm install --save phantomjs
```

devのみにインストールする場合は

```
$ npm install --save-dev phantomjs
```

### saveオプションについて
> --save は package.json の dependencies に追記される。
> --save-dev は package.json の devDependencies に追記される。
> --save-optional は package.json の optionalDependencies に追記される。
>
> それぞれの違いだが、package.jsonがモジュールとして外部に公開し、他の人がnpm > installした時に影響する。
>
> 他の人が npm install した時に、dependencies に指定したパッケージが全てインストールされる。
参考：http://hblog.glamenv-septzen.info/entry/2015/03/22/233241

## PATHを通す

```
$ npm bin phantomjs
$ echo 'export PATH="$HOME/node_modules/.bin/:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
```

## phantomjs実行

```
$ phantomjs -v
```

```
$ phantomjs --webdriver=4444
```
Visual Studio Code for Mac C# 試したら、インテリセンスが効かずエラーが出たのでその対処

単なるじぶんに対するメモ。

# .NET Core 入っているのにインストールしろと言われる

Visual Studio Code で　C# を Mac から試したら、何やらエラーが出てうまく動かなかった。`.NET Core` を入れろや！というエラーメッセージが出てくるのだが、そんなものとっくに入っている。ちなみに

```
$ dotnet --info
.NET Command Line Tools (2.0.0)

Product Information:
 Version:            2.0.0
 Commit SHA-1 hash:  cdcd1928c9

Runtime Environment:
 OS Name:     Mac OS X
 OS Version:  10.12
 OS Platform: Darwin
 RID:         osx.10.12-x64
 Base Path:   /usr/local/share/dotnet/sdk/2.0.0/

Microsoft .NET Core Shared Framework Host

  Version  : 2.0.0
  Build    : e8b8861ac7faf042c87a5c2f9f2d04c98b69f28d
```

ちゃんと動くし。インターネットで調べるとバグという話もあるが、載っている開放ではうまくいかない。
下記のようなエラーも出ていた。

```
.net core mac Microsoft.Build.Exceptions.InvalidProjectFileException: The SDK 'Microsoft.NET.Sdk' specified could not be found.
```

* [The .NET CLI tools cannot be located #627](https://github.com/OmniSharp/omnisharp-vscode/issues/627)

このポストで、Windows の場合複数バージョンがあるとダメみたいなことが書いてあったので、ふと思いついて、.NET Core を消して再起動するとうまくいった。

# .NET Core を Mac で　再インストールしてみる

```shell-session
# delete the dotnet folder under /usr/local/share/dotnet
1. cd /usr/local/share/dotnet && ls
2. sudo rm -rf dotnet

# delete the dotnet reference file at /etc/paths.d/dotnet
1. cd /etc/paths.d && ls
2. sudo rm dotnet
```
* [Steps to uninstall a DotNet CLI version on Mac OS X](https://gist.github.com/sandrovicente/5590f5ac993d9d7fef038fd2858efcc3)

これでおっけー。インテリセンス！これないとC# のよさ半減よね。

<img width="1019" alt="Screen Shot 2017-10-10 at 11.56.13 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/2c1b0729-9736-a61a-e933-9e67b6869fb8.png">
Java 9だとAndroidプロジェクトのGradleが立ち上がらない

うっかり`JAVA_HOME`を設定しておらずJava 9が入っていると以下のとおりコケます

```
% ./gradlew
Parallel execution with configuration on demand is an incubating feature.

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':app'.
> Failed to notify project evaluation listener.
   > Could not initialize class com.android.sdklib.repository.AndroidSdkHandler

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

* Get more help at https://help.gradle.org

BUILD FAILED in 1s
```

brew cask で入るJavaのバージョンが1.9になっていてハマりました…。

Java 8を入れて `java_home` で1.8が入っていることを確認します。
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

```
% /usr/libexec/java_home -V
Matching Java Virtual Machines (2):
    9, x86_64:  "Java SE 9"     /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home
    1.8.0_144, x86_64:  "Java SE 8"     /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home
```

`$JAVA_HOME` が1.8に設定されたら多分いい感じに動きます。

```
% export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)
% echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home
```
Python or Docker でローカルサーバををつくる

#はじめに

Webブラウザを使って操作するWebアプリを、標準のPythonモジュールで作成したいと思います。
標準のモジュールだけを使ってシンプルなアプリケーションを構築することで、Webアプリがどのように動作しているかを理解することを目的とします。

開発環境：
MacbookPro(Mid2012)
OSはMacOS Sierra(High Sierraはすでに出ているが自分はアップグレードしてない)

PythonでWebアプリを開発するためには、開発環境にPythonをインストールする必要があります。
MacOS Sierra には python2.7.10がはじめからインストールされていますが、今回使っているのはPython3.5.1です。

Pythonのバージョンを確認方法、Terminalを起動してから、以下のコマンドを入力します。
`python` または `python3` 

![スクリーンショット 2017-10-03 12.34.49.png](https://qiita-image-store.s3.amazonaws.com/0/179248/b10a09d9-7df9-08c6-5340-7d19d298c6a2.png)

## 1. Python3でWebサーバを作る
Python3の時ではhttp.serverを使います。
ポート番号を省略すると8000が用いられます。
Terminalを起動して、以下の一行のコードを書くと簡単にSimpleHTTPServerが立ち上がることができます。

```text:
$ python3 -m http.server [ポート番号(デフォルトは8000)]
```
Webブラウザを起動して、「http://localhost:8000」にアクセスしてみてください。
現在いるディレクトリによって表示する内容が異なります。
私のディレクトリリストは以下のようになります。

![スクリーンショット 2017-10-03 15.58.36.png](https://qiita-image-store.s3.amazonaws.com/0/179248/fd8e50bf-6f5d-84a0-7cd7-52248b917885.png)

また、Terminalには、Webサーバの稼働状態が表示されています。

![スクリーンショット 2017-10-03 15.58.26.png](https://qiita-image-store.s3.amazonaws.com/0/179248/0dd82286-ac5b-c91f-f59b-9ecab5df2b2b.png)

localhostは現在使用しているシステムそのもののことを指します。Webブラウザにlocalhostと入力した場合、127.0.0.1（ループバックアドレス）が読み込まれます。
つまり、今回入力した 「http://localhost:8000」 とは、「このブラウザが開かれているPC上で起動してるWebサーバの8000番ポートにアクセスする」という意味です。

※ ちなみに、サーバを終了するには Control+C を押します。

#### 1.2 HTMLファイルを表示する
Webサーバとして公開するからには、HTMLファイルを表示したいです。その方法はとても簡単で、表示したいHTMLを作成して、ドキュメントルートに置くだけで完了します。

まずはドキュメントルートにするディレクトリを作成しましょう。場所はどこでもかまいません。
今回は、先ほどのディレクトリリストの中のtest.htmlを使います。

```html:test.html
<!Doctype HTML>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Hello Wolrd</title>
  </head>
  <body>
    <h1 style="color:red;">Hello Welcome Python's World</h1>
    <h2>Python</h2>
    <h3>Python</h3>
    <p>Python</p>
  </body>
</html>
```
表示すると
![スクリーンショット 2017-10-03 15.58.44.png](https://qiita-image-store.s3.amazonaws.com/0/179248/be331992-c6ac-4370-07d9-15046014204b.png)
になります。

「HTTPリクエストに対してHTMLファイルを返す」ことができましたので、これでWebサーバと呼んでいいアプリケーションが完成しました。HTMLファイルに画像を追加したり、CSSで装飾したりすることによって、より素晴らしいWebページを表示することができます。


## 2. Python2でWebサーバを作る
Python2ではSimpleHTTPServerを使います。
ポート番号を省略すると8000が用いられます。
Terminalを起動してPythonのインタラクティブシェルを起動し、以下の二行のコードを書くと簡単にSimpleHTTPServerが立ち上がることができます。

```python:
>>> import SimpleHTTPServer
>>> SimpleHTTPServer.test()
```
## 3. DockerでWebサーバをつくってみる
#### 3.1 Python2の場合
```text:
$ docker run -it --rm -p 8888:8888 -v `pwd`:/app -w /app python:2-alpine python -m SimpleHTTPServer 8888
```
#### 3.2 Python3の場合
```text:
$ docker run -it --rm -p 8888:8888 -v `pwd`:/app -w /app python:3-alpine python -m http.server 8888
```
API Gatewayのログ出力を有効化する

## 前置き
Chaliceを使ってlambda関数の開発をしている為、簡単にCloudwatchのログが見れる。
が、lambdaで処理した後のレスポンスが取得出来ていない…

## 対応方法

### IAMロールを新規作成・設定する
1. IAMのダッシュボードへ移動する
2. ロールを選択
3. ロールの作成
4. AWSサービス：API Gatewayを選択する![スクリーンショット 2017-10-10 11.01.46.png](https://qiita-image-store.s3.amazonaws.com/0/67717/7e6989b8-c308-e506-88a6-b36981600430.png "スクリーンショット 2017-10-10 11.01.46.png")

5. AmazonAPIGatewayPushToCloudWatchLogs を選択する（これしか表示されていない、はず）
6. ロール名、説明を入力する （ロール名はapiwateway-logs-<region> とかにすればわかりやすそう）
7. 作成したロールを選択して、ARNを記録する![スクリーンショット_2017-10-10_11_06_21.png](https://qiita-image-store.s3.amazonaws.com/0/67717/c1a3a04b-07a3-352d-d27b-1a5ade39bc64.png "スクリーンショット_2017-10-10_11_06_21.png")



### API-GatewayにIAMロールを設定する
1. API Gatewayのダッシュボードへ移動する
2. 設定を選択
3. CloudWatchログのロールARNに、上で記録したARNを記入して保存![スクリーンショット_2017-10-10_11_06_49.png](https://qiita-image-store.s3.amazonaws.com/0/67717/d0b26de0-0e98-7a5d-8e20-920065b02bcc.png "スクリーンショット_2017-10-10_11_06_49.png")


### ログを記録したいAPIを設定する
1. APIを選択する
2. ステージを選択する
3. 設定タブにCloudWatch設定が表示されているので、チェックを入れて保存する![スクリーンショット_2017-10-10_11_08_53.png](https://qiita-image-store.s3.amazonaws.com/0/67717/5f62b7c9-e61c-e90d-449b-22b2ed8330ec.png "スクリーンショット_2017-10-10_11_08_53.png")


### Cloudwatchのログを確認する
1. API-Gateway-Execution-Logs_<api id>/<api stage> でログが出力されている![スクリーンショット_2017-10-10_11_31_14.png](https://qiita-image-store.s3.amazonaws.com/0/67717/c1e66568-91b5-0996-e807-d540d97ba2cb.png "スクリーンショット_2017-10-10_11_31_14.png")


## 注意
Cloudwatchログの有効期間を設定して、ログ死しないように
ステージ毎に異なるロググループになってしまう（検索で対応は出来る）

## 結果
API Gatewayのログ出力は出来るようになったが、これだけではまだエラーレスポンスは取得できていない。
lambda関数の設定と、API Gatewayの設定も必要…
【css】web全体を枠(フレーム)で囲う方法


最近よく見るweb全体をフレームで囲うデザインを実装するときに、わりと迷ったので記事にしました。
### 課題
* 枠はスクロールしても位置が変わらない
* bodyはスクロールさせたい(bodyの子要素にボーダーをつけてoverflowを設定するのは嫌)

### 解決策
* body / htmlタグ自体に::before,::after擬似要素を追加
* position: fixedの四角を上下左右に配置

### 実際のコード

```style.css
/* 枠の太さ = 10px */
/* 枠の色 = #f08d24*/

html:before,
html:after,
body:before,
body:after {
  content: "";
  background: #f08d24;
  position: fixed;
  display: block;
  z-index: 1;
}

/* 上 */
html:before {
  height: 10px; 
  width: 100vw;
  left: 0;
  top: 0;
}

/* 右 */
html:after {
  width: 10px;
  height: 100vh;
  right: 0;
  top: 0;
}

/* 下 */
body:before {
  height: 10px;
  width: 100vw;
  bottom: 0;
  left: 0;
}

/* 左 */
body:after {
  width: 10px;
  height: 100vh;
  top: 0;
  left: 0;
}
```
DB2 Express-C データベースとインストール


DB2 Express-C ダウンロード（無償版）
http://www-03.ibm.com/software/products/ja/db2expressc

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/192219/e8ee4e54-22cd-2aaf-a72f-592a4f737f22.png)

ダウンロードファイルを展開
インストーラーを実行する。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/192219/6aeca1f3-ac7b-05f3-eb49-726db93cd591.png)

製品のインストール
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/192219/fefed6c5-dfea-8212-e573-c085de3c24ef.png)

インストールが完了すると、下記のような起動停止ツールが常駐します。
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/192219/33e2f3da-48af-a10b-6049-f41a7d5ab846.png)
開発環境では動くけれどビルドするとエラーを吐くPyQtコード:QString

# <i class="fa fa-cogs"></i> 検証環境

* Python 2.7 (WinPython-32bit-2.7.10.3)
* Spyder 3.0.0 (同梱)
* PyQt4
* Windows7
* cx_Freeze

# setup.py

```py
from cx_Freeze import setup, Executable

exe = Executable(script = 'script.py',  base = None)

setup(name = 'name',
      version = '0.1',
      description = '',
      executables = [exe])
```


# 症状

exe化したものの実行にのみ発生する。

setupをbase='win32gui'にするとエラーも出さずただ動作が止まるが、Noneにして黒い画面も出していると、そちらに表示される。

## エラーメッセージ

`TypeError: 'in <string>' requires string as left operand, not QString`

## 問題の値の取得コード

```py

line = QtGui.QLineEdit()
line.text()

```

一行の入力フォームに入力された値を取得し、これを使うことで発生する。
`QLineEdit.text`の返り値が`QString`であることは知っていたのだが([QLineEdit Class | Qt 4.8#text-prop])、とりあえずそのまま使ってみてもエラーも出ず正常に動いていたので、ビルド後に引っかかるとは予想外。

# 対処

```py

line = QtGui.QLineEdit()
str(line.text())

```

素直に変換。十中八九QString自体に関数がありそうですけど、これでエラー回避出来たのでOK。



[QLineEdit Class | Qt 4.8#text-prop]:http://doc.qt.io/qt-4.8/qlineedit.html#text-prop
How to fix Confluence Error : Could not add user as a member of group

### Symptom

![confluence_jira_directory_user_group1.jpg](https://qiita-image-store.s3.amazonaws.com/0/114634/a571e3c8-36c4-3a25-c35a-e6aae09ba210.jpeg)

![confluence_jira_directory_user_group2.jpg](https://qiita-image-store.s3.amazonaws.com/0/114634/5ef660f7-c9f8-c3ca-4627-0638cd911d50.jpeg)

![confluence_jira_directory_user_group3.jpg](https://qiita-image-store.s3.amazonaws.com/0/114634/0bc5f464-faa5-f1de-02f6-d4314f009a6b.jpeg)


### How to fix

![confluence_jira_directory_user_group4.jpg](https://qiita-image-store.s3.amazonaws.com/0/114634/6bea46d2-a80a-e098-3ef0-32b5ad078293.jpeg)

![confluence_jira_directory_user_group5.jpg](https://qiita-image-store.s3.amazonaws.com/0/114634/35a763cb-81dc-c510-6b02-653757262215.jpeg)

![confluence_jira_directory_user_group6.jpg](https://qiita-image-store.s3.amazonaws.com/0/114634/469ee3ab-0df5-91af-0eff-710224ee828a.jpeg)


### Reference

https://confluence.atlassian.com/confkb/unable-to-add-users-into-a-group-due-to-lack-of-permission-302812802.html
BKPCTF 2016 bob's hat (3/4)

## 問題概要

[前回](https://qiita.com/chihiro1000/items/dc9393a316ed412050a2)の続き．前回同様opensslで鍵の中身を見てみる．

```shell-session
$ openssl rsa -text -pubin < almost_almost_there.pub
Public-Key: (1040 bit)
Modulus:
    00:ba:d2:0c:f9:7e:d5:04:2d:f6:96:ce:4d:f3:e5:
    a6:78:cf:4f:b3:69:3d:3d:f1:2d:fe:9f:d3:fd:8c:
    c8:aa:b8:b9:55:33:e4:14:e3:fc:0c:37:7f:4e:e5:
    48:27:11:8b:1d:30:56:1a:3c:74:1b:ea:7c:76:89:
    97:89:b5:17:43:e0:76:09:2d:f9:eb:05:dc:97:eb:
    15:05:ce:9e:b1:2b:5a:b9:e1:0a:bf:56:f9:20:a5:
    8e:7e:00:ec:f0:59:77:e8:72:83:4d:d8:58:4c:f4:
    ac:87:cb:7d:c5:01:59:bd:96:2c:75:cb:ef:b6:c6:
    ac:3a:31:a7:4e:7d:8f:1e:4c:10:d5
Exponent: 65537 (0x10001)
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGhMA0GCSqGSIb3DQEBAQUAA4GPADCBiwKBgwC60gz5ftUELfaWzk3z5aZ4z0+z
aT098S3+n9P9jMiquLlVM+QU4/wMN39O5UgnEYsdMFYaPHQb6nx2iZeJtRdD4HYJ
LfnrBdyX6xUFzp6xK1q54Qq/VvkgpY5+AOzwWXfocoNN2FhM9KyHy33FAVm9lix1
y++2xqw6MadOfY8eTBDVAgMBAAE=
-----END PUBLIC KEY-----
```

また何の変哲もないような鍵の値．素因素分解の方法には前々回にあげたfermat法など優秀なアルゴリズムがあるが，愚直に小さい値から割っていくという力技ももちろん存在する．一瞬力技に見えるかもしれないが，素因数$p,q$のどちらかの値が小さいときには有効な手法である．

## 解き方

loopで1から順番に試し割りしていく．その他は今まで通り．

```rb
#!/usr/bin/env ruby
#coding: ascii-8bit

require '~/ctf/tools/ctf/crypto.rb'
require '~/ctf/tools/ctf/misc.rb'

e = 0x10001

n = "00:ba:d2:0c:f9:7e:d5:04:2d:f6:96:ce:4d:f3:e5:a6:78:cf:4f:b3:69:3d:3d:f1:2d:fe:9f:d3:fd:8c:c8:aa:b8:b9:55:33:e4:14:e3:fc:0c:37:7f:4e:e5:48:27:11:8b:1d:30:56:1a:3c:74:1b:ea:7c:76:89:97:89:b5:17:43:e0:76:09:2d:f9:eb:05:dc:97:eb:15:05:ce:9e:b1:2b:5a:b9:e1:0a:bf:56:f9:20:a5:8e:7e:00:ec:f0:59:77:e8:72:83:4d:d8:58:4c:f4:ac:87:cb:7d:c5:01:59:bd:96:2c:75:cb:ef:b6:c6:ac:3a:31:a7:4e:7d:8f:1e:4c:10:d5".gsub(/:/,"").hex

c = File.read('./almost_almost_there.encrypted').to_hex

i = 1
loop do
  break if n.gcd(i) != 1
  i += 1
end


p = i
q = n / i

puts p
puts q
raise "Failed factorization" unless p * q == n

rsa = RSA.new(e, n, p, q)
puts rsa.decrypt(c).to_ascii
```

以下が実行結果である．

```shell-session
54311
158304142767773473275973624083670689370769915077762416888835511454118432478825486829242855992134819928313346652550326171670356302948444602468194484069516892927291240140200374848857608566129161693687407393820501709299228594296583862100570595789385365606706350802643746830710894411204232176703046334374939501731
hQdK+dKleMJqth/dofWyFaiWp3PW7jil
```

見てわかるとおり，片方の素因数がかなり小さいことがわかる．
得られたパスワードで復号すると今まで通りの３つのファイルがでてきた．[次回](https://qiita.com/chihiro1000/items/42b8a1a5f9078dcd5608)に続く
AWSのMySQLクライアントが起動しない時の対処法

AWSのAmazon LinuxにMySQLいれてログインしようとした時に`Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'`ってエラーが出た。

socketファイルがないのと、権限周りが原因だったぽいのでそこらへんを修正して再起動する。

## 手順

> エラー内容を見ると`/var/lib/mysql/mysql.sock`らへんが怪しい
> `cd`で確認をしに行くと`/var/lib`配下にmysqlフォルダすらなかった

```
// ルート権限になっておく
$ sudo -i

// mysqlフォルダ作成
$ mkdir /var/lib/mysql

// mysql.sockファイルを作成
$ touch /var/lib/mysql/mysql.sock

// 権限をmysqlに変更
$ chown -R mysql:mysql /var/lib/mysql

// mysqlを再起動
$ service mysqld restart

// ログインしてみる
$ mysql -u root
```

で動きました。
yarnのselective dependency resolutions機能

yarn `v1.0.0`で追加された機能

- [Selective dependency resolutions \| Yarn](https://yarnpkg.com/lang/en/docs/selective-version-resolutions/)


### 何ができるか

dependency graphの完全なコントロールが可能になる

- package.jsonとyarnだけでコントールする
- 自分が使ってるnpm pkgが依存してるpkg（dependencies of dependencies)のversionを指定してインストールできるようになる。

```bash
➜  material-ui git:(master) npm outdated
Package                       Current         Wanted  Latest  Location
babel-eslint                    7.2.3          7.2.3   8.0.1  material-ui-build
babel-loader                    6.4.1          6.4.1   7.1.2  material-ui-build
chai                            3.5.0          3.5.0   4.1.2  material-ui-build
coveralls                      2.13.3         2.13.3   3.0.0  material-ui-build
cross-env                       4.0.0          4.0.0   5.0.5  material-ui-build
enzyme                          2.9.1          2.9.1   3.1.0  material-ui-build
eslint                         3.19.0         3.19.0   4.8.0  material-ui-build
fs-extra                        2.1.2          2.1.2   4.0.2  material-ui-build
istanbul                1.1.0-alpha.1  1.1.0-alpha.1   0.4.5  material-ui-build
jsdom                          9.12.0         9.12.0  11.3.0  material-ui-build
mocha                           3.5.3          3.5.3   4.0.1  material-ui-build
react                          15.6.2         15.6.2  16.0.0  material-ui-build
react-dom                      15.6.2         15.6.2  16.0.0  material-ui-build
react-test-renderer            15.6.2         15.6.2  16.0.0  material-ui-build
react-transition-group          1.2.1          1.2.1   2.2.1  material-ui-build
sinon                           3.3.0          3.3.0   4.0.1  material-ui-build
webpack                        1.15.0         1.15.0   3.6.0  material-ui-build
```

- `material-ui`が依存する`react-transition-group` では `1.2.1`が指定されてるが、最新版の `2.2.1` がインストールされるように変更できる
- `yarn.lock` も更新される

## 使い方

```json
"resolutions": {
    "material-ui/react-transition-group": "2.2.1"
}
```

- `package.json`に`resolutions` フィールドを追加し、上書きしたい依存パッケージを指定する
- `/`でネストの深さが表され、glob patternもちょっとだけサポートしてる
    - `some-middle-ware/**/request`



## 使いどころ

- 依存パッケージの依存パッケージ（、の依存パッケージ・・・・）が原因でエラーを吐くようになったが、すでにそのモジュールではパッチがリリースされてる場合
    - react-nativeで`metro-bundler`のversionを変える 
    - UIライブラリが依存してるmoment.jsのversionを変えたいとき

## スコープ外のこと

- いわゆるleftpad問題
    - dependencies treeのどっか深いとこにあるモジュールが、npm registoryからunpublishされてしまってるケース
    - こっちは別ソリューション必要
    - expo.ioがやってるようなscoped packageにコピーをホストしてunpublished対策するとか
    - [`@expo/vector-icons`](https://www.npmjs.com/package/@expo/vector-icons)

## そのうちしらべる

代替ソリューション

## resources

- https://github.com/yarnpkg/yarn/pull/4105
- https://github.com/yarnpkg/yarn/releases/tag/v1.0.0
BKPCTF 2016 bob's hat (2/4)

## 問題概要

[前回](https://qiita.com/chihiro1000/items/3b7d8e499572ed69d964)の続き．展開して得られた公開鍵の中身を見てみる．

```shell-session
$ openssl rsa -text -pubin < almost_almost_almost_there.pub
Public-Key: (1024 bit)
Modulus:
    00:ab:e6:33:ce:c2:e7:ec:10:a8:51:92:79:05:a6:
    57:df:4e:10:41:60:23:c0:c3:4f:c6:4d:64:bd:8b:
    82:57:b7:bf:20:7a:dd:04:7b:0a:df:21:c5:25:b0:
    52:06:8c:70:29:5c:74:6c:3b:1b:e1:43:6f:39:ed:
    8b:f7:a8:13:e4:b8:45:ce:0c:a8:9c:a8:28:b4:57:
    63:d4:6b:18:98:c7:a2:fa:5f:8f:e7:84:28:ca:b6:
    cd:f7:0e:f8:71:db:97:1b:32:32:84:1a:1c:e2:45:
    9c:e6:50:a1:54:36:2f:80:cf:b6:41:63:c3:ca:63:
    ad:72:bc:fb:db:f0:15:4f:f7
Exponent: 65537 (0x10001)
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCr5jPOwufsEKhRknkFplffThBB
YCPAw0/GTWS9i4JXt78get0EewrfIcUlsFIGjHApXHRsOxvhQ2857Yv3qBPkuEXO
DKicqCi0V2PUaxiYx6L6X4/nhCjKts33Dvhx25cbMjKEGhziRZzmUKFUNi+Az7ZB
Y8PKY61yvPvb8BVP9wIDAQAB
-----END PUBLIC KEY-----
```

特に怪しいところはない．fermat法をしてみても素因素分解できない．そこで試しに前の問題で使った公開鍵のgcdをとってみる．そうすると1ではない値がでてきた．つまり**素数の使い回し**をしていることがわかる．

## 解き方

gcdをとって，出てきた値を$p$として，$N$を割って，$q$を作る．あとは前回と同じ手順．以下にプログラムを示す．

```rb
#!/usr/bin/env ruby
#coding: ascii-8bit

require '~/ctf/tools/ctf/crypto.rb'
require '~/ctf/tools/ctf/misc.rb'

e = 0x10001

# from almost_almost_almost_almost_there.pub
n1 = "00:86:e9:96:01:3e:77:c4:16:99:00:0e:09:41:d4:80:c0:46:b2:f7:1a:4f:95:b3:50:ac:1a:4d:42:63:72:92:3d:8a:45:61:d9:6f:bf:b0:24:05:95:90:72:01:ad:32:25:cf:6e:de:d7:de:02:d9:1c:38:6f:fa:c2:80:b7:2d:0f:95:ca:e7:1f:42:eb:e0:d3:ed:ae:ac:e7:ce:a3:19:5f:a3:2c:1c:60:80:d9:0e:f8:53:d0:6d:d4:57:2c:92:b9:f8:31:0b:bc:0c:63:5a:5e:26:95:25:11:75:10:30:a6:59:08:16:55:4e:76:30:31:bc:bb:31:e3:f1:19:c6:5f".gsub(/:/, "").hex

p1,q1 = fermat(n1)

n2 = "00:ab:e6:33:ce:c2:e7:ec:10:a8:51:92:79:05:a6:57:df:4e:10:41:60:23:c0:c3:4f:c6:4d:64:bd:8b:82:57:b7:bf:20:7a:dd:04:7b:0a:df:21:c5:25:b0:52:06:8c:70:29:5c:74:6c:3b:1b:e1:43:6f:39:ed:8b:f7:a8:13:e4:b8:45:ce:0c:a8:9c:a8:28:b4:57:63:d4:6b:18:98:c7:a2:fa:5f:8f:e7:84:28:ca:b6:cd:f7:0e:f8:71:db:97:1b:32:32:84:1a:1c:e2:45:9c:e6:50:a1:54:36:2f:80:cf:b6:41:63:c3:ca:63:ad:72:bc:fb:db:f0:15:4f:f7".gsub(/:/, "").hex

p2 = n1.gcd(n2)
q2 = n2 / p2

puts p2
puts q2
raise "Failed factorization" unless p1 * q2 == n2

c = File.read('./almost_almost_almost_there.encrypted').to_hex

rsa = RSA.new(e, n2, p1, q2)
puts rsa.decrypt(c).to_ascii
```

以下が実行結果である．

```shell-session
9733382803370256893136109840971590971460094779242334919432347801491641617443615856221168611138933576118196795282443503609663168324106758595642231987246769
12401828372292379853813876769631673931562555174641979554254424458038243058638417065284301266881242433017828663818811606556559256084249679274024474025282343
rlSpJ6HbP+cZXaOuSPOe4pgfevGnXtLt
```
得られたパスワードを使って展開してみると，また同じように3つのファイルが得られた．[次回](https://qiita.com/chihiro1000/items/b6f5cb2d0ac06e4f51dd#_reference-bf380f1a8bc31ab026de)に続く．
javascript モジュールパターン：モジュールの公開サンプルと作ってみて感じたこと。

できるだけグローバル空間を汚染したくない気持ちは分かるけど、ある程度はしょうがない(もうどうしようもない)部分も出てくる。
自分で設置できる部分に関してはきちんと名前空間を定義しておく。
もちろん実装したページに関してのドキュメントを残しておく。

```
var HogeHugaParty = HogeHugaParty || {}; //名前空間を定義
 
HogeHugaParty = (function () { //実際に呼び出す関数は、この中に含まれている。
 
    var ho  = "ﾎｰｵ"; //名前空間内でだけ使えるグローバル変数
 
    function sampleHoge (wao) {  //この関数を名前空間の外から呼び出す
        console.log(wao)
    }
    function sampleFuga  (gogo) {  //この関数を名前空間の外から呼び出す
        console.log(uoooo(gogo))
    }


    //ヘルパー関数　のちのち別のjsファイルに移動。
    function uoooo (gogo) {  //外から呼び出さなくてもいい関数
        var say  = "せい";
        return gogo + say + ho;
    }
 
    //公開する関数
    return {
        sampleHoge: sampleHoge,//呼び出す関数だけreturnする。
        sampleFuga: sampleFuga
    }
})();
 
HogeHugaParty.sampleFuga('エビバデ');
HogeHugaParty.sampleHoge('ゴーゴー');

```

・１つの関数の中では１つの仕事をさせる事を意識しておかないと、必ず混乱する。
・ヘルパー関数は、公開する関数に変化する可能性を考えておく。
　　┗webpackなど使わない時のヘルパー関数は、別の名前空間（jsファイル）を作っておくのがよい。
　　　同じjsファイルに書くと膨大な行数になってくるのでオススメしない。僕は移動した。

```
実装するHTMLファイル内に２つのjsを読み込んでおけばよい。
script type="text/javascript" src="helper_hogeHugaParty.js"
script type="text/javascript" src="hogeHugaParty.js"

↓↓使うとき。

//ヘルパー関数にも名前空間を作っている。
function sampleFuga  (gogo) {
    helper.log(helper.uoooo(gogo))
}
```


参考にさせていただいたqiita
https://qiita.com/kenju/items/a8a1009f5872a8b12568
[VS Code] Import文を自動追加してくれる拡張機能「Auto Import」で、Angular開発が捗る！

普段Angular開発(TypeScript)をしている時に、JetBrains IDEにあるようなImport文の自動追加機能が、Visual Studio Codeで使えたらいいな〜、と思っていたところ、[「Auto Import」](https://marketplace.visualstudio.com/items?itemName=steoates.autoimport)という拡張機能を見つけました。使ってみたところ、かなりいい感じでした。

＊注意事項： 「Auto Import」は、**TypescriptとTSX**で動作する拡張機能です。

# インストール方法
VS Codeを開いて、サイドメニューの一番下の拡張機能アイコンを押し、左上の検索バーに「Auto Import」と入力して探します。

![拡張機能：Auto Import](https://qiita-image-store.s3.amazonaws.com/0/172234/df389513-d381-f75a-e008-9aa0b2f2790f.png)


上記の画面にある「インストール」ボタンを押して、インストール完了後に「再読み込み」(ウィンドウの再読み込み)をします。

# 使ってみる
さっそく使ってみましょう。普段はAngular Essentialsも入れているのですが、今回はAuto Importの検証のため、Auto Import以外の拡張機能は無効にしています。

Angular CLIで`$ ng new try-auto-import`をして、プロジェクトの雛型が生成されたところからスタート。

事前に自作ディレクティブも作成しておきました。

```bash
$ ng g directive hoge
```

## 試す
`app.components.ts`などで試してみました。

![auto-import-demo.gif](https://qiita-image-store.s3.amazonaws.com/0/172234/96167f81-879b-788f-976e-cb64f93bab70.gif)

### 試してみて
HttpModuleなど一部のモジュールがインポートされないことはあったのですが、ビルトインでも自作でも、ほとんどのクラスは自動でインポートされました。すごい！！

＊ 使い始めの時は、自動でインポートされずに入力後にサジェストされることがあるかもしれませんが、何度かそのまま使ったら自動でインポートされるようになりました。

### 要望
新しいインポート文が既存のインポート文の上の行に追加されていくため、上の行に追加するか下の行に追加するかを設定できたらいいな〜、と思いました。

## おわりに
「Auto Import」のおかげでAngular開発がより快適になりました。publisherのsteoatesさん、素晴らしい拡張機能をありがとうございます。
機械学習論文読みメモ_98


[Deep Feature Interpolation for Image Content Changes](https://arxiv.org/abs/1611.05507), CVPR2017
Deep feature interpolation (DFI)と呼ばれるhigh resolutionな画像遷移手法を提案する．
この手法ではpretrainされたCNNの特徴空間上での線形補間を用いて遷移が行われる．
簡単な手法にもかかわらず，この手法は画像のセマンティクスに関する遷移を可能にする．
DFIは特別の構造のネットワークや学習を必要とせずこれを可能とする．
この手法をベースラインとして用いる事でどのような画像遷移のタスクが真の
challengingなタスクであるかを知る指標になる．

[Deep Variational Inference Without Pixel-Wise Reconstruction](https://arxiv.org/abs/1611.05209)
Variational autoencoder(VAE)は一般的なCVに関する生成モデルの一つである．
従来提案されてきたVAEの改善手法は主に事後分布の近似精度の向上や柔軟性の向上に関するものであった．
しかし，いまだ問題のあるpixel-wise reconstructionをより良いものへ置き換える研究はあまりなされていない．
本論ではreal-valued non-volume preserving transformations (real NVP)を用いる事で，潜在変数で条件つけられた
データの確率分布を正確に計算出来るようにした．
Real NVPはヤコビアンが簡単に計算出来るような逆変換が可能な非線形変換を用いる．
これにより，潜在変数空間からデータ空間への正確の逆変換が可能になり，正確なサンプリングを
実現する．
すなわち正確なVAE生成モデルの条件付き確率を用いた最適化を行えるため，従来の誤差に標準分布を仮定して用いるpixel-levelの再構成誤差に基づいた計算と比較して正確の誤差計算，最適化が行えるようになる．

[RefineNet: Multi-Path Refinement Networks for High-Resolution Semantic Segmentation](https://arxiv.org/abs/1611.06612)
Semantic segmentationモデルはCNNがベースとなって設計されてきたが，
そのためにsubsampling(down sampling)が頻繁に発生し特徴抽出の過程で画像の解像度が下がってしまう
問題があった．
本論ではrefinenetと呼ばれるマルチパスを持つネットワークを提案する．
このモデルは複数のdown sampling過程の間で得られる特徴を陽に用い，long rangeのresidual connectionと組み合わせる事で高解像度の予測を高性能に行えるようにした．
このモデルでは，低解像度だが抽象化された深い層の特徴に対して，高解像度だが低いレベルの特徴を持つ浅い層の特徴を用いる事で高解像度化(refine)を可能にしている．
プログラマーをダメにするという噂のgemで管理画面を作成してみた

今回は人をダメにするgem、ActiveAdminを使って素早く、そして、イケてる管理画面を作成していきたいと思います。

## ActiveAdminとは
ググってしまえば一発で出てくると思いますが、簡単に説明をしていきます。

管理画面系gemには大きく三つ挙げることができます。

* rails_admin
* active_admin
* typus

この三つの中でも、ActiveAdminは非常にバランスのとれたイケてるgemです(自分視点)  
イケてるCRUD管理画面を一瞬で作成してくれます。  
社内ツール向けで運用していくならこのgemがベストだと思います。  
ただ、普通のRailsの書式と違うDSL(ドメイン固有言語)で記述しないといけないので、その学習コストがかかります。  
その学習コストもそれほど高くないんですけどね！  

## 動作環境
* OSX EI Capitan 10.11.6
* Ruby 2.3.4
* Rails 5.1.1
* MySQL 5.7.17
* ActiveAdmin 1.0.0
* devise 4.3.0

## Railsへの導入準備
今回は`admin`というアプリケーションを用意し、そこにActiveAdminを導入します。  
初期ではSQLiteが入っていますが、MySQLに変更しているという前提条件のもと行っていきます。  
ActiveAdminのドキュメントを参考にして進めていきます(https://activeadmin.info/0-installation.html)

`Gemfile`へ以下を追加。

```admin/Gemfile
・
・
・
gem 'activeadmin', github: 'gregbell/active_admin'
gem 'devise'
・
・
・
```

`devise`というgemがログイン認証で必要になってくるので一緒に記載します。  
上に記載した`devise`と`activeadmin`をインストールします。

```
$ bundle install --path vendor/bundle
```

※今回は`vendor/bundle`配下にgemを配置しています。適宜変えるようにしてください。

## adminアプリへ導入

ドキュメント通り以下を実行して`activeadmin`を入れていきます。  
環境は`development`を指定します。  

```
$ bundle exec rails g active_admin:install

$ ./bin/rails db:migrate RAILS_ENV=development

$ ./bin/rails db:seed RAILS_ENV=development

$ bundle exec rails s -e development
```

`rails g active_admin:install`を行った際にAdminUserモデルが作成されます。  
既存のモデルを使用したい場合は`rails g active_admin:install --skip-users`で作成しないようにすることも可能です。  
その際は`config/initializers/active_admin.rb`で設定を変更する必要があるので、注意してください。  

## 画面の確認

`http://localhost:3000/admin`へアクセス。
初期のユーザー名とパスワードは`./bin/rake db:seed RAILS_ENV=development`をした際に用意されているので、以下を入力してログインしてください。

* Email: admin@example.com
* Password: password

画面が無事に出ていることが確認できます。 

## 管理データの追加
今回は対象のモデルが無い状態で始めているので、モデルを適当に作ってみます。

```
$ rails g model Book title:string content:text

$ ./bin/rails db:migrate RAILS_ENV=development
```

次に作ったモデルを管理対象にします。

```
$ rails g active_admin:resource Book
```

同じように画面を確認するとメニューへBooksが追加されます。  

ここで登録許可を行うコードを`app/admin/book.rb`へ追加します。  

```app/admin/book.rb
ActiveAdmin.register Book do
# See permitted parameters documentation:
# https://github.com/activeadmin/activeadmin/blob/master/docs/2-resource-customization.md#setting-up-strong-parameters
#
# permit_params :list, :of, :attributes, :on, :model
#
# or
#
# permit_params do
#   permitted = [:permitted, :attributes]
#   permitted << :other if params[:action] == 'create' && current_user.admin?
#   permitted
# end
  permit_params :title, :content
end
```
実際に登録ができるかどうか確認してみてください。


## まとめ
以外と簡単に追加することができますよね！  

次回は少し機能を追加して扱いやすいようにしてみたいと思います。 

ではでは。

続：プログラマーをダメにした管理画面を改良していく その１
https://qiita.com/motty93/items/743710210580f6c1080a
Hadoop(HDP/BigInsights)でIBM Spectrum Scale(旧GPFS)を利用する際にはRangerの利用有無に気をつける

<H2>IBM Spectrum Scaleとは</H2>
IBM Spectrum Scale(ISS/旧GPFS)は、簡単に言うとマルチノードでデータを共有することができる非常に高速に動作するファイルシステムである。(詳細：https://www.ibm.com/developerworks/community/wikis/home?lang=ja#!/wiki/W8214c473fef0_444f_886a_cd015ca34c89/page/Spectrum%20Scale(%E6%97%A7GPFS))
Hadoopでは各ノードのローカルディスクをHDFSとして利用し、仮想的にデータを全ノードが保持しているように見せかけるが、GPFSではすべてのノードがデータへの直接アクセスが可能である。HDFSのファイル操作にはhadoopコマンドを利用する必要があったり、データの多重度がデフォルト3となり巨大なディスク空間を必要にするため、利用には注意点が必要となる。そこで、HadoopのHDFSをGPFSに置き換えることにより、POSIX準拠のファイルシステムとして操作可能(Hadoopのファイルに対してLinuxファイル操作コマンドの実行可能)、ディスク領域の有効活用をすることができるようになる。

<H2>ISSをHadoopのファイルシステムとして利用する際にはRangerの有無に注意</H2>
ISSはHortonworksのHadoopディストリビューションであるHDPやIBMのディストリビューションであるBigInsightsでサポートされている。利用する際には一点だけ注意が必要である。それは導入するクラスターでRangerを利用しているかどうかである。

Option名：gpfs.ranger.enabled (デフォルト：true)

Rangerが動作していないHadoopクラスターでデフォルト値trueのまま利用すると、GPFS側でRangerへのアクセスができない状態であると認識するため、GPFS側でアクセス関連情報を保持することになり想定するパフォーマンスが出なくなる。Rangerを利用していない場合は、この値を必ず false にセットする必要がある。
エラトステネスの篩の高速化

世の中に多くあるエラトステネスの篩の実装、多くあるくせにちょっとしか高速化してないのが悲しいので高速化エラトステネスの篩を書いてみることにします。

- エラトステネスの篩の高速化 (1) ← **今ココ**
- [エラトステネスの篩の高速化 (2)](https://qiita.com/peria/items/54499b9ce9d5c1e93e5a)
- [エラトステネスの篩の高速化 (3)](https://qiita.com/peria/items/e0ab38f95d16a5f7cc58)
- [エラトステネスの篩の高速化 (4)](https://qiita.com/peria/items/7c62831ad9781c7c1577)
- [エラトステネスの篩の高速化 (5)](https://qiita.com/peria/items/ffc58b31470ad3297567)
- [エラトステネスの篩の高速化 (6)](https://qiita.com/peria/items/c1d8523342e81bb23375)
- [エラトステネスの篩の高速化 (7)](https://qiita.com/peria/items/e35ddf9af359388514d8)

# 問題設定
とりあえず C++11 くらいで動く物を作りたいと思います。インラインアセンブラや SIMD、並列化は明示的には入れない方針です。あと、エラトステネスの篩自体の高速化を目指すので、結果は一部の具体的な素数の確認と $\pi(x)$ の値で確認することにしますし、その時間は考慮しないことにします。
また、ライブラリ的に使えるよう、将来的には区間篩 (大きな $x$ に対して $[x, x+y)$ の区間での素数を求める) も計測することにします。

# アルゴリズム
タイトルにあるエラトステネスの篩のアルゴリズムをざっくり説明すると

1. 2 以上 $x$ 未満の整数に対して $True$ を用意する
2. $\sqrt{x}$ 以下の数 $p$ を小さい方から見ていく
  1. $p$ の対応が $True$ なら、$p^2$ 以上の $p$ の倍数の対応を $False$ とする
3. 2 で選ばれた $p$、並びに残った $True$ に対応する整数が素数である

という形になります。基礎的なアルゴリズム説明だと、$x$ まですべての整数で篩う説明だったり、篩い始める箇所を $2p$ にしたりしますが、今回はそういう定番高速化は最初から導入しています。プログラムをざっくり書くと

```cpp
void Sieve(int64 x) {
  std::vector<bool> flags(x, true);
  flags[0] = false;
  flags[1] = false;
  const int64 sqrt_x = std::ceil(std::sqrt(x) + 0.1);  // 少し誤差を考えてる
  for (int64 p = 2; p < sqrt_x; ++p) {
    if (!flags[p])
      continue;
    for (int64 mult = p * p; mult < x; mult += p)
      flags[mult] = false;
  }
}
```

という形になります。これをベースに今後高速化していきます。


# 偶数の省力化
この高速化はよく知られた方法で、素直に実装すればだいたい 2 倍速になり、素直に実装していれば使うメモリの量も半減します。そもそも最初の 2 で払い落としてる ($False$ に設定する) 数は対象とする数の半分あるので、それらを計算対象から外すわけなので考察もそうむずかしくありません。
新たな実装で `flags[i]` は整数 $2i+1$ に対応しています。なので　$p=2i+1$ に対して $p^2=4i^2+4i+1=2(2i(i+1))+1$ となるので、篩い落とす最初のインデックスは `2*i*(i+1)` となります。

```cpp
void Sieve(int64 x) {
  std::vector<bool> flags(x / 2, true);
  flags[0] = false;
  const uint64 sqrt_x = std::ceil(std::sqrt(x) + 0.1);
  const uint64 sqrt_xi = sqrt_x / 2;
  for (uint64 i = 1; i < sqrt_xi; ++i) {
    if (!flags[i])
      continue;
    const uint64 p = 2 * i + 1;
    for (uint64 mult = 2 * i * (i + 1); mult < flags_.size(); mult += p)
      flags_[mult] = false;
  }
}
```

応用として 3 や 5 の倍数を除く処理も知られていますが、その処理については[次回](https://qiita.com/peria/items/54499b9ce9d5c1e93e5a)。
ちなみに今回(を含む一連)のプログラムは [github](https://github.com/peria/primes/tree/master/eratosthenes) に纏めています。今回のは version 0 と 1 に該当します。

# 計算時間

目安として、計算時間を記録しておきます。単位は秒。

|$x$|$\pi(x)$|Version 0| Version 1|
|--:|-------:|--------:|---------:|
|$10^7$|664579|0.047|0.017|
|$10^8$|5761455|1.039|0.352|
|$10^9$|50847534| - | 6.180|
kramdown を使って Markdown を AST に変換する

[kramdown](https://github.com/gettalong/kramdown) を使用することで Markdown を AST に変換することが出来ます。


```rb
require "pp"
require "kramdown"

code =<<-MKD
# title

hello world

- list1
- list2
MKD

doc = Kramdown::Document.new(code, input: "GFM")
result = doc.to_hash_ast

pp result
```

出力結果

```console
{:type=>:root,
 :options=>
  {:encoding=>#<Encoding:UTF-8>,
   :location=>1,
   :options=>{},
   :abbrev_defs=>{},
   :abbrev_attr=>{}},
 :children=>
  [{:type=>:header,
    :attr=>{"id"=>"title"},
    :options=>{:level=>1, :raw_text=>"title", :location=>1},
    :children=>[{:type=>:text, :value=>"title", :options=>{:location=>1}}]},
   {:type=>:blank, :value=>"\n"},
   {:type=>:p,
    :options=>{:location=>3},
    :children=>
     [{:type=>:text, :value=>"hello world", :options=>{:location=>3}}]},
   {:type=>:blank, :value=>"\n"},
   {:type=>:ul,
    :options=>{:location=>5},
    :children=>
     [{:type=>:li,
       :options=>{:location=>5},
       :children=>
        [{:type=>:p,
          :options=>{:location=>5, :transparent=>true},
          :children=>
           [{:type=>:text, :value=>"list1", :options=>{:location=>5}}]}]},
      {:type=>:li,
       :options=>{:location=>6},
       :children=>
        [{:type=>:p,
          :options=>{:location=>6, :transparent=>true},
          :children=>
           [{:type=>:text, :value=>"list2", :options=>{:location=>6}}]}]}]}]}
```

kramdown のバージョンが 1.14.0 未満の場合は `#to_hash_ast` が使用できないので下記のコードを使用します。([kramdown issue#435](https://github.com/gettalong/kramdown/issues/435))

```diff
- result = doc.to_hash_ast
+ result, warnings = Kramdown::Converter::HashAST.convert(doc.root, doc.options)
```
Ruby の #class_eval と #module_eval の違い

[ブログ記事](http://secret-garden.hatenablog.com/entry/2017/10/07/112605)からの転載です

Ruby の `#class_eval` はクラスオブジェクト専用、`#module_eval` はモジュールオブジェクト専用のメソッドだと思っていたのですが、実は名前が違うだけで同等のメソッドだったみたい。


## 検証コード

```ruby
class C
end

C.class_eval {
	def homu
	end
}

# クラスオブジェクトに対しても #module_eval が使える
C.module_eval {
	def mami
	end
}

p C.instance_methods false
# => [:homu, :mami]


module M
end

# モジュールオブジェクトに対しても #class_eval が使える
M.class_eval {
	def homu
	end
}

M.module_eval {
	def mami
	end
}

p M.instance_methods false
# => [:homu, :mami]
```


## 結論

`#class_eval` と `#module_eval` の違いは名前だけなのでケースによってよしなに使い分けましょう。

## 参照

* [instance method Module#class_eval (Ruby 2.4.0)](https://docs.ruby-lang.org/ja/latest/method/Module/i/class_eval.html)
PythonでExcel作業を自動化: Excelファイルのクローズ問題

# はじめに

[退屈なExcel作業をPythonにやらせるためのモジュールの選び方](http://qiita.com/kubotama/items/6bc1b469a7e155f16654)に書いた通り、PythonでExcel作業を自動化するために[pywin32](https://pypi.python.org/pypi/pywin32)を利用した場合の問題の一つが、なんらかの理由でプログラムが異常終了してしまうとオープンしたExcelファイルをロックしてしまうことでした。異常終了ではなくても、うっかりファイルのクローズやExcelを終了しないままでプログラムを終了してしまうと、気がつくとタスクマネージャーにExcelのプロセスがずらっと並ぶことになってしまいます。

Pythonなので、with文で実行コンテクストを利用すれば簡単に解決すると思ったんですけど、簡単には解決できないことがわかりました。

# 問題点

問題は、pywin32では同じExcelのファイルをオープンしたときに同じオブジェクトが返ることです。同じオブジェクトが返るだけならいいんですけど、そのオブジェクトをどこかでクローズしたら、同じファイルをオープンしたときに返ってきたオブジェクトが、すべてクローズされてしまいます。

言葉での説明だとわかりにくいかもしれないので、簡単なサンプルプログラムを作成しました。同じファイルを2回オープンして、別の変数に保管します。その変数の比較と、それぞれのオブジェクトをクローズするプログラムです。

```py3
import os
import win32com.client

xlsx = win32com.client.Dispatch('Excel.Application')
book1_1 = xlsx.Workbooks.Open(os.path.abspath('サンプルデータ1.xlsx'))
book1_2 = xlsx.Workbooks.Open(os.path.abspath('サンプルデータ1.xlsx'))
book2 = xlsx.Workbooks.Open(os.path.abspath('サンプルデータ2.xlsx'))

if book1_1 == book1_2:
    print("同じファイルのオブジェクトは同じ")
else:
    print('同じファイルのオブジェクトは違う')

if book1_1 == book2:
    print("違うファイルのオブジェクトは同じ")
else:
    print('違うファイルのオブジェクトは違う')

book1_1.Close()
book2.Close()
book1_2.Close()

xlsx.Quit()
```

このプログラムを実行した結果が以下の通りです。

```
同じファイルのオブジェクトは同じ
違うファイルのオブジェクトは違う
Traceback (most recent call last):
  File "test1.py", line 21, in <module>
    book1_2.Close()
  File "<COMObject Open>", line 3, in Close
pywintypes.com_error: (-2147417848, '起動されたオブジェクトはクライアントから切断されました。', None, None)
```

book1_1とbook1_2は、同じExcelファイルを別々にオープンして返ってきたオブジェクトですが、比較すると同じですし、book1_1をクローズした後でbook1_2をクローズすると、ご覧の通りにエラーになることがわかりました。

念のため、別のファイルをオープンしてbook2に代入したオブジェクトは、book1_1をクローズした後にクローズしましたが、問題はありませんでした。

# まとめ

一つのプログラムで同じファイルを複数回オープンしても、クローズは1回でないとエラーになるという仕様だということがわかりました。ファイルごとに、オープンされた回数をカウントして、クローズするとオープンされた回数を減らすような管理をして、オープンされた回数が0になったらオブジェクトをクローズする仕組みが必要だということですね。
Vaporのルーティングについて(応用編)

動作環境
この記事では以下の環境で動作を確認しています。

* Xcode9.0
* macOS Sierra バージョン 10.12.6
* MacBook Pro (13-inch,2017,Four Thunderbolt 3 Ports)
* Homebrew 1.3.2
* ruby 2.1.8p440 (2015-12-16 revision 53160) [x86_64-darwin15.0]
* Vapor Toolbox: 2.0.4
* Vapor Framework: 2.2.2

# ルーティング-グループ編
前回の[Vaporのルーティングについて(基礎編)](https://qiita.com/SatoTakeshiX/items/33515c41ff600732b151)ではルーティングの基礎をみていきました。

この章ではVaporのルーティングをグループ化する方法と１つのクラスで設定するコレクションを見ていきたいと思います。
この方法を利用すれば、WebAPIを設計する際にバージョン指定が簡単にできるようになり、また可読性の高いアプリケーションが作成できます。

# Groupメソッド
`Droplet`の`group`メソッドを実行するとクロージャーに`RouteBuilder`が渡されます。
これにエンドポイントを設定することでルーティングをグループ化することができます。

`GET /v1/users`と`GET /v1/users/:id`(idはInt型)を設定してみます。

```swift
drop.group("v1") { v1 in
　　 //GET /v1/users
    v1.get("users") { req in
        return "users"
    }
    //GET /v1/users/:id
    v1.get("users", Int.parameter) { req in
        let userId = try req.parameters.next(Int.self)
        return "You requested User #\(userId)"
    }
}
```

ビルドしてローカルでサーバーを起動してみます。

```bash
$ vapor build
$ vapor run
```

http://0.0.0.0:8080/v1/users/
にアクセスすると`users`という文字列が返却されます。

http://0.0.0.0:8080/v1/users/1
にアクセスすると`You requested User #1`という文字列が返却されます。

# Groupedメソッド
Groupedメソッドは`RouteBuilder`を返却します。
先程の例を`v2`以下に設定し直してみます。
`GET /v2/users`と`GET /v2/users/:id`(idはInt型)のエンドポイントを作成します。

```swift
let v2 = grouped("v2")
v2.get("users"){ req in
    return "users"
}
v2.get("users", Int.parameter) { req in
    let userId = try req.parameters.next(Int.self)
    return "You requested User #\(userId)"
}
```

先程と同じようにビルドしてローカルでサーバーを起動してみます。

```bash
$ vapor build
$ vapor run
```

http://0.0.0.0:8080/v2/users/
にアクセスすると`users`という文字列が返却されます。

http://0.0.0.0:8080/v2/users/1
にアクセスすると`You requested User #1`という文字列が返却されます。

これを利用することで、Web APIのバージョン指定が簡単に実現できるでしょう。

# ルーティング-コレクション編
ルーティングの基礎編とグループ編でルーティング指定について説明しました。
ここではルーティング指定を一つのクラスにまとめる方法をみていきます。

`RouteCollection`プロトコルを適応するクラスを作成すると、ルーティング指定を一つのクラスにまとめることができます。

`GET /v3/users`というエンドポイントと`GET /v3/articles`というエンドポイントを`RouteCollection`に適応したクラス`V3Collection`で作成してみます。

```swift
 import Vapor
 import HTTP
 import Routing
 class V3Collection: RouteCollection {
     func build(_ builder: RouteBuilder) {
         let v3 = builder.grouped(“v3”)
         let users = v3.grouped(“users”)
         let articles = v3.grouped(“articles”)
         users.get { request in
             return “Requested all users.”
			}
         articles.get(Article.init) { request, article in
             return “Requested \(article.name)”
			} 
		}
}
```

ルート設定をクラスにすることでどんな場所でも記述することができるようになり可読性が高まるでしょう。
`Droplet`クラスの`collection`プロパティにこのクラスのインスタンスを渡すことでルーティングを追加できます。 

```swift
let v3 = V3Collection()
drop.collection(v3)
```

`Droplet`がルートコレクションの`build(_:)`に渡されてルーティングが追加されます。

# 初期化で何もしない場合
ルートコレクションの初期化で何もしない場合は`EmptyInitializable`も適応することができます。
そうするとルートを追加する際に型を指定するだけで追加できるようになります。

```swift
 class V3Collection: RouteCollection,EmptyInitializable {
     init() { }
...
```

こうすると、`Droplet`にルートを追加するとき、インスタンス化しなくてもよくなります。

```swift
drop.collection(V3Collection.self)
```



# 参考
Route Groups
https://docs.vapor.codes/2.0/routing/group/

Route Collections
https://docs.vapor.codes/2.0/routing/collection/
DevFest Tokyo 2017参加メモ

# GDG DevFest Tokyo 2017
https://tokyo.gdgjapan.org/
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151973/39fd3cad-1201-54ff-5bc6-91f9eab49e61.png)

開催日時：2017/10/09（月）09:30（開場）〜17:00
イベントの説明（connpassより）：[DevFest](https://developers.google.com/events/devfest)は、Google Developer Group(GDG)コミュニティによって世界各地で開かれるデベロッパー向けイベントです。東京では、[去年](https://gdg-tokyo.connpass.com/event/38927/)に引き続き２回目の開催となります。今年は去年よりさらに多くのコミュニティが集まりました。プロダクトを越えた「ボーダレス」なイベントを目指しています！

とのことです。
2017のconnpassのイベントは[こちら](https://gdg-tokyo.connpass.com/event/66236/)

## というイベントに行ってきましたというお話です。
DevFest Tokyo2017に参戦してきたので、どういったセッションを受けてきたかとかを簡単に書こうと思います。

また、これを書くにあたり、
http://ja.algonote.com/entry/devfest17
を参考にさせていただきました。ありがとうございますm(_ _)m

見ていったセッションごとに簡単に書いていきます。
## Android1.5~8.0 Walkthrough
タイトルの通り、Androidの歴史です。システム的にどういった機能が追加されたとかそういうものを説明してくれていました。

スピーカーの@Yuki_312 さんは昔とある会社であったことがあったので、興味本位でセッションを受けました。
昔のAndroidで苦しんだこととか、そういったものも紹介してて面白かったです。
@Yuki_312 さんのblogにスライドがアップされてました。
http://yuki312.blogspot.jp/2017/10/devfest2017.html
@Yuki_312 さんのblogにはいつもお世話になってます。ありがとうございます。


## Kotlin導入どうですか？
続いてはこちらを見に行きました。
目的は森さんのトークと、あとはKotlin導入ってどんなもんなのかを聞きたかったからです。
スライドは以下です。
https://www.slideshare.net/HiroshiKikuchi/kotlin-61811289

Kotlin導入したいなぁという気持ちが沸き立ちましたね。
続きは今度もうちょっと書きます。

## FirebaseとReact Nativeでのモバイルアプリの作り方
Firebaseやりたいなという気持ちから見てみたんですが、jsメインのお話でした。。

でも、Firebase周りをコード含めて説明してくれていたので、Androidでもうまく活かせるのかな？とちょびっと思いました。
https://speakerdeck.com/k2wanko/how-to-make-mobile-app-with-firebase-and-react-native

## 40分アプリ作成チャレンジ
これはあんざいゆきさん（@yanzm さん)が、４０分でアプリを作るっていうもんでした。
特に資料はなし。

早かった。さすがだなーと思いました。

個人的に、あのAbstractのOverrideメソッドをポチポチって選択して挿入してたやつ。
探してもなかったからプラグインでも入れてたのかな。気になります。

見たセッションはこれくらいです。
今後の参考のために他のセッションもリンク貼れたら貼ります（今度）

まとまりないですが、会社に行かないといけないので一旦今日はこれくらいで。