Hatena::ブログ(Diary)

日常メモ

2017-01-17

メイ首相がEU単一市場から完全撤退表明をしたことでポンドは買い戻し

「ハードブレグジット懸念で売り」なんて言われながら売られていたポンドは強烈な買い戻し。

次図は2016年12月14日の米国利上げから2017年1月18日のメイ首相EU単一市場からの撤退表明までのKU5分足ベース。

f:id:graySpace:20170118043157p:image

これまで具体的な方針を示していなかったが、今回初めて具体的な方針が示されたことで不透明感が払拭されたことが買いにつながった。なんていうコメントが出てくるのだろうな。

個人的には、正直良くわからないw。

以前、なんとなく「Brexitの際の円買い・ポンド売りが行き過ぎの閾値ならば、ここからはポンド買い、円売り?なのだろか」なのかと考えていたら更に売り込まれたし。

Brexitの少し前からの日足ベースKU。

f:id:graySpace:20170118044735p:image

Brexitの時から変わっていることは幾つかあろうが、ドルと円の立場が逆転していることだろうか。

円はBrexitの水準まで戻っているが、ポンドは戻っていない。代わりに、ドルとオージーが買われている。

2017-01-15

Python+Bottle+BootStrapで画面ロード時にJavaScriptやCSSが読み込めずに404

Python+Bottle」の組み合わせで簡単なアプリを作っているが、JavaScriptCSSが404で見つからない。

192.168.210.100 - - [15/Jan/2017 13:42:14] "GET / HTTP/1.1" 200 1174

192.168.210.100 - - [15/Jan/2017 13:42:14] "GET /static/bootstrap-3.3.7-dist/css/bootstrap.min.css HTTP/1.1" 404 824

「あー、これ、ルートパスが変わるから見つけられないというよくあるやつか。」と昔の記憶を思い出して、ググるw。

見つかった。

「How to load a javascript or css file into a BottlePy template?」

この通り実施するも次のimport部分でエラー。

from Bottle import get_url

「get_urlなんて無いよ」と言われる。

PythonのBottleフレームワークで静的ファイルのリンク生成」に同じことをしている人を発見。下記引用。

まず、get_urlはBottleクラスに移動されていました。

しかし、ソースを見ると

・・・・

こんな感じで、urlとしてラップされていますので、「url」を使用します。

結局、pythonは次のようにオマジナイ。

from bottle import static_file, url *

@route('/static/:path#.+#', name='static')
def static(path):
    return static_file(path, root='static')

@route('/')
@view('index')
def index():
    return {'get_url': url}

staticフォルダ配下に置いたindex.htmlは次のように書いて動作。

<!DOCTYPE html>

<html lang="ja">
<head>
  <meta charset="utf-8">
  <!-- BootStrap -->
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>トップ</title>
  <!-- Bootstrap -->
  <link href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet">
</head>

<body>

ボディ部分

<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<!-- Include all compiled plugins (below), or include individual files as needed -->
<script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>

アクセスすると次のログが出て、無事成功。

192.168.210.100 - - [15/Jan/2017 14:29:49] "GET / HTTP/1.1" 200 1095

192.168.210.100 - - [15/Jan/2017 14:29:49] "GET /static/bootstrap-3.3.7-dist/css/bootstrap.min.css HTTP/1.1" 200 121200

192.168.210.100 - - [15/Jan/2017 14:29:49] "GET /static/bootstrap-3.3.7-dist/js/bootstrap.min.js HTTP/1.1" 200 37045

もう一度アクセスすると・・・。

192.168.210.100 - - [15/Jan/2017 14:30:20] "GET / HTTP/1.1" 200 1095

ログが表示されなくなった。404でも無いが200でも無い。どういうことか?

恐らく一度読み込んだらブラウザキャッシュされて、2回目以降はリクエストしないのだろう。

試しにChromeからキャッシュを削除してみたら、200となった。

2017-01-13

Python+MySQLで開発時に「UnicodeDecodeError: 'utf-8' codec can't decode byte 0x83 in position 113: invalid start byte」

ここまで、下記2つのエントリーを進めてきた。

・「Python+SQLAlchemy+MySQLでORマッピング

Python+SQLAlchemy+MySQLでORマッピング 〜 select

ここでハマった。次のエラーが発生するが原因が分からない。

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x83 in position 113: invalid start byte

