Google Chart でローソク足を表示すると、途中でズレと切れる!

WEB画面上に、ローソク足と移動平均線の複合チャートを表示したい!

過去のチャートだったら、画面ハードコピーでもいいけれども、
それをリアルタイムに表示させようと思えば、それなりのツールが必要になる。

幸い、現在は、無料で高機能なチャートを表示できるツールが溢れていて、
サンプルのコードをコピーしながら作れば、何となく作れてしまうので、
それほど難しい技術は必要としない。

ということで、メジャーで、利用者も多く、ノウハウ情報も多く見つかる
「Google Chart」を使ってみたら、実に簡単に、実現することができた。

ところが、試しに、
日経平均株価の直近100日分のチャートを表示させてみたところ、
途中で ズレ と 切れ が発生して、表示が崩れてしまう。
オプションのパラメータをいろいろといじってみたが、分からない。

Google Chart でローソク足と移動平均線

しかも、その切れた部分に該当する日のデータは、
飛んでいたり順番も違っていたりして、やっぱりおかしい。

結局、ローソク足が9本以内だったら、この影響は受けず、
10本以上になると、何かがおかしくなる。

「Google Chart」以外にも、ローソク足が表示できるツールは
まだまだ他にもいくつかあるので、解決が難しければ、
他のツールを試してみようと思う。

この画面のチャートのソースコードは、次のとおり。
一体、何が、ダメなのだろう?


<!DOCTYPE html>
<html lang=”ja”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=Shift_JIS”>
<title>Chart</title>
</head>
<body>

<!— ローソク足及び移動平均線グラフを配置 —>
<div id=’chart’></div>

<!— ここでGoogle Chartの読み込み —>
<script type=”text/javascript” src=”https://www.gstatic.com/charts/loader.js”>
</script>

<script type=”text/javascript”>

google.charts.load(‘current’, {‘packages’:[‘corechart’]});
google.charts.setOnLoadCallback(drawChart);

function drawChart(){
//チャートに描画するためのデータを入れる
var chartData = new google.visualization.DataTable();

//日付用のString型を一つ、四本値と5本MA用の数値型を計9個作成
chartData.addColumn(‘string’);
for(var x = 0;x < 9; x++){
chartData.addColumn(‘number’);
}
//行数
var length = 100;
//描画用のデータを一時的に入れる
var insertingData = new Array(length);

//[安値,終値,始値,高値,5MA,20MA,60MA,100MA,300MA]
insertingData[000] = [‘2019/08/19’,20502,20563,20590,20633,20499,21061,21176,21361,21770]
insertingData[001] = [‘2019/08/20’,20582,20677,20605,20684,20544,21024,21169,21352,21764]
insertingData[002] = [‘2019/08/21’,20482,20618,20489,20626,20536,20974,21159,21342,21758]
insertingData[003] = [‘2019/08/22’,20584,20628,20706,20731,20581,20920,21149,21339,21753]
insertingData[004] = [‘2019/08/23’,20579,20710,20579,20719,20639,20868,21144,21331,21748]
insertingData[005] = [‘2019/08/26’,20173,20261,20325,20329,20579,20798,21133,21320,21742]
insertingData[006] = [‘2019/08/27’,20439,20456,20467,20529,20535,20740,21130,21314,21735]
insertingData[007] = [‘2019/08/28’,20433,20479,20474,20511,20507,20679,21131,21307,21728]
insertingData[008] = [‘2019/08/29’,20361,20460,20500,20520,20473,20626,21132,21297,21721]
insertingData[009] = [‘2019/08/30’,20633,20704,20641,20748,20472,20584,21131,21289,21714]
insertingData[010] = [‘2019/09/02’,20614,20620,20625,20667,20544,20560,21128,21278,21707]
insertingData[011] = [‘2019/09/03’,20578,20625,20581,20662,20578,20556,21124,21267,21700]
insertingData[012] = [‘2019/09/04’,20554,20649,20578,20694,20612,20559,21116,21255,21692]
insertingData[013] = [‘2019/09/05’,20787,21085,20800,21164,20737,20587,21114,21248,21686]
insertingData[014] = [‘2019/09/06’,21145,21199,21201,21241,20836,20618,21115,21242,21681]
insertingData[015] = [‘2019/09/09’,21182,21318,21214,21333,20975,20649,21120,21239,21676]
insertingData[016] = [‘2019/09/10’,21350,21392,21363,21438,21129,20696,21125,21236,21672]
insertingData[017] = [‘2019/09/11’,21437,21597,21466,21619,21318,20743,21133,21233,21669]
insertingData[018] = [‘2019/09/12’,21743,21759,21761,21825,21453,20811,21146,21229,21667]
insertingData[019] = [‘2019/09/13’,21820,21988,21907,22019,21611,20889,21157,21226,21664]
insertingData[020] = [‘2019/09/17’,21878,22001,21947,22041,21747,20961,21166,21224,21663]
insertingData[021] = [‘2019/09/18’,21942,21960,22014,22027,21861,21025,21177,21222,21661]
insertingData[022] = [‘2019/09/19’,22003,22044,22064,22255,21950,21097,21190,21221,21660]
insertingData[023] = [‘2019/09/20’,22047,22079,22130,22204,22014,21169,21205,21219,21660]
insertingData[024] = [‘2019/09/24’,22077,22098,22095,22168,22036,21239,21222,21218,21659]
insertingData[025] = [‘2019/09/25’,21906,22020,21961,22036,22040,21327,21233,21216,21658]
insertingData[026] = [‘2019/09/26’,21986,22048,22160,22184,22058,21406,21246,21213,21659]
insertingData[027] = [‘2019/09/27’,21733,21878,21934,21955,22025,21476,21248,21210,21659]
insertingData[028] = [‘2019/09/30’,21666,21755,21793,21811,21960,21541,21248,21208,21660]
insertingData[029] = [‘2019/10/01’,21811,21885,21831,21938,21917,21600,21252,21211,21661]
insertingData[030] = [‘2019/10/02’,21725,21778,21744,21795,21869,21658,21254,21214,21661]
insertingData[031] = [‘2019/10/03’,21277,21341,21422,21437,21727,21694,21247,21214,21658]
insertingData[032] = [‘2019/10/04’,21276,21410,21316,21410,21634,21732,21245,21217,21656]
insertingData[033] = [‘2019/10/07’,21328,21375,21445,21475,21558,21746,21242,21220,21654]
insertingData[034] = [‘2019/10/08’,21483,21587,21494,21629,21498,21766,21243,21224,21652]
insertingData[035] = [‘2019/10/09’,21359,21456,21359,21467,21434,21773,21239,21228,21648]
insertingData[036] = [‘2019/10/10’,21308,21551,21456,21601,21476,21780,21237,21231,21644]
insertingData[037] = [‘2019/10/11’,21658,21798,21749,21820,21553,21791,21242,21236,21641]
insertingData[038] = [‘2019/10/15’,22049,22207,22063,22219,21720,21813,21254,21245,21639]
insertingData[039] = [‘2019/10/16’,22434,22472,22479,22615,21897,21837,21278,21257,21638]
insertingData[040] = [‘2019/10/17’,22424,22451,22451,22522,22096,21860,21294,21270,21638]
insertingData[041] = [‘2019/10/18’,22466,22492,22528,22649,22284,21886,21312,21284,21638]
insertingData[042] = [‘2019/10/21’,22515,22548,22541,22581,22434,21911,21327,21297,21638]
insertingData[043] = [‘2019/10/23’,22457,22625,22619,22648,22518,21939,21343,21311,21638]
insertingData[044] = [‘2019/10/24’,22704,22750,22725,22780,22573,21971,21359,21328,21638]
insertingData[045] = [‘2019/10/25’,22715,22799,22753,22819,22643,22010,21378,21347,21639]
insertingData[046] = [‘2019/10/28’,22830,22867,22854,22896,22718,22051,21399,21370,21640]
insertingData[047] = [‘2019/10/29’,22935,22974,22950,23008,22803,22106,21420,21395,21641]
insertingData[048] = [‘2019/10/30’,22827,22843,22953,22961,22847,22160,21442,21420,21642]
insertingData[049] = [‘2019/10/31’,22875,22927,22910,22988,22882,22213,21465,21441,21643]
insertingData[050] = [‘2019/11/01’,22705,22850,22730,22852,22892,22266,21495,21462,21645]
insertingData[051] = [‘2019/11/05’,23090,23251,23118,23328,22969,22362,21537,21486,21647]
insertingData[052] = [‘2019/11/06’,23246,23303,23343,23352,23035,22456,21582,21507,21649]
insertingData[053] = [‘2019/11/07’,23253,23330,23283,23336,23132,22554,21629,21529,21651]
insertingData[054] = [‘2019/11/08’,23313,23391,23550,23591,23225,22644,21676,21551,21655]
insertingData[055] = [‘2019/11/11’,23323,23331,23422,23471,23321,22738,21720,21574,21660]
insertingData[056] = [‘2019/11/12’,23312,23520,23336,23545,23375,22836,21771,21598,21664]
insertingData[057] = [‘2019/11/13’,23270,23319,23439,23452,23378,22912,21815,21620,21667]
insertingData[058] = [‘2019/11/14’,23062,23141,23325,23360,23340,22959,21861,21642,21671]
insertingData[059] = [‘2019/11/15’,23121,23303,23160,23340,23323,23001,21909,21662,21674]
insertingData[060] = [‘2019/11/18’,23271,23416,23304,23420,23340,23049,21957,21681,21678]
insertingData[061] = [‘2019/11/19’,23244,23292,23366,23389,23294,23089,22000,21701,21682]
insertingData[062] = [‘2019/11/20’,23086,23148,23176,23303,23260,23119,22042,21720,21684]
insertingData[063] = [‘2019/11/21’,22726,23038,23071,23108,23239,23140,22083,21738,21686]
insertingData[064] = [‘2019/11/22’,23030,23112,23030,23219,23201,23158,22123,21759,21688]
insertingData[065] = [‘2019/11/25’,23255,23292,23292,23347,23176,23182,22173,21778,21690]
insertingData[066] = [‘2019/11/26’,23350,23373,23451,23608,23193,23208,22222,21799,21692]
insertingData[067] = [‘2019/11/27’,23418,23437,23452,23507,23250,23231,22271,21816,21693]
insertingData[068] = [‘2019/11/28’,23367,23409,23458,23482,23325,23259,22320,21833,21695]
insertingData[069] = [‘2019/11/29’,23273,23293,23497,23498,23361,23277,22363,21849,21697]
insertingData[070] = [‘2019/12/02’,23378,23529,23388,23562,23408,23311,22412,21868,21699]
insertingData[071] = [‘2019/12/03’,23186,23379,23231,23388,23409,23318,22458,21884,21702]
insertingData[072] = [‘2019/12/04’,23044,23135,23186,23203,23349,23309,22499,21900,21704]
insertingData[073] = [‘2019/12/05’,23259,23300,23292,23363,23327,23308,22536,21917,21706]
insertingData[074] = [‘2019/12/06’,23338,23354,23347,23412,23339,23306,22572,21936,21710]
insertingData[075] = [‘2019/12/09’,23360,23430,23544,23544,23320,23311,22607,21953,21713]
insertingData[076] = [‘2019/12/10’,23336,23410,23372,23449,23326,23306,22641,21971,21716]
insertingData[077] = [‘2019/12/11’,23333,23391,23421,23438,23377,23309,22671,21989,21718]
insertingData[078] = [‘2019/12/12’,23360,23424,23449,23468,23402,23323,22698,22009,21720]
insertingData[079] = [‘2019/12/13’,23775,24023,23810,24050,23536,23359,22732,22039,21724]
insertingData[080] = [‘2019/12/16’,23950,23952,23955,24036,23640,23386,22765,22063,21725]
insertingData[081] = [‘2019/12/17’,23996,24066,24091,24091,23771,23425,22800,22090,21727]
insertingData[082] = [‘2019/12/18’,23919,23934,24023,24046,23880,23464,22831,22113,21727]
insertingData[083] = [‘2019/12/19’,23835,23864,23911,23945,23968,23505,22861,22135,21727]
insertingData[084] = [‘2019/12/20’,23746,23816,23893,23908,23926,23541,22890,22155,21727]
insertingData[085] = [‘2019/12/23’,23810,23821,23921,23923,23900,23567,22920,22177,21726]
insertingData[086] = [‘2019/12/24’,23796,23830,23839,23853,23853,23590,22950,22199,21726]
insertingData[087] = [‘2019/12/25’,23782,23782,23813,23824,23823,23607,22981,22220,21725]
insertingData[088] = [‘2019/12/26’,23775,23924,23787,23931,23835,23633,23017,22244,21724]
insertingData[089] = [‘2019/12/27’,23837,23837,23953,23967,23839,23660,23050,22267,21723]
insertingData[090] = [‘2019/12/30’,23656,23656,23770,23782,23806,23666,23081,22292,21721]
insertingData[091] = [‘2020/01/06’,23148,23204,23319,23365,23681,23658,23112,22317,21719]
insertingData[092] = [‘2020/01/07’,23299,23575,23320,23577,23639,23680,23148,22347,21718]
insertingData[093] = [‘2020/01/08’,22951,23204,23217,23303,23495,23675,23179,22374,21717]
insertingData[094] = [‘2020/01/09’,23506,23739,23530,23767,23476,23694,23215,22406,21718]
insertingData[095] = [‘2020/01/10’,23761,23850,23813,23903,23514,23715,23255,22437,21722]
insertingData[096] = [‘2020/01/14’,23951,24025,23969,24059,23679,23746,23296,22473,21727]
insertingData[097] = [‘2020/01/15’,23875,23916,23923,23997,23747,23772,23331,22505,21732]
insertingData[098] = [‘2020/01/16’,23905,23933,23960,23975,23893,23798,23360,22541,21737]
insertingData[099] = [‘2020/01/17’,24013,24041,24103,24115,23953,23798,23386,22577,21741]

//チャート描画用の配列の中に、insertingDataの値を入れ込む
for (var i = length; i > 0; i–){
chartData.addRow(insertingData[i]);
}
//チャートの見た目に関する記述、詳細は公式ドキュメントをご覧になってください
var options = {
chartArea:{left:80,top:0,right:0,bottom:0},
legend: { position: ‘none’},
backgroundColor: ‘white’,
colors: [‘black’],
hAxis: {
format: ‘yyyy/MM/dd’,
direction: -1,
viewWindowMode: ‘maximized’,
},
bar: {
groupWidth: ‘90%’
},
width: 1920,
height: 1920,
lineWidth: 2,
//チャートのタイプとして、ローソク足を指定
seriesType: “candlesticks”,
//ローソク足だでなく、線グラフも表示することを記述
series: {
1:{
type: “line”,
color: ‘red’,
},
2:{
type: “line”,
color: ‘green’,
},
3:{
type: “line”,
color: ‘blue’,
},
4:{
type: “line”,
color: ‘purple’,
},
5:{
type: “line”,
color: ‘orange’,
},
}
};
//描画の処理
var chart = new google.visualization.ComboChart(document.getElementById(‘chart’));
chart.draw(chartData, options);
}

