けんぞの投資関連ブログ

株を始めて3年半程のひよっこ投資家のブログです。

糞コードを見るとイライラする

底辺IT土方ですが、糞コードを見るとイライラします。
わかってます。そんな小さいことでイライラするなんてばかだなとか言われても仕方ないですが、
既に色々な絵の具でぐちゃぐちゃに汚いキャンバスだけど愛着が少しついてきたところで、
となりで端っこから破られていく感じでとてもイライラしてくるのです・・・

せめてこいつと同じプロジェクト同じチームでなければ汚いコードだな~はははで終わっていたはず・・
あ・・こいつっていっちゃった

もちろん指摘しました。氷山の一角の規模でジャブ打ちました。
これはこういう理由でだめだからこうしたほうが良いと・・懇切丁寧に( ^ω^)
そしたらソースコードみるなと言われました。。( ^ω^)・・・

そうですね。勝手にレビューしちゃだめですよね。
結局プロパーに同じこと指摘してもらって直してもらいましたが・・

f:id:ko46614643:20190410222534p:plain

底辺IT土方なりに、外注を雇う企業に物申したいのですが、外注をしっかり評価しましょう。
できない人がいるデメリットはすごいです。

まずできないので仕事が遅いです。
既存のコードを読みません。すでにある関数とか検索しないので、自作していて仕事が遅いです。
バグもたくさんあります。こういうパターンの場合どうしようとか考えません。
バグがあるということは、顧客からバグの説明をもとめられたり、怒られたり、信用を失ったりとさんざんです。
チームで動いていればその人が遅いので、他の人にその人がやるべき仕事がどんどん回されます。
仕事をたくさん回され周りのモチベーションが下がります。もういつ辞めたっていいと思うようになります。
間違っても育てようとか考えないでください。損切はとても大事なことです。さっさと切る。

ところで底辺IT土方は、IT業界にたくさんいますが今すぐアサインできる底辺IT土方の70%はやばいやつだと思います。
できる底辺IT土方は切られることがないので、自分の意志で辞めない限り市場に出てきません。
できない底辺IT土方はすぐ損切されるので、待機状態になると思います。
職務経歴書が5ページぐらいあるやつはとても経験豊富に見えますが、やばいと思います。損切されてます。

損切って大事だな~
終わり

生産性について

もはや投資とは全然関係なくなってしまったんですが、
プログラマにおける生産性について、なんとなく書いてみたくなったので書いてみます。

 

最近ではもうないですが、

日本の労働者は生産性が悪いとかなんとかを目にしたことがありました。
そもそもプログラマにおける生産性とはなにかから自分の考えを述べたいなと思います。
(もしかすると見当違いなことを書いているかもしれないです)

 

簡単に考えると、
例えば、それぞれ一つの機能を作成するのを通常であれば5日で完成することができる見積もりをした場合に、
Aさんが5日で完成しましただと、「普通」といわれるものになる。
Bさんは10日かけて完成しましただと、「悪い」といわれるものになる。
Cさんは3日で完成しましただと、「良い」といわれるものになる。

 

しかしそれは仕事の速さだけであって生産性ではないような気がする。

 

もしCさんが完成したといわれる機能にバグが含まれていた場合、
テスト中ならば、再度直してローカルで確認、テスト環境にリリースして再度確認するコストを積み上げですみますが、

本番稼働後ならば、再度直してローカルで確認、テスト環境にリリースして再度確認し、客に説明、受け入れ、納品、エンドユーザに告知など
さまざまなコストが積みあがっていき、
10日ほどかかりましただと一時は良いといわれたCさんも結局生産性は「最悪」になるのではないかと思う。

まあ、本番までいっちゃってたら、テストの精度に疑問を持ったほうが良い気がするが。

 

AさんBさんCさんの完成の定義が異なっていたら、生産性なぞ測ることはできない。
Bさんはカバレッジ100%の精度をもって完成で
Cさんはとりあえず作ってなんとなく動けばよいよねで完成だと思っていたら。
・・・まあ、この完成の定義がそれぞれ異なっているようなプロジェクトは、ないと思うが・・・いやあるか今の現場がそうだったw

 

そもそもその生産性を図るための見積もりも正しいのかどうかがわからない。
世界標準的な見積もりを作れることができる人がいれば、

その人は日本の生産性が悪いなんていってもいいと思うが。

 

ごちゃごちゃ書きましたが、私の中の結論としては
プログラマの生産性とは、リリースして問題がないというところまでいかないとわからない、とてもあやふやなもの。です。

 

でも一緒に仕事していれば生産性がいい人悪い人ってなんとなくわかりますよね。

これが面接や面談の段階で判定できたのなら、すばらしい職場になると思います。

