每天进步一点点:custom_json & follow\unfollow\mute\unmute

我们都知道,HIVE上我们追随或者拉黑一个人,对应的操作是follow以及mute,相应的取消操作分别为muteunmute,实际上在链上,这些都是通过同一个操作实现的,那就是custom_json

image.png
(图源 :pixabay)

说到custom_json,那简直是一个百宝箱,可以配合链上/链下的应用实现好多功能,举例来说以前SE的好多功能都是用custom_json来实现的,还有现在的社区功能,也是基于custom_json的。

结构

custom_json的模板大致如下:

1
2
3
4
5
6
op_custom_json = ['custom_json', {
'required_auths': [],
'required_posting_auths': [],
'id': '',
'json': ''
}]

其中required_auths中需要填写需要ACTIVE授权的用户组,required_posting_auths填写需要POSTING权限的用户组,两者均可以留空,但是不能同时为空,相应的检查代码如下:

FC_ASSERT( (required_auths.size() + required_posting_auths.size()) > 0, "at least one account must be specified" );

id这个名字起的比较怪,我看到id就会以为它是一个数字,其实不然,id是一个字符串。在代码注释中,说id长度必须小于32个字符:

custom_id_type id; ///< must be less than 32 characters long

但是实际上,检查代码如下:

FC_ASSERT( id.size() <= STEEM_CUSTOM_OP_ID_MAX_LENGTH, "Operation ID length exceeded. Max: ${max} Current: ${n}", ("max", STEEM_CUSTOM_OP_ID_MAX_LENGTH)("n", id.size()) );

STEEM_CUSTOM_OP_ID_MAX_LENGTH定义为32,所以 id的最大长度实际上是32啦。

至于json就不用多说了,就是转化成UTF8编码字符串的JSON啦。

实现

知道了custom_json的定义,实现起来就比较简单了,下面是大致的实现逻辑:

给对应项赋值:

op[1]['id'] = id
op[1]['json'] = json.dumps(json_data)
op[1]['required_auths'] = required_auths
op[1]['required_posting_auths'] = required_posting_auths

追加进transaction,对其签名并广播:

trx.append_op(op)
trx.sign_digest(wif)
ret = trx.broadcast()

follow\unfollow\mute\unmute

有了custom_json,我们就可以实现follow\unfollow\mute\unmute功能了。

以@oflyhigh.test账户为例,几个操作对应JSON如下:

json_follow = ["follow",{"follower":"oflyhigh.test","following":"oflyhigh","what":["blog"]}]
json_unfollow = ["follow",{"follower":"oflyhigh.test","following":"oflyhigh","what":[]}]
json_mute = ["follow",{"follower":"oflyhigh.test","following":"oflyhigh","what":["ignore"]}]
json_unmute = ["follow",{"follower":"oflyhigh.test","following":"oflyhigh","what":[]}]

我们不难看出unfollowunmute其实是一样的,都是把what中的内容清空。

将上述json内容放入我们实现的custom_json函数中,就会实现对应的功能,比如:

client.custom_json("follow", json_data=json_follow, required_posting_auths=["oflyhigh.test"], wif=wif)

我分别调用了一下几个操作,有趣的是,因为json_unfollowjson_unmute本质上操作相同,tapos以及超时时间又完全一样,会被认为是重复操作:

image.png

所以加一个超时,让unfollowunmute的超时时间不同,就好了。

顺利执行后,在https://hiveblocks.com/上我们会看到类似如下的结果:

image.png

结束语

本文就扯到这里啦,至于如何用custom_json实现其它功能,其实都是大同小异,留给大家自己探索了。

另外,文中代码仅为参考,大家可以用hive-python或者beem等去玩转custom_json,我的库还不成熟,先不放出来献丑了。


This page is synchronized from the post: ‘每天进步一点点:custom_json & follow\unfollow\mute\unmute’

地摊经济 & 我们能卖点啥?