何故わからないのかというと、ソースコードを何度見直しても、「Python+SQLAlchemy+MySQLでORマッピング 〜 select」で実施したソースコードと次の点のみを除いて同じだから。

◎相違点

DBの接続先指定部分「url = 'mysql://ユーザ名:パスワード@IPアドレス/DB名?charset=utf8'」における「DB名」が異なる

・select対象のテーブルが異なる。

ファイルの文字コードデータベース文字コードも同じ「utf8」。いったい何故エラーとなるのか全く分からない。

とりあえず、文字コードを「utf8」にしていることが原因のようだから、接続先を次のように修正してcharset指定を外す。

これでは日本語をブラウザやコンソールに出力させる時に文字化けするが原因究明のためにトライ&エラー。

◎変更前
url = 'mysql://ユーザ名:パスワード@IPアドレス/DB名?charset=utf8'

◎変更後
url = 'mysql://ユーザ名:パスワード@IPアドレス/DB名'

するとエラーが発生しなくなった。


正直困ったので、ログを遡ると次のようになっている。

2017-01-13 18:36:31,877 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `テーブル名`

2017-01-13 18:36:31,877 INFO sqlalchemy.engine.base.Engine {}

2017-01-13 18:36:31,904 INFO sqlalchemy.engine.base.Engine ROLLBACK

Exception during reset or similar

Traceback (most recent call last):

・・・・・・・・・・・

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x83 in position 113: invalid start byte

どうやらsqlalchemyのクラスで「SHOW CREATE TABLE `テーブル名`」が実行されているようなので、エラーが発生しない場合のテーブルと、エラーが発生する場合のテーブルの2つに対して「SHOW CREATE TABLE `テーブル名`」を実行してみた。

するとエラーが発生するテーブルだけテーブルコメント、カラムコメントが文字化けする・・・。

