第一次使用STEEMSQL查询谷哥点名数据

首先感谢 @arcange 提供 SteemSQL服务,SteemSQL是一个包含STEEM区块链数据的公共MS-SQL数据库。

First thanks @arcange for providing SteemSQL services, SteemSQL is a public MS-SQL database with all the blockchain data in it.


其实SteemSQL上线之初我马上试用过,但是因为当时第一版只包含一些区块链的transaction数据,用起来还有诸多不便,所以后来SteemData一上线,我就转移战场了,尽管我从来未接触过MongoDB。之后,SteemData一直能满足我的需求,所以就懒得转战回来,但是我依然默默关注这个项目,看着它经过十多次升级变得越来越好,也看着很多STEEMIT的朋友开始使用这个数据库。

今天 @jubi 和我说使用SteemSQL 查询中文标题遇到一些困难,用WHERE title like '%第一次%'作为查询条件,查询不到相关数据,但是用英文则可以查询,我答应帮他看看。话说最近他在中文区举办两期谷哥点名活动,人气火爆,而第一次就是第二期活动的主题。估计太火爆,参与人数众多,单纯地靠人工看帖和整理有些辛苦,于是他想着用程序把整理帖子自动化吧。大家都在成长,这非常好。说到SteemSQL最近,中文区的很多朋友都在用,比如 @ace108, 以及 @joythewanderer, 他们还出过一些向导贴,大家感兴趣可以去翻一翻。

又扯远了,言归正传

安装pymssql

我懒得去下桌面软件,还是直接用Python吧
Python下可以使用pyodbc 以及 pymssql啥的,我选择的是pymssql

直接在命令行下直接安装指令
pip3 install pymssql

嘎,报一大堆错误, 其它啥的都不认识,我关注的大概三句

Running setup.py bdist_wheel for pymssql … error
setup.py: Not using bundled FreeTDS
_mssql.c:266:22: fatal error: sqlfront.h: No such file or directory

去官网查了一下
http://pymssql.org/en/stable/building_and_developing.html
有这样一句

FreeTDS >= 0.91 including development files. Please research your OS usual software distribution channels, e.g, freetds-dev or freetds-devel packages.

缺啥补啥
sudo apt-get install freetds-dev
pip3 install pymssql

成功!

执行

SteemSQL 官网地址: http://steemsql.com/
但是很遗憾上边的链接信息不全,没有Database的信息
或许连上之后,就直接可以查出来,不过我在SteemSQL发布的帖子中找到了连接信息

Server: sql.steemsql.com
User: steemit
Password: steemit
Database name: DBSteem

import pymssql
conn = pymssql.connect(host ="sql.steemsql.com",database ="DBSteem",user="steemit",password="steemit")
在Python里用这个直接连上了,很好。

试着查了一下
cur = conn.cursor()
cur.execute("SELECT title FROM Comments WHERE author= 'oflyhigh' and title like '%区块链%'")

因为我昨天刚写了一篇文章,
使用PHP查询STEEM区块链 / Using PHP to query the STEEM blockchain

为啥就查不到呢?

然后换个关键词
cur.execute("SELECT title FROM Comments WHERE author= 'oflyhigh' and title like '%PHP%'")

(‘How to install Apache、MYSQL、PHP5 and run a Wordpress website on BananaPi’,), (‘拖了很久的事情终于完成了,将PHP 5.4 升级到 PHP 5.6’,), (‘使用PHP查询STEEM区块链 / Using PHP to query the STEEM blockchain’,)

查出来的文章包含我的最新文章

排查

那么是哪里有问题导致的呢?
我第一个直觉是编码问题

然后,我把链接改成
conn = pymssql.connect(host ="sql.steemsql.com",database ="DBSteem",user="steemit",password="steemit", charset="utf8")
结果依旧

又去把FreeTDS的配置文件中加上字符集设置
sudo find / -name freetds.conf
sudo vi /etc/freetds/freetds.conf
sudo vi /usr/share/freetds/freetds.conf
通通加上:
client charset = UTF-8
结果依旧