据说总理前段时间考察时指出:“地摊经济、小店经济是就业岗位的重要来源,是人间的烟火,和‘高大上’一样,是中国的生机。” 而近日发布的中央文明办全国文明城市测评指标中,已明确要求:“不将占道经营、马路市场、流动商贩列为文明城市测评考核内容。”

image.png
(图源 :pixabay)

这都意味着90、90年代火爆的地摊经济,将再次迎来它的春天。

说到摆地摊,我其实是相当有经验的,在我之前的文章中曾经写过,我很小的时候就和奶奶一起去集市上卖奶奶种植的秧苗、用甜杆的穗做的刷子、用成熟的葫芦做的小瓢等等。

那时候还没有城管,只有市场管理者,偶尔象征性地收几毛钱的所谓税钱,当然了,你若是不交也不会出现什么暴力执法事件,至少我和奶奶摆摊的时候没亲历过也没看到过。

除了摆摊,在小摊上我们也曾经淘到过许多物美价廉的日常生活用品,当然了还有各种美食之类的,所以小摊是我童年美好的回忆。

上大学的时候也曾经想搞过经赢,但是死守地摊等顾客上门好像不大现实,于是几个室友集资去批发市场购买了好多磁带,然后挨个寝室去推销,但是获利微薄,后来也就不了了之。

尽管经营失败,但是大学时候去附近逛地摊还是非常惬意的,那时候学校附近主要有两大地摊市场,一是学校东侧的夜市,主要卖些服装衣帽等;二是学校西南略远一点的旧货市场,每周末经营,说是旧货市场,但是卖什么的都有。

衣服鞋帽那个夜市,一般女同学爱逛,而我们男同学特别喜欢逛那个旧货市场,总能淘到一些新奇的好玩意,比如我曾经淘到过网球拍、臂力器,还曾经淘到过一把折叠刀。

说到这个折叠刀,还挺有趣,摊主地摊上摆了好多把各式各样的刀,我一下子就相中这把了。然后我和摊主开玩笑说我看某个同学不顺眼,准备买这把刀回去给他点教训,让摊主给我便宜一些。

摊主听闻后,死活不肯把刀卖给我,我后来和他说我是开玩笑的,他还是不肯相信,最后总算说服了摊主把刀卖我,他还一直对我千叮咛万嘱咐,千万不要拿去干傻事,真是一个好摊主啊。

再后来,超市越来越大、越来越多;再后来,网购越来越方便,越来越快捷。这些年我就很少逛地摊了。

大概去年的时候,我去大学的附近办事又恰逢周末,去的时候路过了当年那个旧货市场,突然引发了我的怀旧情绪,办完事情后特意赶赴那个旧货市场,打算看看能不能淘到些什么。

然而我到那发现,小商贩几乎没有几个了并且也正在收摊,而一大帮城管正在挨个劝离小贩,我和城管聊了几句,说是创城需要。既然是创城需要又是劝离,我也无话可说了,只好无奈的回家喽。

这次地摊经济兴起,摆摊的小贩们该挺直腰板了吧,城管也不会来劝离了吧,那样就是和国家政策对着干呢。另外听说京东推出“星星之火”地摊经济扶持计划,而苏宁也推出“夜逛合伙人”地摊夜市扶持计划,其它巨头也纷纷出招。

那么地摊经济最终会发展什么什么样呢?是变成另一个战场的电商大战?又或者拼杀后最终是一地鸡毛?还是真的再现八九十年代的地摊红火?就不得而知了。

image.png
(图源 :pixabay)

现在我考虑的是,要不要去凑个热闹也出去摆摆摊呢?再有就是如果出去摆摊,又能卖些什么呢?莫不成摆地摊叫卖虚拟货币?估计一个卖不出不说,还可能被当成传销诈骗抓起来吧?(^_^)


This page is synchronized from the post: ‘地摊经济 & 我们能卖点啥?’

看看花,看看景,放松一下

image.png

一定是在家里憋太久的缘故,不然为什么平时看起来很普通的花看着都显得那么艳丽,平时很普通的路边风景看着都那么醉人。所以平时还是要出来走走,那边只是家门口转转,也比长时间宅家中要好。

