YY一下,睡梦指示器以及美梦制造器

中午小憩了一会,梦到来到一处仙境一样的地方,湛蓝的湖水、冰雕一样的树林、以及叫声悠扬婉转、外表色彩斑斓的不知名的鸟类在空中盘旋。我赶紧拿出手机打算咔咔咔拍照,这风景,一定要记录下来。结果手机调出相机界面,无论我如何点拍照按钮,都无法聚焦,于是我知道了,我这是在梦里呢。


(图源 :pixabay)

不知道是什么原因,在梦里我经常遇到几类事情:

  • 手机无法拨打出电话,无论怎么按,总是按错号码
  • 相机无法聚焦,无论风景多美,遗憾不能记录下来
  • 电梯发飙,飞速的上下,楼层高达成百上千层
  • 楼梯破损,经常遇到上不来下不去的尴尬情况

咱姑且不去讨论弗洛伊德的《梦的解析》,也不去研究神马《周公解梦》,这样的梦境发生的次数多了,我逐渐掌握了一项新技能,在梦里识别梦境——每次遇到上述情况,我便知道了这不是在现实中,这是梦里,于是我便可以已一个旁观者的角度来观察或者享受梦境,或者让自己醒来。这是不是很强大的技能?

但是呢,这个技能有一个BUG,就是有时候一些梦里,并不出现上述特征明显的事情,比如拍照,我只有看到极美的风景才想起调出相机,又比如只有遇到事情,才需要打电话。所以尽管我有强大的技能在身,但是有些梦境我却识别不出来。


(图源 :pixabay)

于是我就突发奇想,能能有个梦境识别装置呢?想了想,发现其实理论上应该很简单,我们完全可以监测和分析脑电波,然后匹配一些规则,符合某些条件的可以判断为梦境。为了避免误报,我们可以采集一些醒着时候的脑波数据,进行一些特征分析,这样区分是醒着还是睡眠时的脑波就很方便了。比如我们睡眠时的运动信号,是不发送给肢体的,也就是说梦里你在奔跑,但是实际上无论你梦里跑得多么欢实,实际上你还在躺着。多分析和利用这类区别,睡眠识别器应该可以达到很精准的地步。

我进一步脑洞大开,既然睡眠识别器可以实现,那么有没有一种可能实现个美梦制造器呢?比如通过给大脑一些电信号刺激,达到产生某种梦境的效果。这个听起来很有难度,但是如若实现了,可真的牛上天了。比如现在我们可能整天忙于工作,没有时间学习,那么我们可以通过梦境制造器连续制造某些专业课程的梦境。这样在梦里我们就可以吸收知识了。当然了,很多时候梦醒了,就忘了。但是既然我们破解了大脑电信号的秘密,那么实现深刻记忆也不是什么难事喽。


(图源 :pixabay)

还有,你是否没有时间旅游,那么梦境制造器帮你搞定,你只需选择一个目的地,然后安然入睡即可。一机在手,走遍天下,并且走遍山山水水,一点也不疲倦,而且还不用花费一分钱,是不是爽歪歪?或者你以第一视角的方式在梦里出演一部或者铁血或者柔情的电影,想想就令人很兴奋吧?

哎,YY了半天,就像以前我YY的各种工具和项目一样,我是根本实现不了,YY出来又有什么用呢?况且,也许写这篇文章的时候我正在梦中呢?又或者人生本来就是一场大梦,那么我在梦里YY造梦机,想想就是很可笑且可悲的事情,难道不是吗?


(图源 :pixabay)

用我很久很久以前发的朋友圈做结束语吧:

梦见自己醒来后想起梦里的事情倍感伤心放声痛哭。醒来后倍感伤心!


This page is synchronized from the post: YY一下,睡梦指示器以及美梦制造器

python-bitshares 边学边记 (七) / Block类

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

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

(图源 :pixabay)

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


Block类

创建实例

我们可以使用以下代码创建Block类实例
from bitshares.block import Block
block = Block(1)

读取指定区块

以下代码可以读取并打印指定区块内容
from pprint import pprint
from bitshares.block import Block
block = Block(1)
pprint(block)


这就是bitshares 2.0的创世块哦

显示指定区块的时间

通过上述讲解,我们已经知道了如何读取和打印指定区块内容
这个类还有个方法是显示指定区块的时间

比如对于创世块
block = Block(1)
print(block.time())


也就是bitshares2.0的创世块时间为:2015-10-13 14:12:24

找了一下旧闻: BitShares 2.0 to Launch on October 13th
果然没错哦。

在我写文章时,当前head_block_num为:22985850