'CREATE TABLE `テーブル名` (

 `カラム` int(11) DEFAULT NULL COMMENT '��茋�ʁ@���A�s�o���A�L�����Z���Ȃ�'

) ENGINE=MyISAM AUTO_INCREMENT=17731 DEFAULT CHARSET=utf8 COMMENT=''�l�b�e�B���O�����e�[�u��'''

(どこの会社がやったのかは知っているが)一体どこの馬鹿がこんなことにしたのかと思いながら、泣く泣くカラムコメントとテーブルコメントを空文字に修正。

(※)今回コメントは不要なので空文字に修正。

・テーブルコメントの修正
Alter table テーブル名 COMMENT '';

・カラムコメントの修正
ALTER TABLE テーブル名 CHANGE COLUMN カラム名 `カラム名` datetime NOT NULL COMMENT '';

こうして動いた!!!!!!!!

Python+SQLAlchemy+MySQLでORマッピング 〜 select

「Python+SQLAlchemy+MySQLでORマッピング」の続き。

次のようにして、条件検索が出来る。

テーブル指定は、select()の引数に[Tableオブジェクト]を指定する。

列にアクセスするには、「Tableオブジェクト.c.列名」とする。

import sqlalchemy as dbMapper
・・・・・・・

url = 'mysql://ユーザ名:パスワード@IPアドレス/DB名?charset=utf8'

# Engineおよびconnectionの取得
engine = dbMapper.create_engine(url, echo=True)
conn = engine.connect()

# MetaData の生成
meta = MetaData()

# Engineに結びつける
meta.bind = engine

# SQLAlchemyのTableを使用して、データベースのテーブル定義からテーブルオブジェクトを作成する
sample_table = Table('テーブル名', meta, autoload=True)

#### SQLによるselectサンプル ####
# 必要モジュールのインポート
from sqlalchemy.sql import select

# 全検索の定義および実行
selectQuery = select([sample_table])
executeResult = conn.execute(selectQuery).fetchall()
for row in executeResult:
    print(row)

# whereを使用した条件検索の定義および実行
selectWhereQuery = select([sample_table.c.name]).where(sample_table.c.code == 1001)
executeResult = conn.execute(selectWhereQuery).fetchall()
for row in executeResult:
    print(row)

# Like検索の定義および実行
selectWhereLikeQuery = select([sample_table.c.name]).where(sample_table.c.code.like('%10'))
executeResult = conn.execute(selectWhereLikeQuery).fetchall()
for row in executeResult:
    print(row)

詳細は本家のマニュアルSQL Expression Language Tutoria」を参照。

Python+SQLAlchemy+MySQLでORマッピング

Python+SQLAlchemy+MySQLでDB接続」ではSQLを直接記述して実行したが、今回はSQLを記述せずにDBアクセスを行う。

つまり、SQLAlchemyのORマッピング機能を使用して、SQLを書かずにSQLを実行する。

要点だけを記載したコードは次。

import sqlalchemy as dbMapper
・・・・・・・

url = 'mysql://ユーザ名:パスワード@IPアドレス/DB名'
engine = dbMapper.create_engine(url, echo=True)

# MetaData の生成
meta = MetaData()

# MetaDataをエンジンに結びつける
meta.bind = engine

# SQLAlchemyのTableを使用して、データベースのテーブル定義からテーブルオブジェクトを作成する
table_object = Table('テーブル名', meta, autoload=True)

# selectの実行
rows = table_object.select().execute()

# select実行結果の確認
for row in rows:
    print(row)

実行すると。文字化けwww。

(01, '????', '??')

(02, '????', '??')

DB側の文字コードがutf8なので、urlを記述する部分に次のように「?charset=utf8」を追記して文字コードを指定する。

url = 'mysql://ユーザ名:パスワード@IPアドレス/DB名?charset=utf8'

実行すると文字化けが修正された。

(01, 'ああああ', '愛知')

(02, 'いいいい', '東京')

下記2つのサイトを参考。

本家のマニュアル

SQLAlchemy 0.6.5 ドキュメント (和訳)

2017-01-12

Python+SQLAlchemy+MySQLでDB接続

BottleでWEBアプリ作ろうとしていて「PythonでWEBアプリを作成する 〜 WEBアプリフレームワーク「Bottle」を使用してみる」では簡単なものを作ってみたが、SQL書くの面倒。

なので、ORマッパー「SQLAlchemy」を使ってみる。

pipで「SQLAlchemy」をインストール

次のように書いて接続を試みる。

import sqlalchemy as dbMapper
・・・・・・・

url = 'mysql://ユーザ名:パスワード@IPアドレス/DB名'
engine = dbMapper.create_engine(url, echo=True)

あえなく撃沈。ふぁ???

ImportError: No module named 'MySQLdb'

Google先生に問い合わせたところ、「ImportError: No module named MySQLdb」が該当。

pipでpymysqlをインストールして、urlを次のように書き換え。

url = 'mysql+pymysql://ユーザ名:パスワード@IPアドレス/DB名'

こうすると動いた。

次のような流れ。

import sqlalchemy as dbMapper
・・・・・・・

url = 'mysql://ユーザ名:パスワード@IPアドレス/DB名'
engine = dbMapper.create_engine(url, echo=True)
rows = engine.execute('SQL文')

for row in rows:
    print(row)

トランプ会見で素直なSell the fact

2016年11月9日(水)ナイト〜2016年11月10日(木)寄り前 米大統領選トランプ氏の当確後の強烈なBuy the fact」から始まったトランプラリー。

株高・債券安のグレートローテーションが続いていたが、トランプ記者会見・トランプ就任(これはこの先だが)では一旦落ち着くだろうとの大方の予想通りだった。

ドル円は乱高下。

これを受けて東京市場では日本株安、ドル円安。

2017年1月11日、12日の60分足。

f:id:graySpace:20170112143530p:image

2016年12月1日からの60分足。

f:id:graySpace:20170112143357p:image

週足。

f:id:graySpace:20170112143856p:image

ドル円は以前「ドル円強い」で述べた通り105円でトレンド転換というのは正しかったがそこからが急ピッチだった。

KU5分足、日足ベース。

f:id:graySpace:20170112143922p:image

f:id:graySpace:20170112143919p:image

この後、トランプ就任が来週2017年1月20日に控えている。

どこまで調整するだろうか。

ただ、VIXは低い値を保っている。

f:id:graySpace:20170112144302p:image

f:id:graySpace:20170112144305p:image

年始だからマーケットへの参加者がリスクをあまり取っていないからか。トランプ政権政策不透明なので、リスクを取っていないからか。

いずれにせよ、全然踏まれてはいないので、適当に押したところで買い継続なのかな?押し目待ち。

皆がもう少しリスクポジション持って、踏み上げられてVIX上げきるところまで待つか、どこまで待つかは難しい。