2021年3月8日 星期一

CentOS Python 3.7 安裝方式

有些開發的程式在python 3.8的檔案套件不相容,例如pymssql,等。 所以如果不建置虛擬環境的話才特意安裝3.7版本的python 安裝流程如下
# 先進行yum套件的update
yum update -y

# 安裝相依性套件
yum install gcc openssl-devel bzip2-devel libffi-devel zlib-devel

# 下載python 3.7.9 source code
cd /usr/src
wget https://www.python.org/ftp/python/3.7.9/Python-3.7.9.tgz

# 解壓縮,並開始安裝
tar xzf Python-3.7.9.tgz
cd Python-3.7.9
./configure --enable-optimizations
make altinstall

# 刪除下載的檔案
rm -rf /usr/src/Python-3.7.9.tgz

# 確認是否安裝成功
python3.7 -V

2021年3月4日 星期四

Vertica Division by Zero Error

最近剛接觸Vertica DB,有一些SQL語法跟MySQL、MSSQL又不太一樣,最近遇到一個問題是。 當分母為0時會出現Division by zero的錯誤,查了一下文件解法如下。

# 這樣會出現錯誤
SELECT 1 / 0;

# 解法
SELECT 1 / NULLIFZERO(0);

# 另一種解法
SELECT 1 / NULLIF(0, 0);

2021年3月2日 星期二

股票抽籤申購爬蟲

經過多次熱門上市或上櫃的股票公開抽籤過期才發現沒填單,就想要一個自動爬蟲通知的系統。 爬蟲簡易程式碼如下,這個爬蟲可以搭配自動發送Email或是line api或是telgram api

import requests
import time
import pandas as pd
from io import StringIO
from datetime import datetime

now = datetime.now()
now = now.strftime("%Y/%m/%d")
# 把要取資料的年份帶入
url = "https://www.twse.com.tw/announcement/publicForm?response=csv&yy={0}".format(now[0:4])
# 用request 套件抓取網頁
res = requests.get(url)
res.encoding='big5'
# 用pandas讀取csv檔案
df = pd.read_csv(StringIO(res.text), header=1)

select_df = pd.DataFrame(df)
select_df = select_df[:len(select_df)-5]

print(select_df)

msg = ""

for index,row in select_df.iterrows():
    try:
        ldate = row['抽籤日期']
        name = row['證券名稱']
        market = row['發行市場']
        begindate = row['申購開始日']
        enddate = row['申購結束日']
        dollor = row['承銷價(元)']

        ldate = ldate.replace(ldate[0:3],str(int(enddate[0:3]) + 1911 ))

        begindate = begindate.replace(begindate[0:3],str(int(begindate[0:3]) + 1911 ))
        enddate = enddate.replace(enddate[0:3],str(int(enddate[0:3]) + 1911 )) 
			
       # 組成要發送訊息的格式,如果申購時間還沒過期就可以準備要發送
        if(now < enddate):
            msg += """{0} {1} {2} {3} {4} {5}\n""".format(ldate, begindate, enddate, name, market, dollor)
        else:
            msg += ""
    except:
        print("error")

print(msg)

2021年2月26日 星期五

美金匯率黃金交叉買點分析

最近台幣走強,順勢來分析一下美金的SMA黃金交叉買點情形。 首先資料來自台灣銀行的3年美金歷史價格。網址如下;https://rate.bot.com.tw/xrt/quote/l3y/USD 程式碼如下:

import pandas as pd
import matplotlib.pyplot as plt
import datetime as dt
df = pd.read_csv('data.csv')
df.index = pd.to_datetime(df.index, format='%Y%m%d')
sma20 = df['現金'].rolling(20).mean()
sma60 = df['現金'].rolling(60).mean()

entries = (sma20 > sma60) & (sma20.shift() < sma60.shift())
exits = (sma20 < sma60) & (sma20.shift() > sma60.shift())

df['現金'].plot()
plt.plot(sma20)
plt.plot(sma60)
entries.astype(int).plot(secondary_y=True)
exits.astype(int).plot(secondary_y=True)
plt.show()

2021年2月25日 星期四

Python加密貨幣爬蟲實戰

# 套件安裝
pip install finlab_crypto

# 程式碼開始
import finlab_crypto
import matplotlib.pyplot as plt

# 初始化,會產生相關資料夾
finlab_crypto.setup()

# 取得歷史數據,設定時間頻率
ohlcv = finlab_crypto.crawler.get_all_binance('BTCUSDT', '4h')

# 取得收盤價
close = ohlcv.close

# 取出兩條均線

sma20 = close.rolling(20).mean()
sma60 = close.rolling(60).mean()

plt.plot(close)
plt.plot(sma20)
plt.plot(sma60)
plt.show()

