OmniAICreator/Qiita-1.07M huggingface dataset:
出力ファイル以外を用いずにsourcemapを使う

# はじめに
　埋もれるよりは晒す方がまだ何かのためになると思ったのでそうしました。

# sourcemapとは?
　uglifyやlessなど元々のソースを加工して出力するツールがありますが、出力されたファイルを読んでも元のファイルの何行目だとか何列目だとか分かりません。sourcemapを使うことによって元々のファイルのどこに相当するのか分かるようにできます。元のファイルの最終行にまとめて出力したり、x.mapのように別途出力したりタイプは様々です。

# 趣旨
　sourcemapの対応の仕方はツールによって様々でinline sourcemapに対応していなかったり、変換前のソースがないとsourcemapに何も表示されなかったりします(※1)。下の図みたいな感じですね。真っ白です。

<img width="428" alt="nonExsitOriginal.png" src="https://qiita-image-store.s3.amazonaws.com/0/99025/75ed110b-db6f-7e85-dbfe-347232d02cf4.png">

　少し残念なので[source-map](https://github.com/mozilla/source-map)を用いてsourcemapをアレコレいじり、イカしたsourcemapを作ってやろうぜというのが今回の趣旨です。具体的には以下の条件を満たしたいと思います。

- 変換前のソースを不要にする
- x.mapのようなmapファイルを不要にする


# [source-map](https://github.com/mozilla/source-map)って?
　mozillaが作成しているsourcemapを作成したり編集したりするためのmoduleです。TypeScriptとか一部の方々を除けば大体使っている印象です。デファクトスタンダードと言って問題ないのではないでしょうか。今回のケースでは「SourceMapConsumer、SourceMapGenerator」の2つを理解すれば大丈夫と思われます。

## SourceMapConsumer
　JSONからsourcemapオブジェクトを作成する際やsourcemapオブジェクトの情報の取得などに用いる。とりあえず以下みたいな形でsourcemapオブジェクトを生成できると覚えておけば良いと思います。

```javascript
var sourceMap = require('source-map');

var rawSourceMapJsonData = fs.readFileSync('xx.map', 'utf8');         // 適当にsourcemapの文字列を取得する
var consumer = new sourceMap.SourceMapConsumer(rawSourceMapJsonData);
```

## SourceMapGenerator
　実際にsourcemapを編集したり、sourcemapオブジェクトをJSONに戻したい場合に使用します。上で作ったSourceMapConsumerオブジェクトから以下みたいな形で生成できます。

```javascript
var generator = sourceMap.SourceMapGenerator.fromSourceMap(consumer);
```

　以下みたいな形でJSONに戻せます。

```javascript
var rawSourceMapJsonData = generator.toString();
```

# 変換前のソースを不要にする
　sourcemapオブジェクトにsourcesContentの情報を追加してやる必要があります。

1. SourceMapGeneratorオブジェクトを取得する
1. SourceMapGeneratorオブジェクトに元のファイルの情報を設定する
1. JSONに戻す
1. ファイルに出力する

```javascript
// 2の処理の具体例(エラーハンドリングとかなし)
consumer.sources.forEach(function(sourcePath) {
  var sourceContent = fs.readFileSync(sourcePath, 'utf8');
  generator.setSourceContent(sourcePath, sourceContent, 'utf8');
});
``` 

# x.mapのようなmapファイルを不要にする
　sourcemapオブジェクトをJSONに戻してBase64エンコーディング => 出力後のファイルの最終行に指定のフォーマットで貼り付けみたいなことが必要になります。

1. 「変換前のソースを不要にする」の3までやる
1. Base64にエンコードする
1. 指定のフォーマットのコメントにする
1. 変換後のファイルの最終行に出力する(下のコード見てください)

```javascript
// 1から３まで
var base64 = require('base-64');
var utf8 = require('utf8');

var rawSourceMapJsonData = generator.toString();
var base64edSourceMapData = base64.encode(utf8.encode(rawSourceMapJsonData));

/* 以下のコメントを出力ファイルの最終行に貼り付ける
   今回はcssだけどjsだと「//# 」とか使う。半角スペースがないと正常に動かないので注意     */
var sourcemapComment = "/*# sourceMappingURL=data:application/json;base64," + rawSourceMapJsonData + " */";
``` 

```javascript
// 出力ファイルだと思ってほしい。以下みたいな感じになる。ソースマップは適当なので動かない

var finalSourceLine = 'にゃーん'; // 出力ファイルの最終行
/*# sourceMappingURL=data:application/json;base64,b3dhYml0bw== */
```


## 備考
※1 今時のツールは大体対応しています。じゃあ何故こんな記事を書いたかって? タグを見てください。

## 参考資料
- sourcemapの構造については[これ](https://speakerdeck.com/rchaser53/sourcemapgui-ge-gai-yao)
便利だよ、pythonファイル内のインポートしたモジュールをソートできる

Visual Code version 1.19がリリースされました、たくさん新機能が追加されました。中にお気に入りのはpythonエクステンションに追加された、インポートしたモジュールをソートしてくれる機能です。
例えばこのようなコードがあります（適当）

```python
from datetime import datetime
from sys import path

from easy_install import easy_install

import copy
import inspect
from importlib import import_module

from django.db import router
from django.db.models.query import QuerySet

from mymodule.myclass1 import good_method
from mymodule.myclass99 import good_method_true
...
```

# 現状問題：
- 汚くてごちゃ混ぜになっています
- 綺麗にしたとしても、別のメンバーがモジュールを増減する時前の並びのルールがわからないので並び順を変えられてしまう
- スケジュールが圧迫してそもそもモジュールの並び順なんて、気にしてられません（こういう場合もあります）

# 並び順問題：
- sysなどビルドインモジュールが先
- djangoなどフレームワークのモジュールが次
- 自作モジュールが最後
- でも綺麗に分類できなかったらどうしよう、、

# 解決策
pythonエクステンション(0.9.1)をインストールした状態で、
<font color="DeepPink">コマンドパレットで```Python Refactor: Sort Import```を打てばVSCodeがソートしてくれます</font>
コマンドパレットの入り方：
- メニューバー ⇨ 表示 ⇨ コマンドパレット
- Macでは、Cmd + Shift + Pを同時に押せば入れます

# 効果

```python 
import copy
import inspect
from datetime import datetime
from importlib import import_module
from sys import path

from django.db import router
from django.db.models.query import QuerySet

from easy_install import easy_install
from mymodule.myclass1 import good_method
from mymodule.myclass99 import good_method_true
...
```
並びが綺麗になりました
Project Euler Q53 【組み合わせ選択】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
$12345$から$3$つ選ぶ選び方は$10$通りである.
$123, 124, 125, 134, 135, 145, 234, 235, 245, 345.$

組み合わせでは, 以下の記法を用いてこのことを表す: $_5C_3 = 10.$

一般に, $r ≤ n$ について $_nC_r = \frac{n!}{r!(n-r)!}$ である. ここで, $n! = n×(n−1)×...×3×2×1,$ $0! = 1$ と階乗を定義する.

$n = 23$ になるまで, これらの値が$100$万を超えることはない: $\_{23}C_{10} = 1144066.$

$1 ≤ n ≤ 100$ について, $100$万を超える $_nC_r$ は何通りあるか?

## 解答

```bash
time seq 23 100 |
awk '{for(i=1;i<=$1;i++){print $1,i,$1-i}}' |
awk -M '{s=1;t=1;u=1;for(i=1;i<=$1;i++){s*=i};for(i=1;i<=$2;i++){t*=i};for(i=1;i<=$3;i++){u*=i};print s/t/u}' |
awk '1000000<$1' |
wc -l
4075

real    0m1.310s
user    0m1.277s
sys     0m0.184s
```

階乗を計算するいい方法ないですかねえ。

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/053.html
Reluxで導入したValueObjectの設計思想

## 導入した経緯
システムには大なり小なりビジネスロジックが詰め込まれています。
同じ用語であっても時と場合によって指し示す対象が変わってきます。
その変化を吸収するためにシステムは常に改修が必要になりますが、そんな先のことまでは予知できないので、改修に改修を重ねているとシステムは複雑さが増して、同じコードが量産されていたり、どんどん設計が歪んでいきます。
Reluxもそんな状態に陥っており、設計のあるコードに軌道修正していこうとしています。

## なぜValueObjectを使うのか

### 1. 返される値が保証される

チェックイン日データを利用した処理を書く上で、チェックイン日が`"2017-12-21"`のような文字列なのかDateTime型なのかTimestamp（は、さすがにないか）なのか、ありえるデータ型を考慮するのは地味に手間がかかりがち。

必ずDateTime型と保証されていればロジックはシンプルに実装できます。

```
$checkin = $schedule->checkin(); // ← DateTimeImmutableで返ってくる
$today = new DateTimeImmutable('today');
if ($today < $checkin) {
    // do something.
}
```

チェックイン日の値を保証するValueObjectは下記のような実装です。
チェックイン日とチェックアウト日からオブジェクトを生成し、宿泊日程に関する値に責務を持ちます。

```
class Schedule
{
    /**
     * @var DateTimeImmutable;
     */
    private $checkin;

    /**
     * @var DateTimeImmutable;
     */
    private $checkout;

    public function __construct(DateTimeImmutable $checkin, DateTimeImmutable $checkout)
    {
        $this->checkin = $checkin;
        $this->checkout = $checkout;
    }

    /**
     * @return DateTimeImmutable
     */
    public function checkin()
    {
        return $this->checkin;
    }
```

（めっちゃDateTimeImmutableを主張していますね）


### 2. 値に対して行うことができる操作を保証する

クラスに値の加工メソッドが閉じ込められることで、そのクラスを見るだけで宿泊日程に関するロジックにどんなものがあるか分かります。
影響範囲が広がらず、安全に変更を加えることができます。
また責務が明確になるのでコードの重複を防ぐことができます。

```
/**
 * @return int
 */
public function numberOfNights()
{
    return (int)$this->checkout->diff($this->checkin)->format('%d');
}
```

例えば宿泊日数を返すメソッドですが、日数の計算も色んな方法があります。
この日数を利用する箇所に計算ロジックが分散し、ばらばらの方法で実装されてしまうことで、変更箇所が膨らんだり一部で誤差が発生するリスクがあります。
これをすべての箇所で利用するだけにしておくことでメンテナンス性を向上させることができます。

## ReluxのValueObject規約

ValueObjectというのも設計上の概念でしかないので、明文化してチーム内で共通認識を持つことが重要です。
そのためにReluxの開発チームにおけるValueObjectの概念をこう定めています。

### 不変であること
- コンストラクタでのみ値を受け取る
- Setterは持たない。Getterしか持たない
- 扱う値が異なる時は別のインスタンスを生成する
- １つのインスタンスで同じメソッドを呼び出すと、常に同じ値が返ってくる

### DBモデルクラスを呼び出さない
- DBへのクエリを実行しない。クエリ実行タイミングによって値は可変である。使う場合はクエリで取り出した値でインスタンス化する

### 単一責任の原則（Single Responsibility Principle）を守る
- ValueObjectには処理フローを書かない。リクエストされた値を返すことだけに集中する

ちょっと油断するとクラスが肥大化するので気をつけたい。
go-cve-dictionaryとgoval-dictonaryを出力なしで実行する

# はじめに

`go-cve-dictionary` と `goval-dictionary` には、標準出力を出さずに実行する `quiet` という機能があります。

# 使い方

## go-cve-dictionary

- 実行

```
go-cve-dictionary fetchjvn -quiet -last2y
```

## goval-dictionary

- 実行

```
goval-dictionary fetch-debian -quiet 7 8 9 10
```

## 何が嬉しいの？

cron回す時とかlambdaで回す時とか、うれしいですよね。

以上です。
go-cve-dictionaryとgoval-dictonaryの引数を環境変数で設定する

# はじめに

`go-cve-dictionary` と `goval-dictonary` には、引数を環境変数で指定できるという隠し機能があります。

# 使い方

## go-cve-dictionary

- 環境変数設定

```
$ export GO_CVE_DICTIONARY_ARGS='fetchjvn -last2y'
```

- 実行

```
$ go-cve-dictionary
```

## goval-dictionary

- 環境変数設定

```
$ export GOVAL_DICTIONARY_ARGS='fetch-debian 7 8 9 10'
```

- 実行

```
$ goval-dictionary
```

# 何がうれしいの？

lambdaで実行する時に環境変数で指定できるのはいいですよね。
コードを変更することなく、取得するデータのレンジを変更できるので。

以上でした。
Rubyで使える超高速なMemory Cache 「LruRedux」について


この記事は[PORT Advent Calendar](https://qiita.com/advent-calendar/2017/port)7日目の穴埋めです。

Ruby on Railsの高速化戦略として最もポピュラーなのは、Fragment CacheやローレベルCacheの活用だと思います。私の所属しているチームが運用している[キャリアパーク!](https://careerpark.jp)でも、多くのページでこれらのキャッシュが使用されています。

# キャッシュストアへのアクセス遅延

Railsでキャッシュを活用する場合、多くはバックエンドのデータストアとしてRedisもしくはMemcacheが用いられます。
これらのデータストアはAmazon ElasticCacheなどのクラウドサービスを用いてネットワーク上に設置するのが一般的です。ローカル環境で開発しているとついつい忘れがちなのですが、ネットワーク上に存在するキャッシュストアにアクセスする際には、ネットワークを介することによる遅延が発生してしまいます(多くの場合において無視できるレベルですが・・・)。

ですが、例えば一つのwebページを表示する際にFragment Cacheを5箇所に分けて使用しているなど、リモートのキャッシュストアに複数回のアクセスを行っていたりすると、この遅延も無視できないものになってきます。

# LruReduxで超高速なMemoryCacheを

上記のようなネットワーク遅延が気になる場合、MemoryStoreをキャッシュストアとして利用すれば解決できるかもしれません。Rails標準の`ActiveSupport::Cache`でもMemoryStoreはサポートされていますが、今回はより高速なLruReduxを紹介します。

https://github.com/SamSaffron/lru_redux

## LruReduxて何？
自分もあまり詳しくはありませんが、Lru(Least Recently Used)というキャッシュアルゴリズムをRubyで使用するためのライブラリだと認識しています。

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

## ベンチマーク

試しに、`ActiveSupport::Cache::MemoryStore`と`LruRedux`のパフォーマンスを比較するためにベンチマークを撮ってみました。

[このページ](http://api.rubyonrails.org/classes/ActiveSupport/Cache/MemoryStore.html)のbody要素をそれぞれのキャッシュストアに1000回別のkeyで保存し、取り出すという操作を行ってみました。

```rb
require 'net/http'

uri = 'http://api.rubyonrails.org/classes/ActiveSupport/Cache/MemoryStore.html'
body = Net::HTTP.get_response(URI.parse(uri)).body

memory_cache = ActiveSupport::Cache::MemoryStore.new

lru_redux = LruRedux::TTL::ThreadSafeCache.new(1000, 24.hours)


Benchmark.bm 12 do |r|
  r.report 'memory' do
    1000.times do |n|
      memory_cache.write("key-#{n}", body)
    end
    1000.times do |n|
      tmp = memory_cache.fetch("key-#{n}")
    end
  end
  r.report 'lru_redux' do
    1000.times do |n|
      lru_redux["key-#{n}"] = body
    end
    1000.times do |n|
      tmp = lru_redux["key-#{n}"]
    end
  end
end
```



結果は以下のようになりました。ついでにRedisの結果も含めてあります。

||total|real|
|---|---|---|
|MemoryStore|0.430|0.438|
|LruRedux|0.020|0.020|
|Redis|0.620|0.632|

通常のMemoryStoreと比較して、LruReduxだと約20倍以上のパフォーマンスが出ていそうです。

## Railsでの具体的な実装

色々と方法が考えられると思いますが、自分は`config/initializers`にグローバルなインスタンスとして定義しました。

```rb:config/initializers/memory_cache.rb
MemoryStore = LruRedux::TTL::ThreadSafeCache.new(100, 24.hours)
```

説明するまでもないですが`LruRedux::TTL::ThreadSafeCache`は、時間指定ありでなおかつスレッドセーフという意味です。`LruRedux`にも様々なクラスが存在しますが、基本はこれを使えば間違いないと思われます。第一引数の`100`は最大保持数(keyの)で、`24.hour`はデフォルトの保持時間です。

さらに、通常のFragmentCacheと同様の感覚で使えるように、ビューヘルパーを定義しました。

```rb:app/helpers/application_helper.rb
def memory_cache(key, &block)
  MemoryStore[key] ||= capture(&block)
end

# ---- 使用例 ----
# = memory_cache 'key' do
#   = render 'partical_name'
```

# まとめ

ここまでで説明したようにLruReduxは非常に高速ですが、通常ここまでのパフォーマンスは必要とされません。また、ホストマシンのメモリを消費するので、あまり多用するわけにはいきませんし、複数台で稼働している場合は扱いが難しくなりがです。本番で使う場合は注意が必要です。

最後になりますが、PORT株式会社では[自社サービスを支えてくれる優秀なRubyエンジニアを募集しています](https://www.wantedly.com/companies/port/projects)(Rubyエンジニア以外も)。
もくもく会も行なっていますので、ぜひ一緒にもくもくしましょう！
[PORTもくもく会](https://freestyle-mokumoku.connpass.com/)
Project Euler Q52 【置換倍数】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
$125874$を$2$倍すると$251748$となる. これは元の数$125874$と順番は違うが同じ数を含む.

$2x, 3x, 4x, 5x, 6x$ が $x$ と同じ数を含むような最小の正整数 $x$ を求めよ.

## アプローチ
最小の正整数が$6$桁である場合、$1$倍から$6$倍まで並び替えで表せる為、使用されている数字は$6$個以下である。

## 解答

```bash
time seq 100000 999999 |
awk '$1%111111!=0' |
awk '{print $1,$1*2,$1*3,$1*4,$1*5,$1*6}' |
awk '{print $0,(length-5)/6}' |
awk '$7==length($1)' |
awk -v FS= '{delete s;for(i=1;i<=NF-length(index($0," ")-1);i++){s[$i]=1};print $0,length(s)-1}' |
awk '$7>=$8{print $1}'
142857

real    0m4.539s
user    0m6.636s
sys     0m0.117s
```

`awk`以外のコマンドも使いたいんだけど、問題の性質上`awk`が多くなるのは仕方ないのかなあ。

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/052.html
Vue.jsを使ってみて

この記事は[Relux Advent Calendar](https://qiita.com/advent-calendar/2017/relux)20日目の記事です。

## 背景
弊社ではLaravelを使ったプロジェクトがあり、Laravelの公式がVue.jsでサポートされていることもあり、今後新しくフロントの実装をするときにVue.jsを利用してみるのも良いなと思い。
## 基本構文
とりあえず、[チュートリアル](https://jp.vuejs.org/v2/guide/)を確認を見ながら、[JSFiddle](https://jsfiddle.net/)で確かめて見ます。


### レンダリング
![3C8A4F1B-5C56-4B81-B626-F9D35A2146C1.png](https://qiita-image-store.s3.amazonaws.com/0/37884/e2ba81f7-a7b9-3765-6890-ee74986cffdd.png)

`new Vue()` でインスタンスを生成します。
elで対象のDOMを指定しています。
またdataで定義した値を HTML内の `{{ }}` にレンダリングします。



### 条件分岐&ループ
![4E138EAD-FD80-483E-92EF-168088A94A18.png](https://qiita-image-store.s3.amazonaws.com/0/37884/ee861ee9-899f-4d15-6c51-6f746b809ce3.png)

条件分岐には `v-if` ループには `v-for` をのディレクティブを利用します。
Vue.jsは接頭辞に `v-` のついた属性を付与した要素にリアクティブな振舞いを与えます。
他にも、 双方向バインディングを行える `v-model`, イベントリスナをセットできる `v-on`などがあります。

色々なディレクティブがあるので、ドキュメントを見てみるとできる事が見つかりそうです
[ディレクティブ一覧](https://jp.vuejs.org/v2/api/#%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96)

### APIを叩いて結果を表示する。
基本的な文法はチュートリアルで学べるので、もう少し実践的にAPIを叩き、その結果を表示する簡単なアプリを作ります、叩くAPIは[Dog-API](https://dog.ceo/dog-api/)で、僕の好きなブルドックの画像の一覧を表示します。

`HTML`
![22ADD59E-AEA0-4F9F-A349-50846A81860E.png](https://qiita-image-store.s3.amazonaws.com/0/37884/d4fd68a9-a6b9-83bb-d959-d2e9c23a671b.png)

まずは、HTML側を作ります。
基本的には取得したデータ画像データの一覧を`v-for`で回して表示します。
Ajax通信は jQueryを利用してもよいのですが、一応Vueでは `axios`が推奨されているのでそちらを利用します。

また、レイアウトは、今回[Foundation](https://foundation.zurb.com/sites/getting-started.html)を利用しています。

`Javascript:app.js`

![9A59ADA9-AB75-4573-8313-185496D7E64E.png](https://qiita-image-store.s3.amazonaws.com/0/37884/44c08a24-12a5-0a2d-3455-3e54c294aedf.png)

javascript側では、今まで通りVueインスタンスを生成してプロパティをセットしていきますが、新しく `mounted`, `methods` が追加されています。

`mouted`はインスタンスが生成されたタイミングで呼び出される処理を記述します。今回は同じインスタンス内に定義された、`getDogImages`を実行しています。
`methods`はインスタンス内でイベントなどから呼び出す各種処理を追加していきます。今回はAPIへリクエストを送り、その値を`data`内の`result`セットしています。


### 実行結果
![9E2CD790-CBBC-4289-9F24-837266D7249A.png](https://qiita-image-store.s3.amazonaws.com/0/37884/3779198a-7e0d-c11f-02d1-9fa5d8c9f66b.png)

ブルドックが表示されました。

## まとめ
簡単にチュートリアルとAPIにアクセスして一覧を表示するアプリを作って見ましたが、公式ドキュメントの日本語版があったり、情報が少ないと感じる事がなく、DOM操作とロジックをうまく分離して作る事ができるので、アプリケーション全体の質をあげる事ができる実感が湧きました。
docker環境構築 〜オフライン環境で使用するにはどうすれば良いかを考える〜

## はじめに
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3136353031392f35316433333536342d646637392d613835322d333238642d3861333238613131613433382e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/165019/8dfbaca5-ac2e-9f6a-8197-53b5b998a978.png)

このところ人気のdocker。そろそろ使ってみようと思い環境構築してみました。
dockerとは？という話は他に沢山記事があると思うので割愛して、ここではNWに接続されていないオフライン環境への構築方法にフォーカスしていきたいと思います。

また後述しますが、オフライン環境へdockerイメージ持っていくために、オンライン環境にもdockerの構築が必要です。あらかじめ導入しておいてください。

※オンライン環境への導入は下記の記事が参考になりました。
[CentOS7にDockerをインストールする](https://qiita.com/inakadegaebal/items/be9fecce813cebec5986)

## 前提環境
・CentOS 7 64bit
<font color="red">・Linuxカーネル3.10以上であること</font> ※カーネルバージョンが古いと動作しなかったので注意

## 必要資材
オンライン環境で下記資材を調達し、オフライン環境へコピーしてください。
【docker本体】
https://download.docker.com/linux/static/stable/x86_64/
・docker-17.09.1-ce.tgz (執筆時点の最新バージョン)

【docker-compose】
https://docs.docker.com/compose/install/
・docker-compose
下記コマンドでcurlして取得してください。

```bash
sudo curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o [適当なworkディレクトリ]
```

## docker構築手順
いよいよdocker本体とdocker-composeの導入です。と言っても必要資材を展開するだけですが、、

```bash:docker本体の導入
tar zxvf docker-17.09.1-ce.tgz # docker本体の解凍
cp docker/* /usr/bin # bin配下にdocker資材を展開
dockerd & # プロセスを起動する
ps -ef | grep [d]ocker # dockerプロセスが起動していることを確認する
```

```bash:docker-composeの導入
cp docker-compose /usr/local/bin/ # bin配下にdocker-composeをコピー
sudo chmod +x /usr/local/bin/docker-compose # 実行権限を付与
docker-compose -v # バージョンが表示されること
```

問題なく導入できたでしょうか。
次にオフライン環境にdockerイメージファイルを持っていく手順を説明していきます。

## dockerイメージファイルのコピー
オフライン環境にイメージを持っていく流れは下記の通りになります。

--オンライン環境--
1. dockerイメージをdocker hubからpull
2. イメージをtarファイルとしてsave

--オフライン環境--
3. オフライン環境にtarファイルをコピー
4. イメージファイルをload

順に追っていきます。

```bash:オンライン環境での作業
# hello-worldのdockerイメージを例に取り上げる

docker pull hello-world:latest # イメージをpull
docker images # イメージがpullできたか確認
docker save hello-world > helloworld_img # イメージをsave
tar zcvf helloworld_img.tar.gz helloworld_img # tar.gzに圧縮
# helloworld_img.tar.gzをオフライン環境にコピーする
```

```bash:オフライン環境での作業
tar zxvf helloworld_img.tar.gz # tar.gzの解凍
docker load < helloworld_img # dockerイメージをload
docker images # hello-worldイメージが存在することを確認
```

これでオフライン環境にイメージファイルを持ってくることに成功しました。
インターネットが使用できない山奥でもdockerライフを満喫できますね！

## docker UIの導入
dockerはCUIでも比較的容易に操作できますが、わかりにくいのでGUIで操作したい！という方はdocker UIを導入するのが良いかと思います。
導入手順は別記事にまとめてあるので参考にしてください。

[【docker UIの導入】](https://qiita.com/kod314/items/f96541373398dfffea37)
ImageMagickで画像の角度を変更する

ImageMagick、しばらく使ってなかったら結構変わっててちょいちょい悩んだので備忘録を残します。インストール方法は公式ページに書いてあるので、そちらを参考にしてください。

# 変更点

かつてはいろいろなコマンドがありましたが、現在はmagickコマンドに置き換えられました。convertやmoglify等もすべてmacick -hogeで呼び出します。
引数が変わっている部分で少々つまずいて無駄に時間を費やしました。

# 画像の回転

hoge.jpgを90度時計回りに回転させ、fuga.jpgを作ります。

```sh
magick hoge.jpg -rotate 90 fuga.jpg
```

かつて（mogrify使ってたとき）はhoge.jpgを直接回転させることができてました。

```sh
mogrify -rotate 180 hoge.jpg
```

magickコマンドを使い、上と同じようにコマンドを叩くと以下のエラーが発生します。

```sh
magick: no images found for operation `-rotate' at CLI arg 1 @ error/operation.c/CLIOption/5266.
```

# 補足

ImageMagickで画像を回転させた場合、Exifの回転角パラメータ（Orientation）は変更されません。

スマホ撮影写真を扱っていると、なぜかiPhoneで撮影された180度反転した写真というものに出会うことがあります。これをWindows標準のフォトビューアで回転させると以下のような状況に陥ります。

元々のOrientationが1（そのまま）だとして

- 時計回りに90度回転
Orientationは自動的に修正がかかる（1→6)

- 180度回転
Orientationは自動的に修正がかかる（1→3）

このお陰で、180度回転している画像をWindows標準フォトビューアから修正しても意味がないという。
[Unity] Button にOnDown/OnReleaseイベントを追加する

Buttonクラスを拡張して、onClick(ボタン上で押し、離した)時だけでなく、
Down(ボタン上で押した時)、Release(ボタン上で押し、ボタン外で離した時)のイベントも取得できるようにしてみます。

```C＃:ButtonEx.cs
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.UI;
using System.Collections;
#if UNITY_EDITOR
using UnityEditor;
using UnityEditor.UI;
#endif

namespace TmLib
{
    public class ButtonEx : Button
    {
        public UnityEvent buttonExDownEvent;
        public UnityEvent buttonExUpEvent;
        public UnityEvent buttonExReleaseEvent;
        bool isInButton;

        public override void OnPointerDown(PointerEventData eventData)
        {
            base.OnPointerDown(eventData);
            isInButton = true;
            buttonExDownEvent.Invoke();
        }
        public override void OnPointerExit(PointerEventData eventData)
        {
            base.OnPointerExit(eventData);
            isInButton = false;
        }
        public override void OnPointerUp(PointerEventData eventData)
        {
            base.OnPointerUp(eventData);
            if (!isInButton) //ボタン外でリリースされたとき
                buttonExReleaseEvent.Invoke();
            else
                buttonExUpEvent.Invoke();
        }
    }

#if UNITY_EDITOR
    [CanEditMultipleObjects, CustomEditor(typeof(ButtonEx), true)]
    public class ButtonExEditor : ButtonEditor
    {
        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();
            this.serializedObject.Update();
            EditorGUILayout.PropertyField(this.serializedObject.FindProperty("buttonExDownEvent"), true);
            EditorGUILayout.PropertyField(this.serializedObject.FindProperty("buttonExUpEvent"), true);
            EditorGUILayout.PropertyField(this.serializedObject.FindProperty("buttonExReleaseEvent"), true);
            this.serializedObject.ApplyModifiedProperties();
        }
    }
#endif
}
```
Inspector に追加したプロパティ（イベント）が表示されるようになりました。イベントハンドラに対応するスクリプトを作成してイベントを追加します

![スクリーンショット 2017-12-20 13.24.56.png](https://qiita-image-store.s3.amazonaws.com/0/59911/d22fe853-d222-80d6-d197-410c107e1952.png)

```C＃:ButtonExCheck.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ButtonExCheck : MonoBehaviour {
	[SerializeField] Text text=null;

	public void OnButtonExDown(){
		text.text = "Push";
	}
	public void OnButtonExRelease(){
		text.text = "Release";
	}
	public void OnButtonExExecute(){
		text.text = "Execute";
	}
}
```

![名称未設定２.gif](https://qiita-image-store.s3.amazonaws.com/0/59911/cbdc88ea-12a0-65d9-d33c-31d495075daf.gif)
MySQLの「Error Code:1175」ってなんぞ？

（参考文献）
http://rikutoto.blogspot.jp/2013/11/mysqlerror-code-1175.html

上記のサイトを見てみた。
要は「実行しようとしたupdate文にWHERE句がないから、あなたが使ってる「SAFE UPDATE MODE」では実行できません！」
ということ。
設定変更できるみたいだけど、今回はWHERE句を入れよう。

（追記）
さらに詳しいサイトを見つけた。
https://www.mk-mode.com/octopress/2012/02/04/04002048/

これによると「WHERE句で主キーを指定しないと誤ったUPDATE, DELETE
となる危険性があり、それを防ぐために標準設定では主キー指定が必須になっている」らしい。
Oracleだけで数値をカンマ区切りにする

# Oracleだけで数値をカンマ区切りしたい

と思うのは私だけかもしれませんが・・・。
特定の環境下において、ロジックでカンマ区切りを行うと、パフォーマンスを損ねてしまう場合に有効だと思います。
DBから何千件もSELECTするのに、カンマ区切りにするのに件数分ループしなくてはならなくて、更に画面出力するにも件数分ループ<font color="red">しなければならない</font>、という。

実装設計の問題だのという話はとっくに超越した次元の時。

### OracleのTO_CHAR
[TO_CHAR - オラクル・Oracle SQL 関数リファレンス](https://www.shift-the-oracle.com/sql/functions/to_char.html)
ここにあるように、TO_CHARでOracleでカンマ区切りをしようとすると、指定した書式の桁数を超過すると、『#########』のように結果が返ってきてしまう。
つまり、予め表示する最大桁数が分からないとダメ。

最大桁数が分からないため、フォーマットに『9G999G999G999G999G999G999G』のように、推測で、結果が超過しない書式を指定することになる。
その都度、最大桁数を意識しなければならないというのは正直めんどくさい。

### クエリで頑張る
整数部の桁数を勝手に判断したフォーマットする。
'D00'の部分は表現したい小数桁数に合わせる。

```sql:SQL
SELECT
    TRIM(TO_CHAR(1000000000000, LPAD('999', 3 + (CEIL((LENGTH(1000000000000) - 3) / 3) * 4), '999G')))
  , TRIM(TO_CHAR(1000000000000.25, LPAD('999', 3 + (CEIL((LENGTH(TRUNC(1000000000000.25)) - 3) / 3) * 4), '999G') || 'D00'))
FROM
    DUAL
```
結果はこうなる。

```sql
1,000,000,000,000     1,000,000,000,000.25
```

やってることは、指定された数値の桁数に応じて書式を生成しているだけ。

### パッケージで頑張る
SQL文でごちゃごちゃしてるのも何なので、パッケージとかファンクションとかにしちゃう。
2022/05/27 追記
値が1未満の場合、[.99]という結果になってしまうので、[0.99]となるように修正しました。
(SQLだけで頑張るのはかなりとんでもないことになりそう・・・)

```sql:PKG_NUMBER
CREATE OR REPLACE PACKAGE BODY PKG_NUMBER
IS
  /**
   * カンマ区切りにした数値文字列を取得します。
   * @param A_VALUE       数値
   * @param A_DECIMAL_NUM 小数桁数
   * @return カンマ区切りにした数値文字列
   */
  FUNCTION TO_FORMAT(A_VALUE NUMBER, A_DECIMAL_NUM NUMBER := 0)
  RETURN VARCHAR2
  IS
      L_DECIMAL_FORMAT VARCHAR2(100);
  
  BEGIN
    L_DECIMAL_FORMAT := '';
    IF A_DECIMAL_NUM > 0 THEN
      L_DECIMAL_FORMAT := 'D' || LPAD('0', A_DECIMAL_NUM, '0');
    END IF;
    
    IF A_VALUE >= 1 THEN
      RETURN TRIM(TO_CHAR(A_VALUE, LPAD('999', 3 + (CEIL((LENGTH(TRUNC(A_VALUE)) - 3) / 3) * 4), '999G') || L_DECIMAL_FORMAT));
    ELSE
      RETURN TRIM(TO_CHAR(A_VALUE, '0' || L_DECIMAL_FORMAT));
    END IF;
  END;
  
END;
/
```

```sql:SQL
-- 数値のカンマ編集化
SELECT
    PKG_NUMBER.TO_FORMAT(1000000000000)
  , PKG_NUMBER.TO_FORMAT(1000000000000.25, 2)
FROM
    DUAL
```

### 注意
- マイナス符号が入っていると、その分1組余計な書式を付与する可能性があるけど悪影響はないと思います。
- OracleのNUMBER精度(11gでは38だった)を超えた数値の指定をすると正しい結果が得られません。
[Swift3][Mac]四角形の描写はNSTextFieldが強い

#NSTextFieldの便利さ
四角形を描きたい！と思った時NSTextFieldを使えば**3**行で終わる！

```swift:example.swift
@IBOutlet var Label:NSTextField!//これをLabelと関連づけておく
//描写するタイミング
Label.stringValue = ""//文字なし
Label.backgroundColor = NSColor.red//好きな色
Label.drawsBackground = true//これを書かないと色が描写されない
```
これで終わり！しかも文字も入れれてすごい！

以上
アップデートされた micro:bit スマホアプリを使ってみたよ編

これは [micro:bit Advent Calendar 2017](https://qiita.com/advent-calendar/2017/microbit) の 23 日目の記事です。

さて、実際に使ってみたよ

##結論から話そう

Flash 改善されてる！

##どんな風に改善されたの？

たとえば、やっぱりダメだったとき
![IMG_8893.PNG](https://qiita-image-store.s3.amazonaws.com/0/164551/b2801a9a-8eee-2ebe-0cd1-5f485fd3a81c.png)

「Show how」のところをタップすると、再度ペアリングをここから行なう案内が表示される
![IMG_8894.PNG](https://qiita-image-store.s3.amazonaws.com/0/164551/f6fc92ac-f0f6-55c2-adde-ba82861d6276.png)

で、この通りに行なってペアリングすると..

![IMG_8896.PNG](https://qiita-image-store.s3.amazonaws.com/0/164551/9e4e15d1-e26b-ed2a-f103-1b870b1dbcde.png)

おおおおおおおお
![IMG_8900.PNG](https://qiita-image-store.s3.amazonaws.com/0/164551/467f016a-dbd4-d488-43ba-e970bf1c6b90.png)

やっほい！
![IMG_8901.PNG](https://qiita-image-store.s3.amazonaws.com/0/164551/01eee00e-15b3-3c50-16ea-6157751af179.png)


という具合に Flash が行なわれて、プログラムが Bluetooth 経由で書き込まれたのでした！

わーい！これで空き時間にスマホでごにょごにょできるぞ！

新しい機能の Monitor & Control は、まだ手探りなので、もう少し使い方が分かったら、また書こうと思います！
micro:bit スマホアプリがアップデートされたよ編

これは [micro:bit Advent Calendar 2017](https://qiita.com/advent-calendar/2017/microbit) の 22 日目の記事です。

なんと、12月19日にスマホの micro:bitアプリにアップデート通知！

This version now allows the pairing with multiple micro:bits and the storage and management of HEX file s within the app.
'Monitor & Control' is a new facility for using Bluetooth services, allowing the monitoring of sensors and the direct transmission of messages to LEDs and control commands to the output pins.

おお、この間苦労したことが解消されるのでは？

##新しい画面になってる！
![IMG_8886.PNG](https://qiita-image-store.s3.amazonaws.com/0/164551/74dcbf53-c011-a5d8-00e9-74c52a14d902.png)


##Choose micro:bit の画面も新しいぞ！
![IMG_8887.PNG](https://qiita-image-store.s3.amazonaws.com/0/164551/f9d1640c-b3f2-02f4-a29d-4f19400ca4f9.png)

最後にペアリングした micro:bit の認証に使った画像が表示されている。
ゴミ箱アイコンも付いた。

##Flash の画面も新しいぞ！
![IMG_8888.PNG](https://qiita-image-store.s3.amazonaws.com/0/164551/f48ee120-0097-51d5-32b0-9bc09f9c31d6.png)

期待ワクワク

##Monitor and Control って機能が増えた！
![IMG_8889.PNG](https://qiita-image-store.s3.amazonaws.com/0/164551/2ee1a9cb-a36f-7a39-05d8-4c6d0a88b45c.png)


実際に解消されたかは、次回にてw
iPhoneXのLaunchImageのファイル名

ipaファイルをアーカイブユーティリティで開き、「パッケージの内容を表示」を選択すると、
ビルド後のファイル名がわかります。

iPhoneXのLaunchImageは、
`LaunchImage-1100-Portrait-2436h@3x.png`
でした。

````objc:Objective-C
[UIImage imageNamed:@"LaunchImage-1100-Portrait-2436h"];
````
で、コード中から画像を取得できます。
いまさら RuntimePermission を簡単に実装するやつ作ってみた

# RuntimePermission を簡単に実装するやつ作ってみた

~~いまはつかえないです チョットマッテ~~
**使えるようになりました**



[SupportRuntimePermission(Github)](https://github.com/SorrowBlue/Android-Library/tree/master/com/sorrowblue/library/supportruntimepermission)

## 概要
Android M (6.0) から追加されたRuntimePermissionをいい感じに実装できるライブラリをつくった。
AndroidM以上でしか有効にならないように条件分岐はさせてます。

### なんでか
* いちいちアプリごとに実装するのがめんどくさいと思った。
* MainActivityでかくなっちゃう。

*これらをいい感じにしてくれる*

## インストール

### app:build.gradle
```gradle
dependencies {
    implementation 'com.sorrowblue.library:supportruntimepermission:1.0.0'
}

repositories {
    maven { url 'https://raw.githubusercontent.com/SorrowBlue/Android-Library/master/' }
}
```

appのbuild.gradleに上記を追記。

## 使い方

### import文
```kotlin
import com.sorrowblue.supportruntimepermission.OnPermissionsResultListener
import com.sorrowblue.supportruntimepermission.requestAll
```


### さんぷるこーど
```kotlin
requestAll(this, 100, object : OnPermissionsResultListener {
    override fun onGranted(requestCode: Int, grantedPermissions: List<String>) {
        // 許可されたとき
        for(permission in grantedPermissions) {
            Toast.makeText(applicationContext, "GRANTED : " + permission, Toast.LENGTH_SHORT).show()
        }
    }
    override fun onDenied(requestCode: Int, deniedPermissions: List<String>, shouldShowPermissions: List<String>) {
        // 拒否されたとき
        for(permission in deniedPermissions) {
            Toast.makeText(applicationContext, "DENIED : " + permission, Toast.LENGTH_SHORT).show()
        }
    }
})
```

## VS
Kotlinです。
CircleCI + AVAでtimed outしてしまう

`CiecleCI`で`AVA`のunitテストを自動実行させているのですが、テストファイル数が増大した時にCircleCIから`Too long with no output (exceeded 10m0s)`と怒られたので、その対応について書き残します。

# 前提条件
- 環境
    - `CircleCI`
        - 無償版（コンテナは1個）
        - version: 2.0
    - `AVA`
        - version: 0.20.0
    - `Docker`
        - image: `node:8.9.1`
- 実行するunitテストファイルの合計は約1000個
- `--serial`はつけていない
- ファイル内で`test.serial`, `async/await`など使っているものもあるが基本的には並列実行
- ローカルのMacでは正常にテストは終了

`config.yml`の一部を抜粋します。

```yaml:config.yml（一部抜粋）
version: 2
jobs:
  unit:
    environment:
      ENV_TYPE: local
      ENV_FILE_PASSWORD: local
    docker:
      - image: node:8.9.1
    working_directory: ~/hoge
    steps:
      - checkout
      - setup_remote_docker
      - run:
          name: Create repository
          command: |
            mkdir -p ./reports
          when: always
      - run:
          name: Install node modules
          command: npm i
      - run:
          name: Run test
          command: npm run coverage
      - store_test_results:
          path: ./reports
      - store_artifacts:
          path: ./reports
```

上記の、`npm run coverage`の実態は以下です。

```json:package.json（一部抜粋）
{
  "scripts": {
    "coverage": "nyc --reporter=lcov --reporter=html --report-dir=./reports ava test/unit --tap | tap-xunit > ./reports/ava.xml"
  }
}
```

# 現象

上記の`npm run coverage`で実際にunitテストを実行し、カバレッジを作成・出力していますが、ここで數十分待っても何も出力されず、`Too long with no output (exceeded 10m0s)`と出力され、`FAILED`となってました。


# `AVA`のunitテストがこける原因
公式ドキュメントの[CLIの項目](https://github.com/avajs/ava#cli)をみたら、以下のような記載がありました。

```md:readme
--concurrency, -c   Max number of test files running at the same time (Default: CPU cores)
```

つまり、同時に実行できるテストファイルの最大値は`Default: CPU cores`なんだと。上記のように、今回はこのオプションをつけずにAVAを実行していました。

しかし、1ファイルで少々時間のかかるテストファイルがいくつか存在したため、それらを並列に実行して行ったところ、__`Test exited due to SIGKILL`__となってました（`SSH`で入って手動で実行して初めてわかりました）。プロセスごと殺されているため、AVAに処理が帰って来ず、ずっと何も出力がないため、CircleCIさんが止めた形ですかね。ちなみに、ローカルのMacでは正常にテストは終了したので、ちょっとハマりました。

# 対策
お察しの通り、`-c`オプションをつければ問題なく終了しました。ではその値は？ということですが、もちろん`Default: CPU cores`とreadmeに記載があるので、

```
root@801df972f396:~# grep cpu.cores /proc/cpuinfo | sort -u
cpu cores	: 8
```

上記のようにCPUコア数を確認し（私の場合はコア数が8でした）、AVA のコマンド実行時に`-c 8`を追加したら通りました。もし他にもこんな方法があるよ！という知見をお持ちの方、ご教示いただけると助かります。

以上です。

## ▼余談
先ほどの、公式ドキュメントのCLIの項目と、実際にnpmから`ava@0.24.0`（現時点での最新）をインストールして`ava --help`を実行した時に差分がありますw

```md:--help
--concurrency, -c       Maximum number of test files running at the same time (EXPERIMENTAL)
```
え、`EXPERIMENTAL`ですか…w
macOS High Sierraでtelnetを使えるようにする

macOS High Sierraにはtelnetクライアントがありません。

なのでmacOS High Sierraにtelnetをインストールして使えるようにする手順です。
社内のネットワーク機器など、初期状態がtelnet可 / SSH不可なことが多いのでそれなりに使うことがあります。

ベストなのはセキュリティの観点からtelnet不可 / SSH可にすることですね。

## Install Homebrew
```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

## Install telnet
```
brew install telnet
```
Wait until install finished.

## Using telnet
```
telnet xxxx.xxxx.xxxx.xxxx
```

以上、簡単なメモ。
Spring Securityのフォーム認証エラーでユーザーを保持

Spring Securityのフォーム認証で認証できなかった場合、ユーザーとパスワードのフィールド両方がクリアされます。セキュリティ的にはその方がよいのかもしれませんが、やっぱり不便なのでユーザーは残すような方法を考えてみました。

ログイン失敗時にユーザーを何らかの形で保持しておけばよいので、今回は手っ取り早くクエリパラメータにusername=ユーザーで保持する様にします。ユーザーを保持できればよいので、リクエストスコープやセッションスコープを使っても実現できると思います。

formLoginの設定でfailureHandlerを設定し、URLを組み立ててリダイレクトするようにします。

```java
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http.authorizeRequests()
				.antMatchers("/css/**", "images/**").permitAll()
				.antMatchers("/**").authenticated()
				.and()
			.formLogin()
				.loginPage("/loginForm")
				.defaultSuccessUrl("/", true)
				.loginProcessingUrl("/login")
				.usernameParameter("username")
				.passwordParameter("password")
				.failureHandler((req, res, exp) -> {
					res.sendRedirect("/loginForm?error=true&username=" + req.getParameter("username"));
				})
				.permitAll()
				.and()
			.logout()
				.logoutSuccessUrl("/loginForm");
	}
}
```

ビューにThymeleafを使う場合は

```html
<input type="text" placeholder="ユーザー" name="username"
  th:value="${param.username != null } ? ${param.username[0]} : ''"/>
```
こんな感じでクエリパラメータを設定すれば、ログイン失敗時にユーザーが保持されます。
Quantopian Tutorial2 Lesson1,2 Pipelineの概要とインスタンス定義

@drillerさんが書いていたQuantopianのチュートリアル記事を参考にしてQuantopianを始めようとしたが、チュートリアル2以降が（多分需要なくて）ないので、自分の見返しようも兼ねて大雑把にまとめて訳してみるとする。
元記事はhttps://www.quantopian.com/tutorials/pipeline
###なぜパイプライン？
アセットアロケーションを効率的に行うためのAPIがパイプライン。研究と構築がIDEと同じ環境で機能する。
###計算
パイプラインで表現できる計算は３タイプある。
Factors:数値による関数。資産に価値を割り当てるために使われる。例えば１０日間の平均取引量など。
Filters:ブール値による関数。投資対象をアセットに含めるか外すかを決めるのに使う。
Classifiers:カテゴリのアウトプットで、文字列やintを生成する。Factorsによる結果を受けてアセットをグループ化するのに使う。たとえばどのアセットが取引されているかの分類など。
###Dataset
パイプライン計算は価格、ボリュームデータ、基本データ、パートナーデータを使用して実行する。このチュートリアルでは１０日間の平均価格と３０日間の平均価格の間に大きな変化がある流動性のある証券を選択するパイプラインを構築する。
###パイプラインの作成
`pipeline`クラスをインポートし、関数を定義する。今のところは空のパイプラインを返す。`make_pipeline()`を実行してインスタンス化する。

```python3
from quantopian.pipeline import Pipeline
def make_pipeline():
    return Pipeline()
my_pipe = make_pipeline（）
```

###パイプラインの実行
`my_pipe`を実行してみる。その前に特定期間にパイプラインを実行する`run_pipeline`をインポートする。

```python3
from quantopian.research import run_pipeline
```

`run_pipeline()`を実行してみる。第２引数がシミュレーション開始日、第３が終了日。

```python3
result = run_pipeline(my_pipe, '2015-05-05', '2015-05-05')
```

`run_pipeline`を呼び出すとdataと有価証券でインデックスされた`pandas Dataframe`が返される。空のパイプラインがどのように見えるかは以下の通り。

```python3
result.head（） 
```

![pipeline1_l2_screenshot1-e4766eda23f48cab5518f4d2eed3766cb820d913c568ee8bb134ca9399681d95.png](https://qiita-image-store.s3.amazonaws.com/0/200508/76972808-aab6-1c0f-2471-ba619470ee16.png)


###所感
pipelineの実行はアルゴリズムからではなくNotebookから行う。
ここまで見る限り、pipelineは割と証券のスクリーニングにめちゃめちゃ便利そう。自分の考えたロジックをpipelineを使ってスクリーニングし、アルゴリズムでバックテストするのが容易にできそうなので、エビデンスに基づく投資が実践できそうである。（そうでなくてもテクニカル分析を用いてスクリーニングしてバックテストするのも面白そう）
D3.jsで中国地図を描く

D3.jsは便利で地図を描くことができる。今回は中国地図をD3.jsで描いて、それを描く時使うGeoJsonフォーマットの注意点を話します。

# １．地図データの獲得
地図を描くにはJSONファイルが必要、JSONを地理的データとして使う時、GeoJSONと呼んでいる。今回はこのようなファイルで地図を描く。
というより、どこで中国地図のGeoJSONファイルもらうかについて、やや難しいが、
もともとは、[https://github.com/clemsos/d3-china-map](https://github.com/clemsos/d3-china-map)でGeoJSONファイルを作るべき、
ちょっと時間かかる必要があるため、今回作成済みのファイルを使わせてもらいます。

中国地図のGeoJSONファイル：[china.geojson](http://www.ourd3js.com/demo/rm/R-10.0/china.geojson)

このファイルはNatural Earth上のデータによって作成したものです。余計なものを排除して、省の名前やIDしか残ってません。

日本地図ならここにあります：[日本地図](https://github.com/niiyz/JapanCityGeoJson)

# ２．地図を描く
### 投影法
地図は地球という球体の一部を平面図したものですから、なんらかの投影法（プロジェクション）が必要となります。下記のように、d3.geo.mercator()を使います。
参考は　https://github.com/mbostock/d3/wiki/Geo-Projections

```
    var projection = d3.geo.mercator
    .center([107, 31])
    .scale(850)
    .translate([width/2, height/2]);
```

center() 設定した地図の中心位置，[107,31] は経度、緯度
scale() 大きさの設定
### 線を引く
GeoJSONから経路を生成するため、d3.geo.path()を使う必要がある

```
var path = d3.geo.path()
    .projection(projection);
```

projection() は上で指定したプロジェクションの設定を反映したものとなります。

###　サーバーにリクエストして地図を描く
```
d3.json("china.json", function(error, root) {

    if (error) 
        return console.error(error);
    console.log(root.features);

    svg.selectAll("path")
        .data( root.features )
        .enter()
        .append("path")
        .attr("stroke","#000")
        .attr("stroke-width",1)
        .attr("fill", function(d,i){
            return color(i);
        })
        .attr("d", path )   //経路を生成
        .on("mouseover",function(d,i){
                    d3.select(this)
                       .attr("fill","yellow");
                })
                .on("mouseout",function(d,i){
                    d3.select(this)
                       .attr("fill",color(i));
                });
});
```
ここのattr("d", path )は下記と同じ意味

```
.attr("d",funtion(d){
    return path(d);
})
```
結果は以下です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168540/b0e62a83-3997-877f-4f42-7019d62728c5.png)
交通シミュレーターで車間の通信を再現

# はじめに（車間通信とは？）
　車間通信とは文字通り車どうしの通信のことなのですが，交通事故や道路状況をより早く伝えたり動画などのコンテンツをより効率的送信したりする用途で使用されます．この車間通信が可能になると，

    1. 渋滞情報をより早く知れる（今は無線が飛んでいるスポットに車が通るまでわからなかった）
    2. 動画などの大容量コンテンツを効率的に共有できる（今は電波のロスが大きく，動画などの品質は低い）
    3. 事故が発生した時に事故車両の情報を共有し，いち早く次の行動を決断することができる（今は目視などに頼る面が大きかった）


などなど様々な面でメリットを受けられるのですが
###一方で解決すべき課題も多くあり

    1. 無線のルーティングをどうするか（携帯などの低速で動く無線端末と異なり，高速に動く車ではルーティングが難しい）
    2. 品質をどう担保するか（高速で動く車は，ドップラ効果などで無線周波数が移動したりなど品質の確保が難しい）
    3. 送信されてきた情報が本当か嘘かをどう見抜くか（嘘の情報が混在すると道路状況が乱れる）

などなど解決すべき課題も多く，情報分野でのホットトピックでもあります．

# 使用される言語やシミュレータは？
 上記の問題を解決するためには
  
    1. 車の移動を再現し
    2. それぞれの車が通信しあう

という状況を作る必要がありそのためによく使われるシミュレータが

    1. SUMO
    2. ns3, omnet++

となっています．
ns3やomnet++は無線のシミュレータなので使用者を選ぶという感じなのですが，SUMOは車の移動を再現するシミュレーターであり，使っていて楽しいのでSUMOをメインに紹介していこうと思います．

#SUMOの基本的な使い方

sumoは車の移動を再現するシミュレータであり，簡単な直線上の移動からマンハッタンの道路を読み込み車を移動させたりと車の移動を再現するといった場合の幅の広さが特徴です．しかし基本的な流れはどれも共通であり，

    1. 道の元となる「点」を作成（nodファイルの作成）
    2. 「点」を繋ぐ「エッジ」を作成（egeファイルの作成）
    3. nodファイルとedeファイルを合成し，「道」を作る（netファイルの作成）
    4. 「道」を走る「車の移動」を定義（rouファイルの作成）
    5. netファイルとrouファイルを結合し，車が作成した道の上を走るシミュレーションファイルを作成（sumocfgファイルの作成）
    6. 実行


という流れになっています．

#ダウンロードからサンプルファイルの実行まで
　まずはダウンロードからです，以下ページからダウンロードをしましょう．この方法がOSを選ばないのでいいと思います．pythonの環境もなければこの段階でインストールしておくといいと思います．
http://sumo.dlr.de/wiki/Downloads

次にダウンロードしたファイルを解凍し解凍先のファイルに入り，さらにtutorial/quickstart/dataまで移動するとチュートリアル用のファイルがあります．以下のファイルが存在すると思います．

![スクリーンショット 2017-12-20 13.23.31.png](https://qiita-image-store.s3.amazonaws.com/0/217539/59a9a171-d1c7-0835-26d6-974428ebb565.png)

ここで
`sumo-gui quickstart.sumocfg`

を実行すれば車が動き出すはずです
MackerelでゆるいDocker監視

# はじめに

こんにちは．@blue271828 です．

昨日12月19日は @FukMo10 さんの [エンジニアが学生向け技術インターンを二年連続で企画から運営までやったのでまとめる](http://tech.fjct.fujitsu.com/entry/2017/12/19/110000) でした．今日12月20日は，Mackerelを使ったDockerの監視について小ネタを紹介したいと思います．



# Dockerとは

Dockerを知らない方に簡単に説明すると，DockerとはDocker, Inc.が提供している軽量な仮想環境みたいなもので，この仮想環境をコンテナと呼びます．厳密にはVM（仮想マシン）とは違うんですが，実行環境をそのまま Dockerイメージとして保存できるので，アプリを手軽に手元で動作確認したり，デプロイしたり，何かと便利に利用できます．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/141778/bbf95c95-b84a-e666-5b98-4e7ca3d6064e.png)



# Mackerelとは

Mackerelとは，株式会社はてなが提供しているウェブベースのサーバ管理サービスです．監視したいサーバーにMackerelエージェントをインストールすることで，サーバーの状況を可視化したり，監視をしたりできます．ウェブベースのサービスなので構築いらずで，とても簡単に運用が開始できます．ちなみにMackerelの名前の由来はサーバー→鯖→Mackerelらしいです．

![mackerel.png](https://qiita-image-store.s3.amazonaws.com/0/141778/b744d541-6d1e-cc35-1d40-c2dad7a0b32e.png)



# Dockerの監視

そんな便利なDockerとMackerelですが，なんと公式に [Mackerel エージェント込みのDockerイメージ](https://hub.docker.com/r/mackerel/mackerel-agent/) が公開されており，ホスト側へのインストールいらずで使い始めることができます．Docker コンテナのメトリクスを取得することができる公式の [mackerel-plugin-docker](https://github.com/mackerelio/mackerel-agent-plugins/tree/master/mackerel-plugin-docker) も含まれており，設定ファイルに必要な記入を行えば簡単にメトリクス取得が開始されます．

ただ，こちらDockerコンテナ内のプロセス監視の機能が提供されていません．公式イメージには [mackerel-check-plugins](https://github.com/mackerelio/go-check-plugins) も含まれておりプロセス監視自体は行えるのですが，Dockerの仕様上Mackerelコンテナから別コンテナ内のプロセスを直接参照することは基本的にはできません．ちょっと困った状況ですが，少し工夫をすればコンテナ内のプロセス監視もできるようになります．ここでは，その方法を紹介したいと思います．

## 方法1：コンテナ内のプロセスをDockerコマンドで監視する

実は公式イメージでは，Dockerコンテナのメトリクスを取得する際に Docker APIを利用しており，コンテナ内のプロセスも同様の手続きで [mackerel-check-plugins](https://github.com/mackerelio/go-check-plugins) を使って確認することができます．

![solution2.png](https://qiita-image-store.s3.amazonaws.com/0/141778/e59fade7-ebfc-6f48-443a-66c5cfdd9590.png)

例えば `hoge_cntr` コンテナの `hoge_app` プロセスを確認する場合，以下のような設定を行うと `docker exec` コマンドを使って確認することが可能です．

```
[plugin.checks.hoge_app]
command = 'docker exec hoge_cntr ps | grep hoge_app || exit 2'
```



## 方法2：HealthCheckオプションを使って監視する

もう一つの方法ですが，DockerのHealthCheckオプションを使う方法があります．Docker APIを経由して取得するのは同様ですが，HealthCheckではコンテナ単位で `healthy` かどうか確認できるため，コンテナ内に複数プロセスを走らせている場合にまとめて確認することが可能です．注意点としては，そのコンテナが `healthy` かどうかの仕様はコンテナに依存するため，コンテナにHealthCheckオプションの設定を適用する必要があります．

![solution3.png](https://qiita-image-store.s3.amazonaws.com/0/141778/84e34ff6-f1cc-f441-f7e3-037507b85584.png)

以下が設定例になります．`hoge_app` の記述が必要ないため，コンテナ単位での管理ができるようになります．

```
[plugin.checks.hoge_cntr]
command = 'docker inspect --format "{{json .State.Health.Status}}" hoge_cntr | grep healthy || exit 2'
```



# おわりに

過去に自分が同様の状況になったとき，少し困った経験があったため紹介してみました．ちょっとした工夫って見つからないときは，なかなか見つからなかったりしますよね．

さて明日12月21日は @tily さんの「[HR-Tech] 社員のプロフィールと会社の歴史を共有するためのマイクロサービス Profistory」です．お楽しみに．
電子工作 > 555 Timerとbuzzer > タイミングチャート

[カギ閉め忘れ問題 > 対処案 v0.1](https://qiita.com/7of9/items/a2bb833caa91ab798188)
にて検討しているシステム。

555 Timerを使ったシステムでタイミングについて検討中。

[onlineTool > タイミングチャート生成](https://qiita.com/7of9/items/4febc353f37ee2cd262b)

```
clock  _~_~_~_~_~_~_~_~_~_~_~_~_~_~_
magnet __~~_________________________
555    ____~~~~~~~~~________________
buzzer _____________~~~~~~~~~~~~____
```

![timing-chart.png](https://qiita-image-store.s3.amazonaws.com/0/32870/e0a5387e-1472-9abc-8fdb-aa1d3fe74dc0.png)

magnetは [MM-DE21P](https://qiita.com/7of9/items/7b5ffd3e9bd9608459ef)、もしくはReed switch (封入型は購入済)。

buzzerのONとOFFをどうするか。
2つ目の555 Timerで可能かどうか(設置面積はマイコンと比べてどうか)。
トランジスタなどが必要になるかどうか。


### 関連
(追加 2017/12/24)

- [RPi > 圧電ブザーで音を鳴らす > LF-PB30W25C / LF-MB12B06](https://qiita.com/7of9/items/844bbedb2dbf20e042b9)
VS2010でよく使うショートカットキー一覧(Windows)

|キー|説明|
|:---|:---|
|F5|デバッグ開始|
|Shift + F5|デバッグ終了|
|F9|ブレークポイントの設定/解除|
|F10|ステップオーバー(メソッドに入らない)|
|F11|ステップイン(メソッドに入る)|
|Ctrl + K, K|現在行にブックマークを追加/削除|
|Ctrl + B, T|現在行にブックマークを追加/削除|
|Ctrl + K, Ctrl + F|コードの整形(選択範囲)|
|Ctrl + K, Ctrl + D|コードの整形(ファイル全体)|
|Ctrl + K, Ctrl + C|コメントアウト|
|Ctrl + K, Ctrl + U|コメントイン|
|Ctrl + M, M|展開/折り畳みの切替(選択範囲)|
|Ctrl + M, L|展開/折り畳みの切替(ファイル全体)|
|Ctrl + -|前に戻る|
|Ctrl + Shift + -|次に進む|
|F12|定義へ移動|
|Shift + F12|定義の呼び出し元を表示|
|Ctrl + G|指定行へジャンプ|
|Ctrl + F4|タブを閉じる|
|Ctrl + F6|右のタブへ移動|
|Ctrl + Shift + F6|左のタブへ移動|

※ブックマークはコードでなく行番号に紐付く
GR-CITRUS 用 mruby 新開発環境を試してみた

この記事は、[Fujitsu Advent Calender](https://qiita.com/advent-calendar/2017/fujitsu)の 19 日目の記事です。

# はじめに

@GORO_Neko です。毎度の挨拶ではありますが、ご存知の方ご無沙汰してます。初めての方お初にお目にかかります。

いつも通り、まずお断りをば一言。

自分、仕事では「未だ」一切 mruby 扱っておりません（まぁ、某フォーラムの研究活動等では利用しておりますが・・・）。

以下は、自分が所属する会社の意向を反映したものでもスタンスを示すものでもなく、単なる一個人の趣味の活動から産まれた記述です。

# 再質問 GR-CITRUS ってご存知ですか？

昨年も扱ったネタなので、くどくは申しません。組込用途に向け開発された軽量 Ruby こと [mruby](http://forum.mruby.org/doc/mruby-141121135812-conversion-gate01.pdf)「も」動くマイコンボードです。

[昨年書いた記事](https://qiita.com/GORO_Neko/items/bc4b108421d36866e7a4)の再掲になりますが、以下を参照ください。

![GR-CITRUS.png](https://qiita-image-store.s3.amazonaws.com/0/89832/a68200ee-04ba-cfab-95f9-90b41e00b746.png)

- [Renesas Electronics Corporation 製マイコンボード](http://gadget.renesas.com/ja/product/citrus.html)
- 組込み向け軽量 Ruby の mruby を搭載したマイコンボード
- ルネサス32ビットマイコン RX631 グループ MCU を搭載
- Arduino 互換（Arduino Pro Miniと互換性のあるピン配置
- mruby 製アプリケーションに加え、Arduino 言語製アプリケーションも動作可能（・・・私はまだ試してません）
- ESP8266 を搭載したボード「WA-MIKAN」（この試行では使っていません）と組み合わせることで WiFi 通信やマイクロ SD カードの使用が可能
- Chrome App の [Rubic](https://chrome.google.com/webstore/detail/rubic/mgbcgagfggopcpbbfgididddbnhhnhjp?hl=ja)を使うことで、プログラムの作成から実行までスムーズに実行可能

・・・ Chrome App の Rubic ・・・

# 開発環境が Chrome App 仕立て？

そう、[昨年記事](https://qiita.com/GORO_Neko/items/bc4b108421d36866e7a4)を書いた際には、GR-CITRUS 用 mruby アプリケーションを作成する際、Chrome App 形式の Rubic を使用しました。

・・・で、ですよ。Google さんは、かなり前から Chrome OSを除く、つまりWindows/Mac/Linux版全ての Google Chrome で、Chrome アプリのサポートを段階的に廃止すると言われておりました。

だとするとそろそろ Rubic 動かなくなっちゃうんじゃなかろうかと心配していたのですが、なんと！　新しい開発環境が提供されました！！

# Visual Studio Code ベースの新開発環境現る

新しい開発環境は Visual Studio Code ベースです。
Visual Studio Code に拡張機能の[Rubic](https://marketplace.visualstudio.com/items?itemName=kimushu.rubic)を組み込むことで、Visual Studio Code を使って、マイコンボード向け mruby アプリケーションの開発が可能になります。

Visual Studio Code のセットアップ媒体を、[マイクロソフトのホーム](https://code.visualstudio.com/download)ページからダウンロードして、セットアップし、上記の拡張機能の[Rubic](https://marketplace.visualstudio.com/items?itemName=kimushu.rubic)を組み込むだけで、Windows でも Mac でも、わが愛しの Linux でも、あっという間に開発環境を動作させることができます。

Rubic を使いたくなった方、開発元が Web 上で[インストール方法](http://tarosay.hatenablog.com/entry/2017/09/30/040649)を公開しています。早速インストールしてみてください。

作成した mruby アプリケーションを動かしたいマイコンボードの認識させ方や、そもそも mruby を使ったプログラムのビルド方法に関しても、開発元が Web 上で[新規 Ruby プログラムの開始](http://tarosay.hatenablog.com/entry/2017/10/01/032318)と題して詳しい解説記事を公開しています。

# 私見、新開発環境のイケてる機能

とにかく、マイコンボードに書き込むべき mruby ファームウェアの書き換えが楽ちんです。
これで、mruby のバージョンが上がっても、比較的容易に、マイコンボード上の mruby ファームウェアをバージョンアップできます。

万一最新ファームウェアに問題があっても、楽々バージョンダウンもできます。

アプリケーションを作るための mruby のソースコードは、当然旧開発環境上で作成したものでも新開発環境で作成したものでも、変更の必要はありません。

その証明というわけではありませんが、昨年の記事で紹介した機器構成、ソースコードをまるまる再現して、新開発環境でリビルド→実行した結果を以下にあげておきます。
![DSC_0032.jpg](https://qiita-image-store.s3.amazonaws.com/0/89832/2d586f5d-7eb1-0bf6-38c2-78771bae6e5d.jpeg)

はい。何の支障もなく、アプリケーションが動作しました。

今後はこっちの環境で、ガシガシ mruby を使っていく予定です。

では、また。
UITextFieldのテキストの左側に余白を設ける(Swift4)

## はじめに
Obj-C時代から思っていましたが、UITextViewにはテキストの左側に余白があるのに、なぜUITextFieldにはないのでしょうか…。
ということで、[こちらの記事](http://tech-tokyobay.manju.tokyo/archives/369)を参考にさせていただき、Swift4でUITextFieldのテキストの左側にパディング(内側の余白)を実装します。

## パディングの実装
`@IBInspectable` を使うことにより、ストーリーボード上で `padding ` の値を指定できるようにしています。
デフォルト値を設定しているため、値を指定しなくても使えます。

```swift:PaddingTextField.swift
import UIKit

@IBDesignable class PaddingTextField: UITextField {
    // MARK: Properties

    /// テキストの内側の余白
    @IBInspectable var padding: CGPoint = CGPoint(x: 6.0, y: 0.0)
    
    // MARK: Internal Methods
    
    override func textRect(forBounds bounds: CGRect) -> CGRect {
        // テキストの内側に余白を設ける
        return bounds.insetBy(dx: self.padding.x, dy: self.padding.y)
    }

    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        // 入力中のテキストの内側に余白を設ける
        return bounds.insetBy(dx: self.padding.x, dy: self.padding.y)
    }
    
    override func placeholderRect(forBounds bounds: CGRect) -> CGRect {
        // プレースホルダーの内側に余白を設ける
        return bounds.insetBy(dx: self.padding.x, dy: self.padding.y)
    }
```
「アドバイス求む」未経験がprog-8とpaizaで勉強してフリーランスに？

海外生活１０年弱、トリリンガル、金融と貿易の仕事をしたあとに
沖縄と北海道で暮らし、現在は関東のシェアハウス暮らし
外国人のIT技術者のシェアメイトたちに感化されて
プログラミングの猛特訓中
prog-8　では以下の物を１００％まで終了
python3 SQL Git command JScript 
paiza　では以下を終了
Python3入門編　JavaScript入門編　DB/SQL入門編　シェルコマンド入門編

他にも手を付けようとするがあまり手を広げすぎるなと止められたりもする

年齢的（４１歳）、スキル的な不安もあるがここからフリーランスで生計を立てるために
行ったほうがいい会社や勉強会のアドバイス求む。
どうやってswiftでチェックボックス実装するの？　#swift

## Version

Xcode: Version 9.2 


## 事前準備

check boxのオンとオフのボタンを用意して、Assetsの中に入れておく

<img width="566" alt="png.png" src="https://qiita-image-store.s3.amazonaws.com/0/32215/ad87c670-3e71-5679-6c2c-881fc255205f.png">


## UIButtonを拡張したチェックボックスのボタンクラスを作成する

- CheckBox.swift

```swift

import UIKit

class CheckBox: UIButton {
    // Images
    let checkedImage = UIImage(named: "ico_check_on")! as UIImage
    let uncheckedImage = UIImage(named: "ico_check_off")! as UIImage
    
    // Bool property
    var isChecked: Bool = false {
        didSet{
            if isChecked == true {
                self.setImage(checkedImage, for: UIControlState.normal)
            } else {
                self.setImage(uncheckedImage, for: UIControlState.normal)
            }
        }
    }
    
    override func awakeFromNib() {
        self.addTarget(self, action:#selector(buttonClicked(sender:)), for: UIControlEvents.touchUpInside)
        self.isChecked = false
    }
    
    func buttonClicked(sender: UIButton) {
        if sender == self {
            isChecked = !isChecked
        }
    }
}
```

## ボタンを配置

ストーリーボードにボタンを配置しておく

配置したボタンにカスタムクラスを設定する


<img width="536" alt="Main.storyboard.png" src="https://qiita-image-store.s3.amazonaws.com/0/32215/d2b50877-2ed8-a11d-6d30-ae87cab93900.png">


## チェックボックスのオンとオフ

ボタンからアクションを作成して、_ sender: CheckBoxにして、プロパティを参照


```swift
    @IBAction func checkView(_ sender: CheckBox) {

        print(sender.isChecked)

    }
```

## 参考


[xcode \- How to create radio buttons and checkbox in swift \(iOS\)? \- Stack Overflow](https://stackoverflow.com/questions/29117759/how-to-create-radio-buttons-and-checkbox-in-swift-ios/33519147)
MySQL 5.6 -- トランザクションID、取得、SQL

# 以下のSQLで、確認できます。

```sql
    SELECT
      CONCAT('Call function CONNECTION_ID:', CONNECTION_ID(),
        ' Trx_IDs:', GROUP_CONCAT(trx_id SEPARATOR ','),
        ' thread_IDs:', GROUP_CONCAT(trx_mysql_thread_id SEPARATOR ',')
      ) AS infos
    FROM information_schema.INNODB_TRX
    ORDER BY trx_id
ブラウザから画像をサーバーにアップロード - php

コピペで動くはず

ソースの詳細な解説は下記のurlを参照！

# 参照

[参照](http://www.standpower.com/php_up.html)


# ディレクトリ構造

```tree
$ tree
├── top
│   ├── upload
        //アップロードが成功すると下記のように画像が入る
│   │   └── pre.png
│   ├── uploader.html
│   └── uploader.php

```
# 権限の変更

部外者がブラウザからサーバーに画像をアップできるように、とりあえずセキュリティはゆるゆるにしておきます

```shell
chmod 777 upload
chmod 777 top
```

# html

```html
<html>
<head><title>uploader.html</title></head>
<body>
<form method="post" enctype="multipart/form-data" action="uploader.php">
  <input type="file" name="upfile">
  <input type="submit" value="アップロードする">
</form>
</body>
</html>
```

# php

```php
<html>
<head><title>uploader.php</title></head>
<body>
<!-- <p> file uploader </p> -->
<?php
  $updir = "./upload/";
  $filename = $_FILES['upfile']['name'];
  if(move_uploaded_file($_FILES['upfile']['tmp_name'], $updir.$filename)==FALSE){
    print("Upload 失敗");

    //print($_FILES['upfile']['error']);
  }
  else {
    //print("<b> $filename </b> uploaded");
  }
?>
</body>
</html>
```

# 実行

<img width="366" alt="スクリーンショット 2017-12-20 12.29.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/28883c23-ad24-bc76-18ea-23e0b50dff7e.png">