</script>

</body>
</html>

ペイント練習用の「チャート隠し」ツール ver3

先日(昨年)作った「ペイント練習用のチャート隠しツール ver2」

ペイント練習用の「チャート隠し」ツール ver2

を使って、自分のペイント練習で使おうとしたら、
いくつか不便を感じたので、少し改良してみることにした。

・対象ファイル名を 選択できるようにしたい!
・マウス(あるいはタップ)だけで、一時停止と再開をしたい!
(タブレットPCだと、カーソルキーが使えないので。)

こういうことも、「enchant.js」や「phina.js」を使うと、簡単に実現可能である。

そして、暫定的にできあがったのが、このページ。

< ペイント練習用の、チャート隠しツール ver3 >
http://shunichi.hosono.com/chart-mask3.html

 

残念ながら、ブラウザソフト側のセキュリティの関係で、
選択したファイルの「パス名」を取得することができない。

したがって、対象となるペイント練習画像ファイルがすべて、
このツールと同じフォルダ内に存在していることが利用条件となる。

設置方法は、ver2 と同じで、
次の3ファイルを、右クリックで ダウンロード選択して、
ペイント練習画像を溜めているのと同じフォルダへ入れておき、
chart-mask3.html をブラウザで起動すればよい。

・ダウンロードするページ 3種類

< ペイント練習用の、チャート隠しツール ver3 >
http://shunichi.hosono.com/chart-mask3.html

< enchant.js >
http://shunichi.hosono.com/enchant.js

< ブランク画像 >
http://shunichi.hosono.com/mask.png

 

多少の html または javascript の知識がある人は、
テキストエディタでカスタマイズすることも可能だし、
「enchant.js」や、他の開発技術を持っている人は、
これをきっかけ&ヒントに、もっともっと高機能な
練習支援ツールを開発してくれることをぜひ期待したい。

< chart-mask3.htmlのソース > ※未完成の箇所あり

<!DOCTYPE html>
<html>
<head>
<meta charset="Shift_JIS">
<title>Chart mask ver3</title>
<style>
body { margin: 0; }
</style>
<script src="enchant.js"></script>
</head>
<body>

<input type="file" id="targetfile" size="50" accept="image/*" onchange="chartmask()"><br>
<a href="#" onclick="chartmask()">start</a>

<script>
function chartmask(){

// ファイル名を取得
var imgFileName0 = document.getElementById("targetfile").value;
var array = imgFileName0.split(/\\|\\/);
var imgFileName = array[ array.length - 1];

// ライブラリの初期化
enchant();

// 変数の定義
var startX = 150; // スライド表示を開始する左位置
var maskspeed = 1; // スライド表示する速度
var maskadd = maskspeed; //
var isTouch = true; // タッチフラグ(タッチ中のみ true にする)
var isLeft = false; // タッチフラグ(右フリックで true にする)
var isRight = false; // タッチフラグ(左フリックで true にする)
var currentX = null; // 現在のX座標
var currentY = null; // 現在のY座標
var touchX = null; // タッチX座標
var touchY = null; // タッチY座標

// 1920×1080ピクセルサイズの画面(Canvas)を作成
var game = new Game(1920, 1080);

// フレームレートの設定。30fpsに設定
game.fps = 30;

// 画像データをあらかじめ読み込ませる
game.preload( imgFileName, 'mask.png' );

// データの読み込みが完了したら処理
game.onload = function(){

// チャート画像 を設定
var chart = new Sprite(1920, 1080);
// chart.image = game.assets['screenshot.png'];
chart.image = game.assets[ imgFileName ];
game.rootScene.addChild(chart);

// マスク画像 を設定
var mask = new Sprite(1920, 1080);
mask.image = game.assets["mask.png"];
game.rootScene.addChild(mask);
mask.x = startX;

// 説明文を表示します。
var Label1 = new Label("");
Label1.text = "マウスのクリック:一時停止と再開<br>" +
"左キー:少し戻る<br>" +
"右キー:少し加速<br>" +
"上キー:最初に戻る<br>" +
"下キー:一時停止";
Label1.font = "16px monospace";
Label1.color = "red";
Label1.x = startX; // X座標
Label1.y = 100; // Y座標
game.rootScene.addChild(Label1);

// シーンに「毎フレーム実行イベント」を追加します。
game.rootScene.addEventListener(Event.ENTER_FRAME, function(e) {
if( isTouch == true ) {
mask.x += maskadd;
}
});

// タッチイベントを登録
this.rootScene.addEventListener("touchstart", function(e) {
// タッチ開始
if( isTouch == true ) {
isTouch = false;
} else if( isTouch == false ) {
isTouch = true;
}

// 現在のマウス位置の取得
currentX = e.localX;
currentY = e.localY;

});

// フリック操作を監視
this.rootScene.addEventListener("touchmove", function(e) {
// 移動後のマウス位置の取得
touchX = e.localX;
touchY = e.localY;

if( touchX < currentX ) {
// 左フリック
isLeft = true;
} else if( touchX > currentX ) {
// 右フリック
isRight = true;
}

});

// フリック操作の判定
this.addEventListener("touchend", function(e) {
// タッチ位置をセット

if( isLeft == true ) {
// 左フリック
this.x -= (maskspeed + 1);
} else if( isRight == true ) {
// 右フリック
this.x += maskspeed;
}

});

// キー操作時に処理
mask.addEventListener('enterframe', function(){
if (game.input.left) this.x -= (maskspeed + 1);
if (game.input.right) this.x += maskspeed;
if (game.input.up) this.x = startX;
if (game.input.down) isTouch = false;
});

}

// 処理開始
game.start();

}
</script>