2019年9月3日 星期二

新視窗關閉時 更新 主視窗

寫前端網頁常有需求是開啟的新視窗關閉時,主要視窗要重新取得資料。
有一段JavaScript做法如下,只要寫在子視窗:


 window.onunload = refreshParent;
 function refreshParent() {
  window.opener.location.reload();
 }


#同廠加映,母視窗開起子視窗的語法

$(function () {
  $("#divid").on('click',function(){
    var currentRow=$(this).closest("tr");
    var col1=currentRow.find("td:eq(0)").text();
    var col2=currentRow.find("td:eq(1)").text();
    var col3=currentRow.find("td:eq(2)").text();

    var col4=currentRow.find("input:eq(0)").val();
    // var data=col1+"\n"+col2+"\n"+col3+"\n"+col4;
    // alert(data);
    $.get("FunctionSnmp.php", {sid: col4, system: 'cctv'},
      function(data) {
          alert(data);
          // $.unblockUI();
    });
  });
})

2019年8月29日 星期四

sum 運算子的運算元資料類型 nvarchar 無效。

當我們要對SQL中進行運算,如MAX、MIN、SUM,等等。
而當預計算的欄位是NVARCHAR或VARCHAR就會出現類似以下錯誤訊息。
sum 運算子的運算元資料類型 nvarchar 無效。

調整SQL語法如下:

SELECT c1,c2,c3,sum(c4) from tb1 group by c1,c2,c3

##修改如下
SELECT c1,c2,c3,Sum(isnull(cast(c4 as float),0)) from tb1 group by c1,c2,c3

2019年8月26日 星期一

PHP curl 呼叫API用法

curl 是我們常見的Linux指令,主要的功能為利用URL語法在命令列下工作的檔案傳輸工具。
也常用於API的基本驗證,當然還有Postman

而在php軟體開發,呼叫API URL,php本身就提供這樣一個好用的函式庫,操作方式如下。


$url = "http://127.0.0.1:8080/api";
$curl_handle=curl_init();
curl_setopt($curl_handle, CURLOPT_URL, $url);
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handle, CURLOPT_USERAGENT, 'PHP Agent');
$jsonresult = curl_exec($curl_handle);
curl_close($curl_handle);

##取得json,例如json格式{'resultcode':'OK'}
$result = json_decode($jsonresult);
##取得某個json字串或變數
$result->resultcode ###此段取回的結果就是OK字串

2019年8月22日 星期四

this is incompatible with sql_mode=only_full_group_by 解決方式

當MySQL 5.7版本後,如果使用group by指令沒有包含所有查詢的欄位會出現以下錯誤訊息:

this is incompatible with sql_mode=only_full_group_by
最有效的方法為修改my.cnf,常見的路徑在/etc/my.cnf
但後續有些linux版本把設定拆開,例如ubuntu實際修改位置如下:

/etc/mysql/mysql.conf.d/mysqld.cnf
####在以下位置加入
[mysqld]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

2019年8月20日 星期二

Python pysnmp 簡介