株を自動的に買っていた方法

株を自動的に買う方法はいろいろあると思いますが、
僕が挑戦して失敗した仕組みというかアルゴリズムを公開します・・(´;ω;`)ウッ…

原因はたくさんありますが、スピードが遅いし、条件がゆるかったです

適時開示が発表されてから、1秒ぐらいの売買(多分1秒以内だった)では、遅いほうです。
原因を取り除いてまた挑戦しようと思ってます。

とりあえず自動的に買うアルゴリズム

・自動買トリガーが適時開示の場合
①Mainスレッドで適時開示を監視
②Subスレッドで取引する証券会社にログイン 
③Mainスレッドにてトリガーとなる適時開示を検知(好決算や、優待発表などなど)
④Subスレッドにてセッションを維持するため何分おきにセッション維持イベント発火
⑤Subスレッドの自動買イベント発火し、取引画面に戻る

あとは③~⑤の繰り返しです。
もし、適時開示で買ったりするなら、
余計な機能は捨てて自動買いするためだけのシステムにしたほうがより早くなるのでいいです。

余計機能をそのうち取り除こうかと思います・・・

Pythonで楽天RSSの株価取得するその2

前回の続き Pythonで楽天RSSから株価を取得する - けんぞの投資関連ブログ

楽天RSSで株価を取得する前に、MarketSpeedとRSSを立ち上げる必要があるが、 当然これもプログラムで自動的に立ち上げることができる。

しかし、pythonで立ち上げる処理を作成して立ち上げにも成功しているはずだが、なぜか株価取得がうまくいかなかった。 正確には、銘柄一覧は取得することができたが、株価がなぜか取得することができなかった。

Python以外で起動プログラムを書いてみると、問題なくMarketSpeedとRSSは立ち上がり、Pythonで株価が取得できた。

Pythonですべて完結したい人はこれをどこか改良すれば、株価は取得できるかもしれない

→久々にこのプログラムを見直したところ、RSS実行時にRSSディレクトリに移動して実行すれば問題なさそうでした。

 おそらくRSS内でMarketSpeedにアクセスしているのですが、ディレクトリを移動せずRSSを実行していたため、

 「定義ファイルがみつかりません。」とエラーが出てRSS起動が失敗していました。

import pyautogui

market_speed = None
market_speed_rss = None

# RSSを起動します
def start_rss():
    global market_speed, market_speed_rss
    market_speed_path = r"F:\Program Files\MarketSpeed\MarketSpeed\MarketSpeed.exe"

    market_speed = subprocess.Popen(market_speed_path)
    time.sleep(10)
    pyautogui.keyDown("F3") # F3キーをショートカットキーに登録して、ログイン画面をポップアップさせる
    time.sleep(3)
    pyautogui.typewrite("********")  #パスワード ログインIDは記録させておくため入力しない
    time.sleep(1)
    pyautogui.keyDown("Enter")
    time.sleep(3)
    pyautogui.keyDown("Esc")
    time.sleep(3)

    market_speed_rss_path = r"F:\Program Files\MarketSpeed\MarketSpeed\RSS.exe"
    current_dir = os.getcwd()
    market_speed_dir = os.path.split(market_speed_rss_path)[0]
    os.chdir(market_speed_dir)
    market_speed_rss = subprocess.Popen(market_speed_rss_path)
    os.chdir(current_dir)
    time.sleep(3)


# RSSを停止します
def stop_rss():
    global market_speed, market_speed_rss
    market_speed.kill()
    market_speed_rss.kill()

なぜか、株価取得ができなかったため もともと、VBAで株価を取得する処理を作っていたため、VBAのマクロを呼ぶようにした。

# ExcelマクロをPythonから呼び出す
import xlwings
import app_config
conf = app_config.AppConfig()

# Excelマクロを実行します
def execute_excel_macro(macro_name):
    work_book = xlwings.Book(’excelのPath’)
    macro = work_book.macro(macro_name)
    macro()

VBAでMarketSpeedとRSSをたちあげる

'MarketSpeedProcessID
Dim objMS As Variant
Dim objRSS As Variant

'RSS起動
Public Sub startRSS()
    
    Dim WshShell As Variant
    Dim password As String
    
    Set WshShell = CreateObject("WScript.Shell")
    WshShell.CurrentDirectory = "F:\Program Files\MarketSpeed\MarketSpeed"
    Set objMS = WshShell.Exec("F:\Program Files\MarketSpeed\MarketSpeed\MarketSpeed.exe")
    WshShell.AppActivate (objMS.processID)
    Call waitFor(15)
    WshShell.SendKeys ("{F3}")
    Call waitFor(5)
    WshShell.SendKeys ("*******")
    Call waitFor(5)
    WshShell.SendKeys ("{ENTER}")
    Call waitFor(5)
    WshShell.SendKeys ("{ESC}")
    Call waitFor(5)
    Set objRSS = WshShell.Exec("F:\Program Files\MarketSpeed\MarketSpeed\RSS.exe")
    Call waitFor(5)
End Sub

Public Sub stopRSS()
    Dim strRssProcName
    Dim strMSProcName
    Dim objProcList As Object
    Dim objProcess As Object
    
    strRssProcName = "RSS.exe"
    strMSProcName = "MarketSpeed.exe"
    
    Set objProcList = GetObject("winmgmts:").InstancesOf("win32_process")
    For Each objProcess In objProcList
        
        If objProcess.Name = strRssProcName Or objProcess.Name = strMSProcName Then
            objProcess.Terminate
        End If
    Next
    
    Set objMS = Nothing
    Set objRSS = Nothing
    
    Sleep 1
End Sub

Pythonで楽天RSSから株価を取得する

題目通りのPython楽天RSSから株価を取得する(Cold Linkで取得)だが、

PythonからDDEにアクセスする処理は以下のURLを参考すればよいです。

http://code.activestate.com/recipes/577654-dde-client/

 

楽天RSSから株価を取得するロジック

前提条件

MarketSpeedにログインしアプリを立ち上げ、RealtimeSpreadSheetも起動しておくこと

def get_price():
stock_list = get_stock_list()
price_list = []
for topic in stock_list:
dde = DDEClient("RSS", topic)
if topic in ("N225", "TOPX", "JSD", "MTHR", "TSI2"):
price = {
"symbol": dde.request("指標コード").decode('sjis'),
"symbol_name": dde.request("指標名称").decode('sjis'),
"get_date": dde.request("現在日付").decode('sjis'),
"open_price": dde.request("始値").decode('sjis'),
"high_price": dde.request("高値").decode('sjis'),
"low_price": dde.request("安値").decode('sjis'),
"close_price": dde.request("現在値").decode('sjis'),
"volume": "",
"trading_value": "",
}
else:
price = {
"symbol": dde.request("銘柄コード").decode('sjis').strip(),
"symbol_name": dde.request("銘柄名称").decode('sjis').strip(),
"get_date": dde.request("現在日付").decode('sjis').strip(),
"open_price": dde.request("始値").decode('sjis').strip(),
"high_price": dde.request("高値").decode('sjis').strip(),
"low_price": dde.request("安値").decode('sjis').strip(),
"close_price": dde.request("現在値").decode('sjis').strip(),
"volume": dde.request("出来高").decode('sjis').strip(),
"trading_value": dde.request("売買代金").decode('sjis').strip(),
}
print(price)
price_list.append(price)
dde.__del__()

return price_list


# 株価取得銘柄一覧を取得します
def get_stock_list():
dde = DDEClient("RSS", "StockFind")
raw = dde.request("NULL").decode('sjis')
dde.__del__()

stock_lines = re.sub("^\n", "", raw).splitlines()
stock_list = []

for stock_row in stock_lines:
stock_cols = stock_row.split("\t")
stock_code = stock_cols[0]
if not (len(stock_code) == 5 and stock_code[-1] != "5"):
stock_list.append(stock_cols[0] + ".T")

# 指数も追加
stock_list.append("N225")
stock_list.append("TOPX")
stock_list.append("JSD")
stock_list.append("MTHR")
stock_list.append("TSI2")

return stock_list

 

処理の構成としては、

・銘柄一覧を取得 dde.requestはbyteでreturnされるのでsjisにdecodeが必要

・dde.__del__() が重要で、都度DDEを破棄しておくこと。

dde = DDEClient("RSS", "StockFind")
raw = dde.request("NULL").decode('Shift-JIS')
dde.__del__()
# 指数も追加
stock_list.append("N225")
stock_list.append("TOPX")
stock_list.append("JSD")
stock_list.append("MTHR")
stock_list.append("TSI2")

 

・銘柄一覧(stock_list)をFor文でぐるぐるまわし、各銘柄ごとに株価を取得

銘柄と指数では取得するitem名が異なるので注意が必要

 

for topic in stock_list:
dde = DDEClient("RSS", topic)
if topic in ("N225", "TOPX", "JSD", "MTHR", "TSI2"):
price = {
"symbol": dde.request("指標コード").decode('sjis'),
    else:
price = {
"symbol": dde.request("銘柄コード").decode('sjis').strip(),

 

すべて株価取得成功できればよいが、何個か取得失敗する可能性があるので、取れていない株価は再取得するロジックも必要かと思う。が、ここでは記述しない。

 

続き

Pythonで楽天RSSの株価取得するその2 - けんぞの投資関連ブログ