OmniAICreator/Qiita-1.07M huggingface dataset:
[Kotlin]新しいプログラミング言語を覚えるためのリソースとコツ

この文章は初めてAndroidスマートフォン用アプリケーションをKotlin言語（ことりん）で開発する方法を学びたい人向けに書かれています。

# はじめに
新しいプログラミング言語や開発環境を覚えようと思ったら、まず大切なのは情報収集です。
良質の本を用意して読破すると良いでしょう。一通り覚えたら、次は実践です。インターネット上のサンプルをじっくり読んだり、サンプルが豊富な書籍で学習していくと良いでしょう。最後に自分でお題を決めてなにか一つのアプリケーションを完成させてみましょう。
Kotlinでも同じです。本を読み、サンプルを理解し、実際にアプリを完成させることが重要であり、学習の近道です。

## Kotlinを覚えるコツ
手を動かしましょう。本を読んだり動画を見たりして理解できたつもりでも、実際に手を動かさないとなかなか記憶として定着しにくいものでです。実際にKotlinのREPL環境でコードを入力して実行してみましょう。
※REPL=対話型評価環境。プログラムを書いてすぐに試してみる事ができる環境です。Android StudioをインストールすればKotlinのREPL環境も一緒にインストールされます。

## 少し変更してみましょう
サンプルソースをちょっとだけ変更してみましょう。どこを変更すると、どのように動作が変わるのかを理解することとができます。

## 多くのサンプルに触れましょう
たくさんのサンプルソースを実行してみましょう。KotlinとAndroidで何ができるのかを理解することが、あなたの作りたいアプリケーションを現実のものにする近道です。またどんなアプリケーションを作りたいか決めていない人には、アプリのアイディアの源泉となるでしょう。

# Kotlin学習のためのリソース
Kotlinを学習するにあたり参考にしたもの、参考になりそうなものを集めてみました。

## 書籍
まだKotlin言語の参考書は多くありません。定番の書籍を記載しておきます。

### スッキリわかるJava入門
http://amzn.to/2B7i81S
Java入門書のベストセラーです。全くのプログラミング初心者は一通り目を通してからKotlinに入りましょう。そのほうがオブジェクト指向やJavaのことを理解できるので、すんなりとKotlinに入ることができます。
KotlinとはJava Vertial Machine言語です。Javaと無縁のものではないのです。そのため、Javaの知識も多少必要です。オブジェクト指向の知識がない、Javaを全く知らないという、全くのプログラミング初心者は、Javaに関する一通りの知識と、オブジェクトとは何か？というところから入ると良いでしょう。Kotlinを覚えるためにJavaを覚えるというのは、遠回りなようでそれが一番の近道です。
特にAndroid開発をするのであれば、現状Android APIがJavaで作られている関係上、Javaはかけなくても読めるぐらいにはしておくと何かと役に立ちます。

### Kotlinスタートブック
http://amzn.to/2iKHE6v
いわゆる赤べこ本です。太郎さん（日本Kotlinユーザグループ代表）の本です。

### Kotlinイン・アクション
http://amzn.to/2A4N2LH
Kotlinスタートブックが物足りなくなったら、これも読むと良いでしょう。Kotlin1.0に対応しています。

### Kotlin for Android Developers(English)
https://leanpub.com/kotlin-for-android-developers
Leanpubという電子書籍の販売および購入ができるサイトで販売されています。購入後に内容が思ったものと違っていれば返品も可能です。細かな説明はありませんのでサンプルコードをダウンロードして参照しながら読み進めることのできる人、ある程度プログラミング経験のある方向けです。初心者にはおすすめしません。

### Android Kotlinスタイルガイド
https://android.github.io/kotlin-guides/style.html
KotlinでAndroidアプリケーションを開発する際のルールやコーディング基準です。命名規則やフォーマットなどはこれに則っておくと良いでしょう。

### Kotlinチートシート
https://qiita.com/emboss369/items/c39f196e703447820b47
Javaはマスターしていて、ちょっとKotlinも触って見たいという場合、実際にKotlinのコードを動かすのが早いと思います。そこで実行できるコード付きのKotlinチートシートを作成しました。Kotlinをさらっと１０分で眺めて見たいJavaプログラマや、Kotlinを始めたばかりのプログラマさんでKotlinの書き方をど忘れした時なんかに便利です。またWebブラウザからコードを実行できるので理解が早まります。

### はじめてのAndroidプログラミング 第3版
https://amzn.to/2HkGEA5
今回AndroidをKotlinではじめたい方向けに書いた本です。Kotlin＆Androiｄが初めてでもつまずかないよう丁寧に説明しています。Androidの入門書でKotlinの本はこれが初めてだと思いますので、ぜひ参考にしていただければと思います。

## サンプルソース
実践で使えるコードをどんどん書けるようになるためには、とにかく人のソースを真似しましょう。サンプルソースは良い教材です。サンプルを動かしながら、KotlinとAndroidを深く理解していきましょう。そして、サンプルソースを自分なりに変更してみて、どのように動作がかわるのかを試してみましょう。

### Try Kotlin
https://try.kotlinlang.org/
「Examples」にKotlinのサンプルコードが沢山あります。しかもオンラインでKotlinを実行することができるので、実際に動かして試してみることができます。また「Kotlin Koans」では42問の問題を解くことで短時間でKotlinの言語、構文、構造、およびいくつかの一般的な関数とライブラリを学ぶ事ができます。
※ちなみにkoanとは禅の公案(禅の精神を究明するための問題、いわゆる禅問答)に由来し、不完全なコードと、答えであるテストケースがセットになったものです。不完全なコードを修正したりコードを足したりすることで、テストケースが成功すれば正解です。koanは新しい言語やフレームワークを学習する最善の方法の1つです。

### Kotlin samples
https://developer.android.com/samples/index.html?language=kotlin
まだKotlinのサンプルソースは少ないですが、Googleのサンプルが豊富で参考になります。

あなたのおすすめのリソースがあれば是非コメント欄へお願いします！
Visual Studio | WPF > グラフ > LiveCharts > 凡例を表示する

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

### 処理内容

- 凡例を表示する

### 実装方法

