2018年11月30日金曜日

StackEdit で画像をクリッカブルにし拡大させる方法

概要

StackEdit で画像を挿入する場合自分は Google+ に画像をアップロードして URL で参照しています
Markdown で埋め込む場合は以下のようになります

![image_name](https://...)

これだと画像はクリッカブル (リンク) にならず拡大などができません
今回は画像を拡大する方法を紹介します

環境

  • StackEdit 4

やり方

Markdown 的には以下のようにしまう

[![image_name](https://...)](https://...=s800)

画像の Markdown 自体をリンクの Markdown で更に囲うだけです

Google+ を使っている場合だけですが URL の最後に s800 のような感じでサイズを指定することができます
s0 を指定した場合は元のサイズになります
なのでクリックした際に拡大するサイズを指定してあげればやりたいことを実現できます

例えば以下のようにすると

[![enter image description here](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigldUTXXiAP1Mw-f79wi-z-5elOS6E_2h1LKIv4NzqVUwcDf58U7RpTKV5nYbt3eYKIGAmKr8MwPCyiMiZahgkaK_T1ail1vbqS7xFKRI5eFidCdYV-PdQAtKBuMLHoM1Ha8V_alHExsgd/s400/ "hawksnowlog-icon.png")](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigldUTXXiAP1Mw-f79wi-z-5elOS6E_2h1LKIv4NzqVUwcDf58U7RpTKV5nYbt3eYKIGAmKr8MwPCyiMiZahgkaK_T1ail1vbqS7xFKRI5eFidCdYV-PdQAtKBuMLHoM1Ha8V_alHExsgd/s0/)

実際に Blogger では以下のようになります
zoom-demo.gif

StackEdit4 の場合画像埋め込み時に外枠のリンク用の Markdown を一緒に生成する方法はないので、画像を埋め込んだあとに自分でリンク部分の Markdown を囲う必要があるのが面倒かなと思います

画像が 1, 2 枚くらいであれば問題ないかなと思いますが大量にある場合はかなり面倒かなと思います

参考サイト

2018年11月29日木曜日

vSphere Replication をデプロイする方法

概要

vSphere Replication は VMware が提供する DR ツールで VM のレプリカをあらかじめ別の環境 (vCenter) に作成しておくことで有事の際に自動リカバリすることができるようになります
今回は vSphere Replication の仮想アプライアンスをデプロイする方法を紹介します

環境

  • VCSA 6.5.0 9451637
  • ESXi 6.5.0, 5969303
  • vSphere Replication Appliance 6.5.1

仮想アプライアンスのダウンロード

MyVMware にログインしここからダウンロードできます
vmware_vr1.png

執筆時点では VMWare-vSphere_Replication-6.5.1-6128267.iso という名前の ISO ファイルがダウンロードできました
ISO を解凍すると中にたくさんの OVF と 2 つの vmdk が入っていることが確認できます
vmware_vr2.png

ここにある vSphere_Replication_OVF10.ovf, vSphere_Replication-support.vmdk, vSphere_Replication-system.vmdk を使って仮想アプライアンスをデプロイします

デプロイする

Web Client からデプロイします
この辺はいつも通り OVF をデプロイ手順と同じです

vmware_vr3.PNG

vmware_vr4.png
デプロイする OVF を選択するときに上記の 3 つ選択を選択するようにしてください

vmware_vr5.png

vmware_vr6.png

vmware_vr7.png

vmware_vr8.png

vmware_vr9.png
CPU の数はデフォルトの 4vCPU を選択しました

vmware_vr10.PNG
仮想ディスクのフォーマットは「シンプロビジョニング」を選択しました

vmware_vr11.png
好きなネットワークを選択してくだだい
アドレスの割り当ては DHCP を選択しました
もちろん static に振っても OK です

vmware_vr12.png
root パスワードと NTP サーバのアドレスを入力してください
NTP サーバはとりあえず ntp.nict.jp を入力しています

vmware_vr13.png

vmware_vr14.PNG

これで設定は完了です
あとはデプロイされるまで待ちましょう
デプロイ後は電源 OFF の状態になっているので完了したら電源 ON してください

管理画面にアクセス

vSphere Replication の VM に振られた IP のブラウザでアクセスすると管理画面が使えます
デプロイ時に設定した root ユーザのパスワードでログインできます
vmware_vr15.png

vSphere Replication の初期設定

そのまま管理画面上で初期設定します

連携する vCenter のアドレス (LookupService Address) を確認し SSO Administrator のパスワードを入力します
そして右上の「Save and Restart Service」を選択します
vmware_vr16.png

vCenter の証明書を許可するかどうか確認するダイアログが表示されるので許可します
vmware_vr17.png

「Successfully saved the configuration」と表示されれば OK です
Service Status で VRM service is running にもなっていると思います

Web Client (Flash 版) で確認して vCenter から見てもステータスが有効になっていれば OK です
vmware_vr18.png

非常に残念なのですがここからの作業は Flash 版の Web Client で行います

とりあえず試してみる

適当に VM を右クリックすると「すべての vSphere Replication のアクション」->「レプリケーションの構成」が選択できるようになっています
レプリケーション先の vCenter を選択するダイアログが表示されるので進めていきます
vSphere Replication は同一 vCenter に対してもレプリケーションを貼れるので今回は同一 vCenter に対してレプリケーションを作成してみます

vmware_vr20.png
「vCenter Server にレプリケート」を選択します

vmware_vr21.png
自信の vCenter が表示されているはずなのでそれを選択します

vmware_vr22.png
「vSphere Replication サーバの自動割り当て」を選択します

vmware_vr23.png
ターゲットの配置場所を指定します
ストレージが選択されていないので「編集」からレプリケーションを作成するストレージを選択します

vmware_vr24.png
空いているところを選択しましょう

vmware_vr25.png
選択できれば OK です

vmware_vr26.png
ここはデフォルトで両方共チェックされていなかったのでそのまま進みます

vmware_vr27.png
復旧ポイントオブジェクト (RPO) もデフォルトのまま進みます

vmware_vr28.png
内容を確認して完了しレプリケーションを作成しましょう

動作確認

レプリケーションを構成した VM を選択するとレプリケーション情報を確認することができます
vmware_vr29.png

またレプリケーションとして配置したストレージを見ると vmdk がちゃんと保存されていることも確認できます
vmware_vr30.png

あとは必要に応じてこのレプリケーションから VM を作成すれば OK です
レプリケーションの同期に関しては基本自動で行われるようですがタイミングなどは自信でカスタマイズできます
また VM が停止中は基本レプリケーションの同期はされないようです

おまけ: アンインストールする方法

普通に vSphere Replication サーバを停止するだけではダメなようです

  1. すべての VM の vSphere Replication に対するレプリケーションを停止する
  2. 管理画面にアクセスする
  3. Configuration に移動
  4. 接続済みの vCenter のパスワードを入力
  5. Unregister VRMS を選択
  6. Unregistration completed successfully になれば OK
  7. vSphere Replication のサーバを停止してディスクから削除

という手順になります
Unregister する前に停止すると vCenter がエラーを吐くので注意してください

最後に

vSphere Replication を試してみました
本来は外部の vCenter に対してレプリケーションを貼るのが DR 的にも良いと思います

同期のタイミングなど増やすとストレージへの負荷などが気になるなと思いました
またネットワークの負荷も上がるのでその場合はレプリケーション用のネットワークを構成することもできるようです

詳細は参考サイトの公式ドキュメントを御覧ください

参考サイト

2018年11月28日水曜日

google/code-prettify を使う方法

概要

google/code-prettify はソースコードなどを含むブログやページを公開するときにキレイに色付けしてくれる JavaScript ライブラリです
今回は導入方法を紹介します

環境

  • code-prettify 2018/11/26 時点

使ってみる

  • vim index.html
<html>
<head>
  <script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script>
</head>
<body>
<pre class="prettyprint lang-rb">
require 'sinatra'

class MyApp < Sinatra::Base
  get '/' do
    erb :index
  end
end
</pre>
</body>
</html>

code-prettify1.png

1 行 JavaScript を読み込みます
そして <pre> タグで囲んで class に prettyprint を指定すれば OK です
言語を指定することができます
上記の場合は Ruby のコードなので lang-rb と指定しています
他にも "bsh", "c", "cc", "cpp", "cs", "csh", "cyc", "cv", "htm", "html", "java", "js", "m", "mxml", "perl", "pl", "pm", "py", "rb", "sh", "xhtml", "xml", "xsl" などが指定できます

HTML5 の場合は code タグを使っても OK です

<pre class="prettyprint">
<code class="language-rb">
require 'sinatra'

class MyApp < Sinatra::Base
  get '/' do
    erb :index
  end
end
</code>
</pre>

スキンを適用する

JavaScript を参照する際にパラメータを付与することでスキンを適用することができます
使えるスキンはこちらにあります
例えば「desert」を使う場合は以下のようにします

<html>
<head>
  <script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?skin=desert"></script>
  <!-- <script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script> -->
</head>
<body>
<pre class="prettyprint lang-rb">
require 'sinatra'

class MyApp < Sinatra::Base
  get '/' do
    erb :index
  end
end
</pre>
</body>
</html>

code-prettify2.png

こんな感じで色合いが変わります

行数を表示する

左に行数を表示することもできます
linenums クラスを指定します

<html>
<head>
  <script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?skin=desert"></script>
</head>
<body>
<pre class="prettyprint lang-rb linenums">
require 'sinatra'

class MyApp < Sinatra::Base
  get '/' do
    erb :index
  end
end
</pre>
</body>
</html>

code-prettify3.png

5 行ごとに表示してくれます
途中から行番号を振りたい場合は linums:30 とすれば数字が 30 から始まります

最後に

google/code-prettify の使いかたを紹介しました
最近だとブログサービスなどはデフォルトでコードハイライト機能があるのである場合はそれを使うと良いと思います
自分でサイトを運営していたりする場合には導入してみると良いかなと思います

2018年11月27日火曜日

Docker for Mac で Kitematic を使う

概要

Docker for Mac ではデフォルトの管理ツールは Kitematic が採用されているようです
インストールして使う方法を紹介します

Kitematic のダウンロードとインストール

Docker for Mac のアイコンから Kitematic をクリックするとダイアログが表示されます
d4mac_kitematic1.png

ダイアログにダウンロードリンクがあるのでダウンロードしましょう
解凍すると Kitematic.app があるのでこれを Applications に移動しましょう
d4mac_kitematic2.png

Kitematic の起動

再度ツールバーから Docker for Mac のアイコンを選択し Kitematic と選択すると今度はダイアログではなく Kitematic が起動します

起動すると Docker Hub のアカウントでログインする画面になるのでログインします
d4mac_kitematic3.png

動作確認

ログインすると以下のような画面になります
d4mac_kitematic4.png

あとはこの画面でコンテナを作成したりイメージの管理をしたりすることができます
ターミナルを起動して直接 docker コマンドを実行することもできます

過去に Portainer というツールを紹介しましたがそれと同じようなツールになっています

2018年11月26日月曜日

Vue.js 超入門

概要

Vue.js は「ユーザーインターフェイスを構築するためのプログレッシブフレームワーク」らしいです
何ができるかもさっぱりわからなかったのでとりあえず動かしてみました
また本記事は公式のチュートリアルの内容をメインに進めます

環境

  • macOS 10.14.1
  • Chrome 70.0.3538.102
  • Vue.js 2.5.17

とりあえず動かしてみる

HTML ファイル一つで動かすことができます

  • vim index.html
<html>
<head>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
  <div id="msg">
    {{ message }}
  </div>
  <script>
    var app = new Vue({
      el: '#msg',
      data: {
        message: 'Hello'
      }
    })
  </script>
</body>
</html>

あとはブラウザで HTML ファイルを開けば OK です

  • open index.html

Vue インスタンスを生成することで DOM のレンダリングやイベントハンドリングを行うことができるようです

属性に対して値をバインドする

先程はタグ内のテキスト情報をテンプレートで展開しましたが属性に対しても値を展開 (バインド) できます

  • vim index.html
<html>
<head>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
  <div id="msg">
    <span v-bind:title="message">
      Hover your mouse over me for a few seconds
      to see my dynamically bound title!
    </span>
  </div>
  <script>
    var app = new Vue({
      el: '#msg',
      data: {
        message: 'You loaded this page on ' + new Date().toLocaleString()
      }
    })
  </script>
</body>
</html>

span タグの title 属性に対して日付を表示するメッセージを設定しています
title 属性はツールチップを表示するための属性です

v-bind は Vue.js が提供するディレクティブという機能で v- から始まります
Vue インスタンス内で定義した message プロパティを参照しています

条件分岐でタグの表示/非表示

v-if ディレクティブを使うとプロパティの値が true/false かどうかによってそのタグ情報を表示するかしないかハンドリングすることができます

  • vim index.html
<html>
<head>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
  <div id="msg">
    <span v-if="seen">Now you see me</span>
  </div>
  <script>
    var app = new Vue({
      el: '#msg',
      data: {
        seen: false
      }
    })
  </script>
</body>
</html>

消えたタグは hidden などで非表示にしているわけではなく DOM 自体から消えているようです

ループ

ループさせるためのディレクティブもあります
v-for を使います

  • vim index.html
<html>
<head>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
  <div id="msg">
    <ol>
      <li v-for="todo in todos">
        {{ todo.text }}
      </li>
    </ol>
  </div>
  <script>
    var app = new Vue({
      el: '#msg',
      data: {
        todos: [
          { text: 'aaa' },
          { text: 'bbb' },
          { text: 'ccc' }
        ]
      }
    })
  </script>
</body>
</html>

v-for="todo in todos" こんな感じで in を使ってプロパティで宣言した todos プロパティをループさせることができます
todos プロパティは配列で定義しているのがポイントです

またコンソールを表示して app4.todos.push({ text: 'New item' }) と入力するとリストが増えることが確認できます
vue_tutorial1.png

クリック時のイベントをハンドリングする

v-on ディレクティブを使います
値に関数名を指定することでクリック時のその関数を呼び出すことができます
関数は Vue インスタンス生成時に指定します

  • vim index.html
<html>
<head>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
  <div id="msg">
    <p>{{ message }}</p>
    <button v-on:click="say">say</button>
  </div>
  <script>
    var app = new Vue({
      el: '#msg',
      data: {
        message: 'Hello'
      },
      methods: {
        say: function() {
          this.message = 'World'
        }
      }
    })
  </script>
</body>
</html>

methods プロパティ内に呼び出す関数を定義します
今回の場合はボタンをクリックすると message プロパティの内容を World に変更する処理を実装しています
this で Vue インスタンス自体を参照できます

jQuery のように id などを参照してクリックイベントをハンドリングする必要がないです

input タグの初期値を設定する

v-model という双方向バインディングするためのディレクティブを使います

  • vim index.html
<html>
<head>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
  <div id="msg">
    <input v-model="message">
  </div>
  <script>
    var app = new Vue({
      el: '#msg',
      data: {
        message: 'input default value'
      }
    })
  </script>
</body>
</html>

これで input タグにデフォルトのメッセージが表示されます
input タグの value 属性などが設定されるわけではなくあくまでも Vue.js の機能として表示されているようです

独自のタグ (コンポーネント) を定義する

テンプレートを事前に定義しておくことでそれをコンポーネントとして使い回すことができます

  • vim index.html
<html>
<head>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
  <div id="msg">
    <my-message></my-message>
  </div>
  <script>
    Vue.component('my-message', {
      template: '<h1>Hello</h1>'
    })
    var app = new Vue({
      el: '#msg',
      data: {
      }
    })
  </script>
</body>
</html>

Vue.component として定義しておくことでそれをタグ名として使えます
Vue インスタンスの生成は必要です
id=msg 内に <my-message> タグがあればそこにコンポーネントを展開するイメージです

応用: コンポーネント内でプロパティを参照する

Vue インスタンス生成時に msg1 を定義しそれをコンポーネント側で参照する方法です

  • vim index.html
<html>
<head>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
  <div id="msg">
    <my-message v-bind:val="msg1"></my-message>
  </div>
  <script>
    Vue.component('my-message', {
      props: ['val'],
      template: '<h1>{{ val }}</h1>'
    })
    var app = new Vue({
      el: '#msg',
      data: {
        msg1: 'Hello!!'
      }
    })
  </script>
</body>
</html>

v-bind を使ってコンポーネントにプロパティを渡すだけです
v-for などと組み合わせてリストなどで定義したコンポーネントを使い回すことができます

最後に

これで公式のチュートリアルは終了です
当然ですが Vue.js にはまだまだ機能があります
更に知識を深めたい場合は次のドキュメントに進むと良いと思います

ドキュメントを進めていくと他の JS 周りの知識「JSX」「リアクティブ」「Web Components」などの言葉も出てくるのでその辺りも勉強したほうが更に知識を深められると思います

2018年11月23日金曜日

株と FX をちょろっとやって感じたそれぞれの違い

どちらが良い/悪いという話ではないのですが素人が感じた違いを紹介しあmす
株も FX も投資のためのツールであり、やりたい投資に合わせてどちらを使うか変化すれば良い話かなというのが結論です
また投資におけるリスクオフという観点から言えば正直、株も FX も両方やったほうが良いです

以下それぞれの違いや適した状況などを紹介します
個人的に残したメモレベルの内容なので実際に投資を行う場合はくれぐれも慎重かつ自己責任でお願いします

FX について個別に Tips や経験談をまとめた記事はこちらです

大前提として

どちらも「安く買って高く売る」のは変わりません
逆も OK で「高く売って安く買う」もできます
そういった意味ではどちらも同じです
が、例えば国内株の場合は 100 株からでしか購入できないだとか FX だとスワップポイントが付与されるなど細かい仕組みは全然違います

そういった異なる要素の紹介と向き不向きみたいな点を素人なりの経験則から紹介したいと思います

種類

種類をどう定義するかによっても変わってきますが個人的には株における種類は「銘柄」で FX における種類は「通貨の種類」かなと思います
例えば株であれば「任天堂 (7974)」が 1 種類で FX であれば「ドル円」かなと思います

この記事内ではそうだと定義すると株は上場している銘柄だけでも 3,600 以上あります
かたや FX は 30-50 程度です (証券会社によっては 100 以上の通貨ペアの取り引きができるところもあり)

また更に株には外国株もあります
Apple や Amazon, Facebook, Google などの株がそれにあたります
そう考えると種類としては株のほうが圧倒的に多いです
後で少し触れますがこの話は「分散投資」にもつながるかなと思います 

中長期投資に向いているのは

中長期投資は株や FX のポジションを半年から 1 年以上持ち続ける投資方法になります
ざっくとメリットはそれぞれ

  • 株・・・配当金、株主優待
  • FX・・・スワップポイント

かなと思います (詳しくはネットで調べればわんさか情報が出てくると思います)
メリットで考えるとどちらも良いかなと思います
株主優待はかなり種類もあるので、株主優待目当てで株を購入する人もいると思います
配当金とスワップポイントはどちらも得られるものは同じです
が大きく違うのはもらえるタイミングです
配当金は (国内株の場合) 基本的に年 2 回しかもらえません
方や FX のスワップポイントは少額ですが毎日もらえます
この辺も人によって大きく変わってくると思います (まとめた金額をドカっとほしいのかお小遣いを毎日ほしいのか)

ボラティリティという面ではどちらも同じかなと思います
が取り引き時間が株と FX では大きく違うのでそこはポイントかなと思います
国内株の話ですが株の取り引き時間は朝 9 時から夕方 15 時までです (途中休憩あり)
方や FX は土日祝日を除く 24 時間取り引きが行われています
なので単純に FX のほうがチャートの変動する時間は多いのでそれだけチャートを気にしなければいけない時間も多いと言えば多いです

ただ FX にも実効レバレッジという概念がありロスカットされない投資方法もあるのでそういった手法を使うのであれば中長期投資で毎分のようにチャートを確認しないでも大丈夫な状態にすることは可能です
(厳密にいうと株にも先物があるのでこれを含めればほぼ 24 時間変動するのですが、あくまでもこの記事では現物買いの話なので省略)

といった感じでどちらも中長期投資することは可能です
が、個人的には「株」の方が中長期投資には向いているかなと思います

短期投資 (デイトレード) に向いているのは

中長期投資が株だったので短期投資は「FX」のほうが向いているかなとは思います
自分的にも「デイトレード」という言葉を聞いて真っ先に思い浮かぶ方は FX かなと思います

理由としては先にも述べたように 24 時間取り引きができます
なのでエントリーポイントが単純に多いです
また「スキャルピング」という手法もあり 1 日と言わず数分、数秒で取り引きを完了させる手法も FX では使われたります

もちろん株でもデイトレートは可能です
実際にやっている人もいると思います
ただ株の場合は会社の将来性なども考慮して株を購入するので一日でとんでもない成長をするというのは少し考えにくいかなと思います

そういった意味でも短期投資に向いているのは FX かなと思います

リスクが低いのは

正直これに関してはどちらもリスクがあるので答えとしては「どちらもリスク高」かなと思います
が、自分の経験からあえてどちらのほうがリスクが低いのか言うのであれば株のほうが低いかなと思います

リスクどうこうに関しては賛否両論あるのでそこまで突っ込んだ話はしたくないのですが株は先にも述べたように種類 (銘柄、国内外) が大量にあります
なのでかなりリスクオフな「分散投資」をすることが可能です
よく分散投資をするなら 10-20 銘柄くらい購入しておけと言うのを聞いたことがありますが 100 やら 200 銘柄購入したほうがリスクヘッジになると思います

比べて FX は通貨分の種類しかないでせいぜい 20-30 です
20-30 あれば十分だという人もいると思いますが株に比べたら数1/10ほどしかありません
仮に世界的な大暴落があった場合、全通貨が落ちる可能性と全銘柄が落ちる可能性を考えれば簡単な話かもしれません

ただ国内株に限って言えば 100 株からしか購入できないので、それを 100 やら 200 銘柄購入しようともなればそれなりの資金が必要です
じゃあどうするのかというと外国株やらインデックスファンドを使うという選択になるのかなーと思っています

あくまでもここで話しているのは「株の現物買い」と「FX」の比較なのでもっとリスクを減らした投資がしたいってことであれば NISA や iDeCo、国債などが良いのかなと思います
NISA や iDeCo も調べてばたくさん情報は出てくるので興味があればググって見てください (それでもやっちゃったほうが理解するという意味では早いと思いますが、、)

税金、確定申告について

税金はどちらも変わらず 20% です

確定申告に関しては株は特定口座にしているのであれば基本不要です
逆に FX は特定口座という仕組みがないので申告必須です
口座を持っている証券会社のページに行くと申告用の資料をダウンロードできるはずなので、金額面に関してはそれを使えば OK です
FX の詳しい確定申告方法については調べればいろいろと出てきます
(収益が 20 万円以下の場合は申告不要などの条件もあるので

FX は確定申告必須という点を踏まえると株のほうが手間は少なくて済むのかもしれません

その他の投資を考える

NISA, iDeCo, 国債, インデックスファンドなどです
NISA, iDeCo に関しては非課税な投資枠で 20% の納税が不要です
詳しくはこれも調べてほしいのですが期間があり期間中の利益は非課税になるといった具合です

個人向け国債は自分も詳しく知らないのですが銀行の預金口座に預けておくよりかは利率が良いです (ただ、すぐにお金に変えられないみたいな契約方法だったような、、)
インデックスファンドは株式投資の一種ですが投資先を自分で選択するのではなくプロにおまかせする方式です
投資する自分はいくら投資するのか金額を決定するだけです
攻めの投資にするのか守りの投資にするのかみたいな投資方法を選択することはできたと思います
ただ具体的にここの株を買ってみたいなのはできなかった気がします
少し紹介した分散投資が面倒くさい人とかは良いのかもしれません (すいませんこれも詳しくは知らないので興味があれば調べてみてください)

現金化

どちらもそうですが売ってしまえば現金化は簡単です
ただ含み損がある場合だと話は別です
含み益になってから売ろうとするとどうしても現金化には時間がかかってしまいます
これは株でも FX でも同じだと思います
ただ配当金やスワップポイントがあればそれだけ引き出すことが可能です
特に配当金は確実です (スワップポイントの場合決済しないと振り込まれないケースもあるので確実ではない)
どうしても現金がほしい場合はポジションを少し減らして損切りするしかないかなと思います

最後に

株と FX の違いを素人なりにまとめてみました
これ以外にも細かい点はたくさんあるのでやはりやってみないことには理解は難しいかもしれません
あまり触れませんでしたが少額な資金で始めたいという場合には FX なのかなーという気もします (国内株は 100 株からなので)
株も FX も怖いけど投資やってみたいという人は NISA が良いと思います

念の為最後に、、投資の最終的な判断は自己責任でお願いします
(この言葉が投資系のブログや動画で最後に必ず記載されているのは何でなのだろう、、これもリスクオフなのだろうか)

2018年11月22日木曜日

FX をやってみたときの Tips

いろいろとやってみたので Tips を紹介します

証券会社の選択は重要

「FX をはじめよう」となったらまずは証券会社を選択する必要があります
SBI FXみんなの FXマネックスFXPLUSなど実に様々な証券会社が存在しています
もしかすると自分がもっている口座がすでに FX の取引に対応している可能性もあるかもしれません

とりあえずやってみたい場合には何でも OK ですが証券会社によってかなり差があるので実はこの証券会社の選択はかなり重要です
以下では証券会社を選択する際の主なポイントについて紹介します

スワップポイント

いわゆる金利差によるボーナスです
例えば最もメジャーな取引通貨であるドル円の場合金利差が 2% ほどあります
金額にすると 1 万通貨分のドルを保有している場合 1 日あたり 70 - 80 円ほどのスワップポイントを得ることができます
この 70 - 80 円という価格が証券会社によってかなり変わってきます
安いところだと 20 円ほどしか出ないところもあります
またスワップポイントはあくまでも通貨間の金利差なので金利が上下することによりスワップポイントも上下します
必ずしも固定ではないので注意が必要です

またスワップポイントが 1 日で数日分入る場合もあります
土日は市場が休みなので土日分は木曜日に一緒に振り込まれるのが有名な話です
他にもイレギュラーなパターンはあるので、スワップポイントが数日分入る場合にエントリーするのは普通にエントリーするよりも賢い方法かもしれません

レバレッジが変更できるかどうか

レバレッジは言わずもがなですが簡単に説明すると少ない資金で大きな額の通貨取り引きするための仕組みです
レバレッジは変更可能なイメージがありますが実はどの証券会社でもほぼ 25 倍で固定です
たまに 10 倍コースや 1 倍コースなどがありますが基本的には 25 倍です

なのでレバレッジが変更可能かどうかで証券会社を選択するのはそこまで重要なポイントではないかなと思っています

レバレッジのテクニックに関しては後述しますが「実効レバレッジ」という手法を使うことによって自力でレバレッジを 1 倍や 10 倍にする方法があります

スワップポイントのみの出金ができるか

スワップポイントは先に説明した通りですが証券会社によってはスワップポイントが毎日口座に振り込まれスワップポイントで稼いだ金額を通貨を保有しているにもかかわらず出金することができます
これは長期投資などが目的でスワップポイントをメインで投資する人の場合には必須の機能かなと思います
スワップポイントで稼いだ金額を更に別の投資に回したいなどあるかなと思います
デイトレードで主にキャピタルゲインがメインの場合には不要かなと思います

ただ注意点としては含み損がある場合、それを差し引いた値が出金可能額になるケースがほとんどなのでその点には注意が必要です

スプレッド

売りと買いの間に生じる差です
スプレッドは証券会社が主に収入源としています
簡単に説明すると現在のレート 100.000 円に対して売りの場合は 100.000 ですが買いの場合には 100.003 になります
この 0.003 の差がスプレッドになります
例えばドル円であれば基本は 0.3 銭なります
これが 0.29 銭の会社もあるという感じになります
スプレッドの差は小さければ小さいほど良いのでこれも選択する際のポイントになると思います

また後述していますがスプレッドは「原則固定」という表現がよく使われています
これは逆に言うと変動するということを意味しており言葉のとおりスプレッドは変動します

取り引きできる為替の種類

例えば最近話題のトルコリラですが YJFX などでは取り引きできません
ドル円などのメジャーな通貨であればどこの証券会社でも可能ですが先進国通貨などは取り引きできるかどうか違ってくるので自分が取り引きしたい通貨が対応しているかチェックしておきましょう

取引時の手数料

FX は基本的に取引時の手数料は無料です
が、証券会社によっては手数料を取るところもあります
一応確認しておくと良いかと思います

ロングとショート

ロングは「買い」でショートは「売り」のことです
なぜロングとショートと呼ぶのかは諸説ありますが個人的にはロングは長期投資する場合購入方法でショートは短期で取り引きするための手法だからこのような呼び方をしているんだと思います

というのもドル円の場合、ショートを長期間保有するとマイナス金利が発生します
要するにショートのポジションを保有するのに毎日いくらかのお金を支払う必要があるのです
実は FX を始めた当初この仕組があることを知らずにショートを 1 ヶ月以上保有している時期がありました
最終的には損切りをして決済しましたがマイナス金利のことを知らずに 1 ヶ月も保有していたので含み損+マイナス金利分の損切りをする羽目になってしまいました

これはドル円に限った話なのですべての通貨に言えることではありませんがマイナス金利が発生するポジションの場合にはなるべく早く決済することをおすすめします

実効レバレッジ

簡単に言えば証拠金を大量に口座に入金しておくことでロスカットされないようにする手法です
具体例を上げて説明します
例えば 1 万通貨のドル円 ( 1 万ドル) を購入するとします
レートはわかりやすく 100 円とするとレバレッジ 25 倍で 1 万通貨購入するために必要な資金は

  • 10,000ドル / 25 * 100 = 40000 円

が必要になります
これを実効レバレッジ 1 倍、つまりロスカットされないレバレッジにまで自力で戻します
実効レバレッジの計算式は

  • 実効レバレッジ = 取引額 / 有効証拠金

になります
実効レバレッジをロスカットのない 1倍 にしたいとすると

  • 有効証拠金 = 取引額 (10,000 ドル) / (実効レバレッジ) 1
  • 有効証拠金 = 10,000 ドル (100万円)

になります
1 ドル 100 だとすると 100 万円が証拠金として口座にあればロスカットされずかつレバレッジ 1 倍と同じように取り引きすることができます
実効レバレッジ 2 倍で取り引きしたいのであれば証拠金は 50 万円で十分です
このように証拠金を自分で調整することでレバレッジを調整する手法を実効レバレッジの調整と言います
あくまでも仮想的にレバレッジを下げているので実際の評価額などは 10,000 通貨を元に計算されます

精神的な負担

FX 以外でもそうですが投資は精神的な負担がかなり大きいなと感じています
特に「含み損」が大きくなっているときはそうなりがちです
そこで冷静な判断ができないと自然と負けの方向に行ってしまうものだと思っています

負けているときにこそ冷静に自分のポジションを考えてどうするべきか判断することが重要だと思います
思い切って損切りをする勇気もそういった判断の一つなのかもしれません

また FX をやる上で「我慢」する時間は非常に多いです
注文後にナンピンすることもできますが、そこでグッと我慢できる精神力がないと厳しくなるケースは多いと思います
常に FX に対して気を張っている状態だと長続きしません
フラットな気楽な気持ちで常に FX と向き合えている状態を保てる投資方法をするように心がけると良いと思います

スプレッドが大きくなる時間帯

スプレッドが大きくなる時間帯はだいたい決まっています
まずスプレッドが大きくなる条件としては「取り引き量が少ない」ときに差が大きくなります

  • 日本時間の朝6から8時まで

がまず有名なところです
あとは重要な指標が発表される前などはボラティリティが小さくなり取り引きも少なるなっているため急にスプレッドが大きくなる場合があります
基本はランダム性があるので購入する際の画面などを逐一確認して売りと買いのスプレッド差を注意するようにしましょう

FX の情報源は何を使っていたか

結構これはみなさん迷うと思います
自分が使っていた情報源を紹介します
ドル円がメインだったのでドル円メインの情報源ですが同じように他の通貨でも使えると思います

だいたいこんなもんかなーと思います
特に個人的には Youtube の FX 系チャネルの展望は参考にしていました
ただどれも共通して言えるのはあくまでも展望であるということです

また「ダウ平均株価 リアルタイムチャート」は NY ダウや日経平均のチャートと一緒に為替のレートも確認できます
FX をやっている人には当然かもしれませんが為替の動きは株価の動きと連動するケースが多いです (必ずしもそうでない場合も当然あります)
なので株価の動向を気にすることで為替の展望も予測できるケースはあると思います

あとは掲示板も便利というかココロの拠り所というか見るとおもしろいです
同じように含み損を持っている人が書き込んでいる場合もあるので「あ、同じような境遇の人がいるんだー」みたいな感じで少しくらい気休めになったりするかもしれません (笑)

Twitter でトランプ大統領のツイートも追っていましたがこれは要するに「トランプ砲に気をつけろ」という意味になります

そしてこれらはすべて正解ではありません
最終的な判断は自分でするしかないということを覚悟しておきましょう

世界経済・ニュースに詳しくなる

上記の副産物として毎日のようにチェックすると世界経済のニュースに詳しくなります
例えばアメリカ中間選挙の行方やブレグジットの行方など毎日のように状況を追うのでやたら詳しくなります
これは FX をやっていた得られた思わぬ副産物でした
もしかすると経済ニュースに詳しくなるのは投資家あるあるなのかもしれません

とにかくやってみよう

一番感じたのはとにかくやってみないと何もわからないということです
自分も始める前に事前にネットでいろいろと調べましたが正直やってみてわかったことが 9 割くらいありました

最近だと 1 通貨から始められる証券会社もあります
レバレッジも 1 倍でできるところもあるので少額から始めることは本当にできます
本当に興味があるのであれば「論より証拠」という感じでしょうか、まずは口座を開設してドル円とかを買ってみることをおすすめします

自分もそうでしたが、まずはやっていろいろ痛みを知って知識を付けていった感じがします
まぁ自分の場合は転び過ぎな感じもしますが、、

個人的に考える FX 投資とは

正解は正直ないと思います
投資自体リスクが付きまとうのでリスクを許容できないのであればやらないのが一番だと思います
ただ、うまく運用できればほぼリスクゼロで運用することもできると思います
数ヶ月ですが自分が考えた良い投資方法としては

  • 実効レバレッジ 1 倍でロングポジションを持ち続ける

が良いのかなと思います
ようするにスワップポイントで稼ぐ方法です
やり方などは「スワップポイント レバレッジ1倍」などで検索すればたくさん出てくると思います
ただ、これもリスクゼロというわけにはいきません
例えばドル円であれば単純にものすごい円安になれば含み損の額がとんでもない額になるのでスワップポイントだけでは補いきれなくなる可能性もあります

ただ証拠金が潤沢にあれば実効レバレッジを 1 にすることができるのでロスカットされる心配はありません
なので、急落したとしても時間とともに回復するのだとすればその回復の間スワップポイントがもらうことができます
そして回復したときにスワップポイントがもういらないのであれば売りオーダーを出して利確すれば良いのです

書くのは簡単ですが実際にそうなったら精神的な負担や焦りもあるので、そんな単純な話ではないと思います
「損切りしてしまおうか」「別の通貨に移行しようか」など考えると思います
その辺は自分の判断でどうにかするしかないと思います
将来本当に回復するのかなんていうのは自分でもわかりません
先に述べましたが、そもそもそのようなリスクを許容できないのであれば FX はやらないほうが良いと思います

個人的には FX において必要なのは

  • 変わらない/揺るがないスタンス
  • 安定した精神/ココロの余裕
  • 無理な投資をしない

の 3 点かなと思います
これを守れば必ず勝てるというわけではないですが少なくともコケる心配は少なくなるのかなと思います

最後に

自分もまだまだ FX を始めたばかりのひよっこなので、まだまだわかっていないことは多いです
始めたばかりだからこそ感じる大事な点などをメモしておきたかったのもあり記事にしてみました

今後も続けてみて何かわかったら別の記事として紹介したいと思います
何度も言いますが投資は自己責任でやりましょう!

2018年11月17日土曜日

Python3 でボディに XML を設定して HTTP リクエストする

概要

Python3 で XML ボディを設定して HTTP リクエストする方法を紹介します
標準ライブラリの urllib.request だけを使用します

環境

  • Python 3.7.0
  • pipenv 2018.11.14

サンプルコード

  • vim app.py
import urllib.request
import urllib.error


if __name__ == '__main__':
    requestURL = "https://kaka-request-dumper.herokuapp.com/"
    xmlPostBody = """
        <?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n
        <hoge>\n
        </hoge>
    """
    headers = {
      'Content-type': 'application/xml'
    }
    method = 'POST'

    bytesXMLPostBody = xmlPostBody.encode("UTF-8")
    req = urllib.request.Request(requestURL, data=bytesXMLPostBody, headers=headers, method=method)
    try:
        with urllib.request.urlopen(req) as response:
            res = response.read().decode("utf-8")
            print(res)
    except urllib.error.HTTPError as err:
        print(err)

ヒアドキュメントを使って XML ボディを生成しています

  • python3 app.py

テンプレートを使う

ヒアドキュメントでも問題ないですが管理が辛いので XML データを外出しします

  • vim tmpl.xml
<?xml version="1.0" encoding="UTF-8" ?>
<message>
${msg}
</message>
  • vim app.py
import urllib.request
import urllib.error
from string import Template


if __name__ == '__main__':
    requestURL = "https://kaka-request-dumper.herokuapp.com/"
    t = Template(open('./tmpl.xml').read())
    xmlPostBody = t.substitute(msg='hello!')
    headers = {
      'Content-type': 'application/xml'
    }
    method = 'POST'

    bytesXMLPostBody = xmlPostBody.encode("UTF-8")
    req = urllib.request.Request(requestURL, data=bytesXMLPostBody, headers=headers, method=method)
    try:
        with urllib.request.urlopen(req) as response:
            res = response.read().decode("utf-8")
            print(res)
    except urllib.error.HTTPError as err:
        print(err)

テンプレート機能を使えば変数を渡すこともできます
こちらのほうがすっきりしている感じがしますが動的に変化する XML などには対応できません

おまけ: dicttoxml を使う方法

  • pipenv install dicttoxml
  • vim app.py
import urllib.request
import urllib.error
from dicttoxml import dicttoxml


if __name__ == '__main__':
    requestURL = "https://kaka-request-dumper.herokuapp.com/"
    # xmlPostBody = dicttoxml({'message': 'hello'}, custom_root='messages')
    xmlPostBody = dicttoxml({'message': 'hello'}, root=False)
    headers = {
      'Content-type': 'application/xml'
    }
    method = 'POST'

    req = urllib.request.Request(requestURL, data=xmlPostBody, headers=headers, method=method)
    try:
        with urllib.request.urlopen(req) as response:
            res = response.read().decode("utf-8")
            print(res)
    except urllib.error.HTTPError as err:
        print(err)

ルートのありなしやルートの名前を設定することができます
デフォルトでは type 属性が必ず付与されてしまうので不要な場合は attr_type=False を設定してください
それ以外にも多くのオプション機能があるので、それらを駆使して自分がほしい XML 情報を生成する必要があります
が、この方法であれば hash をいじればいいので配列要素など簡単に扱うことができます

またバイト文字列として取得されるのでコールする際に encode する必要がなくなります

ちなみに xmltodict もあるのでレスポンスが XML の場合などはこれが使えます

ベーシック認証する方法

import base64
auth = base64.b64encode(('%s:%s' % (username, password)).encode('utf-8'))
headers = {
  'Authorization': 'Basic %s' % auth.decode('utf-8')
}

SSL でないページにアクセスする方法

import ssl
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

でコンテキストを作成してコールする際に指定します

urllib.request.urlopen(req, context=ctx)

2018年11月16日金曜日

Vyos で DNAT して NAT 側にいるサーバにアクセスする

概要

こんな感じの環境でルータ (vyos) にアクセスすることで NAT 側のサーバにアクセスできるようにします
vyos_dnat1.png

NAT 側で Web アプリなどを立ち上げているときに便利です

環境

  • VyOS 999.hydrogen.10081205

コマンド

set nat destination rule 1 destination address 172.20.100.10
set nat destination rule 1 destination port 80
set nat destination rule 1 inbound-interface eth0
set nat destination rule 1 protocol tcp
set nat destination rule 1 translation address 192.168.200.200

172 がユーザ側からみたアクセスポイントで VyOS の eth0 側のインタフェースとします
そして 192.168.200.200 が Web アプリが立ち上がっているサーバでそこに対してポート転送する感じです
port 80 という感じで指定すれば 192.168.200.200 側の 80 ポートにそのまま転送されます
なので、アプリ側で LISTEN しているポートに合わせてそこは変更してください

2018年11月15日木曜日

NSX API を curl で嗜む

概要

NSX Manager の API を curl でいろいろコールしてみました
サンプルを紹介します

環境

  • NSX Manager 6.3.1 Build 5124716

Lookup Service URL を取得/設定する

取得

curl -k -u admin:$pass https://xxx.xxx.xxx.xxx/api/2.0/services/ssoconfig

設定

curl -k -X POST -u admin:$pass -H 'Content-Type: application/xml' -d @- https://xxx.xxx.xxx.xxx/api/2.0/services/ssoconfig << EOF
<ssoConfig>
 <ssoLookupServiceUrl>https://[vcenter-ip]:443/lookupservice/sdk</ssoLookupServiceUrl>
 <ssoAdminUsername>administrator@vsphere.local</ssoAdminUsername>
 <ssoAdminUserpassword>$pass</ssoAdminUserpassword>
 <certificateThumbprint>96:09:D6:5B:E0:83:58:1B:BA:2B:CC:78:22:88:33:36:64:50:32:EB</certificateThumbprint>
</ssoConfig>
EOF

Manage vCenter Registration の Lookup Service URL の部分を設定することができます
nsxapi1.png

ユーザの取得/登録をする

取得

curl -k -u admin:$pass https://xxx.xxx.xxx.xxx/api/2.0/services/usermgmt/users/vsm

詳細を取得

curl -s -k -u admin:$pass 'https://xxx.xxx.xxx.xxx/api/2.0/services/usermgmt/user/administrator@vsphere.local'

administrator@vsphere.local の部分は user_id を指定します
一覧を取得する API だと vsphere.local\administrator という感じで返ってくるのですが指定する場合は @ 形式を使います 

登録

curl -k -X POST -u admin:$pass -H 'Content-Type: application/xml' -d @- 'https://xxx.xxx.xxx.xxx/api/2.0/services/usermgmt/role/user001@vsphere.local?isGroup=false' << EOF
<accessControlEntry>
 <role>security_admin</role>
 <resource>
  <resourceId>globalroot-0</resourceId>
 </resource>
</accessControlEntry>
EOF

globalroot-0 もしっかり指定しましょう

nsxapi2.png

ロールの取得

curl -k -u admin:$pass https://xxx.xxx.xxx.xxx/api/2.0/services/usermgmt/roles

特定のユーザのロールを取得

curl -k -u admin:$pass 'https://xxx.xxx.xxx.xxx/api/2.0/services/usermgmt/role/administrator@vsphere.local'

edge の取得/デプロイ

取得

curl -k -u admin:$pass 'https://xxx.xxx.xxx.xxx/api/4.0/edges'

詳細、vnics などの情報も取得できる

curl -k -u admin:$pass 'https://xxx.xxx.xxx.xxx/api/4.0/edges/edge-5'

デプロイ (Gateway Service)
長いので後述で簡単な説明をします

curl -k -X POST -u admin:$pass -H 'Content-Type: application/xml' -d @- 'https://xxx.xxx.xxx.xxx/api/4.0/edges' << EOF
<edge>
  <datacenterMoid>datacenter-2</datacenterMoid>
  <name>edge_6</name>
  <description>description</description>
  <tenant>default</tenant>
  <fqdn>NSX-edge-6</fqdn>
  <vseLogLevel>info</vseLogLevel>
  <enableFips>true</enableFips>
  <appliances> 
    <applianceSize>compact</applianceSize> 
    <enableCoreDump>true</enableCoreDump> 
    <appliance> 
      <resourcePoolId>resgroup-8</resourcePoolId> 
      <datastoreId>datastore-12</datastoreId> 
      <hostId>host-10</hostId> 
    </appliance> 
  </appliances> 
  <vnics> 
    <vnic> 
      <index>0</index> 
      <name>edge_if</name> 
      <type>internal</type> 
      <portgroupId>virtualwire-1</portgroupId> 
      <addressGroups> 
        <addressGroup> 
          <primaryAddress>192.168.200.201</primaryAddress> 
          <subnetMask>255.255.255.0</subnetMask>
        </addressGroup> 
      </addressGroups>
      <macAddress>
        <edgeVmHaIndex>0</edgeVmHaIndex>
      </macAddress> 
      <isConnected>true</isConnected>
    </vnic> 
  </vnics> 
  <cliSettings>
    <userName>admin</userName>
    <password>VMware12345!</password>
    <remoteAccess>true</remoteAccess>
  </cliSettings>
  <autoConfiguration>
    <enabled>true</enabled>
    <rulePriority>low</rulePriority>
  </autoConfiguration>
</edge>
EOF

必要最低限のパラメータのみ指定しているつもりです
他にも設定可能なパラメータがあるので詳細はリファレンスを御覧ください
まずデプロイするデータセンターの ID は datacenterMoid で指定します
appliance 内でポートグループやストレージを指定します
指定するのは名前ではなく ID になるので Web Client などで調べて入力してください

vnics でネットワーク情報を指定します
インタフェースに割り当てる IP (primaryAddress) は必須です
HA に使うネットワークインターフェースを指定する edgeVmHaIndex も必須です
Edge に付与したインタフェースの ID を指定しましょう
virtualwire-1 は Edge に作成した論理スイッチにある仮想ワイヤー ID になります
autoConfiguration は Firewall のデフォルトルールを決めます
rulePriority を low にするとデフォルトルールが全許可で作成されます
逆に high にすると全拒否状態で作成されます

cliSettings では Edge に CLI でアクセスする場合の認証情報を指定します
パスワードにポリシーがあるので注意してください

ネットワークファブリックのバージョン取得

ホスト ID を指定して取得します

curl -k -u admin:$pass 'https://xxx.xxx.xxx.xxx/api/2.0/nwfabric/status?resource=host-10'

NSX コントローラの取得

curl -k -u admin:$pass 'https://xxx.xxx.xxx.xxx/api/2.0/vdn/controller'

NSX Manager のバージョン確認

curl -s -k -u admin:$pass 'https://xxx.xxx.xxx.xxx/api/1.0/appliance-management/global/info'

もう少し詳しく知りたい場合は

curl -s -k -u admin:$pass 'https://xxx.xxx.xxx.xxx/api/1.0/appliance-management/summary/system'

NSX CLI を実行する

なぜか CLI を実行する機能もある
CLI でしか実行できないことがあるのだろうか

curl -s -k -X POST -u admin:$pass -H 'Accept: text/plain' -H 'Content-Type: application/xml' -d @- 'https://xxx.xxx.xxx.xxx/api/1.0/nsx/cli?action=execute' << EOF
<nsxcli>
  <command>show logical-switch list host host-21 vni</command>
</nsxcli>
EOF

2018年11月14日水曜日

Ruby で DSL を使ってクラスを初期化する方法

概要

Ruby でクラスからオブジェクトを生成するのに DSL っぽく生成する方法を紹介します

環境

  • macOS 10.14.1
  • Ruby 2.5.1p57

サンプル

  • vim my_dsl.rb
class ID
  def initialize
    yield(self)
  end

  def show
    puts @name
    puts @age
  end

  attr_accessor :name, :age
end
  • vim main.rb
require './main'

ID.new do |id|
  id.name = "hoge"
  id.age = 10
end.show

実行

  • ruby my_dsl.rb
hoge
10

解説

ポイントは initializeyield(self) を使う点です
こうすることでブロックの引数で ID クラスのオブジェクトを使うことができます

これで嬉しいのは初期化処理をカスタマイズできる点です
例えば以下のように初期化することもできます

require './my_dsl'

ID.new do |id|
  id.name = "hoge"
  id.age = 10
  id.show
end

これだとあまり旨味がないような感じがしますが要するに可変的なコンストラクタにすることができます

最後に

yield や Proc という機能が使いこなせるようになると更に完結かつモダンに Ruby を書けるようになると思います

参考サイト

2018年11月13日火曜日

RAML ファイルから HTML を作成する (docker 編)

概要

raml2html をグローバルにインストールしたくなかったので docker 上で動かして .raml ファイルを .html ファイルに変換します

環境

  • macOS 10.14.1
  • docker 18.06.1-ce, build e68fc7a

イメージ pull

いろいろあるっぽいですが素直に検索で一番上に出てきたやつで

  • docker pull mattjtodd/raml2html

RAML ファイルの取得

なんでも OK と言いたいのですが RAML 1.0 以上でなければなりません

  • git clone https://github.com/vmware/nsxraml.git

HTML 出力

  • docker run --rm -v $PWD:/raml mattjtodd/raml2html -i /raml/nsxvapi.raml -o /raml/result.html

_sourceToRamlObj: only RAML 1.0 is supported! になる場合は先頭のバージョンを #%RAML 1.0 に書き換えてください

確認

  • open result.html

2018年11月12日月曜日

NSX のハンズオンラボをやってみた

やってみたのでメモです
かなり長かったです
ラボ+自分の環境で同時に行うと更に理解度が深まると思います
nsx_study.png

得られた知見

  • NSX Manager のログは設定から Syslog サーバを設定し投げられる
  • NSX Manager の自動バックアップには FTP サーバが使われる、構成ファイルなどが自動バックアップされる
  • NSX Controller は最低 3 台必要
  • NSX Controller のデプロイには固定 IP アドレスプールが必要
  • NSX Controller のネットワークは vDS じゃなくていい
  • ストレージの容量もかなり必要、Manager が 60GB、Controlerx3 で 20x3=60GB 使う
  • NSX 6.3.3 は Controller に SSH ログインするのにパスワードの期限切れの関係で root/vmware で初めにログインしその後パスワードを自分で変更するバグがある (参考)
    • 手動で IP を設定することはできるが結局 Controller のデプロイに失敗するので NSX 6.3.1 を使うことにした
  • NSX Controller で VXLAN を有効にするには VDS が必要 (インストール手順 -> ホストの準備から VXLAN の設定を行うことでホスト上で VXLAN が使えるようになる)
    • 更に論理ネットワークから「セグメントID」と「トランスポートゾーン」の設定が必要
  • NSX Manager のデプロイ -> NSX Controller のデプロイ -> ホストへのコンポーネントインストールと VXLAN の設定までが最低限のセットアップ作業
  • 論理スイッチ機能を使うには事前に NSX Edge との接続が必要
    • Edge のデプロイは準備段階ではしないので自分でデプロイする
    • デプロイ時はネットワークの設定で「内部」を選択しネットワークは作成した論理スイッチを選択する
    • また論理スイッチ上で使用できる IP アドレスとゲートウェイの設定も必要
    • Edge 作成時に I/F を追加すると新しい VDS ができるので (必要であれば) そのネットワーク上に DHCP サーバなどが必要になる
  • Edge ロードバランサはプロファイルの作成とプールの作成が事前に必要になる
    • プールはバランシング対象の VM の IP やポートを直接入力する
    • 新規仮想サーバはいわゆるアクセス元の Virtual IP が付与されるサーバになる
    • 基本的には Edge に付与した I/F の IP を設定する、それ以外がよい場合は Edge に I/F を追加する
    • 具体的なロードバランサの設定方法はここが参考になる

一応メモ

  • NSX Manager は ova ファイルからデプロイする
  • NSX Controller までデプロイが完了したらホストにもカーネルモジュールをインストールする必要がある (要 NSX のライセンス)

所感

ハンズオンと言いつつ基本は文章を読み続けることになる
「対話型シミュレーション」で簡略化されたハンズオンが多いが結構よくできているので学習にはなる
時間制限がありゆっくりやっていたので時間切れになってしまった、、

2018年11月7日水曜日

Cytoscape.js Tips 集

概要

Cytoscape.js の Tips を紹介します

環境

  • macOS 10.14
  • Chrome 70.0.3538.77
  • Cytoscape.js 3.2.19

四角形のノードを作成する

style: [
  {
    selector: 'node',
    style: {
      'shape': 'rectangle',
      'background-color': '#666',
      'label': 'data(id)'
    }
  }
]

style'shape': 'rectangle' を指定する

丸と四角のノードを混在させる方法

elements: {
  nodes: [
    {
      data: {
        id: 'a',
      },
      classes: 'foo'
    },
    {
      data: { id: 'b' }
    }
  ],
  edges: [
    {
      data: { id: 'ab', source: 'a', target: 'b' }
    }
  ]
}

nodes で classes 属性を追加します
そして styleselector でクラスを指定します

style: [
  {
    selector: 'node',
    style: {
      'background-color': '#666',
      'label': 'data(id)'
    }
  },
  {
    selector: '.foo',
    style: {
      'shape': 'rectangle',
      'background-color': '#BD4343',
      'label': 'data(id)'
    }
  },
  {
    selector: 'edge',
    style: {
      'width': 3,
      'line-color': '#ccc',
      'target-arrow-color': '#ccc',
      'target-arrow-shape': 'triangle'
    }
  }
]

selector: 'node' がデフォルトで selector: '.foo'classes 属性を追加したスタイルになります

マウスオーバー時のイベントをハンドリングする

cy.on('mouseover', 'node', function(event) {
  console.log(event.target._private.data.id);
});

ノードに背景画像を設定する

{
  selector: '.host',
  style: {
    'shape': 'rectangle',
    'label': 'data(id)',
    'background-fit': 'cover',
    'background-image': 'https://farm8.staticflickr.com/7272/7633179468_3e19e45a0c_b.jpg'
  }
}

ノードのボーダ線を表示する

{
  selector: '.host',
  style: {
    'shape': 'rectangle',
    'label': 'data(id)',
    'border-color': '#BD4343',
    'border-width': 3,
    'border-opacity': 0.5
  }
}

ノードをタップしたら接続しているノードを削除する

cy.on('tap', 'node', function() {
  console.log('hoge');
  if (this.scratch().restData == null) {
    this.scratch({
      restData: this.successors().targets().remove()
    });
  } else {
    this.scratch().restData.restore();
    this.scratch({
      restData: null
    });
  }
});

source 側をタップすると target 側のノードが消えます

アニメーションを追加する

cy.nodes('.host').animate({
  position: {
    x: cy.nodes('.host').position('x') + 100,
    y: cy.nodes('.host').position('y')
  },
  style: {
    backgroundColor: 'red',
    'opacity': 0.0
  },
  duration: 1000,
  complete: function() {
    console.log("done");
    // cy.nodes('.host').remove();
  }
});

画面描画時に nodes('.host') が水平方向に右側に +100 動きます
またアニメーション時にノードの背景を赤に透明度を 0 にしています
つまりアニメーションが終了するとノードが見えなくなります (実際にはある)
また complete を指定するとアニメーション終了後に関数を呼び出すことができます
ノードを削除したい場合はここで remove() すれば OK です

応用: タップしたらアニメーションしてノードの削除を行う

cy.on('tap', '.router', function() {
  var tappedNode = this;
  var targetNode = this.successors().targets();
  if (tappedNode.scratch().restData == null) {
    var orgX = targetNode.position('x');
    targetNode.animate({
      position: {
        x: tappedNode.position('x') + 100,
        y: tappedNode.position('y')
      },
      style: {
        'opacity': 0.1
      },
      complete: function() {
        tappedNode.scratch({
          targetNode: targetNode,
          orgX: orgX,
          restData: targetNode.remove()
        });
      }
    });
  } else {
    tappedNode.scratch().restData.restore();
    tappedNode.scratch().targetNode.animate({
      position: {
        x: tappedNode.scratch().orgX,
        y: tappedNode.scratch().targetNode.position('y')
      },
      style: {
        'opacity': 1.0
      },
      complete: function() {
        console.log("restore");
      }
    });
    tappedNode.scratch({
      restData: null
    })
  }
});

restoreremove() した状態に戻すだけなのでアニメーションした後の位置でノードは復活します
なので restore したあとでノードを元の位置に戻してあげる必要があります
orgX は元の位置を保存するための scratch でこれを使って元の位置に戻します
少し長いですがやっていることは単純です

データを外出しする

elements と style の JSON データは外出しておくと便利です

Promise.all([
  fetch('../json/data.json', {mode: 'no-cors'})
    .then(function(res) {
      return res.json()
    }),
  fetch('../json/style.json', {mode: 'no-cors'})
    .then(function(res) {
      return res.json()
    })
])
.then(function(dataArray) {
  var cy = cytoscape({
    container: $('#cy'),
    elements: dataArray[0],
    style: dataArray[1],
    layout: {
      name: 'cose',
    }
  });
});

ただし json ファイルはローカルファイルは参照できないのでご注意を
Web アプリケーション化すれば問題ないです
Promiss.all を使うとキレイに書けます

応用: マウスオーバー時に子ノードをすべてハイライトする

またそれ以外のノードはローライトします

cy.on('mouseover', 'node', function(evt){
  var sel = evt.target;
  cy.elements().difference(sel.successors()).not(sel).addClass('semitransp');
  sel.addClass('highlight').successors().addClass('highlight');
});
cy.on('mouseout', 'node', function(evt){
  var sel = evt.target;
  cy.elements().removeClass('semitransp');
  sel.removeClass('highlight').successors().removeClass('highlight');
});

スタイルの json の定義は以下の通りです
色や透明度は好きな値に変更してください

{
  "selector": "node.highlight",
  "style": {
    "border-color": "#000",
    "border-width": "2px"
  }
},
{
  "selector": "node.semitransp",
  "style":{ 
    "opacity": "0.2"
  }
},
{
  "selector": "edge.highlight",
  "style": {
    "mid-target-arrow-color": "#000"
  }
},
{
  "selector": "edge.semitransp",
  "style":{
    "opacity": "0.2"
  }
}

ちなみに successorsoutgoers に変更すると 1 階層だけハイライトすることができます

filter を使って特定の data を含むノードだけを取得する

例えば name 属性を部分一致で検索して特定の文字列が含まれる場合のノードを取得します

var nodes = cy.nodes().filter(function(ele) {
  if (ele.data('name').indexOf(name) > -1) {
    return ele
  }
});

特定のノード以外のノードたちを取得する

cy.nodes().difference(nodes).addClass('semitransp');

上記の場合 nodes 以外に対してクラスを追加します