当前位置: 首页 > 编程日记 > 正文

码农技术炒股之路——抓取股票基本信息、实时交易信息、主力动向信息

从本节开始,我们开始介绍各个抓取和备份业务。(转载请指明出于breaksoftware的csdn博客)

因为我们数据库很多,数据库中表也很多,所以我们需要一个自动检测并创建数据库和表的功能。在《码农技术炒股之路——数据库管理器、正则表达式管理器》一文中,我们介绍了数据库管理器帮我们自动创建数据库,但是没有自动创建表的功能。于是我们需要实现一个。

class prepare_table():def __init__(self, conn_name, table_template_name):self._conn_name = conn_nameself._table_template_name = table_template_nameself._create_table_format = ""def prepare(self, table_name):self._create_table_if_not_exist(table_name)def _get_table_template(self):file_path = "./conf/table_template/" + self._table_template_name + ".ttpl"if False == os.path.isfile(file_path):LOG_WARNING("can't read %s" %(file_path))returnfobj = open(file_path)try:self._create_table_format = fobj.read()except:self._create_table_format = ""LOG_WARNING("get table_template file error.path: %s" % (file_path))finally:fobj.close()def _create_table_if_not_exist(self, table_name):db_manager = mysql_manager()conn = db_manager.get_mysql_conn(self._conn_name)if False == conn.has_table(table_name):if len(self._create_table_format) == 0:self._get_table_template()if len(self._create_table_format) == 0:returnsql = self._create_table_format % (table_name)data = conn.execute(sql)conn.refresh_tables_info()

如果数据表不存在,prepare_table类根据传入的模板名称在配置文件中读取创建表的SQL,然后执行。如果存在,则什么都不做。

这个功能非常必要。因为每天都有新股产生,我们不能每天手工去创建和该股票相关的表。于是自动检测并创建可以帮我们省去很多麻烦。

股票基本信息

目前我保存的股票基本信息只有股票代码、股票名称和所在市场。由于不定期有新股上市,所以这个信息每天早上要第一个更新。之后业务会根据该表获得所有股票代码,然后才能进行操作。

[update_share_base_info]
type=cron
class=update_stock_base_info
day_of_week=1-5
hour=9
minute=30
second=10
timezone = Asia/Shanghai

上面配置意思是每周一到周五,9点30分10秒获取一次。

我们再看下创建表的模板(share_base.ttpl)