参考: [Basic Line Chart @ LiveCharts](https://lvcharts.net/App/examples/v1/wpf/Basic%20Line%20Chart)

- XAML
    - lvc:CartesianChart に対して「LegendLocation」を指定する
- code behind
    - LineSeriesなどに「Title」を追加する

### code 

```MainWindow.xaml
<Window x:Class="_171124_t1600_legend.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_171124_t1600_legend"
        xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <lvc:CartesianChart Series="{Binding seriesCollection}" Height="250"
                                LegendLocation="Right"/>
        </StackPanel>
    </Grid>
</Window>
```

```MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
// 以下を追加
using LiveCharts;
using LiveCharts.Wpf;

namespace _171124_t1600_legend
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            graph_init();
        }

        private void graph_init()
        {
            gd = new GraphData();

            var sc = new SeriesCollection {
                new LineSeries
                {
                    Title = "pi",
                    Values = new ChartValues<double> { 3, 1, 4, 1, 5, 9, 2 }
                },
                new LineSeries
                {
                    Title = "napier",
                    Values = new ChartValues<double> { 2, 7, 1, 8, 2, 8, 1, 8 }
                }
            };

            gd.seriesCollection = sc;
            this.DataContext = gd;
        }

        GraphData gd;
        public class GraphData
        {
            public SeriesCollection seriesCollection { get; set; }
        }       
    }
}
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/556d6719-f993-a9b4-167e-c850eb64cd1a.png)

### 検索用キーワード

- legend
encrypted_secretsの設定の順番には気をつける

# Rails 5.1のEncrypted secretsの設定に関して

`config.read_encrypted_secrets=true` の設定とパラメータを取得する順番は気をつける必要がある



例えば、application.rb は production.rb より前に読まれるので、 `config.read_encrypted_secrets=true` を production.rb で記述していて、かつ、application.rb 内で `Rails.application.secrets.*****` 等と呼んだ場合、
その設定値は反映されない。


また、それ以外のパラメータも `secrets.yml.enc` から読み込まれなくなるので、必ず `config.read_encrypted_secrets=true` 後に `Rails.application.secrets.*` を呼ぶようにすること



https://github.com/rails/rails/issues/28618
The application.rb is read before production.rb. Therefore, can not read encrypted secrets because try to read before setting config.read_encrypted_secrets to true in production.rb.
If you want to use encrypted secrets in application.rb, you need to add config.read_encrypted_secrets = true to application.rb. As following:

```
config.read_encrypted_secrets = true

config.action_mailer.smtp_settings = {
  address:              'smtp.sendgrid.net',
  port:                 587,
  user_name:            'apikey',
  password:             Rails.application.secrets.sendgrid_api_key,
  enable_starttls_auto: true
}
```

## rails 5.1のEncrypted secretsについては
https://qiita.com/yoan/items/1a98371fe7ac524379e9
クレジットカード番号を保有せずクレジットカード番号を保存するCard on Fileの使い方

Eコマースサイトなどでよくある「クレジットカード番号を保存する」チェックボックスですが、これをチェックしておくとクレジットカード番号がそのまま保存されそうで何となく避けてしまう人も多いでしょう。とは言え、毎回の決済時にカード番号を入力するのも面倒です。

そこでSquareで提供しているのがCard on Fileと呼ばれる機能です。これはカード番号を保有せず、サービス提供事業者がカード決済を繰り返し使えるようにする機能です。

今回はRuby on Railsで簡易的に実装したデモを元に紹介します。

## 認証について

カード情報を保存するので、認証はあった方が良いでしょう。今回はDeviseを使って簡単に実装してあります。

## カード番号の保存

認証後、カード番号を保存できるようになります。

![Screenshot_ 2017-11-23 14.40.03.png](https://qiita-image-store.s3.amazonaws.com/0/197026/658dd810-ce74-d68c-a9e6-e3ad28f53ff9.png)

クレジットカード番号の入力フォームです。Bootstrapベースになっています。ちなみにここで表示されているテキストボックスはすべてSquare側のiframe内で提供されており、Webサービス提供側からは触れないようになっています。ユーザからの見た目はWebサービス側そのままですし、デザインの自由度も高いのですがセキュリティ的に安全な仕組みになっています。

カード番号を入力してカード番号を保存するボタンを押すと、まずカード番号や有効期限、CVVといった情報がSquareのサーバに送られます。その結果、一時的に決済に使えるトークン（nonce）が発行されます。このトークンと決済金額を合わせて決済ができますが、これは一度しか使えません。

## カード情報を永続化する

そこでこのトークンを映像化します。そのためにはまずSquareの顧客APIを使って、顧客を作ります。これはカード番号をまとめて管理するためのもので、メールアドレスや名前などだけで作れます。パスワードは不要です。

Rubyの場合は次のように実装します。

```
api = SquareConnect::CustomersApi.new

if current_user.square_customer_id.nil?
  customer = api.create_customer({
    email_address: current_user.email
  }).to_hash[:customer]
  current_user.update_attribute :square_customer_id, customer[:id]
end
```

次にこの情報とカードのトークン（nonce）とを結びつけてカードを作成します。

```
card = api.create_customer_card(
  current_user.square_customer_id, {
  card_nonce: card_nonce
}).to_hash[:card]
```

後はこの結果をもとに、IDをデータベースに保存します。

```
current_user.cards.create(
  nonce: card[:id],
  last4: params[:last_4],
  brand: params[:card_brand],
  exp_month: params[:exp_month],
  exp_year: params[:exp_year]
)
```

## 決済を行う

では決済を行う場合です。処理時には店舗ID（location_id）や処理ID（ユニークな文字列）が必要です。そして前述の顧客ID（current_user.square_customer_id）とカードIDを使って決済が行えます。

![Screenshot_ 2017-11-24 9.14.15.png](https://qiita-image-store.s3.amazonaws.com/0/197026/2a86aa58-6aba-bb50-c324-fe9eb91e94f1.png)

```
idempotency_key = SecureRandom.uuid
card = current_user.cards.find(params[:checkout][:card])
amount = params[:checkout][:amount].to_i # 決済額

api = SquareConnect::TransactionsApi.new
transaction = api.charge(load_config['location_id'], {
  idempotency_key: idempotency_key,
  amount_money: {
    amount: amount, currency: 'JPY'
  },
  customer_id: current_user.square_customer_id,
  customer_card_id: card.nonce
}).to_hash[:transaction]
```

このIDの組み合わせであれば繰り返し決済処理が行えます。

![Screenshot_ 2017-11-24 9.22.15.png](https://qiita-image-store.s3.amazonaws.com/0/197026/bb8285da-8e7f-1fd1-b432-c232a6f75ed8.png)

----

こちらのコードは [goofmint/Square_Card_on_File_Demo: SquareのCard on Fileを使ったデモです。](https://github.com/goofmint/Square_Card_on_File_Demo) にアップロードしてあります。実装時の参考にしてください。また、質問がある場合には [Teratail](https://teratail.com/tags/Square) にてお願いします！

[Build with Square](https://docs.connect.squareup.com/)
Visual Studio app center　の自動UIテストをEspressoで試した時に躓いた事のメモ　

なんか気になってたので使ってみました。
Androidでまずやってみような感じでやったら色々躓いたのでメモ。

環境はMacです
まずはここを呼んでみよう（ΦωΦ）
英語？グーグル翻訳を使え
https://docs.microsoft.com/en-us/appcenter/test-cloud/preparing-for-upload/espresso

Espressoについては下記の記事にお世話になりました
https://qiita.com/fujin/items/df97a97ef80491f16122


基本一番上のサイトの説明の通りに行けばOKだけど
躓いたのは下記のコマンドを叩く時　サイト側で最後に「これコピペして使ってねー」なやつで出てくるんですが
あんまり説明無いので調べながら叩きまくったのです（ΦωΦ）

appcenter test run espresso --app "<app-center-username/app-name>" --devices "app-center-username/named-device-set" --app-path pathToFile.apk  --test-series "master" --locale "en_US" --build-dir pathToEspressoBuildFolde


これ叩く時にどのapkのパス渡せばいいかわからなかった。
（説明がうまく理解できず）
下記のコマンド叩いた後に
./gradlew assembleDebug
./gradlew assembleDebugAndroidTest

pathToFile.apk 　にはandroid-debug.apk　のパス
pathToEspressoBuildFolde　にはapp-debug-androidTest.apkがあるディレクトリのパスを入れたら
アップロードまで行けました（ΦωΦ）

うーん、もうちょっと楽に出来ないかなー？
他人のタイピングを速くさせる方法 

# 概要
タイピングを速くする事は学習速度に直結するためにかなり重要だ。
しかし、練習は時間を必要とするため通常はスキップされがち。
でも、タイピング遅い人が居ると学習の進捗がバラバラになって困るから、手軽に速くする方法が必要だ。
それで、それを実現する器具作ったから、その記録として残す。

# はじめに
情報の授業なんかでも最初にやるのはタイピングのやり方とかでしょう。
なので、授業ではタイピングのやり方を教えているはずですが、仕事でタイピングをするには遅いという人が大半です。
具体的には、[e-typing](https://www.e-typing.ne.jp/) でDの人が来ます。
（キーボードを見ないと打てない。人差し指と中指しか使わない。）
そこから、仕事を問題なくやっていくためBくらいまでにはなって欲しいのです。
**一刻も早く。しかも安く。**

# 求められる事
0. 安く実施できる
  * 相手の人数が結構多いため 
1. 放置でうまくいく
  * 教える方も教わる方も気楽で良い
  * 教える時間がかからない
  * 教わる方の時間を選ばない
2. やる気なくてもうまくいく
  * やる気が必要とされる方法は続かない
  * 他にも覚えてほしい事があってそちらの方が優先度高い
3. 短時間で効果が出る
  * 速さは安さにつながる
  * そのためにハードルも低めに設定している

# Qiitaにある方法
明らかに、e-typing D の人向けの記事は無い。当然かもしれないが、PC初学者向けの記事は無い。
唯一見つけたのが[これ](https://qiita.com/ryunosukeheaven/items/76f4dfc534f2c8a9f663)
こういう記事ありがたい。
確かに、PC初学者は現役のエンジニアの速度の1/5程度のタイピング速度なんですよね。
それでプログラミングやってみましょうって言っても難しい。
後は、　[これ](https://qiita.com/yamatok/items/50c107ff40312cf03824)
いや、流石に精神論ではうまくいく気がしなかった。
自分はともかく、他人に ”死ぬ気でやれ” って言っても限度があるし、
そういう高いモチベーションの人は勝手に速くなっていくからこの記事必要ない。
また、その高いモチベーションは別の方に向けたほうが良い様な気もする。
タイピングが本業ではないため、本業を頑張って欲しい。

# だから矯正器具を作った
<img src="https://qiita-image-store.s3.amazonaws.com/0/128461/f38cf898-f1f5-0afb-e78e-9468f8704d1f.jpeg" width=30% >
白いやつが矯正器具です。右のやつはキートップ外す器具です。
キーボードに装着するとこのようになる。
![DSCF0880 - コピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/128461/921dd698-24c9-6786-66dd-a88e403ed191.jpeg)
タオル等を上に被せてお使い下さい。
![10使用法 - コピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/128461/336a0c3c-2148-e33a-b928-bc9767fcb3e2.jpeg)
こうやって使うと
1. 適切じゃない指でキーを打とうとすると白い器具に邪魔される。
2. そのためホームポジションから手が動きにくい
3. タオル等があるため手元も見ることがない。

# 結果
3人に試してもらって2人がe-typing DからA-程度になった。大体1ヶ月くらい。
自分がやったのは、最初の器具の設計、設置、最初の使い方の説明。
3Dプリンタのプリントアウトは他の人に頼んだ。
私としてはこの結果は結構満足していて、教えたら速くなるとか、練習したら速くなるとかあるけど、
誰がそれを実施するのかというのが常に問題になる。
これなら放置で良いから楽。結果もそこそこ。
その代わり、最初の方はタイピングのスピードが遅くなる人が居る。
それは必要経費として割り切る。
Mac(High Sierra)にてMonoDevelopが起動しない


#環境
macOS High Sierra

#解決
>macOS 10.13 High Sierra 以降の環境において以下の現象が起きる場合、本件に該当します

 > ・Unity Editor の Project ウィンドウ内のファイルが見えなくなる
   ・Unity Editor から MonoDevelop が起動できない


と公式から不具合情報として書かれており、Patchを当てることで解決するようです

[macOS 10.13 High Sierra にて、Projectウィンドウ内のファイルが見えない、あるいはMonoDevelopが起動しない](https://helpdesk.unity3d.co.jp/hc/ja/articles/115012768187-macOS-10-13-High-Sierra-%E3%81%AB%E3%81%A6-Project%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E5%86%85%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8C%E8%A6%8B%E3%81%88%E3%81%AA%E3%81%84-%E3%81%82%E3%82%8B%E3%81%84%E3%81%AFMonoDevelop%E3%81%8C%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%AA%E3%81%84)

Patchの当て方
[【パッチ】UnityにSecurityパッチを適用してみた【あててみた】](http://tech.pjin.jp/blog/2017/09/01/unity_security_info_how_to_install_patch/)
vtigerでCalendarの関連モジュールを制限する

## 手順(DBをたどって更新)
1. Calendarのtabidを調べる
    →`vtiger_tab`テーブルで、Calendarのtabidは9
1. 関連モジュールを指定するのフィールドの情報を調べる
    →`vtiger_field`テーブルで、`tabid=9`を検索
    →Related Toのuitypeは66
1. uitype=66とは何なのかを調べる
    →`vtiger_ws_fieldtype`テーブルで、`uitype=66`を検索
    →fieldtypeidは34
1. fieldtypeid=34とは何なのかを調べる
    →`vtiger_ws_referencetype`テーブルで、`fieldtypeid=34`を検索
    →typeにAccounts/Campaigns/HelpDesk/Leads/Potentialsがある
1. 関連モジュール選択リストから消したいモジュールの行を削除する。
1. 予定作成画面から選択できなくなった。完了。


## 注意点
- uitype=66が設定されているfieldには、他にEventsモジュールのRelated Toがあるため同じ変更が加わる。
- Eventの方には必要だ！という場合は、自分で使われていないuitypeとfieldtypeを発行して、独自フィールドを作ることで回避できるはず（たぶん）。
【Androidエミュレータ】開発時に初期設定する項目まとめ【メモ】

Androidエミュレータの初期セットアップ項目まとめ。

- タイムゾーン設定・24時間表示
    - Settings-> Dateを選択
    - Automatic time zoneのチェックを外す
    - Select time zoneをGMT+09:00(必要に応じてGMT+00:00)に変更
    - Use 24-hour formatにチェックを入れる
- OK Googleを外す(API Level 23以降)
    - Settings -> Voice -> "Ok Google" detection
Say "Ok Google" any timeのチェックを外す
Objective-C ファイル操作の基本(確認、作成、コピー、削除、抽出)

**NSFileManager**を使ったやり方 (備忘録)

## ファイル・ディレクトリの存在確認

```objc:Objective-C
NSString *path = ...

if (![[NSFileManager defaultManager] fileExistsAtPath:path]) {
    // not exists
} else {
    // exists
}
```

## ディレクトリかどうかを調べる

```objc:Objective-C
+ (BOOL)isDirectory:(NSString*)path
{
    BOOL isDir;
    if ([[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDir]) {
        if (isDir) {
            return YES;
        }
    }
    return NO;
}
```

ついでに存在チェックも行なっている。

## ディレクトリを作成

```objc:Objective-C
NSString *path = ...

[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];
```
withIntermediateDirectories: YES ...上位階層のディレクトリを自動的に作成する

## ファイル・ディレクトリをコピー

```objc:Objective-C
NSString *src = ...
NSString *dst = ...

[[NSFileManager defaultManager] copyItemAtPath:src toPath:dst error:nil];
```
※ディレクトリ毎、ファイルもコピーされます。

## ファイル・ディレクトリを削除

```objc:Objective-C
NSString *path = ...

[[NSFileManager defaultManager] removeItemAtPath:path error:nil];
```
※ディレクトリ毎、ファイルも削除されます。

## 指定ディレクトリのファイルのみを抽出 (再帰的)

```objc:Objective-C
NSString *path = ...

NSFileManager *fileMamager = [NSFileManager defaultManager];
NSDirectoryEnumerator *enumerator = [fileMamager enumeratorAtPath:path];
NSString *name;
BOOL isDir;
while (name = [enumerator nextObject]) {
    NSString *fullPath = [path stringByAppendingPathComponent:name];
    [fileMamager fileExistsAtPath:fullPath isDirectory:&isDir];
    if (!isDir) {
        NSLog(@"%@", fullPath);
    }
}
```
PythonControlで矩形波に対する応答を求める。

###目的
Python Controlで、1自由度系(バネマスダンバ系)の伝達関数の任意の矩形波に対する応答を求める。

###事前準備
[PythonControlをインストールする](https://qiita.com/nnn112358/items/ada16e29ef8282498bb7)

###システムのモデル化
以下の伝達関数について考える。

```math
G(s)=\frac{Y(s)}{U(s)}=\frac{1}{ms^2+cs+k}
```

>m:質量[kg]
>k:ばね定数[N/m]
>c:粘性減衰係数[N・s/m]
>f：力[N]



###Python Controlでの任意入力応答
Python Controlは任意の入力に対する応答は以下の関数で求めることができる。

  __control.matlab.lsim(sys, U=0.0, T=None, X0=0.0)__

 - Parameters:	
   - sys:LTIシステム(線型時不変システム)の状態空間or伝達関数 
   - U:各時刻での入力配列（デフォルト= 0）。UがNoneまたは0の場合、特殊なアルゴリズムが使用されます。この特別なアルゴリズムは、他の方法で使用される一般的なアルゴリズムより高速です。
   - T:時刻配列。数値は単調増加しなければなりません。
   - X0: 初期値(default=0)、数値は配列に自動変換。

control.matlab.lsimは線形システムの任意の応答を求めることができる。
パラメータU、X0の便宜として、数値(スカラー)は正しい形状の行列に変換されます。
正しい行列は、引数sysとTから推測されます。
 
引用元：
[ control.matlab.lsim](http://python-control.readthedocs.io/en/latest/generated/control.matlab.lsim.html)


####矩形波
矩形波は、numpyの関数を使用して、以下の関数で生成できる。


___u = np.sign(amp*np.sin(2*np.pi*freq*t))___

- Parameters
 - np.pi:円周率
 - freq：矩形波の周波数
 - t：時刻配列


###サンプルコード
responce_lsim_quad.py 

```
#!/usr/bin/env python
from control.matlab import *
from matplotlib import pyplot as plt
from scipy import arange 
import numpy as np

def main():
    k=1.0
    m=0.1
    c=0.1
    num = [0, 0,1] 
    den = [m, c, k]
    x0 = [0, 0]				
    t =np.linspace(0, 10, 1024)	
    freq=1.0	
    amp=1.0
    u = np.sign(amp*np.sin(2*np.pi*freq*t))	

    sys1 = tf(num, den) 		
    print sys1

    (y1a, T1a, x1a )= lsim(sys1, U=u, T=t, X0=x0)

    plt.axhline(0, color="b", linestyle="--")
    plt.plot(T1a, u, label="$X_2$")
   # plt.plot(T1a, x1a[:,1], label="$X_1$")
   # plt.plot(T1a, x1a[:,0], label="$X_2$")
    plt.plot(T1a, y1a, label="Output")
    plt.show()
    
if __name__ == "__main__":
  main()



```

![quad.jpg](https://qiita-image-store.s3.amazonaws.com/0/73020/8f3c4c05-eedf-638c-42be-b07c0afa8f1e.jpeg)




サンプルコードは以下に格納。
https://github.com/nnn112358/python-control_test

###参考
[PythonControlをインストールする](https://qiita.com/nnn112358/items/ada16e29ef8282498bb7)
[PythonControlで1自由度系の伝達関数を求める。](https://qiita.com/nnn112358/items/3b400598e74f8414b1e1)
[PythonControlで2自由度系の伝達関数を求める。](https://qiita.com/nnn112358/items/3604156086351a07e860)
vtigerのレコード更新履歴について調べてみた

## 履歴を管理しているテーブル
- vtiger_modtracker_basic
- vtiger_modtracker_detail
- vtiger_modtracker_relations
- vtiger_modtracker_tabs

`vtiger6.5.0`において、画面上から設定等を操作することはできない模様


## vtiger_modtracker_basic
各レコードに対する変更情報を管理しているテーブル

| 項目名 | 説明 |
| -------- | -------- |
| id | - |
| crmid | 操作を加えたレコードのcrmid |
| module | 操作を加えたモジュール名 |
| whodid | 操作を加えたユーザーid |
| changedon | 操作を加えた日時 |
| status | 操作の種別コード<br>0:更新 <br>1:削除 <br>2:作成 <br>3:復元 <br>4:参照の追加 <br>5:参照の削除 |


## vtiger_modtracker_detail
各レコードに対する変更前後の値を管理しているテーブル

`vtiger_modtracker_basic`にて、`status`が0,2の場合に作成される

| 項目名 | 説明 |
| -------- | -------- |
| id | 更新されたレコードのcrmid |
| fieldname | フィールド名 |
| prevalue | 変更前の値 |
| postvalue | 変更後の値 |


## vtiger_modtracker_relations
各レコードに対する参照関係の追加・削除の管理をしているテーブル

`vtiger_modtracker_basic`にて、`status`が4,5の場合に作成される

| 項目名 | 説明 |
| -------- | -------- |
| id | vtiger_modtracker_basicのid |
| targetmodule | モジュール名 |
| targetid | 参照先レコードのcrmid |
| changedon | 変更日時 |

## vtiger_modtracker_tabs
モジュールごとに、履歴管理をするかしないかの設定を管理しているテーブル

カスタムモジュールを作成した場合、履歴管理を行わない設定になっている模様

| 項目名 | 説明 |
| -------- | -------- |
| tabid | モジュールid(vtiger_tabで確認) |
| visible | 履歴管理コード<br>0:履歴管理を行わない<br>1:履歴管理を行う |
PythonControlで正弦波に対する応答を求める。

###目的
Python Controlで、1自由度系(バネマスダンバ系)の伝達関数の任意の正弦波に対する応答を求める。

###事前準備
[PythonControlをインストールする](https://qiita.com/nnn112358/items/ada16e29ef8282498bb7)

###システムのモデル化
以下の伝達関数について考える。

```math
G(s)=\frac{Y(s)}{U(s)}=\frac{1}{ms^2+cs+k}
```

>m:質量[kg]
>k:ばね定数[N/m]
>c:粘性減衰係数[N・s/m]
>f：力[N]



###Python Controlでの任意入力応答
Python Controlは任意の入力に対する応答は以下の関数で求めることができる。

  __control.matlab.lsim(sys, U=0.0, T=None, X0=0.0)__

 - Parameters:	
   - sys:LTIシステム(線型時不変システム)の状態空間or伝達関数 
   - U:各時刻での入力配列（デフォルト= 0）。UがNoneまたは0の場合、特殊なアルゴリズムが使用されます。この特別なアルゴリズムは、他の方法で使用される一般的なアルゴリズムより高速です。
   - T:時刻配列。数値は単調増加しなければなりません。
   - X0: 初期値(default=0)、数値は配列に自動変換。

control.matlab.lsimは線形システムの任意の応答を求めることができる。
パラメータU、X0の便宜として、数値(スカラー)は正しい形状の行列に変換されます。
正しい行列は、引数sysとTから推測されます。
 
引用元：
[ control.matlab.lsim](http://python-control.readthedocs.io/en/latest/generated/control.matlab.lsim.html)


####正弦波
正弦波は、numpyの関数を使用して、以下の関数で生成できる。


___u = amp*np.sin(2*np.pi*freq*t)___

- Parameters
 - np.pi:円周率
 - freq：正弦波の周波数
 - t：時刻配列


###サンプルコード
responce_lsim_sincurve.py

```
#!/usr/bin/env python
from control.matlab import *
from matplotlib import pyplot as plt
from scipy import arange 
import numpy as np

def main():
    k=1.0
    m=0.1
    c=0.1
    num = [0, 0,1] 
    den = [m, c, k]
    x0 = [0, 0]				
    t =np.linspace(0, 10, 1024)	
    freq=1.0	
    amp=1.0
    u = amp*np.sin(2*np.pi*freq*t)		

    sys1 = tf(num, den) 		
    print sys1

    (y1a, T1a, x1a )= lsim(sys1, U=u, T=t, X0=x0)

    plt.axhline(0, color="b", linestyle="--")
    plt.plot(T1a, u, label="$X_2$")
   # plt.plot(T1a, x1a[:,1], label="$X_1$")
   # plt.plot(T1a, x1a[:,0], label="$X_2$")
    plt.plot(T1a, y1a, label="Output")
    plt.show()
    
if __name__ == "__main__":
  main()

```


![sincurve.jpg](https://qiita-image-store.s3.amazonaws.com/0/73020/0ee65b7a-c104-169f-d469-cc864a5bef96.jpeg)


サンプルコードは以下に格納。
https://github.com/nnn112358/python-control_test

###参考
[PythonControlをインストールする](https://qiita.com/nnn112358/items/ada16e29ef8282498bb7)

[PythonControlで1自由度系の伝達関数を求める。
](https://qiita.com/nnn112358/items/3b400598e74f8414b1e1)

[PythonControlで2自由度系の伝達関数を求める。
](https://qiita.com/nnn112358/items/3604156086351a07e860)
GASライブラリによるマニフェストの活用について

[Manifest](https://developers.google.com/apps-script/concepts/manifests)（マニフェスト）が公開されたことで、GAS開発に対して様々な活用方法が考えられます。一部は[こちら](https://qiita.com/tanaike/items/b3538e7550555ebb51f5)で紹介させていただきました。この記事では、GASライブラリによるマニフェストの活用について紹介させていただきます。

次のデモをご覧ください。これが本記事のメインです。

![20171123-demo.gif](https://qiita-image-store.s3.amazonaws.com/0/133383/7a8f61a9-13c6-cc20-0353-4bbd11cc3fa5.gif)


このデモンストレーションでは、新規作成したプロジェクトに対して、マニフェストで"oauthScopes"を設定しただけのライブラリ（ライブラリのスクリプトID 1TYEitZm7SsAGPDI1PMfeZhIDqRrpLF8a5H9AlhGddCjJMOyHS4EBRH1c ）をインストールすることでデフォルトスコープが設定されることを示しています。ライブラリをインストールしたプロジェクトのマニフェストには"oauthScopes"は設定されていないことも確認できます。

"oauthScopes"で設定したサンプルとしてのスコープは次の８個です。

~~~json
"oauthScopes": [
  "https://www.googleapis.com/auth/analytics.readonly",
  "https://www.googleapis.com/auth/blogger.readonly",
  "https://www.googleapis.com/auth/calendar.readonly",
  "https://www.googleapis.com/auth/drive.readonly",
  "https://www.googleapis.com/auth/gmail.readonly",
  "https://www.googleapis.com/auth/presentations.readonly",
  "https://www.googleapis.com/auth/spreadsheets.readonly",
  "https://www.googleapis.com/auth/youtube.readonly"
]
~~~

# 解説
ライブラリであるプロジェクトのマニフェストへ"oauthScopes"でスコープを設定すると、そのスコープは、ライブラリをインストールしたプロジェクトのデフォルトスコープとして引き継がれます。この意味するところは次の通りです。

- マニフェストへの"oauthScopes"設定では、プロジェクトのマニフェストへスコープを登録すると、登録したスコープのみが使用可能になり、スクリプトの内容から自動判定された別のスコープが使用できなくなる問題があります。マニフェストへのスコープの登録は、スコープの制限を設けることと等価です。
    - マニフェストを使用しない場合は、スクリプト実行時に必要なスコープ（全てではない）が自動認識されて認証画面が表示されます。これは、マニフェストが追加されるまでのこれまでの状況です。

ライブラリを用いることで上記が解消されます。すなわち、マニフェストでスコープを設定したライブラリをインストールしたプロジェクトは、プロジェクト内でマニフェストの設定をせずともライブラリのスコープを使用することができるようになります。これにより、スクリプトを作成中にさらに追加のスコープが必要になった場合でもそれらのスコープは自動認識され、認証画面で認証することにより使用できるようになります。

# 用途
これが活用できそうだと思った状況は、特殊スコープを使用したライブラリの公開ではないでしょうか。これまで用意していたOAuth2プロセスの説明が不要になることは、作り手の手間解消だけでなく、使い手のハードルも下がると思われます。

また、新規プロジェクトのテンプレートとしても活用できるのではないかと思われます。いつも使用するような拡張サービスやライブラリ、スコープなどをマニフェストへ設定したライブラリを用意しておき、これを新規プロジェクト作成時にインストールすることで開発環境が整うための時間短縮につながるのではないかと思われます。

# 謝辞
[Martin Hawksey](https://plus.google.com/+MartinHawksey)

この情報がお役に立ちましたら幸いです。
機械学習案件は本運用乗せきってからが本当の勝負、みたいなところあるので気をつけて

『[機械学習案件を納品するのは、そんなに簡単な話じゃないから気をつけて](https://qiita.com/yoshizaki_kkgk/items/fa8b45918445bb3e6dc3)』を読みました。
つまづきから得られた知見の共有は貴重だと思います :thumbsup: 

実際、機械学習とか最適化とか自律的なシステムの開発は、罠が多いです。
研究や試作では成功していても、様々な事情により実用化できず消えていくものを沢山見てきました。
そのため、本運用に乗せてユーザの受け入れも上々というところまで辿りつければ、それはそれは本当に喜ばしいことなのですが、そこから始まる試練も色々とあったりします :ghost: 

ということで、運用後に体験したり見聞きしたことをいくつか、私も共有してみたいと思います。
ちなみに私の開発経験は、研究用シミュレータの受託とWebバックエンドの内製です :upside_down:

# いつの間にか、精度が落ちてるみたいなんですけど？

## 入力に無効値や不正値が紛れこんでいた。

データは生き物です。クレンジングやバリデーションを作りこんでも、いずれ予期せぬことは起こります。
センサが壊れた、ユーザにハックされた、外部サービスが仕様変更した、などなど。
汚れたデータを学習すると、もちろん性能は落ちていきます。

## データの遅延が大きくなっていた。

発生したデータはなる早で学習して活用したいものですね。
用途によって、発生から１時間後には活用したい、などの期限も存在するでしょう。
しかし、データを流しつづけていると、ストレージが圧迫されたり、流量がバーストしたりします。
いっそバッチが突き抜けるなどシステム障害が起これば検知しやすいのですが、そうでない場合、学習単体はうまくいってるのに推定値が役に立たないという事態が起きます。

## データ量が少なくなっていた。

残念ながら、ユーザが離れたり、台風が来たり、障害が起きたり、などの理由でビッグデータがスモールになることがあります。
データが少なすぎると、いかに機械学習といえど頑張りようがありません。

## サービス環境が変わった。

Deep Blue、ponanza、AlphaGo。
トッププロを倒したソフトウェアの活躍から分かるとおり、彼らはゲームで無類の強さを発揮します。
ただ現実世界をゲームとみなした時、そのルールが大きく変わることもよくある話です。たとえるならば、盤が広がったり、駒が降ってきたり、ちゃぶ台をひっくり返されたりします。ぎゃあ。

## 学習したモデルが更新されていない。

これはシステム障害なのですが、検知を漏らすとそのまま見落とされがちです。
古いモデルでも、しばらくはそこそこの精度で動いてしまうからですね。同じように、学習データが更新されてないとか、利用側が参照しそこねてるとかのパターンもあります。

# 暴発したので、今すぐどうにかしてください！

## 誤差を増幅させるようなフィードバックループができていた。

推定値を利用することで、次の学習データに影響を大きく与えるような場合に起こります。
たとえば、SNSで話題のニュースを要約して投稿するボットを考えましょう。うっかりフェイクニュースを学習して投稿したら、ボットの投稿がさらにバズってSNSでますます話題になり、より信憑性のある情報として学習してしまうかもしれません。

## 他のアルゴリズムとチキンレースをしていた。

株式市場の異常な急落を引き起こしたりするやつです。下がるから売る、売るから下がる、をアルゴリズムトレードが一斉に始めてしまうのですね。
恒常性のある系ならば揺り戻しが入るはずですが、機械はそれより速く目にも留まらぬうちに何かを崩壊させてしまう危険性があります。

## 特定のセグメントだけ異常な推定値を叩きだしていた。

最適化の対象としている全体誤差の値は低いままなのに、どこかで泣きを見るユーザが生まれたりします。
それをサービスとして諦められるのであれば良いのですが、ビジネスインパクトの大きいユーザが貧乏くじを引いた時なんかは厄介ですね。

## ロギングや前処理にこっそり改修が入っていた。

機械学習の中身を知らない開発者が、別目的で改修した場合に起こりがちです。
ステージング環境で気づくべきなのですが、機械学習は同じ入力に対して同じ出力を返すとは限らないため自動テストしづらく、見落とされがちです。

## 原因よく分からないし再現すらできない。

とりあえず暴発前のモデルを使いつづけるか、涙を飲んで止めましょう。

# そういえば、最近使われてないような♪

## ユーザが飽きた。

人は新しいものに過度な期待をし、やがて幻滅してしまう習性があります。
サービスとして目新しさ以外の魅力が乏しかった場合、いずれ化けの皮は剥がれてしまうでしょう。

## 使い方に暗黙のコツがあった。

人は自分が無意識にできることは、他の人もできると仮定してしまう習性があります。
初期のユーザは、受け入れテストに参加したりレクチャーを受けたりしているうちに自然とコツを掴むものですが、えてして後続のユーザにはそのような機会がないものです。

## ブラックボックスが敬遠された。

人はたとえ自分より優れていても、仕組みがよく理解できないものを怖がる習性があります。
丁寧に説明しようと、客観的なデータがあろうと、ダメな時はダメです。所詮、人と機械は分かり合えないのか……。

# もうメンテできないので、潰しましょう☆

## 設計者や開発者がいなくなった。

あるある～。それなりにドキュメントは残っているのに、読める人がいないこともあるあるです。せつなさ炸裂～。

## ハイパーパラメータのチューニングつらい。

いわゆる秘伝のタレだよね。ここもベイズ最適化とかできるとカッコイイよね。開発リソース足りないよね。

## 別機能とデータフローが絡み合いまくってる。

最悪、潰すことすらできないまであるとか何とか。我らがスパゲッティ・モンスターに祈りませう。

# 「俺たちの戦いはこれからだ！」

ええと、「こんなんやってられっか」なんて、げんなりしないでくださいね :sweat_drops:
べつに機械学習とか関係なく、どんなシステムであろうと障害は日々起こりうるものですし、全てに備えることはできません。
現実そこそこ上手く動くようにトレードオフを取りつづけるのが、エンジニアの仕事だと私は信じています。
それに、どれだけ手が掛かろうと机上の数式がよちよち動いた時は、とても可愛いものですからね。

ではでは。われわれ人間を必要としない真の人工知能が生まれるその日まで、精進していきましょう :muscle:
React Navigationで特定画面のみモーダルにする

# やりたいこと
React Navigationで特定画面のみモーダルにしたい

# やり方

StackNavigator(modal) > StackNavigator(card) のネスト構造にして、initialRouteNameをStackNavigator(card)にすることで実現。こんな感じ。

```
const MainCardNavigator = StackNavigator(
  {
    Home: { screen: Home },
    CardScreen1: { screen: CardScreen1 },
    CardScreen2: { screen: CardScreen2 },
  },
  {
    headerMode: 'none',
  },
);

const MainModalNavigator = StackNavigator(
  {
    MainCardNavigator: { screen: MainCardNavigator }
    ModalScreen1: { screen: ModalScreen1 },
    ModalScreen2: { screen: ModalScreen2 },
  },
  {
    initialRouteName: 'MainCardNavigator',
    mode: 'modal',
    headerMode: 'none',
  },
);
```
元ネタ：https://github.com/react-community/react-navigation/issues/707

# エラー
TabNavigator > StackNavigator > StackNavigatorの3層でネストすると「Cannot read property undefined of undefined」エラーが発生しました。

# 対策
- navReducerを以下のように修正することで解決。NavigationActions.init()がポイント。
- [redux/react-navigation公式](https://github.com/react-community/react-navigation/blob/master/docs/guides/Redux-Integration.md)を元にしてます：

```
let initialState = nav.router.getStateForAction(
  NavigationActions.init()
);
const firstAction = nav.router.getActionForPathAndParams('MainCardNavigator')
initialState = nav.router.getStateForAction(
  firstAction,
  initialState
);
export default (state = initialState, action) => {
  const nextState = nav.router.getStateForAction(action, state);

  return nextState || state;
};
```

# 環境
- "react": "16.0.0-beta.5",
- "react-native": "^0.49.3",
- "react-navigation": "^1.0.0-beta.13",
- "react-redux": "^5.0.6",
- "redux": "^3.7.2"

# 参考
- https://github.com/react-community/react-navigation/issues/707
- https://github.com/react-community/react-navigation/issues/1919
- https://github.com/react-community/react-navigation/issues/2456
Objective-C フルパスから親ディレクトリ・ファイル名取得

例えば、下記のフルパスがあり、
**/User/HogeHoge/Documents/test.png**

親ディレクトリやファイル名だけの文字列を取りたい場合は、
以下のコードで取得出来る。

## 親ディレクトリ取得

```objc:Objective-C
NSString *path = @"/User/HogeHoge/Documents/test.png";
NSString *str = [path stringByDeletingLastPathComponent];
NSLog(@"%@", str);
```
```objc:出力
/User/HogeHoge/Documents
```

## ファイル名取得

```objc:Objective-C
NSString *path = @"/User/HogeHoge/Documents/test.png";
NSString *str = [path lastPathComponent];
NSLog(@"%@", str);
```
```objc:出力
test.png
```
PHP7.1とphp7.0とphp5.6とphp5.5をMac上で同居させる


# Brew の準備

HomeBrew のインストールは済んでいることが前提。

PHPは `homebrew/homebrew-php` でインストール。

```
> brew tap homebrew/homebrew-php
> brew install php70 && brew unlink php70
> brew install php56 && brew unlink php56
> brew install php71 && brew unlink php71
```

# switch

PHPのバージョンを変更するのに、`brew unlink php56 && brew link php71` はめんどいので `php-switcher`をインストール。

```shell
~ $ brew install brew-php-switcher
==> Installing brew-php-switcher from homebrew/php
==> Downloading https://homebrew.bintray.com/bottles-php/brew-php-switcher-1.6.sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring brew-php-switcher-1.6.sierra.bottle.tar.gz
==> Caveats
To run brew php switcher do the following:
  "brew-php-switcher 53".

You can select php version 53, 54, 55, 56, 70 or 71.
==> Summary
🍺  /usr/local/Cellar/brew-php-switcher/1.6: 7 files, 8.2KB
```

あとはこんな感じ

```shell
~ $ brew-php-switcher 70
Switching to php70
Switching your shell
Unlinking /usr/local/Cellar/php56/5.6.32_8... 0 symlinks removed
Unlinking /usr/local/Cellar/php70/7.0.22_14... 0 symlinks removed
Unlinking /usr/local/Cellar/php71/7.1.11_22... 17 symlinks removed
Linking /usr/local/Cellar/php70/7.0.22_14... 17 symlinks created
You will need sudo power from now on
Switching your apache conf
Password:
Sorry, try again.
Password:
Restarting apache
All done!
```
今日から始めるUnreal Engine 4 

# はじめに
本記事はUnreal Engineでゲームを作って見たいけど環境構築が難しい人、ゲーム開発の流れや超基本的な用語がわからない人を想定して書いています。

# UnrealEngineとは
![スクリーンショット 2017-11-16 13.42.58.png](https://qiita-image-store.s3.amazonaws.com/0/81341/da02074a-4e29-206e-a6a7-3cf1a6937105.png)

>Unreal Engineはエピックゲームズが自社で開発した**ゲームエンジン**です。使用されているゲームの代表作はした『レインボーシックス』シリーズ（3以降）、『レッドスティール』、『バイオショック』および『ミラーズエッジ』、『アスラズ ラース』など多くのゲームで採用された。
Unreal Engineのコア部分は**C++**で記述されている。Unreal Engineは高レベルの移植性というのが特徴です。
多くのゲームコードはC++やプロプライエタリなスクリプト言語である**UnrealScript**で記述され、ゲームの大部分はエンジン内部を深く探求せずに改良することができる。加えて、他のミドルウェアと共に使用するとき、コンテント作成においてゲームデザイナーとアーティストの両方を支援する様々なツールも提供している。

# そもそもゲームエンジンとは
ゲームエンジンは現代のゲームのほとんどに使われています。

**代表例：Unity, UnrealEngine4, CryEngine, ReEngine, FOXEngine, DECIMA**

ゲームの起動画面で見たことがあるのではないでしょうか。ゲームエンジンはプログラミングや数学、力学といったゲーム開発に必要な知識を最低限備えていれば開発が行えてしまう**便利なツール**です。現代のゲームの開発おいては、なくてはならない存在になっています。

# なぜUnreal Engineなのか
- ハイクオリティなゲームか開発できる
- ブループリント（UI操作）で簡単にプログラミングができる
- Unityと違い無料化されているため利用者が増えている
- マルチプラットフォームに対応している（PC, ios, Android, CS）

無償で提供さている部分が強いかもしれませんが、UI操作に特化されており初心者からプロのゲームクリエイターまで使うツールになります。
**主に使用されているゲーム：ドラゴンクエストXI 過ぎ去りし時を求めて, キングダムハーツ３..**
# 環境構築

## ゲームを作るイメージ
プロジェクトを作成すると、何もないゲーム空間が生成されます。ゲームの世界にはアクタを配置します。アクタとはレベル内へ配置可能な任意のオブジェクトです。
アクタを配置したらカメラを配置し、そのカメラを通してゲームの世界を画面に映す形になります。
映画やドラマの撮影のように演者がいてそれを撮るカメラがあるような感じです。

## インストール
1. Unreal Engine 4 公式サイトに行き中央に表示される今すぐダウンロードをクリックしてください。
2. 手順に従いアカウントの作成もしくはログインを行うと以下のような画像が表示されるのでチェックボックスにチェックし承諾を押して下さい。
<img src="https://qiita-image-store.s3.amazonaws.com/0/81341/02c5ba41-a351-8a5f-fb4b-53fb4a78b842.jpeg">

3. 承諾を行うとUnrealEngineのインストーラーのダウンロードリンクが表示されるため使っている自分の使っているPCに合ったOSのものをダウンロードしてください。
<img src="https://qiita-image-store.s3.amazonaws.com/0/81341/a04390a7-663d-b4e5-3448-43facbbc22d6.jpeg">

4.インストーラーを起動するとインストール先に設定などが出てきますが、デフォルトのままで大丈夫です。次へを押してインストールを完了させてください。
5. Unreal Engine 4のランチャーを起動すると以下のような画面が表示されますが赤枠で囲ってある左上のUnreal Engineをクリックしてください。
<img src="https://qiita-image-store.s3.amazonaws.com/0/81341/516653cd-1a74-ae92-12ed-478ddd6535fa.jpeg">
6.ライブラリに移動するとUnreal Engineのバージョンを指定してインストールできるため、自分の使いたいバージョンを指定してインストールしてください。デフォルトの設定でインストールすると各プラットフォーム（windows、ios、andoid..）に最適化されたものもインストールされるため２０GBの容量が必要となります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/81341/7dfa2746-37e8-7973-c130-395449aa4bce.jpeg">

# 基本用語

## プロジェクトとは
ゲームを作る際に使うデータ全ての集約です。自分が作りたいゲームのタイトルをプロジェクト名につけることが主流です。

## レベルとマップとは
レベルとはプロジェクトデータをいくつかに細分化したデータのことです。
> ビデオ ゲームでプレイする場合、見える、またはインタラクションするすべてのオブジェクトは、レベル に存在します。UE4 の用語では、レベルは スタティックメッシュ、ボリューム、ライト、ブループリントなどの集まりで構成され、これらが連携して機能することで、プレイヤーにとって望ましい体験を実現します。UE4 のレベルは、広大な テレインベースのワールドからいくつかのアクタを含むごく小さなレベルまで幅広いサイズになります。

## アクタとは
ゲームに登場する木や人など実体を持つものがアクタです。
>アクタ は、レベル内へ配置可能な任意のオブジェクトです。トランスレーション、回転、スケーリングなどの 3D 変形をサポートする汎用クラスです。アクタはゲームプレイ コード

## コンポーネントとは
ゲーム内で使用する「移動速度」「攻撃力」「当たり反転」などのアクタを構成する要素のことです。
>コンポーネント は、アクタに追加することができる機能の構成要素です。コンポーネントはそれ自体では存在することはできませんが、アクタに追加することで、アクタがそのコンポーネントに備わっている機能へアクセスし使用することができます。
例えば、Spot Light Component を使えばアクタはスポットライトのようなライトを放射したり、Rotating Movement Component でアクタをスピンさせたり、Audio Component を使えばアクタが音を再生できるようになります。

## まとめ
みなさんセットアップと基本用語はわかりましたか。
わからない場合はこちらを参照ください
https://docs.unrealengine.com/latest/JPN/

どんどんゲーム開発をしていきましょう！
PythonControlで初期条件応答を求める。

###目的
Python Controlで、1自由度系(バネマスダンバ系)の伝達関数の初期条件応答を求める。

###事前準備
[PythonControlをインストールする](https://qiita.com/nnn112358/items/ada16e29ef8282498bb7)

###システムのモデル化
以下の状態方程式について考える。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f37333032302f30323238396566372d313961652d333164632d616361302d3930653565643864666330322e6a706567.jpg](https://qiita-image-store.s3.amazonaws.com/0/73020/aa04e6aa-6843-7b22-dbf1-6589d718508e.jpeg)

>m:質量[kg]
>k:ばね定数[N/m]
>c:粘性減衰係数[N・s/m]
>f：力[N]

```math
G(s)=\frac{Y(s)}{U(s)}=\frac{1}{ms^2+cs+k}
```

###初期条件応答
Python Controlは初期条件応答は以下の関数で求める。

  __control.matlab.initial(sys, T=None, X0=0.0, input=None, output=None, return_x=False)__

 - Parameters:	
   - sys:LTIシステム(線型時不変システム)の 状態空間or伝達関数 
   - T:None。
   - X0: 初期値(default=0)、数値は配列に自動変換。
   - input: None。
   - output: int型、このシミュレーションからの出力。

control.matlab.initialは線形システムの初期応答を求めることができる。
システムに複数の出力（MIMO）がある場合は、オプションで1つの出力を選択することができる。
出力が選択されていない場合、すべての出力する。
 
引用元：
[control.matlab.initial](http://python-control.readthedocs.io/en/latest/generated/control.matlab.initial.html)

###サンプルコード
responce_initial.py

```
#!/usr/bin/env python
from control.matlab import *
from matplotlib import pyplot as plt
from scipy import arange 

def main():
    k=1.0
    m=0.1
    c=0.1
    num = [0, 0,1] 
    den = [m, c, k]
    sys1 = tf(num, den) 
    print sys1
    (y1a, T1a) = initial(sys1,T = arange(0, 10, 0.01))
    plt.axhline(0, color="b", linestyle="--")
    plt.plot(T1a, y1a)
    plt.show()
    
if __name__ == "__main__":
  main()


```


![Initial.jpg](https://qiita-image-store.s3.amazonaws.com/0/73020/e57ab862-056a-26af-5432-38fa68d712c8.jpeg)


サンプルコードは以下に格納。
https://github.com/nnn112358/python-control_test

###参考
[PythonControlをインストールする](https://qiita.com/nnn112358/items/ada16e29ef8282498bb7)

[PythonControlで1自由度系の伝達関数を求める。
](https://qiita.com/nnn112358/items/3b400598e74f8414b1e1)

[PythonControlで2自由度系の伝達関数を求める。
](https://qiita.com/nnn112358/items/3604156086351a07e860)
PythonControlでインパルス応答を求める。

###目的
Python Controlで、1自由度系(バネマスダンバ系)の伝達関数のインパルス応答を求める。

###事前準備
[PythonControlをインストールする](https://qiita.com/nnn112358/items/ada16e29ef8282498bb7)

###システムのモデル化
以下の状態方程式について考える。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f37333032302f30323238396566372d313961652d333164632d616361302d3930653565643864666330322e6a706567.jpg](https://qiita-image-store.s3.amazonaws.com/0/73020/aa04e6aa-6843-7b22-dbf1-6589d718508e.jpeg)

>m:質量[kg]
>k:ばね定数[N/m]
>c:粘性減衰係数[N・s/m]
>f：力[N]

```math
G(s)=\frac{Y(s)}{U(s)}=\frac{1}{ms^2+cs+k}
```

###インパルス応答
Python ControlはInitial応答は以下の関数で求める。

  __control.matlab.Initial(sys, T=None, X0=0.0, input=0, output=None, return_x=False)__

 - Parameters:	
   - sys:LTIシステム(線型時不変システム)の 状態空間or伝達関数 
   - T:時間ベクトル（optionで与えられていなければ、自動計算する）
   - X0: 初期値(default=0)、数値は配列に自動変換。
   - input: int型、このシミュレーションへの入力。
   - output: int型、このシミュレーションからの出力。

control.matlab.Initialは線形システムのインパルス応答を求めることができる。
システムに複数の入力または出力（MIMO）がある場合は、シミュレーション用に1つの入力を選択する必要がある。
オプションで、1つの出力を選択することができる。
出力が選択されていない場合、すべての出力する。
パラメータのinputとoutputがこれを行う。その他の入力はすべて0に設定され、他のすべての出力は無視される。
 
引用元：
[control.matlab.Initial](http://python-control.readthedocs.io/en/latest/generated/control.matlab.initial.html)

###サンプルコード
responce_impulse.py

```
#!/usr/bin/env python
from control.matlab import *
from matplotlib import pyplot as plt
from scipy import arange 

def main():
    k=1.0
    m=0.1
    c=0.1
    num = [0, 0,1] 
    den = [m, c, k]
    sys1 = tf(num, den) 
    print sys1
    (y1a, T1a) = initial(sys1,X0 = [0, 1],T = arange(0, 10, 0.01))
    plt.axhline(0, color="b", linestyle="--")
    plt.plot(T1a, y1a)
    plt.show()
    
if __name__ == "__main__":
  main()



```


![Initial.jpg](https://qiita-image-store.s3.amazonaws.com/0/73020/2da73ab1-5211-3819-54cd-8be4c36fbe01.jpeg)


サンプルコードは以下に格納。
https://github.com/nnn112358/python-control_test

###参考
[PythonControlをインストールする](https://qiita.com/nnn112358/items/ada16e29ef8282498bb7)

[PythonControlで1自由度系の伝達関数を求める。
](https://qiita.com/nnn112358/items/3b400598e74f8414b1e1)

[PythonControlで2自由度系の伝達関数を求める。
](https://qiita.com/nnn112358/items/3604156086351a07e860)
Pythonプログラムの標準出力をテストする

## 対象の読者
* ソフトウェア開発者
* 競技プログラミング参加者

## 記事概要
* 競技プログラミングなどでは、計算結果を標準出力に出力することが求められる場合があります。
* これらをUnittestフレームワークを用いて、End-to-Endにテストするコードを紹介します。

## 前提条件
* Python 3.5 以降で動作検証しています。

## テスト対象
* 次のようなコードをテスト対象にするとします。  

```py3:test_target.py
# -*- coding: utf-8 -*-

def print_something(value):
    print('{0}'.format(value))
    return
```
## やりかた
### シンプルな方法
Pythonの標準ライブラリに、テスト用に標準出力をキャプチャする機能があるので、それをUnittestフレームワーク内で使います。

```py3:test_sample1.py
from unittest import TestCase
from test.support import captured_stdout
from .test_target import print_something


class StdoutCaptureTestCase(TestCase):

    def test_print_something(self):
        test_value = 'Hello'

        with captured_stdout() as stdout:  # captured_stdout() yields stream that contain strings of stdout.
            print_something(value=test_value)

        self.assertEqual(stdout.getvalue(), 'Hello\n')  # stdout.getvalue() returns the entire contents of stdout includes Line Feed.
```

###### 問題点
* 改行コードも含めて１つの文字列としてキャプチャされるため、プラットフォームの差異の影響を受ける。
* 行単位の判定ができない

### 改良した方法
stdout.getvalueが返す文字列の.splitlinesメソッドを呼び出し、配列に格納した上で判定します。

```py3:test_sample2.py
class StdoutCaptureTestCase(TestCase):

    def test_multiple_lines(self):

        with captured_stdout() as stdout:
            print_something(value='Hello')
            print_something(value='World')

            lines = stdout.getvalue().splitlines()  # Splitlines method divide strings to an array, Line Feed will disappear.

        self.assertEqual(lines[0], 'Hello')
        self.assertEqual(lines[1], 'World')
```

この方法であれば、改行コードを気にすることなく、かつ行ごとに判定できます。

## まとめ
* Pythonの標準ライブラリで、標準出力もテストできます。
* splitlinesメソッドを用いることで、行単位の判定ができます。
FileMaker16で追加されたJSON関連の関数を触った話

## はじめに
FileMaker16でJSONをいい感じに触れる関数が追加されたので
適当なAPIからデータを取得し、表示させるアプリを作ってみた話。

## 環境
- FileMaker 16
- FileMakerGo 16
- iPhoneやらiPad

## 使ったもの
- [カーリル 図書館API](https://calil.jp/doc/api.html)
- Google Books API
- Postman

## 実装したい機能
機能として以下の機能を実装することにした。
1. 現在地から近くの図書館を検索する。
2. 図書のタイトル、著者を元に該当図書を検索する。
3. 対象の図書が図書館にあるのか、あった場合に貸し出し可能か表示する。

## 実装方法
### 現在地から近くの図書館を検索する。
FileMakerGoでは`LocationValues`で現在端末のある緯度経度を取得できるため
LocationValuesでは以下のように値が返ってくるので必要な情報をぬきとる。
```
// 緯度
37.406489 
// 経度
-121.983428
// 高度
0.000000
// 水平精度
65
// 垂直精度
-1
// 経過分数
0.001236
```
![スクリプトワークスペース__図書検索アプリ1020_.png](https://qiita-image-store.s3.amazonaws.com/0/94403/93ac6c88-6765-4acd-93d4-b29cbd4dff40.png)

取得した座業データを元に、カーリルのAPIに対してリクエストを投げつける。
`$RESPONSE`にAPIからのレスポンスを格納し、`$LIMIT`には取得件数を設定している。
![スクリプトワークスペース__図書検索アプリ1020_ 2.png](https://qiita-image-store.s3.amazonaws.com/0/94403/920709b1-198a-b38b-e98f-e04eed722a91.png)

データが取得できたことを確認する条件式は
`JSONListKeys ( $RESPONSE ; "" ) ≠ ""`を使用した。
データをパースしていくループに関しては
`ValueCount(JSONListKeys ( $RESPONSE ; "" ))`を使用している。
![スクリプトワークスペース__図書検索アプリ1020_ 3.png](https://qiita-image-store.s3.amazonaws.com/0/94403/edb40d3c-83dc-0cee-aef6-92efb279ea48.png)

今回の実装ではJSONのプロパティ名を取得する際にハードコーディングしているが
フィールド名とJSONのプロパティ名を揃えて
フィールドを名前で指定とJSONListKeysの組み合わせの方が良さげ。

## まとめ

実装したい機能2と3についても同様にAPI叩いてJSONをパースするだけなので割愛。
今回JSONListKeysやJSONGetElementを使用してみた感じだと
他言語でのJSONの扱いに比べるとまだちょっと不便。

FileMaker Data APIのライセンスをよく知らないんですけど
WebDirectの速度感とかFileMakerGoのデータ同期とかあとちょっとな感じが多いので
JSONでデータぶつけ合うのがもっと便利になってほしい。

あと初めて書いてみて記事を書くのは大変だと思った。
実際のディレクトリ構造がいけてなくても見た目のURLだけは綺麗にする方法

実際のディレクトリ構造や名前がめちゃくちゃでも、次のように **path オプションだけ** でURLをスマートにできます。get や match などを別に駆使する必要はありません。

```rb
require "action_controller/railtie"
require "action_dispatch/routing/inspector"

app = Class.new(Rails::Application)
app.routes.draw do
  namespace :gomi_api, path: "api" do
    namespace :legacy, path: "" do
      namespace :v3, path: "" do
        resources :douga_list, path: "videos"
      end
    end
  end
end

formatter = ActionDispatch::Routing::ConsoleFormatter.new
puts ActionDispatch::Routing::RoutesInspector.new(Rails.application.routes.routes).format(formatter)
# >>                              Prefix Verb   URI Pattern                    Controller#Action
# >> gomi_api_legacy_v3_douga_list_index GET    /api/videos(.:format)          gomi_api/legacy/v3/douga_list#index
# >>                                     POST   /api/videos(.:format)          gomi_api/legacy/v3/douga_list#create
# >>   new_gomi_api_legacy_v3_douga_list GET    /api/videos/new(.:format)      gomi_api/legacy/v3/douga_list#new
# >>  edit_gomi_api_legacy_v3_douga_list GET    /api/videos/:id/edit(.:format) gomi_api/legacy/v3/douga_list#edit
# >>       gomi_api_legacy_v3_douga_list GET    /api/videos/:id(.:format)      gomi_api/legacy/v3/douga_list#show
# >>                                     PATCH  /api/videos/:id(.:format)      gomi_api/legacy/v3/douga_list#update
# >>                                     PUT    /api/videos/:id(.:format)      gomi_api/legacy/v3/douga_list#update
# >>                                     DELETE /api/videos/:id(.:format)      gomi_api/legacy/v3/douga_list#destroy

include Rails.application.routes.url_helpers
gomi_api_legacy_v3_douga_list_path(1) # => "/api/videos/1"
```

ここでおもしろいのが **path を空にできる** ということです。ドキュメントには言及がなかったので、てっきり何かを書かないといけないのかと思っていましたが、試してみるとその階層をなかったことにできました。上のすべての path を空にすると URL は `/` になったりもしました。さすが Rails よくできてますね。
apt-mirrorとは何か。

apt-mirror is 何？
ググっても日本語のページにぶつからなかったのでまとめてみます。
英語も読めないんで、自分なりに翻訳してみます。

端的にいうと、
プライベートネットワーク内で建てたVMで、aptパッケージのダウンロード（及びインストール）をプライベートネットワーク内で完結したいときに使えるらしい。
（ローカルリポジトリサーバっていうやつだと思います。ミラーサーバとしてのパッケージ管理用パッケージなんすかね。）


パッケージの情報について。

```
ajitama@ubuntu-xenial:~$ apt show apt-mirror
Package: apt-mirror
Version: 0.5.1-1ubuntu1
Priority: optional
Section: universe/net
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Brandon Holtsclaw <me@brandonholtsclaw.com>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 64.5 kB
Depends: adduser, perl-modules, wget, perl
Homepage: http://apt-mirror.github.com/
Download-Size: 13.5 kB
APT-Sources: http://az01.clouds.archive.ubuntu.com/ubuntu xenial/universe amd64 Packages
Description: APT sources mirroring tool
 A small and efficient tool that lets you mirror a part of or
 the whole Debian GNU/Linux distribution or any other apt sources.
 .
 Main features:
  * It uses a config similar to apts <sources.list>
  * It's fully pool comply
  * It supports multithreaded downloading
  * It supports multiple architectures at the same time
  * It can automatically remove unneeded files
  * It works well on overloaded channel to internet
  * It never produces an inconsistent mirror including while mirroring
  * It works on all POSIX compliant systems with perl and wget
```
以下は自分なりに概要をまとめたもの。（駄文）

```
Main features＝主な特徴ですね。
* /etc/apt/sources.listと似たようなコンフィグ体型になるようです。
* 完全にプールに準拠しています（google翻訳）←poolっていうのは多分、XenialとかTrustyとかの単位だと思う…。LTSの単位というのであってるのかな…？
* マルチスレッドでのダウンロードに対応。（並行して複数のダウンロードプロセスが立ち上がる）
* 複数のアーキテクチャを同時にサポート。
* いらないファイルは自動で削除してくれる。
* 負荷のかかっているインターネット回線でも、よく働いてくれるそうです。（多分、帯域を圧迫しないってことでしょうか。）
* ミラーリング中でも一貫性のないミラーは作らない（ミラー中にファイルとか削除してもなんとかしてくれそう。）
* このパッケージはPerlとwgetが実装されているPOSIX準拠のOSなら動きます。
```

リポジトリサーバがあるとパッケージ管理が楽になりそうですが、
多種多様なOSを使ってるところだと、パッケージのファイル数もサイズも再現なく大きくなりますので気をつけてください。

試しにUbuntu用のリポジトリサーバ建てたら一瞬で500GBパンクしました。
Firefoxでブックマークの段を増やす(2017/12/19更新)

*Firefoxのブックマークのツールバーで、*
*いっぱい登録していると矢印になって選びづらくなると思いますが、*
*以下の操作を行えば多段にする事ができます。*

# 環境
- Firefox Developer Edition 58.0b5 64bit 

# 手順
- URLに about:support と入力
- プロファイルフォルダーを開く
- chromeというディレクトリがなければ作成
- chromeの中にuserChrome.cssを作成

以下のCSSで段が可変になります。
(レスポンシブ)

```userChrome.css
#PersonalToolbar {
    max-height: unset !important;
}

#PlacesToolbarItems > box {
    float: left;
}