读出对应的时间为:2017-12-26 12:25:24

注:知道了首块时间以及块间隔,我们应该可以反过来读取任意时间段的区块

返回指定区块可遍历的(键, 值) 元组数组

我们可以通过以下代码返回指定区块可遍历的(键, 值) 元组数组

1
2
3
block = Block(1)
for key, value in block.items():
print(key, value)

测试

有了上述的学习,我在想,我们是否读取指定时间段的区块呢?

假设有以下时间点:
时间点1(2017-09-01T00:00:00)
时间点2(2017-09-01T00:00:08)

那么我们能否获取这两个时间点之间的块呢?

思路

我的思路如下:

  • 获取创世块时间点
  • 计算时间点1与创世块时间点之间的差额
  • 通过时间差额以及块间隔计算出时间点前一个块的num
  • Num+1即为时间点1后的第一个块
  • 同理计算出时间点2前一个块
  • 这样我们就计算出了两个时间点之间的块

代码片段

1
2
3
4
5
6
7
8
9
from datetime import datetime
from bitshares.block import Block

dp_0 = Block(1).time()
dp_1 = datetime.strptime('2017-09-01T00:00:00', '%Y-%m-%dT%H:%M:%S')
delta = dp_1 - dp_0
total_seconds = delta.total_seconds()
blocks = int(total_seconds / 3)
print(Block(1+blocks).time())

额,对应块时间为:2017-09-07 02:06:51,不是我们想要的: 2017-09-01T00:00:00
所以我的尝试以失败告终,就没必要进行下一步喽。

解决办法

上述代码之所以出现问题,是因为虽然块间隔约定为3秒,但是实际上出块时间可能会超过3秒,我们严格按照3秒来计算时间会有偏差的。那么有没有办法解决呢?我想到一个思路就是不断逼近。

大致意思是用创世块和时间点间隔,算出块A,用快A和时间点间隔算出块B,直到我们算出的块的对应时间临近我们的时间点。

具体代码就不贴了,其实我也就是试着玩玩而已。

总结

Block类可以用于方便的读取指定区块,同时可以通过time()方法返回指定区块的时间。用items方法指定区块可遍历的(键, 值) 元组数组。

另外文中我们测试了根据块间隔以及创世块时间计算指定时间段内的区块列表,通过测试,我们了解到实际块间隔(出块时间)不是严格的3秒钟。所以如果需要使用这种方法读取时间段内的区块列表,需要对代码进行修正。

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

参考信息


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

家和万事兴,梭了400枚和五纪念币

和字百度汉语释义的前三条:

  • 相安,谐调:~美。~睦。~谐。~声。~合(a.和谐;b.古代神话中象征夫妻相爱的两个神)。~衷共济。
  • 平静:温~。祥~。~平。~气。~悦。~煦。惠风~畅。
  • 平息争端:讲~。~约。~议。~亲。

无论哪条都是积极向上和谐美好的,而老一辈人更是总教育我们:


这些年和谐社会的宣传更是赋予了和这个字很特别的意义。总之,字就是很好很特别的一个字啦,


中国人民银行在2017年12月13日发行了2.5亿枚“和”字书法——楷书普通纪念币。我计划收藏一些,保值增值这些都无所谓,逢年过节给小辈们当零钱发,还能顺便给他们灌输一下家和万事兴等理念,一举多得啊。另外小时候,总羡慕别的小朋友有各种稀奇古怪的纪念币,咱也帮孩子收藏点。

结果因为那两天太累,睡觉睡过头了,错失预约的良机。于是只好通过银行的朋友弄了两盒,说起来倒是省却了熬夜预约以及排队兑换之苦,另外,原本每人限兑40枚,我这一下子搞了400枚,惭愧惭愧。

IMG_20171226_083547.jpg
来个特写,生产日期居然是2017年5月17日,还好没有保质期。五元每枚,每盒五卷,每卷40枚。

IMG_20171226_083635.jpg
和建军90周年纪念币对比一下,明显建军纪念币包装更精致。

懒得拆封,网上找个图给大家欣赏一下:


实物比这个漂亮多了,因为这个效果图没金属质感。


另外,bitshares当前价格是4.31