不过并非我不想多转转,而是5月实在是事情太多,让人焦头烂额,基本上每天都要忙到凌晨2-3点,忙碌紧张得近乎无法呼吸。

好在令人抓狂的五月已经过去了,6月尽管依然有大把的事情要做,但是可以松一口气了。有时想想为什么要让自己这么累,完全是没有必要的啊,完全可以过很放松很滋润的日子啊?

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

不过人生就是要努力奋斗嘛,不然整天过轻松的日子,那么又有什么意义呢?不过太紧张也不好,一张一弛,才是文武之道,所以偶尔看看花,看看景,放松一下,还是蛮好的嘛。

看着疫情似乎已经控制住了,是不是可以考虑市内游了?今年一个正经的景点都没去过呢。


This page is synchronized from the post: ‘看看花,看看景,放松一下’

每天进步一点点:配置文件 & appdirs

对于很多应用程序来讲,为了方便用户使用,都需要保存一些信息,比如配置信息、用户数据等等。这一般有几种方式,比如说配置文件、注册表、数据库等,本质上Windows中的注册表也是一种数据库。

image.png
(图源 :pixabay)

注册表

这几种方式我最不喜欢的就是注册表了,尽管注册表操作起来还是很简单的(RegOpenKeyExRegQueryValueExRegSetValueEx等),但是我总觉得,这样做应用程序就不是那么绿色环保了。

那些所谓的安全卫士等软件,很多也是靠清理垃圾注册表项才发家的,所以我觉得Windows应用越少写注册表越好,所以自己的程序也尽量避免。

配置文件

Windows下提供了很方便的配置文件操作API,主要有两个函数:GetPrivateProfileString以及WritePrivateProfileString

尽管文档中说了相关API只是为了兼容和保留,推荐使用注册表:

Note This function is provided only for compatibility with 16-bit versions of Windows. Applications should store initialization information in the registry.

但是Win10中,相关函数依然工作正常,我又不喜欢用注册表,那当然还是用它喽,比如我的字模程序,用着就好好的:

Python 中的配置文件

Python中简单一些配置文件,直接用普通的文件读写就搞定了(或者直接用py文件导入)。

略复杂配置的可以用configparser来实现,用起来还是超级简单的。

这里不做过多介绍了,大家感兴趣的话看文末链接文档就好。

用户/应用目录等

配置文件一般可以保存在和执行程序相同的目录,但是假设有N个在不同目录中的程序可能用到相同的内容,放到执行程序所在的目录就不是那么明智了。

Windows中可以选将一些设置和数据放到用户目录,比如说%USERPROFILE% %APPDATA% 等,这些目录可以通过环境变量获取,比如Windows如下命令:

echo %APPDATA%

就会返回:

image.png

在Windows程序中,则可以通过GetEnvironmentVariable函数获取。

appdirs

说了半天,这个才是重点,就是Linux环境下,Python怎么获取用户数据目录或者应用目录。

这就要用到appdirs这个模块了,其实这个模块在Windows下也能用,不过就不去探究了。

在Linux下,使用如下方式,就可以获取用户/应用对应的数据目录了:

from appdirs import user_data_dir
appname="cutehive"
appauthor = "oflyhigh"
config_dir = user_data_dir(appname, appauthor)

上述代码得到的目录路径为:

.local/share/cutehive

这样,我们就可以在对应的目录中愉快地写入配置文件、数据、数据库等内容了,而不必自己关心和维护路径信息了。

这样做还有一个好处就是,支持跨平台操作(Windows、MacOS等),然而对我而言,倒是暂时不需要考虑呢。

相关链接


This page is synchronized from the post: ‘每天进步一点点:配置文件 & appdirs’

把湖边度假当成海边度假

image.png

昨天下了一天一夜的雨,今天是一个大晴天,天空是那种醉人的蓝色,我觉得用碧空如洗可能不太恰当,因为这明明就是真的洗过的呀。