CREATE TABLE `%s` (`share_id` char(6) COLLATE utf8_unicode_ci NOT NULL DEFAULT '000000' COMMENT '股票代码',`share_name` varchar(36) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '股票名称',`market_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '市场 1 沪市 2 深市',PRIMARY KEY (`share_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='股票基本信息';

最后我们看下代码。

在构造函数中,我们指定所用到的数据库连接配置为stock_db,表模板是share_base,表名是share_base_info

class update_stock_base_info(job_base):def __init__(self):self._regular_split_manager = regular_split_manager()self._db_manager = mysql_manager()self._conn_name = "stock_db"self._prepare_table = prepare_table(self._conn_name, "share_base")self._table_name = "share_base_info"

然后在run函数中检查或新建表,并完成数据抓取和写入

    def run(self):data = self._get_data()self._prepare_table.prepare(self._table_name)self._save_data(data)LOG_INFO("run update_stock_base_info")

数据我们从东方财富网抓取

    def _get_data(self):url = r"http://nufm.dfcfw.com/EM_Finance2014NumericApplication/JS.aspx/JS.aspx?type=ct&st=(FFRank)&sr=1&p=1&ps=3500&js=var%20mozselQI={pages:(pc),data:[(x)]}&token=894050c76af8597a853f5b408b759f5d&cmd=C._AB&sty=DCFFITAM&rt=49461817"res = fetch_data.get_data(fetch_data.query_http(url))return res

然后通过正则表达式管理器,通过指定名称的策略,将结果分解出来

    def _save_data(self, data):data_array = self._regular_split_manager.get_split_data(data, "string_comma_regular")

然后枚举上面结果,将相应坐标数据和数据库中字段关联,最后写入表中

        for item in data_array:share_market_type = item[0]share_id = item[1]share_name = item[2]if len(share_id) > 0 and len(share_name) > 0:share_info = {"share_id":share_id, "share_name":share_name, "market_type":share_market_type}conn = self._db_manager.get_mysql_conn(self._conn_name)conn.insert_onduplicate(self._table_name, share_info, ["share_id"])

有了之前介绍的一系列管理器,我们便通过不到40行代码把数据抓取并入库。我们看下抓取结果

股票实时交易信息

股票实时交易信息是保存在一个叫做daily_temp的数据库中

class update_today_trade_info(job_base):def __init__(self):self._db_manager = mysql_manager()self._conn_name = "daily_temp"self._base_conn_name = "stock_db"self._prepare_table = prepare_table(self._conn_name, "today_trade_info")self._pre_share_count = 0self._share_ids_str_list = []

使用today_trade_info模板去准备数据库

CREATE TABLE `%s` (`seq_id` bigint(64) NOT NULL AUTO_INCREMENT COMMENT '自增ID',`share_id` char(6) CHARACTER SET latin1 NOT NULL DEFAULT '000000',`share_name` varchar(32) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '股票名称',`today_open` float(16,2) NOT NULL DEFAULT '0.00' COMMENT '今日开盘价',`yesterday_close` float(16,2) NOT NULL DEFAULT '0.00' COMMENT '昨天收盘价',`cur` float(16,2) NOT NULL DEFAULT '0.00' COMMENT '当前价格',`today_high` float(16,2) NOT NULL DEFAULT '0.00' COMMENT '今日最高',`today_low` float(16,2) NOT NULL DEFAULT '0.00' COMMENT '今日最低',`compete_buy_price` float(16,2) NOT NULL DEFAULT '0.00' COMMENT '竞买价格(买一价格)',`compete_sale_price` float(16,2) NOT NULL DEFAULT '0.00' COMMENT '竞卖价格(卖一价格)',`trade_num` bigint(64) NOT NULL DEFAULT '0' COMMENT '成交的股票数',`trade_price` float(32,2) NOT NULL DEFAULT '0.00' COMMENT '成交的金额',`buy_1_num` bigint(64) NOT NULL DEFAULT '0' COMMENT '买一数量',`buy_1_price` float(16,2) NOT NULL DEFAULT '0.00' COMMENT '买一价格',`buy_2_num` bigint(64) NOT NULL DEFAULT '0' COMMENT '买二数量',`buy_2_price` float(16,2) NOT NULL DEFAULT '0.00' COMMENT '买二价格',`buy_3_num` bigint(64) NOT NULL DEFAULT '0' COMMENT '买三数量',`buy_3_price` float(16,2) NOT NULL DEFAULT '0.00' COMMENT '买三价格',`buy_4_num` bigint(64) NOT NULL DEFAULT '0' COMMENT '买四数量',`buy_4_price` float(16,2) NOT NULL DEFAULT '0.00' COMMENT '买四价格',`buy_5_num` bigint(64) NOT NULL DEFAULT '0' COMMENT '买五数量',`buy_5_price` float(16,2) NOT NULL DEFAULT '0.00' COMMENT '买五价格',`sale_1_num` bigint(64) NOT NULL DEFAULT '0' COMMENT '卖一数量',`sale_1_price` float(16,2) NOT NULL DEFAULT '0.00' COMMENT '卖一价格',`sale_2_num` bigint(64) NOT NULL DEFAULT '0' COMMENT '卖二数量',`sale_2_price` float(16,2) NOT NULL DEFAULT '0.00' COMMENT '卖二价格',`sale_3_num` bigint(64) NOT NULL DEFAULT '0' COMMENT '卖三数量',`sale_3_price` float(16,2) NOT NULL DEFAULT '0.00' COMMENT '卖三价格',`sale_4_num` bigint(64) NOT NULL DEFAULT '0' COMMENT '卖四数量',`sale_4_price` float(16,2) NOT NULL DEFAULT '0.00' COMMENT '卖四价格',`sale_5_num` bigint(64) NOT NULL DEFAULT '0' COMMENT '卖五数量',`sale_5_price` float(16,2) NOT NULL DEFAULT '0.00' COMMENT '卖五价格',`time_date_str` varchar(32) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '更新时间(日期)',`time_str` varchar(32) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '更新时间(时间)',`empty` int(16) NOT NULL DEFAULT '0' COMMENT '空占位',PRIMARY KEY (`seq_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='今日交易数据';

因为我们要将一天的数据放在一个表中,也就是说每天一张表。于是表要使用日期加以区分

    def run(self):date_info = time.strftime('%Y_%m_%d')table_name = "trade_info_%s" % (date_info)self._prepare_table.prepare(table_name)

下一步是数据获取。

        ids_str_list = self._get_all_share_ids()for ids_str in ids_str_list:data = self._get_data(ids_str)self._parse_data_and_insert_db(table_name, data)LOG_INFO("run update_today_trade_info")

这次我们通过新浪的接口获取数据。由于该接口不能支持一次性拉取三千多支股票信息,所以在拉取前,我需要对拉取的股票代码进行切片。这次我们要使用到股票基本信息表的数据来进行数据组装。

    def _get_all_share_ids(self):db_manager = mysql_manager()conn = db_manager.get_mysql_conn(self._base_conn_name)count_info = conn.select("share_base_info", ["count(*)"],{})count = int(count_info[0][0])if count == self._pre_share_count:return self._share_ids_str_list#share_ids = conn.select("share_base_info", ["share_id", "market_type"],{"share_id":["601375", "="]})share_ids = conn.select("share_base_info", ["share_id", "market_type"],{})ids = []for item in share_ids:market_type = item[1]pre = ""if 1 == market_type:pre = "sh"elif 2 == market_type:pre = "sz"else:continuenew_id = pre + item[0]ids.append(new_id)id_count = len(ids)count_per = 500page = id_count/count_perids_str_list = []for index in range(page+1):ids_list = ids[index*count_per:(index+1)*count_per]ids_str = "," . join(ids_list)ids_str_list.append(ids_str)self._share_ids_str_list = ids_str_listself._pre_share_count = countreturn self._share_ids_str_list

为了尽量减少不同批次股票同步时间的差异,需要每次尽量请求多的数据。我是按500个一批进行切片的。
        拉取数据的逻辑很简单,就是发起一次请求

    def _get_data(self, ids):url_pre = "http://hq.sinajs.cn/list="url = url_pre + idsres = fetch_data.get_data(fetch_data.query_http(url))res = res.decode("gbk").encode("utf-8")return res

最后我们将数据通过正则表达式管理器按照hq_sinajs_cn_list策略进行拆分。并通过指定相应位和数据库字段的关系,将其插入到表中

    def _parse_data_and_insert_db(self, table_name, data):ret_array = fetch_data.get_data(fetch_data.regular_split("hq_sinajs_cn_list", data))if 0 == len(ret_array):LOG_WARNING("hg_sinajs_cn_list regular %s empty data" %(data))returndata_array = []into_db_columns = ["share_id","share_name","today_open","yesterday_close","cur","today_high","today_low","compete_buy_price","compete_sale_price","trade_num","trade_price","buy_1_num","buy_1_price","buy_2_num","buy_2_price","buy_3_num","buy_3_price","buy_4_num","buy_4_price","buy_5_num","buy_5_price","sale_1_num","sale_1_price","sale_2_num","sale_2_price","sale_3_num","sale_3_price","sale_4_num","sale_4_price","sale_5_num","sale_5_price","time_date_str","time_str","empty"]columns_count = len(into_db_columns)for item in ret_array:if len(item) != columns_count:LOG_INFO("%s length is not match for column length %d" %(str(item), columns_count))continuedata_array.append(item)if 0 == len(data_array):returndb_manager = mysql_manager()conn = db_manager.get_mysql_conn(self._conn_name)conn.insert_data(table_name ,into_db_columns, data_array)

股票主力动向信息

主力动向信息的获取和实时交易信息获取是类似的。我只列出区别部分。

主力动向使用的是today_market_maker模板创建数据表

CREATE TABLE `%s` (`seq_id` bigint(64) NOT NULL AUTO_INCREMENT COMMENT '自增ID',`market_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '1 沪市 2 深市',`share_id` char(6) CHARACTER SET latin1 NOT NULL DEFAULT '' COMMENT '股票代码',`share_name` varchar(36) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '股票名称',`price` float(16,2) NOT NULL DEFAULT '0.00' COMMENT '股票价格',`up_percent` float(16,2) NOT NULL DEFAULT '0.00' COMMENT '涨幅',`market_maker_net_inflow` float(64,2) NOT NULL DEFAULT '0.00' COMMENT '主力净流入',`market_maker_net_inflow_per` float(16,2) NOT NULL DEFAULT '0.00' COMMENT '主力净流入占比',`huge_inflow` float(64,2) NOT NULL DEFAULT '0.00' COMMENT '超大单净流入',`huge_inflow_per` float(16,2) NOT NULL DEFAULT '0.00' COMMENT '超大单净流入占比',`large_inflow` float(64,2) NOT NULL DEFAULT '0.00' COMMENT '大单净流入',`large_inflow_per` float(16,2) NOT NULL DEFAULT '0.00' COMMENT '大单净流入占比',`medium_inflow` float(64,2) NOT NULL DEFAULT '0.00' COMMENT '中单净流入',`medium_inflow_per` float(16,2) NOT NULL DEFAULT '0.00' COMMENT '中单净流入占比',`small_inflow` float(64,2) NOT NULL DEFAULT '0.00' COMMENT '小单净流入',`small_inflow_per` float(16,2) NOT NULL DEFAULT '0.00' COMMENT '小单净流入占比',`time_str` varchar(64) CHARACTER SET latin1 NOT NULL DEFAULT '' COMMENT '时间',PRIMARY KEY (`seq_id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='主力行为统计';

这次数据是从东方财富网抓取的。一个不错的消息是,该接口支持三千多支股票同时抓取,于是避免了之前要做切片的问题

    def _get_data(self):date_info = time.strftime('%Y-%m-%d')url_fomart = "http://nufm.dfcfw.com/EM_Finance2014NumericApplication/JS.aspx/JS.aspx?type=ct&st=(BalFlowMain)&sr=-1&p=3&ps=%d&js=var%%20vDUaFOen={pages:(pc),date:%%22%s%%22,data:[(x)]}&token=894050c76af8597a853f5b408b759f5d&cmd=C._AB&sty=DCFFITA&rt=49430148"url = format(url_fomart % (3500, date_info))res = fetch_data.get_data(fetch_data.query_http(url))return res

唯一不好的是部分没有的数据是使用-符号表示,这对我们正则分析提出了挑战。但是我们可以灵活处理,在正则拆分前将其替换成0

        data = self._get_data()data = data.replace("-,", "0,")self._parse_data_and_insert_db(table_name, data)LOG_INFO("run update_today_market_maker_info")

最后将拆分后的数据与表中字段关联,插入表中即可

    def _parse_data_and_insert_db(self, table_name, data):data_array = fetch_data.get_data(fetch_data.regular_split("string_comma_regular", data))db_manager = mysql_manager()conn = db_manager.get_mysql_conn(self._conn_name)into_db_columns = ["market_type", "share_id", "share_name", "price", "up_percent", "market_maker_net_inflow", "market_maker_net_inflow_per", "huge_inflow", "huge_inflow_per", "large_inflow", "large_inflow_per", "medium_inflow", "medium_inflow_per", "small_inflow", "small_inflow_per", "time_str"]conn.insert_data(table_name ,into_db_columns, data_array)

实时交易和主力动向数据都是30秒抓取一次,这儿只列出主力动向的任务配置。它分为上午和下午,由于存在整点问题,所以上午和下午的配置还是有点区别的

[update_today_market_maker_info_am_part1]
type=cron
class=update_today_market_maker_info
day_of_week=1-5
hour=9
minute=30-59
second = */30
timezone = Asia/Shanghai[update_today_market_maker_info_am_part2]
type=cron
class=update_today_market_maker_info
day_of_week=1-5
hour=10
second = */30
timezone = Asia/Shanghai[update_today_market_maker_info_am_part3]
type=cron
class=update_today_market_maker_info
day_of_week=1-5
hour=11
minute=0-30
second = */30
timezone = Asia/Shanghai
[update_today_market_maker_info_pm_1]
type=cron
class=update_today_market_maker_info
day_of_week=1-5
hour=13-14
second = */30
timezone = Asia/Shanghai[update_today_market_maker_info_pm_2]
type=cron
class=update_today_market_maker_info
day_of_week=1-5
hour=15
minute=0
second=30
timezone = Asia/Shanghai

相关文章:

TemplateBuilder

http://msdn.microsoft.com/zh-cn/vstudio/system.web.ui.templatebuilder_members(VS.85).aspx TemplateBuilder 成员TemplateBuilder 成员支持在生成模板及其包含的子控件时使用的页分析器。 下表列出了由 TemplateBuilder 类型公开的成员。 公共构造函数 名称 说明 Templat…

【iOS UI】iOS 9 GUI 资源分享

分享的内容包括一个【DesignCode-iOS-9-GUI】Sketch 文件&#xff0c; 和苹果官方释出的【SF-UI、SF-Compact】两种字体的安装包。 以上内容是正版、免费的 <a href "https://itunes.apple.com/cn/app/sketch-3/id852320343?mt12">Sketch</a> 是收费软…

反向R?削弱显著特征为细粒度分类带来提升 | AAAI 2020

作者 | VincentLee来源 | 晓飞的算法工程笔记导读&#xff1a;论文提出了类似于dropout作用的diversification block&#xff0c;通过抑制特征图的高响应区域来反向提高模型的特征提取能力&#xff0c;在损失函数方面&#xff0c;提出专注于top-k类别的gradient-boosting loss来…

C#初学——doWhile

继续上面的学习&#xff0c;这次的是流程控制&#xff0c;用dowhile&#xff0c;代码如下&#xff0c;还是用语言选择来作为事例的。using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication9 { class Program { static void Main(s…

码农技术炒股之路——实时交易信息、主力动向信息分库备份

一般来说&#xff0c;一个股票信息应该保存在一张表中。但是由于我机器资源限制&#xff0c;且我希望尽快频率的抓取数据。所以每天我将所有股票的实时交易信息放在daily_temp库中的一个以日期命名的表中。主力动向信息也是如此。但是盘后分析股票时&#xff0c;我们会以单只股…

数据预处理(完整步骤)

原文&#xff1a;http://dataunion.org/5009.html 一&#xff1a;为什么要预处理数据&#xff1f;&#xff08;1&#xff09;现实世界的数据是肮脏的&#xff08;不完整&#xff0c;含噪声&#xff0c;不一致&#xff09;&#xff08;2&#xff09;没有高质量的数据&#xff0c…

码农技术炒股之路——抓取日线数据、计算均线和除权数据

日线数据是股票每日收盘后的信息。这块数据不用实时抓取&#xff0c;所以并不占用宝贵的交易时间的资源。于是我们抓取完数据后直接往切片后的数据库中保存。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 抓取日线数据 我们先要获取今天有交易信息的股票代…

茫茫碌碌的日子

一连很好多天&#xff0c;都在为公司数据库基础构架升级的事情忙活着。升级的事情还是比较棘手的。需要升级硬件服务器&#xff0c;相关的存储&#xff0c;操作系统&#xff0c;数据库产品&#xff0c;涉及面非常多。当然烦心的事情就很多。作为线上生产系统&#xff0c;升级和…

Python PK C++,究竟谁更胜一筹?

作者 | Farhad Malik译者 | 弯月&#xff0c;编辑 | 屠敏来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;在编程生涯的早期阶段&#xff0c;我参与过一款C数学优化应用程序的开发&#xff0c;这个程序对性能的要求很高。至今我依然记得那段艰难的经历。在那个项目中…

oracle--查看表空间大小以及修改表空间大小

为什么80%的码农都做不了架构师&#xff1f;>>> 一.修改表空间大小 解决以上问题的办法&#xff1a;通过增大表空间即可解决&#xff0c;如下&#xff1a; Sql代码 使用dba用户登陆 sqlplus / as sysdba; 执行如下命令&#xff1a; SQL >…

同步、异步、堵塞、非堵塞和函数调用及I/O之间的组合概念

在我们工作和学习中&#xff0c;经常会接触到“同步”、“异步”、“堵塞”和“非堵塞”这些概念&#xff0c;但是并不是每个人都能将它们的关系和区别说清楚。本文将对这些基本概念进行讨论&#xff0c;以期让大家有更清楚的认识。&#xff08;转载请指明出于breaksoftware的c…

“抗击”新型肺炎!阿里达摩院研发AI算法,半小时完成疑似病例基因分析

利用技术辅助抗击疫情&#xff0c;阿里巴巴、百度等科技巨头各显身手。此前&#xff0c;AI科技大本营采访报道了阿里达摩院《数十名工程师作战5天&#xff0c;阿里达摩院连夜研发智能疫情机器人》一文&#xff0c;后者为了解决客服人力不足的局面&#xff0c;快速响应政府需求开…

反编译工具jad简单用法

反编译工具jad简单用法 下载地址&#xff1a;[url]http://58.251.57.206/down1?cidB99584EFA6154A13E5C0B273C3876BD4CC8CE672&t2&fmt&usrinput[/url]反编译工具jad &dt2002000一. 不用安装&#xff0c;只要解压就行&#xff08;有这样两个文件jad.exe&#x…

ubuntu 系统设置bugzilla制

随着时间的推移。在大脑中形成的记忆总会慢慢的淡去。人的记忆力就是这样。所以最好的办法就是形成博客去记录下来&#xff0c;一方面给自己以后回想用。一方面也算是自己的一个积累。所以一旦选择了一个行业&#xff0c;最好不要轻 易转行&#xff0c;由于非常多知识须要不断的…

静态分析C语言生成函数调用关系的利器——cflow

除了《静态分析C语言生成函数调用关系的利器——calltree》一文中介绍的calltree&#xff0c;我们还可以借助cflow辅助我们阅读理解代码。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; cflow的说明和安装cflow是一款静态分析C语言代码的工具&#xff0c;通过…

我在MongoDB年终大会上获二等奖文章:由数据迁移至MongoDB导致的数据不一致问题及解决方案...

作者 | 上海小胖来源 | Python专栏&#xff08;ID:xpchuiit)故事背景企业现状2019年年初&#xff0c;我接到了一个神秘电话&#xff0c;电话那头竟然准确的说出了我的昵称&#xff1a;上海小胖。我想这事情不简单&#xff0c;就回了句&#xff1a;您好&#xff0c;我是小胖&…

注意String.Split的几个重载形式

String.Split应该是经常用到的一个函数了,经常的有下面两种形式 public string[] Split(char[] separator, StringSplitOptions options); public string[] Split(string[] separator, StringSplitOptions options); 1. 多数情况下我们会使用第一种,代码里可能这…

如何让猎头找到你

如何让猎头找到你

libev源码解析——总览

libev是个非常优秀的基于事件的循环库&#xff0c;很多开源软件&#xff0c;比如nodejs就是使用其实现基础功能。本系列将对该库进行源码分析。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 不知道是被墙了还是网站不再维护&#xff0c;它的官网&#xff08…

GPT-2仅是“反刍”知识,真正理解语言还要改弦更张

作者 | Gary Marcus译者 | 泓技编辑 | 夕颜出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导读】OpenAI的GPT-2正被广泛地讨论&#xff0c;无论是《纽约客》还是《经济学人》&#xff0c;我们都能看到有关它的话题。关于自然和人工智能&#xff0c;它想…

sap business one 笑谈

Sap Business .e 出生在以色列&#xff0c;生下来的时候父母给起了个小名叫SBO&#xff0c;据说他的亲生父母是SAP家庭里的一个重要成员&#xff0c;后来SAP家族里的长老认为SBO长得不错&#xff0c;挺好看的。毕竟SAP家族里生下来的儿子都是胖胖的&#xff0c;想要个瘦点长相好…

来51学院的第一天

【来51学院的第一天】转载于:https://blog.51cto.com/10801189/1703279

libev源码解析——监视器(watcher)结构和组织形式

在《libev源码解析——总览》中&#xff0c;我们介绍了libev的一些重要变量在不同编译参数下的定义位置。由于这些变量在多线程下没有同步问题&#xff0c;所以我们将问题简化&#xff0c;所提到的变量都是线程内部独有的&#xff0c;不用考虑任何多线程问题。&#xff08;转载…

《评人工智能如何走向新阶段》后记(再续16)

由AI科技大本营下载自视觉中国181.5种常见的机器学习方法。 &#xff08;1&#xff09;线性回归linear regression: 一种流行的回归算法&#xff0c;从样本特征的线性组合&#xff0c;linear combination中学习模型。 &#xff08;2&#xff09;负数几率回归&#xff0c;logis…

怎么样才能快速的把淘宝店铺推广出去

我来到淘宝近一个月了,目前顺利地得到了两颗心心.感触颇多.其中店铺的推广显得尤其重要&#xff0c;应很多淘友的提问&#xff0c;我把一些店铺推广技巧介绍如下,你如果觉得有益,就回一下贴,以示支持.在这里先谢谢了&#xff01;先看第一板斧&#xff1a;一、修练内功&#xff…

linux的ftp服务器

2019独角兽企业重金招聘Python工程师标准>>> ftp服务器在网上较为常见&#xff0c;Linux ftp命令的功能是用命令的方式来控制在本地机和远程机之间传送文件&#xff0c;这里详细介绍Linux ftp命令的一些经常使用的命令&#xff0c;相信掌握了这些使用Linux 进行ftp操…

使用Forms Authentication实现用户注册、登录 (二)用户注册与登录

从这一部分开始&#xff0c;我们将通过一个实际的完整示例来看一下如何实现用户注册与登录。在介绍注册与登录之前&#xff0c;我们首先介绍一下如何判断用户是否已登录&#xff0c;并未后面的示例编写一些基础代码。 判断用户是否已经登录首先&#xff0c;在Web站点项目中添加…

libev源码解析——调度策略

在《libev源码解析——监视器&#xff08;watcher&#xff09;结构和组织形式》中介绍过&#xff0c;监视器分为[2,-2]区间5个等级的优先级。等级为2的监视器最高优&#xff0c;然后依次递减。不区分监视器类型和关联的文件描述符的值&#xff0c;权限高的要优先于权限低的执行…

特斯拉AI团队招兵买马:“英雄不问出处”

2月3日&#xff0c;特斯拉创始人兼CEO埃隆•马斯克发布推特&#xff0c;贴出了Autopilot AI团队招聘人才的信息。马斯克在推特中表示&#xff0c;特斯拉AI团队将直接向马斯克回报&#xff0c;他几乎每天都会与团队保持沟通和交流&#xff0c;并透露团队base在德州奥斯汀。据特斯…

java中重载与重写的区别

最近了解一下重载和重写 一、重载(Overloading) &#xff08;1&#xff09; 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在&#xff0c;具有不同的参数个数/类型。 重载Overloading是一个类中多态性的一种表现。 &#xff08;2&#xff09; Ja…