</body>
</html>

ペイント練習用の「チャート隠し」ツール ver2

先月作った「ペイント練習用のチャート隠しツール」と、
http://shunichi.hosono.com/?p=369

と、「チャートの自動めくり動画」を公開したところ、
http://shunichi.hosono.com/?p=443

数名の方から、ご意見・ご要望をいただいた。

・Chromeブラウザで利用できるようにしてほしい!
・いちいちキーを押さなくても自動でめくってほしい!
・自動再生を途中で一時停止したい!
・自動再生を、少し戻したい!

等々。

それほど難しい要望ではないけれども、
Windowsの「メモ帳」でカスタマイズできるくらいの
簡単なツールで実現しようとすると、それなりに難しい。

自動再生されているものを、一時停止したり戻したりするには、
アニメーションの停止やフレーム操作をすればいいかな? と思って
animation-play-state等、いくつかの方法を調べて試してみたが、
実際には、動かない。(transition で動かしたアニメは対象外?)

そこで思いついたのは、

ゲームを作るツールを使えば、てっとり早く実現するのでは?

ということだった。

実際、その通りで、以前に学んだ「enchant.js」を使えば
今回のようなものは、簡単に作ることができた。

「phina.js」等のような、さらに高速・高機能な
同種のツールが登場してきているようだけど、
「enchant.js」の書籍がたまたま手元にあって、
思い出したらすぐに使えるようになったので、
とりあえず、これを使うことにした。

ということで、暫定的にできあがったのが、このページ。

< ペイント練習用の、チャート隠しツール ver2 >
http://shunichi.hosono.com/chart-mask2.html

今度は、Chromeブラウザでも使えて、
自動再生 も 一時停止 も 少し戻り も可能である。

操作方法は、次のとおり。

白い部分をクリック:再生開始。
左キー:少し戻る
右キー:少し早く
上キー:最初に戻る
下キー:一時停止

このツールは、「メモ帳」で編集可能な 普通の html ファイルなので、
ソースをコピーするか、右クリックでファイルに保存すれば
カスタマイズして、使用可能である。

次の3ファイルをダウンロードして、
同じフォルダへ保存しておく必要がある。

・ダウンロードするページ 3種類

< ペイント練習用の、チャート隠しツール ver2 >
http://shunichi.hosono.com/chart-mask2.html

< enchant.js >
http://shunichi.hosono.com/enchant.js

< ブランク画像 >
http://shunichi.hosono.com/mask.png

対象の 画像ファイル(ペイント対象のチャート画面)は、
「screenshot.png」が初期値だが、
変更する場合は、「メモ帳」等で編集可能。

当然のことながら、カスタマイズするには、
多少の html または javascript の知識が必要となる。

< chart-mask2.htmlのソース >

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Chart mask ver2</title>
<style>
body { margin: 0; }
</style>
<script src="enchant.js"></script>
</head>
<body>

<script>
// ライブラリの初期化
enchant();
window.onload = function(){

// 変数の定義
var startx = 150
var maskadd = 2;

// 1920×1080ピクセルサイズの画面(Canvas)を作成
var game = new Game(1920, 1080);

// フレームレートの設定。
game.fps = 16;

// 画像データをあらかじめ読み込ませる
game.preload('screenshot.png',
'mask.png' );

// データの読み込みが完了したら処理
game.onload = function(){

// チャート画像 を設定
var chart = new Sprite(1920, 1080);
chart.image = game.assets["screenshot.png"];
game.rootScene.addChild(chart);

// マスク画像 を設定
var mask = new Sprite(1920, 1080);
mask.image = game.assets["mask.png"];
game.rootScene.addChild(mask);
mask.x = startx;

// キー操作時に呼ばれる
mask.addEventListener('enterframe', function(){
if (game.input.left) this.x -= (maskadd + 1);
if (game.input.right) this.x += maskadd;
if (game.input.up) this.x = startx;
if (game.input.down) this.x -= maskadd;
});

// タッチ開始時に呼ばれる
mask.addEventListener(Event.TOUCH_START, function(){

// シーンに「毎フレーム実行イベント」を追加します。
game.rootScene.addEventListener(Event.ENTER_FRAME, function() {
mask.x += maskadd;
});

});
}

// 処理開始
game.start();
}
</script>

</body>
</html>

ペイント練習用のハードコピー画像を、左から徐々に表示するツール

相場師朗先生の「株塾」で学んだ、
チャートギャラリーの画面ハードコピーに
コメントを書き込んでいく練習を行う際に、

同じ画面を、「動くチャート」で見てみると、
全く違った白熱感で、流れを見る ことができる。

移動平均線が横這ったり、クロスしたり、集中した後に、
ローソク足のトレンドがどのように変化するのか? は、
動きを見ながら練習すると、新たな発見がある。

これは、例えば、
白熱した会議が終わった後の ホワイトボードを見た時と同じで、
会議に参加して、それが書かれた経過を見ていたのと、
会議に参加せずに、書かれた結果だけを見たのでは、
伝わる質・量に違いがあるのと、同じことだと思う。

移動平均線が一斉に上昇して、PPP(パンパカパン)になる様子は、
動くチャートで見ると、その迫力が、より伝わってくる。
勢いのある PPP(パンパカパン)で空売りを入れるのは恐い!
というのが、実感として体験しやすいと思う。

で、その「動くチャート」の実現法だけど、
チャートギャラリーを自動でめくる方法もいいけれども、
今まさにペイント練習を行おうとしている、
その画像を、直接動かした方が、臨場感がある。

右端が見えない状態で右から左へスライドさせる、
という方法もあるけど、今回のターゲットはあくまでも
ペイント練習の 予習 と 復習」なので、
それと同じように、左から右へ徐々に見えていくのがよいと思う。

準備作業

  • PCのデスクトップ画面に「ペイント練習」というフォルダを作成する

  • ツール(paint-slideview.html)をダウンロードし、「ペイント練習」フォルダへ保存する。

paint-slideview.html
>> 右クリックで「ファイル名を指定して保存」を選択

都度の作業

  • ペイント対象のハードコピー画像を「screenshot.png」という名前で「ペイント練習」フォルダへ保存する。
  • paint-slideview.html をダブルクリックして、起動。

  

カスタマイズ方法( htmlの知識が、多少必要です )

  • paint-slideview.html を、「メモ帳」等で開き、表示スピードとファイル名を変更できます。

ペイント練習用の「チャート隠し」ツール (カーソルキー版)、もどうぞ。
http://shunichi.hosono.com/?p=369

日経平均株価のチャートを1秒ずつ自動的にめくっていく動画を作成

日経平均株価のチャートを1秒ずつ自動的にめくりながら、
目で確認できる動画を作ってみた。

既製品でも、このような機能を持つチャートソフトはあるけれど、
私の場合、現在 学んでいる 相場師朗先生の株塾 で使用している
相場(あいば)式の移動平均線 を使って実現してみたかったので、
自分で作ってみることにした。

「チャートギャラリー」ソフトの画面ハードコピー画像を
1つのフォルダに 時系列に名付けて、それを
Windows標準の「フォト」で動画を作成するだけだ。

エクスプローラから、ファイルを一括選択した状態で
右クリックして、「新しいビデオの作成」を選択すると、
Windows標準の「フォト」のビデオ作成画面が起動する。

こんな動画を何に使うのかというと、
トレード練習のトレーニング用 である。

ビデオは、1秒ごとにローソク足1本ずつめくっていくので、
そのまま眺めるか、あるいは早い速度で再生して眺めれば、

ローソク足 と 移動平均線(aiba式)の動き を目に焼き付ける

というトレーニングができる。

先の展開を予測しながら真剣に眺めるトレーニングを
何十回も繰り返して見れば、値動きのカンを養うのに役立つと思う。
月足だと、約22年分を約4分半、
週足だと、約30年分を約26分
で、見ることができるので、通勤電車で立っていても、気軽に見ることができる。

動画を見ながら、頭の中で「ペイント練習」や「チャートの感動リーディング」を行う。

そして、慣れてきたら、日足を使って、
再生速度を遅くしてみて、1本ずつ、建玉を記入していけば、
瞬発力を養うのに役立つトレーニングになると思う。

次の1手のトレード判断(エントリー、追加、手仕舞い)を
たった1秒で判断を下す特訓は、デイトレードでは必要になる。

 

日経平均株価(月足)チャートの自動再生 1997年1月~2019年11月

日経平均株価(週足)チャートの自動再生 1990年5月11日~2019年11月29日

日経平均株価(日足)チャートの自動再生 1988年9月20日~1999年12月30日

日経平均株価(日足)チャートの自動再生 2000年1月4日~2009年12月30日

日経平均株価(日足)チャートの自動再生 2010年1月4日~2019年12月6日

チャートギャラリーで、1日1画面ずつのハードコピー画像を、自動で一括保存する方法

パンローリング社の「チャートギャラリー」は、
過去の場面に戻って、先の展開(右側)が見えない状態で、
1日ずつめくりながら、トレード練習を行うことができる。

でも、そこで、画面に書き込みを行うことができたら最高だ。
先生のコメントと、自分のコメントを切り替えて、反省に役立てたり、
別のトレーディング日誌 や ブログへ貼り付けて二次加工したり、
いろいろとやりたいことがでてくる。

別のチャートソフトを使うか、作るのもいいけれども、
トレード練習は、自分が実際に本番で使うチャートを使いたいので、
やっぱり「チャートギャラリー」で、できた方が理想だ。

それならば、全部、画像ファイルに吐き出してしまえば、すべて解決する。
日足で、過去30年分だと 7,000~8,000日分になる。

これをいちいち、手作業で、1日ずつめくりながら
ハードコピーを取らなければならないと想像してしまう人には、
「それは無理だぁ」という考えになるかもしれない。
1枚あたり3秒かかるとしても、21,000秒~24,000秒、つまり6~7時間かかる。
これを根性でやり遂げた人がいたら、もちろん、称賛に値する 。

