惊喜,新股申购中了个签😀

前些日子和大家分享了更换券商的经历,之所以换券商是老券商的新股申购太麻烦了,还容易出错,我以前就闹过这样的乌龙,Made a big mistake / 搞了个大乌龙,申购申购输错代码买成了别的股票。


(图源 :pixabay)

因为老券商新股申购特别麻烦,每次我都要去找当日的新股代码,然后小心翼翼的在券商的软件里核对N次,确定没有输错代码,我才会按确定购买。这真是一朝被蛇咬十年怕井绳啊。也是因为太麻烦,所以大多时候我都是懒得去申购了,这样也就导致了我很久没有中签了。

换了券商以后,因为他们提供新股一键申购,每天交易时间空闲时,我就随便按几下就完成了申购,反正很方便,万一中签了呢。不过因为很久没中过了,我都没有抱任何指望。

今早手机在身边的时候,短信声想起,随便瞄了一眼,咦,什么,啊,竟然是通知我中了一个签,让我留存足够的资金。

网上查了一下这个股票的中签率以及价格等信息。

中签的股票是红星美凯龙,网上的介绍信息如下:

公司是国内经营面积最大、商场数量最多以及地域覆盖面最广阔的全国性家居装饰及家具商场运营商。截至 2017 年6 月30 日,公司在国内28 个省份150 个城市经营了214 个商场(总经营面积约为13,296,491 平方米),包含69 个自营商场(总经营面积约为5,327,755 平方米)及 145 个委管商场(总经营面积约为7,968,737 平方米),商场品牌库拥有19,000 多个产品品牌。

我们这边也有红星美凯龙的商场,我还在里边买过东西,感觉和居然之家不相上下。其实根本不用去考虑公司业绩啥的,一般来讲新股中签就好比彩票中奖,都是稳赚的,十个八个涨停板轻松。

再看看中签率:

公告显示,本次网上发行有效申购户数为1458.7户,有效申购股数为2279.76亿股,网上发行初步中签率为0.04145180%。配号总数为2.28亿个,号码范围为100000000000-100227975615。

由于网上初步有效申购倍数为2412.44倍,高于150倍,发行人和保荐人(主承销商)决定启动回拨机制,将本次发行股份的60%由网下回拨至网上。回拨后,网下最终发行数量为3150万股,占本次发行总量的10%;网上最终发行数量为28350万股,占本次发行总量的90%。回拨机制启动后,网上发行最终中签率为0.12435540%。

神马回拨机制我不懂的啦,但是中签率0.12435540%还是能看懂的,约千分之一的中签率还是蛮高的,难怪中签啦。

网上查询到的,每股发行价为:10.23元,不高不低,我倒希望它越贵越好😀,因为越贵涨得越多!

网上查到的中签号,快来看看你中了吗?

看来,没事就要多换换多动动,原本不爽原来的老券商,这么一换一动,就爽了。新股以后还是要继续申购呀,反正现在也不费什么劲。免费的彩票,不要白不要啊😀

相关链接


This page is synchronized from the post: 惊喜,新股申购中了个签😀

如何在Linode VPS (Ubuntu 16.04 LTS )上安装 Python 3.6.4

在我之前的和steem以及bitshares相关的系列文章中,不少代码使用的Python语言。

在我的Linode VPS 上,有两个版本的Python,分别是Python 2.7.12以及Python 3.5.2,但是作为一个有强迫症的半吊子程序员,总是希望折腾最新的版本。尽管新版本的先进功能和特性我可能几乎都用不到甚至不知道,但是这又有什么关系呢?

言归正传,我们来讲讲怎么在Linode VPS 上安装 Python.