尽管我觉得没必要,但是,又在Python文件中加上
#-*- coding: utf-8 -*-
结果依旧

从查出的结果能正常显示来看,数据应该是按UTF-8存储的,那问题出在哪里呢?三把板斧用完了,我的找新招数了。

研究半天,发现个新玩意,就是在查询内容前加个N
详情见
https://docs.microsoft.com/en-us/sql/t-sql/data-types/nchar-and-nvarchar-transact-sql

Prefix Unicode character string constants with the letter N. Without the N prefix, the string is converted to the default code page of the database. This default code page may not recognize certain characters.

把我的查询改成:
cur.execute("SELECT title FROM Comments WHERE author= 'oflyhigh' and title like N'%区块链%'")

查询结果如下:

我也曾经文青过,18年前写的小诗 《花儿》,学laoyao,咱也放到区块链上
使用PHP查询STEEM区块链 / Using PHP to query the STEEM blockchain
珍惜羽毛 / STEEM区块链忠实的记录你的操作 / 获得共同操作账户的真实操作者
YY 一个基于STEEM区块链的聊天工具
STEEM区块链忠实的记录你的言行&操作

终于可行了

再查谷歌点名贴

现在在回头查参加谷歌点名的第二次活动的帖子,主题为第一次

cur.execute("SELECT title,created FROM Comments WHERE title like N'%第一次%' and created > '2017/08/01' order by created")
rows = cur.fetchall()
for row in rows: print("{}\t{}".format(row[0], row[1]))

结果如下:

Magic Clay 你第一次用黏土做了什么呢? 2017-08-01 14:13:45
第一次花費從steemit賺到的收益 ! The first time I get the ‘real’ money from steemit! 2017-08-02 06:11:21
第一次与你们的对话,my first conversation with y’all . 2017-08-03 18:32:51
第一次在steemit cn发文 感谢steemit让我能接触Bitcoin 2017-08-04 17:09:18
第一次人体解剖课上的惊悚事件 2017-08-07 11:30:48
第一次 - 離鄉別井 | “谷哥点名”活动 2017-08-09 07:10:30
相约大美新疆,第一次在第13届全国冬运会现场 Meet the beauty of Xinjiang,first time in China national winter games 2017-08-09 08:31:15
My first encounter with steemit/我与steemit的第一次邂逅 | 谷歌点名 2017-08-09 10:15:33
我人生的N种第一次 2017-08-09 10:31:48
第一次认识这个世界 2017-08-09 10:52:12
第一次 - 英國行山篇 “谷歌点名”活動 Hiking South Downs Way England 2017-08-09 11:00:00
【参加谷哥点名】我在Steemit的第一次发帖 2017-08-09 13:07:39
第一次离开熟悉的地方外出闯荡 2017-08-09 14:12:33
成就人生的第一次 2017-08-09 14:26:54
第一次 // First Time 2017-08-09 17:11:42
人生第一次——不仅有酸甜苦辣,更有悲欢离合 2017-08-09 18:12:18
第一次 - The First Time (Chinese content only but feel free to comment in English if you understsand) - (by @ace108) 2017-08-10 00:34:03
第一次, 细看妈妈的皱纹| “谷哥点名”活动 2017-08-10 01:11:24
爱上第一次–First Exploration 2017-08-10 01:22:15
如何看待你人生中的第一次? 2017-08-10 01:24:48
?? 老道茶館 ??-請上坐,喝杯茶,說點事;今日話題-第一次 (跨域合作:茶館X谷哥点名) ?? LAODR Tea House ?? 170810 2017-08-10 02:06:03

