読者です 読者をやめる 読者になる 読者になる

DreamerDreamのブログ

夢想家の夢です。

3DプリンターをOctoPiで制御し、Webブラウザで設定や監視が出来るようにする

RaspberryPi 備忘録 3Dプリンター

3Dプリンターは通常のインクジェットプリンタと違いプリントスピードが遅い

数時間〜時には数十時間かかるものもある。

なので直接パソコンと繋いで動作させているとその間パソコンの電源を落とす事は出来ない

SDカードにG-codeデータを保存しておき、後は3Dプリンターにおまかせという機能の付いたプリンターも存在するしPepRapの自作機でもArduino制御でそのような機能を持たせることも出来る。プリンターの機能としては十分でプリント中にパソコンを付けておく必要が無いので省エネである。

しかしプリントデータの移動や監視は実際のプリンターでダイレクトに行う必要があり、遠隔監視ということは出来ない。

 

ということで、遠隔制御が出来るのか?を調べると

 

・OctoPrintのOctoPiプロジェクト

octoprint.org

 

AstroPrint

www.astroprint.com

 

というものがあるということがわかった。

どちらもオープンソース無料。RaspberryPiをプリンタ制御マシンとして、制御インターフェースをブラウザで提供出来る仕組みだ。

しかもカメラで現在どのような肯定なのか見えるという。

ブラウザから操作出来るということはパソコンが手元に無くてもスマホでもタブレットでも見れるということだ。

どちらもRaspberryPi用に予めSDカードにシステムがインストールしているものをキットとして購入出来るという超お手軽仕様の本体自体も提供している。

 

僕の所持した3Dプリンターを調べるとOctoPiの実働実績情報が得られたのでOctoPiを使うことにした。

OctoPiはOctoPrintというどんなマシンからでもWeb制御を提供するというプロジェクトのラスパイバージョンのようだ。

 

まずはダウンロードページに行き、OctoPrintのイメージをダウンロードしてくる。

octoprint.org

既存のラズパイがあればそれに機能追加としてOctoPrintをインストールする方法もあるが、プリント中にバックでイロイロ動くより3Dプリントに専念してほしいから専用マシンとして動かすことにした。

RaspberryPiはバージョン1、2、3全て対応しているので1つ余っていた1を使う事にした。

スライスには時間がかかるがプリント中はG-codeを走らせるだけなので1でも充分だ。

インストール方法はこちらのブログを参照させていただいた。

Octoprintのインストール方法

 

ラズパイのシステムインストールに関しては以前に書いた記事の通りなので、コレと同じ。

dreamerdream.hateblo.jp

 

ーーザッックリおさらいーー

piユーザーでログイン

パスワードは初期"raspberry"

rootとpiユーザーのパスワードの変更(OctoPiのデフォルトユーザーなので消さない)

sudo passwd root

sudo passwd pi

一般ユーザーの追加

sudo adduser [username]

ユーザー権限の追加

visudo

[username] ALL=(ALL) NOPASSWD: ALL

初期sshポート変更
sudo nano /etc/ssh/sshd_config
の22ポートを任意に設定
sudoログイン禁止
PermitRootLogin yes を PermitRootLogin noへ変更

ストレージ容量拡張

sudo raspi-config

アップデート

sudo apt-get update

アップグレード

sudo apt-get upgrade

再起動

sudo reboot

と、ここまでが初期設定

ーーーーーーーーーーー

 

有線LAN接続しておく。

次に、OctoPiの接続設定

sudo nano /boot/octopi-network.txt

