OmniAICreator/Qiita-1.07M huggingface dataset:
GearVR向けのアプリ申請に必要な物自分用メモ

申請に必要な文言画像などまとめ
#Speces
・カテゴリー（アプリ、アーリーアクセス、エンターテイメント、ゲーム）
・このアプリがどれくらい快適に使えるか（かなり快適、ある程度快適、あまり快適ではない）
・ネットワークの要求（インターネットが必要、不必要、コンテンツをダウンロードするにはインターネット接続が必要です）
・ゲーム種別（シングルユーザー、マルチプレイヤー、協力プレイ）
・ジャンルを5つ選ぶ
![スクリーンショット 2017-03-17 12.32.24.png](https://qiita-image-store.s3.amazonaws.com/0/126397/83286e2c-3861-4dfd-0b60-38443f0ee4f8.png)
・サポートしている言語

#About
・アプリのWebサイト
・プライバシーポリシー
・問合せメールアドレス
・販売元
・利用規約

#Content Rating
・レーティングに関する質問に答える

#Translations
・アプリの名前
・短い説明文500文字
・長い説明文1000文字
・キーワード 5つ選択



#Assets - 画像等
・Logo (Min: 360 x 1440 Max: 9000 x 1440 (24-Bit PNG))必須
・Icon(512 x 512 (24-Bit PNG))必須
・Landscape(2560 x 1440 (24-Bit PNG))必須
・Square(1440 x 1440 (24-Bit PNG))必須
・Portrait(1008 x 1440 (24-Bit PNG))必須
・VR Landscape (1080 x 360 (24-Bit PNG))必須
・Product Detail Page (PDP) Art (3000 x 900 (24-Bit PNG))必須
・Screenshots (Select 5) (2560 x 1440 (24-Bit PNG))5枚必須
・Cubemap(Please Note: Cubemap processing can take up to two weeks. Your application may go live before your cubemap is processed.) 任意
・Video(Please provide video encoded with H.264 and AAC audio in an MPEG-4 container)任意

#Pricing & Distribution
・値段を決める
![スクリーンショット 2017-03-17 12.30.02.png](https://qiita-image-store.s3.amazonaws.com/0/126397/71ccca5b-a197-603d-7750-e51d11ef5769.png)![スクリーンショット 2017-03-17 12.30.17.png](https://qiita-image-store.s3.amazonaws.com/0/126397/d731dade-3b40-9786-62cc-0a06af9ea5e9.png)


#プログラム的な変更
・Plugins/Android/AndroidManifestのLAUNCHERをINFOに変更

```xml:AndroidManifest.xml
<!--<category android:name="android.intent.category.LAUNCHER"/> -->
<category android:name="android.intent.category.INFO" />
```

・activityにexcludeFromRecents="true"を追加

```xml:AndroidManifest.xml
android:excludeFromRecents="true"
```

・フレームレートを60以上にする
・戻るボタンと戻るボタンの長押しのハンドリング
戻るボタンのハンドリングは適当なオブジェクトにOVRPlatformMenu.csスクリプトを追加する

ただ、ovr_unity_utilities_1.11.0のソースだと長押し処理がめんどくさいので私は過去ソースを使用
https://github.com/HipsterSloth/psmove-unity5/blob/master/Assets/OVR/Moonlight/Scripts/OVRPlatformMenu.cs

OVRPlatformMenu.csにOVR/Prefabs/Cursor_Timerを追加すれば完了

#APKの容量
500MBまで
それ以上は追加ファイルをダウンロードするようにしてください。

#その他
・審査はバイナリを昼前くらいにあげると翌日のAM5時くらいに返事が返ってくる割と早い
・要求される画像がちょーでかい、でかい
・フレームレート改善したい場合はこの辺参考にしたらいいと思います
http://stereoarts.jp/Oculus%20Rift%20%E6%9C%80%E9%81%A9%E5%8C%96%E3%83%A1%E3%83%A2.pdf
SharePointのリボンで「リスト」タブを非表示にする

まず、何故こんなことをしようと思ったのかについてです。

管理上の都合でリストに複数のビューを用意したものの、
一部のビューは一般のユーザーには非公開にしたい！

しかし標準のSharePointではビューの権限設定ができません。
またリボンのボタンを強制的に無効にする方法も、実装するには大掛かりです。
※ ビューに権限設定をする製品も売られています。

権限の設定として、厳密な方法ではないのですが、
CSSでユーザーの目に触れさせないようにしてしまえば、
お手軽ですし、よっぽどの悪意のある方でなければ気が付きません。

SharePoint公式ブログを参考にしています。
まず、そちらに目をとおすことをお勧めします。

SharePoint のページ上で CSS を使用し、特定のページ領域を非表示にする基本テクニック
https://blogs.technet.microsoft.com/sharepoint_support/2014/08/14/sharepoint-css/

## 方法１）リボンのリストタブを非表示にする。
SharePointのリボンで「リスト」を非表示にするCSSです。
次のcssファイルを作成し、マスターページで読み込みます。
ファイル名をcustom.css とします。
リストタブを非表示にし、アイテムタブの右側のボーダーを強制的に描画しています。

``` code:custom.css
li[id='Ribbon.List-title']{
    display:none;
}

li[id='Ribbon.ListItem-title']{
    border-right:solid 1px #36a7ca;
}
```

SharePointデザイナで編集するマスターページ（ここではseattle.master）をコピー＆貼り付けしてバックアップします。

マスターページで用意したcssへのリンクを記載します。

``` code:seattle.master
<SharePoint:CssRegistration ID="CssRegistration2" Name="/Style Library/css/custom.css" runat="server" />
```

## 方法２ リボンのリストタブは表示したままで、ビューセレクタだけを非表示にする。

CSSを次の内容に変更します。

``` code:custom.css
li[id='Ribbon.List.CustomViews']{
    display:none;
}
```
オンプレミスのre:dash を対象とした re:dash slack bot を設定する

# re:dash slack Botとは

re:dash が、[slack bot](https://redash.io/slack)を提供しています。
このSlack Botは、対象がre:dashが提供するSaaSのre:dashでも、各自が自分で立てるオンプレミスのre:dashでも対象とすることができます。

# 設定方法

##AWSのセキュリティグループを設定

インバウンドトラフィックを許可する必要があります。
2017/3/17段階では、re:dash slack botは、「52.7.250.0/32」からアクセスが来ます。
なので、インバウンドを以下のように設定しておきます。
※実際のIPは各自で確認した方がいいかも。
![image](https://qiita-image-store.s3.amazonaws.com/0/65435/20acacc2-ec87-5556-ce7b-019ee862f30c.png)

## re:dash slack botのインテグレーション

[ここ](https://redash.io/slack)にアクセスして、「Add to Slack」ボタンをクリックします。

![image](https://qiita-image-store.s3.amazonaws.com/0/65435/2e4ca5f2-52e6-74e8-8e65-10ed9adfb4d1.png)

Slackチームを選択して、認証を通します。

![image](https://qiita-image-store.s3.amazonaws.com/0/65435/0750147a-ceac-2e93-6519-7eb2a89d9cfe.png)

成功したら、Success画面が表示されて、引き続き対応すべき事項が説明されています。

#初期設定

##注意事項
初期設定は、Slackにredash botからメッセージが来て、それと会話することで設定できます。
初期設定は、一番最初に「Add to Slack」した人にダイレクトメッセージで届きます。
二人目以降には届きません。

一人目が「Add to Slack」を押して、redashから話しかけられているのに放置すると、初期設定が完了しないのです。悲しい。
その場合は、一人目にしてもらうか、一度Slackからredashアプリを消して再度、「Add to Slack」すれば自分に話しかけてくれます。

※未確認ですが、ひょっとしたらredashに「start setup」と言えば初期設定させてくれるかも？

##設定項目

re:dashのURLを聞かれます。
僕はEC2に立てていたので、次のように回答します。
http://ec2-*******.ap-northeast-1.compute.amazonaws.com/

APIキーを聞かれます。
APIキーの取得場所は、次のようにURLを教えてくれます。
![image](https://qiita-image-store.s3.amazonaws.com/0/65435/932958d9-b1e5-318b-2cc7-3d46e36d56a4.png)

これで完了です！！
Ubuntu on VagrantでRuby on Rails環境構築(2)


[環境構築(1)](http://qiita.com/lumbermill/items/b05a1e322a60b40a7b58) の続きです。UbuntuでRailsの新規プロジェクトが立ち上がった状態から、Scaffoldの機能を使ってそれっぽいサイトを作るところまで進みます。

# bundle

まずはbundleにgemを追加するところから。前回の手順(aptでrubyインストール)を踏んで来た場合、bundle installコマンドがほぼほぼ失敗するため、aptで導入できるgemに依存する格好になります。よって、バージョン番号の指定が重要です（apt listで確認できるバージョンを指定してください）。

``` Gemfile
gem 'devise', '~> 3.5'
gem 'rmagick', '~> 2.15'
gem 'twitter-bootstrap-rails', '~> 3.2', '>= 3.2.2'
```

逆に言うと、(aptが提供するより)新しいgemを使いたい場合は、この方法で開発を継続するのは難しいかもしれません。

以下のコマンドでgemが揃って居ることを確認します。エラーが出たらaptパッケージを探して追加してください。

```
bundle
```

## scaffolding and bootstrap

適当なモデルを作ってみます。scaffoldのコマンドはお馴染みのものを実行します。データベースのマイグレートも忘れずに。

```
rails g scaffold posts title body published_at:datetime
rake db:migrate
```

続けて、既存のテンプレートをbootstrap化するためのコマンドを実行します。

```
rails g bootstrap:install static
rails g bootstrap:layout
rails g bootstrap:themed posts
```

上記は色々方法があるようですが、とりあえずこれで。詳しくは[公式サイト](https://github.com/seyhunak/twitter-bootstrap-rails)を確認してください。

設定完了したらWebサーバを再起動して、下記のアドレスにアクセスします。

```
sudo service apache2 restart
```

http://localhost:8080/posts

いかにもBootstrap!なサイトが見えたでしょうか？！

![Screen Shot 2017-03-17 at 11.48.23.png](https://qiita-image-store.s3.amazonaws.com/0/50780/ce56d66d-07d4-c9eb-ebda-f985276b1bca.png "Screen Shot 2017-03-17 at 11.48.23.png")


このgemを使うと[font-awesome](http://fontawesome.io/cheatsheet/)もついでに導入してくれるようです。以下のような記述で沢山のアイコンを気軽に配置できます。

```
<i class="fa fa-fire"></i>
```

![Screen Shot 2017-03-17 at 11.52.20.png](https://qiita-image-store.s3.amazonaws.com/0/50780/24920209-339b-ffef-ac26-56e5141d9fbb.png "Screen Shot 2017-03-17 at 11.52.20.png")


バージョンが4.4のようなので、それより新しいものは残念ながら使えません。。bootstrap標準の[glyphicon](http://getbootstrap.com/components/)はどうかな、と思ったらこちらも残念ながら使えないようです。□に文字化けして表示されてしまいます。何か方法がありそうですが。。

```
<span class="glyphicon glyphicon-fire"></span>
```

![Screen Shot 2017-03-17 at 11.56.48.png](https://qiita-image-store.s3.amazonaws.com/0/50780/b12446c8-0ae0-7b45-52ac-25d316e58cfc.png "Screen Shot 2017-03-17 at 11.56.48.png")
ifttt で GMail をフィルターして slack にメッセージ


何て事はないですが GMail に監視機械から届く通知メールをフィルタしてキーワードにひっかかったら slack の channel に投稿するレシピ。


1. ifttt にサインアップ／ログインして GMail と Slack のチャンネルを開いておきます。
1. `My Applets` から `New Applet` をクリックして新規アプレットを作成。if **+ this** をクリックして GMail を追加
1. `New email in inbox from search` をクリックして検索条件を指定します。条件は [Gmail で使用できる検索演算子](https://support.google.com/mail/answer/7190?hl=ja) 参照。

	例えば FreeNAS の 発送元アドレス を `"address@your.domain"` と設定していて、daily ストレージのデグレが見つかった時などは
	
	```
	Fron:address@your.domain "DEGRADED"
	```
	
	をフィルターとして設定します。(※注:自分のところでまだ動いてないので未検証)

1. **+ then** に Slack を選択、`post to channel` を選んで投稿フォーマットを整えます。

	自分は `Title` に `FreeNASで異常を検知` と文字列を指定して、`Message:` に 
	
	```
	{{Subject}}
	{{BodyPlain}}
	```
	
	を指定しました。メールのサブジェクトと本文が Slack に流れます。(※注:の予定)


以上、メアドが直接乗ってるのでレシピの公開はしないのですが、メール通知を引っかけて Slack へ投稿するレシピの作り方。
MeshLab：「save the file before setting a new texture」のメッセージに悩まされたら

#はじめに
MeshLabで
・Texture > Vertex Color to Texture
・Texture > Vertex Attributes To Texture
のフィルタの実行時に、たまに表題のメッセージが出て先に進めなくなるという現象に遭遇しました。
必ず起きるわけでもないのですが、この現象が発生すると、何度「Save Project As...」や「Export Mesh ...」を実行しても解消せずに困っていました。

↓にも同様の現象に悩んでいる人がレポートしていましたがレスポンスは付いていませんでした。
（2014年の書き込みなので投稿者はもう見ていないだろうけどコメントをつけておきました）
https://sourceforge.net/p/meshlab/bugs/391/

#原因
プロジェクトの保存先ディレクトリにマルチバイト文字列が含まれていると、この現象が起きるようです。
ディレクトリ名をシングルバイトに変更したらこの現象は解消しました。
ちなみに、半角スペース混じりのディレクトリは大丈夫なようです。

#再現したバージョン
MeshLab_64bit_fp v2016.12 (built on Dec 23 2016)
【Delphi / C++Builder 10.2 Tokyo 新機能・改善点】RAD Server の改善など

# 【Delphi / C++Builder 10.2 Tokyo 新機能・改善点】RAD Server の改善など
2017年3月15日、東京ミッドタウン カンファレンスホール Room7 で開かれた イベント [0315 in TOKYO](https://community.embarcadero.com/blogs/entry/delphi-c-builder-0315-in-tokyo-japan)にて、ジム マッキースが発表した Delphi / C++Builder / RAD Studio 10.2 Tokyo の改善点新機能をざっくりとまとめておきます。正式リリースとして3月28日を予定しており、すべての機能を保証できるものではありませんが、発表内容の第一報として記載します。

##**RAD Server とは**
サーバーサイドのロジックを書ける開発ツールです。
このあたりを参考に：

* https://www.embarcadero.com/jp/products/rad-server
* https://community.embarcadero.com/blogs/entry/inspect-request-and-responce-data-between-radserver-and-client-by-mitmproxy-japan
* http://qiita.com/mojeld/items/84f97605268fe9f3ce47

##**RAD Serer の改善**
###マルチテナントのサポート
* 1つのRAD Serverデータベース接続を持つ1つのRAD Serverインスタンスで、複数の別々のテナントをサポートできるようになりました
* 各テナントには、ユーザー、グループ、インストール、エッジモジュール、およびその他のデータを含む一意のRADサーバーリソースセットを持てます
* テナント管理：新規テナントの作成、既存テナントの編集、テナントの追加、編集、削除ができます。
![image](https://qiita-image-store.s3.amazonaws.com/0/145847/926075df-831e-3e82-0faf-cda4191f741b.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/145847/05e5937d-3717-005b-411a-8851a9f4eadb.png)

##**Linux サポート**
**ハイライト**

- [x] DelphiにてLinuxのサポートを行いました
- [x] Linux Intel 64-bit サーバーが対象
- [x]  WebBroker と DataSnap、EMSを使って サーバーサイドのロジックを開発することができます
- [x]  FireDACを使用してデータベースのアクセスが可能
- [x]  Ubuntu 16.04 LTS と Red Hat Enterprise Version 7 をサポートしています。
- [x]   Enterprise Edition以上のSKUでサポートとなっています。

###Delphi Linux Compiler
* 64-bit Linux プラットフォームのサポート
* Delphi 言語のみ対応（C++はアップデートをお待ちください）
* LLVM テクノロジに基づいています
    * ARC が有効 
* 1-based strings
    * ZEROBASEDSTRINGS OFF がdefault


###サポートされる Linux
* Ubuntu Server (Ubuntu 16.04 LTS)
* RedHat Enterprise Linux (version 7)

### RTL 機能のサポート
* Linuxのファイルシステムのアクセス
* スレッディングとパラレルプログラミングライブラリをサポート
* メモリーマネジメント
* HTTPコールのためのHTTP と REST ライブラリのサポート

###64-bit Linux for Server Applications
* FireDACをご利用いただけます。 （Informixは例外）WebBroker, RAD Server (EMS), と DataSnap 
* Multi-tier サーバーのサポート (standalone と Apache モジュール).
* DUnitX サポート
* PAServer サポート
* Indy-based クライアントと、サーバーのサポート

##**おことわり**
本情報は正式リリース前の情報であり、これらの計画は、現在の当社の状況にて確認していているもので、ビジネスデシジョンや市場の状況などで開発計画および優先順位は変更される可能性があります。またここに記載されている仕様や改善点の保証やお約束をできるものではありません
【Delphi / C++Builder 10.2 Tokyo 新機能・改善点】IDEまわりの改善など

# 【Delphi / C++Builder 10.2 Tokyo 新機能・改善点】IDEまわりの改善など
2017年3月15日、東京ミッドタウン カンファレンスホール Room7 で開かれた イベント [0315 in TOKYO](https://community.embarcadero.com/blogs/entry/delphi-c-builder-0315-in-tokyo-japan)にて、ジム マッキースが発表した Delphi / C++Builder / RAD Studio 10.2 Tokyo の改善点新機能をざっくりとまとめておきます。正式リリースとして3月28日を予定しており、すべての機能を保証できるものではありませんが、発表内容の第一報として記載します。


## **IDEの生産性（プロダクティビティー）の改善**
**ハイライト**

- [x] Code Insight と Code Completion for Delphi が 正しく static と dynamic arrays を扱えるようになりました。
- [x] The Find In Files ダイアログは High DPI 画面で 動作します。
- [x] 異なる DPIでの フォームのデザインとオープン のサポートが改善されました。
- [x] 「表示」メニューが再構成されました。オブジェクトインスペクタ、構成、メッセージ 以下の既存のデバッグウインドウ サブメニューと新しい「編集」のサブメニューが 数々の編集アクションと、使える「編集」のコンテキストメニューからなる機能を含んでいます。そのほかのアイテムたちも関係したアイテムたちとまとめられるよう再配置されています。
- [x] エクスプローラでのファイルの場所を示す「エクスプローラで表示」メニューアイテムは、プロジェクトマネージャのコードエディタタブおよびファイルのコンテキストメニューに表示されます。
- [x] プロジェクトのマニフェストファイルのサポートは、Invoker、Highest Available、Require Administratorのようないくつかの実行レベルをサポートし、UI Accessフラグを設定できるようになりました。
- [x] IDEのローディングスピードが、ネットワーク負荷が高い場合やネットワーク接続が不足している場合でも速くなっています。
- [x] 100以上のプロジェクトを持つようなとても大きなプロジェクトグループをビルドのサポートが改善されました。

**「表示」メニューが再構成された例**
![image](https://qiita-image-store.s3.amazonaws.com/0/145847/7c3f2992-d029-9cd2-0952-606ead93d53a.png)

## **デバッガー関連**
###iOS デバッガー
* iOS10 デバッグのフルサポート (10.1 Berlin ホットフィックスによるもの)
*  iOS シミュレーター デバッグのフルサポート (10.1 Berlin ホットフィックスによるもの)
* Virtual functions は Delphi と C++で評価されることが可能に
* iOS デバッガー で Delphi の string 値 を記載することがサポートされました。
* 文字配列を評価すると、期待される結果が得られます
* デバッグセッションを終了するエラー（macOS上でも）が解決されました

### macOS デバッガー
*  macOS Sierra デバッグのフルサポート (10.1 Berlin ホットフィックスによるもの)
*  デバッグセッションを終了するエラー（iOSの場合も同様）が解決されました
* Android デバッガー[編集]
* Virtual functions は Delphi と C++で評価されることが可能に
* 
### Linux デバッガー
* Linux上でのデバッガーをサポート (Delphi のみ)

##**クイック編集機能**
Berlin 10.1 Update2 より追加された機能として引き続き、クイック編集機能が 10.2Tokyo に搭載されています。
今のところ、VCLのみ対応し、今後FireMonkeyへの展開を計画中です。
![image](https://qiita-image-store.s3.amazonaws.com/0/145847/c3502423-b1bb-dbf7-7968-7f2d784e8039.png)
メニュー右クリックからよく使うコンポーネントの設置ができたり、コンポーネントの配置を設定できたり、テキスト設定などのプロパティを設定できたりするので、簡単素早くUI設計ができるようになります。

##**おことわり**
本情報は正式リリース前の情報であり、これらの計画は、現在の当社の状況にて確認していているもので、ビジネスデシジョンや市場の状況などで開発計画および優先順位は変更される可能性があります。またここに記載されている仕様や改善点の保証やお約束をできるものではありません
【Delphi / C++Builder 10.2 Tokyo 新機能・改善点】FireDAC、データベース接続周りの改善など

#【Delphi / C++Builder 10.2 Tokyo 新機能・改善点】FireDAC、データベース接続周りの改善など
2017年3月15日、東京ミッドタウン カンファレンスホール Room7 で開かれた イベント [0315 in TOKYO](https://community.embarcadero.com/blogs/entry/delphi-c-builder-0315-in-tokyo-japan)にて、ジム マッキースが発表した Delphi / C++Builder / RAD Studio 10.2 Tokyo の改善点新機能をざっくりとまとめておきます。正式リリースとして3月28日を予定しており、すべての機能を保証できるものではありませんが、発表内容の第一報として記載します。

##FireDAC の変更
**ハイライト**

- [x] 新機能 - MariaDBサポート（v5.5以降）
- [x] v5.7のMySQLサポート
- [x] FirebirdのDirect I/Oサポート
- [x] 実行時に使うためのデータを編集する TFDMemTableの データセットエディターを追加
- [x] TFDDataMoveコンポーネントを削除。 TFDBatchMoveを代わりに使用してください

### Firebird向けの改善
* Direct I/Oバックアップ機能をサポートする新しいDirectプロパティを追加

###MySQL向けの改善
* MySQL v 5.7をサポート。
* MariaDB v5.5以降のサポート
* MySQLバージョン5.6.xおよび5.7.xとのコンパチビリティ
* MySQLプリペアドステートメントAPI：古いAPI（MySQLテキストプロトコル）とPS API（MySQLプリペアドステートメントプロトコル）の両方をサポート
* TFDResourceOptions.DirectExecuteプロパティを使用して好みのAPIを選択可能
* 使用中のAPIに応じて、TFDCommand.CommandIntf.CliObjプロパティはTMySQLStatementまたはTMySQLResultオブジェクトを返します
* 内部BLOBストリーミングのサポート（smOpenWriteモードのみ）。
* 接続トランザクション状態とTFDConnection.InTransactionプロパティの同期の改善。このプロパティを使用すると、接続トランザクションが現在進行中かどうかを判断できます。

###その他のFireDACの変更
* TFDDataMoveコンポーネントはこのリリースから削除され、ツールパレットでは使用できなくなりました。代わりにTFDBatchMoveコンポーネントを使用してください。
注：レガシープロジェクトにTFDDataMoveが必要な場合は、次のサイトにあるFireDAC.Comp.DataMove.pas unit を使用してください：
Start | Programs | Embarcadero RAD Studio 10.2 Tokyo | Samples を選択したのち、Object Pascal\Comp Layer\TFDBatchMove\DataMove_Deprecated 
* TFDBatchMoveが最適化されました。その結果、TFDBatchMoveMappingItemのDestValueおよびSourceValueプロパティは使用できなくなりました。
* TFDMSAccessServiceは、Microsoft Access 2007以上をサポートするようになりました。

* TFDMemTableデータセットを設計時にを編集するためにTFDMemTableコンポーネントを拡張しました。TFDMemTableのコンテキストメニューに、[Edit DataSet ...]の項目が表示され、コンポーネントデータを編集してフォームに保存することができます。データは実行時に利用可能です。
注意：[Edit DataSet ...]を使用する前に、データセットフィールドのフィールド定義をTFDMemTable.FieldDefsに指定するか、永続フィールドを作成する必要があります。
* FireDAC InterBaseドライバは、InterBase XE7 DTおよびCTEをサポート

##**DB RTL の変更**

* TFieldに新しいAsGUIDプロパティ
* ブロブストリーミング時のクライアント側のメモリ使用量の削減
* VCL TDBImageで、JPEGおよびPNGフォーマットをダイレクトサポート
* DBGridにおいて、BlobFieldの表示オプションのサポート

##**おことわり**
本情報は正式リリース前の情報であり、これらの計画は、現在の当社の状況にて確認していているもので、ビジネスデシジョンや市場の状況などで開発計画および優先順位は変更される可能性があります。またここに記載されている仕様や改善点の保証やお約束をできるものではありません。
【Delphi / C++Builder 10.2 Tokyo 新機能・改善点】C++ コンパイラ 周りの改善など

#【Delphi / C++Builder 10.2 Tokyo 新機能・改善点】C++ コンパイラ 周りの改善など
2017年3月15日、東京ミッドタウン カンファレンスホール Room7 で開かれた イベント [0315 in TOKYO](https://community.embarcadero.com/blogs/entry/delphi-c-builder-0315-in-tokyo-japan)にて、ジム マッキースが発表した Delphi / C++Builder / RAD Studio 10.2 Tokyo の改善点新機能をざっくりとまとめておきます。正式リリースとして3月28日を予定しており、すべての機能を保証できるものではありませんが、発表内容の第一報として記載します。


###デバッグのよりよいサポート
Clang拡張 コンパイラにおいて:

* Clang拡張コンパイラでビルドされたコード内のローカル変数wp、ローカル変数ビューで評価できます
* メソッド内の異なるスコープの同名の二つのローカル変数において、現在のローケーションに基づいて正しいローカル変数を評価し表示できるようになりました
* クラス名は常にコールスタックに表示されるようになりました。
* デバッグ情報の外部タイプファイルのサポート。ビルド時に生成されるデバッグ情報のサイズが大幅に削減されます。

###Codegenの改善
Clang拡張 コンパイラにおいて:

* Codegen の -O1および-O2の最適化レベルが改善、既知の問題も修正されました
* -O3 を新たにサポート。コンパイルされたコードのパフォーマンスが倍以上になることも。

###モバイルプラットフォームサポート
* C++ Androidアプリケーションは、NDKの特定のバージョンを必要とせずにビルドが可能に


###リンカー
C++ linkerの大きな改善点は:
* リソースハンドリングを改善し out of memory, VIRDEF, dwarf_str などのヒープエラーを改善
* リンカが最大 4GBまで利用可能に。 
* リンカオプションが拡張され、指定のタイプのデバッグまたはリンカデータのリソース割り当てサイズを設定できるようになりました。


###例外ハンドリング
* メモリリークに関連したエラーに対処する例外処理の品質向上。

##おことわり
本情報は正式リリース前の情報であり、これらの計画は、現在の当社の状況にて確認していているもので、ビジネスデシジョンや市場の状況などで開発計画および優先順位は変更される可能性があります。またここに記載されている仕様や改善点の保証やお約束をできるものではありません
Python 3移行 > link > print('total: %.2f' % total_val) > print("total: {0:6.2f}".format(total_val)) にしなくてもよい / PEP-498 書式化文字リテラル print(f'total: {total_val:6.2f}')

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
```

## 過去の情報

参考 [Python3の文字列について。%記法とformat()記法の対応関係](http://auewe.hatenablog.com/entry/2013/10/16/083627) by aueweさん

> Python3では '%d'とか'%+5.3lf'のような記法は推奨されず、廃止される。 代わりにformat()を使う必要がある。

リンク先には分かりやすい対応表が掲載されています。
情報感謝です。


例として、実際に使っているコード
```
print('total: %.2f' % total_val)
```
は以下となる。
```
print("total: {0:6.2f}".format(total_val))
```

`
print("total: {0:0.2f}".format(total_val))
`でも希望している数値が表示されたが、正しいかは未調査。

`
print("total: {:.2f}".format(total_val))
`は以下のエラーが出た。

```
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: zero length field name in format
```

## 2017年3月17日現在の情報

@shiracamus さんの[コメント](http://qiita.com/7of9/items/1e8dc1668b21df9f411a/#comment-12a76343e2c8f1b93caa)にてPython3での`%`演算子について教えていただきました。
情報感謝です。

それによりますとformat()を使う必要はからなずしもそうではないようですね。

いくつか書き方があり、ソースリーディングしやすいと思われるものを使おうかと思います。
npm runコマンドを実行したら警告が出るようになった

## 問題
Nodistでnodeをインストールするようにしたら、以下の警告が出るようなった。

![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/48056/80ccabb5-869a-5e0f-f2c8-32dd3b510f90.png)

私の環境は Windows 10 Pro + Visual Studio Code

## 解決方法
次のコマンドを実行したら警告が消えた

``` bash
> npm config set scripts-prepend-node-path true
```

## 感想
「--script-prepend-node-pathというオプションを使え」という英語のメッセージは読み取れたが、「毎回フルパスを指定するなんて面倒すぎる」と誤解していた。そのオプションを「イキ」にすればいいだけだった。
Mapserver その4

#概要
ライブラリーを使わないで、googlemapやleafletのワールド座標、ピクセル座標、タイル座標を求めてみた。


#写真

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/Y/5/x/Y5xs.jpg?t=1489716047)


#成果物

http://jsdo.it/ohisama1/Y5xs

#サンプルコード

```
var MERCATOR_RANGE = 256;
function bound(value, opt_min, opt_max) {
    if (opt_min != null) value = Math.max(value, opt_min);
    if (opt_max != null) value = Math.min(value, opt_max);
    return value;
}
function degreesToRadians(deg) {
    return deg * (Math.PI / 180);
}
function radiansToDegrees(rad) {
    return rad / (Math.PI / 180);
}
function MercatorProjection() {
    this.pixelOrigin_ = {
        x: MERCATOR_RANGE / 2, 
        y: MERCATOR_RANGE / 2
    };
    this.pixelsPerLonDegree_ = MERCATOR_RANGE / 360;
    this.pixelsPerLonRadian_ = MERCATOR_RANGE / (2 * Math.PI);
};
MercatorProjection.prototype.fromPointToLatLng = function(point) {
    var me = this;
    var origin = me.pixelOrigin_;
    var lng = (point.x - origin.x) / me.pixelsPerLonDegree_;
    var latRadians = (point.y - origin.y) / -me.pixelsPerLonRadian_;
    var lat = radiansToDegrees(2 * Math.atan(Math.exp(latRadians)) - Math.PI / 2);
    return {
        lat: lat, 
        lng: lng
    };
};
MercatorProjection.prototype.fromLatLngToPoint = function(latLng, opt_point) {
    var me = this;
    var point = opt_point || {
        x: 0, 
        y: 0
    };
    var origin = me.pixelOrigin_;
    point.x = origin.x + latLng.lng * me.pixelsPerLonDegree_;
    var siny = bound(Math.sin(degreesToRadians(latLng.lat)), -0.9999, 0.9999);
    point.y = origin.y + 0.5 * Math.log((1 + siny) / (1 - siny)) * -me.pixelsPerLonRadian_;
    return point;
};
function test0() {
    var zoom = 11;
    var x = +document.getElementById('x').value;    
    var y = +document.getElementById('y').value;
    var projection = new MercatorProjection();
    var point = {
        x: (x * MERCATOR_RANGE) / Math.pow(2, zoom),
        y: (y * MERCATOR_RANGE) / Math.pow(2, zoom)
    }
    var latlng = projection.fromPointToLatLng(point);
    document.getElementById('koko0').innerHTML = latlng.lng + " " + latlng.lat;
}
function test1() {
    var zoom = 11;
    var lng = +document.getElementById('lng').value;    
    var lat = +document.getElementById('lat').value;
    var projection = new MercatorProjection();
    var latlng = {
        lat: lat,
        lng: lng
    };
    var worldCoordinate = projection.fromLatLngToPoint(latlng);
    var pixelCoordinate = {
        x: worldCoordinate.x * Math.pow(2, zoom), 
        y: worldCoordinate.y * Math.pow(2, zoom)
    };
    var tileCoordinate = {
        x: Math.floor(pixelCoordinate.x / MERCATOR_RANGE), 
        y: Math.floor(pixelCoordinate.y / MERCATOR_RANGE)
    };
    document.getElementById('koko1').innerHTML = tileCoordinate.x + " " + tileCoordinate.y;
}
```
Python 3移行 > TypeError: must be real number, not map の対応 > map()をlist(map())にする

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
```

以下のコードはPython 2では問題がなかった。

```test_numpy_170317.py
#!/usr/bin/env python

import numpy as np

vals = map(float, [3., 1., 4.])
total_val = np.sum(vals)
print('total: %.2f' % total_val)
```

Python 3で実行すると、以下のエラーが出る。

```
Traceback (most recent call last):
  File "test_numpy_170317.py", line 7, in <module>
    print('total: %.2f' % total_val)
TypeError: must be real number, not map
```

Python 2ではmap()で返るものはlist objectだった。
Python 3ではmap()で返るものはmap objectになっているようだ。

参考 http://stackoverflow.com/questions/1303347/getting-a-map-to-return-a-list-in-python-3-x

map objectをlist()でくくることで、エラーは出なくなった。

```test_numpy_170317.py
#!/usr/bin/env python

import numpy as np

vals = list(map(float, [3., 1., 4.]))
total_val = np.sum(vals)
print('total: %.2f' % total_val)
```
PostgreSQL の実行計画を見やすくする in Rails

# 目的

Rails で Active Record が発行する SQL の実行計画を見やすくする。

# 方法

今回 [plans](http://tatiyants.com/pev/#/plans) という Web ツールを利用します。

このツールを利用するには `EXPLAIN (ANALYZE, COSTS, VERBOSE, BUFFERS, FORMAT JSON)` を実行した結果の JSON が必要です。

例として、以下のリレーションが発行する SQL の実行計画を JSON で取得し、前述のツールに適用してみます。なお、通常は [ActiveRecord::Relation#explain](http://apidock.com/rails/ActiveRecord/Relation/explain) を使って実行計画を取得できるのですが、今回はいくつかのオプションを指定する必要があるので別の方法を採用します。


```rb
Character.joins(:animes).merge(Anime.where("#{Anime.table_name}.title LIKE ?", '%物語%')).order(:name).limit(10)
```

まず [ActiveRecord::Base.connection.execute](http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/DatabaseStatements.html#method-i-execute) を使って、EXPLAIN を実行します。

```rb
relation = Character.joins(:animes).merge(Anime.where("#{Anime.table_name}.title LIKE ?", '%物語%')).order(:name).limit(10).class
result = ActiveRecord::Base.connection.execute("EXPLAIN (ANALYZE, COSTS, VERBOSE, BUFFERS, FORMAT JSON) #{relation.to_sql}")
#=> #<PG::Result:0x007f97c3fa3ae0 status=PGRES_TUPLES_OK ntuples=1 nfields=1 cmd_tuples=0>
```

次に、返り値から JSON 文字列を取り出します。

```rb
json = result.first['QUERY PLAN']
```

最後に puts で JSON 文字列を出力して、それをコピーして [plans](http://tatiyants.com/pev/#/plans) のテキストエリアにペーストします。

```rb
puts(json)
```

![ss01.png](https://qiita-image-store.s3.amazonaws.com/0/6697/53952ff1-2ba6-66e2-58cb-51ccefa5ea54.png)

SUBMIT ボタンをクリックすると、EXPLAIN の結果がツリー形式で図示されます。

![ss02.png](https://qiita-image-store.s3.amazonaws.com/0/6697/248a3568-6840-9ec1-b7b9-c6293118b1fd.png)

# 参考

* [RubyLetter - A Rubyist's Guide to Postgresql's Explain](http://www.rubyletter.com/blog/2017/03/13/rubyist-guide-to-postgres-explain.html)
VMware Horizon  性能改善の確認ポイント#1


VDIやRDSHでどうもCPU性能を出しきっていないと思ったら・・

まずは利用しているハードウェアが省電力モードになっていないか確認を。

BIOS設定で、

Advanced > CPU Configuration > Performance にする

ほとんどのメーカーはEnergy performance などでディフォルト出荷しています。

例：
富士通：

Performance へ変更する

ラックマウントサーバ：
http://jp.fujitsu.com/platform/server/primergy/products/note/svsdvd/dvd/pdf/bx924s4-d3143-bios-jp.pdf

ブレード：
https://sp.ts.fujitsu.com/dmsp/Publications/public/wp-haswell-bios-settings-primergy-ww-ja.pdf

Cisco : 

最大パフォーマンスへ変更する

http://www.cisco.com/web/JP/product/hs/ucs/ucs_c/prodlit/pdf/whitepaper_C11-733130.pdf


次にESXi の設定も忘れずに。

高パフォーマンスに変更する

https://kb.vmware.com/kb/2032716
2017-03-17 CentOS 6.8 > Python 3.6.0をvirutalenvで導入 / 使用開始 / 使用停止

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
```

Python3環境をvirtualenvで導入してみる。

参考 http://qiita.com/a_yasui/items/5f453297855791ed648d

Python 2系列については未実施。
Python 3.6.0に関して、「Easy_install をインストールさせる」以外の項目を実施。
`/opt/local`ディレクトリはなかったため作成した。

導入後の使い方は以下で実施。

```
$ cd
$ /opt/local/bin/virtualenv venv_py360
```
ここでvenv_py360はPython 3.6.0のvirtualenvの意味 (任意の文字列)。

```
$ source venv_py360/bin/activate
```
にて使用開始。

```
$ deactivate 
```
にて使用停止。

CentOS 6.8にはもともとPython 2.6.6が入っており、deactivateにすればそちらが使える。

これでPython 2とPython 3のいずれでも使えるようにはなりそう。

virtualenvwrapperなどもあるが、必要になってから使うのでいいかと思う。

/opt/local/binにPython 2とPython 3両方入れて問題ないかは未確認。pip install virtualenvをPython 2とPython 3でした時に/opt/local/bin/virtualenvを後者が上書きするのだろうか。

間違って作ったvirtualenv環境はrm -rfで消すようだ (rmvirtualenv コマンドがない環境にて)。
http://stackoverflow.com/questions/11005457/how-do-i-remove-delete-a-virtualenv
> Simply remove the virtual environment from the system.There's no special command for it

```
rm -rf venv
```

### 補足事項 > numpyのインストール

numpyなど使うものをインストール。pip installでは失敗 (No module が表示)。
virtualenvをactivateした状態で以下とした。

```
$ easy_install numpy
(中略)
Adding numpy 1.12.1rc1 to easy-install.pth file
Installing f2py3.6 script to /home/[user]/venv_py360/bin

Installed /home/[user]/venv_py360/lib/python3.6/site-packages/numpy-1.12.1rc1-py3.6-linux-x86_64.egg
Processing dependencies for numpy
Finished processing dependencies for numpy
```
where_conditioner という gem

whereにconditionを指定する際に

```
  employees = Employee.where(company_id: company_id) if company_id.present?
```

みたいのを書いていて、
どうも`if XXXX.present?`と書くのがイマイチな感じがしていました。
いっぱい書くとrubocopに怒られますしw
他の条件とchainしたい時も、

```
  employees = Employee.where(company_id: company_id)
  employees = employee.where(section_id: section_id) if section_id.present?
```

のように書かなくてはならなくてどうもシックリこない。

で、うまいことやってくれるgemは無いものかと探してみたら・・・ありました

**where_conditioner**

今回使いたいのは`where_if_present`というメソッドです。
これを利用すると、上記に書いたプログラムが、

```
  employees = Employee.where_if_present(company_id: company_id)
```

と書くことができて、ちょっとスッキリします。
もちろんchainにも対応しているみたいで、

```
  employees = Employee.where_if_present(company_id: company_id).where_if_present(section_id: section_id)
```

みたいに繋げることもできます。


一点注意として、パラメータをそのまま引数に渡した場合

```
  Employee.where_if_present(company_id: params[:company_id])
```

params[:company_id]が`""`の空文字列として渡されてしまい、クエリで`company_id = null`が指定されてしまいます。

一旦の回避策として、上記の場合は、

```
  Employee.where_if_present(company_id: params[:company_id].presence)
```

とすればOKです。
これもなんか不毛な気がしますが・・・・orz


なにか他に同じような事ができるgemを知っている方・・・教えて欲しいです
VMware Horizon  Horizon Client for Windows 4.4 リリース


ver 4.4 がリリースされました。
Horizon Client は3か月毎のペースでリリースされていますね。

新機能は以下の通り。

リリースノート

https://pubs.vmware.com/Release_Notes/en/horizon-client/horizon-client-windows-44-release-notes.html#keyfeatures


ダウンロードはこちら

https://my.vmware.com/web/vmware/details?downloadGroup=CART17Q1_WIN_440&productId=578&rPId=15156

Horizon Client 4.3以降、
バイナリーは32bit/64bitで統一されました。
DockerでマウントされたNodejs(Express)を編集後に自動再起動

# 概要

 NodejsのDocker環境でリソースをマウントしながら動的に開発をする際に、リソースを更新したら自動再起動してほしい
しかし、いくつかの自動再起動モジュール（forever、node-dev）を試してみたところマウントした状態では自動再起動してくれない

# 結論

  nodemonを使えば、マウントされた状態でソースを更新しても自動再起動してくれる
パラメータに***-L***を入れること！

```
nodemon -L app.js
```

## nodemon

nodemonのインストールや使い方については他の投稿者で多数上がっていますので割愛します

https://github.com/remy/nodemon
Python > make altinstall > バイナリ上書き | リンク破壊を避ける

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
```

CentOS 6.8にPython 3環境をインストールしようとしている。
[CentOS 6.8 > Python 3.6.0をvirutalenvで導入 / 使用開始 / 使用停止](https://qiita.com/7of9/items/41c2a3575356818188be)

参考 http://beyondjapan.com/blog/2016/03/centos6-python27and35

上記にてmake altinstallというのを初めてみた。

https://docs.python.jp/3/using/unix.html
> 警告 make install は python3 バイナリを上書きまたはリンクを破壊してしまうかもしれません。そのため、make install の代わりに exec_prefix/bin/pythonversion のみインストールする make altinstall が推奨されています。
Ubuntu on VagrantでRuby on Rails環境構築(1)


---
**2017.06.15追記**
aptでruby-railtiesパッケージを入れる方法はgemの追加が難しいことが分かってきました。aptではruby本体のインストールにとどめ、残りはgemで入れる方法を採用しています。

```
apt -y install ruby-dev libmysqlclient-dev libmagick++-dev libcurl4-openssl-dev libssl-dev
gem install bundler mysql2 rails rmagick therubyracer passenger --no-ri --no-rdoc
```
---



最新のUbuntu16(Xenial)でRailsの「Welcome aboard」を出すまでの手順です。CentOSよりだいぶ手軽かも…。


## 注意事項
- どこを見渡してもrbenv一色で、このやり方はかなりマイナー？な可能性があります。ひょっとしたらとんでもないディスアドバンテージが潜んでるかも…。
- あくまで、Vagrant環境での構築手順です。セキュリティは一切考慮しません。


## 準備(vagrant + ubuntu)
まずは、vagrantに仮想環境を作ります。任意のディレクトリでボックスを初期化して。

```
mkdir ubuntu && cd ubuntu
vagrant init ubuntu/xenial64
```

生成されたVagrantfileの以下の行のコメントを外します。

``` Vagrantfile
config.vm.network "forwarded_port", guest: 80, host: 8080
```

仮想マシンを立ち上げてログイン。

```
vagrant up
vagrant ssh
```

ここから先はUbuntuのrootユーザで作業します。 `sudo -i` などのコマンドで予めrootに昇格してください。

``` 
apt -y update
apt -y upgrade

apt -y install mysql-server apache2 apache2-dev libapache2-mod-passenger rails
apt -y install ruby-railties ruby-bundler ruby-mysql2 ruby-devise ruby-rmagick
```

途中でMySQLのパスワードを設定しなさい、と何度かダイアログが出ますが、全て無視（そのままエンター）。さらに、mysqlにログインして以下のようにユーザと権限を追加します。これで一般ユーザ(ubuntu)からもmysqlクライアントを使ってデータベースを操作することが出来るようになります。

``` mysql 
mysql -e "create user 'ubuntu'@'localhost'"
mysql -e "grant all privileges on *.* to 'ubuntu'@'localhost'"
```

## Rails
ここはubuntuユーザで作業します。まずはRailsのプロジェクト作成。

```
cd /vagrant
rails new railsapp --database=mysql
```

データベースの接続ユーザを先ほど追加した名前に変更します（rootのままでは接続できません）。

``` config/database.yml 
default: &default
  :
  username: ubuntu
```

空のデータベースを生成します。

```
rake db:create
```

UbuntuでRubyを入れると比較的新しい(執筆時点で2.3.1)バージョンが入るのですが、gemやbundlerがほとんど動作しない状況になってしまうようです（ここは不便なところですね）。その代わり、`apt search ruby-(gemの名前)` で検索すると、メジャーなものが多く用意されているようです。 `bundle` でエラーがでる場合は、aptからパッケージの追加を試みてください。 

## Apache2 + passenger
Webrickを立ち上げても勿論良いんですが、passengerを使って常に起動した状態にしてみます。
再びroot権限で作業します。

passengerが正しくインストールされているかどうかは、以下のコマンドで確認することができます。

```
passenger-config validate-install 
```

以下のファイルを編集します。

``` /etc/apache2/apache2.conf
<Directory /vagrant/>
        AllowOverride All
        Require all granted
</Directory>
```

``` /etc/apache2/sites-available/000-default.conf
DocumentRoot /vagrant/railsapp/public
PassengerAppEnv development
```

完了したら、Webサーバ(apache2)を再起動します。

```
service apache2 restart
```

以下のアドレスにアクセスして、おなじみの「Welcome aboard」が表示されたら成功です。

http://localhost:8080

![Screen Shot 2017-03-17 at 9.14.50.png](https://qiita-image-store.s3.amazonaws.com/0/50780/fa7752ea-c3e1-251a-9588-d920e6340bd5.png "Screen Shot 2017-03-17 at 9.14.50.png")


次はbootstrapの導入とscaffoldをやってみます。[環境構築(2)](http://qiita.com/lumbermill/items/2432cab6e3360666b4f2)
[Python] assert文で超お手軽テスト


## assert文とは
条件式がTrueではない時に、例外を投げます。
これを仕込んでおくと、それまでちゃんと動いていたコードが、いじっているうちにいつの間にか想定と異なる振る舞いをするようになった時に、いち早く気づくことが出来ます。「とにかく想定と違ったら止める」というだけで良いなら、別途テストを書かなくていいので便利です。
**機械学習やデータ分析** では、仕様が決まっておらず試行錯誤しなければいけない部分が多くあるし、アドホックな対応も結構あり、テストを書くことが必ずしもなじまない場合が多いと思います。このような領域では、特におすすめしたいです。
pytestなどのちゃんとしたテスト用途以外では、asset文はJupyter Notebookで使うのが一番効果的だと個人的には思います。関数のセルの下に、assert文でちょっとしたテストを書いておくと便利です。また、データを読み込んだ直後にデータチェックをしたり、データの結合や更新などの処理の後に、重複や欠損のチェックを入れたりするのも良いでしょう。データ分析時点ではデータ内容はガチガチに固められていなくて、はじめから、あるいは処理の結果想定外の内容になっていることは十分ありえます。

## 使い方
構文は以下のとおりです。

```py3
assert 条件式, 条件式がFalseの場合に出力するメッセージ
```

条件式が ```False``` の場合、```AssertionError``` の例外が発生します。
条件式が ```True``` の場合は何も起こりません。

```pycon
>>> kitai = 100
>>> input = 1
>>> assert kitai == input, '期待する値[{0}], 入力値[{1}]'.format(kitai, input)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: 期待する値[100], 入力値[1]

```

ちゃんと例外を処理するならこんな感じ。

```pycon
>>> try:
...     kitai = 100
...     input = 1
...     assert kitai == input, '期待する値[{0}], 入力値[{1}]'.format(kitai, input)
... except AssertionError as err:
...     print('AssertionError :', err)
... 

AssertionError : 期待する値[100], 入力値[1]

```

## assert文を無効にする
assert文は、組み込み定数```__debug__```が```True```の時のみ実行されます。特に何もしなければこの状態です。
Pythonスクリプト実行時のコマンドラインオプションに```-O```をつけると、```__debug__```が```False```になり、assert文が無効になります。

## 参考
Python3.6 公式ドキュメント
- [7.3. ```assert``` 文](http://docs.python.jp/3.6/reference/simple_stmts.html#assert)
- [3. 組み込み定数 ```__debug__```](http://docs.python.jp/3.6/library/constants.html#__debug__)
- [1. コマンドラインと環境 ```-O``` オプション](http://docs.python.jp/3.6/using/cmdline.html#cmdoption-O)
Ruby on Railsを使って新規アプリを作成し、TOPページを表示させる

#前提
Ruby・Rails初心者の方向けに書きました。
あらかじめRailsを使って開発するための環境(Homebrew・rbenv・ruby-build・Ruby・Ruby on Rails・MySQL等が入っている状態)が整っていることを前提に話を進めさせて頂きます。

開発環境
ruby  2.4.0
rails 5.0.2

#以下アプリ作成の手順

まずはデスクトップにプロジェクトフォルダーを作成しましょう。名前はprojectsで作成するとします。

作成が終わったらターミナルを開き、以下のコマンドを順に打ちます。

```
$ cd Desktop

$ cd projects
```

projectsフォルダーまで移動できたらターミナルにてrails newコマンドを使ってRailsで新規アプリケーションを作成します。以下アプリケーションの名前はrails_practiceという名前で作成しますが実際にはお好きな名前で作成していただいて大丈夫です。

```
$ rails new rails_practice -d mysql -T
```
上記ではテストファイルを作成しないというオプションとデータベースをmysqlに最適化されるようなオプションをつけて生成しています。

その他rails newコマンドを打つ際に他のオプションをチェックしてみたいという方はターミナルにて以下コマンドを打っていただけると確かめることができます。

```
$ rails new -h
```

またrails newコマンドを打った際デフォルトではそのまま自動でbundle installまで行われてgemがインストールされます。これ以後もし必要なgemをGemfileに書き足した場合は以下手順に沿ってgemのインストールをしてください。
*アプリケーションの存在するディレクトリにてお願いします。

```
$ bundle update

$ bundle install
```

rails newコマンドを打ち無事にファイルの作成に成功したらそのアプリのディレクトリに移動しましょう。

```
$ cd rails_practice
```

次にデータベースの作成を行いましょう。
以下コマンドをターミナルにて打ち込んでください。

```
$ rake db:create
```

これによりdevelopment環境とtest環境のデータベースが作成されました。

しかしこれだけではまだrails sコマンドを打って http://localhost:3000/ につなげても画面はうつりません。

まだルーティングとコントローラー・ビューの設定をしていないのでその準備をしましょう。

今回はTopページを表示させるということでTopコントローラーというのを作成してビューを作成します。皆さんが実際にアプリを作成なされる場合には、トップ画面にしたいビューをご自身で決めて頂きそれにそってコントローラーやルーティング・ビューを作って頂いて良いです。あくまで以下の手順は一例に過ぎません。


まずは以下のコマンドをターミナルにて打ち込んでコントローラーファイルの作成をしましょう。

```
$ rails g controller top
```

作成が終わったらapp/controllers配下に入っているtop_controller.rbファイルを開き以下のように編集しましょう。

```top_controller.rb
class TopController < ApplicationController

  def index
  end

end

```

次にルーティングを設定しましょう。config配下に入っているroutes.rbファイルを開きましょう。そして以下のように編集してください。

```routes.rb
Rails.application.routes.draw do
  root 'top#index'
end

```

上記のrootというのは本来http://localhost:3000/ にアクセスした場合、RailsのWelcome画面が表示されるのですがそこに自分の設定したビューを表示させることができる書き方です。


以上の作業が終わりましたら残すはビューの設定です。ビューについては以下のルールがあります。

*view配下にあるコントローラー名と同じフォルダの中にあるactionの名前と同じファイル名のものが適用される*


上記のルールに沿ってビューファイルを生成しましょう。

view/top配下にindex.html.erbという名前でファイルを作成しましょう。

そして以下のように編集しましょう。

```index.html.erb
top#index
```

以上でtop画面を表示させるための準備は完了しました。

`rails s`を実行し、 http://localhost:3000/ にアクセスしてみましょう。以下の画面が表示されていれば成功です。

<img width="903" alt="スクリーンショット 2017-03-17 7.01.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/155553/095cfa56-4a3c-890b-43e3-73a63cebf054.png">


以上の作業を行うことでアプリケーションを作成させる上で最初に必須のtopページを作成できました。

このページを基盤にして自分の作りたいアプリの作成に取り掛かりましょう！！
技術英語 > We can [fill you in on the details] once we know you're with us. / I [took sides with] him against them in the argument. / I am on your side.

<font color=red>アニメです</font>
[RWBY Volume 3, Chapter 6:Fall](https://youtu.be/moxtu3AuA4s?list=WL&t=470)

7:56から

> Pyrrha: You're not talking about a war?
> Ironwood: Not a war between nations.
> Qrow: We can **fill you in on the details** once we know you're with us.

意訳 
Pyrrha 「戦争の話を言っているのではないの？」
Ironwood 「国家間の戦争の話ではない」
Qrow 「おまえが我々の側につくと分かれば、詳細を教えることができる」

<hr>
関連して思い出したのは take sides

http://ejje.weblio.jp/content/take+sides

> I **took sides with** him against them in the argument.

situation comedyで「彼の肩を持つな」という場面で使われていた。

<hr>

孤立した人に対しては、`I am on your side.`と励ますのもありかと。
http://ejje.weblio.jp/content/on+your+side
Cognos パフォチュー事例 - 巨大なクロス集計表

##概要
巨大なクロス集計表を使用して、パフォーマンスが悪化している事例です。
巨大なクロス集計表とは、行・列に配置されたデータアイテムのメンバー数が非常に多いクロス集計です。
以下のような、HTMLItem(JavaScript)等でヘッダーを固定しているような場合も要注意です。
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/53241ff4-9bb2-718e-cb6c-4564b7bdde09.png)

##内容
クロス集計の行・列に大量のメンバーを配置するとレスポンスは悪化します。

例えば「日時」みたいな数万～のメンバーで構成されるデータアイテムを配置した場合、単品のデータアイテムの配置でも、レポートのレンダリングに非常に時間がかかり、レスポンスは厳しくなります。

また、多くのデータアイテムをネストで配置している場合（「製品」「日付」「場所」「会社名」などなど）、レンダリングの時間だけでなく、レポート処理の中で生成される一時キューブを作成する過程で非常に時間がかかります。

下記は、行・列に単品のデータアイテムを置いて、メンバー数を変えてレスポンス測定をしたものですが、メンバー数によってレスポンスタイムが顕著に異なることがわかります。
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/d80c767a-3b25-9d41-12ed-d0300d75ddc0.png)

##対応策
以下のような対応をご検討下さい。
・1ページに表示される行数を制限する。
・多数のデータアイテムを使用せず、必要なデータアイテムのみに絞る。
・どうしても大量のデータの表示が必要な場合、クロス集計ではなくリスト表の使用も検討する。
PyPI登録までの手順まとめ

# はじめに

PyPIでPythonパッケージを登録しました．
その手順が古い，更新されていない等戸惑った部分があった，自分用まとめです．

# 参考文献

###### setup.pyの作成まで

- [PyPIデビューしたい人の為のPyPI登録の手順](http://qiita.com/kinpira/items/0a4e7c78fc5dd28bd695)
- [Pythonライブラリをパッケージ化する](http://diveintopython3-ja.rdy.jp/packaging.html)

###### Wheelについて

- [Inconsistent behaviour of bdist vs sdist when distributing a Python package](http://stackoverflow.com/questions/35510972/inconsistent-behaviour-of-bdist-vs-sdist-when-distributing-a-python-package)
- [Python packaging: wheels vs tarball (tar.gz)](http://stackoverflow.com/questions/31401762/python-packaging-wheels-vs-tarball-tar-gz)
- [Python: Wheel でパッケージを配布する](http://momijiame.tumblr.com/post/90829820326/python-wheel-%E3%81%A7%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%92%E9%85%8D%E5%B8%83%E3%81%99%E3%82%8B)

###### その他

- [Upload package to PyPI By twine](http://qiita.com/ksomemo/items/526918004fa3d26e9691)

# 最終的な実行結果

PyPIのUploadには，[twine](https://github.com/pypa/twine)が推奨されております．
sdistではなく，bdist_wheelを使いました．(訂正:両方使います．)

```
pip3 install twine

python3 setup.py sdist bdist_wheel --python-tag=py3
twine register dist/xxx-1.0.0-py3-none-any.whl
twine upload dist/*
```

日本語の解説記事では，sdist使うかbdist_wheelを使うか記事によってどっちもまちまちでした．そのため，混乱しました．
PyPIのサイトを見ると，両方アップロードするが正解なので両方アップロードしましょう．
Wheelを使うべきか，否かは参考リンク先を参照してください．
VSCode をKobito っぽく使う

# VSCode を　Kobito っぽく使う

QiitaのKobitoとかMarkdownの共有サービス便利でいいですね。。
なるべくエディタはvscodeに一元管理したいのと、データはgithubにまとめたいなと思ったので、できないか調べてみました。

# Step1 VSCodeの拡張機能を入れる

これを使います

[Run on Save](https://marketplace.visualstudio.com/items?itemName=emeraldwalk.RunOnSave)　ファイル保存時に自動でコマンド実行

[Auto Run Command](https://marketplace.visualstudio.com/items?itemName=gabrielgrinberg.auto-run-command) プロジェクトを開いたときにコマンド自動実行

# Step2 メモ共有用のレポジトリを作りパスワード不要でpull & pushできるようにする

# Step3 Workspace settingを書く

VSCodeの自動保存機能と、RunOnSaveでファイル保存時にauto commit & pushの設定。

``` json
{
    "files.autoSave": "onFocusChange",
    "emeraldwalk.runonsave": {
        "commands": [
            {
                "match": "\\.md$",
                "cmd": "cd ${workspaceRoot}; git add --all; git commit -a -m 'auto commit'; git push origin master;"
            }
        ]
    },
    "auto-run-command.rules": [
     {
         "command": "workbench.action.git.pull",
         "message": "git pull"
     }
    ]
}
```

[Auto saveについては、こちらを参照](https://code.visualstudio.com/docs/editor/codebasics#_save-auto-save)

[Markdown プレビューは,こちらを参照 ](https://code.visualstudio.com/docs/languages/markdown#_markdown-previwe)

 # TODO

 - [ ] ファイル名を自動で決める

 コンフリクトしたら、gitコマンドで修正してください　:P
Retrofit(というかGSON)でキーが不定(数字)なJSONを受け取る

# こんなJSON

```json
{
  "list":{
    "32295":{
      "key1":"value1",
      "key2":"value2"
    },
    "32375":{
      "key1":"value1",
      "key2":"value2"
    },
    "32391":{
      "key1":"value1",
      "key2":"value2"
    }
  }
}
```

`32295` `32375` `32391` の部分がケタ数こそ決まっているものの、不定(正確には、パターン数は決まっているけど、膨大)です。
なかなか見ない形(少なくとも私は初めて見ました)だと思うのですが、一般的なのでしょうか？

# 結論

試行錯誤の末、以下のようなクラスで受け止めることで、正しく値を取得することができました。
よかった。よかった。

```java
public class HogeResponse {
    public Map<Integer, Fuga> list;
}
```

Mapのkeyに `32295` `32375` `32391` が格納されます。

# ちなみに

こんな形のJSONでよかった気がするのですが、何がどうなって上記のようなJSONが誕生したのでしょう。。。
気になります。。。

```json
{
  "list":[
    {
      "key":"32295",
      "key1":"value1",
      "key2":"value2"
    },
    {
      "key":"32375",
      "key1":"value1",
      "key2":"value2"
    },
    {
      "key":"32391",
      "key1":"value1",
      "key2":"value2"
    }
  ]
}
```
PineappleのPython環境をpyenvで変更できるようにしたメモ

IPythonのMac用フロントエンドアプリPineappleの最新バージョンPineapple-0.8.0(Python 3.5, Full version)(2017年3月17日現在)を[Pineapple公式サイト](https://nwhitehead.github.io/pineapple/)からダウンロードしたものの，どういうわけかpyenvで構築した環境が反映されなかったので，その解決方法をメモ．もっと頭の良い方法がある気がする．

pyenvで構築したPython環境のパスを確認する．

```
which python
```

<img width="249" alt="スクリーンショット 2017-03-17 2.11.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/133375/d56d1ef2-5675-3515-1ad6-f69380f6aad4.png">

/Applications/Pineapple.app/Contents/Frameworks/Python.framework/Versions/下にあるCurrent　という名前のディレクトリのリンク先をさきほど調べたPython環境のパスに変更する．

```
cd /Applications/Pineapple.app/Contents/Frameworks/Python.framework/Versions/
ln -nfs /Users/***/.pyenv/shims Current
```

Pineappleを再起動してKernel>Change>local Pythonを選択する．
pyenvでPythonのバージョンを変更するとPineappleのPython環境も変更されている．

<img width="341" alt="スクリーンショット 2017-03-17 2.20.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/133375/34e7cb10-e497-8e21-a9e6-5f8ecfd2aab4.png">

<img width="956" alt="スクリーンショット 2017-03-17 2.20.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/133375/cfe48431-9e46-0610-d00d-86c04d837b22.png">
Canon LBP プリンタは CentOS 7 x86_64 で使えます

#結論

Canon の CAPT ドライバ for Linux は CentOS 7 x86_64 で使えます。

#実例

CAPT version 2.70 で試しました。
LBP7200CN に Asianux 7 sp1 から印刷できました。

#情報源

ドライバのダウンロードページだと rpm 系 x86_64 Linux は Fedora しか記述がありません。
http://cweb.canon.jp/drv-upd/lasershot/linux/captlinuxx64.html

ソースのリポジトリの readme に「Fedora 18 以降は pangox-compat が必要」と書いてあります。
https://github.com/Magister/cndrvcups-capt/blob/master/README-capt-2.7xJ.txt

#具体策

EPEL 7 に pangox-compat が存在します。めでたしめでたし。

#その他

pangox-compat 以外は OS リポジトリ内の rpm だけで利用できます。
普段から EPEL を使っている人は yum localinstall が何事もなく完了することでしょう。

#注意

CAPT は CUPS の他に自前の daemon を必要とします。この daemon は rpm をインストールしただけでは自動起動に設定されません。

起動スクリプトは /etc/init.d/ccpd です。そして postinstall で chkconfig ccpd on されません（add はされます）。
VBA: 複数検索可能なInStr代替プロシージャ

#調べたい文字列に対して、複数の文字列の組を検索させる
##注意点
- あくまでInStrメソッドの応用なので、部分一致検索になる
- 完全一致はご存じの通り"="が利用可能なはず
- また、CSVファイル向けには、その行を引数に、内部でSplitをかけるアレンジも可能（同様の方法で、条件数が可変の場合に対応できる）
- 比較の前提としてvbStringの型一致を判定しているが、必要に応じて外してもよいはず

```VB.Net:InStrs.bas
Public Function IncludeStrs(ByVal val As String, ParamArray strArr() As Variant) As Boolean
    Dim itemVar As Variant
    IncludeStrs = True
    
    For Each itemVar In strArr
        If VarType(itemVar) = vbString Then
            If InStr(1, val, itemVar) > 0 Then
                Exit Function
            End If
        End If
        DoEvents
    Next
    
    IncludeStrs = False
End Function
```
Raspberry Pi3とbluetooth接続したスマホの音楽再生をAVRCPで制御する

#はじめに
Raspberry piとBluetooth接続したスマホの音楽再生をAVRCPで制御する方法のメモ

#環境
- Raspberry Pi3(Raspbian Jessie Lite)
- Python 2.7.9
- bluez5
- スマホ(androidでもiPhoneでも)

#前準備
https://gist.github.com/oleq/24e09112b07464acbda1
http://blog.bnikka.com/raspberrypi/raspberrypibluetooth.html
上記URLを参考に、RaspberryPiをBluetoothオーディオ(A2DP)レシーバ化し、スマホから音楽再生できる状態にしておく
(※A2DPで接続しないとAVRCPが使えないみたいだが、もしかするとAVRCPのみで使う方法もあるかも？)

#AVRCPで制御してみる
dbus-pythonを使ったデモ

```BT_MediaPlayer.py
#!/usr/bin/python

import dbus

SERVICE_NAME = "org.bluez"
ADAPTER_INTERFACE = SERVICE_NAME + ".MediaPlayer1"
bus = dbus.SystemBus()
manager = dbus.Interface(bus.get_object(SERVICE_NAME, "/"),
                    "org.freedesktop.DBus.ObjectManager")
objects = manager.GetManagedObjects()

if __name__ == '__main__':
    for path, ifaces in objects.iteritems():
        adapter = ifaces.get(ADAPTER_INTERFACE)
        if adapter is None:
            continue
        print path
        player = bus.get_object('org.bluez',path)
        BT_Media_iface = dbus.Interface(player, dbus_interface=ADAPTER_INTERFACE)
        break

    while 1:
        s = raw_input()
        if s == 'quit': 
            break
        if s == 'play':
            BT_Media_iface.Play()
        if s == 'pause':
            BT_Media_iface.Pause()
        if s == 'stop':
            BT_Media_iface.Stop()
        if s == 'next':
            BT_Media_iface.Next()
        if s == 'pre':
            BT_Media_iface.Previous()
        if s == 'show':
            track =  adapter.get('Track')
            print 'Title: ' + track.get('Title') 
            print 'Artist: ' + track.get('Artist')
            print 'Album: ' + track.get('Album')
            print 'Genre: ' + track.get('Genre')
            print 'NumberOfTracks: ' + str(track.get('NumberOfTracks'))
            print 'TrackNumber: ' + str(track.get('TrackNumber'))
            print 'Duration: ' + str(track.get('Duration'))

```

上記のコードを実行すると入力待ち状態となるので、コマンドを入力する
使用可能なコマンドは以下の通り

- quit : プログラム終了
- show : 曲情報の表示
- play : 再生
- pause : 一時停止
- stop : 停止
- next : 次の曲
- pre : 前の曲

うまくいけば接続したスマホのパスが表示され、各種コマンドで音楽再生を制御できる
下記はshowコマンドを実行した例
![BT_MediaPlayer_show.png](https://qiita-image-store.s3.amazonaws.com/0/98071/72f89a92-d02a-b3c4-4e2f-6d182495a7a6.png)

#参考
http://qiita.com/eggman/items/339a9c9b338634ac27a5
https://www.raspberrypi.org/forums/viewtopic.php?t=111486&p=766936
[メモ]オブジェクトデザイン 1章-設計概念

# オブジェクトは賢くあるべき

- 自分自身の属性を持ち、役割を持っている(使われる側のオブジェクト)
- オブジェクトを利用したり、協調結果を参照して自律的に判断する(オブジェクトを使うオブジェクト)  
ただ、こいつもどこかから参照して使えるようにはなっているべき？

↓

あるレベルでは一部であり、あるレベルでは全体となれる

オブジェクトの振る舞いは設計された振る舞いに厳密に制限される
__→行き当たりばったりのやんわりプログラミングでは到達できない__


# ソフトウェアの構成

- アプリケーション: 相互作用するオブジェクトの集合
- オブジェクト: 1つ以上のロール(役割)の実装
- ロール: 関連する責務の集合
- 責務: タスクを実行する義務、または情報を知っている義務
- コラボレーション: オブジェクトもしくはロールの相互作用
- 契約: あるコラボレーションを行う際に満足すべき条件を要約した取り決め  
(これはコラボレートを行うオブジェクトが持つのかコラボレートされるオブジェクトが持つのか  
オブジェクトが持つと役割が増えるのでこれはオブジェクトを使う側が判断するべきかな)

# ロール

オブジェクトが意図された環境で行われるべき役目のこと

抽象化された役目について、責任を持つオブジェクトは交換可能であるべき。
役目を果たすためのロジックの集合体。

ex.)
例えばecサイトの支払いという責務については
コンビニ払い
クレジット払い
着払い
等のロジックがある。
支払いという役目が発生した時にロジックが選択可能であれば良い。

多分遠回しにストラテジーパターンのことを言っているのだと思う

# 一貫した使いやすいオブジェクトを作り上げるために

__オブジェクトのロールステレオタイプという概念__
オブジェクトの責務を単純化し、パターンを定義する。
→オブジェクトのロールを考える時にどういうオブジェクトを作ろうとしているか理解しやすくなる

- 情報保持役
- 構造化役
- サービス提供役　: 一般に演算サービスを行う
- 調整役
- 制御役
- インターフェース役

# オブジェクトの契約

責務を果たすための条件をもれなく保証する。
あるオブジェクトを使用するときの決まりごとなど

単純な話、責務(業務ドメイン)を行うためにロールの集合体があり、コラボレータによってロールが利用されるのかな。

# パターン

オブジェクト指向で開発してきた熟練者たちが、よく出くわす問題を抽象化しパターン化したもの

「オブジェクト志向における再利用のためのデザインパターン」が詳しいようだ。

後述のDouble Dispatchパターンが見ていて気持ちよかったので
この本も読んでみたい。

## Double Dispatchパターン(visitorパターン)

一般的に2つの相互に関係を持つオブジェクトに対して、受け入れ側が行う処理は
受け入れた相手のオブジェクトに任せる(時には自身、受け入れ側を渡す)ことで
ifやswitchの条件分岐を減らし、保守性をあげる。

### 例(コードは割愛)

__じゃんけん__

あくまで、一対一の前提。

出した手同士を戦わせて、win, draw, loseを出力する。

Rock、Scissors、Paperのオブジェクトを用意する。

それそれのオブジェクトは、じゃんけんというインターフェースを実装する

```php:じゃんけんインターフェース
interface じゃんけん{

    public function fight(じゃんけん $obj){}

    public function resultRock(): string{}

    public function resultPaper(): string{}

    public function resultScissors(): string{}

}

```

各result*()メソッドの実装方法は、自分と戦わせた時の結果を返すようにする。
例えば、RockのresultPaper()の返り値は、`lose`
RockはPaperに勝てないから

fightメソッドの実装はというと、受け取ったオブジェクトに自分との結果を
問い合わせるようにする。
これがvisitorパターンと呼ばれる由来なのか

どういうことかというと、Rockでの実装はこんな感じ

```php:Rock

public function fight(じゃんけん $obj)
{
    return $obj->resultRock();
}

```

うん、オブジェクト同士が連携していていい感じ、これを本で見たときには
キレイだなぁと感動しました。

そして、じゃんけんを行う際には
オブジェクトが持つfightメソッドに相手が出した手のオブジェクトを渡す

```php:実行
$rock = new Rock;
$paper = new Paper;

echo $rock->fight($paper); //lose
echo $paper->fight($rock); //win
```

### デメリット

登場人物が増えた際に各オブジェクトを修正しなければならないので
登場人物が固定されているときに役立つ

頻繁に判定を行うための登場人物が増えるような問題を扱うには向いていない


# 感想

まだ一章だが、理解して読むために1ページを何度か戻って読まなければならない
重めの本だと学習。

それだけ自分のオブジェクト指向で書いたり設計したりするための概念的な部分が
抜けていたんだなと。

Double Dispatchパターンはじゃんけん以外の現実世界での例がないかなと探していましたが
見つからなかったので、じゃんけん例を借りることに

何かあればご教授ください、、実装課題として使いたい。

多分、2章が終わる頃にはこの部分は抜けているんだろうな。。