预计年底(2017年12月31日前)上到5元应该问题不大,这样就和我的和五纪念币一个价格喽。不过可以预测的是和五的升值潜力没法和BTS比,反正只梭了400枚,玩玩喽。想发家致富,还得梭BTS啊(投资有风险,仅供参考而已


This page is synchronized from the post: 家和万事兴,梭了400枚和五纪念币

python-bitshares 边学边记 (六) / Dex类

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

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

(图源 :pixabay)

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


Dex 类查询功能

创建实例

我们可以使用以下代码创建Dex实例
from bitshares.dex import Dex
dex = Dex()

手续费

以下代码可以用与显示bitshares区块链上各类操作的手续费
from pprint import pprint
from bitshares.dex import Dex
dex = Dex()
pprint(dex.returnFees())

返回的数据比较多,就不一一贴出来了。
如果是经常交易,我们可能会比较关注以下几项费用:

从上图可知,创建订单和取消订单都非常便宜,而撮合订单完全免费。
由此可见bitshares真的是良心交易所

抵押债仓

在学习Account类时,我们知道可以用如下代码查看指定用户的抵押债仓
account = Account("xxxxx")
pprint(account.callpositions)

其实,account.callpositions的实现如下:

调用的是Dex类的方法

当然,我们可以直接使用Dex类
from pprint import pprint
from bitshares.dex import Dex
dex = Dex()
pprint(dex.list_debt_positions("aaa"))

结果如上,和调用Account类callpositions属性,完全一致。

Dex 类借钱 & 平仓等

抵押(借入)

我们可以使用如下代码借入CNY或者其它智能货币资产
from bitshares.dex import Dex
from bitshares.amount import Amount
dex = Dex()
dex.borrow(amount = Amount(1, 'CNY'), collateral_ratio=2, account='test2018')

但是显而易见抵押率计算得不对

注:可能与账户是否借过钱等条件有关,具体原因需要阅读代码

在测试过程中,曾出现过如下错误:

bitsharesapi.exceptions.UnhandledRPCError: Assert Exception: enable_black_swan: Black swan was detected during a margin update which is not allowed to trigger a blackswan

注:我尝试用网页借款后,这个错误无法重现,可能和新账户有关,需要核实一下

平仓(还钱)

我们可以使用如下代码平掉CNY的抵押债仓
from bitshares.dex import Dex
from bitshares.amount import Amount
dex = Dex()
dex.close_debt_position(symbol='CNY', account='test2018')


可见我借入和平仓操作都很成功

其它操作

除了借入和平仓以外,我们还可以通过Dex类调整债仓或者调整抵押率
def adjust_debt(self, delta, new_collateral_ratio=None, account=None)
def adjust_collateral_ratio(self, symbol, target_collateral_ratio, account=None)
写的多了有点晕,怕写错了误导大家,就不多说了,需要的自己去看代码。

总结

Dex类主要提供了手续费、抵押债仓查询以及借钱、平仓、调整仓位、调整抵押率等操作。

但是在抵押率计算上似乎有一些问题,所以如果你需要在你的应用中使用Dex类,你应该先测试并核实是否存在问题后再将其应用到代码中。

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

参考信息


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

如何截取软件下拉菜单

不知道大家有没有遇到过这样的情况,在软件上点击下拉菜单,然后想截图,但是一点击截图工具,下拉菜单失去焦点,自动就缩回去了。这似乎变成了个无解的问题,让人头大。


(图源 :pixabay)

在N(N > 5)年以前,为了解决这个麻烦,我特意研究后,写了一篇教程《小技巧: 屏幕截图(截屏)工具如何截取(捕获)下拉菜单》。然而五年多的时间没用过这个功能,如何操作,我已经忘得一干二净了。前些天写文章需要截取下拉菜单,我找到我之前的文章,然而它的内容却变成了这个样子:

哎,论坛程序是13年前的,当初自己改过好多东西,后来PHP版本升级论坛出现过N种不兼容,每次升级改一次。不过最近两年累了倦了,就懒得改论坛程序了,结果变成这个样子了,引用一句歌词:我想哭却哭不出来!

言归正传,问题总得解决,看方法一的标题方法一:使用print screen+画图,这个简直太直观了。于是我就用这个方法截取的下来菜单。

但是,完成之后,问题来了,方法二是咋回事啊?我冥思苦想也没研究明白咋操作,突发奇想,网上搜索一下吧,结果却搜到了我丢到其它博客上的文章内容。看来,写点内容到处丢,真的是一个好习惯啊。



(图源 :pixabay)

方法一:使用print screen+画图

  • (1)打开要捕获的菜单
  • (2)按键盘上的print screen键(PrtScn)
  • (3)打开windows附带的画图工具(附件->画图)
  • (4)选择“粘贴”
  • (5)截取自己想要的部分即可

方法二:使用print screen+截图工具(Snipping tool)

  • (1)单击打开“截图工具”。
  • (2)打开截图工具后,按 Esc
  • (3)打开要捕获的菜单。
  • (4)按 Ctrl+PrtScn。
  • (5)单击“新建”按钮旁边的箭头,从列表中选择“任意格式截图”、“矩形截图”、“窗口截图”或“全屏幕截图”,然后选择要捕获的屏幕区域。

方法三:使用QQ截图

  • (1)打开QQ对话窗口
  • (2)打开要捕获的菜单
  • (3)按Ctrl+Alt+A
  • (4)右键保存

用方法三给我的软件截了图:

效果还不错,界面上有一处拼写错误大家请忽略,严重拖延症,已经拖了五年啦。



(图源 :pixabay)

放在自己 搭建的论坛上的文章出BUG了,尽管数据应该还在,但是懒得去修复。放在乱七八糟的博客里的文章还在还能访问和阅读,但是谁知道猴年马月就坏掉呢。

还是STEEMIT区块链好啊,大赞。


This page is synchronized from the post: 如何截取软件下拉菜单

Python PrettyTable 模块学习 (格式化打印内容)

今天在处理某些数据时,需要将数据显示出来。

结果我遇到一个问题,数据内容可以看成是一个表格,我在使用for循环逐行显示出来,显示出来的数据是这个样子:

好吧,如果我没有上年纪,眼睛又不花,并且有足够的时间和耐心,我觉得这数据还是有一点点意义的。但是如果遇到没有耐心的朋友,看到这坨数据,可能就会在心里不由自主地骂一句。

为了不被朋友骂,我将数据显示得漂漂亮亮的。那么如何才能让数据显示的漂亮一点呢?

放弃自己造轮子

我首先想到的是自己造轮子。比如说用\t,来分割数据。但是有时候一列里数据有长有短,那么可能有的需要\t两次,有的一次就够,那么我是不是要计算一下数据长度呢?短的就跳两次三次,长的则跳一次。然后是不是还有左对齐、右对齐的问题?那么我还是计算,然后通过在前边或者后边补空格实现对齐处理。还有加表头,分隔符等等等,好吧,我承认,我已经晕鸟。

既然自己造轮子,能力有限,造不出来,那么有没有现成的轮子可用呢?我记得无论是steempy还是uptick显示数据可都挺美观的。于是看了一下uptick中的代码,找到这样一句:
from prettytable import PrettyTable
原来它使用的是一个叫做PrettyTable的模块。

比如显示配置信息的时候:

代码看起来很简单嘛。

咱也试试

PrettyTable 安装以及使用

安装

使用以下命令安装PrettyTable
pip install prettytable

因为uptick已经帮我安装了这个,所以提示:

Requirement already satisfied: prettytable in ./venv/lib/python3.6/site-packages

使用

使用也很简单,我从这里找了个例子:

1
2
3
4
5
6
7
8
9
10
11
12
from prettytable import PrettyTable

# Initialize the object passing the table headers
t = PrettyTable(['A', 'B', 'C'])

t.align='l'
t.border=False

t.add_row([111,222,333])
t.add_row([444,555,666])
t.add_row(['longer text',777,'even longer text here'])
print str(t)

以上代码很好理解,先是导入模块设置表头,然后设置样式,然后逐行添加数据,然后显示。

Python3上需要把print str(t)改成print(str(t))
以上代码执行效果如下:

应用到自己程序里

学会了PrettyTable的使用以后,我就把它应用到我的代码里去。我的一坨内容终于变得漂漂亮亮了,你猜猜这是啥?

或许你看到我将PrettyTable应用到我的程序里很简单,实际上则是一波三折啊。

str转换

我的一坨代码之前都可以用print显示。但是将数据用t.add_row()的方式加进来以后,却提示出错。原因是print(var)会自动将其转换,而t.add_row([var1, var2])则不进行转换。

为了解决这个问题,需要进行类似t.add_row([str(var1), str(var2)])的处理。

格式设置

PrettyTable默认格式应该是居中,但是 Collateral和 Debt条目居中显示非常难以阅读。

于是我通过
t.align["Collateral"] = "r"
t.align["Debt"] = "r"
设置这两列为右对齐
然而无论我怎么试,它也不生效。我去搜索PrettyTable格式设置不生效,不起作用等等,搜了半天也没找到解决方案。

最后,当我打算放弃时,我发现原来是我一直在A.py上修改,然后运行的是B.py 😳

总结

  • 不要尝试自己制造轮子
  • PrettyTable 模块格式化打印内容非常简单简单好用
  • 遇到灵异事件时不要轻易放弃😳

参考链接

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


This page is synchronized from the post: Python PrettyTable 模块学习 (格式化打印内容)

Your browser is out-of-date!

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

×