の最終行を編集(#を削除)

uto eth0:1
iface eth0:1 inet static
#address ***.***.***.***
netmask 255.255.255.0
#broadcast ***.***.***.255

これでブラウザからラズパイのあるアドレスを入力

http://192.168.0.13

するとラズパイで動いているOctoPiのページが表示されるようになる。

f:id:DreamerDream:20170207130903p:plain

で、このままだと英語。そのままでも使えるけど不安な場合は

GoogleChromeブラウザで開くと自動翻訳が選択出来るので翻訳させる。

f:id:DreamerDream:20170207131225p:plain

直訳だけど日本語化成功!

ログインしてユーザーとパスワードを入力して準備完了。

 

ここまで出来たらプリンタにブラウザから接続出来るんだけど、その前にもう一手間。

 

Raspberry Pi Model B+の場合USBポートの電力量が少ないので安定させるために1.2Aの電力供給を許可する。

sudo nano /boot/config.txt

に次の3行を追加

#USB Port 1.2V Up
safe_mode_gpio=4
max_usb_current=1

 

無線LANのパワーセーブモードを解除

(ここで無線接続の設定は面倒なので割愛)

sudo nano /etc/modprobe.d/8192cu.conf


# Disable power saving
options 8192cu rtw_power_mgnt=0 rtw_enusbss=1 rtw_ips_mode=1
を追記。

再起動させる。

sudo reboot

 

で、もう一度OctoPiに繋いでログイン

 

参考にさせて貰ったページには

STL形式ファイルやOBJ形式ファイルをインポートすればスライスまで完了してくれる便利機能があるんだけど、CuraEngine というプラグインを入れて STL をスライスできるようにする必要があり、

https://ultimaker.com/en/products/cura-software/list

からver 15.04.x をダウンロードしてARMようにビルドして〜云々〜と書いてあった。

面倒くさいなーと思っていたが今はブラウザ上でプラグインをインストール出来るっぽい。

以下google翻訳を使っての説明です。

右上の「設定」を開いて

f:id:DreamerDream:20170207132555p:plain

インストールされたブラグインを下にスクロールすると

「もっと見る」ボタンがあるので押すと

f:id:DreamerDream:20170207132726p:plain

必要なプラグインを簡単にインストール出来るようになっている。

RepRapで使われるMarlineのEEPROMの値の取得から変更まで可能になる。

試しに作って放置していたMarine基盤に繋いでみた

f:id:DreamerDream:20170207133027p:plain

おおっ!初期値がちゃんと読み出せてる。

かなり高機能だ。

 

これでプリント中もスマホから作業状態をチェック出来るようになる。便利〜♫

 

 

3Dプリンターの選び方

憧れていた3Dプリンターを購入した。

購入の際に必要な情報をいろいろ調べてたので纏めることにする。

3D-CADの使い方やデータは大事だけれど、作品が満足のいくプリントが出来るか否かは3Dプリンターの基本性能に左右されるので充分吟味して購入することをオススメする。

 

考慮すべき内容一覧

  • 種類と価格
  • サイズ
  • 使える素材とランニングコスト
  • 着色
  • 設定の手間
  • 3Dプリンターの精度
  • ソフトウェア

結構たくさんある。

 

・種類と価格

一言で3Dプリンターといってもイロイロな種類がある

熱溶解積層:一番リーズナブルな価格で一般家庭向け、amazon等で原料も手に入り易い。積層ピッチ(解像度)が細かいほど高価になる傾向がある。10万円以下とか自作3Dプリンターといえばこのタイプ。

 

光造形:日本人が発明した古くからあるタイプ。光硬化する樹脂プールの表面にレーザー光を当て、徐々に底を沈めて行く事で出力する。高価だが10万円台からある。

プロジェクション形式という、レーザーに変わってプロジェクターの光で造形するモデルもある。光を一気に放てるので当然こちらのほうが高速。

 

粉末焼結:主に工業用。

プラスチック類以外にチタン、スチール等の特殊素材を扱える。

従来の鋳造等では造形が難しかった入り組んだ部品も出来るのでジェットエンジンの部品製造など既に実用化されている。

高価なので一般家庭向けでは無いが特許切れにより50万以下のモデルも登場している。

i-maker.jp

 

インクジェット:この辺りにくると調べる気にすらならない価格。

粉末にインクを載せて1層ずつ粉末を置き、またインクを載せるという方法。

光硬化樹脂のインクを出力した直後に紫外線を当てて硬化させて積層させるという方法とがある

300万超え。きっとインクも特殊で高価だと思う。

 

 

・サイズ

主に工業向けの製品である粉末焼結やインクジェット大型すぎて一般で購入するには現実的ではない。

やはり購入するとなると熱溶解積層か光造形であろう。

そして一般用途で材料が安く情報も豊富となると熱溶解積層

 

 

ということで以下からは熱溶解積層タイプについて書いて行く。

 

・使える素材とランニングコスト

熱溶解積層の場合は主にプラスチック素材、特に直径1.75mmが多くの3Dプリンタで採用されている。マイナーなフィラメントが使われているものを選ばないようにしないと材料の入手が困難になる。

3Dプリンター フィラメント」で検索すると沢山出て来る。

ABSPLAという素材が有名で扱えるプリンタも多い。また単一素材しかサポートしていないプリンタもあるので注意。

ABSはフィラメントとしては安く、ある程度弾力もあり、熱にも強いので素材としては良いが、プリント中に収縮して剥がれてしまうということが多いのでABSを使うにはベッドが加熱されるタイプのプリンタが望ましいとされる。それとプリント中の臭いがキツイのでプリントする場所を選ぶ。

PLAはプリント中の臭いがキツくなく、ABSに比べると収縮が穏やかなのでプリントしやすい素材だが、熱に弱く60℃程度で変形するので車のダッシュボードに置くような物や食洗器で洗うような物には適さない。また弾力が少ないので割れ易い

ABSが使える用途が多いがPLAが3Dプリンタ出力には楽だから普段使いの用途にはPLA、熱が心配な場合はABSと使い分けられるプリンタを望む。

その中でAmazonから1Kg2000円弱のPLAが使えるとランニングパフォーマンスは最高だ。

フィラメントには変わり種として金属やウッドタイプのものもある

 これらは樹脂素材に金属粉末等を含ませているというだけで実際に金属が出力出来るとうワケではないが質感が金属っぽく面白い。

但し、金属粉末でフィラメントの送り機が摩耗してしまったという記事もみたので要注意だ。

そして最も注意が必要なのが「専用フィラメントしか使えないプリンターが存在するということだ。

機械自体を安く売ってフィラメントで儲けるという販売戦略だろう。これらの専用フィラメントは高い!機械が手頃な価格だからといって飛びつくのは危険なので要注意だ。

 

・着色

出力したものに色を付けるにはフィラメント自体が色着きの物を選ぶか着色することになる。もともと何種類かのフィラメントを色分けで出力出来るプリンタもあるのでそれでプリントするのが最も楽な方法。

ABS素材の着色はプラスチック用の塗料で塗る。

PLA素材の物は塗料が乗りにくいそうなのでパテマニキュアで表面コーティングしてから着色すると良いらしい。

何かしら着色する手だてはあるのであまり気にしなくても良さそう。

 

・設定の手間

3Dプリンタを選ぶ時に「オートキャリブレーション」という機能を搭載したプリンタを選ぶと初期設定の手間を省く事が出来る

3Dプリンタは幅・奥行き・高さの3方向でヘッドが動いてプリントするのでこのヘッドを固定しているレールが少しでもズレていると綺麗なプリントが出来ない。

そこで、激安のプリンタならヘッドとベッドの感覚を手動でネジで調節したりソフトウェア的に軸の移動量を設定してみたりする必要がある。

ここで挫折しましたとしてオークションに出品している人がいた。非常に勿体ない話だがそれぐらい手間のかかる作業なのだ。自作するぐらいの意欲のある人ならそのぐらいどうっってことない作業かもしれないが一般的なインクジェットプリンターのイメージで購入してしまうとXYZ軸方向の意味すらわからず挫折するだろう。

オートキャリブレーション機能はその手間を機械にさせるものなのだ。

オートキャリブレーションについて纏めてみた↓

dreamerdream.hateblo.jp

 


・3Dプリンターの精度

3Dプリンタのプリントの精度の1つに積層ピッチがある。

上に何ミリ厚の素材が載せられるか?というのがこの積層ピッチ。当然細かければ細かいほど側面は綺麗になる。

ただ、細かければ細かい程プリントに時間がかかる

例えば0.1mmで出力していたものを0.05mmにすると単純計算で時間が倍になる。

作る予定のものが小さなアクセサリや細かなパーツ等であれば時間がかかっても綺麗にプリント出来るタイプを選び、事務用品のクリップ等ようなあまり細かさを気にしない物であれば積層ピッチの大きめのものを選ぶと良い。

また積層ピッチが大きくてもヤスリがけしたりパテ埋めしてピッチを隠すという方法もある。

www.pp3dp.jp

精度は積層ピッチの他、モデルデザインの精度、スライサーと呼ばれるソフトウェアの精度、プリンタ筐体の剛性、モーターの種類や制御方法、ガイドレール等によって様々な要因がある。

極端に安い物はソフトウェア的には精度の高い出力をしていてもプリンタのフレームが貧弱なものが見られる。フレームが貧弱とういうことはモーターまでマイクロステップで細かな制御がされていてもプリントヘッドの移動荷重に耐えられず出力先がブレるということだ。

とくに重たいヘッドを備えているにも関わらずフレームが細いパイプ製ものはイマイチだと思う。

 

ソフトウェア

ソフトウェアは専用ソフトウェアから高価なもの、フリーのものまでいろいろある。

基本的に「モデリング」→「スライス(G-code)」→「出力」という流れになる。

専用ソフトにはスライスと出力が一体化したものやモデルツールまで含むものまで多種多様だ。

 

モデリング

デザインするには「モデリングツール」「3D-CAD」とよばれるツールが必要だ。

フリーで有名な物にはBlenderがある。これは3Dアニメーション等が作れる程高機能なのだが高機能故に扱いは複雑だ。

どのようなツールを使うにしろ、3Dデータ形式の有名所.obj.stlファイル出力に対応していれば次のステップ、スライサーへデータをもっていける。

スライサー

これが3Dモデルをいかに効率良くプリントするか?が決まる肝心なツール。

スライサーでは、3Dモデルを何層にもスライスしていき、3Dも出るの中なのか外なのか?を判断して素材をどのぐらいの量どの位置へ出力するか、また場合によってはサポート材やラフトを含めたデータをG-codeという実際にプリンタのヘッドを動かす情報として出力する。

Slic3rが簡単で有名。

プリンタ制御

 スライサーから出力されたG-codeデータをプリンタへ適切なタイミングで出力するツール。

メーカー品として販売されているプリンターではあまり意識しなくても使えるようになっている。

有名なものでは自作プリンタのRepRapプロジェクトでよく使われるArduino用のMarline。

 

・その他、必要な工具

スクレーパーペンチ等はバリ取りやサポート材の除去に必要。

印刷領域の清掃には工業用アルコール

プラットフォームシートは素材の食いつきが良くラフト不要になるのでフィラメントの節約にうってつけ

 

 

現在進行形でイロイロなプリンターがどんどん出ているし、僕も1つしかプリンタをもっていないのでコレが良い!と言及することはしないが、1つでも選ぶ際の指標の参考になれば幸いです。

Amazonでも「3Dプリンター」と検索すれば多数出て来ます。

くれぐれも買って後悔することのないよう慎重にお選びください。

 

FXの業者選び

FX 投資

僕がFX業者選びしたときの条件

  • 信頼できる、安全(出金をすぐにさせてくれる)
  • スプレッド幅が小さい
  • 小額からスタートできる
  • デモトレードできる
  • 申し込みしやすい
  • MT4でトレードできる

 

 信頼できて安全なのは当然であるが、自分がその業者を使って安全か?ということが第一である。日本の業者であればレバレッジ最大25倍と決まっている。

それは何故か?答えは簡単、それ以上は危険だから。

レバレッジは高ければそれだけ多く掛けられるが、高すぎると身を滅ぼしかねないので自制は必用! 

dreamerdream.hateblo.jp

 自分は大丈夫だと思っていても自分も含め、やはり人は調子に乗る生き物だ理解している。うまくいくとついつい多く掛けたくなるものだ。ここは自制するために最大25倍まで。と調子に乗らないよう1つルールを決めるために国内業者を選択することにする。

国内業者だと万が一、口座のトラブルがあっても日本語で対応してもらえますしね。

 

スプレッド幅が小さいというのは売値買値の差が小さい所、これはもちろん小さな変動でも収益を得る為に大事。

特にデイトレードをする場合には出来るだけ小さい方が良い。

スプレッド幅が変動する業者も選択肢にはアリ。売買時にスプレッドをちゃんと見ておけば済むだけの話。

 

小額からスタートできるのは1万円で取引開始しようとしているから

 

デモトレードは大体どの業者も出来るっぽい。

 

申し込みのし易さはイロイロある。

僕はSBI銀行楽天銀行に口座を持っているということでこの2択から選ぶことにした。

銀行口座を持っていれば次いで証券口座FX口座というFX専用の口座を開設することになるらしい。銀行口座が無ければ銀行口座の審査から入るので面倒くさい^^;

 

MT4はMetaTrader4というトレーダーツールでプログラムを活用することでオートメーション取引をさせることが出来るものだ。

プログラミングが趣味の僕にとっては心惹かれるツールなのだ。

海外では一般的らしいが、日本の業者で採用している所は少ない。使っている人も多くは豊富なインジケータ(グラフ)を見る為だけに使っているらしい。実に勿体ない話だ。

 

手続きが面倒くさくない(自分の環境で) + MT4が使える業者」から選んだ僕は必然的に楽天FXになった。

楽天FXは過去にスプレッドがシステムの設定ミスで急に拡大して大惨事になった事件とか、楽天銀行の口座が突如凍結されたとかウワサは耐えないが、それについて調べてみるとシステムの異常の分はちゃんと返金されているし(海外業者だとそうはいかないだろう)、銀行口座凍結の話も個人名義の不特定多数の口座から振り込まれてる人が対象とか、それは不正送金予防策がちゃんとなされていると肯定的に受け取ることにした。

 

ということで来年は楽天FXで口座を開いてデモトレードでいろいろ検証していきたいと思う。

ではよいお年を^^v 来たれ!2017年!

FXについて調べてみた

FX 投資

前回、について調べて見たが、

 

dreamerdream.hateblo.jp

 

軍資金1万円から始めようと思うとなかなか銘柄を見つけるのが難しい。

そもそも取引時間に株価チェックできないということで諦めた。

 

そこで、24時間取引が出来て株のような取引が出来るものを調べてみるとFXというものがある事を知った。

FXについては詳しいサイトや書籍に委ねるとして、

 

完結に纏めると

ーー 株と違った特徴 ーー

  • 24時間取引できる
  • レバレッジを利用して軍資金以上の取引ができる
  • デモトレードできる
  • 業者によって5000円程度から始められる 

レバレッジとは、「てこ」という意味で軍資金1万円あれば日本のFX業者なら最大25倍25万円分まで取引可能になる。という素晴らしいシステムなのだ。

海外業者だと100倍とか400倍とかあるらしい。

25倍というと大きな変動があったら恐ろしいイメージだが、小額でスタートする場合はそれほど気にしなくても良い

 

なぜなら、FXの変動率は株よりずっと小さいからだ。

大きな変動として代表的なのはリーマンショック

この時110円台だった70円台まで下がった。

1万円分110円で買っていた場合、70円で売ると

10,000円ー6,363円=3,637円の損失だ。

これだけ大きな変動があっても小額だとこのぐらいで済む。

でも、仮に最大レバレッジを利用して25万円買って最後まで粘っていた場合

250,000円ー159,090円=90,910円の損失が出る。

しかし、そのような自体にならないよう強制ロスカットというシステムがある。

 強制ロスカットは自分の資金が底をつく前にFX業者が強制的にロスカットさせて決済させてしまうというシステムだ。

こうすることで、FX業者は顧客から損失分を回収(見込み薄)する手間が省けるし、顧客も損失を資金内で抑えられるので両得だということだ。

 

なのでよほど無謀なことをしない限りは決めた額で遊ぶことが可能なのだ。

もし1ドル0円なんてことが起こったらFXで騒いでいるどころじゃない。ドル大暴落という自体でおそらく世界が崩壊しているだろう。

 

それと1回に取引できる単位がかなり少ない(1ドル分)業者もあり、小額でも実際のマネーを賭けてトレード練習も出来るのだ。

デモトレードでも実際のチャートを使ってトレード体験出来るのでチャートを見る練習としてはFXはうってつけだ。

 

チャートを見る、注文する時には下記の意味を覚える必用がある。そんなの覚えるのが嫌!って人はもっと下の「バイナリーオプション」について書いている記事を一度参照してほしい。

ーー 絶対覚えておかないといけない用語 ーー

  • 通貨ペア:ドル/円、ポンド/円などの取引する通貨のペア名
  • 1通貨単位:ドル/円だと1ドル単位
  • 1Lot:1万通貨:1枚:ドル/円で取引する場合、1万ドルのこと(1ドル100円の場合だと100万円)
  • スプレッド:売値と買値の差、要は手数料

通貨ペアは初心者ならば「米ドル/円」が激しすぎず、日本人なら聞き慣れた通貨なのでオススメらしい。

1通貨とは、ドル/円ならば1ドル100円なら「100円」、1ドル80円なら「80」円。主体がドル、円の方が変動する

1Lot:1万通貨:1枚:これらは同じ意味で取引単位に用いられる。「1枚買う」ということは1ドル100円なら「1,000,000円分ドルを買う」ということ。

スプレッド買うときの値(Bid)売る時の値(Ask)差額のこと。1ドル100円で買って100円で売ってもこの差額のため±0円にはならない。つまりこれがFX業者の手数料。当然スプレッド幅が狭い方が有利。「スプレッド幅固定」「スプレット原則固定」「スプレッド変動」とスプレッドは幅も変動率もFX業者によって異なる。

 

ーー FXにおける取引価格の決定源とは ーー 

 FXの元のデータは「インターバンク」と呼ばれる金融機関同士の決めた値であり中枢は無い。

そのインターバンクデータをFX業者が顧客の状況に応じながら調整して現在価格として配布している。

その値はあまり大きく外れないよう調整されている。

 

この情報を得たとき僕は

「じゃあ、FX業者間の現在値を複数取得して一番高いFX業者のを売って、一番安いFX業者のを買えばいいんじゃん?だって最後に必ず調整されるんだから」

と思った。

調べて見た所、実際に「アービトラージシステム」というシステムでこの方法は運用されているそうだ。

アービトラージは言わばFX業者の穴を突くような手法で、滅多に出ないが出たら大きい穴らしい。

人の手では無理で、コンピュータでシステムに貼り付いていないと無理。しかもサーバー中枢に近くないと無理(何故か?は過去記事参考↓)。

dreamerdream.hateblo.jp

 実際にはFX業者も対策済みで「スリッページ(注文時の価格と約定価格の誤差)」が発生するのでほぼ不可能。

それでもシステムを組んで爆益を得ている投資家はいるそうだが、数々のFX業者から閉め出されながら新しく参入したFX業者を探している状況だそうだ(新しい業者はその辺りの対策が不完全な場合があるらしい←小声

ということで個人投資家にはほぼ無理な状況だ。ということで「アービトラージシステム」としてソフトを売っているような業者はほぼ偽物であるか、今は出来ていても対策されるので長続きはしないシステムだろう。

 

次に面白そうなのがバイナリーオプション

 

ーー バイナリーオプション ーー

これは一定時間経過後に現在値から上がっているか下がっているかを予想するだけなので専門的な用語を覚える必用も無い。初心者や考えるのが嫌いな人にとってはすごく入り易いシステムだ。丁半博打とも称される。実にカンタン明快なシステム。しかも低予算から始められると来た。

ただ・・・、バイナリで業者が決めた分数後に上がるか?下がるか?が予想出来る人ならば、普通にFXを運用した方が利が出るということは明確だ。

これは入り易いシステムというだけで長期運用向きではないと判断できる。

そして海外のバイナリーオプションでは実際に勝ったがなかなか出金されなくて面倒くさかったという記事も見たので業者選びも要注意だ。

 

ということで王道のFXでチャートの見方や相場感とやらを養う事にした。

さて、次は業者選びだ。 

軍資金1万円から始められる投資を考える

投資 FX

僕は昔から株には興味があった。

しかし生活費を投資にかけるほど余裕は無い。

1株数千円の株はいくらでもあるが、最低取引単位というものがあり、1株から買えるところは少ない。100株以上とか、軍資金1万円からはムリムリムリムリ!

 

そして問題なのが株価の変動率と手数料

例えば1万円で1000円の株を10株買ったとする。

運良く10円の値上がり1010円になったら10100円で売れる

100円のプラス!・・・にはならない!

1取引ごとに証券会社によるが数百円程度の手数料がかかる。

つまり数円の動き程度で売買するとそれだけ手数料が引かれるので結果マイナス

 

もっと変動率の良いものは無いかと調べると

「くず株」「一桁株」

というものがあることに気が付いた。

 

これは1株の単価が1〜数10円程度で取引出来るものだ。

たとえば1万円で10円の株を1000株買って

運良く10円の値上がり20円になったら20000円で売れる

10000円ー手数料の利益だ。

これなら爆益が出る!

 

が。。。

極端に安い一桁株やくず株というのはきちんと調べてからでないと整理銘柄指定されて投げ売られているだけかもしれない。つまり「倒産」のリスクもついて来る。

10000円で買った株が0円の紙くずになってしまう。ということだ。

 

しかしこれは面白そうだ。

 

とここまで調べてきたが、「取引時間」というものがあることに気が付いた。

株は売買出来る時間が限られているのだ。

平日9:00~11:30 12:30~15:00

この時間に株価がチェック出来ないと取引が無理なのだ。

つまり学校や会社でチェックする時間が無いと無理ってことです。

 

はぁ。。

ということで、次回は取引時間が24時間対応のFXについて書くことにします。

コンピュータと人の感覚の違い

初めてコンピュータでプログラムを組んで何かを実行させようとするとコンピュータの速度に驚くと思う。

例えば、下のpythonプログラムをRaspberryPiで実行すると、1から順番に1足した値が画面出力される。

c = 0
while True:
 c += 1
 print str(c)

実行結果

1
2

(略)

1396

1397
1398
1399

 

RaspberryPiのような非力なコンピュータで速度の遅いスクリプト言語を実行させても一瞬(1秒ぐらい?)で1000回ぐらいループしているのが解る。

 このようにコンピュータの「一瞬」という表現は人の感覚では測れないほど高速なのだ。

これを覚えておかないと電子工作の回路の設計ではまず

チャタリング

というものに悩まされることになる。

チャタリングの概要 | マルツオンライン

 

機械式スイッチ(トグルスイッチ・プッシュスイッチ・スライドスイッチ・機械式リレー)をコンピュータに接続して信号として入力する場合、スイッチのON-OFFの際にほぼ必ず接点がバウンドする状態が作り出されてしまう。

人が「えいっ!」と”一瞬”にしてスイッチを押した瞬間、コンピュータにはON-OFF接点バウンド信号が”しばらくの間”入力されてしまう。

例えば、RaspberryPiのGPIOでスイッチ入力させるプログラムをPythonで書いて実行させ、スイッチを押すと

 

「スイッチ入力回数表示プログラム」

#!/usr/bin/python
#coding:utf-8

import RPi.GPIO as GPIO
import time

Switch = 22
count = 0

def switch_callback(gpio_pin):
  global count
  count += 1
  print "count=" + str(count)

def standby():
  GPIO.setmode(GPIO.BCM)
  GPIO.setup(Switch, GPIO.IN, pull_up_down=GPIO.PUD_UP)
  GPIO.add_event_detect(Switch, GPIO.BOTH)
  GPIO.add_event_callback(Switch, switch_callback)

  while True:
    time.sleep(1)
  GPIO.cleanup()

 

if __name__=='__main__':
  standby()

 

 

結果

count=1
count=2
(略)
count=10
count=11
count=12 

 

1度だけスイッチを押したハズなのに何度もカウントされてしまうのだ。

これを予防する処置としてスイッチ回路の設計やプログラムで暫く待つ(20ms程度)という処理を入れなければ思ったような処理をさせることが難しくなる。

 

このように人にとっての「一瞬」は機械にとっては「しばらくの間」だという感覚でプログラムもしないと予期せぬエラーに見舞われることがあるので要注意だ。

 

 

次に「通信速度」の問題

 

さて「光の早さ」は30万キロメートル/秒。電気信号も光の早さで伝達される。

同軸ケーブルで伝達される高周波信号は若干遅くなるらしいが、ここでは電気信号=光速としておく。

1秒間に300,000kメートルというと地球7週半(一周40,000km)/秒とされ、途方も無く早いイメージだけど。

 

ここで問題

「地球の裏側と通信するのにどのぐらい時間がかかるのでしょうか?」

 

つまり、「地球半周はどのぐらい?」ということ。

※実際には海底ケーブルや衛星通信等でもっと長距離になるのだけど、ここでは単純に直線で結んだ場合を想定するものとする。

地球の円周は40,000kmなので20,000kmは

半周にかかる秒数 = 20,000km / 300,000km = 0.0666....秒

大雑把に計算しても最速で最低66ミリ秒はかかる。ということですね。

受け取った信号に対して返信するとさらに66ミリ秒。

処理速度を入れず、単純に信号の往復で最速132ミリ秒です。

 

この「ミリ秒」というのは機械にとっては「かなりの時間」なのだ。

以前、コンピュータの通信エラーによりロケットの打ち上げ延期になったことがあった。

イプシロンロケット、打ち上げ中止より重要な「失敗」 | 宇宙開発にひとこと

この0.07秒(70ミリ秒)の信号の遅れでコンピュータはエラーを発生させ、国家事業が延期になってしまったのだ。

 

今の時代、小さなマイコンでも10MHzや8MHzという周波数で動いている。

1MHzとは1秒間に1,000,000回命令処理する能力だ。

1MHzで1クロックの間に信号を伝達出来る距離 = 300,000,000m / 1,000,000 = 300m

なんと光の速度でも1クロックの間には300mしか進まない。

10MHzだと30m

1GHzだと0.3mだ。

つまりケーブルが30cm以上あると1GHzのCPUの1クロックの間では通信出来ないということなのだ。

まあ、一般的なPC間の通信なら「通信プロトコル」というものに合わせて組むのでこのレベルの心配は不要だが、マイコンを用いたローレベルでの通信プロトコルを自分で組むには通信ラインの長さも意識しないといけない。

 

ものすごく高速に遠くにデータを伝達しなければいけないようなプログラムを組んだ場合、いかに必用データ量を少なくするか?がキモになってくる。

動画配信サービス等はこの辺りがよく考えられていて動画の形式と視聴する端末によってデータを最小限に抑え、できるだけ近くのサーバーからデータを送れるよう工夫されている。

PythonでTwitterAPIを使って投稿する

python2.7 Twitter 備忘録

まず、TwitterAPIを使って投稿するのに参考にさせていただいた記事内に「OAuth認証はややこしいので凡人はライブラリを使う」と書いてあるので僕もpipを利用してインストールしたのが前回の記事

dreamerdream.hateblo.jp

 「基本はHTTP Requestを送ってJSONを得るだけなので、わざわざTwitter専用のライブラリを使うことも無いと思って自分で書いてみた。

とあるので自分も練習がてら参考にさせてもらいながらTwitterの投稿、タイムライン取得、検索等のクラスを自分で書いて備忘録として残すことにした。

 importしているfile_mngは以前書いたヤツを利用

dreamerdream.hateblo.jp

 

/usr/local/lib/twitter.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

from requests_oauthlib import OAuth1Session
import json
import file_mng


etcDir = "/usr/local/etc/"

#twitter main URL
url_twitter = "https://api.twitter.com/1.1/"
#tweet URL
url_tweet = url_twitter + "statuses/update.json"
#timeline URL
url_time = url_twitter + "statuses/home_timeline.json"
#search URL
url_search = url_twitter + "search/tweets.json"


class Twitter:

    CK = '***' # Consumer Key
    CS = '***' # Consumer Secret
    AT = '***' # Access Token
    AS = '***' # Accesss Token Secert

    def setKeys(self,etcFilename):
        self.keys = file_mng.load(etcDir + etcFilename)
        for s in self.keys:
            sp = s.split(":")
            if sp[0] == "CK":
                Twitter.CK = sp[1]
            if sp[0] == "CS":
    Twitter.CS = sp[1]
            if sp[0] == "AT":
    Twitter.AT = sp[1]
            if sp[0] == "AS":
    Twitter.AS = sp[1]

    def search(self,params = 'test',url = url_search):
        self.spara = {"q":params}
    # OAuth で GET
    self.twitterKey = OAuth1Session(Twitter.CK, Twitter.CS, Twitter.AT, Twitter.AS)
    self.req = self.twitterKey.get(url, params = self.spara)
        self.list =
    if self.req.status_code == 200:
    # レスポンスはJSON形式なので parse する
    self.res = json.loads(self.req.text)
    self.dic = self.res["statuses"]
            for rs in self.dic:
                self.list.append(rs["text"])
    else:
    # エラーの場合
            self.list.append("Error: %d" % self.req.status_code)
        return self.list

    def timeline(self,params = {},url = url_time):
        # OAuth で GET
        self.twitterKey = OAuth1Session(Twitter.CK, Twitter.CS, Twitter.AT, Twitter.AS)
        self.req = self.twitterKey.get(url, params = params)
        self.list =
        if self.req.status_code == 200:
            # レスポンスはJSON形式なので parse する
            self.timeline = json.loads(self.req.text)
            # 各ツイートの本文を表示
            for twt in self.timeline:
                self.list.append(twt["text"])
        else:
            # エラーの場合
            self.list.append("Error: %d" % self.req.status_code)
        return self.list

    def tweet(self,params = "test", url = url_tweet):
        self.tpara = {"status":params}
        # OAuth認証で POST method で投稿
        self.twitterKey = OAuth1Session(Twitter.CK, Twitter.CS, Twitter.AT, Twitter.AS)
        self.req = self.twitterKey.post(url, params = self.tpara) #tweet

        # レスポンスを確認
        if self.req.status_code == 200:
            return ("OK")
        else:
            return ("Error: %d" % self.req.status_code) 

 

CK = '***' # Consumer Key
CS = '***' # Consumer Secret
AT = '***' # Access Token
AS = '***' # Accesss Token Secert

の***部分を取得したキーに置き換えるとそのまま使える。 

/usr/local/etc/(任意のファイル)

CK:***********

CS:***********

AT:************

AS:***********

に認証キーファイルを置き、クラスのインスタンスにsetKeys(任意のファイル名)で認証キーのファイル名を渡し、簡単に置き換えられる仕様にした。

また、タイムラインや検索結果の複雑な辞書形式のものを簡単なリスト形式に変換して取得するようにした。

使い方。

test.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

from twitter import Twitter #インポート

tw = Twitter() #インスタンス生成

#tw.setKeys("(任意のキーファイル名)")#キーファイルを設定

print tw.tweet("テスト投稿")#投稿、成功したら「OK」が返る

timeline = tw.timeline()#タイムラインをリスト形式で取得
for s in timeline:
  print s

search = tw.search("検索")#検索をリスト形式で取得

for s in search:
  print s

 

※  python2.7なので環境によって文字列の変換エラーが出るかもしれない。