#PlacesToolbarItems {
    display: inline-table;
}

.bookmark-item {
    visibility: unset !important;
}
```
GitHub 組織配下のリポジトリ横断検索

DBの構成変更する時に、関連するシステムがわからんわいってなった。

# バージョン
## Github
REST API v3
https://developer.github.com/v3/

# 1. tokenを発行する
https://github.com/settings/tokens

※認証方法は他にもある
　https://developer.github.com/v3/auth/

# 2. 以下のコマンドを打つ

```shell-session
curl -H 'Accept: application/vnd.github.v3.text-match+json' \
    -u ユーザ名:トークン https://api.github.com/search/code?q=検索文字列+in:file+org:組織名
```

https://developer.github.com/v3/search/#search-code
→ org使えるとは書いてないけれど、使えるっぽい動きだった

https://help.github.com/articles/searching-code/
→ org使えるって書いてある

# 3. おまけ
日本語を検索する時は、URLエンコードすれば良いらしい

例) 日本語→%e6%97%a5%e6%9c%ac%e8%aa%9e

```shell-session
curl -H 'Accept: application/vnd.github.v3.text-match+json' \
    -u ユーザ名:トークン https://api.github.com/search/code?q=%e6%97%a5%e6%9c%ac%e8%aa%9e+in:file+org:組織名