#隨筆2 第一次 | 谷哥点名 2017-08-10 03:55:33
第一次在星级大酒店吃饭 2017-08-10 04:09:12
第一次绝恋–最后的初恋 The first but also last love. 2017-08-10 04:37:30
第一次品味人生百态 My First Time - Ups and Downs in Life 2017-08-10 05:10:51
第一次 ── 我和我的友生 2017-08-10 05:14:57
第一次拿到在steemit上写作的钱 2017-08-10 05:44:24
领导,今天是我第一次喝酒,可不可以。。。 2017-08-10 06:52:42
第一次去博物馆之中国古代的酒具 The ancient wine cups of the Chinese history 2017-08-10 11:40:54
第一次去油菜花地里玩,种下了心灵里的树 2017-08-10 13:56:00
My first and long leave from my hometown // 第一次離鄉別井 2017-08-10 18:45:03
The first time i made my rose steamed buns 第一次做玫瑰花馒头! 2017-08-10 21:50:18
第一次 — 住在大学宿舍经历 / 谷哥点名活动 | My university life, my first time living in a university hostel 2017-08-10 23:03:06
第一次 - 在第一次家族旅行 - 台中 (內有家族旅行的心得)| The first time - My first family trip - Tai Chung 2017-08-11 01:16:42
很多第一次的第一次 | “谷哥点名” 2017-08-11 01:30:00
第一次“体验”做父母的感觉 / The First Time for Being a “Parent” | 谷歌点名 2017-08-11 04:10:27
第一次来华文区时的情景与华文区如何发展 2017-08-11 06:23:21
第一次注册域名 2017-08-11 08:18:54
第一次,科學研究的第一次/ “谷哥点名”活动 The First time: The Tirst Time for Scientific Research 2017-08-11 09:15:57
第一次去海边 —— “温良恭俭让”的北威尔士海滨小镇兰迪德诺 2017-08-11 09:28:42
第二期“谷哥点名”活動: 第一次 離鄉別井 2017-08-11 09:36:03
我的第一次的虛擬人生 2017-08-11 10:22:18
一天之内的两个第一次 2017-08-11 10:37:51

总算没辜负 @jubi 小友的信任

补充

@jubi 用另外一种方法
WHERE contains(title, '第一次')
可以查出部分数据
我搜索了一下,contains是基于全文索引进行查询
但结果可能受系统分词方法的影响导致不全

当然,也可能是我不会使用的缘故 😭


也加俩第一次关键字参赛,重在参与
另外,万一中奖呢,哈哈哈


This page is synchronized from the post: 第一次使用STEEMSQL查询谷哥点名数据

使用PHP查询STEEM区块链 / Using PHP to query the STEEM blockchain

话说,PHP是世界上最好的语言,咳咳。但是这个最好的语言,我大概有7-8年没有去使用了,现在几乎已经不会用啦。之前学习和写的和STEEM区块链相关的程序都是用的Python。今天突然冒出个想法,写个PHP访问STEEM区块链的简单的例子。然后,写的时候才发现,各种不习惯。其实Python我也没没学两天,PHP则正经八百的用过好长时间呢,结果我觉得我完全变成PHP初学者了。好在,这个语言还算好学。于是磕磕绊绊写了一个程序,然后发现各种不优雅,简化简化简化,简化成现在这个样子了。为了演示核心流程,不包含任何错误处理之类的。

PHP is one of the popular programming languages,today, I wrote a simple PHP script to query the STEEM blockchain.

PHP程序 / The Script

闲话少叙,直接上脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?
class Steemd
{
private $ch;
function __construct(){
$this->ch = curl_init();
curl_setopt($this->ch, CURLOPT_URL, 'https://steemd.steemit.com');
curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, TRUE);
}

function __destruct() {
curl_close($this->ch);
}

private function json_rpc_body($method, $params){
$request = array(
"jsonrpc" => "2.0",
"method" => $method,
"params" => $params,
"id" => 0
);
return json_encode($request);
}

public function exec($method, $params = array()) {
$data = $this->json_rpc_body($method, $params);
curl_setopt($this->ch, CURLOPT_POSTFIELDS, $data);
$response = curl_exec($this->ch);
$response = json_decode($response, true);
if (array_key_exists('error', $response)) {
var_dump($response['error']);
die();
}
return $response['result'];
}

public function get_account($account){
$result = $this->exec('get_accounts', [[$account]]);
return $result;
}
}