でも私の場合は、「ユースウェア」という技術があるので、
チャートギャラリーを1日ずつめくって7,000~8,000枚の画像を保存するのは、
「そんなの簡単だ」と、すぐに考えることができる。
私は根性はないので、手作業でやれと命令されたら「無理でぇ~す」になるけど、
自分なりのやり方でやってよければ、実現できる方法を探して、さっさと実現する。

そこで本題だけど、
チャートギャラリーを1日ずつめくって、1枚ずつハードコピー画像を保存するには、
「自動化」するソフト(ツール)を使えばよい。
今、はやりの言葉「RPA (obotic Process Automation)」も、ほぼ同じだ。

手作業でいちいち手間をかけて行っている作業は、
それを自動化することができれば、
その作業にかける時間を、
ほかのもっと重要なことに充てることができる。

たとえば、チャートギャラリーのハードコピー画面を、
大量に1枚ずつ保存しているのだったら、それを
トレード練習の時間に充てることができれば、その方がいい。

私はそんな思いで、今朝、とりあえず、
日経225先物 の 1990年から2017年までの画像を出力してみた。

 

使った道具は、uwsc という自動化ツールで、
次のようなスクリプトファイルを用意する。

// チャートギャラリーのウィンドウを選択
GETID("Chart Gallery")

// 真ん中付近で左クリック
BTN(LEFT,DOWN,533,23,0)

// [HOME] ボタンをクリック
KBD(VK_HOME , CLICK)

// 指定回数分繰り返し(数字は要調整)
FOR I = 1 TO 8000

// チャートギャラリーのウィンドウを選択
GETID("Chart Gallery")

// 右カーソルキーを押下
KBD(VK_RIGHT , CLICK)

// 0.5秒待つ
SLEEP(0.5)

// [Windowsキー]を押しながら[PrintScreen]キーを押下
KBD(VK_START , DOWN)
KBD(VK_SNAPSHOT , CLICK)
KBD(VK_START , UP)

// 0.5秒待つ
SLEEP(0.5)

NEXT

チャートギャラリーの画面を開いた状態で、これを実行すれば、
「右カーソルキーで1日めくって、ハードコピーを出力する」
という作業を、8,000回数分、繰り替えし自動実行してくれる。

すると、ピクチャ - スクリーンショット というフォルダに、
大量の画像が溜まってくるので、

これを一括で名前変更(rename)をするバッチファイルを作成して実行すれば、できあがり。

画像が溜まった後の、バッチファイルでの手順は、次のとおり。

 

(1)まず、チャートギャラリーで、チャートの数値データを、ファイル名をつけて(例 nik225f_D.txt)、テキスト出力しておく。
チャート画面で、 「表示」メニュー から 「表形式」を選択して、数値データの表示画面へ切り替える。

チャートギャラリーでデータ表示

チャートギャラリーでテキスト出力

 

(2)同じフォルダ内に、ファイル一覧をテキスト出力するためのバッチファイル「dir.bat」を作成し、実行する。

ファイル一覧を出力するためのバッチファイル

(3)自動出力された「ren.bat」を開き、一括リネーム処理を行うためのバッチファイルへと加工し、実行する。
縦方向のブロックコピー&貼り付け 等のテクニックも使うことになるので、
高機能なエディタソフト(秀丸エディタ 等)を使いこなしていないと、やや難易度が高いかもしれない。

一括リネーム用バッチファイル
加工前
一括リネーム用バッチファイル
加工後

 

以上のような操作は、大昔(MS-DOSの時代)からPCを使ってきた人が持っているスキルなので、新たに学ぶ機会は多くない。

最近の Windows PC でも、 昔のコマンドが発展しながら存続しているし、
PowerShell 等も使えるので、さらにいろいろな自動化ができるようになっているけど、
一部のシステム管理者を除いて、あまり利用する人はいない。

こういう、自動化の技があることを知っていると、ちょっと調べるだけで、
「やりたいこと」 が 「できること」 に変えることができるので、
自由度が高まって、時間をもっと有意義に使うことができるようになる。

「くりっく株365」の四本値をCSV形式で整形する方法

「くりっく株365」の四本値は、
無料でダウンロードすることは可能だけれども、
システムトレード用に、表形式にするには、
少しだけ加工する必要がある。

日経平均株価や現物株と違って、
「くりっく株365」はマイナーなので、
きれいな時系列の四本値データの入手は難しい。

そこで、EXCELを使ったデータ加工をしてみたので、
その方法を、紹介しておきたいと思う。
私は一応、「ユースウェア技師」という、幻の資格(?)
というか技能を持っているので、こういうのは得意である。

(1)価格データをCSV形式でダウンロードする

東京金融取引所の「くりっく株365:ヒストリカルデータベース」
https://www.tfx.co.jp/historical/cfd/
のページから、1年ずつ期間指定して、CSV形式でダウンロードする。

 

クリック株365のダウンドード画面

 

ファイル名を指定して、保存する。

クリック株365のCSVファイルの保存

以上の操作を、年数分、繰り返す。

 

(2)年単位にダウンロードしたファイルを、1つのCSVファイルにまとめる

ダウンロードしたファイルを、作業用ファイルにすべて移動させる。
この例では、 D:¥kabu365 というフォルダを作っている。

 

年単位に分かれたファイルを、1つの CSVファイルにまとめる。
メモ帳などのエディタを使って、1ファイルずつコピー&ペーストして作っても構わないけど、
面倒くさがり屋の人は、次のようなバッチファイルを作って、一発でやってしまう方が、楽になる。

 

合体されたファイル「cfd_result.csv」ファイルが出来上がる。

合体ファイル

(3)合体済みのCSVファイルをEXCELで開く

合体されたファイル「cfd_result.csv」をEXCELで開き、余分な箇所を削除する。
まず先に、主要な 四本値部分 を選択して、並び替えを行う。

合体済ファイルのEXCEL表示

 

次に、左の2列を削除する。

 

シートの一番下の方に、タイトル行他があるので、
タイトル行を1行だけ残して、それより下の行をすべて削除する。

 

タイトル行を選択して、切り取り、
先頭行に移動して、挿入する。

最後に、取引日で、並び替えを行う。

 

これで、クリック株365の四本値データが完成したので、
必要に応じてさらに加工し、CSV形式で保存すれば、できあがり。

 

ちなみに、この四本値を パンローリング社のチャートギャラリーで利用する場合は、
チャートギャラリー側であらかじめ、銘柄を新規登録(例えば 0365 「株365」)して、
指定のテキストファイルで取り込めばよい。

昨日分(2019/11/27)までのデータは、次のとおり。
これをチャートギャラリーで取り込めば、表示できると思う。

↓↓↓↓↓
株365のチャートギャラリー取込み用テキストデータ(kabu365_20101122-20191128.txt)

 

詳しい解説は、こちらへ。

https://www.hosono.org/2019/11/chartgallery-kabu365.html?m=1

日経平均株価の週足チャートと移動平均線 約17年間分(2003年~2019年)

日経平均株価の約17年間分(2003年~2019年)の動きを
週足チャートと移動平均線で俯瞰して見てみると、
現在(2019年11月)は、ちょうど、
上昇トレンド継続か?、それとも三番天井を打つか?
の転換点になっていることが分かる。

今までは、このような長期の俯瞰チャートを
ポイント・アンド・フィギュア または ローソク足だけ で
見ていたけれども、これに移動平均線を加えてみると、
今まで見えなかったものが、よく見えてくる。

前回高値(24,000円台)に到達して、上抜けたとしても、
その直後に すぐに下げてしまうようならば、
移動平均線の順番が入れ替わらないので、
失速してしまうリスクがある。

25,000円を上抜くほど、大きく上昇するか、あるいは、
24,000台で もみ合いながらも高値圏を維持できれば、
上昇時の「移動平均線パターン」になってくる。

上昇する時や、下落する時は、いつでも、
「移動平均線パターン」は、必ず 同じ経過を辿る。

だから、移動平均線は、
物理の諸法則と同じくらい、重要な意味を持つ。

ペイント練習用の「チャート隠し」ツール (カーソルキー版)

相場師朗先生の「株塾」で学んだ練習法の一つに、
チャート画面のハードコピー画像に、
売り買いのポイントや考察を書きこんで、
相場の流れをつかむ、という方法がある。

これを、野球やテニスなどの「素振り」練習のごとく、
毎日たくさん、習慣的にやることが推奨されている。

最初は、値動きの結果が見えている状態で、
つまり、カンニングしている状態で書き込んでいく。

ところがこのペイント練習は、
数をやっていくと、だんだんとマンネリ化して、
単純作業のように、手を抜いて行うようになりがちで、
これで脱落してしまう人も多い と想定される。

なので、ある程度分かってきたら、こんどは、
カンニングしなかった と仮定した想定で、
右の部分を一時的に隠して、本気で悩んで考えながら
こじつけて練習する、という練習を併用しながら、

だんだんとステップアップして実力をつけていくのが、
堅実なやりかただと思う。

ということで、
右の部分を一時的に隠して練習するのに、
私は、ちょっとしたツールを自作して使っている。

チャートギャラリーで建玉練習をする時のように、
キーボードの [右] カーソルキー で進めていきたい、
という こだわりがあるから、である。

ペイント練習用の「チャート隠し」ツール
ペイント練習用の「チャート隠し」ツール

以下のリンクをクリックすると、
ブラウザで1ページ開かれるので、
ペイント画面より前にこれを出して、
[右] カーソルキー でめくっていけばよい。

< ペイント練習用の、チャート隠しツール >
http://shunichi.hosono.com/chart-mask.html

このページは、普通の html ファイルなので、
ソースをコピーするか、ファイルに保存すれば
そのまま複製して、PCのハードディスクからでも起動できるし、
自分のPC環境に合わせて、内容を書き換えてもよい。

html の中に、以下の部分を貼り付ければ、動くと思う。
(Internet Explore か Edge で確認済み)

<script type="text/javascript">
<!--

window.focus();

Xsize = screen.width - 200
Ysize = screen.height

window.resizeTo( Xsize, Ysize ); // (左右 , 上下)
window.moveTo( 200, 0 ); // (左右 , 上下)

addEventListener("keydown", keydownfunc, false);