```
PythonControlでステップ応答を求める。

###目的
Python Controlで、1自由度系(バネマスダンバ系)の伝達関数のステップ応答を求める。

###事前準備
[PythonControlをインストールする](https://qiita.com/nnn112358/items/ada16e29ef8282498bb7)

###システムのモデル化
以下の状態方程式について考える。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f37333032302f30323238396566372d313961652d333164632d616361302d3930653565643864666330322e6a706567.jpg](https://qiita-image-store.s3.amazonaws.com/0/73020/aa04e6aa-6843-7b22-dbf1-6589d718508e.jpeg)

>m:質量[kg]
>k:ばね定数[N/m]
>c:粘性減衰係数[N・s/m]
>f：力[N]

```math
G(s)=\frac{Y(s)}{U(s)}=\frac{1}{ms^2+cs+k}
```

###ステップ応答
Python Controlはstep応答は以下の関数で求める。

  __control.matlab.step(sys, T=None, X0=0.0, input=0, output=None, return_x=False)__

 - Parameters:	
   - sys:LTIシステム(線型時不変システム)の 状態空間or伝達関数 
   - T:時間ベクトル（optionで与えられていなければ、自動計算する）
   - X0: 初期値(default=0)、数値は配列に自動変換。
   - input: int型、このシミュレーションへの入力。
   - output: int型、このシミュレーションからの出力。

control.matlab.stepは線形システムのステップ応答を求めることができる。
システムに複数の入力または出力（MIMO）がある場合は、シミュレーション用に1つの入力を選択する必要がある。
オプションで、1つの出力を選択することができる。
出力が選択されていない場合、すべての出力する。
パラメータのinputとoutputがこれを行う。その他の入力はすべて0に設定され、他のすべての出力は無視される。
 
引用元：
[control.matlab.step](http://python-control.readthedocs.io/en/latest/generated/control.matlab.step.html)

###サンプルコード
responce_step.py

```
#!/usr/bin/env python
from control.matlab import *
from matplotlib import pyplot as plt
from scipy import arange 