$steemd = new Steemd;
echo('<pre>');
print_r($steemd->exec(get_chain_properties,[]));
print_r($steemd->get_account('oflyhigh'));
echo('</pre>');

//unset($steemd);
?>

简单解释 / Explain

程序分成两部分

  • Steemd类
  • 测试代码

This script is divided into two parts, Steemd Class and some simple testing codes

Steemd类 / Steemd Class

使用PHP curl 来执行HTTP请求, 使用’https://steemd.steemit.com'作为请求节点。
I use curl to execute HTTP requests, use ‘https://steemd.steemit.com‘ as RPC node.

Steemd Class 提供两个接口,exec以及get_account
There are two methods provided by Steemd Class , exec and get_account.

exec是底层接口,你可以直接调用这个接口来执行steem blockchain API 操作。
exec is low level interface, you can call it directly to perform operations to query steem blockchain.

get_account是对exe的封装,对用户更加友好,它仅仅是一个封装示例,你可以封装更多的功能。
get_account is a user friendly encapsulation for exe, it just a example, you can encapsulate more functions yourself.

测试代码 / Testing codes

就是简单测试一下而已,没啥可以说的
用print_r让结果看起来更好看

Some simple testing codes to test Steemd class and two interfaces exec and get_account
Use print_r to make the results look better.

运行结果 / Results



脚本仅供参考,使用风险自负!
This script is for reference only, use it at your own risk.


This page is synchronized from the post: 使用PHP查询STEEM区块链 / Using PHP to query the STEEM blockchain

三人行,必有我师焉

之前在设置Linksy路由器NAT的帖子说过要避免思维定势。但是有时候思维钻入误区而不自知。像Linksy WRT1900ACS用原始ROM的人可能非常少,其它事情,如果圈子不小,多与人沟通还是会有很多好处,比如避免一些误区、节省一些时间等等。

在STEEMIT上学习

学习比特币地址

之前学习了一系列比特币地址相关的内容,不怕大家笑话,我是初学者,在这之前,对比特币的认知基本上就是一种去中心化总量固定的加密货币,嗯,还要补充一下,是目前加密货币界的龙头老大。至于私钥、公钥、各种编解码之类的概念,我都是从STEEM了解到的,包括我学习过程中用的代码,都是从STEEM这边自己扒过来的, 《Mastering Bitcoin》这本书也是在学习过程中查找资料才发现的。或许我在一些大佬云集的群里多问一句,谁推荐一本入门的书籍给我,估计不少人会推荐这个书给我吧。当然,这个过程也得到过不少人的帮助和指点,不然我可能连地址是干啥的都傻傻的分不清楚。

监控比特币余额

然后,我又想到监控比特币地址的余额变化,我在想怎么用复杂的编程方法实现这个功能,确切地说,一头雾水。然后在群里问了一下,结果 @jubi 回复我说可以用https://blockchain.info 的API。回头看一眼 https://blockchain.info 的API,颇有种骑马找马的感觉。如果不是他一句话,我不定走多少弯路,甚至有可能钻进牛犄角,把自己憋出内伤。

Python集合与哈希表

前一阶段,写了个在Python中用集合运算简化问题处理的帖子 , @kenchung 老师后来写了一个帖子介绍了Python集合操作背后的机制HASH Table,于是对Python集合操作有了更深刻的理解,比如以前总好奇集合是如何去掉重复元素的,学了 @kenchung 老师的帖子,这些问题立刻明朗。

大白 + 大白 = 白胖胖

以前工作的公司,最常强调的一点,就是结果导向,作为企业文化之一,大肆宣传,或许在追求效益以及利润的公司而言,这样的文化无可厚非。但是对于我们,如果凡事只问结果,就可能丧失了思考与提高的机会。 @justyy 的一个帖子大白 + 大白 = 白胖胖,如果我还是个小学生,或许会轻易的解出这个题,但是现在我看到这个的第一眼,就是写个程序搜索符合条件的结果。很多事养成习惯,一些就变成了坏习惯。