function keydownfunc( event ) {
var key_code = event.keyCode;

if( key_code === 37){ // 左に移動
window.moveBy( -5, 0); // (左右 , 上下)
window.resizeBy(+5, 0); // (左右 , 上下)
}
else if( key_code === 39){ // 右に移動
window.moveBy( 5, 0); // (左右 , 上下)
window.resizeBy(-5, 0); // (左右 , 上下)
}
}
// -->
</script>

チャートギャラリーの株価データを EXCELからピンポイントで参照する方法

パンローリング社の「チャートギャラリー」 というソフトは、
全銘柄の株価を過去30年分持っていて、そのデータを、
ActiveXコントロール で、VB や EXCEL等で利用することができる。

ところが、この機能については、
ソフトのヘルプ画面には記載されているが、
それ以外の情報があまりなく、
活用している人は多くないと思う。

パンローリング社のサイトで、
無料のサンプルプログラムが、
https://www.panrolling.com/etc/users/sakurai/
のサイトで公開されているけど、

株価を一括で読み出す方法は参考になるけれども、
ピンポイントで、たとえば

・「9101 日本郵船」の 「2019年7月17日」の「終値」を参照したい

というような場面で、どう使えばよいのか、分かりづらい。

メタトレーダー等、他のソフトとは違って、
「チャートギャラリー」は、プログラミングの専門家でなくても

EXCELから気軽に株価データをピンポイントで参照することができる

というのが特長であってほしい と思う。

先週、私がちょっと作ってみたので、
ノウハウを共有しておこうと思う。

「EXCELの関数」を作っておけば気軽に使える、

ので、独自関数として定義しておけばよい、ということになる。

次のような準備の後に、

・EXCELの「開発」タブの「Visual Basic」を選択

Visual Basic 設定

 

・マクロのセキュリティを押して、セキュリティセンターを表示

マクロのセキュリティ

 

・ActiveX の設定を確認

ActiveXの設定

 

・マクロの設定を確認

マクロの設定

 

・VBAの開発画面で、標準モジュールに追加して、プログラムを描き込む。

 

その後に、以下の関数を貼り付ければよい。
急いで作ったので、本格的に使うには、アレンジは必要かと思う。

関数の一覧

機能 関数名 引数 記述例
当日の始値を求める yori (銘柄コード, 取引日) =yori(1001, DATEVALUE(“2019/7/16”))
当日の高値を求める taka (銘柄コード, 取引日) =taka(1001, DATEVALUE(“2019/7/16”))
当日の安値を求める yasu (銘柄コード, 取引日) =yasu(1001, DATEVALUE(“2019/7/16”))
当日の終値を求める hike (銘柄コード, 取引日) =hike(1001, DATEVALUE(“2019/7/16”))
翌営業日の始値を求める yokuyori (銘柄コード, 取引日) =yokuyori(1001, DATEVALUE(“2019/7/16”))
翌営業日の終値を求める yokuhike (銘柄コード, 取引日) =yokuhike(1001, DATEVALUE(“2019/7/16”))
N営業日後を求める kdate (銘柄コード, 取引日, 加算日数N ) =kdate(1001, DATEVALUE(“2019/7/16”), 1)
銘柄名を求める kname (銘柄コード) =kname(1001)

 


'当日始値
Public Function yori(kcode As String, kdate As Date) As Long

    Dim Calendar As New ActiveMarket.Calendar
    Dim Prices As New ActiveMarket.Prices
    Dim DatePos As Long
    
    DatePos = Calendar.DatePosition(kdate, 1)
    
    Prices.AdjustExRights = True
    Prices.Read kcode
       
    '翌日が休場日ならば、
    If Prices.IsClosed(DatePos) Then
       DatePos = DatePos + 1
       
       '2日後が休場日ならば、
       If Prices.IsClosed(DatePos) Then
          DatePos = DatePos + 1
                
          '3日後が休場日ならば、
          If Prices.IsClosed(DatePos) Then
             DatePos = DatePos + 1
          
          End If
       End If
    End If
    
    yori = Prices.Open(DatePos)

End Function

'当日高値
Public Function taka(kcode As String, kdate As Date) As Long

    Dim Calendar As New ActiveMarket.Calendar
    Dim Prices As New ActiveMarket.Prices
    Dim DatePos As Long
    
    DatePos = Calendar.DatePosition(kdate, 1)
    
    Prices.AdjustExRights = True
    Prices.Read kcode
       
    '翌日が休場日ならば、
    If Prices.IsClosed(DatePos) Then
       DatePos = DatePos + 1
       
       '2日後が休場日ならば、
       If Prices.IsClosed(DatePos) Then
          DatePos = DatePos + 1
                
          '3日後が休場日ならば、
          If Prices.IsClosed(DatePos) Then
             DatePos = DatePos + 1
          
          End If
       End If
    End If
    
    taka = Prices.High(DatePos)

End Function

'当日安値
Public Function yasu(kcode As String, kdate As Date) As Long

    Dim Calendar As New ActiveMarket.Calendar
    Dim Prices As New ActiveMarket.Prices
    Dim DatePos As Long
    
    DatePos = Calendar.DatePosition(kdate, 1)
    
    Prices.AdjustExRights = True
    Prices.Read kcode
       
    '翌日が休場日ならば、
    If Prices.IsClosed(DatePos) Then
       DatePos = DatePos + 1
       
       '2日後が休場日ならば、
       If Prices.IsClosed(DatePos) Then
          DatePos = DatePos + 1
                
          '3日後が休場日ならば、
          If Prices.IsClosed(DatePos) Then
             DatePos = DatePos + 1
          
          End If
       End If
    End If
    
    yasu = Prices.Low(DatePos)

End Function

'当日終値
Public Function hike(kcode As String, kdate As Date) As Long

    Dim Calendar As New ActiveMarket.Calendar
    Dim Prices As New ActiveMarket.Prices
    Dim DatePos As Long
    
    DatePos = Calendar.DatePosition(kdate, 1)
    
    Prices.AdjustExRights = True
    Prices.Read kcode
       
    '翌日が休場日ならば、
    If Prices.IsClosed(DatePos) Then
       DatePos = DatePos + 1
       
       '2日後が休場日ならば、
       If Prices.IsClosed(DatePos) Then
          DatePos = DatePos + 1
                
          '3日後が休場日ならば、
          If Prices.IsClosed(DatePos) Then
             DatePos = DatePos + 1
          
          End If
       End If
    End If
    
    hike = Prices.Close(DatePos)

End Function

'翌営業日の始値
Public Function yokuyori(kcode As String, kdate As Date) As Long

    Dim Calendar As New ActiveMarket.Calendar
    Dim Prices As New ActiveMarket.Prices
    Dim DatePos As Long
    
    DatePos = Calendar.DatePosition(kdate, 1) + 1
    
    Prices.AdjustExRights = True
    Prices.Read kcode
       
    '翌日が休場日ならば、
    If Prices.IsClosed(DatePos) Then
       DatePos = DatePos + 1
       
       '2日後が休場日ならば、
       If Prices.IsClosed(DatePos) Then
          DatePos = DatePos + 1
                
          '3日後が休場日ならば、
          If Prices.IsClosed(DatePos) Then
             DatePos = DatePos + 1
          
          End If
       End If
    End If
    
    yokuyori = Prices.Open(DatePos)

End Function

'翌営業日の終値
Public Function yokuhike(kcode As String, kdate As Date) As Long

    Dim Calendar As New ActiveMarket.Calendar
    Dim Prices As New ActiveMarket.Prices
    Dim DatePos As Long
    
    DatePos = Calendar.DatePosition(kdate, 1) + 1
    
    Prices.AdjustExRights = True
    Prices.Read kcode
       
    '翌日が休場日ならば、
    If Prices.IsClosed(DatePos) Then
       DatePos = DatePos + 1
       
       '2日後が休場日ならば、
       If Prices.IsClosed(DatePos) Then
          DatePos = DatePos + 1
                
          '3日後が休場日ならば、
          If Prices.IsClosed(DatePos) Then
             DatePos = DatePos + 1
          
          End If
       End If
    End If
    
    yokuhike = Prices.Close(DatePos)

End Function

'取引日
Public Function kdate(kcode As String, startdate As Date, addcount As Integer) As Long

    Dim Calendar As New ActiveMarket.Calendar
    Dim Prices As New ActiveMarket.Prices
    Dim DatePos As Long
    
    DatePos = Calendar.DatePosition(startdate, 1) + addcount
    
    Prices.AdjustExRights = True
    Prices.Read kcode
    
    '翌日が休場日ならば、
    If Prices.IsClosed(DatePos) Then
       DatePos = DatePos + 1
       
       '2日後が休場日ならば、
       If Prices.IsClosed(DatePos) Then
          DatePos = DatePos + 1
                
          '3日後が休場日ならば、
          If Prices.IsClosed(DatePos) Then
             DatePos = DatePos + 1
          
          End If
       End If
    End If
    
    kdate = Calendar.Date(DatePos)

End Function

'銘柄名
Public Function kname(kcode As String) As String

    Dim Names As New ActiveMarket.Names
    Dim C() As String, N() As String
    
    Names.AllNames AM_KINDFLAG_SPOTS, C, N
    
    mpos = Application.Match(kcode, C, False)
    
    If IsError(mpos) Then
       kname = mpos
    Else
       kname = N(mpos)
    End If
    
End Function

 

フォートラン プログラム用紙

家の中を整理していたら、
こんなものが発掘された。
「フォートラン プログラム用紙」

私は、これを使ったことはないけど、
その昔、コンピューターのプログラムは、
このような用紙に手書きで記入してから
入力専任者が入力する、というものだったらしい。

なぜそんな無駄なことを?? と思ったら、
昔は、今のようなエディタ等がないので、
入力した文字を都度訂正することができないので、
事前に完璧に清書しておく必要があったから? なのだろうか。

ワープロでさえも、最初の頃は、
事前に手書きで清書したものを入力する機械
として使われていたそうだ。

今はさすがにそんなことをしなくなったかもしれないけど、
事前に「人間が仕上げた 結果 」を入力して処理させる、
という発想は、あまり変わっていないのかもしれない。

便利になることと、効率的になることは、必ずしも一致しないのだろう。

細野俊一のトレーディング日記 再開

約16年前に、日経平均先物取引に初チャレンジした時の
「細野俊一のトレーディング日記」というホームページが、
自分のPCの中から発掘された。