恰逢今天是儿童节,所以出来玩的人特别多,开车到湖边的大路上,我才发现今天来这里真不是个明智的选择,堵车了大半天,开进去也没有停车位,后来只好在路边停放了,好在这不是交通要道,大家都是这样停。

到湖边发现,那真是可以用人山人海形容了,放风筝的、滑旱冰、在水边玩水的、静静地看风景的,每个人都很快乐的样子,心情估计和这天气一样爽朗。

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

我随便选了几张照片发朋友圈,有朋友评论:“你这是去海边了?”还有朋友评论:“过出了夏威夷海滩的感觉”。

夏威夷海滩什么样我不知道,但是海边、海滩也去过好多次,这么一说,还真有点在海边的感觉呢。


This page is synchronized from the post: ‘把湖边度假当成海边度假’

虚惊一场

最近几个月,我用一张兴业银行的银行卡做OTC,原因嘛,就是想和别的银行卡分离开来,因为据说好多因为OTC被冻结的,我的工行卡也曾经被冻结一次,不想在把主要的卡片冻结了。

image.png
(图源 :pixabay)

因为这个兴业银行卡办了足足有十四五年,太久远以至于我都忘记当时办卡的时候是用的一代身份证还是二代身份证,手机网银APP开通时,总提示我什么身份信息不对之类的,不过不对就不对吧,我也没过多理会。

同样可能是因为身份证信息的缘故,当然也可能是没有做过风险评估的缘故,这个卡竟然买不了理财,更夸张的是有一次想给OTC的商家退款,发现这个卡竟然没法转账。

不过因为疫情的缘故,我实在是懒得去网点查询,不过好在这个卡ATM上能用,并且可以绑定微信使用,这样入账出账都没问题,就将就用着呗,一连用了几个月,也没啥问题。

前天一朋友圈微商夸她的芒果好,问我要不要来一箱,那就来一箱呗,于是用这张卡通过微信把芒果钱转给了这个微商,结果这个微商光顾着开心的与我聊天,竟然忘记收钱。

昨天发现微信上提示有一笔退款,发现芒果钱退回了银行卡,于是打算再次转给这个微商,人家忘收了,咱不能不给啊,毕竟做微商也挺不容易的。

结果用这个卡转账竟然提示卡片异常,无法转账,我第一个直觉就是因为OTC被冻结了,毕竟曾经有个卡片被冻结的经历,这几天也做过OTC交易。

不过我OTC交易选择的都是靠谱的商家啊,况且我看和我交易的几个商家,还在系统里挂单买卖呢,并没有跑路,所以未必就是真的被冻结,那么再有种可能就是因为身份证资料过期的缘故了。

不管是被冻结还是因为身份证资料过期,总归是要跑一趟银行的,于是乎开车导了一个最近的兴业银行过去,跑了大概4-5公里的路程,又费了半天劲找停车位,总算到了银行。

到了银行又是测体温又是扫健康码的,总算被放进去了,一个客服小妹问我办什么业务,我描述了一下的卡没法用微信了,她直接回复更新一下身份信息就好了。

于是小妹在柜员机上霹雳巴拉一通操作,又让我把口罩摘了对准镜头拍照,然后把卡片和身份证还给我,告诉我已经好了。我用微信发了一个红包出去,果然好了耶。

和小妹说我这张卡似乎没法买理财,小妹又在柜员机上一通操作,说帮我做风险评估,可是我根本一个选项都没选,都她刷刷刷帮我选完了,好吧,估计是为了节省时间,无所谓了。很快风险评估也做完了,以后就可以愉快地买理财产品了。

image.png
(图源 :pixabay)

去了银行搞定了银行卡,知道了只是因为身份资料没及时更新,而不是因为OTC冻结,我的心便彻底地放了下来,这可真是虚惊一场啊,早知如此,我早点来把身份资料更新一下就好了,不必受惊吓了。


This page is synchronized from the post: ‘虚惊一场’

Your browser is out-of-date!

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

×