def main():
    k=1.0
    m=0.1
    c=0.1
    num = [0, 0,1] 
    den = [m, c, k]
    sys1 = tf(num, den) 
    print sys1
    (y1a, T1a) = step(sys1,T = arange(0, 10, 0.01))
    plt.axhline(1, color="b", linestyle="--")
    plt.plot(T1a, y1a)
    plt.show()
    
if __name__ == "__main__":
  main()
```


![step.jpg](https://qiita-image-store.s3.amazonaws.com/0/73020/7cdec1cb-dd04-7958-faeb-f72a5b97863e.jpeg)


サンプルコードは以下に格納。
https://github.com/nnn112358/python-control_test

###参考
[PythonControlをインストールする](https://qiita.com/nnn112358/items/ada16e29ef8282498bb7)

[PythonControlで1自由度系の伝達関数を求める。
](https://qiita.com/nnn112358/items/3b400598e74f8414b1e1)

[PythonControlで2自由度系の伝達関数を求める。
](https://qiita.com/nnn112358/items/3604156086351a07e860)
"Launch Remote Console" wrongly launches VMWare Workstation in vSphere Web

## Symptom

 When clicking "Launch Remote Console" in vSphere, VMWare Workstation vmware.exe launches
instead of vmrc.exe

## How to fix

modify windows registry as below

```
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\vmrc\DefaultIcon]
@="\"C:\\Program Files (x86)\\VMware\\VMware Remote Console\\vmrc.exe\",0"

[HKEY_CLASSES_ROOT\vmrc\shell\open\command]
@="\"C:\\Program Files (x86)\\VMware\\VMware Remote Console\\vmrc.exe\" \"%1\""

```

:smile: 

cf.
https://zhengwu.org/2016/07/12/virtual-machine-console-in-vcenter-is-opened-by-vmware-workstation