その後、FXや株365等にチャレンジするも、
試行錯誤ばかりやっていて、利益が伴わなかったが、

今年になって相場師朗さんの書籍を見つけて、
「株塾」に入塾することになったのをきっかけに
利益を出す努力をしてみようと思い立った。

「株塾」3ヶ月目の節目なので、
トレーニングの過程を記録に残して、
自分の励みにしようと考えて、
次のブログを開始することにした。

「細野俊一のトレーディング日記」
https://usemanage.blogspot.com/

トレーディング関連の話は適時、
この新しいブログの方に更新していこうと思う。

ポイントアンドフィギュアによる、日経平均株価の値動き動画

日経平均株価の値動きを、一般的なチャートではなく、
ポイントアンドフィギュアという形のチャートで見ると、
「上下に」どのように動いてきたか? がよく見えてくる。

特に、レンジ相場から、支持線または抵抗線を突き破って
上下にブレイクアウトした時の、
値動きが跳んでいく様子が、よく見えてくる。

ポイントアンドフィギュアは、
時間の流れが一定速度ではないので、
途中経過が分かりづらい。

途中経過の歩みを見えるように改良したのが、
細野式ポイントアンドフィギュア である。

https://www.usemanage.jp/pfmonitor.asp

「ポイント&フィギュア」の基本に戻る

私はなぜ、「ポイント&フィギュア」にこだわるのか?

平成最期の日の今日、その答えが、とうとう分かった。
なぜ、こんな単純なことに気づかなかったのだろう。
今まで、遠回りしすぎていて、本質をすっかり見失っていた。

「ポイント&フィギュア」に独自の改良を加えて、
その欠点を補おうと、いろいろ工夫してみたが、
そんな必要も なかったかもしれない。

「ポイント&フィギュア」の極意は、
「価格の動きだけをシンプルに見せること」
なので、その基本に帰ったら、見るべきものが見えてきた。

「ポイント&フィギュア」だからこそ実現できる売買手法が、すごいのだった。

令和元年、「細野式トレーディング」が本格始動します。

https://www.usemanage.jp/pandf/

 

3DプリンタのSDカード内のファイル数は少なくしておこう

3Dプリンタ「ANYCUBIC I3 MEGA」を使っていたけど、ここ最近、

「印刷開始直後に、すぐに終了して、何も動かない」
「印刷途中なのに、終了してしまう」

という、おかしな事象が起きるようになった。

機械の調子が悪いわけでもなく、ファイルの中身も問題なさそうだし、
この事象が発生するファイルと発生しないファイルがあって、
一体何が原因なのか分からないので、気持ちが悪かった。

いろいろ調べてみたら、SDカードからプリントする場合、
ファイル数が増えてきたり、
日本語のファイル名が存在すると調子が悪くなる、
という事象があるらしい。

いつも使っているSDカードを調べてみたら、
日本語名のフォルダが1つあって、
ファイルが60個以上あった。

これらのファイルを、下のフォルダへ移動させたら、
おかしな事象はすべて解決した。

「SDカード内のファイル数」が原因だったというのは意外だったけど、
安価な3Dプリンタでは、まだまだ このレベルのトラブルは
覚悟しておく必要がありそうだ。

Y!mobileは取り止めて、楽天モバイルの「スーパーホーダイ」へ、のりかえた。

先週、2台のスマホのうち、1台を MINEO にのりかえて、これは成功だった。
けど もう1台の ワイモバイルへの のりかえは、失敗した。

MNPを複数かけていたのが悪かったのかどうか分からないが、
ワイモバイルから、審査結果がきて、
「ご契約を見合わせて頂くことになりました。」

そこで急遽、別のサービスをさがしてみたところ、
「楽天ダイヤモンド会員向け特典」というのが目に止まって、
楽天モバイル(R-Mobile)の「スーパーホーダイ」が
かなり良さそうなので、それに決めた。

これは、一番安いプランで、
規定の通信容量2Gを超えた場合に、
スピードが1Mbps (混雑時は 300kbps)までしか落ちない
というもので、私の場合は、これで十分だった。

スピードが 128kbps とか 200kbps まで落ちてしまうと
明らかに、使い勝手が 大幅に落ちるけど、
300kbps だと、かなり違うことが分かっている。
(以前使っていた POINTY が 300kbpsだった)

格安SIM は、安いけど遅い のを覚悟して使うものなので、
規定の通信容量を使い切った後の速度を
とっても重要視した方がよいと思う。

アプリ更新、ダウンロード等 を「手動」にして
動画閲覧等も 必ず Wifi環境で行うようにすれば、
通信容量は それほど消費しないと思う。

MINEO と Y!mobile へ、のりかえた。

今月は、格安SIMへの変更を2台分やった。

au解約済の iPhone6S と
au契約中の iPhoneX である。

iPhone6Sの方は、SIMロック解除をしていなくて、
auを解約してから100日を超えると、
もう SIMロック解除は できないとのこと。

auのSIMロック状態のまま使えるのは
「MINEO」(VoLTE非対応版)だけらしいので、
それしか選択肢がなかった。

さて、iPhoneX の方は、
昨年、4年縛りで機種変更してしまったので、
2年目には絶対に解約しようと決めていたが、

1年経つと、各種キャンペーンの割引が終了して
月額料金が高くなることに気づいたので、
1年経たないのに、すぐに解約することにした。

残金は残り3年で払い続けるけど、
違約金とかを考慮しても、
前倒しで解約した方が、結局安くなる。

iPhoneXは My au のWEB画面から
SIMロック解除ができたので、
のりかえ先は、ワイモバイルにした。

ワイモバイルのオンラインショップで、
「Android One S1」が 100円のタイムセールで付いていて、
家族割りで 500円引きで、
「Yahooプレミアム」(月額約500円相当)が含まれていて、
ソフトバンクの WiFi スポットも使えて、
回線の品質も良さそうなので、これにした。

使えるエリアは auに比べれば狭くなるかもしれないけど、
どうせ docomoも一緒に持ち歩いているので、
あまり気にしなくてもいいだろう。

格安SIMに買えても、1年縛りとか2年縛りとか、
期間限定の割引(333キャンペーン、ワンキュッパ割 等)
が付いてきたので、またその頃に再検討しようと思う。

3大キャリア(ドコモ、au、ソフトバンク)と
MVNO(格安SIM提供会社)のどちらを選ぶか?について、
私の基準は、

・新発売のiPhoneに機種変更する時は 3大キャリア が有利
・手持ちの機器を使用する場合は、格安SIM が有利

だったけど、
その垣根がなくなりつつある。

やがては、個人ユーザーは全てMVNOを使うようになって、
3大キャリアは 法人向け(卸売)または セレブ向けの
上級ブランドに格上げされるのでは? と予測したい。

現時点では、高額なスマホ代を払い続けるのは、もったいないと思う。

NINTENDO LABO のリモコンカーを 3Dプリンターで作成してみた

NINTENDO LABO は、ダンボールだから壊れやすいと思っていたが、やっぱり壊れた。
そこで、3Dプリンターで、これと同じものを作れないだろうか? と考えた。

3Dデータのダウンロードサイト「Thingiverse」で、「NINTENDO LABO」と検索すると、いくつかヒットした。
https://www.thingiverse.com/

さっそく、リモコンカーを 3Dプリンターで作成してみた。

形はたしかにそれらしいものが出来上がるけれども、ジョイコンを挿入するレールの部分が、微妙にサイズずれしているので、まっすぐに挿入できなかった。

これは私の3Dプリンターの調整が不十分だったから、かもしれないけど、
数時間かけて再プリントするのは、もったいない。

3Dプリントの動作が記述されている、GCODEファイルの仕様を理解すれば、
特定の部位のところだけ、造形の密度、印字速度、重なり 等のパラメータを変えて、
より精密に印刷することが可能だと思う。

GCODEファイルの実体は、プレーン・テキストファイルで、
座標軸データのほか、プリントの指示が記述されている。

一応、ドキュメントはあるが、
https://reprap.org/wiki/G-code

3Dプリンターが一般に普及していないので、
これを分かりやすく記述した解説書などは、まだない。

今回作ったリモコンカーは、飾っておくだけのものになったけど、
3Dプリントのノウハウをもっと身に付けて、
これを正しく造形できるようにしたいと思う。

ロカボーイの、次に使う 交換ろ材 を、上に重ねて置く。

アクアリウムをやってみて、最初に疑問になるのが、
水槽の投げ込み式フィルターの、ろ材の交換方法である。

以前の水槽の時も、ジェックスの「ロカボーイ」シリーズを使っていた。
当時は知識がなかったので、交換時期が来ると、新しい ろ材 と交換していた。
これは、いけない方法である、ということは知っていた。
でも、他に ろ材と同じような素材のマットを敷いていて、バクテリアが全滅することはないだろうという判断である。
小さなベタ一匹だけだったので、それで十分だったと思う。

でも今回は、50cm水槽で、たくさんのタニシ、グッピー、コリドラス、カージナルテトラ等が泳いでいるので、以前の方法では良くない。

この水槽では、ジェックスの「サイレントフロー パワー」というフィルターが付属していたので、それを使っている。
このフィルターは、バクテリアをなるべく温存させるための工夫として、内部にもう1枚別のスポンジが入っていて、ろ材をまるごと交換しても大丈夫、とのことである。

でも、1か月経ってみて、念には念を入れようと思って、今日「ロカボーイM」を入れてみた。
これも、ろ材をまるごと交換すれば、バクテリアがいなくなってしまうそうなので、いろいろと調べていたら、

「次に使用する 新しいろ材を、ロカボーイの上に重ねて置くとよい」

という情報を見つけたので、それが一番よい方法だと思った。
あらかじめバクテリアがいる状態の交換ろ材を使えば、たしかに確実だ。

難点は、見栄えが悪くなることであるが、魚の健康の方を優先に考えたいので、今日の時点では妥協しようと思う。
今は、こんな感じである。

「サイレントフロー パワー」の前面をふさぐ形で「ロカボーイM」を置き、その上に、次回使う交換ろ材を置いて、さらにその上に、重りとして「土管ミニ」を 建てて置いてみた。

実はこれ、グッピーの稚魚が「サイレントフロー パワー」の前面の吸い込み口に近づかないようにするための障害物 という役目も果たしている。