之前在開發Java監控Server需要用到snmp套件是使用snmp4j
在.net(C#)是使用SNMPSharpNet
今天則是記錄Python上找了一下比較方便的套件pysnmp
官方網站如下:http://snmplabs.com/pysnmp/index.html

基本的snmpget、snmpset 操作說明如下

###套件安裝
pip install pysnmp

###把snmpget包裝成一個方法呼叫

from pysnmp.hlapi import *
from pysnmp.entity.rfc3413.oneliner import cmdgen
from pysnmp.proto import rfc1902

ip = '127.0.0.1'
oid = "1.3.6.1.2.1.2.2.1.8.1"
result = snmpget(ip,oid)

def snmpget(ip,oid):
    errorIndication, errorStatus, errorIndex, varBinds = next(
        getCmd(SnmpEngine(),
            CommunityData('private'),
            UdpTransportTarget((ip, 161)),
            ContextData(),
            ObjectType(ObjectIdentity(oid)))
    )

    if errorIndication:
        print(errorIndication)
    elif errorStatus:
        print('%s at %s' % (errorStatus.prettyPrint(),
                            errorIndex and varBinds[int(errorIndex) - 1][0] or '?'))
    else:
        for varBind in varBinds:
            return(str(varBind).split('=')[1])


###snmpset用法,此方法為一次設定兩個OID

from pysnmp.entity.rfc3413.oneliner import cmdgen
from pysnmp.proto import rfc1902

cmdGen = cmdgen.CommandGenerator()

errorIndication, errorStatus, errorIndex, varBinds = cmdGen.setCmd(
 cmdgen.CommunityData('private', mpModel=0),
 cmdgen.UdpTransportTarget(127.0.0.1, 161)),
 ('.1.3.6.1.2.1.0.1.1', rfc1902.Integer(1)),
 ('.1.3.6.1.2.1.0.1.2, rfc1902.Integer(1))
)


若有問題都歡迎討論,謝謝。

2019年8月19日 星期一

Python Link MSSQL use pymssql

之前有說明過,並且在實際的程式連結MSSQL資料庫使用Python模組pyodbc。

結果發現要轉移Server或是轉移到Linux上相當不方便,因為除了pip要重新安裝外還要安裝ODBC的Driver。

因此近日改為使用pymssql套件來連結。
###首先安裝pip套件
pip install pymssql

###程式使用
import pymssql

conn = pymssql.connect(server='127.0.0.1', user='username', password='password?', database='default db')  
cur = conn.cursor()

res1 = ""
res2 = ""
res3 = ""

###Insert 用法
sql = """INSERT INTO test (c1,c2,c3) VALUES ('{0}','{1}','{2}');""".format(res1,res2,res3)
        
cur.execute(sql)
conn.commit()

###Select 用法

sql = "SELECT * FROM test"
cur.execute(sql)
data = cur.fetchall()

for row in data:
    c1 = row[0]
    c2 = row[1]
    c3 = row[2]

若有任何問題都歡迎討論

2018年5月27日 星期日

PHP sqlsrv driver Error Message:Warning: sqlsrv_query() expects parameter 1

當正確下載對應的php sql server driver在windows上面後,也放到php ext資料夾。

結果卻出現Warning: sqlsrv_query() expects parameter 1,很有可能就是ODBC Driver沒裝。

ODBC Driver
https://www.microsoft.com/zh-TW/download/details.aspx?id=36434


2018年4月30日 星期一

python 安裝 TA-Lib

最近使用python做相關的財經分析,需要使用到TA-LIB該套件進行繪圖。
如果正常的python -m pip install TA-Lib
會出現以下錯誤訊息等等:
talib/_ta_lib.c(524): fatal error C1083: Cannot open include file: 'ta_libc.h': No such file or directory
雖然官網有教學如何compile解決,但方法頗為複雜
https://github.com/mrjbq7/ta-lib
最後看最簡單的方法就是下載
Microsoft Build Tools 2015
https://www.microsoft.com/en-us/download/details.aspx?id=48159
接著再重新安裝就好了

2018年4月16日 星期一

python odbc 連結 mssql

Python可以用odbc的方式來連結MS SQL,但是需要下載相關的Driver與pip安裝套件。

ODBC相關Driver
https://docs.microsoft.com/zh-tw/sql/connect/odbc/download-odbc-driver-for-sql-server

如果要引用哪個版本則選擇哪個版本的Driver(11、13、17 etc..)

python則要安裝 pyodbc

python -m install pyodbc

接著就可以使用以下的語法開始使用



conn = pyodbc.connect(
  r'DRIVER={ODBC Driver 11 for SQL Server};'
  r'SERVER=10.10.0.231;'
  r'DATABASE=dbname;'
  r'UID=username;'
  r'PWD=password'
  )

cursor = conn.cursor()

cursor.execute("DELETE FROM " + tb_name)
conn.commit()

2018年4月14日 星期六

Python 取得目前小時用法

有時候程式的需求是讓在某幾個小時例如9點、14點、20點發送通知,但是windows的排程僅能每隔多久發送一次(5分鐘、30分鐘、1小時)。
所以想出利用當前的小時來進行判斷。


import datetime 
x = datetime.datetime.now()
if x.hour == 9 or x.hour == 14 or x.hour == 20: #相關運用

2016年7月20日 星期三

Linux Static Route 檔案作法

一般如果我們要在Linux上面有兩個interface讓其可以連同內部網路與外部網路,通常會一個設定gateway另外一個不設定。然後利用static route的方式來進行。

通常可以使用route add指令來進行新增,但缺點是重新啟動後,routing消失。除非設定一個shell讓開機執行。

因此我們可以設定在檔案裏面:

/etc/sysconfig/network-scripts/route-ethX
如:
/etc/sysconfig/network-scripts/route-eth1

設定內容如下:
192.168.0.0/19 via 192.168.81.254 dev eth1
172.21.0.0/16 via 192.168.81.254 dev eth1
172.22.0.0/16 via 192.168.81.254 dev eth1
172.23.0.0/16 via 192.168.81.254 dev eth1
172.24.0.0/16 via 192.168.81.254 dev eth1

172.25.0.0/16 via 192.168.81.254 dev eth1

2016年7月3日 星期日

windows 工作排程器簡易說明

Windows 工作排程器是屬於最方便應用的排程程式自動執行的方式。 從以前的xp => 2003 => 2008 => 2012,都有一些改進。 然而在設定上也一些小細節我也是最近才特別注意到:








如果我們像圖片一樣勾選,這樣無論我們設計的是GUI或是主控台程式都會丟到類似背景執行無法看到程式卡在哪裡??(當程式出現:此例項工作已經在執行中...)

如果我們想要讓程式可以在前台執行就要勾選只有使用者登入才執行。(鎖定windows也會執行)

另外建議勾選部要儲存密碼,才可以不用每設定完成一個排程就要輸入密碼驗證。

還有當電腦名稱重設時,排程也會因為參考到舊的主機名稱而失效....需重新設定。

2016年6月14日 星期二

C# 讀取Excel File並導入SQL

其實一般要用C#讀取EXCEL可以用oledb,但是我發現Github有人撰寫的.net dll更方便於是紀錄一下。
Excel DataReader


public void loadEachXls(string areaTB, int sheet)
{
// Excel 檔案位置
String tmpfilePath = ConfigurationManager.AppSettings["tmpfilePath"];
string filePath = tmpfilePath;

// 你要抓取 Excel檔裡的工作表名稱
//string set = "工作表1";

// 讀取 Excel檔案
FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read);

// 創建讀取 Excel檔
IExcelDataReader excelRead = ExcelReaderFactory.CreateOpenXmlReader(stream);

// 將讀取到 Excel檔暫存至內存
DataSet result = excelRead.AsDataSet();

// 獲得 Excel檔的行與列的數目
int columns = result.Tables[sheet].Columns.Count;
int rows = result.Tables[sheet].Rows.Count;

using (SqlConnection cn = new SqlConnection("server=10.10.0.x;Connection Timeout=10;MultipleActiveResultSets=True;database=CMTS;uid=xxxxx;pwd=xxxxxxxxxx"))
{
 cn.Open();
 String deleteMac = "truncate table CMTS.[dbo]." + areaTB;
 SqlCommand cmd = new SqlCommand(deleteMac, cn);
 cmd.ExecuteNonQuery();

 cmd.CommandText = @"insert into CMTS.dbo." + areaTB + " (sid,bsr,node,area,penetration) VALUES (@v1,@v2,@v3,@v4,@v5)";

 // 將資料讀取出來
 for (int i = 1; i < rows; i++)
 {
  for (int j = 0; j < columns; j++)
  {
   string data = result.Tables[sheet].Rows[i][j].ToString();

  }
  cmd.Parameters.AddWithValue("@v1", result.Tables[sheet].Rows[i][0].ToString());
  cmd.Parameters.AddWithValue("@v2", result.Tables[sheet].Rows[i][1].ToString());
  cmd.Parameters.AddWithValue("@v3", result.Tables[sheet].Rows[i][2].ToString());
  cmd.Parameters.AddWithValue("@v4", result.Tables[sheet].Rows[i][3].ToString());
  cmd.Parameters.AddWithValue("@v5", "");
  cmd.ExecuteNonQuery();
  cmd.Parameters.Clear();
 }
 // 讀取完後一定要關閉
 excelRead.Close();
}

}