(图源 :Bing(http://bing.com))

对了,说一下,我的VPS的OS是Ubuntu 16.04 LTS
如何购买和安装VPS这里就不再赘述啦。

安装前的准备

在编译和安装Python之前,我们需要进行一些准备工作。

更新系统

指令如下:
sudo apt-get update
sudo apt-get upgrade

安装必要的软件包

指令如下:
sudo apt-get install build-essential libsqlite3-dev sqlite3 bzip2 libbz2-dev libssl-dev openssl libgdbm-dev liblzma-dev libreadline-dev libncursesw5-dev

有些软件包不安装Python也能编译通过,但是当我们需要使用某些模块时,可能就会出诡异的事情啦,比如说在此处省略libsqlite3-dev sqlite3,那么使用时将会出现sqlite3无法导入(virtualenv下)错误,到时候唯一的办法是回头重新编译,那可是大费周折。我可是折腾好久才整明白这个问题的。为了一劳永逸,此处都多费点功夫啦。

创建目标目录

你可以放任何目录啦,其实我也是瞎放的
指令如下:
sudo mkdir /opt/python
sudo chmod 777 /opt/python

编译并安装Python

去Python官方查看当前最新Releases版本,要搞当然就搞最新版本啦。

Latest Python 3 Release - Python 3.6.4

下载Python 3.6.4 的安装包

我们可以在此处获得最新版本代码的下载链接:https://www.python.org/downloads/source/
使用wget 下载代码包
指令如下:
wget https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz

解压安装包并进入目录

指令如下:
tar xzvf Python-3.6.4.tgz
cd Python-3.6.4/

执行配置,设置安装目标目录

我就是随便配配啦。
指令如下:
./configure --prefix="/opt/python/3.6.4/"
可以使用./configure --help查看更多的配置选项

编译

配置成功后就可以编译啦
指令如下:
make

安装

在VPS上build是超级快啦,大约一盏茶的功夫,就编译完啦,当然了,这个一盏茶的功夫取决于你是细细品味还是一饮而尽。如果你觉得不够快,就换高级别的VPS啦。

看,我打完上边的两排字,Python就编译完成了,接下来安装即可。
指令如下:
make install

测试

一切顺利的话,我们就完工啦。
但是还是测试一下比较放心。

启动交互环境:
/opt/python/3.6.4/bin/python3

耶,一切正常,成功安装。
现在来和大家打个招呼吧

半吊子程序员也有职业病,见谅见谅。

参考链接


This page is synchronized from the post: 如何在Linode VPS (Ubuntu 16.04 LTS )上安装 Python 3.6.4

python-bitshares 边学边记 (九) / Memo类

在之前的几篇文章中,我们简单介绍了如何安装python-bitshares 、python-bitshares的钱包相关操作、BitShares类以及Account类、Market类、Dex类、Block类、Blockchain类。

详情可以参考文末的参考链接。

(图源 :pixabay)

这节我们来继续学习python-bitshares 。


Memo类

创建实例

我们可以使用以下代码创建Memo类实例
from bitshares.memo import Memo
m = Memo("from_account", "to_account")

其中:

  • from_account: 发送Memo的账户
  • to_account: 接收Memo的账户

因为Account类实例可以由帐户名创建,也可以由账户ID创建,所以我们可以传入类似test2018或者1.2.534782的形式。

加密Memo

加密Memo即将明文信息转换成为密文,我们可以使用encrypt方法加密Memo
from pprint import pprint
encrypted_msg = m.encrypt("foobar")
pprint(encrypted_msg)

加密Memo需要首先导入from_account的active key或者memo key,否则会出如下错误提示:

raise MissingKeyError(“Memo key for %s missing!” % self.from_account[“name”])
bitshares.exceptions.MissingKeyError: Memo key for test2018 missing!

导入私钥后重新执行上述代码:

解密Memo

加密Memo即将密文信息转换成为明文,我们可以使用decrypt方法解密Memo
plaintext_msg = m.decrypt(enc)
print(plaintext_msg)

解密Memo需要首先导入to_account的active key或者memo key,否则会出如下错误提示:

raise MissingKeyError(“Memo key for %s missing!” % self.to_account[“name”])
bitshares.exceptions.MissingKeyError: Memo key for oflyhigh-bts missing!

导入私钥后重新执行上述代码:

解密出来的内容和我们加密的内容是一致的。

测试

为了验证我们上述学习的内容,我使用测试账户转账并附加Memo

在活动记录中我们看到的操作信息以及明文Memo为:

在区块链浏览器上我们查看到的原始信息为:

1
2
3
4
5
6
7
8
9
10
from bitshares.memo import Memo
m = Memo("1.2.534782", "1.2.170436")
enc = {
"from": "BTS6Eq6kGgYRuujDpFtYduCAjdgMfvkHZ3f8SbHVmsjSC9HgCnxFt",
"message": "33b980c72e22f942454a8ae6b6740a54",
"nonce": "387853483215441",
"to": "BTS8HbXtZPbLACch1pvfrZEPH2xbt74VMPMD4ZSZwYeT96jwkpHFo"}

plaintext_msg = m.decrypt(enc)
print(plaintext_msg)

运行结果如下:

和我们输入的信息一般无二哦😀

总结

Memo类提供了bitshares区块链Memo信息加密和解密的方法。本文通过实例介绍了如何使用Memo类加密消息以及解密Memo。

在文末,本文以一个实际的例子来验证Memo类的功能。

文中信息仅供参考,使用文中代码造成损失概不负责!

参考信息


This page is synchronized from the post: python-bitshares 边学边记 (九) / Memo类

又遇灵异事件 —— python-bitshares 升级啦

在以往python-bitshares文章中,我都是一遍读github上的代码,一边进行学习和测试。但是这两天用到Asset类,却遇到一个麻烦。


封面图源:https://pixabay.com

灵异事件

python-bitshares在github上的代码中有如下代码:

光看代码很好理解,一个是读取资产的符号,一个是读取资产的精度

但是我测试这两个属性时,却遇到错误。

1
2
3
>>>from bitshares.asset import Asset
>>>asset = Asset("CNY")
>>>print(asset.precision)

或者

1
2
3
>>>from bitshares.asset import Asset
>>>asset = Asset("CNY")
>>> print(asset.symbol)

这让我如何也理解不了,明明代码中存在两个属性,为啥执行就报不存在呢?这不科学呀,在各大引擎找了半天,有说让删除缓存文件的,有说是命名和已有模块冲突的,但是怎么对照也感觉不像,明明就是灵异事件

想到前些天在《Python PrettyTable 模块学习 (格式化打印内容)》这个帖子中也曾遇到过灵异事件,最后检查的结果是我编辑文件A,运行文件B。我因此得出结论:遇到灵异事件时不要轻易放弃😳

那么这次灵异事件也是我哪里搞错了吗?

python-bitshares 升级啦

我挠头发、拍脑瓜,怎么也没觉得我弄错什么。揉了揉太阳穴、深呼一口气,还是先看看我今天早晨发的steemd节点升级里别人给我的回复吧。等等,我灵光一闪,升级?会不会是python-bitshares升级了呢?

于是看了一下github库里的信息

OMG,果然,python-bitshares 6天以前发行了新版本: 0.1.9

按github上的升级指令升级一下,结果提示我:

You must give at least one requirement to install (see “pip help install”)

这又是什么鬼?看提示是说我至少要告诉它我要安啥!我难道没告诉它吗?仔细一下,果然没告诉。再一对照,官网给的更新指令就没给目标:看来,适度动脑还是很有必要的,将指令改为:pip3 install --upgrade bitshares,更新成功。

测试

再来测试一下

一切正常。

总结

  • python-bitshares 已经升级至 0.1.9
  • 升级指令: pip3 install –upgrade bitshares (我使用的virtualenv无需加–user)
  • 灵异事件被证实还是我的问题 (没及时更新版本)

另外,需要注意的是,如果你有应用使用python-bitshares以前版本,那么升级前请务必检查程序的兼容性,如果不确定是否兼容,并且原来的程序都还好用,那么不必急着升级。这个和api节点那个不一样,那么你不升级就没法用啦。

一天遇到两起升级事件,我也是醉啦😳😰


This page is synchronized from the post: 又遇灵异事件 —— python-bitshares 升级啦

重要提示: 节点 steemd.steemit.com 将于1月6日停止使用,请及时切换至 api.steemit.com

在我以前不少文章的示例代码中,我都用到了 steemd.steemit.com这个官方的Full API Node,比如在《如何批量取消内部市场订单》中,我使用如下代码获取内部市场我的挂单:

curl --data '{"jsonrpc": "2.0", "method": "call", "params": ["database_api", "get_open_orders", ["xxxxx"]], "id": 1}' https://steemd.steemit.com

又比如在文章《如何查询 PowerDown Route>中,使用如下代码查询account_a的PowerDown Routes

curl --data '{"jsonrpc": "2.0", "method": "get_withdraw_routes", "params": ["account_a", 1], "id": 1}' https://steemd.steemit.com

另外在我的很多程序中,我同样使用了 steemd.steemit.com,比如文章《获取共同操作账户某个操作的真实操作者,附简单脚本 / Get real operator of a transaction made by the ID which operated by multi accounts, script attached》中提及的程序。我自己使用的程序中,我更是多处用到了节点 steemd.steemit.com

steemd.steemit.com将被关闭

但是,如果还在命令或者程序中使用节点steemd.steemit.com,那么1月6号以后,你的命令/代码将会无法正确运行了。

steemit官方的开发账号 @steemitdev 4小时以前公布了《关闭节点steemd.steemit.com的最后通牒》

从2018年1月6日起,节点steemd.steemit.com将正式关闭。

那么以后我们的程序就不好用了,或者只能找第三方节点了吗?当然不是,steemit官方开放了个新节点给大家使用:api.steemit.com

所以,请尽快将程序切换到新节点:api.steemit.com

如何切换至api.steemit.com

api.steemit.com不支持Websockets访问,只支持http/jsonrpc

如果你使用以下几个steem的库,它们都已经支持了http/jsonrpc

  • steem-js
  • steem-python
  • radiator
  • dsteem

那么你只要在代码中将节点从wss://steemd.steemit.com,替换成https://api.steemit.com,是不是超级简单?

其它未在此处说明的大部分库,应该都已经支持http/jsonrpc。如果用到了哪个steem库不支持http/jsonrpc或者你自己实现的使用websockets访问steem的代码,那么就需要动手改一下啦。

官方为何要切换节点

你可能会问,steemd.steemit.com用得好好的,为何要切换到api.steemit.com,答案是api.steemit.com不单单是一个STEEM Full RPC node,它应该叫jussi节点,它在steemd之上弄了个缓存层(caching layer),并包含了SDBS等其它服务。

包含缓存层的好处是不言而喻的,就好比给CPU或者硬盘加了个高速缓存。比如我们读取最新区块指令,每个应用访问steemd,都问一遍,原本的操作是steemd去查询区块链,获取此项信息。但是有了缓存层,缓存层每3秒读一次区块链,然后别的应用要求此项信息,缓存层直接答复就行了。是不是效率高了好多?

至于包含其它服务,更是让节点可以提供更多功能和便利。

总结

  • 节点steemd.steemit.com将于1月6日正式关闭
  • 请切换至新节点:api.steemit.com
  • 新节点使用http/jsonrpc,不再支持Websockets访问
  • 新节点(jussi节点)包含缓存层以及SDBS等其它服务

参考链接


This page is synchronized from the post: 重要提示: 节点 steemd.steemit.com 将于1月6日停止使用,请及时切换至 api.steemit.com

Python 计算程序CPU时间以及运行时间

昨天的帖子中,我提到通过改写bitCNY抵押率排行榜的实现代码来加快程序的处理速度。为了衡量程序改进前后的差异,我在代码中计算了一下程序执行时间,通过对比时间来判断效率提升了多少。


封面图源:https://pixabay.com

其实,计算代码执行时间是很简单也很常用的功能,但是对于我这个半路出身的程序员,尤其还是个记忆力不佳的程序员,每次都要查查文档或者参考一下以前自己写过的代码才能写出来。这种感觉很不好,于是我决定把这个整理一下记下来,这样下次我再用的时候,搜索一下steemit即可✌。

程序执行时间分为两种情况,一种是CPU时间,一种是运行时间。

CPU时间

CPU时间即程序占用CPU的时间,对于非程序员可能有点费解,时间就是时间还有啥运行时间和CPU时间呢?我举个简单的例子就懂了,比如我们每天上班要和电脑打交道,但是除了和电脑打交道的时间,我们还要在上下班路上浪费时间、中午去食堂吃饭浪费时间、接杯咖啡喝瓶可乐什么的要浪费时间、和美女同事聊天浪费时间、偶尔去趟厕所也要浪费时间、还有可能坐在座位上发呆也在浪费时间…… 也就是说,尽管你每天上班8个小时,但可能在电脑上工作的时间不超过一个小时。

对于程序而言也是一样,我们写一个程序开始执行,程序中可能有延时等待、可能有磁盘和网络IO操作、可能要等别的进程释放CPU占用等等,简而言之,它不是一直占用CPU的,而它实际占用CPU的时间就称之为CPU时间。

扯远了,在Linux系统下,Python程序中可以用下列代码计算程序占用的CPU时间:

1
2
3
4
5
import time
start = time.clock()
......
end = time.clock()
print("CPU Time: ", end - start)

但是呢,据说这个time.clock有点不好用(其实我觉得挺好啦),主要有两点:

  • Linux下和Windows下行为不一致。
    Linux不包含程序睡觉的时间,Windows下包含了睡觉时间;
  • 这个函数在Windows下精度更高,在Linux下精度不高。

所以在Python 3.3以后引进了两个新的东东

  • time.perf_counter(), benchmarking, most precise clock for short period
  • time.process_time(), profiling, CPU time of the process

感兴趣的自己看文末参考资料吧,我头有点大。

程序运行时间

在昨天的帖子中,我提到老版本的生成bitCNY抵押率排行榜程序生成100条记录需要105,而新版本的只需要3秒,这个时间就是我们从计时开始到计时结束所耗费的时间。

1
2
3
4
5
import time
start = time.time()
......
end = time.time()
print("Execution Time: ", end - start)

其中 time.time()获取当前时间戳,在Linux以及大多数系统下,时间戳是距离January 1, 1970, 00:00:00 (UTC)的秒数,其实我们取得是差额,基准是谁都无所谓啦。

测试

将上述代码应用到我们老版本的bitCNY抵押率排行榜程序中

1
2
3
4
5
6
7
8
9
10
11
12
13
start = time.time()
cpu_start = time.clock()
process_start = time.process_time()
perf_start = time.perf_counter()
......
end = time.time()
cpu_end = time.clock()
process_end = time.process_time()
perf_end = time.perf_counter()
print("CPU Time:", cpu_end - cpu_start)
print("Proc Time:", process_end - process_start)
print("Exec Time:", end - start)
print("Perf Time:", perf_end - perf_start)

输出结果如下:

同样的代码,代入我们新版本的程序中,输出结果如下:

由此可见我们的新代码无论从CPU占用还是执行时间上来讲,都得到了大幅改善。

参考内容


This page is synchronized from the post: Python 计算程序CPU时间以及运行时间

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×