しばらく、ダブルフィルターの状態で、続けてみようと思う。

3Dプリンタ「ANYCUBIC I3 MEGA」の、フィラメント詰まりで、ノズル交換

3Dプリンタ「ANYCUBIC I3 MEGA」を使い始めて10日目。
またまた、フィラメントが排出されなくなり、プリントできなくなった。

今度は、フィラメントが、白いチューブの中で切れて、詰まって、
押し出すことも引っ張ることもできない状態になっていた。

こんな時、本来ならば、チューブだけを交換すればよいのだが、
最初から「チューブ付きの交換用プリントヘッド」が付いていたので、
プリントヘッドごと交換してしまうことにした。

この部品は、Amazonで売っているので、次回のために1つ注文しておいた。

中国製の安価な3Dプリンタは、いわゆる オープンソース なので、
パソコンの自作と同じ感覚で、部品交換やカスタマイズができる。

ATX電源や、冷却用のファン等、パソコン部品を流用しているので、
規格が合えば、自己責任で交換することもできる。

というわけで、プリントヘッドを交換したら、きちんと印刷できるようになった。


グッピーとタニシの赤ちゃんが、生まれる。

5月5日(こどもの日)に、アクアリウムを再開して、ちょうど3週間が経つ。

最初、グッピーを4匹、タニシ(貝)を2匹、コリドラスを2匹 でスタートした。
タニシは初日から赤ちゃんを産んで、ほぼ1日1匹のペースで赤ちゃんが増えていき、今は20匹くらいになっている。
グッピーは、1週間後に赤ちゃんが産んだ。6匹を隔離して育てて、だんだん大きくなっている。
コリドラスは、今のところ産む気配はないけど、もし卵を産んだら、もちろん育てる。

熱帯魚は、中学生だった頃に買っていたことがある。
グッピーの赤ちゃんも育てたことがあるので懐かしい。

この赤ちゃんたちが、大人に育っていくのが、楽しみだ。

3Dプリンタ「ANYCUBIC I3 MEGA」の、フィラメント押出機の空回り のトラブル

3Dプリンタ「ANYCUBIC I3 MEGA」を使い始めて2日目。
突然、フィラメントが排出されなくなり、プリントできなくなった。

買ってすぐなので、初期不良扱いで、交換してもらえるかもしれないけど、
これは中国製の格安品なので、自力で解決しなければならないことは覚悟している。

インターネットで情報を探せば、解決策はたくさん出てくる。

どうやら、フィラメントの挿入口にある押出機のギヤが、空回りしていて、
フィラメントがぜんぜん中に入っていかないという、よくあるトラブルらしい。
よく見ると、軸は回っているのに、ギヤは回っていない。

そこで、ギヤについているネジを、六角レンチで締めたら、ギヤが回るようになって、
きちんとフィラメントが挿入されるようになった。

私の場合、1台目の3Dプリンタ「BIQU MAGICIAN」(中国製)で、
ロッドアームのナットが1つ付いていなくて印刷中にネジが抜けたり、
リミットスイッチが外れて飛んだり、というトラブルを経験しているので、
この程度のトラブルは、経験値を積むのに役に立つ。

3Dプリンタ「ANYCUBIC I3 MEGA」を買った

ここ2ヶ月ほど、3Dプリンターがフル稼働中である。
初めての3Dプリンタ「BIQU MAGICIAN」で、いろいろなものを印刷してみたけれど、最近は失敗率が高く、試行錯誤で調整を繰り返さないと、まともに印刷ができなくなっている。

そこで、2台目を検討していたら、一昨日に、AMAZONのタイムセールで、「ANYCUBIC I3 MEGA」という機種が \39,999円(税込)で売っているのを見つけたので、買った。

実はこの機種、組立ても簡単だし、値段のわりに、なかなか高精度らしいので、候補だったのである。

今度は、20cm×20cm×20cm くらいのものが製作できるので、もう少し実用的なものを作ってみようと思う。

アダムスキー全集を図書館に献本してくれた方たちへ、感謝。

最近、故・久保田八郎先生の、日本GAPでの月例セミナーの音源を順番に聴いている。
これは、かつて、カセットテープで頒布されていたもので、今は、mp3形式で音声データ化されたものを、Cosmic Consciousenessの「会員専用ページ」内に掲載している。
全部で、約26GB、620ファイル、約485時間分 の分量が遺されている。

この膨大な量の音源は、Cosmic Consciouseness会の主催者である 清水正さんが数年前にデジタル化してくれたものである。
そのおかげで、今でも、故・久保田八郎先生の貴重な講演を、スマホで、いつでもどこでも、聴くことができる。
私が、日本GAPの月例セミナーに参加したのは、1992年4月以降だけど、それより約10年前からのセミナーを遡って聴けるのは、嬉しい。
順番に聴いていくと、1983年に、世界で初めて(というよりも唯一)、アダムスキーの書籍をまとめた「アダムスキー全集」を、文久書林から、立派なハードカバーの本として出版するという話が出てくる。

考えてみれば、私が、アダムスキーの宇宙哲学を知ったのは、1992年1月頃だった。
学生時代がもうすぐ終わるので、できるだけたくさんの本を、分野を問わずに読みまくっていた時期だった。
当時、町田市立中央図書館というのができたばかりだったので、ここにある本を全部読んで、世の中のあらゆる問題を解決できる「究極のノウハウ」 を見つけてやろうという野心に燃えていたことをよく覚えている。
それには、できるだけすべての棚に目を通して、興味の有る無しにかかわらず、あらゆる分野の問題に関心を持って、世の中にどんな分野の本があるのかを掴む必要があるので、自分が絶対に買わないだろう本(宗教、オカルト)も、無料だから、もちろん目を通した。

結局、いろいろな本に目をとおした結果、
人間(自分含む)にとって最も肝心な知識(つまり「究極のノウハウ」)は、聖書・仏典等の聖典が一番近いけど、それがゴールではない。
ということだった。
やはり何か足りないか、余計なものが含まれているか、間違っているか、不十分なのだ。

それから、聖書で「神」と書かれているものは、本当のところは一体何を意味するのか?といろいろ調べていくと、昔の人は「空から飛来してくる人間」を神と呼んだのでは?と考えるようになった。
そして、遠藤昭則さんの「ヨハネ黙示超解読」を読んだ時に初めて「アダムスキー」の名前を偶然知ったのである。

その後、「宇宙人」というキーワードでいろいろな本を読みまくってみると、いろんな話は出てくるけれどもみんな似たようなパターンで、気持ち悪い話ばかりだった。
その中で唯一、アダムスキーとビリー・マイヤだけは、単なる作り話ではなく、実はスゴい話が隠されているはず!と直感で感じたのである。
UFOの写真とか多少インチキなものが含まれているのは想定内として、私が求めているのは「究極のノウハウ」なのだから、地球人よりも進化していて、生老病死を克服している「宇宙人」が日常生活で活用している 新鮮なノウハウ を求めていたのである。

そんな中、「天文学」の棚で、アダムスキー全集という、カバー付きの、まるで文学書のような立派な本が並んでいるのを見つけた。
題名をよく見ると、「宇宙哲学」 「テレパシー開発法」 「生命の科学」 という書物があったのを見て、まさにこれ(アダムスキーの宇宙哲学三部作)こそが、私が求めていた「最強のノウハウ」であることを悟ったのである。

おそらく「宇宙」と「科学」のキーワードを含むので「天文学」に分類されていたのだと思うけど、この時から私は、今に至るまでずっと、アダムスキーの宇宙哲学を、この世で最高の書物と位置づけていて、今でも全くブレていない。
もしあの時、アダムスキー全集が、宗教やオカルトの棚に分類されていたら、さほど関心を持たずに、余計な回り道をすることになったと思う。
「天文学」の棚にあったことで、アダムスキーの書物が、まじめな研究に値する内容であることを迷わなくて済んだのだった。

今になって知ったことだが、アダムスキー全集を書店や図書館へ置いてもらうように献本活動してくれた、日本GAP会員のボランティアの人達がいた、ということだった。

彼らのおかげで、私は社会人になる前に、アダムスキーの宇宙哲学という「最強のノウハウ」と巡り会うことができたので、助かっている。

というわけで、故・久保田八郎先生と、日本GAP会員のボランティアの方々 に、あらためて感謝したいと思う。

「BIQU Magician」修理完了!

3Dプリンター「BIQU Magician」が壊れたので、
先週、メーカーに問い合わせたら、部品を送ってくれることになった。

中国の会社なのに、日本語でメールしたら、
きちんと日本語で返事をくれたので、好感が持てた。
文法は微妙におかしいけど、丁寧な日本語で、十分意味は通じる。
おそらく、翻訳ソフト等を使って、
いろんな国の言語でサポート対応しているのだと思う。

さて今回は、リミットスイッチの金具がおかしいので、
金具を送ってくれるとのことだったが、
結局、金具を含むスイッチごと送ってくれた。

 

取り付け方法は、動画ファイル(MP4)のリンクを付けてくれけど、
機械の中を開けて、なかなか大変な作業だった。

でもおかげで、また元通り使えるようになったので、よかった。

車の3列目カップホルダーに、USB付き電源タップ の固定具を自作

私の車(トヨタのノア・ハイブリッド 80系)には、
USB充電用ポートが運転席と2列目に 2口ずつ付いている。

3列目には、USB充電用ポートが無いので、
トランク側のACコンセント口から、
「USB付き電源タップ」を伸ばしてきて
カップホルダーに固定している。

「USB付き電源タップ」がブラブラしていると不快なので、
固定するためのアタッチメントを探したけれども、
既製品だとなかなかサイズが合わないので、
3Dプリンターで自作してみることにした。

drinkcup-tap-attach.stl

 


iPad mini のガラス交換作業について

iPad miniの画面にヒビが入ったので、修理することにした。
修理業者へガラス交換を依頼すれば1万円くらいかかるらしい。
PCデポで1万円で買ったものなので、それなら新しいのを買った方がいい。

Amazonで「ipad mini 修理」と検索してみれば、
交換用パネルが、税込1,396円から、たくさん表示されるし、

Youtubeで「ipad mini 修理」と検索してみれば、
その修理方法が分かりやすく解説されている動画が、たくさん見つかる。