2016年6月2日 星期四

rrdtool dump 簡單說明

Cacti 的基本工具就是rrdtool,當然MRTG是更基本的東西。 當在往管領域運用時如果要Polling大量的設備或是不同的OID時,如果使用Cacti一個樣板慢慢設定可能會瘋掉,於是就需要使用net-snmp搭配shell自行收集snmp回傳的數值再來畫圖。 然而有時候我們會有分析數據的需求又要重rrd的檔案轉到資料庫或是文字檔,有人會使用rrdfetch來取資料,但實際使用會有一些NaN的狀況,尤其是在流量判斷上會造成斷線的誤判,所以改成使用rrdtool dump會是一個比較好的方式。語法如下。

# rrdtools
 /usr/local/rrdtool/bin/rrdtool dump c7606nm02-G1-09H.rrd > test.xml

2016年6月1日 星期三

SQL DBCC

DBCC 依照微軟官方的解釋為:維護資料庫、索引或檔案群組的作業。但其實當我們進行大量的資料刪除時可以使用DBCC指令釋放空間。 DBCC CHECKDB 的檢查與修復對象是指定的資料庫。 DBCC CHECKTABLE 的檢查與修復對象是指定的資料表或索引檢視表。 i.g. DBCC SHRINKFILE('dbname',10) 其他詳細指令可以參考官方網站:https://msdn.microsoft.com/zh-tw/library/ms188796(v=sql.120).aspx

CentOS Python 3.7 安裝方式

有些開發的程式在python 3.8的檔案套件不相容,例如pymssql,等。 所以如果不建置虛擬環境的話才特意安裝3.7版本的python 安裝流程如下 # 先進行yum套件的update yum update -y # 安裝相依性套件 yum install gcc o...