OmniAICreator/Qiita-1.07M huggingface dataset:
geom_barにおけるy軸の対数変換について


準備
====

例として以下のような、`dplyr::group_by`でグループ化したデータフレームを用意する。

``` r
library(dplyr)
library(magrittr)
library(ggplot2)

df <- data.frame(
  x = rep(c(1, 2, 4), c(10, 1, 20)),
  g = rep_len(c("a", "b"), 31)
)
df %<>% group_by(g)
table(df)
```

    ##    g
    ## x    a  b
    ##   1  5  5
    ##   2  1  0
    ##   4 10 10

そのままプロットするとこんな感じになって、特におかしなところはない。

``` r
# プロットできる
ggplot(df, aes(x = x)) +
  geom_bar()
```
![unnamed-chunk-3-1.png](https://qiita-image-store.s3.amazonaws.com/0/109348/774cbc4b-663e-6d60-2799-e37ec2a0fd30.png)

ところがこれに`scale_y_log10`を使ってy軸を対数変換すると表示がおかしくなる。

``` r
# プロットできるがおかしい(なんか増えてね…？)
ggplot(df, aes(x = x)) +
  geom_bar() +
  scale_y_log10()
```

![unnamed-chunk-4-1.png](https://qiita-image-store.s3.amazonaws.com/0/109348/d218d3fc-163d-dafb-2246-1388ff95af10.png)


グループを見えるようにするとよく分かるが、対数変換した後に積んでいるので、y軸との対応が取れなくなっている。

``` r
# こういうこと(対数変換してから積んでる)
ggplot(df, aes(x = x, fill = g)) +
  geom_bar() +
  scale_y_log10()
```

![unnamed-chunk-5-1.png](https://qiita-image-store.s3.amazonaws.com/0/109348/4abb3323-d457-1d3c-e279-1e0818adf06f.png)

それぞれのグループの変換自体は正しいので、`position=dodge`を指定すれば矛盾のない表示になる。

``` r
# こうすれば良い
ggplot(df, aes(x = x, fill = g)) +
  geom_bar(position = "dodge") +
  scale_y_log10()
```

![unnamed-chunk-6-1.png](https://qiita-image-store.s3.amazonaws.com/0/109348/9a63ca39-9a60-d09a-5f6f-d57d4d953236.png)


あるいは`ungroup`してしまってもよい。

``` r
# ungroupする
ggplot(ungroup(df), aes(x = x)) +
  geom_bar() +
  scale_y_log10()
```

![unnamed-chunk-7-1.png](https://qiita-image-store.s3.amazonaws.com/0/109348/09e3a5df-bffa-2a5b-1c5f-46b76c5d9faa.png)

ところでy軸を対数変換する別の方法として、`scale_y_continuous`の`trans=`引数を使うものがあるが、このとき`"log1p"`を指定すると、値に1を足した上で対数変換が行われる。こうすると1と0の区別ができるようになる。y軸の値ラベルはきちんと調整されるので、ずれることもない。

``` r
# プロットできる(1を消さない)
ggplot(ungroup(df), aes(x = x)) +
  geom_bar() +
  scale_y_continuous(trans = "log1p")
```

![unnamed-chunk-8-1.png](https://qiita-image-store.s3.amazonaws.com/0/109348/2c046c46-1a9c-7b5a-e783-4aecb814e9e6.png)

y軸を対数変換するさらに別の方法として`coord_trans`を使うものがある。これはデータではなく軸の方を変換するためなのか、上記のデータは`ungroup`してもしなくてもプロットできない。

``` r
# プロットできない
ggplot(df, aes(x = x)) +
  geom_bar() +
  coord_trans(y = "log10")
```

``` r
# プロットできない
ggplot(ungroup(df), aes(x = x)) +
  geom_bar() +
  coord_trans(y = "log10")
```

一方、軸の方の変換なので、`coord_trans`で`"log1p"`を使えば`position="stack"`の状態でもy軸との関係を正しく保った状態でプロットができる(グラフとしてこれが適切なのかというと微妙だが)。

``` r
# プロットできる
ggplot(df, aes(x = x, fill = g)) +
  geom_bar() +
  coord_trans(y = "log1p")
```

![unnamed-chunk-9-1.png](https://qiita-image-store.s3.amazonaws.com/0/109348/2a9193ae-7357-e4ff-f019-8b4a722e6398.png)
【WordPress】カテゴリ一覧をドロップダウンで出力するテンプレートタグ


#全てのキー
<?php wp_dropdown_categories( $args ); ?>

<?php $args = array(
　　'show_option_all'    => '',
　　'show_option_none'   => '',
　　'option_none_value'  => '-1',
　　'orderby'            => 'ID',
　　'order'              => 'ASC',
　　'show_count'         => '0',
　　'hide_empty'         => '0',
　　'child_of'           => '0',
　　'exclude_tree'       => '',
　　'exclude'            => '',
　　'include'            => '',
　　'echo'               => '0',
　　'selected'           => '0',
　　'hierarchical'       => '1',
　　'title_li'           => '',
　　'current_category'   => '',
　　'name'               => 'cat',
　　'pad_counts'         => '0',
　　'id'                 => 'name',
　　'class'              => 'postform',
　　'depth'              => '-1',
　　'tab_index'          => '0',
　　'taxonomy'           => 'category',
　　'hide_if_enpty'      => '0',
　　'value_field'        => 'term_id',
　　'style'              => 'none'
　　'use_desc_for_title' => '0',
　　'feed'               => '',
　　'feed_image'         => '',
　　'number'             => 'null',
); ?>




#よく使うキー



<?php wp_dropdown_categories( $args ); ?>

<?php $args = array(
　　'show_option_all'    => '',
　　'orderby'            => 'ID',
　　'order'              => 'ASC',
　　'show_count'         => '0',
　　'exclude'            => '',
　　'include'            => '',
　　'title_li'           => '',
　　'depth'              => '-1',
　　'style'              => 'none'
); ?>
遺伝的アルゴリズムについてまとめ、実装もしてみた。

# GAとは
生物の自然淘汰における遺伝と適者生存の仕組みを用いて,複雑な問題の最適解を求める手法のこと.
複数の個体が選択と交叉/突然変異を繰り返しながら,適応度の高い個体集団に世代交代していくことで最適な個体を見出せる.

* 言葉の定義
  * 個体・・・設計変数のまとまりこと.
  * 遺伝子・・・１つの設計変数のこと.
  * 適応度・・・各個体の目的関数の値のこと.
  * 選択・・・個体の適応度に基づいて個体を減らすこと.
  * 交叉・・・選ばれた2個体の遺伝子の一部を入れ替える操作.
  * 突然変異・・・個体の遺伝子の一部をランダムに変化させること.
  

## 解の記法
* バイナリエンコーディング
  * 各遺伝子を0,1のビットとして表現する方法.
* 順序エンコーディング
  * 各遺伝子を順序を示す数字として表現する方法.
* 実数値エンコーディング
  * 各遺伝子を数値/文字として表現する方法.
* 木構造エンコーディング
  * 遺伝子構造を配列ではなく木構造として表現する方法.


## 選択
* ルーレット方式
  * 集団をルーレット版に見立て,適応度とルーレットの面積を比例させることで,ランダムな選択を行う方式.
  * 適応度の差が大きいと,局所的な最適解に早期に収束してしまう原因になりがち.
* ランキング方式
  * 上記のルーレット方式の早期収束を防ぐため,適応度の序列に合わせた選択確率をあらかじめ決めておく方式.
* トーナメント方式
  * あらかじめ決めた個体数をランダムに抽出し,その中でもっとも適応度の高い個体を選ぶ方式.
* エリート方式
  * 適応度の高い順に選ぶ方式. 解の多様性はなくなる.


## 交叉
* 一点交叉
  * 遺伝子が交叉する場所をランダムに選び,それより後ろの遺伝子を全て入れ替える.
  * 効率が低いためほぼ使われない.
* 二点交叉
  * ２つの交叉点をランダムに選び,その間にある遺伝子を入れ替える.
* 多点交叉
  * 3つ以上の交差点をもつ.
  * 一点交叉/二点交叉より効果が出ないためほぼ使われない.
* 一様交叉
  * 各遺伝子を所定の確率（通常は1/2）で入れ替える.

この他にも、循環交叉や順序交叉など,多数の交叉方法がある.


## 突然変異
* 置換
  * ランダムな遺伝子を対立遺伝子に置き換える.
* 摂動
  * ランダムな遺伝子の値を微小変化させる.
* 交換
  * ランダムな２つの遺伝子を入れ替える.
* 逆位
  * ランダムな2つの遺伝子の間の順序を逆にする.
* 攪拌
  * ランダムな2つの遺伝子の間をランダムに並べ換える.
* 転座
  * ランダムな2つの遺伝子の間の遺伝子全てを別の遺伝子間に移動する.
* 重複
  * ランダムな2つの遺伝子の間の遺伝子全てを別の遺伝子間に複製する.
* 挿入
  * ランダムな場所にランダムな遺伝子を挿入する.
* 欠失
  * ランダムな遺伝子を削除する.


## 世代交代モデル
* 離散世代モデル
  * 全ての個体が世代交代し,現世代全ての個体が次世代個体に置き換えられるモデル.
* 連続世代モデル
  * 現世代の一定の割合のみが世代交代するモデル．


# 実装
[GitHub](https://github.com/be-kan/genetic-algorithm)にソースコードをあげています。
選択はエリート方式、繁殖は二点交叉と置換の突然変異を混ぜて実装しました。

局所解にハマってしまったので、時間があればアルゴリズムを改善する予定です。

# 参考
https://www.slideshare.net/kzokm/genetic-algorithm-41617242
helmを使ってKubernetesを楽にする

# １．helmとは。基本的な使い方

## helmとは：KubernetesでつらいYAML地獄を脱却するYAML生成ツール

- Kubernetesのつらさ

Kubernetesでは、PodやServiceといった基本的なコンテナの設定をYAML形式で記述します。
何度も何度もYAMLを書いていると、[下記のような](https://github.com/kubernetes/website/blob/master/content/en/docs/user-guide/walkthrough/pod-nginx.yaml)決まり文句の書き出し数行を書くのもつらくなってきます。

```okimari.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.7.9
    ports:
    - containerPort: 80
```

helmがやってくれるのは、**「nginxがほしい」と願えば上記のYAMLを生成してくれる**ことだと思っています。

## helmの基本的なコンセプト：設計図Chartとそこから作られるRelease

YAMLの生成は、Chart（チャート）とRelease（リリース）で実現されます。

- Chartは、Kubernetesでよく作られるPodやServiceなどのYAMLファイルのひな型を固めて圧縮したもの。
- Releaseは、Chartに基づいてコピー生成されたPodやServiceなどのYAMLファイル。

nginxのチャートはたいてい有志が開発してくれていますので、我々は後述する`helm install`コマンドを実行すれば、新しいリリースを作成してくれて、ついでにKubernetesにデプロイしてくれます。
生成したYAMLファイル自体に目を通すこともなく、Kubernetes上にnginxが構築されるわけです。
これがYAML地獄からの脱却です。

## helmの仕掛け

基本的にはコマンドとサーバで処理を行っています。
コマンドはKubernetesで必要な処理をサーバに伝えて実行します。
利用する我々は、**コマンドの使い方を覚えればいいだけ**です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96277/d541fd36-6935-e7bd-0258-025cf6920243.png)

（注：このアーキテクチャはv2まで。v3からはtillerはなくなり、端末側でのレンダリングとなりました）

### これだけで使える：`helm install`とReleaseの名前

チャートからリリースを作成するコマンドが、`helm install`です。

```v2版.sh
helm install <nginxチャート名> -n <リリース名>
```

```v3版.sh
helm install <リリース名> <nginxチャート名> # 結構私自身影響ありました・・・スクリプト書き直しが ;o
```

同じチャートから複数のリリースを作った場合にちゃんと区別するために、リリースには名前が付けられます。何も指定しなければ勝手に英単語２つをくっつけた名前が設定されます。（が、これはあとあとで厄介ですので、リリース名はつけるのがおすすめ）

### その他のhelmのコマンド

- インストール

|コマンド|機能|
|---|---|
|`helm init`|tillerサーバのインストール (v2まで)|

- リリース系

|コマンド|機能|
|---|---|
|`helm install`|チャートからリリースを作成する|
|`helm upgrade`|チャート更新があったら、作成済みリリースに更新を適用する|
|`helm delete(del)`|リリースを削除する|
|`helm list(ls)`|リリースをリストアップする|
|`helm get [values, manifest]`|リリースの情報を表示する|

- チャート系

|コマンド|機能|
|---|---|
|`helm repository(repo) [list, add, delete]`|チャートのレポジトリを追加、削除する|
|`helm create`|自作チャートのひな型を作成する|
|`helm dependency(dep)`|チャート内の依存関係を解決する|
|`helm search`|チャートを検索する|


## helmをインストールして実際に使ってみよう！

helmコマンドのバイナリをダウンロードし、`helm init`を実行することでコマンド・サーバの両方がインストールされます。
helmコマンドは下記サイトの各バージョンの「Installation and Upgrading」からダウンロードできます。自分のOSに合わせたバイナリをダウンロードします。
[helm/release](https://github.com/kubernetes/helm/releases)

Linuxであれば、このバイナリを下記パスに移動するだけで使えるようになります。
```
mv linux-amd64/helm /usr/local/bin/helm
```

最後にサーバをインストールします。

```
helm init
```

すでにインストール済みのサーバをアップデートするには、下記を実行します。

```
helm init --upgrade
```

少し古いバージョンだと[Kubernetes: パッケージマネージャHelm](https://qiita.com/tkusumi/items/12857780d8c8463f9b9c)がたいへん詳しいです。

## 自作Chartの作り方

- 次回！
PHP CodeSnifferを利用して規約遵守のコードを書く

# コードが汚い

現在はプログラミング学習中という名目で、自分の書くコードはとにかく汚い。しかし、人間の能力で書き方をチェックしていては時間がかかるし、何よりこのエネルギーがあれば、学習そのものに使いたい。

これを何とかしなければと思い、今回``PHP CodeSniffer(PHPCS)``というコード規約のチェックツールを導入することにした。

# PHPCSのインストール

現在、自分の使用しているエディターは``Visual Studio Code(VSCode)``だ。一時期``Atom``を使用していたが、画面内のターミナルの表示が上手くいかず、最近乗り換えた。

VSCodeも拡張機能でPHPCSを使用することができる。しかし、事前に自分の開発環境にPHPCSをインストールしておく必要がある。自分はこれを忘れ、延々と以下のメッセージに悩まされていた。

```
phpcs: Request workspace/configuration failed with message: Unable to locate phpcs. Please add phpcs to your global path or use composer dependency manager to install it in your project locally.
```

phpとcomposerはインストール済みなので、単純なインストール作業だけで良いだろう。Homebrewの``installコマンド``で実行することにした。

```
$ brew install php-code-sniffer
```

バージョン確認は``-v``では出来ない。``--version``と記述する。

```
$ phpcs --version
PHP_CodeSniffer version 3.2.3 (stable) by Squiz (http://www.squiz.net)
```

この後、VSCode内で拡張機能であるPHPCSをインストールする。これは、VSCodeの拡張機能メニューから簡単に作業ができる。

# コード規約の適用

今回使用する規約は``PSR-2``だ。Laravelでも採用されているらしい。PHPの規約に関するあれこれは、こちらの記事がわかりやすい。

[PHPコーディング規約まとめ](https://qiita.com/hshimo/items/04be1f432240c58300f4)

``⌘（コマンド）＋,（カンマ）``でユーザー設定の編集が可能だ。右側の``ユーザー設定``欄に以下のコードを追記する。

```
"phpcs.standard": "PSR2"
```

ちなみに以下のサイト様は、自分の記事よりずっとわかりやすい。図入りで丁寧に解説されている。

[[PHP]Visual Studio Codeを使ってphpcsによるPSR-2規約チェックを行う方法](https://akamist.com/blog/archives/293)

VSCodeを再起動すれば、設定が適用される。

そして、コードを記述して規約違反があれば、赤い波線が現れる。その波線にカーソルを合わせると、違反内容が表示される仕組みだ。

このツールを使用し、少しでも整ったコードを書けるように努めよう。

今回はここまで。
babel-polyfillによって使用可能になる処理まとめ

[こちら](https://qiita.com/goodtea0223/items/8a08d3c35bb9319f011e)の書き直し記事です。

babel-polyfill導入で使用可能になる処理を把握しやすいようサンプルと共にまとめてみました。
具体的なまとめはカテゴリごとに別記事にして分けてます。

babel-polyfill v6.26.3
https://github.com/babel/babel/blob/v6.26.3/packages/babel-polyfill/src/index.js
core-js v2.5.3（babel-polyfill内で↓が読み込まれている）
https://github.com/zloirock/core-js/blob/v2.5.3/shim.js

```js
import 'babel-polyfill';
```

**随時更新していきます。**

[Object編](https://qiita.com/goodtea0223/items/bd30744778c7ef0a00b4)

Array編

String編

Number編

Math編

Function＆Date＆Regexp編

Reflect編

その他
PythonでGoogleSpreadSheetの中のシートの存在チェックを行う方法

個人開発で使ったのでメモ程度に。


```sheet.py
# ここまでにOAuthを通して変数spreadsheetにスプレッドシートの情報が入っているようにする。今回は割愛。

worksheets = spreadsheet.worksheets() # シートの一覧が取得できる
# 中身はこんな感じ[<Worksheet 'シート1' id:0>, <Worksheet 'シート2' id:1234567890>]

for sheet in worksheets:
    if 'シート1' == sheet.title:
        return True
    else:
        return False
```
ざっくり書くとこんな感じ。


```
worksheets = spreadsheet.worksheets()
```
を使うことでそのスプレッドシートのファイルの中にある全てのシートを取得できる。


```
sheet.title
```
listの中身はgspread.models.Worksheet型なので、
専用のメソッドでその中の情報を取得した上で比較にかける必要がある。


これができると、
何かスケジューラで自動で記録したりするときにYYYYMM毎にシートを区切るという処理を作れたりする。


# 参考情報
http://gspread.readthedocs.io/en/latest/index.html?highlight=sheet#gspread.models.Spreadsheet.worksheets
TypeScriptでstaticなfactory methodを作る

# 実行環境

```shell-session
$ tsc --version                                                                                                                                                                                                                
Version 2.7.2
```

# コード

```typescript

interface IUser {
  name: string;
}

class BaseUser implements IUser {
  name: string;

  constructor(initial: Partial<IUser>) {
    (<any>Object).assign(this, initial);
  }

  static createCollection<T extends BaseUser>(
    this: {new(initial): T},
    collectionData
  ): T[] {
    const collection: T[] = [];
    collectionData.forEach(data => {
      const initialData = data as IUser;
      collection.push(new this(initialData));
    });
    return collection;
  }

}

class Manager extends BaseUser {
}

class Programmer extends BaseUser {
}

const array = [
  {name: 'test1'},
  {name: 'test2'},
]

const managers = Manager.createCollection(array)
console.log(managers) // => [ Manager { name: 'test1' }, Manager { name: 'test2' } ]

const programmers = Programmer.createCollection(array)
console.log(programmers) // => [ Programmer { name: 'test1' }, Programmer { name: 'test2' } ]

```


`User`の初期値のオブジェクトの配列などを渡したら、Userクラスインスタンスの配列が返ってきて欲しいときにつかいたいやつ。
肝心のそのstaticメソッドは `createCollection` 
基底クラスなどにこのメソッドを仕込んでおけば、いちいちクラスを渡すこと無く、基底クラスの継承先クラスのインスタンスが返ってきて便利。


#　なにをやってるのか

```typescript
this: {new(initial): T}
```

functionの第一引数にthisとその型を渡すと、自分でthisの型を決定できる。
https://www.typescriptlang.org/docs/handbook/functions.html#this-parameters

さらに、コンストラクタシグネチャを使って、Tというconcrete classのインスタンスを返すコンストラクタを持つオブジェクト型をthisの型として指定する。

単純に ` this: T` などとすると `error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.`というエラーがでてしまうので、ちょっと回りくどい感じになってる。


# 参考issue
この書き方はTypeScriptのissuesを参考にしてる。
https://github.com/Microsoft/TypeScript/issues/5863
issueが長すぎるので、みんな結構staticでいい感じにthisを使うのは苦労してるみたい…


# 別解

```typescript
  static createCollection<T extends BaseUser>(
    this: new (initial) => T,
    collectionData
  ): T[] {

```

こういう書き方でも同じような結果になるけど `new (initial) => T` の部分がどういう書き方なのか、何故こうなるのかが分からない…ご存じの方いたら教えてください :bow:
ionic 画面遷移とトグルメニュー

# ionic 画面遷移とトグルメニュー

ionicについて勉強をはじめました。
画面遷移とトグルメニューについて自分なりに纏めました。

## 画面遷移の方法について

Terminalでカレントディレクトリをページを追加したいプロジェクトに移動します。
移動後、Terminalから以下のコマンドを実行します。
('next'は例です。)

```
$ ionic g page next
```

ルートモジュールに作成したモジュールをimportします。

```app.module.ts
import { NextModule } from '../pages/next/next.module';
(省略)
@NgModule({
  declarations: [
  imports: [
    (省略),
    NextModule
  ],
```

後は、呼び出し側を設定します。
まずは呼出側の画面に、画面遷移用のボタンを追加します。

```呼出側.html
import { NextPage } from '../next/next';
(省略)
<button ion-button (click)="onClick()">画面遷移</button>
```
ボタンから呼び出される画面遷移用のメソッドを追加します。

```呼出側.ts
  onClick(){
    this.navCtrl.push(NextPage);
  }
```

これで、呼出側の画面からボタンを押下した際、画面遷移します。

## トグルメニューの追加について

[ionicのdoc](https://ionicframework.com/docs/api/components/menu/MenuToggle/)を見ると\<ion-header>-\<ion-navbar>の中に以下コードを追加しています。

```sample.html
<button ion-button menuToggle>
    <ion-icon name="menu"></ion-icon>
</button>
```

しかし、Sampleコードをコピペしてもトグルメニューが反映（表示）されませんでした。
そのため、[ionicのdoc](https://ionicframework.com/docs/api/components/menu/MenuToggle/)で類似のやり方として記載してある\<ion-toolbar>を使用して実装することにしました。

```sample.html
<ion-toolbar>
  <button ion-button menuToggle>
    <ion-icon name="menu"></ion-icon>
  </button>
  <ion-title>めいん</ion-title>
</ion-toolbar>
```

ちなみに'ionicons'については[ここ](https://ionicframework.com/docs/ionicons/)を参照してください。

## サイドバーの設定と画面遷移

ここでは、サイドバーのメニューの表示とクリックされた際の画面遷移について記載します。
まずは、サイドバーの設定をします。

```app.html
<ion-menu [content]="c1">
  <ion-header>
    <ion-toolbar>
      <ion-title>さいどばーめにゅー</ion-title>
    </ion-toolbar>
  </ion-header>
  <ion-content>
    <ion-list>
      <button menuClose ion-item (click)="onClick('1')">１つめ</button>
      <button menuClose ion-item (click)="onClick('2')">２つめ</button>
    </ion-list>
  </ion-content>
</ion-menu>
<ion-nav #c1 [root]="rootPage"></ion-nav>
```

次に、クリックされたときの動作を指定します。

```app.component.ts
import { Component, ViewChild } from '@angular/core';
import { Platform, Nav } from 'ionic-angular';
(省略)
import { NextPage } from '../pages/next/next';
@Component({
  templateUrl: 'app.html'
})
export class MyApp {
  @ViewChild(Nav)nav:Nav;
(省略)
  onClick(strNumber:string){
    if(strNumber==='1'){
      // ページ遷移
      this.nav.setRoot(NextPage);
    }else{
      // 何もしない
    }
  }
}
```

上記の実装で、[１つめ]ボタンが押下された際に画面遷移します。
[２つめ]ボタンが押下された場合は何もしません。
【UiPath】使い道のわからないHover（ホバー）の使い道を探す

UiPath Academyに少しだけ登場したHover（ホバー）アクティビティ。
Selectorで掴んだオブジェクトの上にマウスカーソルを移動する、というものですが
マウスオーバーするだけのコイツの使い道が思い浮かばない。
![hover.png](https://qiita-image-store.s3.amazonaws.com/0/255097/636fac97-d1cd-8203-c2e5-ac8063bb04f0.png)
使い道を模索してみます。

# Drag & Drop ←没
**※結論から言うとHover要りませんでした。**
UiPath Community Forumを検索して見つけたのがDrag & Drop。
1. Click (CLICK_DOWN) でDragしたいオブジェクトを掴み、
2. Hover でDropしたい場所の上まで持ってきて
3. Click (CLICK_UP) でオブジェクトを放す。
というもの。なるほど。
早速この理屈で「デスクトップ上に散らばったPDFファイルをゴミ箱に捨てるロボ」を作ってみた。
![pdf_delete_robo1.gif](https://qiita-image-store.s3.amazonaws.com/0/255097/c3d1453b-81b1-42dc-5237-f11b2de769cd.gif)

ワークフローは以下の通り。これをループさせる。
![robo1.png](https://qiita-image-store.s3.amazonaws.com/0/255097/345e3619-5cf7-f397-c6e3-a810dfe7165a.png)

でもよく考えたら2.と3.のSelectorが同じになるので、1.と3.だけで十分な気がしてきた。
**2.を外してみた。**
![pdf_delete_robo2.gif](https://qiita-image-store.s3.amazonaws.com/0/255097/288b717f-76c1-2189-866c-68adb1d574cb.gif)
できた…しかもHoverを挟まないぶん速い…**Hoverいらない子すぎる・・・**

というわけで、
1. Click (CLICK_DOWN) でDragしたいオブジェクトを掴み、
2. Click (CLICK_UP) でDropしたい場所の上でオブジェクトを放す。
でDrag & Dropは実現可能でした。

# マウスオーバープルダウン ←没
**※これもHover要りませんでした。**
jQueryでおなじみ、マウスオーバーで表示されるプルダウンの選択はどうか。
![tokyo.png](https://qiita-image-store.s3.amazonaws.com/0/255097/c5bc9d3e-d098-7110-927d-45db5e82f0fa.png)
人間の操作であれば、↑の「エリア紹介」をクリックするには
親メニューの「東京の楽しみ方」をマウスオーバーする必要があるので
1. Hover で「東京の楽しみ方」にマウスオーバー
2. Click で「エリア紹介」をクリック。

でも実現可能ですが、**実際はHover使わず2.だけでいけました。**
マウスオーバー前から裏のHTMLに情報持ってるから直接Selectorで掴めるのでしょうね。
![area.png](https://qiita-image-store.s3.amazonaws.com/0/255097/83db80a6-e08a-f568-3d25-77e242b6fa3c.png)

# 結論：マウスオーバーからのポップアップ情報取得
現時点でたどり着いた使い道。
例えばこれ。NEXCO中日本が運営している[iHighway](http://c-ihighway.jp/web/map_kanto.html)から、高速道路の事故情報を取得します。
（地図上の**[×]**マークにマウスオーバーすると、その地点の事故情報がポップアップ表示される）
![jiko.png](https://qiita-image-store.s3.amazonaws.com/0/255097/301fd8fb-bcaa-ad61-3ab4-0dbae475cbb5.png)

1. Find Image Matchesで[×]マーク検出（検出した数だけUiElementのリストが返る）
2. 取得したUiElementにHoverでマウスオーバー（→ポップアップが表示される）
3. Get Textでポップアップから事故情報取得

という手順で、地図上から全ての事故情報を拾ってみます。
![workflow.png](https://qiita-image-store.s3.amazonaws.com/0/255097/a9d36013-78ac-5041-fec4-6f3ee1cf95d1.png)

>※Get Textの編集でポップアップを選択する必要があるのですが、
>Indicate on screen中（対象が青くなるアレね）はポップアップは出てこないので、
>1. F2を押してIndicate on screenを一旦停止（３秒間）し、
>2. その間に[×]にマウスオーバーしてポップアップを出しておいて、
>3. ３秒後に停止が切れてからポップアップを選択
>というテクニックが必要です。
>![select.png](https://qiita-image-store.s3.amazonaws.com/0/255097/06887cdb-2a18-f52b-2b19-d53a5b25d0d8.png)

実行した結果がこちら。全ての画面上の事故情報が拾えています。
![jiko.gif](https://qiita-image-store.s3.amazonaws.com/0/255097/dcd59aea-b767-27fc-0d7d-5edb6f6fcb94.gif)


---
今回はここまで。
HTMLベースのサイト操作ではわざわざHover使わなくてもなんとかなる事が多いので、
あと思いつくのはFlashを使ったブラウザゲームの操作でしょうか。
[UE4] Custom Launch Profile を複製する方法

#1. はじめに
Custom Launch Profileを複製する方法を記載します。
EditorからはデフォルトでCustom Launch Profileを複製する方法が無いため、別のCustom Launch Profileを作成した後に全ての設定を再度行うのは非常に手間がかかります。特にモバイルアプリの開発などではiOS、Androidなど設定は殆ど同じで、一部だけ設定を変更する必要があるときなど、Custom Launch Profileを別々に作成しておく際に有効です。
1つのCustom Launch Profileで複数のプラットフォームを選択することも可能ですが、不具合により複数同時にパッケージをすることが出来ないことがあります。

![2018-05-19_16h53_38.png](https://qiita-image-store.s3.amazonaws.com/0/101019/458d538d-ca9b-d8d2-6ca4-7159c926c0a1.png)


#2. 手順

1) ベースとなるProfileを作成
プロジェクトでベースとなる設定を１つ作成しておきます。
![2018-05-19_16h42_41.png](https://qiita-image-store.s3.amazonaws.com/0/101019/a5020e51-f68d-97bf-c0d3-944a3fd8d87d.png)


2) Profileの保存先に移動
Engine/Programs/UnrealFrontend/Profiles に作成したプロファイルがあるので移動します。
**この.ulp2ファイルは開発者間や別のPCで共有が可能です。**
![2018-05-19_16h43_04.png](https://qiita-image-store.s3.amazonaws.com/0/101019/c136a749-1709-5f68-d03f-c1ef1650ffa8.png)


3) .ulp2ファイルの複製
ベースの.ulp2ファイルをCopy＆Pasteで複製し、末尾のIDを適当なものに変更します。
このケースですと末尾の"C"を"D"に変更します。
![2018-05-19_16h49_01.png](https://qiita-image-store.s3.amazonaws.com/0/101019/50574436-672b-0b4c-d2b3-e4c71f4d26fc.png)

4) .ulp2ファイルの編集
上記で複製した.ulp2ファイルをテキストエディタやメモ帳で開き、Idを3)で変更した内容と同じとなるように修正します。**ここの中身を編集することでテキストベースでの設定を編集することも可能です。**
![2018-05-19_16h50_09.png](https://qiita-image-store.s3.amazonaws.com/0/101019/8ed504dd-31fe-405d-f21b-0ace22c8ceab.png)

5) Project Launcherの再起動
Project LauncherをEditorから開いている場合はEditorを再起動します。
Editorが再起動後、Project Launcherを確認すると複製したCustom Launch Profilkeが反映されていることが確認できます。Editorを開いたままで反映を確認したい場合は、Project Launcherを単体で起動することもできます。Project LauncherはEngine/Binaries/Win64にあるUnrealFrontEnd.exeにあります(ただしProject Launcher単体での起動は幾つかの問題があるのでEditorからの起動が安全です)。

![2018-05-19_16h52_26.png](https://qiita-image-store.s3.amazonaws.com/0/101019/213f870e-6206-eacd-d7b7-3ca63596f7e9.png)

以上、プロファイルを複製する簡単な方法の紹介でした。
Railsで簡単にGDPR対応 (EU圏のIPを判定する)

## 背景

迫るGDPR対応。EU圏に住んでいる知人からも「最近色々なサービスからGDPR関連の長文メールがよく届く」みたいな話をききます。各社対応がギリギリすぎるのでは・・・笑。日本の企業もサービスの業種によっては対応しないといけないため、そのメモ。

## 基本方針

`request.remote_ip` からEU圏かどうか判定して、処理を切り替えられるようにする

## 利用ライブラリ

- maxmind社がIPの地理情報を提供しているので、元データとしてはそちらを利用する。
- IP判定のgemを検索すると `geoip` が出て来るが、更新もあまりされておらず、2019年1月に失効するmaxmindの旧バージョンのGeoデータしか読み込めないようなので非推奨
- [maxmind社公式サイト](https://dev.maxmind.com/geoip/geoip2/downloadable/
)にてオススメしている `maxminddb` を利用


```ruby
gem 'maxminddb'
```

## 実装

1. http://dev.maxmind.com/geoip/geoip2/geolite2/ から `GeoLite2-Country.mmdb` をダウンロードして、任意のディレクトリに配置
2. `config/initializers/maxminddb.rb` を作る

```ruby
# Download latest free geo city database from here:
# http://dev.maxmind.com/geoip/geoip2/geolite2/
Maxminddb = MaxMindDB.new(Rails.root.join('./db/GeoLite2-Country.mmdb'))
```

あとはこんな感じでcontroller等に実装するだけでOK


```ruby
#
# EU圏からのアクセス
#
def request_from_eu?
  request.remote_ip.present? && Maxminddb.lookup(request.remote_ip).continent.code == 'EU'
end
```

## その他

- Country DBを利用したが、City DBを利用すると都市単位まで分かるようになる。(ただしファイル容量は重い)
- Country DBの精度は98%くらいあるとのこと
- maxminddbの元データは毎月更新されるので、必要あれば自動更新を組むこと
層圏トポス: p.20の同値関係が推移律を満たさない例


第2刷のあとがき(p.199)によると、p.20で定義される前層$A$から定義される$\mathfrak{F}$上の同値関係は、推移律を満たすとは限りません。
推移律を満たさない例を以下に示します。

## 同値関係の定義
前層 $\<A, E, \neg\>$ が与えられたとき、

```math
\mathfrak{F} = \{ F \subseteq A | Fの元は互いに両立している \}\\
{\rm E}F = \bigcup_{f \in F}{{\rm E}f}\\
F \neg U = \{ f \neg U | f \in F \}\\
```
として$\mathfrak{F}$を定義する。

ただし、$f$と$g$が互いに両立していることは、$f \neg {\rm E}g=g\neg{\rm E}f$であることと定義されている。

このとき $\mathfrak{F}$上の同値関係$ F_1 \equiv F_2 (F_1, F_2 \in \mathfrak{F})$を次の条件で定義する。

```math
{\rm E}F_1 = {\rm E}F_2 \land (F_1 \cup F_2 \in \mathfrak{F})
```

## 推移律を満たさない例
次のような$X$とその開集合系$\mathfrak{O}(X)$を考える。

```math
X := \{ x, y \}\\
\mathfrak{O}(x) = \{ X, \{x\}, \{y\}, \emptyset \}\\
```

この$X$の上に、次のような前層$A$を考える。

```math
A := \{ a, b, c, d_1, d_2 \}\\
{\rm E}a := \emptyset\\
{\rm E}b := \{x\}\\
{\rm E}c := \{y\}\\
{\rm E}d_1 := X\\
{\rm E}d_2 := X\\
```

この前層$A$の$\mathfrak{F}$に対して、次のような$F_1, F_2、F_3 \in \mathfrak{F}$を考える。

```math
F_1 := \{ d_1 \}\\
F_2 := \{ b, c \}\\
F_3 := \{ d_2 \}\\
```

- $F_1 \equiv F_2$  
    + ${\rm E}F_1 = {\rm E}F_2 = X$
    + $F_1 \cup F_2$の元 $b, c, d_1$について、以下のように互いに両立する。

$b, c : {\rm E}b \cap {\rm E}c = \emptyset$より両立
$b, d_1 : $

```math
{\rm E}b = \{x\} \subset \{x, y\} = {\rm E}d_1\\
b \neg {\rm E}d_1 = b
```
```math
\begin{eqnarray}
{\rm E}(d_1 \neg{\rm E}b) &=& {\rm E}d_1 \cap {\rm E}b\\
&=& \{x, y\} \cap \{x\}\\
&=& \{x\}\\
\end{eqnarray}\\
```
前層$A$の定義より、${\rm E}\alpha = \\{x\\}$となる$\alpha$は$b$のみなので、$b \neg {\rm E}d_1 = b$
したがって、$b \neg {\rm E}d_1 = d_1 \neg{\rm E}b$より両立

$c, d_1 : b, d_1$の場合と同様に両立



- $F_2 \equiv F_3$  
    + ${\rm E}F_2 = {\rm E}F_3 = X$
    + $F_1 \cup F_2$の場合と同様に、$F_2 \cup F_3$の元は互いに両立する

- $F_1 \not\equiv F_3$
    + ${\rm E}F_1 = {\rm E}F_3 = X$
    + ${\rm E}d_1= {\rm E}d_2$かつ$d_1 \not= d_2$より、$F_1 \cup F_3$の元は互いに両立しない


$F_1 \equiv F_2$ かつ $F_2 \equiv F_3$ で $F_1 \not\equiv F_3$なので、この$\mathfrak{F}$上の同値関係について推移律が満たされていない。
[WIP] Hanamiの環境構築（Herokuへのデプロイ、テスト実行環境のセットアップ）


最近知ったRuby製のフレームワーク「[Hanami](https://hanamirb.org/)」に興味が湧いたので簡単なツールを作成してみる。リポジトリは一旦Bitbucketに作成して進める。


## Herokuへのデプロイ

参考）[Hanamiで静的なWebページを作って、Herokuへデプロイしてみた](http://gamelinks007.hatenablog.com/entry/2017/10/09/235443)


```bash
# インストールと初期設定
gem install hanami
hanami new project_name
cd project_root_dir
bundle install --path=vendor/bundle

# サーバ起動
bundle exec hanami server -p 3000

# gem を幾つか追加
bundle add sqlite3 -g "development, test"
bundle add wdm -g "development, test"
bundle add listen -g "development,test"
bundle add puma -g "production"
bundle add pg -g "production"

# herokuにpush
heroku login
heroku apps:create app_name
git push heroku master
heroku run bundle exec hanami db migrate
```

# herokuの不具合対応
デフォルトで参照している下記２つの環境変数を設定してやる必要があった
一旦下記の内容で仮登録しておく

```
SMTP_HOST=localhost
SMTP_PORT=25
```

# テスティング
参考）[RubyのHanamiチュートリアルをやってみた](https://re-engines.com/2017/09/13/ruby%E3%81%AEhanami%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%92%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F/)

```
# test環境用のDBのセットアップ
HANAMI_ENV=test bundle exec hanami db prepare
```

一部自動生成されるテストコードのマッチャーの書き方がminitestの記法になっているので、適宜Rspecの書き方に修正する。
例えば下記のように。

```
-    response[0].must_equal 200
+    expect(response[0]).to eq 200
```

# CI環境の設定
参考）[Heroku CIを使ってみた
](https://qiita.com/mokamoto/items/ecd4d5bb52523b779b02)

Githubにリポジトリが存在する必要があったので今回は割愛。

# フロントエンド環境の設定
参考）　[2018-03-25
Hanami + Vue.jsでTODOアプリを作った](http://nantonaku-shiawase.hatenablog.com/entry/2018/03/25/233925)

詳細は後日追記
Angular 5（SPA）でGoogle Adsenseを利用する方法

## google adsense（レスポンシブ広告）追加について
レスポンシブ広告を新規に作成すると以下のようなものが提供され、通常はそのまま貼るはず。ですが、Angularで作成するSPAの場合、componentとして追加（ng generate component してcomponent.htmlに記載）しても上手く表示されなかったため、別の手段を探しました。


```
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- angular_xem_harvest_checker -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-38663342XXXXXXX"
     data-ad-slot="65476XXXXX"
     data-ad-format="auto"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
```

## ng2-adsense

こちらを利用します。
https://www.npmjs.com/package/ng2-adsense

###インストール

```
> npm install ng2-adsense
```

### 設定

- importsにモジュール、パラメータを追加。adClientとadSlotはレスポンシブ広告のコードを参照すればOK。

```~\app01\src\app\app.module.ts
    AdsenseModule.forRoot({
      adClient: 'ca-pub-38663342XXXXXXX',
      adSlot: 65476XXXXX
    }),
```

- index.htmlにadsense用のjs読み込み設定 

headタグの中に```<script async src=//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js></script>```を追加。


```~\app01\src\index.html
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>sample app</title>
  <base href="/">

  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
  <script async src=//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js></script>
</head>
```

- 表示したい箇所のhtmlに、以下を追加。

例えばapp.component.htmlに以下を記載。

```~\app01\src\app\app.component.html
<ng-adsense></ng-adsense>
```


以上で表示できるようになりました。
Vim備忘録

#Vimの基本的なコマンド
主に、自分が普段使っていなかったが使えるようにしたいコマンド集
コマンドラインでvimtutorと打つと読めるvimtutorを通読するのが、他のどんな記事を読むよりも初級の知識をカバーするのにうってつけだと思います。

それぞれのコマンドの由来と関連付けると覚えやすく、そういう意味で[こちら](http://haya14busa.com/vim-mnemonic/)が非常に詳しいです。

##移動
- [x] 表示上の行の移動　移動コマンドの前に`g`　
- [ ] 行先頭へ移動　`^`
- [ ] 上下の行の先頭へ移動　`+`, `-`
- [ ] 1行分画面上下　`ctrl + e, y`
- [x] 半画面上下　`ctrl + u`, `d` (up, down)
- [ ] 1画面上下　`ctrl + b`, `f` (back, forward)
- [ ] 段落毎上下　`{`, `}`

- [x] 前のカーソル位置へ移動　`ctrl + O` # older cursor positionでoらしい（[参考リンク](http://haya14busa.com/vim-mnemonic/)）
- [ ] 次のカーソル位置へ移動　`ctrl + I`
- [ ] 対応する括弧へ移動　括弧の上で`%`　#括弧の不一致によるデバッグ時に便利な操作

##挿入
- [x] 複数行の文頭へ同じ文字列を挿入　`0`で文頭へ→`ctrl-v`で矩形選択→`I`で挿入モード→編集後に`Esc`
- [x] 複数行の文末へ同じ文字列を挿入　`ctrl-v`で矩形選択→`$`で文末へ→`A`で挿入モード→編集後に`Esc`

##インデント操作
- [x] コマンドモードでのインデント追加　`>>`
- [x] コマンドモードでのインデント削除　`<<`
- [x] 挿入モードでのインデント追加　普通に`tab` # デフォルトではctrl-tでも可能だが、tmuxのプレフィックスキーに指定しているため不使用　`tab`および`ctrl-i`で代替可能
- [ ] 挿入モードでのインデント削除　`ctrl-d` # deleteキーを押す頻度が減ってめちゃ便利 
- [x] 複数行へインデント追加　`ctrl-v`での矩形選択後に`>`
- [x] 複数行のインデント削除　`ctrl-v`での矩形選択後に`<` # インデントの前にカーソルを置く必要あり


##置換
- [x] コマンドモードのまま文字を置換　変更箇所にカーソルを置いて`r`のあとに変更したい文字を入力
- [x] 複数文字　`R`→変更文字列→`Esc`

- [x] ある1行内の文字列の置換　`:s/OLD/NEW/g` (gがなければ行の最初の一つのみ、gがあれば全て　以下同様)
- [x] 指定行中の文字列置換　`:#,# s/OLD/NEW/g`
- [x] 文書全体の文字列置換　`:%s/OLD/NEW/g`
- [ ] 一箇所ずつ確認　`:s/OLD/NEW/gc`

##大文字小文字変換
- [ ] カーソル上の1文字を変換　`~`
- [ ] まとめて変換　`g~` # その後の操作で選択した範囲全てが対象。例えば`g~j`と打てばカーソルのある行とその下の行が全てに変換。`g~3j`と打てば3行まとめて置換。
`~`の代わりに`u`, `U`を使うとそれぞれ小文字、大文字変換。`g`の使い方は上記同様。

##削除
- [x] 単語の削除（次の単語まで）　`dw`
単語の削除（カーソル上の単語末まで）　
- [x] コマンドモードのまま　`de`
- [ ] 挿入モードに自動で変更　`ce`
- [x] 行末まで削除　 `d$`
- [ ] 削除後に挿入モードに変更　`c$`

##コピー&ペースト
オペレーターとしてのヤンク

- [x] 一単語ヤンク　`yw`
- [ ] 一行ヤンク　`y$`
- [ ] ヤンクした内容を矩形選択で複数行にペースト `ctrl+v → I` でブロック挿入モード後、`ctrl+r "` # なかなか覚えられん

##表示関連
- [x] 差分の表示　`:diffsplit　(ファイル名)`
- [x] 文字列の前方検索　`(検索対象にカーソルを置いて) #` #後方検索の方が直感的で無難
- [x] 文字列の後方検索　`(検索対象にカーソルを置いて) *`
- [ ] コードをPDF化　`:hardcopy > filename.ps`でポストスクリプト形式でエクスポートし、コマンドラインで`ps2pdf filename.ps`でPDF形式に変換
- [x] 行数非表示　`:set nonumber`　# スクリーン上でコピーするときなど
- [ ] 大文字/小文字に一括変換　矩形選択後に`U`/`u`
- [ ] 画面上でカーソルを一番上･中央･一番下へ移動　`H M L`
- [ ] ファイルエクスプローラーの表示　`:Vex　:Sex` （VとSはそれぞれ縦横分割）　

##コマンドの実行
- [ ] 外部コマンドを実行　`:!(コマンド内容)`

##ファイルの入出力
- [ ] 部分選択し保存　矩形選択の後に`:w $FIlLENAME`
- [ ] 外部ファイルの挿入　`:r $FILENAME`

##コマンド補完
- [ ] コマンドモードで`:`文字入力後に`ctrl + d`

##前回の挿入モードでの挿入文字列の繰り返しコマンド
- [　]　Ctrl-a

#.vimrcでの設定
色々と設定はしていますがとりあえず1点だけ

##マウススクロールによるカーソル移動
vimでのマウスの使い方については個人の好みの違いが大きいと思いますが、私はマウスのスクロールでカーソルを移動させる操作に慣れています。macのターミナルでは自然とそのような操作だったのですが、iTerm2へ切り替えた時にそのような挙動を示さなかったため、自分で設定する必要が生じました。
以下の通りに記載するとそれが可能になります(3行分ずつ上下するよう設定しています)。

```
noremap <ScrollWheelUp> 3k
noremap <ScrollWheelDown> 3j
```


参考文献
vimtutor（コマンドラインでvimtutorと打つと読める）
iOSエンジニアから見たJava8の文法についてまとめてみる

### Javaにおけるクラスの宣言

``` Student.java
class Student {
    // フィールドの宣言
    // String型のnameを宣言
    String name;
    // int型のscoreを宣言
    int score;
    // int型のクラス定数を宣言
    static final int MAX_SCORE = 100;
}

class Takashi {
    // static修飾子は クラス名.メンバー名 でアクセスできる
    int mathScore = Student.MAX_SCORE;
}

```

### クラスを定義する

``` SampleClass.java
public class SampleClass { // クラス名
    private String name = "Sample"; // フィールド名 (iOS:プロパティ)
    public String action() { // メソッド名
        return name + "> " + "Action";
    }
}
```

### クラスに指定できる修飾子について

|修飾子  |使い方  |
|---|---|
|public  |他のあらゆるクラスから参照可能  |
|指定なし  |同一パッケージ内のクラスから参照可能  |

### フィールド、メソッドに指定できる修飾子について

|修飾子  |使い方  |
|---|---|
|public  |他のあらゆるクラスから参照可能  |
|protected|子クラスおよび同一パッケージ内のクラスから参照可能  |
|指定なし  |同一パッケージ内のクラスから参照可能  |
|private  |自クラス内部のみアクセス可能  |


### その他のよく使う修飾子

### static修飾子

static修飾子はインスタンスを生成しなくとも呼び出せるメソッドやフィールドを定義できる。
static修飾子をつけたフィールドやメソッドを`クラスメンバ`と呼び、インスタンスを生成しなくても呼び出すことができる。
クラスメンバーの使い方は 「クラス名.クラスメンバ」で呼び出せる。

``` StaticTest.java
public class StaticTest {
    // クラスフィールド
    static String staticField = "World";

    // クラスメソッド
    static String staticMethod() {
        return "yes!";
    }

    // インスタンスフィールド
    String instanceField = "Hello";

    // インスタンスメソッド
    String instanceMethod() {
        return instanceField + " " + staticField + " " + staticMethod();
    }
}

```

使い方は

``` StaticTestMain.java
public class StaticTestMain {
    public static void main(String... args) {
        System.out.print(StaticTest.staticField);

        System.out.print(StaticTest.staticMethod());

        StaticTest.staticField = "Japan";
        System.out.print(StaticTest.staticField);

        StaticTest test = new StaticTest();
        System.out.print(test.staticField);
        System.out.print(test.staticMethod());
        System.out.print(test.instanceMethod());
    }
}
```


### final 修飾子

final 修飾子は変数を変更不可にするための修飾子。

宣言方法

```FinalTest.java
public class FinalTest {
    // クラス定数
    static final String GREETING_MESSAGE = "Hello";
}
```

使い方

``` StaticTestMain.java
public class StaticTestMain {
    public static void main(String... args) {
        System.out.print(FinalTest.GREETING_MESSAGE);
    }
}

```


非常に勉強になりました。
早くAndroid開発におけるデザインパターンまで勉強を進めたいと思います。

### 参考文献

　[JAVA本格入門 ~ Java本格入門 ~モダンスタイルによる基礎からオブジェクト指向・実用ライブラリまで](https://www.amazon.co.jp/Java%E6%9C%AC%E6%A0%BC%E5%85%A5%E9%96%80-%E3%83%A2%E3%83%80%E3%83%B3%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E3%81%AB%E3%82%88%E3%82%8B%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%83%BB%E5%AE%9F%E7%94%A8%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%BE%E3%81%A7-%E8%B0%B7%E6%9C%AC-%E5%BF%83/dp/477418909X/ref=sr_1_1?s=books&ie=UTF8&qid=1526715238&sr=1-1&keywords=JAVA%E6%9C%AC%E6%A0%BC%E5%85%A5%E9%96%80)
Template Pattern

# Template Pattern
Template method defines the steps to execute an algorithm and it can provide default implementation that might be common for all or some of the subclasses.

# Reference
- [tutorialspoint:TemplatePattern](https://www.tutorialspoint.com/design_pattern/template_pattern.htm)
- [journaldev:TemplatePattern](https://www.journaldev.com/1763/template-method-design-pattern-in-java)
- [geeksforgeeks:TemplatePattern](https://www.geeksforgeeks.org/template-method-design-pattern/)
- [github:TemplatePattern](https://github.com/iluwatar/java-design-patterns/tree/master/template-method)
Bridge Pattern

# Bridge Pattern
separate function and implement
decouple the abstraction from its implementation

# Reference
- [tutorialspoint:Bridge](https://www.tutorialspoint.com/design_pattern/bridge_pattern.htm)
- [journaldev:Bridge](https://www.journaldev.com/1491/bridge-design-pattern-java)
- [geeksforgeeks:Bridge](https://www.geeksforgeeks.org/bridge-design-pattern/)
- [github:Bridge](https://github.com/iluwatar/java-design-patterns/tree/master/bridge)
知ってもらいたい、エンドユーザーのこと


# はじめに

2018/03のことになりますが、社内勉強会にて、
「知ってもらいたい、エンドユーザーのこと」というタイトルで登壇しました。

内容は、上流工程（顧客折衝、要件定義、設計）を担当することが多かったので、
エンドユーザーとのコミュニケーションにフォーカスを置いたものとなっています。

本記事では、その資料公開と伝えたいポイントを絞ったことを書いていきます。

自分と同じ、顧客折衝を行なっている、システムエンジニアの方に参考になれば幸いです。

※「資料を見る→記事で内容細く」と見ていただけると腹落ちしやすいです。
　興味がありましたら、お付き合いください。

# 資料

URLは以下になります。

- [slideship - 知ってもらいたい、エンドユーザーのこと](https://slideship.com/users/@zucky/presentations/2018/03/JKjW3WAydsZf2hZAWpmwV/)

今回は、[slideship](https://slideship.com/)を使用してスライドを作成しました。
以下のようなメリットとデメリットがあります。

- メリット
    - googleslideなどと同じくWeb上でスライド作成〜公開まで可能
    - markdown形式による記述が可能、レイアウトを自動補完
    - 装飾等がタグベースで記述できて楽チン
- デメリット
    - 配置場所を自由に指定できない

凝ったスライドを作るのには向いていないかもしれませんが、
**スライドを作る時間がない方にはオススメ**です！

# 発表内容

では本題に入っていきます。
資料を参照される際は、以下のページをご参照ください。

- [エンドユーザーってどういう人？](https://slideship.com/users/@zucky/presentations/2018/03/JKjW3WAydsZf2hZAWpmwV/?p=12)

## エンドユーザーについて

自分が関わってきたエンドユーザーは以下のような方々です。

- 工場勤務
- **業界用語**を使う頻度が非常に高い
- 年齢層は20〜50歳台まで幅広い
- 若い人は**デジタル強い**、30〜50歳台の方は**デジタル苦手**

今回は、**業界用語**と**デジタル弱い強い**のことにフォーカスして、
説明していきます。

## 業界用語

資料だと[P13](https://slideship.com/users/@zucky/presentations/2018/03/JKjW3WAydsZf2hZAWpmwV/?p=13)〜[P21](https://slideship.com/users/@zucky/presentations/2018/03/JKjW3WAydsZf2hZAWpmwV/?p=21)のことになります。

IT業界に入ると、今まで知らなかったような言葉をよく使いますよね？
**コミット**とか**デプロイ**とか**バグ**とか・・・

**業界用語**とは、上記のような業界の専門用語を指します。

### 知ってもらいたいこと

知っておいてもらいたいこと、
それは**「エンドユーザーの業界用語を理解する」**ということです。

先ほど記載したIT業界の専門用語である、「**コミット**」「**デプロイ**」「**バグ**」。
新規の方はおいておいて、1年以上経験している方でこういった専門用語を知っていないと、

- **なんでこんな言葉も知らないんだ？**
- **勉強不足（経験不足）だな・・・**

という気持ちから、**不安**が生じることがあると思います。

エンドユーザーと話す際も同じです。

エンドユーザーが話す専門用語が理解できないと、
**任せてよいのか？**等の気持ちから**不安**が生じ、
**エンドユーザーが話にくい→要件の話漏れ**という弊害も生まれることがあります。

そのため、**「エンドユーザーの業界用語を理解する」**ということが大切になります。

どうやって業界用語を学べばいいの？っていうことは、
[資料のこちらのページ](https://slideship.com/users/@zucky/presentations/2018/03/JKjW3WAydsZf2hZAWpmwV/?p=19)に記載していますので、興味があればご覧ください。

## デジタルの強い弱い 
資料だと、[P22](https://slideship.com/users/@zucky/presentations/2018/03/JKjW3WAydsZf2hZAWpmwV/?p=22)〜[P27](https://slideship.com/users/@zucky/presentations/2018/03/JKjW3WAydsZf2hZAWpmwV/?p=27)のことになります。

デジタル＝PCやタブレットの操作のことを指します。
ざっくりですが、

- デジタル弱い＝PCやタブレットの操作がおぼつかない（キーボードを人差し指で打つ感じ）
- デジタル強い＝PCやタブレットの操作に問題ない（キーボードがパチパチ打てる感じ）

と解釈いただければと思います。

### 知ってもらいたいこと

知っておいてもらいたいこと、
それは**「操作をテンプレート化する」**ということです。

システムの導入は、紙媒体であった情報をデータ化するというのがスタンダードな目標ですが、
**同時にエンドユーザーに対してストレスを感じさせない**ということも大切です。

エンドユーザーに不満を蓄積させてしまうと、
**クレームの発生→次案件への繋がりに影響する**といったデメリットが発生してしまいます。

特にPCやタブレットの操作がおぼつかない方は、
入力や操作が多いとストレスを感じやすいです。

そのため、**「操作をテンプレート化する」**ことが大切になります。

どうやって業界用語を学べばいいの？っていうことは、
[資料のこちらのページ](https://slideship.com/users/@zucky/presentations/2018/03/JKjW3WAydsZf2hZAWpmwV/?p=26)に記載していますので、興味があればご覧ください。

# まとめ

いかがだったでしょうか？

顧客折衝は大変だけど、
エンドユーザーのニーズを満たせた時は何とも言えない嬉しさが込み上げてきますよね。
（プロジェクトの利益をあげることが大前提ですが・・・）

これからも頑張りましょう！
Adapter Pattern

# Adapter Pattern
- Adapter pattern works as a bridge between two incompatible interfaces.
- have two Patter
- 一つのインタフェースの機能だと不十分で他のインタフェースを使いたい時（使いたいメソッドが二つのインタフェースに分散している時など）

# Reference
- [tutorialspoint: Adapter](https://www.tutorialspoint.com/design_pattern/adapter_pattern.htm)
- [journaldev: Adapter](https://www.journaldev.com/1487/adapter-design-pattern-java)
- [geeksforgeeks: Adapter](https://www.geeksforgeeks.org/adapter-pattern/)
- [github: Adapter](https://github.com/iluwatar/java-design-patterns/tree/master/adapter)
Dockerのリポジトリのタグ一覧を取得するスクリプト


- [こちらのURL](http://tinyurl.com/y8eglt47)の内容をほぼそのまま持ってきたものです
- 普通に使えるのでシェアしようと思いまして

## こんなときに
- 発端は訳あってGoの`v1.6.2`の環境を作らないといけなかったんだけど、[本家のリポジトリ](https://hub.docker.com/_/golang/)を見ても、1.9までのタグしか見つからなかった
- 勢いで`docker run -d golang:1.6.2`で取ってこれるか試してみてもよかったけど、いきあたりばったりなのもどうかと思い、探していたらすごくいいスクリプトが見つかりました

## 使い方
- 以下のスクリプトを作ります（`dockertags.sh`と命名）

```sh
#!/bin/bash

if [ $# -lt 1 ]; then
cat << HELP

dockertags  --  list all tags for a Docker image on a remote registry.

EXAMPLE: 
    - list all tags for ubuntu:
       dockertags ubuntu

    - list all php tags containing apache:
       dockertags php apache

HELP
fi

image="$1"
tags=`wget -q https://registry.hub.docker.com/v1/repositories/${image}/tags -O -  | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | tr '}' '\n'  | awk -F: '{print $3}'`

if [ -n "$2" ]; then
    tags=` echo "${tags}" | grep "$2" `
fi

echo "${tags}"
```

- 以下のコマンドを実行します（PATHは各自で貼ってください）

```sh
$ chmod +x dockertags.sh
$ mv dockertags.sh /usr/local/bin/dockertags
```

- あとは以下のコマンドでTagのリストが見れるようになりました！便利！

```
# golangのタグで、1.6.2が入っているものだけをリストアップ
$ dockertags golang 1.6.2
```
ghq×pecoでGoのプロジェクトはどう扱うかの解決案

# はじめに

[ghq, peco, hubで快適Gitライフを手に入れよう！](https://qiita.com/itkrt2y/items/0671d1f48e66f21241e2)の記事で紹介されている設定をそのまま使わせていただいてましたが、Goプロジェクトに関して以下の課題がでました。

* Goプロジェクトは`go get`で`$GOPATH`以下に落とすので直接ghq管理にならないのでどうするか
* ghq.rootにGoプロジェクトとその他プロジェクトの2種類置いたときpecoにはどう渡すか

下記の設定で解決しました。

# 設定した内容とその結果

`$HOME/.gitconfig`に以下を追記

```.gitconfig
[ghq]
    root = ~/.ghq
    root = ~/go/src # Replace your $GOPATH/src
```

`.bashrc` or `.zshrc`に下記のエイリアスを追記

```.bashrc
alias gogp='cd $GOPATH/src/$(ghq list --full-path | grep $GOPATH | cut -d "/" -f 6,7,8 | peco)'
alias gp='cd $(ghq root)/$(ghq list --full-path | grep -v $GOPATH | cut -d "/" -f 5,6,7 | peco)'
alias hgp='hub browse $(ghq list | peco | cut -d "/" -f 2,3)'
```

その結果、Goプロジェクトとその他言語プロジェクトの両方ともghq,peco,hubで扱える快適ライフが手に入りました！

![gp.gif](https://qiita-image-store.s3.amazonaws.com/0/91562/1b306bb2-ceef-e151-8531-ac55c98d388e.gif)


# 解説

## .gitconfig設定

[ghqのREADME](https://github.com/motemen/ghq)に書いてあるように

> Configuration uses 'git-config' variables.
> ghq.root
> The path to directory under which cloned repositories are placed. Defaults to ~/.ghq.
> This variable can have multiple values. 

とのことなのでghqはgit-configの設定を参照するプログラムで`ghq.root`には複数設定できます。ここに`$GOPATH/src`を追記しました。

## エイリアス設定


ここではGoプロジェク用エイリアス(`gogp`)とそれ以外のエイリアス(`gp`)でpecoへの連携を分けました。
`gogp`は`$GOPATH`以下のプロジェクトのみ表示するようにし、`gp`はGoプロジェクト以外の`ghq get`で落としたレポジトリを表示します。

`hub browse`でGitHubを開くエイリアスに関しては[ghq, peco, hubで快適Gitライフを手に入れよう！](https://qiita.com/itkrt2y/items/0671d1f48e66f21241e2)の記事と同じ設定でどのレポジトリページも開けます。
railsで複数のRecordをUpdateするrake taskを作る(新カラム作成時など)

#背景

新しいカラムを追加したが、全てのRecordに同じ値を入れたいわけでもないので`update_all`が使えない。でも全部のRecordを1個ずつ入れるとめちゃくちゃSQLが発行される。

何かいい方法がないか。

#目標設定

既にUserというDBがあって、新しいカラム`sub_id`を追加したとする。

ベタにRakeを書くと以下のようになる。（somethingが一定値の場合は`User.where(条件).update_all(sub_id: <something>)`で済むはずなので、whereが少ない場合は、これを使うのがベスト）

```
User.all.each do |u|
  u.sub_id = <something>
  u.save
end
```
これだと全てのUserに対してFor文が回ってUpdateするのですごいことになる。

# SQLを書いてまとめてUpdate

(id, sub_id)ペアが`(1530, 0), (1531, 1), (1532, 2), (1533, 3), (1534, 4), (1535, 5), (1536, 6), (1537, 7), (1538, 8)`となるものをUpdateする場合。

```sql:test.sql
update users as u set
  sub_id = u2.sub_id
from (values
  (1530, 0), (1531, 1), (1532, 2), (1533, 3), (1534, 4), (1535, 5), (1536, 6), (1537, 7), (1538, 8)
) as u2(id, sub_id)
where u2.id = u.id;
```

```
psql -U <username> -d <db_name> -a -f test.sql
```

で、Recordが更新されていることを確認。

# rakeタスクを作成

今回はAdminが管理するUser(has_many :users)の中でのidを振るというものを例に試してみる

```lib/tasks/update_user_sub_id.rake

namespace :db do
  desc "fill sub_id of users"
  task fill_user_sub_id: :environment do
   Admin.all.each do |a|
      a.users.each_with_index do |u, i|
        u.sub_id = i
      end
      a.save
    end
  end

  task fill_user_sub_id_fast: :environment do
    con = ActiveRecord::Base.connection
    batch_size = 1000
    id_sub_id_pairs = []
    Admin.all.each do |a|
      a.users.order(:id).each_with_index do |u, i|
        id_sub_id_pairs.push "(#{u.id}, #{i})"
        if id_sub_id_pairs.length >= batch_size
          update_sub_id(con, id_sub_id_pairs)
          id_sub_id_pairs = []
        end
      end
    end
    if id_sub_id_pairs.length > 0
      update_sub_id(con, id_sub_id_pairs)
      id_sub_id_pairs = []
    end
  end
end

def update_sub_id(con, id_sub_id_pairs)
  values = id_sub_id_pairs.join ','
  sql = 'UPDATE series AS s '\
        'SET sub_id = s2.sub_id '\
        "FROM (VALUES #{values}) "\
        'AS s2(id, sub_id) '\
        'WHERE s2.id = s.id;'
  con.execute(sql)
end

```


# 速さ比較

```
bundle exec rake db:fill_user_sub_id
...
       user     system      total        real
  3.610000   0.300000   3.910000 (  4.860296)
...
bundle exec rake db:fill_user_sub_id_fast
...
       user     system      total        real
  0.490000   0.080000   0.570000 (  0.757211)
...
```

で合計1000件ほどのRecordで更新を比較してみた。
fastではbatch_sizeを500にしたのでSQLは2個のみで断然速かった
さくらVPS から AWS Elastic Beanstalk + RDS にWebサービスを移転したときにしたこと

http://denkinovel.com/ をずっとさくらVPSで動かしていたが、たまになぜか異常にレスポンスが遅い、記憶力の減退からさくらVPSでのサーバーの管理ができなくなってきた、などの理由でAWSに移転した。

AWSをインターンシップでよく使うようになったので、勉強がてら AWS Elastic Beanstalk + RDS の構成にした。

## 構成

- Rails v4.2.10 
- Puma v3.11.4
- PostgreSQL RDS が用意してくれるやつ
- Ruby 2.5.1-p57

## DB dump => restore

VPSの旧サーバーの PostgreSQL に入っていたデータを pg_dump で取ってくる。

```shell
$ pg_dump -U myapp -Fc myapp_production > myapp_production_db.dump
```

で、ダンプしたデータを、 AWS RDS で読み込む。

```shell
$ pg_restore -h aaaaaa.bbbbbbbb.us-west-1.rds.amazonaws.com -p 5432 -d myapp_production -U myapp myapp_production_db.dump
```

このへんは公式ドキュメントを読んだらわかる。 https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/PostgreSQL.Procedural.Importing.html

ただなぜかデータ移行とデプロイ後に *(ActionView::Template::Error) "Unknown primary key for table collections in model xxx"* のエラーが Rails で発生するようになった。

調べたところ、この人たちが似たような問題を抱えていた。 https://stackoverflow.com/questions/18056162/getting-unknown-primary-key-for-table-while-the-id-is-there

Rails ではデフォルトで primary_key は id のはずなのだが、なぜかそれが設定されていない？

```ruby:user.rb
class User < ActiveRecord::Base
  self.primary_key = :id
```

考えるのが面倒になったので、こんな感じに、各 ActiveRecord::Base 継承クラスに `self.primary_key = :id` と明示的につけたところ、動いた。

## デプロイ

Elastic Beanstalk はリポジトリのサイズ512MB までしか扱えない。 Denkinovel はサービスの性質上、大量の画像と音楽ファイルをリポジトリ内に持っていた。このままではデプロイできない！

そこで、 asset_sync を使って手元の開発機 MacBookPro で `rake assets:precompile` をしてしまうことで assets を S3 にアップロードしたうえで、本番環境のサーバにはアップロードしないようにした。本番環境では assets へのアクセスはすべて S3 （CloudFront を使うので実際はCloudFront）に向くので本番環境に assets がなくても問題ない。ただし、　`public/assets/.sprockets-*-manifest.json` だけは本番環境にアップロードしておかないといけない。もし `public/assets/.sprockets-*-manifest.json` がないと production 環境で Rails が asset_url などを変換する際に `/assets/xx.jpg` などではなく `/images/xx.jpg` に変換してしまい、ファイルが見つからくなってしまう。

具体的には以下のことをした。

.gitignore で public 内の `public/assets/.sprockets-*-manifest.json` 以外のファイルをすべて無視する。

```.gitignore
public/assets/*
!public/assets/.sprockets-manifest-*.json

app/assets/audios/*
app/assets/images/*
```

`asset_sync`を使い、手元で precompile して S3 に assets はすべてアップロードする

```shell
$ RAILS_ENV=production bundle exec rake assets:precompile
```
これで　public/assets に画像や音楽ファイルがプリコンパイルされて入るが、 git はそれを管理しない。ただし .sprockets-manifest-*.json だけは git が管理しているので、その差分は git commit する必要がある。

```shell
$ git add .
$ git commit
```

で、 git に .sprockets-manifest-*.json を記録させたあと

```shell
$ eb deploy
```

でデプロイするようにした。


## 思ったこと

もう Rails 使うのやだ。
Backlogの予定時間と実績時間の合計値を計算する。（JavaScript）

## 背景

Backlogで工数管理をしますが、
予定時間、実績時間の合計を出すのはExcelにコピペして集計...が面倒です。

ブラウザ上で表示されている課題の合計を表示するのは標準搭載して欲しいです...がないものはしょうがない

## 目的

課題の予定工数、実績工数を表示する。
よし、やっていくぞ！

## Chrome開発者ツールのコンソールタブを開く

`Command` + `option` + `i` で開発者ツールが表示されます。
右クリックして検証でもokです。

コンソールタブでは普通にJavaScriptのコードを実行できます。

<img width="355" alt="スクリーンショット 2018-05-19 15.43.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/52879/618439d5-115a-4936-202d-cd4bdac3428b.png">

BacklogではJqueryの1.12.4が読み込まれてます。このjQueryも使用できます。

## 合計値を計算

Chrome開発者ツールのConsoleタブに計算式をコピペする。

```js
var eSum = 0, aSum = 0;
$('tr:not(.js-child-issue-row) > .cell-estimated-hours').each(function(){eSum += +$(this).text()});
$('tr:not(.js-child-issue-row) > .cell-actual-hours').each(function(){aSum += +$(this).text()});
'予定時間： ' + eSum + ' 実績時間： ' + aSum
```

- 通常課題、親課題の時間の合計値を表示
- 子課題の時間は対象外

## 合計値を計算（子課題を含む）

Chrome開発者ツールのConsoleタブに計算式をコピペする。

```js
var eSum = 0, aSum = 0;
$('.cell-estimated-hours').each(function(){eSum += +$(this).text()});
$('.cell-actual-hours').each(function(){aSum += +$(this).text()});
'予定時間： ' + eSum + ' 実績時間： ' + aSum
```

- 通常課題、親課題、子課題の時間の合計値を表示

## 備考

<img width="691" alt="スクリーンショット 2018-05-19 15.49.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/52879/65df3c18-6b03-6011-13b9-e2a09d77248c.png">

表示結果はこんな感じです。
Excelにコピペするより比較的楽になりましたが、標準搭載して欲しいです...。

[予定時間と実績時間を集計したい](http://feedback.backlog.jp/forums/140671-backlog-%E3%81%B8%E3%81%AE%E8%A6%81%E6%9C%9B-%E5%95%8F%E9%A1%8C%E3%81%AE%E5%A0%B1%E5%91%8A/suggestions/3425029-%E4%BA%88%E5%AE%9A%E6%99%82%E9%96%93%E3%81%A8%E5%AE%9F%E7%B8%BE%E6%99%82%E9%96%93%E3%82%92%E9%9B%86%E8%A8%88%E3%81%97%E3%81%9F%E3%81%84)

要望が多いと検討してくれるそうなので、ガンガン投票しましょう！！！

## ブックマークレット

@gc373 さんからブックマークレットにした方が良いとアドバイスいただきましたので、ブックマークレット用のコードを用意しました。

ブックマークレットの登録は [ブックマークレットの登録方法 - Qiita](https://qiita.com/AQRiL_1132/items/b5f9040ccb8cbc705d04)の記事が参考になります！

### 合計値を計算

```js
javascript:(function(){var eSum = 0, aSum = 0;$('tr:not(.js-child-issue-row) > .cell-estimated-hours').each(function(){eSum += +$(this).text()});$('tr:not(.js-child-issue-row) > .cell-actual-hours').each(function(){aSum += +$(this).text()});console.info('予定時間： ' + eSum + ' 実績時間： ' + aSum);})();
```

### 合計値を計算（子課題を含む）

```js
javascript:(function(){var eSum = 0, aSum = 0;$('.cell-estimated-hours').each(function(){eSum += +$(this).text()});$('.cell-actual-hours').each(function(){aSum += +$(this).text()});console.info('予定時間： ' + eSum + ' 実績時間： ' + aSum)})();
```
C#でbyte出力する (16進、2進、10進）

何番煎じかわかりませんが、自分用メモも兼ねて。
VisualStudio Codeで動作確認済みです。

```C#
using System;

namespace ConsoleApp_DotNetCore
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[] bytes;
            int val = 65534;

            Console.WriteLine("--- int convert to byte ---\n");
            Console.WriteLine("int value = {0}",val);

            string text = "";
            string tmp = "";

            Console.WriteLine("= HEX = = = = = = = = =");

            bytes = BitConverter.GetBytes(val);
            foreach(byte b in bytes)
            {
                text = string.Format("{0,3:X2}", b);
                Console.WriteLine(text);
                tmp = text + tmp;
            }
            Console.WriteLine("\n" + tmp + "\n");


            Console.WriteLine("= BIN = = = = = = = = =");
            text = "";
            tmp = "";

            bytes = BitConverter.GetBytes(val);
            foreach (byte b in bytes)
            {
                String s = Convert.ToString(b, 2);
                text = s.PadLeft(8,'0');
                Console.WriteLine(text);
                tmp =" "+ text + tmp;
            }
            Console.WriteLine("\n" + tmp + "\n");


            Console.WriteLine("= DEC = = = = = = = = =");
            text = "";
            tmp = "";

            bytes = BitConverter.GetBytes(val);
            foreach (byte b in bytes)
            {
                Console.WriteLine(b.ToString());
                tmp = " " + String.Format("{0,4}",b) + tmp;
            }
            Console.WriteLine("\n" + tmp + "\n");


            Console.WriteLine("キー入力すると終了します");
            Console.ReadLine();

        }
    }
}

```

実行結果

```
--- int convert to byte ---

int value = 65534
= HEX = = = = = = = = =
 FE
 FF
 00
 00

 00 00 FF FE

= BIN = = = = = = = = =
11111110
11111111
00000000
00000000

 00000000 00000000 11111111 11111110

= DEC = = = = = = = = =
254
255
0
0

    0    0  255  254

```