自分で交換できるなら、修理代は、1,396円で済ませられるし、
自分で交換できなきゃ、修理代は、1万円かかることになる。

もう少し調べてみると、
1,396円の部品は、ハンダ付け作業が必要になるけれども、
2,000円以上の部品は、ホームボタンとICチップ込みなのでハンダ付け不要
もっと高いのものは、液晶パネル付き
というふうに、いくつかの種類がある。

「修理代」だけの観点で、安いか? 高いか? というの問題ならば
安い方がいいということになるかもしれないけど、
これは、その人の立場や状況によって変わってくるので、
どちらが得か? という問題になると、一概には言えない。

どんな考え方をする人が あるのだろう?

——————————————————————————-
修理代を激安で済ませられたことにだけ、お得感を感じる人ならば、
それにかけた手間や時間、つまり自分の人件費はノーカウントだろう。

自分は忙しいので、プロに任せられるならその方がずっと安上がりだ、
という立場の人ならば、自分でやったら、むしろ高いものにつくだろう。

普段からこういう作業を得意にしていて、道具も持っている人は、
技術料金を自分に対して払っていることになるので、確かに安上がりになるだろう。

気まぐれな人ならば、今ヒマで調子が良ければやるかもしれないけど、
忙しかったり疲れてたりしていたら、やらない、かもしれない。

何かに体験したり、チャレンジすることをプラスに考える人は、
多少の困難や、失敗&リトライ があったとしても、
「経験値」や「チャレンジ値」という資産を得たと考えるだろう。

修理しようかしまいか「迷う」「思い悩む」 ・・・ そしてそのまま保留。

等々。
——————————————————————————-

世の中、いろいろな考え方があるけど、
そのどれもが、それなりの立場で「正解」だし、

たとえ選択を間違えたとしても、
自分で決断したものならば、
それを「自分の体験」という資産にすることができる。

私の場合は、べつに多忙すぎるわけではないので、
早朝の時間を1~2時間くらい割いてでも、

・修理代を激安で済ませることができて、
・それほど難易度が高くなく修理の成功が期待できて、
・多少の経験値とチャレンジ値を積められて、

というメリットがあると即断できたので、結果オーライだった。

でも、やってみて気づいた結論としては、

「iPad の修理は、もうこりごりだ。
1万円で修理依頼するか、買い換えた方がいい!」

だった。
iPhoneの画面修理は何回かやったことがあるども、
iPadは、画面パネルの「糊付け」を剥がすまでが大変で、
粉々のガラスが細かいネジが飛んだりして、苦労した。

残念ながら私は、
こういう作業が好きなわけではないし得意でもないので、
こういう作業が好きで得意な人に作業費を払って、やってもらった方が安いと感じる。

実際に、1回だけでも自分で体験してみる、という決断をしたことで、

「自分で作業するか? 他人に依頼するか?」

という選択肢の、判断基準についての「学び」を1つ得たことになる。

「BIQU Magician」の金具がとれてしまった

3Dプリンター「BIQU Magician」の調子が悪いと思ったら、
3本のアームの上部位置が揃っていないことに気づいた。

リミットスイッチという、小さな金具が外れていて、
どうも位置が合わなくなってしまったらしい。

金具を再びはめ込んでも、変形して、
緩くなっているので、またすぐに取れてしまう。

販売者の BIQU-JP は、中国の会社だけど、
試しに日本語で、サポート宛先にメールを送ってみたら、
丁寧な日本語で返答が返ってきたので、嬉しかった。

部品もすぐに手配します、とのこと。

私にとって、最初の3Dプリンタだけど、まだまだ使いたい。

マイIP ソフトイーサー版 を、CentOS7で自動起動スクリプト化

インターリンク社の「マイIP」サービスは、グローバル固定IPアドレスを格安で利用できるので、自宅サーバーを建てる人にはとても貴重なサービスだ。
しかも逆引き設定までできるので、Webサーバーを Azure等のクラウドへ移行したとしても、メールサーバー等、逆引き必須のサービスを利用するには、まだまだ利用価値がある。
「マイIP」サービスには2種類あって、ソフトイーサー版の方は、仮想LANボードを使う方式で、手軽に設定できるのが魅力だ。
マイIP ソフトイーサー版 は、たしかに、Windowsサーバーの時はGUIで設定できて、自動起動化も簡単だった。
でも、Linuxサーバーだと、コマンド操作しかできないので、慣れていないと難しい。
しかも、たくさんのコマンドを順番に入力していかないと、つながらない。
そして、サーバーを再起動すると、また一からコマンドを入力しなければならないので、実用的ではない。
そこで、 Linuxサーバー(CentOS7)起動時に自動実行されるように 、スクリプト化してみた。
公式手順書どおりに設定して、接続できた状態になった後に、次のような手順を追加すればよい。
https://faq.interlink.or.jp/faq2/View/wcDisplayContent.aspx?id=1074
・/tmp/vpnclient に展開した場合は、後のことを考えて、 /usr/local/bin/vpnclient へ移動させる。
・/usr/local/bin の直下に、次のスクリプトファイルを「vpnstart」という名前で作成する。


#!/bin/sh
/usr/local/bin/vpnclient/vpnclient start
sleep 5s
ifconfig vpn_myipse-lan AAA.AAA.AAA.AAA netmask 255.255.252.0
route add -host myipse01.interlink.or.jp gw BBB.BBB.BBB.BBB
route delete default
route add default gw CCC.CCC.CCC.CCC


AAA.AAA.AAA.AAA は、インターリンクの「割り当て固定IPアドレス」
BBB.BBB.BBB.BBB は、ローカル接続しているルーターのIP
CCC.CCC.CCC.CCC は、 インターリンクの「 デフォルトゲートウェイ」
myipse01.interlink.or.jp は、インターリンクの「接続先VPNサーバー」

・/etc/rc.d/rc.local の最終行に、次の1行を追加する。


/usr/local/bin/vpnclient/vpnstart

・/etc/rc.d/rc.local のパーミッションを実行可能にする。


chmod u+x /etc/rc.d/rc.local

・次のコマンドで、ソフトイーサーの接続をスタートアップへ登録する。


(例)
/usr/local/bin/vpnclient/vpncmd
2を選択
localhost を入力
AccountStartupSet MYIPSE

・サーバーを再起動する。
これで自動接続されていれば、成功となる。

Microsoft Azure上の IIS で、物理パスを 共有ドライブ(Azure Files)のUNCパスに設定する方法

昨年、自宅サーバーで運営していたサイトを、Microsoft Azureへ移行した。
予算は月額1万円程度なので、低スペック(CPU数1、メモリ2GB)のサーバーしか選択できなかった。
でも、軽いWEBサイトを動かすくらいなら、特に問題ない。
Microsoft Azureは、月額1万円程度でも、
グローバルIPアドレスを固定で(設定が必要だが)5個まで使えて、
1TBくらいのディスクを「Azure Files」にしてNAS同様に使えるので、
活用次第では、十分にモトがとれるかもしれない。
操作は、リモートデスクトップ接続で普通に使えるし、
ファイルのアップロードも、エクスプローラのコピー&ペーストで
普通にできるので、自宅サーバーの時と比べても、全く違和感がない。
Azure Files」にしたストレージにドライブ番号(Dドライブ等)を割り当てれば、
自宅サーバーの時と同じように、robocopyコマンド等を使って
自動的にファイルをアップロードすることも可能なので、これも遜色ない。
さて、唯一、工夫が必要だったのが、
自動でアップロードするファイル、つまり定期更新する情報を
IIS上のウェブサイトへ即時に反映させる方法、である。
自宅サーバーの時は、
IISに設定しているドキュメントの物理パスが、
ローカルディスク内( D:\Inetpub\wwwroot\ 等)に存在していたけど、
Azure Files」だと、Dドライブに割り当てたとしても、
その実体は ネットワーク上の共有ドライブになるので、
そのまま D:\Inetpub\wwwroot\ と割り当てたとしても、
エラーが出て、うまくいかない。
「Azure Files」に限らず、IISのドキュメントの物理パスを
別マシンにある共有フォルダに設定したい場合は、
そのままではうまくいかないので、次のようにやる必要がある。
・共有フォルダにアクセス権のある「ローカルユーザー」を作成しておく。
 Administrator ではなく、専用のユーザーにした方がよい。
 「Azure Files」の場合は必ず、接続に使用するストレージアカウントの情報(80文字くらいのパスワード)を登録する。
20180303-00.png
・IISマネージャーから「規定のドキュメント」の設定で、右クリックして、「基本設定」を選択する。
20180303-01.png
・「物理パス」欄を、UNCパス形式(\\share\inetpub\wwwroot\ 等)で指定して「接続」ボタンを押す。
20180303-02a.png
・「パススルー接続」ではなく、「特定ユーザー」を選択して、「設定」ボタンを押す。
20180303-03.jpg
・「ローカルユーザー名」と、Azure Files接続用の長いパスワード(80字?) を指定して「OK」を押す。
20180303-04.png
・テスト接続を行って、認証が有効であることを確認する。
20180303-02b.png
20180303-05.png
表示するコンテンツ内のスクリプト(ASPやPHP等)側で、
絶対パスを指定している場合は、正しく修正する必要がある。
ちなみに、「Azure Files」を使わずに、
ローカルドライブ上に共有フォルダを設けて、直接、
VPN接続で更新すれば、上記のような余計な手順は必要ないけど、
月額1万円程度、という予算のなかで、
このVPN接続に関わる「ゲートウェイ使用料」が意外に高価なので、
つなぎっぱなしにしてしまうと、たくさん課金されてしまうで
VPN接続は使わないことに決めている
Microsoft Azureも今後、価格競争が進んで、料金が安くなれば、
VPN接続に変えてもよいかもしれない。


My Company Links

合資会社ユースマネージメント
ドメインサービス
ユースマネージモール umall.jp

My Website Links

細野俊一のトレーディング日記
大安心と大冒険を求めて
「生命の科学」学習メモ
細野俊一の雑記ブログ
インターネット活用の入り口

Facebook Pages

ポイント&フィギュア活用研究会
合資会社ユースマネージメント
ユースマネージモール
アダムスキー「生命の科学」活用研究会
細野俊一 (宇宙哲学研究家)