说到大白 + 大白 = 白胖胖,我想起来前些天去公园买门票的事情,门票6元一张,我给售票员20元,告诉她买一张,她思索了半天,然后拽过来一个计算器,按20-6=14,然后找了我14元。我想笑,差点憋出内伤。现在回头想想,我和她又有多大的差异呢?五十步笑百步而已!

所以 @justyy 的这个帖子也让我受益匪浅。

总结

STEEMIT很好,好在哪里呢?不像一些专业的社区,你比如去一些编程社区问怎么做菜,或者去一些美食社区问如何编程,都有可能被打死,而STEEMIT则不然,汇聚了各行各业各路专家,各种话题都能找到志同道合的小伙伴。你可以放心的聊各种话题,或者针对这些话题发表回复。每天都可以接收新的资讯和学习新的知识。

古人云: 学无先后,达者为先
古人又云: 三人行,必有我师焉
古人还云: 闻道有先后, 术业有专攻

STEEMIT不是纯粹的知识海洋,但是我们可以学到很多知识。
STEEMIT上的小伙伴也不都是教育工作者,但是你们都是好老师。

致敬!


This page is synchronized from the post: 三人行,必有我师焉

如何查询 PowerDown Route

在之前的文章中:

我提及了一个大家或许不知道的功能PowerDown Route,通过这一功能,你可以把一个账户里的SP提现到另外一个账户,也可以选择提现的时候PowerUp到另外一个账户。

当时为了理解这个事,特意拿个测试账户测试了一下,设置测试号A的PowerDown Route为B, 然后我今天突然想看一下我设置的B是哪个账户,结果尴尬了,在steemd.com 找不到。

steemd.com上只有这个信息:
如果你从未设置过,那么应该是:

好吧,我知道我设置过,但是我设置哪里去了呢?

API get_withdraw_routes

研究半天发现有一个API
vector< withdraw_route > get_withdraw_routes( string account, withdraw_route_type type = outgoing )const;

相关结构体和类型定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct withdraw_route
{
string from_account;
string to_account;
uint16_t percent;
bool auto_vest;
};

enum withdraw_route_type
{
incoming,
outgoing,
all
};

curl 测试

有了上述API定义,我们就可以使用curl进行调用了

查询account_a的PowerDown Routes

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

得出如下结果:
{"id":1,"result":[{"from_account":"account_a","to_account":"account_b","percent":10000,"auto_vest":false}]}

查询将account_a设置为PowerDown Route的账户列表

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

查询结果为空:
{"id":1,"result":[]}

steem python 库

直接使用API可以查询账户的PowerDown Route(Incoming, outgoing)
当然也可以自行对API就行封装

庆幸的是, steem python 库已经帮我们做好了封装

get_withdraw_routes

1
2
3
def get_withdraw_routes(self, account: str, withdraw_route_type: str):
""" get_withdraw_routes """
return self.exec('get_withdraw_routes', account, withdraw_route_type, api='database_api')

简单的测试代码

1
2
3
4
5
from steem import Steem
from pprint import pprint
steem = Steem()
routes = steem.get_withdraw_routes('account_a', 'all')
pprint(routes)

结果

1
2
3
4
[{'auto_vest': False,
'from_account': 'account_a',
'percent': 10000,
'to_account': 'account_b'}]

设置& 取消PowerDown Route

设置

可以使用steem python 库提供的API设置PowerDown Route
set_withdraw_vesting_route
详情见代码内注释即可
可以设置N个Routes,并对其分配不同比例,总量不超过100%

取消

如果想取消对account_a设置的PowerDown Route
只需将account_a的PowerDown Route 设置为account_b,并将percent设置为0 即可


说明: 文中 account_a, account_b 仅为说明问题,非实际账户。


This page is synchronized from the post: 如何查询 PowerDown Route

关于声望分与Reputation数值对应关系的几幅图形

在十多天以前,我分享过一组关于声望分的数据

包括声望分的计算公式以及声望分等于25、大于25、小于25的用户分布比例

