OmniAICreator/Qiita-1.07M huggingface dataset:
Javaのお勉強 ～その4～ リテラル

# 1. はじめに
今回は「リテラル」について。
あと、リテラルと合わせた型についてもお話します。

リテラルについては、[Javaのお勉強 ～その2～ 変数](https://qiita.com/koukonko/items/9933ae0b50100e585581)の記事にも出てきたのを覚えている方がいるかも。

# 2. リテラルとは
リテラルについて説明を入れておきます。

リテラルとは、ソースコードに記述してある値のことを言います。
そして、そのリテラルは定数であり、変更するためにはソースコードを直接書き換えなければいけないです。

例を挙げると、以下のソースコードの「1」「'A'」「3.14159265」のことを指します。

```java:Main.java
public class Main {
	public static void main(String[] args) {

		int number = 1;
		char ch = 'A';
		double pi = 3.14159265;

	}
}
```

# 3. 型に合わせたリテラル
次は、型に合わせたリテラルを紹介します。
また、それに合わせた型に代入のソースコードものせます。 

byte , short は、基本的に int 型と記述方法は変わらないので、int だけにします。 

```java:Main.java
public class Main {
	public static void main(String[] args) {

		// 整数 int
		int integerValue;
		// 通常の整数
		integerValue = 100;

		// 整数 long
		long longValue;
		// long では、l または L をつける
		longValue = 1000l;

		// 浮動小数点数 float
		float floatValue;
		// float では、f または F をつける
		floatValue = 655.36f;

		// 浮動小数点数 double
		double doubleValue;
		// double では、d または D をつける
		doubleValue = 512.256d;

		// 文字 char
		char characterValue;
		// 文字は''(シングルクォーテーション)で囲う
		characterValue = 'A';

		// 真偽値 boolean
		boolean booleanValue;
		// true または false のみ代入可
		booleanValue = true;

		// 文字列 String
		String stringValue;
		// 文字列は""(ダブルクォーテーション)で囲う
		stringValue = "Hello!!";
	}
}
```
代入時の右辺がリテラルとなります。
実は、他にも書き方などはあるのですが、とりあえずこれだけ覚えていれば十分かなと思います。 

# 4. n進数のリテラル
一般的に 整数のリテラルには、2進数、8進数、10進数、16進数と4つの記述方法があります。

10進数は、私たちが通常使う記述の仕方ですね。
0 ～ 9 までの数字を使って表現します。

問題は、10 進数以外です。

## 4.1. 2進数のリテラル
2進数は、0 と 1 の数字のみで表現します。
Java は、2 進数のリテラル値を記述するときは、頭に「0b」をつけて区別します。
「0b11001」のようなのが、2進数です。 

10進数と2進数の簡単な一覧を載せておきます。

| 10進数 | 2進数 |
|:-:|:--|
|0|0b0|
|1|0b1|
|2|0b10|
|3|0b11|
|4|0b100|
|5|0b101|
|6|0b110|
|7|0b111|
|8|0b1000|
|9|0b1001|
|10|0b1010|
|11|0b1011|
|12|0b1100|
|13|0b1101|
|14|0b1110|
|15|0b1111|
|16|0b10000|

## 4.2. 8進数のリテラル
8進数は、0 ～ 7 までの数字を使って表現します。
Java は、リテラル値として記述するときは、頭に「0」をつけることで、8進数だと区別することが出来ます。
「0115」 のようにすれば、8 進数です。

10進数と8進数の簡単な一覧を載せておきます。

| 10進数 | 8進数 |
|:-:|:--|
|0|00|
|1|01|
|2|02|
|3|03|
|4|04|
|5|05|
|6|06|
|7|07|
|8|010|
|9|011|
|10|012|
|11|013|
|12|014|
|13|015|
|14|016|
|15|017|
|16|020|

## 4.2. 16進数のリテラル
次は、16進数です。
16進数は、0 ～ f までの数字と文字を使って表現します。
コンピュータに触れていると16進数は良く使うものですので、覚えておきましょう。

リテラル値として記述するときは、頭に「0x」をつけます。

10進数と16進数の簡単な一覧を載せておきます。

| 10進数 | 16進数 |
|:-:|:--|
|0|0x0|
|1|0x1|
|2|0x2|
|3|0x3|
|4|0x4|
|5|0x5|
|6|0x6|
|7|0x7|
|8|0x8|
|9|0x9|
|10|0xa|
|11|0xb|
|12|0xc|
|13|0xd|
|14|0xe|
|15|0xf|
|16|0x10|

# 5. おわりに
リテラルはソース上ちょこちょこ出てきます。
リテラルは出来るだけ、変数（又は定数）に代入してから使うことがおすすめです。ソースの可読性に関わったりするので。

~~ちなみに「ソース上の生の値」って私は呼んでます。ちゃんと言葉あるのに使わないなんてダメですね 笑~~

それと、n進数は数学的ですね。
ちょっと初心者の方には難しいはず。~~8進数は嫌いです~~

これぐらいにして、、と、、

次は「定数」についてのお話にします。

次回 →「[Javaのお勉強 ～その5～ 定数](https://qiita.com/koukonko/items/57c7f912f7a541178ab6)」
Javaのお勉強 ～その3～ 型

# 1. はじめに
今回は、Javaの「型」について説明していきます。

[前回](https://qiita.com/koukonko/items/9933ae0b50100e585581)のお話の途中に、「整数」という単語をチラっと出しました。
今回は、この単語に関わるお話になります。 

# 2. 型
Java では、変数に型というものがあります。
[前回](https://qiita.com/koukonko/items/9933ae0b50100e585581)では、

int number;

と書きましたが、int が型になります。(numberは変数名ね)
この int という型は、整数を扱う場合に使う、箱のようなものになります。 

他にも、いろいろと型が存在しますので紹介します。 

## 2.1. プリミティブ型
Java で、予約語として定義された型の一群。
文字、整数、浮動小数点数などを保持してる箱たちです。色々な大きさの箱があると想像してもらえるといいかな。
浮動小数点数とは、5.34 や 2.887 などのような小数を扱う時に使われる数です。 

基本、整数を使いたい場合は、int を、
浮動小数点数を使いたい場合は、double を指定しておくのが定石かと思います。 

### 2.1.1. 整数
| 型名 | 説明 |
|:-:|:--|
|byte|-128 ～ 127|
|short|-32768 ～ 32767|
|int|-2147483648 ～ 2147483647|
|long|-9223372036854775808 ～ 9223372036854775807|

### 2.1.2. 小数
| 型名 | 説明 |
|:-:|:--|
|float|32bit 単精度浮動小数点数|
|double|64bit 倍精度浮動小数点数|

### 2.1.3. 文字
| 型名 | 説明 |
|:-:|:--|
|char|1文字のみ|

### 2.1.4. 真偽値
| 型名 | 説明 |
|:-:|:--|
|boolean|true 又は false|

## 2.2. オブジェクト型
これは、クラスというものを型として使用した時などに使う型です。
クラスについては後々の記事で触れます。
豊富にありますし、自分で作成することもできる型なので、1つだけ紹介しておきます。 

### 2.2.1. 文字列
| 型名 | 説明 |
|:-:|:--|
|String|文字列を扱う|

この String という型は、複数の文字を文字列として扱える非常に便利屋です。
（文字と文字列は異なるものなので注意！！）
また、この String は、Java でも特別なオブジェクト型で、上記のプリミティブ型のような感覚で使えるメリットがあります。 

# 3. おわりに
今回、特に覚えて頂きたいのは、
int , double , char , boolean , String
以上の5つです！よく使うものですし、、

プログラミングすることが無くて申し訳ないです。
それと、記事に関しては極力、短めにしたい...と思っています。

次回は、「リテラル」についてお話しようかと。

次回 →「[Javaのお勉強 ～その4～ リテラル](https://qiita.com/koukonko/items/3331f6abe8db18d55bcc)」
macOS High SierraでのBoot Campには注意

macOS High SierraからファイルフォーマットがAPFSというものに変わり

```
システム環境設定 > 起動ディスク > Boot Campのディスクを選択して再起動
```
という起動方法が使えないようです。
方法としては一度シャットダウンしてから起動をするときにoptionキーを押し続けるとStartup Managerというのが起動して起動ディスクを選べます。
https://support.apple.com/en-asia/HT208123

ちなみに私の環境ではVmware Fusion8からも以下のエラーを吐いてBoot Campディスクが起動できなくなりました・・・。
（macOS High　Sierraに対応したと謳っているFusion10に課金すれば治るのだろうか・・・・・・・・・）
【2018/10/04】
Fusion10に課金したら使えるようになりました。

```
ディスク [hogehoge.vmdk] を開くことができないか、または一部のスナップショットがこのディスクに従属しています。
モジュール [Disk] のパワーオンに失敗しました。
仮想マシンの開始に失敗しました。
```

参考
https://applech2.com/archives/20170926-how-to-switch-mac-and-windows-on-apfs.html
Rails 5: webpacker 3: vue 2: typescript: Vue コンポーネントを .vue ファイルにまとめずにクラスベースにする

あれこれ試行錯誤したので記録を残しておく。

やりたいこと
----------------

次の２つを同時に実現するには、少し工夫が要る。

### .vue ファイルにはまとめたくない

`.vue` に `type="ts"` で埋め込んだ TypeScript のコードは、VS Code ([Vetur](https://github.com/vuejs/vetur)) 上の補完や [tsfmt](https://github.com/vvakame/typescript-formatter) によるコードの整形が（まだ）貧弱だったり効かなかったりするので、ロジックは `.ts` に書きたい。

### コンポーネントはクラスベースにしたい

コードの見通しがよくなる（＋補完が効く）ので、コンポーネントは [vue-class-component](https://github.com/vuejs/vue-class-component) を使ってクラスベースで記述したい。

問題
-------

`<template>` セクションがないので、代わりのデータを用意し外から指定する必要がある。

### 方法１．べた書きする

```typescript
@Component<MyComponent>({
  template: '<div>hello</div>'
})
```

テスト目的ならともかく、論外である。

### 方法２．インラインテンプレートを使う

元の `html` ファイルに埋め込む。

```html
<script type="text/x-template" id="my-component">
  ...
</script>
```

```typescript
@Component<MyComponent>({
  template: '#my-component'
})
```

お手軽でよいのだが、webpacker 外のリソースになるので `webpack-dev-server` によるライブリロードが効かないのが少し不便。

### 方法３．外部の html ファイルを読む

外部の `.html` ファイルをうまく読む仕組みが必要となる（css に関しては割愛）。こちらの方法を説明する。

必要なもの
---------------

	yarn add vue-class-component
	yarn add vue-template-compiler-loader

webpacker の設定
-------------------------

### config/webpack/custom.js

新しく作成する。名前はなんでもよいが `custom.js` としている例が多いので倣う。

テンプレート文字列を外部から指定するには [コンパイラを含むビルド版の Vue](https://jp.vuejs.org/v2/guide/installation.html) を読み込む必要があるが、.ts に直接 `vue.esm.js` を import しても `vue-class-component` が[対応していない](https://github.com/vuejs/vue-class-component/issues/206)のでコンパイルが通らない。

```typescript
import Vue from 'vue/dist/vue.esm.js'    // 今回の例では通らない
```

そこで、`custom.js`に次のようなエイリアスを登録する。

```javascript
module.exports = {
  resolve: {
    alias: {
      'vue$': 'vue/dist/vue.esm.js'
    }
  }
}
```

### config/webpack/loaders/html.js

`.html` ファイルのローダを新しく作成する。名前はなんでもよいがひとまず `html` とした。

```javascript
module.exports = {
  test: /\.html(\.erb)?$/,
  use: [{
    loader: 'vue-template-compiler-loader'
  }]
}
```

### config/webpack/environment.js

適当な場所にそれぞれ追記する。

`custom.js` を読み、設定をマージする。

```javascript
const customConfig = require('./custom')
environment.config.merge(customConfig)
```

`html` ローダを追加する。

```javascript
const html = require('./loaders/html')
environment.loaders.append('html', html)
```

### メモ

`config/webpacker.yml` の `extensions` セクションに `.html` を加える必要はないようだ。

アプリのコード
-------------------

キモは `require()` の型指定をしておくこと。

```typescript
import Vue, { VNode } from 'vue'

declare function require(x: string): VueTemplateCompilerLoader

interface VueTemplateCompilerLoader {
  render: () => VNode
  staticRenderFns: Array<() => VNode>
}
```

`VueTemplateCompilerLoader ` 型は私が適当に定義したオマケである。もし `require()` で別のタイプの何かを読み込むのなら単純に `any`  で受けることになるだろう。

```typescript
declare function require(x: string): any
```

実ファイルのパスを指定しデータを得る。
`render` と `staticRenderFns` をそれぞれ渡す。

```typescript
const myComponent: VueTemplateCompilerLoader = require('./my_component.html')

@Component<MyComponent>({
  render: myComponent.render,
  staticRenderFns: myComponent.staticRenderFns
})

export default class MyComponent extends Vue {
  ...
}
```

以上でコンパイルが通るはずだ。

See Also
--------

* https://qiita.com/kaorun343/items/425fdfe55b81437cdb6a
Cognos Configurationの設定変更をGUIの無い環境で実施する

#概要
Cognos Analytics や Cognos BI で、システムの構成変更を行う場合、Cognos ConfigurationというGUIツールを用いて行いますが、環境によってはサーバーへのGUIアクセスができず、全てコマンドで対応すべし、という環境があります。

Cognos Configurationとは、こんなツールですね。
UnixやLinux環境では、\<CognosInstall>/bin64/cogconfig.sh で起動できます。
![001.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/2e569d09-7d3d-895b-5a0b-ececf84873de.jpeg)

この変更をする時に、GUIを使わずに実施する方法を紹介しておきます。

#手順
基本的に、Cognos Configurationの設定を変更した場合は、設定反映にはCognosの再起動が必要なので、Cognosの停止から入ります。
Cognos Analytics @ Linuxでの手順で紹介します。

**Cognos停止**
以下のコマンドでCognosを停止します。
/opt/ibm/cognos/analytics/bin64/cogconfig.sh -stop
※JAVA_HOMEがきちんと設定されている事が前提です。
export JAVA_HOME=/opt/ibm/cognos/analytics/jre

**Cognos Configurationの設定内容をファイルにエクスポート**
Cognos Configurationの設定は、/opt/ibm/cognos/analytics/configuration/cogstartup.xmlファイルに保管されていますが、ユーザー名やパスワードなどは暗号化されているため、設定を変更するためには、一回暗号化されていないファイルに設定を保存する必要があります。
以下のコマンドでCognos Configurationの設定を非暗号化してエクスポートします。
/opt/ibm/cognos/analytics/bin64/cogconfig.sh -e ../configuration/backup.xml

**設定内容の変更**
configurationフォルダに生成したbackup.xmlファイルを、vi等で開いて変更します。
ファイルは概ね、Cognos Configurationの上から順に設定が記載されているので、頑張って読み解きます。
例えば、最初の画面イメージであったWebsphere Liberty Profileの最大メモリーMB = 4096の設定値は、以下の箇所を変更します。

```html
          <crn:parameter name="dispatcherMaxMemory">
            <crn:value xsi:type="xsd:unsignedInt">4096</crn:value>
          </crn:parameter>
          <!-- wlpProperties: These properties are used to tune the WebSphere Liberty Profile (WLP)
               server.  -->
```

編集後、cogstartup.xmlファイルはバックアップを取得し(ファイル名称変更)、backup.xmlファイルの名称をcogstartup.xmlに変更します。

また、Cognos Configurationの中の、以下のグローバル設定で良く変更する、「アーカイブ・ファイル・システムのルートの場所」とか、「ドメイン」や「パス」などは、以下のファイルに設定が入っているので、先のcogstartup.xmlとは別に変更して下さい。
![002.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/0997fa64-9800-d4d4-9a9e-a3f385fbbfde.jpeg)

グローバル設定が入っているファイル
/opt/ibm/cognos/analytics/configuration/coglocale.xml

**Cognosを起動する**
以下のコマンドでCognosを起動します。
/opt/ibm/cognos/analytics/bin64/cogconfig.sh -s

無事に起動すれば、設定変更は完了です。

#新規環境構築にも使える
ちなみに、この手順は設定変更だけでなく、新規環境構築も可能です。
開発環境はGUIを使えたけど、本番環境はセキュリティが厳しいのでGUIが使えない場合などに役立ちます。

先ほどのbackup.xmlファイルとcoglocale.xmlファイルを本番ノードに持って行き、URIやContent Storeの接続設定など、環境特有の箇所を全て変更し、cogstartup.xmlにして、Cognosを起動すると、しっかりと環境が構築されて起動します。
もちろん、前提となるContent Storeデータベースの作成や、各種JDBCドライバーの配置等は起動前に必要ですが、Cognos起動時にContent Storeや監査DBにテーブルを作ってくれます。

以上です、是非ご活用下さい。
Spring Security デフォルトログイン画面の出力(Hello World!)

###Spring Securityで学んだことをここにログしておきます。

###Spring Securityとは
アプリケーションに認証・認可機能を提供します。

###ライブラリ
groupId:org.springframework.security
artifactId:spring-security-web

groupId:org.springframework.security
artifactId:spring-security-config

groupId:org.springframework.security
artifactId:spring-security-taglibs

versionはすべて4.2.2.RELEASEでやりました。

###Bean定義
今回は、xml形式での設定をしました。

#####security-config.xml
    xmlns:sec="http://www.springframework.org/schema/security"

    <sec:http>
        <sec:intercept-url pattern="/**" access="isAuthenticated()"/>
        <sec:form-login />
    </sec:http>

    <sec:authentication-manager />

sec:httpで、すべてのパスに対して認証を必要とする設定をしました。
sec:authentication-managerで、認証機能用のコンポーネントを定義します。

#####web.xml

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/META-INF/spring/security-config.xml</param-value>
    </context-param>

これでcontextConfigLocationにsecurity-config.xmlを指定しました。

###サーブレットフィルタの設定
サーブレットフィルタクラスをサーブレットコンテナに登録します。

#####web.xml

    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>
            org.springframework.web.filter.DelegatingFilterProxy
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

DelegatingFilterProxyをすでにDIコンテナで管理されているBeanをサーブレットコンテナに登録する。security-config.xmlに[sec:http]の記述をするとSpring Securityを利用するために必要となるBean定義が自動的に行われる。

ここまでの設定がうまくいっていれば、サーバーを起動するとデフォルトのログイン画面が表示されます。

###感想
Spring Securityのデフォルト画面を出力するだけでかなり苦戦しました。
奥が深そうです、、。
[学習用]Ubuntu16+Rails5+Postgresql でアプリ作成までの流れ

UbuntuにPostgresql をインストールしたら
ユーザーを作っておく。

#Postgres
##Postgresのユーザーを作成
```
$ psql --version
$ sudo -u postgres createuser -s pguser
$ sudo -u postgres psql
```

pguser というユーザーを作成しました。

##Postgresのパスワードを作成
```
postgres=# \password pguser
postgres=# \du
postgres=# \q
```

2回パスワードを入力。
例えば pasword って2回入力すると パスワードが password になります。
\du でユーザーの一覧を表示できますので、pguserがあるか確認しておきます。
\q　で脱出。

#Railsでアプリを作成
##Postgresを指定しておく
```
$ rails new myapp --database=postgresql
$ cd myapp
```

いつも通りアプリを作成します。

##ジェムファイルを変更
```Gemfile
# 開発時はSQLiteで
# gem 'sqlite3', group: :development
# 本番ではpostgresqlを使用する場合は
# gem 'pg', group: :production

#変えない場合は
gem 'pg'
```

Gemfileに上記を追加・変更します。

##コントローラー作成
```
$ bundle install
$ rails g controller welcome
```

テスト用のファイルを作ります。

##indexファイル編集
```app/views/welcome/index.html.erb
<h2>Hello World</h2>
<p>
  The time is now: <%= Time.now %>
</p>
```

ただ現在時間が表示されるアプリというかコード。

##routes編集
```config/routes.rb
  root 'welcome#index'
```

トップページを今作ったファイルへ変更しておきます。

##database編集
```config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see Rails configuration guide
  # http://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  #以下を追加する3つ
  host: localhost
  username: pguser
  password: password
```

ホストとユーザー名とパスワードを追記します。

##データベース作成？してサーバー起動
```
$ rake db:create
$ rails s
```

これで動きました。
rake db:crete　の後に rake db:migrate もしたような気も。

#参考サイト
[解決するのに参考にした：英語サイト](https://www.digitalocean.com/community/tutorials/how-to-use-postgresql-with-your-ruby-on-rails-application-on-ubuntu-14-04)
[解決するのに参考にした：Qiita](https://qiita.com/mochizukikotaro/items/7d169640417ecf804f95)
[参考：Getting Started with Rails 5.x on Heroku](https://devcenter.heroku.com/articles/getting-started-with-rails5#database)
RubyでHTTPサーバを立て、その上でRailsを動かす

前回の投稿の続きです。
[RubyでTCP/HTTPサーバを立てる (Qiita)](https://qiita.com/be-kan/items/8aec7d3b2f81408e62f8)

この投稿は主に以下の記事の翻訳です。
[Building a Ruby HTTP server, part 2: Running a Rails app](https://blog.appsignal.com/2017/01/24/ruby-magic-building-a-ruby-http-server-part-2-running-a-rails-app.html)

また、ブログにて詳細を説明しています。
[RubyでHTTPサーバを立てる② (ブログ)](https://be-kan.hatenablog.jp/entry/2018/05/24/210834)

ソースコードは以下にあります。
[https://github.com/be-kan/http_server_in_ruby](https://github.com/be-kan/http_server_in_ruby)

サーバを立てた部分のコードのみ載せます。

```ruby
require 'socket'
require_relative 'sample_blog/config/environment'

app = Rack::Lint.new(Rails.application)
server = TCPServer.new 5678

while session = server.accept
  request = session.gets
  puts request

  method, full_path = request.split(' ')
  path, query = full_path.split('?')

  headers = {}
  while (line = session.gets) != "\r\n"
    key, value = line.split(':', 2)
    headers[key] = value.strip
  end

  body = session.read(headers["Content-Length"].to_i)

  status, headers, body = app.call({
    'REQUEST_METHOD' => method,
    'PATH_INFO' => path,
    'QUERY_STRING' => query || '',
    'SERVER_NAME' => 'localhost',
    'SERVER_PORT' => '5678',
    'REMOTE_ADDR' => '127.0.0.1',
    'HTTP_COOKIE' => headers['Cookie'],
    'rack.version' => [1,3],
    'rack.input' => StringIO.new(body),
    'rack.errors' => $stderr,
    'rack.multithread' => false,
    'rack.multiprocess' => false,
    'rack.run_once' => false,
    'rack.url_scheme' => 'http'
  })

  session.print "HTTP/1.1 #{status}\r\n"
  headers.each do |key, value|
    session.print "#{key}: #{value}\r\n"
  end
  session.print "\r\n"
  body.each do |part|
    session.print part
  end
  session.close
end

```
Androidのライブラリ側で事前にProguardファイルを用意して利用する側の負担を減らそう

# 概要
Androidのライブラリを作ってる時に、Proguardの難読化対象外にしたいクラスができることがある。(依存している他のライブラリで難読化させたくないクラスがあるなど)

これをライブラリを利用する側でそこまで意識して都度Proguardファイルをメンテしていくのはつらいので、何か良い方法は無いかなと探していたら解決策を見つけた。

# 対応方法
`consumerProguardFiles`をdefaultConfigに含めてあげればそれを使ってくれるようだ。
あとはいつも通りこのライブラリで難読化から外したいクラスやメソッドを書いていくだけ。

> ライブラリの設定ファイルの名前を指定するには、ライブラリの build.gradle ファイルの defaultConfig ブロックで consumerProguardFiles メソッドに名前を追加します。たとえば、次のスニペットではライブラリの ProGuard 設定ファイルとして lib-proguard-rules.txt を設定します。

```gradle
android {
    defaultConfig {
        consumerProguardFiles 'lib-proguard-rules.txt'
    }
    ...
}
```

https://developer.android.com/studio/projects/android-library
「私ならこうする委員会「会社をやめようと決めた日のこと」」参加メモ

今日はこちらにお邪魔した。
https://devlove.doorkeeper.jp/events/74215

## 私ならこうする委員会の自己紹介
- 川島さん
    - 社会人20年目
    - 自称SIerでコードを書く人
- 竹本さん
    - ローカルワークス　取締役/CTO
- 市谷さん

- みんなTIS社出身
- 社内でデブサミみたいなことをやった時のメンンバー３人が集まった。

## 小話 「私にとって "会社をやめようと決めた日のこと" 」
- 川島さん
    - 若い時に考えること。perlでCGIを作っていた。FW作ってた。社内システム作ってた。
    - 当時、ライブドアが世間でフォーカスされていた。
    - githubがサービスinされてから世にコードを出すようにした。
    - このような機能が必要になるはずだと思って、書いている。課題があって→解決するとは逆の流れ。
- 竹本さん
    - TISをやめた時の話。7年勤めた。
    - 4年目に思ったこと。お客さんの感謝を励みにやっていた。
    - リクルートのmashup awardに応募して、受賞できた。
    - 社内で尊敬する人がいなくなっていった。
    - 自分の力で自分の環境を良くしないといけないと思い始めた。
    - 外にある自分にあった環境を選ぶために、転職を決意した。
- 市谷さん
    - 会社を立ち上げようと思った時のこと
    - 前の会社は、予算あるしやったらええやん。
    - ユーザがいるかわからないのに、開発することに違和感があった。受託開発。
    - whyがある開発なのか。を大事にしている。

## 参加者を代表して、Mさんのお悩み
### No.1「新しい環境でどうやって動き出し、巻き込んでいったらいいんだろう？」
- 共通の敵を作る。
- トラブルを起こして、メンバーで解決する。
- 自分のアウトプットを見せまくる。
- 巻き込まなくて良いかも。
- 朝会を初めてみる
- 飲み会する

### No.2「しんどそうな人を目の当たりにしたとき、どういった行動を取ればよいのだろう？」
- 躊躇せずに、声かける。

### No.3「管理のことしか考えがなく、担当者の作業効率が悪くなっているのを気にしない上司、プロジェクトに対してどう動けばよかったのだろう？」
- エクセルを触らずにエクセルを出力する。技術で乗り越える。
- 目線がずれているのであれば、時間をかけて合わせにいく
- 自分が偉くなる。管理表を作る側になる。
- 嫌々やっている隣の上司を見つけて、提案し、巻き込む
- プロジェクトの中で、テーラリングする。
JSONの代わりにMessagePackを使いたい

今までCLI/SV間のデータのやり取りにはJSONを利用してきましたが、調べてみるとMessagePackの方が利点が多そうなので動作の確認をしました

## データ構造の定義について
あらかじめstructを全て定義しておく必要があるようです
structの入れ子構造にも対応しています
MSGPACK_DEFINEというマクロでシリアライズしたいフィールドを定義します

```c++14
struct sFoo
{
    std::string name;
    int secret;
    MSGPACK_DEFINE( name );
};
```

## 変換も簡単
#### serialize
```
auto origin = std::make_unique<sFoo>();
sTest->name = "foo";
msgpack::sbuffer sbuf;
msgpack::pack( sbuf, *( origin.get() ) );
```
#### deserialize
```
std::string msg = // 受け取ったconst char*
msgpack::object_handle oh = msgpack::unpack( msg.c_str(), msg.size() );
msgpack::object deserialized = oh.get();

auto clone = std::make_unique<sFoo>();
deserialized.convert( *( clone.get() ) );
```
unique_ptrもしっかりコピーしてくれるし、nullptr（nullableなフィールドも定義可能）にも対応してます

## データの中身を参照する
```
std::stringstream ss;
ss << deserialized;
// 出力は [["child1"],[4,[2,4,6,8]],null] のようになる
```
公式ではstd::coutに渡していましたが、Stream write(const char*, size_t s)を持つ型ならなんでもいいそう
JSONのpritty formatに比べるとインデント/改行やキーがないのでデータが大きくなると結構見づらい

## 変換の成否判定
```
try
{
    auto failed = std::make_unique<sBar>();
    deserialized.convert( *( failed.get() ) );
}
catch ( const std::bad_cast& e )
{
    // FAILED!!
}
```
変換できなかったときstd::bad_castエラーを吐きます
JSONと違ってメンバーチェック等は必要ないし、Import/Export関数も書かなくてよい

## 確認したコード
[msgpack-c](https://github.com/msgpack/msgpack-c)のUsageに沿って確認

```c++14:msgpacktest.cpp
#include <msgpack.hpp>

struct sChild1
{
    std::string name;
    MSGPACK_DEFINE( name );
};

struct sChild2
{
    int num;
    std::vector<int> nums;
    MSGPACK_DEFINE( num, nums );
};

struct sParent
{
    std::unique_ptr<sChild1> child1;
    std::unique_ptr<sChild2> child2;
    std::unique_ptr<sChild2> nullable;
    MSGPACK_DEFINE( child1, child2, nullable );
};

int main()
{
    auto origin = std::make_unique<sParent>();
    origin->child1 = std::make_unique<sChild1>();
    origin->child2 = std::make_unique<sChild2>();
    origin->nullable = nullptr;

    origin->child1->name = "child1";
    origin->child2->num = 4;
    origin->child2->nums = { 2, 4, 6, 8 };

    // serialize
    msgpack::sbuffer sbuf;
    msgpack::pack( sbuf, *( origin.get() ) );

    // 元のEntityを削除してみる
    origin = nullptr;

    // deserialize
    msgpack::object_handle oh = msgpack::unpack( sbuf.data(), sbuf.size() );
    msgpack::object deserialized = oh.get();

    auto clone = std::make_unique<sParent>();
    deserialized.convert( *( clone.get() ) );

    if ( clone->nullable == nullptr )
    {
        Log::Console( "nullable is null." );
    }
    Log::Console( "child1 %s, child2 num %u", clone->child1->name.c_str(), clone->child2->num );

    std::stringstream ss;
    ss << deserialized;

    Log::Console( ss.str().c_str() );

    try
    {
        auto failed = std::make_unique<sChild1>();
        deserialized.convert( *( failed.get() ) );
    }
    catch ( const std::bad_cast& e )
    {
        Log::Console( e.what() );
    }

    return 0;
}
```

```
nullable is null.
child1 child1, child2 num 4
[["child1"],[4,[2,4,6,8]],null]
std::bad_cast
```
Windowsでの開発をより快適に!! Bash shellを入れてみた!!

##はじめに

###Windowsのターミナルって使いにくくね?

##Bash shellの導入
ターミナルがないと何もできないから、入れていたけど、さすがに不満を覚えてきたぞPowershllよ。
今まで世話になったな。
これからはBash shellを使わせてもらおうではないか。

導入の仕方はこのサイト通りにどうぞ。
[Windows Subsystem for Linuxをインストールしてみよう！](https://qiita.com/Aruneko/items/c79810b0b015bebf30bb)

`Ubuntu`を起動してから実行するまでに時間かかるため、`Ctrl+C`で中止しないように!!

##使いやすくするために

####アップデート
```
$ sudo apt update
$ sudo apt upgrade
```
`$ sudo apt upgrade`を実行しなければ、アップグレードされないため注意。

####日本語環境の導入
```
$ locale -a
#ja_JP.tf8があるかを確認。なければ以下のコマンドを入力
$ sudo apt-get install -y language-pack-ja
$ sudo update-locale LANG=ja_JP.UTF8
$ exit
#Ubuntu再起動
$ lacale
#LANG=ja_JP.UTF-8になっているか確認。
```

####Vim
````
$ sudo apt install vim-nox
$ vimtutor
#vimのチュートリアル起動
````

####git
````
$ sudo apt install git
$ git --version
````

以下は各自環境に合わせて導入をしてみては。
一応、この順番がオススメ。

####zsh
https://github.com/robbyrussell/oh-my-zsh/wiki/Installing-ZSH

####oh-my-zsh
https://github.com/robbyrussell/oh-my-zsh

####zgen
https://github.com/tarjoilija/zgen

####zsh-users/zsh-syntax-highlighting
https://github.com/zsh-users/zsh-syntax-highlighting
https://wonderwall.hatenablog.com/entry/2016/06/25/205033

####zsh-users/zsh-history-substring-search
https://github.com/zsh-users/zsh-history-substring-search

####tmux
https://qiita.com/1000k/items/dedb38e8a959dee40cc3

###tmux plugin
https://github.com/tmux-plugins/tpm

####tmux-resurrect
https://github.com/tmux-plugins/tmux-resurrect

####tmux-continuum
https://github.com/tmux-plugins/tmux-continuum

####tmux-urlview
https://github.com/tmux-plugins/tmux-urlview

####tmux-yank
https://github.com/tmux-plugins/tmux-yank
ウルトラ今更な「なんでSpringのServiceにはInterfaceが要るのか」

この記事は、Springは使っているけど、中身どうやっているのか知らなくて、でも表題のようなことを疑問には思う、そんな人向けです。
もっと言えば、**こんなものを書くなんて、俺はどうかしているんじゃないか？**と思ってしまった人向けです。

**……というか、今日思いっきりコケて調べて「そういうことだったのか！」となったので書きました**。
どういう風に実装してるか調べないとどこかで落とし穴に落ちますね（這い上がりながら）。

----

世の中にはたくさんのServiceがあります。あ、サービスじゃなくて、Service。

Serviceがどこからきて本来どういう意味なのかというのはひとまず置いておくとして[^1]、Spring絡みの作例では、Serviceを作る際、その多くが Interface + Implement class の構成を取ります。
何故でしょうか？

# TL; DR
**Springが介入するスキを作るためです**。

# えっ！？
実際のところ、結構な部分において、**Interface抜きのServiceは期待通りに機能します**。
しかし、特定の一部パターンにおいて死にます。
具体的には、**トランザクション制御や非同期処理が絡むと、いきなりインジェクションに失敗することになるのです**。

これにはSpringの実装が絡んでいます。といっても、難しい話ではありません。

SAStrutsを使っていた頃、JavaVMのバージョン違いで起動せずにうがー！となることがよくありました。
私があれを使っていたのはEOLも間近だったので、更新がバージョンに追いついていなかったのです。
私の認識が正しければ、アレの動作書き換えはJavassistを利用したバイトコードレベルでの書き換えに依存していたはずです。
(気づくまでずいぶん手こずりましたが、Javassistを入れ替えると動くということはそういうことでしょう)

Springの場合、少なくともAOPやトランザクション制御や非同期処理のためには、バイトコード変換を使っていません[^4]。
ではどうやっているのかといえば、Interfaceを実装しているのです。
予め用意された、SpringのInterfaceではありません。

**あなたの用意したInterfaceを、Springが、動的に、実装しているのです**。

これが答えです。
Springは、あなたの用意したInterfaceを実装して、あなたの用意したServiceへ動作を委譲するようなクラスを作ることで、自らの機能を果たすのです。
**あなたの用意したInterfaceこそ、Springが己の機能を発揮する最大の手助けなのです！**[^3]

# 脱線 - 何故「Interface + Implement class」構成を疑うのか
Javaという言語はオブジェクト指向ですが、その中でもインターフェイス指向に分類されます。
つまり、インターフェイスを全面に押し出している言語です。
「ということは、そもそもとりあえずインターフェイスを作っておけばいいじゃないか？なんでそれを疑うんだ？」
これは非常に尤もな話です。

ところで皆さん。
**ぶっちゃけインターフェイス作るのめんどくさくないですか**。
もちろん、インターフェイスが非常に有効な場合は死ぬほどあります。
そういう時、作るのは何の苦もありません。むしろ楽しいものです。
**我々は、何故あんなものを強いられているのでしょう**。

JavaBeansというものがあります。
「JavaにGetter/Setterの呪いをかけたクソ」と呼ばれることもあれば、「現在の自動実装プロパティ類に続く重大な発明」と呼ばれることもある、アレです。
ともあれ共通しているのは、「何もしないGetter/Setterをむやみに量産することは無価値であり、害悪であり、(場合によっては)オブジェクト指向に反する」という認識です。

これに歯向かった（？）のが少々前まで活躍していた[^2]フレームワーク、SAStrutsでした。
あれの特徴はやっぱり「もうpublicでいいじゃん」という割り切りというか、開き直りだったように思います。
事実、privateフィールド+何もしないGetter/Setterはpublicフィールドとほぼ同義です。
そしてpublicフィールドとGetter/Setterに両対応したSAStrutsは、事実非常に「書きやすい」部類のフレームワークでした。
「**本当に必要なの？**」という問いは、重要なのです。

ServiceのInterfaceはどうでしょう。
大抵**実装クラス1つしかないゴミ**(のように見える)**インターフェイスもどきになりませんか？**
**そんなものが山程できる状態は耐え難くないですか？**
**もういっそ全部吹き飛ばしてやろうとか思いませんか？**

# まとめ
**我々が「書かされて」来た、無数の "実装が一つしか無い、ユニットテスト以外で役立たずのように見える" Interfaceは、決して役立たずではなかったのです！**
だから、自信を持ってください。
……あと、**むやみに省略すると死ぬこともあると覚えておきましょう**。特に、Springのような、頭を使ってお行儀よくきれいに書いてくれているコード相手には。


[^1]: エリック・エヴァンス氏の「ドメイン駆動設計」読んできてください
[^2]: 既にEOLを迎えています。終末期でしたが、私もお世話になったものです。S2JDBCとか未だに最高のO/Rマッパの一つだとおも……あれ？
[^3]: 大げさすぎやしないかって？ いやいや、「契約を守る」ことこそ最大の手助けというのは、契約による設計を考えるとむしろ当然でしょう。……そういうことにしてください。「俺たちが書いてきたのはゴミじゃないんだ！」というだけで、我々の精神状態はいくらかよくなるはずです。
[^4]: 10年前の記事ですが、パッと出てきたものを。 http://d.hatena.ne.jp/minghai/20070924/p1
chromeでショートカットキーでコマンドを実行したい


### 苦労した点

* keypress.jsをnpmでつかう
* content_scriptsを使うこと
* 本当にbackgroundで待ち受けしないといけないのか調べてみたけど結局待ち受けることにした

WebページのタイトルとURLをワンクリックでコピーするBookmarklet - Qiita
https://qiita.com/georgen/items/93d5345d4bf282f60817

manifest.json chrome commands - Google 検索
https://www.google.co.jp/search?num=100&ei=WZ8CW772OMqL0wLup7DYCw&q=manifest.json+chrome+commands+&oq=manifest.json+chrome+commands+&gs_l=psy-ab.3...3044.8143.0.14347.10.10.0.0.0.0.199.1516.0j10.10.0....0...1c.1.64.psy-ab..0.8.1222...33i160k1j33i21k1.0.Vv2fgryxVJc

Chrome App/Extensions で特殊キーの入力やキーボードショートカットを受け取る - Qiita
https://qiita.com/kimama1997/items/b9292c26b62bfbba17e9

try catch and ...release: Chrome拡張機能のショートカットキー設定
https://trycatchand.blogspot.jp/2013/08/chrome-keyboard-shortcut.html

javascript extension chrome key shortcut - Google 検索
https://www.google.co.jp/search?num=100&ei=sQcEW5e3EYHM8wXEi4vIBg&q=javascript+extension+chrome+key+shortcut&oq=javascript+extension+chrome+key+shortcut&gs_l=psy-ab.3...9009.11759.0.11888.12.11.0.0.0.0.276.1120.0j6j1.7.0....0...1c.1.64.psy-ab..8.1.123...0i8i30k1.0.MlwvHc-qQxE

キーボード入力をキャプチャするためのkeypress.jsの紹介 | 全世界のIT記事
https://sekai-it.com/archives/37860

JavaScriptでショートカットキーを実装する色々な方法 | CMS（WordPress）などの技術ブログ
https://www.cms-seisaku.com/blog/javascript/199

"keypress.js" "shortcut.js" - Google 検索
https://www.google.co.jp/search?num=100&biw=1717&bih=1080&ei=IwkEW4PWBor88QWSqpXgDg&q=%22keypress.js%22+%22shortcut.js%22&oq=%22keypress.js%22+%22shortcut.js%22&gs_l=psy-ab.3...8107.11038.0.11207.4.4.0.0.0.0.158.538.0j4.4.0....0...1c.1.64.psy-ab..0.0.0....0.l4aAI59soHY

Capturing the charCode for CTRL (or any modifier/special key) + [any key] seems unclear · Issue #4159 · facebook/react
https://github.com/facebook/react/issues/4159

批处理之家 js 在线脚本库 - JS / JScript / JavaScript - VBS求助&讨论 - 批处理之家 批处理_BAT_CMD_DOS_VBS_Perl_Python_PowerShell - Powered by Discuz!
http://www.bathome.net/viewthread.php?tid=34544&rpid=163481&ordertype=0&page=1#pid163481

Keypress: A Javascript library for capturing input
http://dmauro.github.io/Keypress/

JavaScript APIs - Google Chrome
https://developer.chrome.com/apps/api_index

Chrome App/Extensions で特殊キーの入力やキーボードショートカットを受け取る - Qiita
https://qiita.com/kimama1997/items/b9292c26b62bfbba17e9

keypress.js 2.1.0-1 on npm - Libraries.io
https://libraries.io/npm/keypress.js/2.1.0-1

```
npm install keypress.js
```

Using Keypress with RequireJS
http://jp1971.com/2014/06/25/using-keypress-with-requirejs/

```
var listener = new keypress.Listener();
```

JavaScript APIs - Google Chrome
https://developer.chrome.com/apps/api_index

ブラウザー拡張（アドオン、エクステンション）の作り方チュートリアル。 | Ginpen.com
https://ginpen.com/2018/05/06/how-to-create-browser-extension/

chrome.notifications - Google Chrome
https://developer.chrome.com/apps/notifications#type-NotificationOptions

ブラウザゲームを効率的にプレイするためのChrome Extension開発紀行 その1 - 渋谷ほととぎす通信
http://www.shibuya24.info/entry/2015/09/22/224446

> 1-3-1. メッセージの待機処理
デスクトップ通知を行うときは、background.jsを使用します。background.jsは裏側で動き続き続けるJavaScriptです。content-script.jsから表示して欲しい通知内容をbackground.jsにメッセージを送ることが出来ます。
インライン要素とブロック要素に気をつけろ。

ついつい忘れがちですがHTMLにはインライン要素とブロック要素があります。そして

- <strong>ブロックレベル要素 ： ブロックレベル要素とインライン要素を含むことができる。</storng>
- <b>インライン要素 ： コンテンツとインライン要素しか含むめない。</b>

これはHTMLの設計がブロックレベル要素が<b>「より大きな構造を構築する」</b>という考え方だからです。

ざっくり言うと、セクショニング（構造をつくる）要素はブロック要素で、細かい修飾をする要素が、インライン要素と言えるかもしれません。

<h2>よく使うブロックレベル要素</h2>
` <address>` ：意外とどっちかなー？と思いつつブロックレベル。個人的にインライン寄り。
` <article>` ` <aside>` ` <footer>` ` <header>` ` <h1~6>` ` <nav>` ` <section>`：全部構造を作る系のタグなので納得のブロックレベル。
` <div>` ：ブロックレベルの代表格。
` <ul>` ` <li>` ：これもリスト構造作るから。
` <pre>` ：整形済みテキスト。これもインラインよりと思いつつブロックレベル要素。
` <hr>` ：テーマの区切り。水平線。これもインラインより。

<h2>よく使うインライン要素</h2>
` <b>` ：文章を修飾するのでインライン。
` <storng>` ：文章を修飾するのでインライン。
` <code>` ：文章を修飾するのでインライン。
` <small>` ：文章を修飾するのでインライン。
` <span>` ：文章を修飾するのでインライン。
` <cite>` ：作品のタイトルまたはURLを囲う。文章を修飾するのでインライン。
` <q>` ：引用情報を囲う。文章を修飾するのでインライン。
` <blockquote>` ：長文の引用情報を囲う。文章を修飾するのでインライン。




<h2>どっちか迷う要素たち</h2>
` <table>` ：テーブルという構造を作るから、<b>ブロックライン</b>。
` <form>` ：フォームという構造を作るから、<b>ブロックライン</b>。
` <button>` ：フォームの要素系は<b>インライン</b>。
` <input>` ：<b>インライン</b>。
` <label>` ：<b>インライン</b>。

<h2>気をつけるべき要素たち</h2>
` <a>` ：インライン要素だがHTML5からはブロックレベル要素を含めることが可能に。


参照
<cite>[MDN web docs | ブロックレベル要素](https://developer.mozilla.org/ja/docs/Web/HTML/Block-level_elements)</cite>
<cite>[MDN web docs | インライン要素](https://developer.mozilla.org/ja/docs/Web/HTML/Inline_elements)</cite>
<cite>[MDN web docs | HTML要素リファレンス](https://developer.mozilla.org/ja/docs/Web/HTML/Element)</cite>
Bashのテストフレームワーク"Bats"が移行したらしいので和訳してみた

拙い訳になりますがご容赦ください。
原文はこちらです:  [bats-core/bats-core -- README.md](https://github.com/bats-core/bats-core/blob/master/README.md)

又、今回の移動についての記事なので、元からあるREADME.md部分は訳しません。その他訳す必要がないと判断したところは訳しません。

7/8追記:
  `bats-core`のformulaがhomebrew-coreに取り込まれました！
　Mac勢、linuxbrew勢の方は

 ```bash
 $ brew install bats-core
 ```
でインストールできます！

---

# BATS-core: Bash Automated Testing System (2017)

## 背景

### このレポジトリについて

**2017/09/19 (火)**:  このレポジトリは、[bats](https://github.com/sstephenson/bats)のコミット[0360811](https://github.com/sstephenson/bats/commit/03608115df2071fff4eaaff1605768c275e5f81f)をそのままforkしたものです。
fork方法: `git clone --bare`と`git push --mirror`


### このレポジトリが出来た理由について

オリジナルのbatsレポジトリは2013年以降活発な保守作業が行われておらず、新しいメンテナが必要でした。沢山のボランティアやメンテナがissueを作成したりPRを作ったりしていましたが、書き込み権限がない事が、開発をひどく妨げていました。


### 今後の計画とその理由について

大雑把な計画、そもそもはじめに[ここ](https://github.com/sstephenson/bats/issues/150#issuecomment-323845404)で述べられていたのは、新たにミラーリングされた主流となるレポジトリ(それがこのレポジトリ！)を作る事です。引用すると:

> 1. Roadmap 1.0: 既に完成度の高いPRがあり、特にここ[#196](https://github.com/sstephenson/bats/issues/196)のように、よく追加して欲しいと言われる機能や問題点も多々あります。それらを活用して一つのロードマップに統合します。
> 
> 2. 新しく主流として使うforkもしくはミラーの作成/選択: 既存のPRを出来る限り、新しいレポジトリに追加して、stable 1.0にします。私の意見としては、organizationを作り、2,3人の人に管理者と書き込み権限を渡すべきだと考えています。


これを達成するために、以下の事を行います:

1. 元々のメンテナに依存している部分をなくす
2. 共同作業やcontributionを再度活発にさせる
3. 必要になった場合、オリジナルからのmergeやオリジナルへのmergeをする事が出来るようにする。
4. 管理者権限を一人以上の人に渡す事で、開発が滞る事を防ぎ流動性を確保する


## その他

freenodeの#batsで活動しています。



---

翻訳以上になります。
Batsは割と有名（だと思う）なbash用のテストフレームワークで、`setup()`や`teardown()`も使用できます。ざっくりとよく言われる説明としては、返り値を確かめてテストしている形なので、別段Shellscriptでなくてもテストする事ができます。
もし使った事がなければこの機会にぜひ...等..((

今回の訳に関して、割とあやふやな部分も多々ありました...
その場所についてはコメントとして残しておこうと思います
英語得意な方、おかしなところなどありましたら指摘くださるとありがたいです。
Addressable Assets Systemのパフォーマンス検証

# はじめに

前回は、Addressable Assets Systemについて内容を把握する記事を書きました。
→ [Addressable Assets Systemを完全に理解する](https://qiita.com/k7a/items/b4fd298bcb64dc968ad1)

内容は把握したものの、Addressable Assets System、実際運用に載せられるか？という点で、やはり気になるのは**パフォーマンス**だと思います。
そこで、かなりざっくりとですが検証を行ってみました。

# パフォーマンス検証

今回は以下の点について調査を行いました。

- アセットが増えた時のエディタの動作（アドレス付与）
- アセットが増えた時のコンテンツカタログのサイズ、ロード時間
- アセットが増えた時のアドレス解決の時間

アセットの数は**1万個**で、PackingModeはSeparately、つまりAssetBundleも**1万個**の状態にしました。大規模なアプリなら普通に現実的に有り得る数だと思います。

また、検証に使ったマシンはMacBook Pro（i7 2.9GHz）です。
（実機検証したほうが良いのですが、今回は横着してそこまでやりませんでした）

## アセットの用意

テスト用に適当にアセットを用意します。
数を用意しないといけないので、適当にワンライナーを書いてざっと**1万アセット**複製しました。
test/ok_00001.pngをtest/ok_10000.pngまで複製します。

```sh
for i in $(seq 2 10000);do i=`printf %05d $i` ;cp test/ok_00001.png test/ok_$i.png;done
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/97014/d182c1df-ea05-d71e-e481-7c4d37c5d345.png)

例によって[いらすとや](https://www.irasutoya.com/)さんからお借りしています。

そして、1万アセットをAddressablesウィンドウにD&Dしてアドレスを付けてやろうとすると…**重い**…！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/97014/1889589d-74ca-bd47-155c-ddc38fdff134.png)

~~1万アセットをAddressablesに入れるだけで、**数時間**かかりました…。
一度に大量のアセットのアドレス付与をしようとすると激重になるようです。~~

→ 0.0.26-previewで試した所、数秒で終わるようになっていました！GUIの描画が原因だったっぽい？

## コンテンツカタログのサイズ、デシリアライズ速度

1万アセット・1万AssetBundleを格納したコンテンツカタログの容量は**約6.8MB**となりました。
Apacheでgzip圧縮かければ**約360KB**程度に収まりました。gzip圧縮は必須と言えそうです。
AssetBundleの更新の度にロードすることになるので、これを大きいとみるか小さいとみるかはプロジェクトによると思いますが、何れにせよ構造上の問題で必要経費になるので、考えられる回避策と言えばコンテンツカタログが分割できるようになるくらいですかね。

デシリアライズ速度についてはとりあえずエディタ上で測ると150ms程度でした。
まあデシリアライズ＝JsonUtilityのパフォーマンスの問題なので、JsonUtilityなら実機でも常識的なアセット数においてはめちゃくちゃ遅いみたいな事は無さそうな気がします。

コンテンツカタログの内容を見ている感じだと、結構冗長なデータが含まれているようには思えるので、キッチリとサイズもパフォーマンスも詰めたい場合は自前で実装するのが良さそうです。

## アドレス解決の速度

アドレス解決（stringからResourceLocationへの変換）は、内部的にはDictionaryで引いてきているだけなので、特に問題は無さそうでした。強いて言うならメモリ使用量が気になるくらいですが、ここはもう構造上必要なコストになるので仕方ないと思います。

## エディタ上での実行速度

ここが結構気になる所で、**PlayModeがVirtualもしくはPackedの場合**、実行時にResourceManagerRuntimeDataなどの生成処理が走るので、**10〜30秒くらい待たされます**。
エディタで内部的にキャッシュするため、2回目以降はキャッシュが効いてすぐ実行できるのですが、AddressableAssetsに何か変更がある度に再生成されるので、高速なイテレーションには向きませんね。
PlayMode: Fastの場合はほとんど待ち時間は無しで実行できるため、回避は可能です。

現状の問題点として、Packedの時に勝手にAssetBundleのビルドとResourceManagerRuntimeDataの再生成の処理が挟まってしまう所が不便なので、それをスキップできるようになれば特に問題は無さそうです。

# 結論

個人的に気になった点としては、**エディタ上で大量のアセットのアドレス付与に時間がかかる**点以外にはありませんでした。
まず現状アドレス管理が完全手動でしかできない所が不便すぎるので、アドレス管理周りはこれからどんどん改修されていくと予想しているのですが、大量のアセットのアドレス管理もスムーズに行えるようになるのかという所は気になる点ですね。
AWSCLIでLambda関数の実行をスケジューリングする

#AWSACLを使ってCloudWatch EventsにRuleを設定します

今回は_毎朝10時に関数を実行する_ルールです。

##まずルールを作成 *put-ruleコマンド
下のようにルールを作成する。
```
 aws events put-rule --name "ルール名" --schedule-expression "cron(0 １ ? * * *)"
```

####cron式の説明
cron式は公式に書いてありますが下の通りです。
```
cron(Minutes Hours Day-of-month Month Day-of-week Year)
```

「？」は直前の指定に対して使われるワイルドカードです。今回の場合は「時間を01:00を指定したが、日付はいつでもいい」という意味です。

##関数に *アクセス権限の管理設定add-permission*
```
 aws lambda add-permission \
 --function-name Lambda関数名 \
 --statement-id ステートメント識別子 \
 --action 'lambda:InvokeFunction' \　　　　　　　　　//許可したいLambdaアクション
 --principal events.amazonaws.com \
 --source-arn arn:aws:events:ap-east-1:アカウント番号:role:関数名
```

##ルールと関数の結びつけ　*put-targets*
```
aws events put-targets --rule ルール名 --targets "Id"="0","Arn"="arn:aws:lambda:us-east-1:hoge:function:Lambda関数名"
```

こんな感じでルールができました。

あとはコンソールでCloudWatch Events をLambda式のトリガーに指定すればいいです。

----------------
参考にした記事
[AWS Lambdaを1分間隔でスケジュール実行する #reinvent](https://dev.classmethod.jp/cloud/aws/invoke-lambda-at-1-minute-interval/)

AWS公式
[チュートリアル：CloudWatchイベントを使用したAWS Lambda関数のスケジュール設定](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/RunLambdaSchedule.html)
[put rule](https://docs.aws.amazon.com/cli/latest/reference/events/put-rule.html)
[Rate または Cron を使用したスケジュール式](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/tutorial-scheduled-events-schedule-expressions.html)
[add-permission](https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html)
[put-targets](https://docs.aws.amazon.com/cli/latest/reference/events/put-targets.html)

日本時間について
[WS Lambda を毎月1日 0:00 (JST)に実行する方法](http://goronojou.hatenablog.com/entry/2016/07/13/170931)
PhpStormにて多段sshで外部サーバのプロジェクトを追加する方法

# 背景
PhpStorm導入したんだけどEC2上の開発環境で直接作業したい。（楽に）
でもそのEC2は踏み台サーバー経由しないとアクセスできない


# fuseでマウントすれば？
[fuseでマウントする方法](https://qiita.com/ysk24ok/items/bb148530a55a4e55d99b)が割と有名だったのだが、OSがHighSierraだからか、[エラー](https://github.com/caskroom/homebrew-cask/issues/27293)が出てうまくいかない。
カーネルいじればうまくいくとの声もあったがよくわかっていないものには手を出したくないのでやめておく。

# やり方

※日本語環境で作業しています

### ssh configの設定
まずはssh接続で使用するconfigファイルに多段ssh接続の設定を追記する

jumpが踏み台でmy_project_hostが真に接続したいサーバーである

```
Host jump
 Hostname jump-ip
 User jump-user_name
 IdentityFile ~/.ssh/jump-key

Host my_project_host
 Hostname my_project_host-ip
 User my_project_host-user_name
 IdentityFile ~/.ssh/my_project_host-key
 ProxyCommand ssh -W %h:%p jump

```

### PhpStormの設定
- menu>ファイル>既存ファイルから新規プロジェクトを選択
- Webサーバーはリモートホスト上にあり〜を選択

<img width="895" alt="スクリーンショット 2018-05-24 10.39.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/105662/ef6300c0-000b-1817-d838-4252f7105ba9.png">

- プロジェクト名はご自由にどうぞ

<img width="867" alt="スクリーンショット 2018-05-24 17.17.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/105662/6376d7ec-1fd6-9c2b-6eec-5ab486ce4dd5.png">

- sftpに設定し、sftpホストを設定する。この名前はssh_configのhost名と合わせる
- ルートパスはそのサーバ内における接続したいプロジェクトのホームで良いかと。すでに接続可能になっている場合、自動的にパス候補が表示される
- ユーザー名はsshで接続するユーザー
- 認証タイプは「OpenSSH config and ~ 」にする。これで上で設定したssh/configを利用するようになる
- SFTPの接続テストをしておく。ダメなら設定を見直す。(まずPhpStormなしで繋がるか確認しよう）
- 「Don't check HTTP〜」は踏み台サーバーの場合、HTTPで接続できないことが多いと思うのでチェックしておこう
- あとはディレクトリが表示されるのでルートの設定や同期したいファイルの可否などを細かに設定していこう

### 以上でPhpStormにて多段sshを使い、外部サーバーからプロジェクトが登録できる
取り組んだ事の記録について

# **取り組んだ事の記録について**
## 今回Qiitaを始め､取り組んだ事の記録をつけようとした理由
- いくつかのプログラマーになりたいと思った人がやるべきことなどが書いてあるブログに**取り組んだ事をブログに書く**とあった
- 文字を打つことによって理解を深めるため
- この先､エンジニアとして就職活動していく中でポートフォリオに使用するため

### 追記
- ブログの書き方も練習する
 - 誰が読んでもわかりやすく
 - 自然に言葉が入ってくるようなレイアウト
 - 読みやすいブログを見つけ､真似してみる
Material-UI のガイド ＞ TypeScriptを試す２



## ガイドのページ のDecoratedUnionPropsから試しました。
[TypeScript - Material-UI](https://material-ui.com/guides/typescript/)


## DecoratedUnionProps

IBook interfaceか、IPainting interface かで、表示を切り分ける事ができるクラスを作成


DecoratedUnionProps.tsxを作成

```js
import { withStyles, WithStyles } from '@material-ui/core/styles';
import Typography from '@material-ui/core/Typography';
import * as React from 'react';


// 最初にwithStylesを呼び出すデコレータ関数を作成
const decorate = withStyles(({ palette, spacing }) => ({
    root: {
        backgroundColor: palette.background.default,
        color: palette.primary.main,
        padding: spacing.unit,
    },
}));


interface IBook {
    category: "book";
    author: string;
}

interface IPainting {
    category: "painting";
    artist: string;
}


type Props = IBook | IPainting;

const DecoratedUnionProps = decorate<Props>( // <-- without the type argument, we'd get a compiler error!
    class extends React.Component<Props & WithStyles<'root'>> {
        public render() {
            const props = this.props;
            return (
                <Typography classes={props.classes}>
                    {props.category === "book" ? props.author : props.artist}
                </Typography>
            );
        }
    }
);

// エクスポート定義
export default DecoratedUnionProps;


```


### App.tsx

```js:App.tsx
      <div className="App">
        <DecoratedUnionProps category={'book'} author={'this is a book!'} />
        <DecoratedUnionProps category={'painting'} artist={'I am a big artist!'} />
      </div>
```
超初心者が学ぶパスワードのハッシュ化

##背景
未経験エンジニアとして勉強を始めて２ヶ月経ったところで、ログイン処理を試しに作っています。
その中でパスワードの暗号化クラスを作ったので、なるべく敷居を下げて初心者目線で紹介。

##なぜ暗号化を行うの？
ユーザーが登録を行う際にパスワードを入力します。その情報がデータベース（DB）に保存されます。その際に生のパスワードを保存しておくと、DBが仮に攻撃されてしまった際にパスワード情報が盗まれてしまいます。もし、ユーザーが同じパスワードを別サイトでも利用していた際に大変なことになってしまうので、データ保護の観点から暗号化を行います。

##どうやってするの？
###keyword
crypt関数
使い方→crypt();
crypt — 文字列の一方向のハッシュ化を行う　[引用](http://php.net/manual/ja/function.crypt.php)
わかりやすく説明すると、引数で文字列を渡してあげると規則性のない文字列を自動で生成してくれるよ、という関数です。
例)

```php
$salt = 'asdfghjkl';

$password = crypt($salt);

echo $password;

// 結果　　$1$FtuPJt0B$4eu1CwprtGZXnJEWkfsJO/
```

###実例

```php
<?php

class encryptedPassword
{
    const SALT = 'qwertyuiop';

    public function makePassword($password)
    {
    crypt($password, self::SALT);
    }

}

```

crypt関数に引数は１つでなくても大丈夫です。
より難解な暗号にするため、SALTという定数を与えることにします。

取得の際にパスワードが合っているか判定するためには、

```php
class accessDB
{
    const SALT = 'qwertyuiop';

    public function makePassword($password)
    {
    crypt($password, self::SALT);
    }

    public function fetchData($loginId, $password)
    {
    $encryptedPassword = $this->makePassword($password); //メソッド内で暗号化
    $sql = 'SELECT * FROM user WHERE login_id = :login_id AND password = :password'; //PDOを使用
    $sth = $this->pdo->prepare($sql);
    $sth->execute([':login_id' => $loginId, ':password' => $encryptedPassword]); //DBのパスワードテーブルカラムから暗号化されたものと等しいものを取得
    return $sth->fetch(PDO::FETCH_ASSOC);
    }

}
```

`fetchData`メソッドの引数で生のパスワードを渡しメソッド内で同じ暗号化を行います。
もし暗号化されたパスワードに一致するものがなかったらデータを取得できないため、パスワードが合っているか判定できます。

## 感じたこと
パスワードの暗号化はおそらく必要になってくる知識だろうし、簡単にできる処理だったのでサクッと学べてよかった。
超初心者の僕でもすんなりと納得することができました。 

##2018/05/25 修正 
暗号化とういう言葉の意味は「復号が可能なこと」を指すとご指摘をいただきました。
今回の例の場合、開発者側はパスワードを復号できず暗号にする一方向の動きなため、タイトルをハッシュ化と変更します。
CSSとJSだけで既存のウェブサイトをレスポンシブデザインにしたい時に便利なブックマークレット

低予算で既存のウェブサイトをスマホ対応してほしいという案件がたまたまあって、じゃあPC用のデザインはそのままにしてスマホ対応だけしましょうということになりました。

こういうお客さんに限ってウェブサイトのデータをダウンロードしたいからSSHのアカウントくれとか言うといろいろとコミュニケーションコストが発生してめんどくさいので、ブックマークレットでCSSを適用してそれで作業しちゃえということでそれ用の雛形をつくりました。

https://github.com/miya0001/css-anywhere

それほど時間を掛けるつもりがない場合、SSHアカウントとかを待ってる間に作業を始めてしまおうという作戦です。

あとわりと初心者な感じのところに外注するときにもいろいろ安心です。

## ワークフロー

使い方は以下のような感じです。

```
$ git clone git@github.com:miya0001/css-anywhere.git
$ npm install
$ npm start
```

最後の `npm start` でウェブサーバーが起動して以下のようなHTMLが表示されます。

![](https://www.evernote.com/l/ABVunlnuuPRBNaPKKDvF0QQgeoauStwWc04B/image.png)

このリンクをブックマークバーにドラッグアンドドロップしてクリックすると、表示中の画面の背景が真っ赤になるはず。

スマホ対応したいウェブサイトに移動して試してください。

あとは、`build/` 以下の CSS や JS を好きなように編集して出来上がったら本番環境に組み込む感じです。
組込み > SFR > Special Function Registerではない例 > Raspberry Pi

```
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Python 2.7.9
```

組込みにおいては「SFR(Special Function Register)」いう用語がある。

「SFR Raspberry Pi」で検索するとSpecial Function Registerとは別のSFRが見つかることが多そうだ。

http://clementgrimal.fr/blog/2013/01/24/raspberry-pi-serveur-web-sfr-box/
> Dans ce billet, je vais décrire comment j’ai installé un serveur web sur mon Raspberry Pi, mais surtout comment j’ai configuré mon installation sachant que mon fournisseur d’accès est SFR.

意訳「この記事において、RaspberryPiへのwebサーバーインストール方法を記載する。（その内容は）特に、プロバイダー(アクセス供給者)がSFRである場合についてである」

https://en.wikipedia.org/wiki/SFR
> SFR (Société française du radiotéléphone) is a French telecommunications company

### 他のSFR

[raspberry piでPUSH　SWのセンスをやってみる](http://mrdosukoi.blogspot.jp/2014/02/raspberry-pipushsw-raspberry-pigpio17.html) by ドスコイさん

> `#include "BCM2835-ARM-SFR.h"`

おそらく、こちらのSFRはSpecial Function Registerの方だろう。
挿入ソート実装

#はしがき
プログラミング初心者がアルゴリズムを片端から実装していこうという記事.
今回は挿入ソートをC,Java,Ruby,Pythonで記述.
コードに改善すべき点がありましたら,ご教授いただけると幸いです.

#挿入ソートの特徴
・要素数が少ない配列に対して効果的
・ほぼ整列済み、または重複した要素が多い配列に対して効果的
　（要素の入れ替え回数が減るため）
・平均計算量[^1]は$O$($n^2$)　[^2]
　（平均でn個の要素それぞれをnの定数倍回入れ替えるため）


[^1]: 計算量：アルゴリズムの評価基準.構成命令をもとに求める.
[^2]: オーダー記法：計算量を示す記法.最も次数の高い項以外の項と係数は無視する.

#C言語
```c
/* sizeは配列の大きさ */
void insertionSort(int data[10], int size) {
	int i, j;
	for(i = 1; i < size; i++) {
		j = i;
		while(j > 0 && data[j - 1] > data[j]) {
			swap(&data[j - 1], &data[j]);
			j--; 
		}
	}
}

void swap(int *a, int *b) {
	int tmp;
	tmp = *a;
	*a = *b;
	*b = tmp;
}
```
#Java
```java
public static void insertionSort(int[] data) {	
	int i, j;
	for(i = 1; i < data.length; i++) {
        j = i;
        while(j > 0 && data[j - 1] > data[j]) {
            swap(data, j);
            j--; 
        }
    }
}

public static void swap(int[] data, int j) {
	int tmp;
	tmp = data[j];
	data[j] = data[j - 1];
	data[j - 1] = tmp;
}
```
#Ruby
```ruby
def insertionSort(data)
	(1...data.length).each do |i|
		j = i
		while j > 0 && data[j - 1] > data[j]
			data[j - 1], data[j] = data[j], data[j - 1]
			j -= 1
		end
	end
end
```

#Python
```python
def insertionSort(data):
	for i in range(1, len(data)):
		j = i
		while j > 0 and data[j - 1] > data[j]:
				data[j - 1], data[j] = data[j], data[j - 1]
				j -=1
```
#気づいたこと
・Javaの参照型変数は"String","Array","Class"
・Ruby,Pythonにおいて要素の入れ替えは1行で済む
・Rubyのfor文はeachメソッドとして解釈される
　(eachメソッドが変更されるとfor文の挙動も変わる)
・Rubyなどにおいて"&&"と"and"は異なる
　参考：[&&とandの違い](https://qiita.com/fukayatsu/items/920ad8e4d099c3fec890)

#参考文献・サイト
- 『アルゴリズムリファレンス』,オライリージャパン，2010年4月
- 原隆浩・水田智史・大河剛直,『未来へつなぐ デジタルシリーズ 10  アルゴリズムとデータ構造』, 共立出版, 2012 年 6 月
- ソースコード探険隊
 https://www.codereading.com/algo_and_ds/algo/insertion_sort.html
VuexでCQRSを導入しようとしたけどやっぱりやめた。自分用メモ

# はじめに
読み込みと書き込みを分解して、セキュアにテストできたらなと思いまして、CQRSに目をつけました。用途としては、store moduleでcommandを叩こうかなと思っていました。
しかし、いざ書いてみると結構なボリュームで、とてもじゃないですが、少人数での開発をする場合、コードの綺麗さ以上にボリュームが多いことによりスピードダウンが感じられました。
また、Specパターンを適用しないと、やはりテストやら検証やら恩恵が少ないと感じましたので、これ以上増えるのはキツイかなと思ったので没になりましたが、いつか実践できたらと思っています。
以下の例はバリデーションをSpecパターンを適用しないで肥大化した例 and それのせいで最終validateがめんどくさくなった例です。疑似コードですが、`import axios` より上はコピペでブラウザのコンソールとかで動くので、よければ軽く触って遊んでみてください。

## 疑似コード
```js
class OverrideError extends Error {
  constructor(...params) {
    super(...params);
    this.name = 'CommandError';
  }
}

// commands.js
class Command {
  isValid() {
    // LaravelのFacadeで使われてた手法
    throw new OverrideError('isValidメソッドをオーバーライドしてください！！！');
  }
}

class CommandError extends Error {
  constructor(...params) {
    super(...params);
    this.name = 'CommandError';
  }
}

// commands/.js
class CandidateCommandError extends CommandError {
  constructor(...params) {
    super(...params);
    this.name = 'CandidateCommandError';
  }
}

// commands/candidate.js
class Candidate extends Command {
  constructor(params) {
    super();
    // getter は console.log で見えなく、forでも回せないので、
    // デバッグしやすいようにundefinedを突っ込んでおく
    this._name = undefined;
    this._age = undefined;
    this._skillLevel = undefined;
    if (!params) return;
    if ('name' in params) this.name = params.name;
    if ('age' in params) this.age = params.age;
    if ('skillLevel' in params) this.skillLevel = params.skillLevel;
  }

  isValid() {
    return Boolean(this.name && this.age && this.skillLevel);
  }

  get name() {
    return this._name;
  }

  set name(name) {
    // 名前は1文字以上の文字列
    if (typeof name === 'string' && name.length > 0) {
      this._name = name;
    } else {
      throw new CandidateCommandError('名前は1文字以上の文字列である必要があります。');
    }
  }

  get age() {
    return this._age;
  }

  set age(age) {
    // 未成年は禁止
    if (typeof age === 'number' && age >= 18) {
      this._age = age;
    } else {
      throw new CandidateCommandError('年齢は18歳以上である必要があります。');
    }
  }

  get skillLevel() {
    return this._skillLevel;
  }

  set skillLevel(skillLevel) {
    // スキルレベルは 0 ~ 10 の間
    if (typeof skillLevel === 'number' && skillLevel > 0 && skillLevel <= 10) {
      this._skillLevel = skillLevel;
    } else {
      throw new CandidateCommandError('スキルレベルは 0 ~ 10 の間である必要があります。');
    }
  }
}

// exception.js
import * as axios from 'axios';

class CommandHandlerError extends Error {
  constructor(...params) {
    super(...params);
    this.name = 'CommandHandlerError';
  }
}

// commandHandlers/candidateHandler.js
async function CandidateHandler(candidate) {
  if (!(candidate instanceof Candidate)) {
    throw new CommandHandlerError('Candidateインスタンスではありません。');
  }
  if (!candidate.isValid()) {
    throw new CommandHandlerError('Candidateの仕様を満たしていません。');
  }
  // 本来はrepositoryを使うが、イメージでお願いします
  const response = await axios.post('/api/candidate', candidate).catch(e => e.response);
  return response;
}
```

## 最後に
大規模開発ではCQRSをして、整理したいですね〜〜〜
CQRSの場合、query store として、 firebase database や firestore とかととても相性が良い気がしてます。
Cognos レポートの値のプロンプトで実際に存在する数値データでフィルターする

#概要
Cognos Analyticsのレポートで、以下のような実際に存在する数値データ(返品数量)を、値のプロンプトに表示してフィルタリングを行う実装方法です。
月とか製品みたいな文字列データであれば普通ですが、数値データを値のプロンプトで指定するのはちょっと工夫が必要です。
![001.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/d97a4b5e-07b2-dc19-928f-0b5f625ace11.jpeg)

#実装
レポートの実装としては、こんな感じにリストと値のプロンプトを配置します。
![004.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/54d693b6-13c8-7431-385e-353c9ae704d8.jpeg)

クエリーの構成はこちらです。
プロンプト用のクエリー：PromptQuery、リスト用のクエリー：ListQueryを作成しています。
それぞれのクエリーには、月、製品、返品数量が入っています。
※プロンプトのクエリーをリストのクエリーにリダイレクトして、処理を「ローカルのみ」に指定しているのは、本稿の実装の本質ではなく、パフォーマンス上、発行されるクエリーを減らす工夫のためです。
![005.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/d7ceaeed-c190-bb01-dc88-81bfe8346f1d.jpeg)

この状態でレポートを実行してみると、こんな感じになり、返品数量が合計されたものが1件のみ選択肢として表示されます。
![007.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/dfec9e8f-7450-2fb7-7724-f70600222f0c.jpeg)

これを解消するために、値のプロンプトのプロパティで、「データ」→「プロパティ」から、画面のように「月」と「製品」にチェックを入れます。
![006.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/339cd90b-6df7-9c5f-7ab9-6de94fd08b1e.jpeg)

この状態で実行すると、以下のようになります。
※数値は1から途切れなく並んでいるように見えますが、実際は存在する返品数量の値を並べています。
![002.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/7929b886-5db6-855f-e987-bc6ab67dd62b.jpeg)

返品数量=10を選択してみると、しっかり絞り込まれ該当の月と製品のデータのみが表示されます。
![003.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/9a90ff06-eeda-99ad-6882-5dd4fa645d3e.jpeg)

#参考情報
元ネタはこちらです。
**IBM Cognos BI Report Studio - Measure Based Value Prompt**
https://www.ibm.com/developerworks/analytics/library/ba-pp-reporting-prompts_and_filters-page684/index.html