很多朋友咨询我,声望分从25降到-10相当于从25升级到多少?
声望分-16,对应的正的声望分应该是多少?
从25升级到60,难度大致多大?从60升级到70又要费多大力气?
其实我也很晕,确切地说是想象力不够丰富。

于是我大致做了几组图,希望给大家也给自己一个直观的概念。
其中Reputation Score代表声望分,Reputation Number代表对应声望分对应的数值

I made a few sets of graphs, hope them give an intuitive concept to you and me.

图一: 声望分-20到70 / Reputation Score -20 to 70

-20,70.png
从这个图中不难看出,声望分以25为中心,对称分布的
也就是说,-20和+70到达的难度一致,那么不难推算出隔壁老王的声望分相当于66

图二: 声望分-10到60 / Reputation Score -10 to 60

-10,60.png

这段曲线是图一中曲线的一段
从图中不难看出声望分越高,提升越困难
从50到60的难度,是从25到50难度的数倍不止

图三: 声望分0到50 / Reputation Score 0 to 50

0,50.png
继续缩小观察比例
由此可见25到50需要6E+11,对比上图到达60需要8E+12,也就是从从50升级到60,是从25升级到50的12倍多(80-6)/6

图四: 声望分25到60 / Reputation Score 25 to 60

25,60.png
新手们最关心的问题啦,快来看看你在曲线的哪个点上?

图五: 声望分60到80 / Reputation Score 60 to 80

60,80.png
老鸟们或许会更关心这段曲线

结论 / Conclusions

  • 声望分以25为中心,对称分布的
    Reputation score using 25 as the axis, symmetrically distributed.

  • 声望分越高,提升越困难
    The higher the reputation score, the more difficult to raise it up.

就这些了,大家努力向80冲啊!


This page is synchronized from the post: 关于声望分与Reputation数值对应关系的几幅图形

来呀来喝酒,不醉不罢休

IMG_20170806_185258.jpg

今天邻居群的几个朋友喊我晚上出去露天烧烤。说在楼下,吹着习习晚风、喝点啤酒、吃点烤串、大家一起吹吹牛聊天天,一定会非常惬意。之前大家搞的几次聚会都是出去玩,这种在家门口的烧烤还是第一次,于是当然是积极响应参与喽。

结果天公不作美,下起了大暴雨,还好我们选择在开汽车会所的朋友家里聚会,外边有大片空地,室内也是极其宽敞。既然室外大雨没法吃,就转战室内好了。

食物非常丰盛,是鸡爪、小龙虾、花生、毛豆、肉串、熟筋、烤鸡心、烤羊腰子、烤蚬子、烤鱼等等等等,我一直忙着吃,双手全是油,所以只拍了零星的照片。

为了让邻居们吃得开心,负责举办活动的哥们还特意聘请了专业的烧烤师傅。也就是说我们只管吃喝就行了。只需动嘴 😀

汽车会所楼上还有茶吧、影院以及台球室,孩子们吃完就都跑上边看动画片去啦。大人们继续在楼下吹牛聊天,无论老少,都不亦乐乎。

IMG_20170806_173747.jpg
卤豆干

IMG_20170806_173817.jpg
鸡爪

IMG_20170806_174137.jpg
把桌子从室外搬到室内

IMG_20170806_174305.jpg
麻辣小龙虾

IMG_20170806_174436.jpg
啤酒摆起来

IMG_20170806_174608.jpg
各种食材

IMG_20170806_174621.jpg
师傅在为大家服务

IMG_20170806_190911.jpg
肉串

IMG_20170806_191816.jpg
还是肉串

IMG_20170806_195100.jpg
吃饱喝足

IMG_20170806_184940.jpg
楼上台球室

IMG_20170806_184929.jpg
给孩子们放动画片

IMG_20170806_201012.jpg
动画片放完,该给大人们看电影啦

IMG_20170806_202514.jpg
很帅是吧。


很高兴我有这些好邻居,大家相处非常融洽愉快。其中一些都已经成为了我的好朋友。
还有一些陌生面孔是初次参加我们的活动,相信大家也都会成为好友。
喝的略多,今天就不多写啦:)


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

×