Windows10下设置ctrl+shift切换输入法

从Windows7升级到Windows10之后,发现有个问题,那就是传统的ctrl+shift不能用了,切换中英键盘必须用shift,对于经常用shift来大写字母的人来说,时常手抖一下就切换到别的输入法了,真是一种麻烦。而找遍网络上基本没有合适的方案,于是笔者只能自己设计一种替代方案,可以达到禁止shift切换输入法,只能用ctrl+shift才能切换输入法。1. 下载手心输入法,这款输入法的特点是没有干扰,不像百度输入法和搜狗输入法在输入的过程中植入广告。2. 系统设置 -> 时间和语言 -> 语言3. 系统设置 -> 时间和语言 -> 语言 -> 拼写、键入和键盘设置 - 高级键盘设置 - 语言栏选项 - 高级键设4. 手心输入法,右键

January 14, 2019 · 1 min · jiezi

前嗅ForeSpider教程:采集网页链接/源码/时间/重定向地址等

今天小编来为大家介绍一个非常实用又简单的操作,就是如何用前嗅ForeSpider采集网页链接/源码/时间/重定向地址,同时为了方便大家采集,前嗅ForeSpider已经提前把网页链接/源码/时间/重定向地址等采集中常有的基本项,预先写好了功能,具体步骤如下:第一步:新建任务①点击左上角“加号”新建任务,如图1:②弹窗里填写采集地址,任务名称,如图2:③ 点击下一步,勾选抽取链接,选择网页内所有链接,如图3:④完成后模板抽取配置列表有一个模板,默认模板。默认模板下自动生成一个链接抽取,名称为网页全部链接,如4:第二步:创建新的模板,并新建数据抽取①模板配置,点击“新建模板”按钮,得到新建模板,如图5。②新建数据抽取。直接点击模板二,点击上面“新建数据抽取”按钮,得到数据抽取,如图6。③关联模板在软件中模板的关联关系,与网页中链接跳转的关系相同。根据网页跳转规律,将“网页全部链接”关联模板“新建模板02”,如图7:第三步:创建/选择表单①在ForeSpider爬虫中,表单是可以复用的,所以可以在数据表单出直接选择之前建过的表单,也可以通过表单ID来进行查找并关联数据表单。此处使用的方法三,如图8。方法一:通过下拉菜单或表单ID选择已有表单方法二:点击创建表单进入快速建表页面,新建表单方法三:点击“采集配置”-“数据建表”,点击采“采集表单”后面的如图8。②配置表单根据所需内容,配置表单字段(即表头),此处配置了包括网页主键、网页创建时间、网页获取时间、网页地址、全区内网页源码(包含当前标签)、选取内全部文本、选取内网页源码以及网页标题八个字段,表单如图9。以下字段为软件自带字段类型,无需确定选取取值。网页主键:网页唯一标识。网页创建时间:文档创建或网页发布的时间。网页获取时间:ForeSpider采集该网页的时间。网页地址:自动采集网页的URL地址。选区内网页源码(包含当前标签):采集选区内全部源代码,包含当前节点标签等,即整个选区的源代码。选区内全部文本:最常用的类型。点击Ctrl选择绿框后,采集选区里的全部内容选区内网页源码:采集选区内全部源代码,不包含当前节点标签等。网页标题:采集网页的标题。即网页<title>中的内容。③ 数据抽取链接处关联表单,如图10。第四步:采集预览①点击击右上角采集预览,如图11。②双击任意一条链接,看看是否可以得到和网页对应的规整的数据,如图12、图13。

January 14, 2019 · 1 min · jiezi

flask在Windows上的安装

flask是python的一个框架,因为其轻便而备受欢迎,在电脑中装好python后,进行flask的安装。1.首先要在电脑中安装pip,进入https://pypi.org/project/pip/#downloads进入网站后点击Download files,然后下载画线的文件下载完成后进行解压。 2.以管理员身份进入cmd,将目录切换到解压后的pip文件所在的目录,然后输入python setup.py install等待安装完成后,输入pip,发现命令可用 3.这时输入pip install flask等待安装完成即可。 4.如果在安装过程中出现网络超时报错,输入pip install flask -i http://pypi.douban.com/simple –trusted-host pypi.douban.com即可。

January 13, 2019 · 1 min · jiezi

树莓派3B+安装Windows 10 ARM

本文讲的是如何在树莓派3B+上安装Windows10 ARM版而非IOT版本主要参考以下来源:http://tieba.baidu.com/p/5768…http://shumeipai.nxez.com/201…准备:1.micro sd卡一张,至少16G的空间2.读卡器3.磁盘分区软件4.win10镜像:https://software-download.mic…5.驱动:https://github.com/driver1998…https://github.com/RpiWin10/D...6.UEFI:https://codeload.github.com/a...7.dism++:http://cdn.chuyu.me/Dism++10….一、SD卡分区把SD卡分成2个分区,第一个是100M的FAT32分区,剩下的空间分给第二个分区,NTFS,两个分区都设为主分区。注意:笔者给SD卡分区用的是手上装有Win10的笔记本,在笔者参考的两篇文章没有提到的是,系统只给了第一个分区自动分配了盘符,而第二个分区没有给分配盘符并且在资源管理器中不可见,如果你有遇到了相同的问题请参照文章末尾【U盘/SD卡识别成硬盘驱动】相关步骤,如果没有请无视。二、写入镜像准备4.下载完的压缩包解压并运行aria2_download_windows.cmd开始下载并制作iso镜像;下载完之后会询问是否制作ISO,此时按y进入ISO制作程序。此时选择2选项只制作install.wim(因为只会用到install.wim,当然你也可以选择生成完整ISO)。打开Dism++软件,选择【恢复功能】-》【系统还原】,目标映像打开刚才打开的ISO文件中的sourcesinstall.wim文件,写入位置选择刚才格式化的大分区。点击确定后请耐心等待。三、制作引导文件准备6.下载后解压打开,找到UEFI中的RaspberryPiPkgBinaryprebuilt2018Sep28-GCC5RELEASE将里面全部文件复制进入SD卡小的分区。笔者的SD卡大分区为H盘,小分区为G盘:以管理员身份打开cmd,依次输入以下命令:bcdboot H:\Windows /s G: /f UEFI /l zh-cnbcdedit/store G:\efi\microsoft\boot\bcd /set {default} testsigning onbcdedit/store G:\efi\microsoft\boot\bcd /set {default} nointegritychecks on完成以上步骤后,sd卡小分区内的文件如下图所示:四、安装驱动新建一个文件夹用来存放驱动文件,笔者的目录为:D:RPI-Drivers将准备5.第一个链接下载的文件中bsp-masterprebuilt下所有文件夹中xxx.cat,xxx.inf,xxx.sys的三个文件全部拷贝到D:RPI-Drivers目录下;将准备5.第二个链接中dwusb.cat、dwusb.inf和dwusb.sys三个文件拷贝到D:RPI-Drivers目录下。接下来使用dism 命令来安装驱动:dism /image:H: /add-driver /driver:D:\RPI-Drivers /forceunsigned五、安装Windows 10 ARM将SD卡取出插入树莓派中,去掉所有USB外设,插入电源启动,大概需要一个多小时安装完毕,笔者在中间大概遇到多次提示系统遇到错误,需要重新启动,请无视…另外笔者在安装中并没有出现参考文章中出现的要在进入UEFI设置界面中修改系统启动模式的情况,默认就是【Boot in EL1】,如果你的无法正常启动,请将启动模式改为【Boot in EL1】修改需要插上键鼠,修改完重启一定要把USB外设全部去掉,不然可能启动会报错。成功进入系统后,接上键鼠进行操作,实际体验情况比较糟糕,系统反应比较迟钝,并且因为没有相关网卡驱动无法联网…U盘/SD卡识别成硬盘驱动1.下载以下驱动:http://a.xiazai163.com/system…2.永久禁用Win10驱动程序强制签名–2.1在开始按钮点击右键,选择“命令提示符(管理员)”–2.2执行以下命令(复制后,在命令提示符中单击鼠标右键即可完成粘贴,然后按回车键执行):bcdedit.exe /set nointegritychecks on–2.3命令瞬间执行完毕,若想恢复默认验证,执行如下命令即可:bcdedit.exe /set nointegritychecks off3.更新你的SD卡读卡器的驱动程序若没有操作上述的第2步,将被系统阻止无法更新驱动程序。–3.1win+X键打开设备管理器选择磁盘驱动管理后,选择需要更新的驱动,笔者这里用的是USB读卡器,需要更新USB驱动,根据自己实际情况更新你的USB驱动或者SD卡驱动–3.2右键更新驱动程序软件后选择【从计算机的设备驱动程序列表中选取】-》选择【从磁盘安装】-》选择步骤1.下载的驱动–3.3更新完后重启计算机如果以上步骤2.你选择的是暂时禁用Win10驱动程序强制签名,而非笔者推荐的永久禁用Win10驱动程序强制签名,重启电脑后可能会遇到蓝屏无法正常启动系统,并且按F8也无法进入安全模式。这时候需要按系统提示进入启动设置并再一次选择【禁用驱动程序强制签名】就可以正常启动系统了。

January 12, 2019 · 1 min · jiezi

前嗅ForeSpider教程:采集需要登陆的网页内容

第一步:新建任务①点击左上角“加号”新建任务,如图1:②弹窗里填写采集地址,任务名称,开启手动登录配置,如图2:若未在此处开启登录配置,可在模板抽取配置中点击相应的模板,开启登录配置,如图3。③点击下一步,选择进行数据抽取还是链接抽取,本次采集列表下的正文数据,所以本次需要抽取内容选择链接列表,所以点击抽取链接,选择链接列表,如图4:④完成后模板抽取配置列表有两个模板,默认模板和子栏目。默认模板下自动生成一个链接抽取,名称为链接列表,此链接抽取已与链接列表模板关联,如图5:第二步:配置登录① 内置浏览器找到登录按钮,弹出登录框,如图6:③按Ctrl+鼠标左键单击“用户名输入框”,如图7。④.填写用户名、密码,如图8。④.点击“完成”,cookie配置框中出现数据,按Ctrl+鼠标左键单击“登录按钮”,内置浏览器页面登录成功,配置完成,如图9。第三步:通过地址过滤,得到所需链接。①点击采集预览,在采集预览中有于目标链接相似的其他链接,可通过地址过滤得到列表链接。找到所需要的列表链接,观察得出所需要的目标链接都包含“thread-”,右击复制链接,如图10所示。②勾选地址过滤,过滤规则选择包含,填入“thread-”,得到列表链接,如图11所示。④点击采集预览确认链接是否过滤完全,如图12第四步:关联模板在软件中模板的关联关系,与网页中链接跳转的关系相同。根据网页跳转规律,将“链接列表”关联模板二“链接列表:02”,此处由于我们开始就选择了创建列表链接,所以软件自动关联好了模板二。如果配置的时候发现关联有问题,可以自己进行更改,如图13第五步:创建翻页链接抽取 方法一:创建任务,勾选链接抽取,直接选择链接列表和普通翻页,如图14。方法二:如果创建任务时,只勾选了链接列表,可以点击上一步,回到模板层,补选翻页链接抽取,点击下一步,创建翻页链接。方法三:直接点击模板二,点击上面“新建链接抽取” 按钮,得到链接抽取,并重名命为翻页链接抽取,如图15。第六步:通过地址过滤,得到所需翻页链接。①右击模板预览找到翻页链接,如图16所示。观察链接得出规律使用“page=”得到目标链接。②勾选地址过滤,过滤规则选择包含,将复制的目标地址粘入,使用共用词“page=”过滤得到目标链接,如图17。④点击采集预览确认链接是否过滤完全,如图18④关联“翻页”情况一:创建模板或通过向导,创建的翻页链接抽取,会默认关联模板一,即当前页模板,如图19。情况二:手动点击按钮创建翻页链接抽取,需要手动关联第七步:填写模板示例地址并新建数据抽取①将模板一过滤得到的任意一条链接,作为链接列表模板的示例地址。如:https://bbs.360.cn/thread-156…, 见图20:②新建数据抽取。直接点击链接列表,点击上面“新建数据抽取” 按钮,得到数据抽取,如图21。第八步:创建/选择表单①在ForeSpider爬虫中,表单是可以复用的,所以可以在数据表单出直接选择之前建过的表单,也可以通过表单ID来进行查找并关联数据表单。此处使用的方法三,如图22。方法一:通过下拉菜单或表单ID选择已有表单方法二:点击创建表单进入快速建表页面,新建表单方法三:点击“采集配置”-“数据建表”,点击采“采集表单”后面的 如图22。②配置表单根据所需内容,配置表单字段(即表头),此处配置了包括网页主键、发布时间、正文内,网页标题以及网页地址五个字段,表单如图23。④数据抽取链接处关联表单,如图24。第九步:字段取值①取值方法:按住Ctrl+鼠标左键,进行区域选择,按住Shift+鼠标左键,扩大选择区域。pub_time、content字段,如图25、图26:②点击采集预览确数据是否采集完全,如图27:第十步:采集预览① 点击右上角采集预览,如图28:③点击任意一条链接,看看是否可以得到和网页对应的规整的数据,如图29:

January 12, 2019 · 1 min · jiezi

Windows 下安装 SCWS

导语关于分词,现在有很多解决方法,根据自己需要进行选择。项目中用到了 SCWS ,安装好记录下。SCWSSCWS 是 Simple Chinese Word Segmentation 的首字母缩写(即:简易中文分词系统)。这是一套基于词频词典的机械式中文分词引擎,它能将一整段的中文文本基本正确地切分成词。如上,SCWS 是一套分词系统。虽然这套系统可能有些过时,算法不是很精确,但在某些特定场合还是比较实用的下载扩展首先根据自己的 PHP 版本,下载相应的扩展。下载完成后,将 php_scws.dll 放到 PHP 安装目录的 etc/ 下。下载规则集文件和词典文件首先新建目录,用于存放规则集文件和词典文件。如:D:/scws/ 。然后在这里下载规则集文件,下载后解压,将 etc/ 目录中的 *.ini 文件放到 D:/scws/ 中。接着在这里下载词典文件,将 *.xdb 文件放到 D:/scws/ 中。修改 php.ini在 pnp.ini 中添加 extension=php_scws.dll,同时可以写上配置参数:scws.default.fpath = “D:/scws/” 。测试到此如果一切顺利便安装成功,下面进行测试<?php $string = ‘安能摧眉折腰事权贵,使我不得开心颜’; $data = ‘’; $obj = scws_new(); $obj->set_charset(‘utf8’); $obj->add_dict(ini_get(‘scws.default.fpath’) . ‘/dict.utf8.xdb’); $obj->set_rule(ini_get(‘scws.default.fpath’) . ‘/rules.utf8.ini’); $obj->set_duality(true); $obj->set_ignore(true); $obj->set_multi(2); $obj->send_text($string); $array = $obj->get_result(); foreach ($array as $key => $value) { $data .= $value[‘word’] . ‘,’; } echo rtrim($data, ‘,’);// 安能,摧眉折腰,摧眉,眉折,折腰,事,权贵,使我,我,不得,开心,颜参考资料:SCWS、SCWS分词扩展在windows下的安装方法。 ...

January 12, 2019 · 1 min · jiezi

前嗅ForeSpider教程:通过搜索框检索关键词采集数据

第一步:新建任务①点击左上角“加号”新建任务,如图1:②在弹窗里填写采集地址、任务名称,由于此次需要配置关键词,所以在新建任务时,需要勾选一下“关键词采集”如图2:③点击下一步,选择进行数据抽取还是链接抽取,本次采集需要采集列表页中正文的所有文本信息,所以此处需要勾选“抽取链接”-“普通翻页”,如图3:第二步:配置关键词①由于在创建任务时,选择了关键词采集,所以此时,显示在任务层,如图4②按照右侧关键词配置步骤的提示(每个步骤按钮可以点击,如无此操作步骤,可直接跳过),开始配置关键词,如图5<1>点击关键词,按照操作提示,按住ctrl+鼠标左键点击搜索框<2>在完成步骤时,按住ctrl+鼠标左键点击搜索按钮③关键词列表处,填写关键词,并点击保存,如图6第三步:通过标题过滤,过滤翻页链接①点击采集预览,我们可以发现,翻页链接即为名为:“下一页”的链接。对于翻页,只需要取到标题名为“下一页”的链接即可。②这里应用标题过滤,过滤规则选择“包含”,过滤串填写“下一页”即可。如图7③点击采集预览查看是否过滤成功,如图8第四步:关联模板在软件中模板的关联关系,与网页中链接跳转的关系相同。①关联“链接列表”根据网页跳转规律,将“链接列表”关联模板二“链接列表:02”,此处由于我们开始就选择了创建列表链接,所以软件自动关联好了模板二。如果配置的时候发现关联有问题,可以自己进行更改,如图9②关联“翻页”(对应第四步创建翻页链接抽取)情况一:创建模板或通过向导,创建的翻页链接抽取,会默认关联模板一,即当前页模板,如图11。情况二:手动点击按钮创建翻页链接抽取,需要手动关联,如图10。第五步:填写模板二示例地址并新建数据抽取①模板一过滤得到的任意一条链接,作为模板二的示例地址。如:http://www.baidu.com/link?url…, 见图11:②新建数据抽取方法一:通过点击“下一步”后勾选抽取数据,再次点击“下一步”得到数据抽取,如图12方法二:直接点击模板二,点击上面“新建数据抽取”按钮,得到数据抽取,如图12第六步:创建/选择表单在ForeSpider爬虫中,表单是可以复用的,所以可以在数据表单出直接选择之前建过的表单,也可以通过表单ID来进行查找并关联数据表单。此处使用的是之前建过的凤凰网的表单,如图13方法一:通过下拉菜单或表单ID选择已有表单方法二:点击创建表单进入快速建表页面,新建表单方法三:点击“采集配置”-“数据建表”,点击采“采集表单”后面的如图14第七步:配置表单根据所需内容,配置表单字段(即表头),此处配置了包括网页标题、网页地址、全部文本三个字段,表单如图15第八步:字段取值取值方法:由于网页标题和网页地址是可以自动取值的字段,所以我们只需要取到网页文本即可。text字段,如图16第九步:模板预览①鼠标右键点击“数据抽取”,然后点击“模板预览”,如图17②预览结果如图18第十步:采集预览①点击右上角采集预览,如图19②点击任意一条链接,看看是否可以得到和网页对应的规整的数据,如图20

January 11, 2019 · 1 min · jiezi

Windows 下安装 Redis

导语安装了几次总是记不住,整理记录下,以后方便用。RedisREmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。Redis 没有官方的Windows版本,但是微软开源技术团队(Microsoft Open Tech group)开发和维护着这个 Win64 的版本。更多信息请参考这里。下载Redis 的官网不提供 Windows 版本的下载,不过可以从 Github 上下载。自己选择版本进行下载。安装以及测试下载完成后,双击 redis-server.exe 即可启动。成功会出现以下界面接下来进行测试,在当前目录打开 cmd 窗口,进行测试。如下所示,即安装成功下一步是注册为系统服务解决错误测试安装的时候出现了错误,注册为系统服务之后,无法启动。在 Windows 服务中查看,报了1064错误。然后在 redis.windows.conf 中修改 logfile 配置,查看了日志,错误信息为Creating Server TCP listening socket *:6379: bind: Unknown error。看了 redis.windows.conf 发现 # bind 127.0.0.1 这句被注释掉了。删掉 # ,注意 # 后的空格也要删掉,再次启动就好了。卸载卸载之前先停止 Redis 服务,然后进行卸载操作安装PHP扩展以及测试要想在 PHP 中使用,还需要安装扩展。在这里找到匹配 Redis 和 PHP 版本的扩展。将 php_redis.dll 复制到 PHP 目录中的 ext 目录下;修改 php.ini,添加extension=php_redis.dll;重启服务器;使用代码进行测试<?php$redis = new Redis();$redis->connect(‘127.0.0.1’, ‘6379’);echo $redis->get(‘key’);// value参考资料:Redis官网、Redis中文网、菜鸟教程。 ...

January 10, 2019 · 1 min · jiezi

前嗅ForeSpider教程:同时采集列表和正文的数据

昨天为大家介绍的是如何通过子栏目进入链接列表采集正文,那么如何同时采集列表和正文数据呢?第一步:新建任务①点击左上角“加号”新建任务,如图1:② 弹窗里填写采集地址,任务名称,如图2:③点击下一步,选择进行数据抽取还是链接抽取,本次采集当前页面子栏目下的列表房源的正文数据,子栏目房源列表是通过点击子栏目链接进入的,所以本次需要抽取子栏目链接,所以点击抽取链接,选择子栏目,如图3:④ 完成后模板抽取配置列表有两个模板,默认模板和子栏目。默认模板下自动生成一个链接抽取,名称为子栏目,此链接已与子栏目模板关联,如图4。第二步:通过地址过滤,得到所需的子栏目链接①点击采集预览,在采集预览中有于目标链接相似的其他链接,可通过地址过滤得到二手房子栏目链接。找到所需要的子栏目链接,右击复制链接,如图5所示。② 选地址过滤,过滤规则选择包含,将复制的目标地址粘入,使用过滤串“e”得到二手房子栏目链接,如图6所示。过滤串规则说明:e 文件结束(忽略所有请求参数)③点击采集预览确认链接是否过滤完全,如图7第三步:填写子栏目模板示例地址并新建链接抽取①填写示例地址,将模板一过滤得到的任意一条链接,作为子栏目的示例地址,即二手房子栏目列表页链接,如图8所示。②直接点击子栏目模板,点击上面“新建链接抽取”按钮,得到链接抽取,如图9。第四步:通过地址过滤,得到所需列表链接①右击模板预览找到房源列表链接,如图10所示。观察链接得出规律使用过滤串得到目标链接。②勾选地址过滤,过滤规则选择包含,将复制的目标地址粘入,使用共用词“chushou”过滤得到目标链接,如图11。③点击采集预览确认链接是否过滤完全,如图12第五步:创建翻页链接抽取方法一:创建任务,勾选链接抽取,直接选择链接列表和普通翻页,如图13。方法二:如果创建任务时,只勾选了链接列表,可以点击上一步,回到模板层,补选翻页链接抽取,点击下一步,创建翻页链接。方法三:直接点击模板二,点击上面“新建链接抽取”按钮,得到链接抽取,并重名命为翻页,如图14。第六步:通过标题过滤,过滤翻页链接①点击采集预览,我们可以发现,翻页链接即为名为上一页、下一页两条链接。对于翻页,只需要取到标题名为“下一页”的链接即可。②这里应用标题过滤,过滤规则选择“包含”,过滤串填写“下一页”即可。如图15。③ 点击采集预览查看是否过滤成功,如图16④关联“翻页”情况一:创建模板或通过向导,创建的翻页链接抽取,会默认关联模板一,即当前页模板。情况二:手动点击按钮创建翻页链接抽取,需要手动关联,如图17。第七步:创建数据抽取,创建/添加表单①新建数据抽取。在子栏目模板,点击上面“新建数据抽取”按钮,得到数据抽取,重命名为房天下列表,如图18。② 点击“采集配置”-“数据建表”,点击采“采集表单”后面的如图19。③配置表单根据所需内容,配置表单字段(即表头),此处配置了包括网页主键、网页链接,两个字段,表单如图20。④ 点击子栏目链接抽取,关联房天下列表表单,如图21所示。⑤ 右击模板预览,观察模板是否有数据,如图22。第八步:创建新的模板,并新建数据抽取①在模板配置,点击“新建模板”按钮,得到新建模板,重命名为正文数据模板,如图23。②新建数据抽取。直接点击模板三,点击上面“新建数据抽取”按钮,得到数据抽取,如图24。③关联模板在软件中模板的关联关系,与网页中链接跳转的关系相同。根据网页跳转规律,将“链接抽取”关联模板“正文数据模板”,如图25第九步:创建/选择表单①在ForeSpider爬虫中,表单是可以复用的,所以可以在数据表单出直接选择之前建过的表单,也可以通过表单ID来进行查找并关联数据表单。此处使用的是之前建过的房天下的表单,如图26。② 过下拉菜单或表单ID选择已有表单第十步:字段取值取值方法:按住Ctrl+鼠标左键,进行区域选择,按住Shift+鼠标左键,扩大选择区域。Text字段,如图27第十一步:模板预览①鼠标右键点击“数据抽取”,然后点击“模板预览”,如图28② 预览结果如图29第十二步:采集预览①点击右上角采集预览,如图30。②双击任意一条链接,看看是否可以得到和网页对应的规整的数据,如图31、图32。

January 10, 2019 · 1 min · jiezi

前嗅ForeSpider教程:通过子栏目进入链接列表采集正文数据

今天小编为大家介绍一下如何通过子栏目进入链接列表采集正文,具体流程如下:第一步:新建任务①点击左上角“加号”新建任务,如图1:②在弹窗里填写采集地址,任务名称,如图2:③点击下一步,选择进行数据抽取还是链接抽取,本次采集当前页面子栏目下的列表房源的正文数据,子栏目房源列表是通过点击子栏目链接进入的,所以本次需要抽取子栏目链接,所以点击抽取链接,选择子栏目,如图3:④完成后模板抽取配置列表有两个模板,默认模板和子栏目。默认模板下自动生成一个链接抽取,名称为子栏目,此链接已与子栏目模板关联,如图4。第二步:通过地址过滤,得到所需的子栏目链接。①点击采集预览,在采集预览中有于目标链接相似的其他链接,可通过地址过滤得到二手房子栏目链接。找到所需要的子栏目链接,右击复制链接,如图5所示。②勾选地址过滤,过滤规则选择包含,将复制的目标地址粘入,使用过滤串“E”得到二手房子栏目链接,如图6所示。过滤串规则说明:E 文件结束(忽略所有请求参数)③点击采集预览确认链接是否过滤完全,如图7第三步:填写子栏目模板示例地址并新建链接抽取①填写示例地址,将模板一过滤得到的链接,作为子栏目的示例地址,即二手房子栏目列表页链接,如图8所示。②直接点击子栏目模板,点击上面“新建链接抽取”按钮,得到链接抽取,如图9。第四步:通过地址过滤,得到所需列表链接。①右击模板预览找到房源列表链接,如图10所示。观察链接得出规律使用过滤串得到目标链接。②勾选地址过滤,过滤规则选择包含,将复制的目标地址粘入,使用共用词“chushou”过滤得到目标链接,如图11。③点击采集预览确认链接是否过滤完全,如图12第五步:创建翻页链接抽取方法一:创建任务,勾选链接抽取,直接选择链接列表和普通翻页,如图13。方法二:如果创建任务时,只勾选了链接列表,可以点击上一步,回到模板层,补选翻页链接抽取,点击下一步,创建翻页链接。方法三:直接点击模板二,点击上面“新建链接抽取”按钮,得到链接抽取,并重名命为翻页,如图14。第六步:通过标题过滤,过滤翻页链接①点击采集预览,我们可以发现,翻页链接即为名为上一页、下一页两条链接。对于翻页,只需要取到标题名为“下一页”的链接即可。②这里应用标题过滤,过滤规则选择“包含”,过滤串填写“下一页”即可。如图15。③点击采集预览查看是否过滤成功,如图16.⑤关联“翻页”情况一:创建模板或通过向导,创建的翻页链接抽取,会默认关联模板一,即当前页模板,如图17。情况二:手动点击按钮创建翻页链接抽取,需要手动关联。第七步:创建新的模板,并新建数据抽取①在模板配置,点击“新建模板”按钮,得到新建模板,重命名为正文数据模板,如图18。②新建数据抽取。直接点击模板二,点击上面“新建数据抽取”按钮,得到数据抽取,如图19。③关联模板在软件中模板的关联关系,与网页中链接跳转的关系相同。根据网页跳转规律,将“新建链接抽取”关联模板“正文数据模板”,如图20第八步:创建/选择表单在ForeSpider爬虫中,表单是可以复用的,所以可以在数据表单出直接选择之前建过的表单,也可以通过表单ID来进行查找并关联数据表单。此处使用的是之前建过的房天下的表单,如图21。方法一:通过下拉菜单或表单ID选择已有表单方法二:点击创建表单进入快速建表页面,新建表单方法三:点击“采集配置”-“数据建表”,点击采“采集表单”后面的如图22。第九步:配置表单根据所需内容,配置表单字段(即表头),此处配置了包括网页主键、标题、网页链接,以及文本内容四个字段,表单如图23。第十步:字段取值取值方法:按住Ctrl+鼠标左键,进行区域选择,按住Shift+鼠标左键,扩大选择区域。Text字段,如图24:第十一步:模板预览① 标右键点击“数据抽取”,然后点击“模板预览”,如图25②预览结果如图26:第十二步:采集预览① 击右上角采集预览,如图27。②双击任意一条链接,看看是否可以得到和网页对应的规整的数据,如图28、图29。

January 9, 2019 · 1 min · jiezi

前嗅ForeSpider教程:采集表格/列表页中的数据(翻页)

今天小编就以孔夫子旧书网的最近出版板块为例(http://www.kongfz.com/1004/)为例,教大家如何采集列表页的所有数据:第一步:新建任务①击左上角“加号”新建任务,如图1:②在弹窗里填写采集地址,任务名称如图2:③点击下一步,选择进行数据抽取还是链接抽取,本次采集需要采集当前板块的列表页所有内容,所以只需要在同一个模板中进行翻页链接抽取以及数据抽取即可。此处需要勾选“抽取链接”-“普通翻页”以及“抽取数据”,如图3:第二步:创建/选择表单在ForeSpider爬虫中,表单是可以复用的,所以可以在数据表单出直接选择之前建过的表单,也可以通过表单ID来进行查找并关联数据表单。此处使用的是的旧书网的表单,如图4方法一:通过下拉菜单或表单ID选择已有表单方法二:点击创建表单进入快速建表页面,新建表单方法三:点击“采集配置”-“数据建表”,点击采“采集表单”后面的 如图5第三步:配置表单根据所需内容,配置表单字段(即表头),此处配置了包括标题、作者、价格三个字段,表单如图6第四步:字段取值取值方法:由于此处活取的是列表页的数据,所以可以应用“识别列表”功能,直接取到列表数据,操作方法如下:①点击“数据抽取-旧书网”,按住ctrl+鼠标左键点击任意一部分内容,如图7,选中标题②按住Shift+鼠标左键继续点击,直到点击到选中整个第一条数据,如图8③在软件的右下角可以看到“识别列表”按钮 ,此时点击“识别列表”,如图9,此时列表中的内容都已经选中。③对每个字段进行取值,方法依然是:按住Ctrl+鼠标左键,进行区域选择,按住Shift+鼠标左键,扩大选择区域。如:price-cover字段首先在左侧点到price-cover字段上,在浏览器中对该字段进行取值.<1>按住ctrl+鼠标左键,点击“新书”<2>按住shift+鼠标左键继续点击,直到选中图10中的全部内容<3>点击右下角“确认选区” 第五步:模板预览①标右键点击“数据抽取”,然后点击“模板预览”,如图11②预览结果如图12第六步:应用定位过滤,过滤翻页链接①标点击“链接抽取-普通翻页”,内置浏览器拉到最底端找到翻页,如图13②按住Ctrl+鼠标左键点击第一页,按住shift+鼠标左键,扩大选区,直到选中整行,如图14③点击“确认选区” ④点击“采集预览”查看链接过滤是否完全,此处由于只有一个模板,所以链接和数据在同一个预览框里,直接点击预览的结果如图15⑤点击“链接信息数目”,查看对应的链接,如图16,由于第9页之后直接就是第15页,如果怕中间页数取不到,可以双击第9页试试看第七步:采集预览双击任意一页链接,点击“旧书网”均可得到对应的列表数据如图17

January 8, 2019 · 1 min · jiezi

vue-cli2 构建速度优化

对于使用 vue-cli 脚手架创建的前端项目,编译发布几乎是必需操作,有的编译只需要几秒钟,快如闪电,有的却需要好几分钟,慢如蜗牛。如果是线上进行热修复,那更是分秒必争,网页响应的速度直接影响了用户体验,用户不会那么有耐心长时间等着,让你慢慢编译。网上流传 vue-cli 一些优化配置,有些在新版本的 vue-cli 和 webpack3 已经不再需要了,有些是针对 webpack4 的。对于新版本的 vue-cli 和 webpack3,以下简单配置优化后,即可大幅提升构建速度。按需引用及动态路由启用 uglifyjs-webpack-plugin 缓存关闭 source-map利用 DllPlugin 和 DllReferencePlugin 提取公用库一、动态路由1、修改 src/router/index.jsimport Vue from ‘vue’import Router from ‘vue-router’// webpackChunkName 打包后的文件名const Menu = () => import(/* webpackChunkName: ‘Menu’ / ‘@/pages/menu/index.vue’)export default new Router({ routes: [ { path: ‘/’, name: ‘Menu’, component: Menu } ]})2、配置 .babelrc(可选){ … “comments”: true, // 输出编译信息 “plugins”: [“transform-vue-jsx”, “transform-runtime”]}3、修改 build/webpack.prod.conf.jsoutput: { path: config.build.assetsRoot, filename: utils.assetsPath(‘js/[name].[chunkhash].js’), chunkFilename: utils.assetsPath(‘js/[name].js’) // 使用webpackChunkName定义的文件名},二、启用 uglifyjs-webpack-plugin 缓存new UglifyJsPlugin({ parallel: true, // 并行 cache: true // 缓存}),三、关闭 source-map修改 src/config/index.js 中 productionSourceMap 值productionSourceMap:false四、公用库提取1、安装 clean-webpack-plugin add-asset-html-webpack-pluginyarn add clean-webpack-plugin add-asset-html-webpack-plugin@2.1.0 –dev2、build 目录下创建 webpack.dll.conf.jsconst webpack = require(‘webpack’)const path = require(‘path’)const CleanWebpackPlugin = require(‘clean-webpack-plugin’)const dllPath = path.resolve(__dirname, ‘../src/assets/dll’) // dll文件存放的目录process.env.NODE_ENV = ‘production’ // NODE_ENV 设置为 production 减少依赖module.exports = { entry: { // 把 vue 相关模块的放到一个单独的动态链接库 vue: [‘babel-polyfill’, ‘vue’, ‘vue-router’, ‘vuex’, ‘axios’, ’element-ui’] }, output: { filename: ‘[name]-[hash].dll.js’, // 生成vue.dll.js path: dllPath, library: ‘dll[name]’ }, plugins: [ new CleanWebpackPlugin([’.js’], { // 清除之前的dll文件 root: dllPath }), new webpack.DefinePlugin({ ‘process.env’: { NODE_ENV: JSON.stringify(process.env.NODE_ENV) // 设置环境变量 } }), new webpack.DllPlugin({ name: ‘dll[name]’, // manifest.json 描述动态链接库包含了哪些内容 path: path.join(__dirname, ‘./’, ‘[name].dll.manifest.json’) }), // 压缩代码 new webpack.optimize.UglifyJsPlugin({ compress: { warnings: false, pure_funcs: [‘console.log’] }, sourceMap: false }) ]}3、在 package.json 中新增 dll 构建命令"scripts": { “dll”: “webpack –config build/webpack.dll.conf.js” // dll打包命令 },4、修改 build/webpack.prod.conf.jsconst AddAssetHtmlPlugin = require(‘add-asset-html-webpack-plugin’)plugins: [ // 引用 manifest.json new webpack.DllReferencePlugin({ manifest: require(’./vue.dll.manifest.json’) }), // 将 dll 注入到 生成的 html 模板中 new AddAssetHtmlPlugin({ filepath: path.resolve(__dirname, ‘../src/assets/dll/*.js’), // dll文件位置 publicPath: config.build.assetsPublicPath + utils.assetsPath(‘dll/’), // dll 引用路径 outputPath: config.build.assetsPublicPath + utils.assetsPath(‘dll/’), // dll最终输出的目录 includeSourcemap: false // hash: true, }), …]五、编译yarn run dll // 运行一次生成 dll 文件即可,下次构建时不必运行yarn run build ...

January 7, 2019 · 2 min · jiezi

前嗅ForeSpider教程:采集表格/列表页中的数据(不翻页)

今天,小编来为大家展示一下用前嗅ForeSpider采集表格/列表的操作流程,步骤如下:第一步:新建任务① 击左上角“加号”新建任务,如图1:②在弹窗里填写采集地址,任务名称如图2:③点击下一步,选择进行数据抽取还是链接抽取,本次采集需要采集当前页面列表中的所有内容,所以只需抽取列表数据即可,点击“抽取数据”,如图3:第二步:创建/选择表单在ForeSpider爬虫中,表单是可以复用的,所以可以在数据表单出直接选择之前建过的表单,也可以通过表单ID来进行查找并关联数据表单。此处使用的是的前嗅的表单,如图4方法一:通过下拉菜单或表单ID选择已有表单方法二:点击创建表单进入快速建表页面,新建表单方法三:点击“采集配置”-“数据建表”,点击采“采集表单”后面的如图5第三步:配置表单根据所需内容,配置表单字段(即表头),此处配置了包括标题、作者、价格三个字段,表单如图6第四步:字段取值取值方法:由于此处活取的是列表页的数据,所以可以应用“识别列表”功能,直接取到列表数据,操作方法如下:① 击“前嗅”,按住ctrl+鼠标左键点击任意一部分内容,如图7,选中“操作系统”②按住Shift+鼠标左键继续点击,直到点击到选中整个第一条数据,如图8③在软件的右下角可以看到“识别列表”按钮,此时点击“识别列表”,如图9,此时列表中的内容都已经选中。④对每个字段进行取值,方法依然是:按住Ctrl+鼠标左键,进行区域选择,按住Shift+鼠标左键,扩大选择区域。如:funct字段首先在左侧点到price-cover字段上,在浏览器中对该字段进行取值.<1>按住ctrl+鼠标左键,点击“操作系统”<3>点击右下角“确认选区”第五步:采集预览① 标右键点击“数据抽取”,然后点击“模板预览”,如图11②预览结果如图12 这样网页中的表格内容就采集下来了,如果大家在操作的过程中遇到问题,可以加入QQ技术交流群:641067546;或者拨打技术顾问电话:022-2730 3760;

January 7, 2019 · 1 min · jiezi

学会Markdown,写博客不愁

前言Markdown是一种轻量级的标记语言,有John Gruber以及Aaron Hillel Swartz一起编写。Aaron Hillel Swartz是一个极富传奇的黑客,有兴趣可以看看他的生平。由于Markdown轻量化,易读易写,网上支持者众多。Github、掘金、简书、博客园、csdn军支持该语法。所以,作为一个开发者,学习Markdown刻不容缓啊。快速入门(打怪)1.标题编写语法如法效果2.有序列表语法效果其实跟平常书写一样,这也是Markdown语法流行的原因之一3.无序列表应用场景:一般嵌套在有序列表中,作进一步表述说明效果结合有序列表4.图片应用场景:写技术文章需要图文结合,此时就需要插入图片了语法效果5.链接语法效果点击文字就会跳到百度首页,[] 表示该文字说明,可以修改。6.代码语法:这个没有语法,重要空出四个空格就可以了效果开发工具windows(升级,掉装备)文艺青年用mac,屌丝用window(穷啊),本人使用windows系统,所以使用的工具(装备)是markdownpad,该工具可以实时显示编写效果,是一个不错的工具,windows10安装需要环境,所以最好用电脑管家下载,因为他可以做到一键安装,不需要手动寻到环境。高级技巧Markdown支持内置html代码以及css,所以文艺青年可以根据自己爱好改变文字显示形式,秀他人一脸。不过经本人检验,简书、csdn不支持在markdown下内置HTML css。参考资料https://zh.wikipedia.org/wiki…公众号欢迎关注公众号 布尔bl ,分享Java相关信息技术、生活感悟。

January 7, 2019 · 1 min · jiezi

Windows使用技巧

(持续更新中…)喜欢的Windows软件vscode跨平台轻量IDE,有强大的插件市场chrome前端开发必备浏览器,不多说xshellssh免密快捷登录神器;高级版的是付费的,教育版免费,足以在大部分场景下使用,xShell教育版下载地址scoop安装软件的神器;确保PowerShell已经安装,执行以下命令即可安装scoop:iex (new-object net.webclient).downloadstring(‘https://get.scoop.sh’)scoop安装完成后,就可以使用命令行快速安装程序了,大多数程序安装不需要管理员权限,并且可以自动配置环境变量,例如:scoop install yarnscoop install pythonscoop install curlscoop官网sourcetree跨平台的git可视化管理工具https://www.sourcetreeapp.com/github desktopgithub官方的git工具cmder强大而美观的cli工具http://cmder.net/teamviewer远程控制软件,方便在家远程连公司网络办公,下载地址zoom远程会议,远程桌面演示必备Win10使用技巧截屏/录屏按win+g,可以开启游戏模式,这个模式下会有录屏工具出现点击黑色圆圈可以开始录屏,录屏完成后的视频文件会自动保存到视频/捕获文件夹中手机离开电脑自动锁定电脑需要蓝牙支持

January 7, 2019 · 1 min · jiezi

前嗅ForeSpider教程:通过链接列表采集正文数据(翻页)

今天小编为大家介绍一下如何通过前嗅ForeSpider采集系统通过连接列表采集正文数据的操作流程,这次的操作里边加入了翻页操作,这样在采集的过程中可以自动翻页继续采集啦~~~第一步:新建任务①点击左上角“加号”新建任务,如图1: ②在弹窗里填写采集地址,任务名称如图2:③点击下一步,选择进行数据抽取还是链接抽取,本次采集当前列表页新闻的正文数据,正文数据是通过点击列表链接进入的,所以本次需要抽取列表链接,所以点击抽取链接,如图3:第二步:通过智能过滤,得到所需链接。①按住Ctrl+鼠标左键点击所需链接;②点击“智能过滤”按钮,如图4: 第三步:点击采集预览确认链接是否过滤完全,如图5第四步:创建翻页链接抽取 方法一:创建任务,勾选链接抽取,直接选择链接列表和普通翻页,如图6方法二:如果创建任务时,只勾选了链接列表,可以点击上一步,回到模板层,补选翻页链接抽取,点击下一步,创建翻页链接方法三:直接点击模板二,点击上面“新建链接抽取” 按钮,得到链接抽取,如图7第五步:通过标题过滤,过滤翻页链接①点击采集预览,我们可以发现,翻页链接即为名为上一页、下一页两条链接。对于翻页,只需要取到标题名为“下一页”的链接即可。②这里应用标题过滤,过滤规则选择“包含”,过滤串填写“下一页”即可。如图8④击采集预览查看是否过滤成功,如图9第六步:关联模板在软件中模板的关联关系,与网页中链接跳转的关系相同。①关联“链接列表”根据网页跳转规律,将“链接列表”关联模板二“链接列表:02”,此处由于我们开始就选择了创建列表链接,所以软件自动关联好了模板二。如果配置的时候发现关联有问题,可以自己进行更改,如图10②关联“翻页”(对应第四步创建翻页链接抽取)情况一:创建模板或通过向导,创建的翻页链接抽取,会默认关联模板一,即当前页模板,如图11。情况二:手动点击按钮创建翻页链接抽取,需要手动关联,如图11。第七步:填写模板二示例地址并新建数据抽取①将模板一过滤得到的任意一条链接,作为模板二的示例地址。如:http://pl.ifeng.com/opinion/z…, 见图12 ②新建数据抽取方法一:通过点击“下一步”后勾选抽取数据,再次点击“下一步”得到数据抽取,如图13方法二:直接点击模板二,点击上面“新建数据抽取” 按钮,得到数据抽取,如图13第八步:创建/选择表单在ForeSpider爬虫中,表单是可以复用的,所以可以在数据表单出直接选择之前建过的表单,也可以通过表单ID来进行查找并关联数据表单。此处使用的是之前建过的凤凰网的表单,如图14方法一:通过下拉菜单或表单ID选择已有表单方法二:点击创建表单进入快速建表页面,新建表单方法三:点击“采集配置”-“数据建表”,点击采“采集表单”后面的 如图15第九步:配置表单根据所需内容,配置表单字段(即表头),此处配置了包括标题、作者、发布时间、文本内容以及网址五个字段,表单如图16第十步:字段取值取值方法:按住Ctrl+鼠标左键,进行区域选择,按住Shift+鼠标左键,扩大选择区域。title字段,点击“确认选区”按钮,确认操作,如图17第十一步:模板预览①鼠标右键点击“数据抽取”,然后点击“模板预览”,如图18②预览结果如图19第十二步:采集预览①点击右上角采集预览,如图20②点击任意一条链接,看看是否可以得到和网页对应的规整的数据,如图21 前嗅大数据——深度大数据专家 前嗅(www.forenose.com)是首个深度大数据专家。 提供数据采集-分析-处理-管理-营销-应用, 自主知识产权的全套大数据产品

January 5, 2019 · 1 min · jiezi

前嗅教程:采集正文数据(不翻页)

上周前嗅ForeSpider5.0已经和大家见面了,那么如何用ForeSpider5.0来采集各网页的正文数呢?今天小编就以采集凤凰网新闻正文为例为大家详细的介绍一下具体操作流程:第一步:新建任务①点击左上角“加号”新建任务,如图1:②在弹窗里填写采集地址,任务名称如图2:③点击下一步,选择进行数据抽取还是链接抽取,本次采集当前列表页新闻的正文数据,正文数据是通过点击列表链接进入的,所以本次需要抽取列表链接,所以点击抽取链接,如图3:第二步:通过智能过滤,得到所需链接。① 按住Ctrl+鼠标左键点击所需链接;② 击“智能过滤”按钮,如图4:第三步:点击采集预览确认链接是否过滤完全,如图5第四步:关联模板在软件中模板的关联关系,与网页中链接跳转的关系相同。关联模板根据网页跳转规律,将“链接列表”关联模板二“链接列表:02”,此处由于我们开始就选择了创建列表链接,所以软件自动关联好了模板二。如果配置的时候发现关联有问题,可以自己进行更改,如图6第五步:填写模板二示例地址并新建数据抽取① 模板一过滤得到的任意一条链接,作为模板二的示例地址。如:http://pl.ifeng.com/opinion/z…, 见图7:②新建数据抽取方法一:通过点击“下一步”后勾选抽取数据,再次点击“下一步”得到数据抽取,如图8方法二:直接点击模板二,点击上面“新建数据抽取”按钮,得到数据抽取,如图8第六步:创建/选择表单在ForeSpider爬虫中,表单是可以复用的,所以可以在数据表单出直接选择之前建过的表单,也可以通过表单ID来进行查找并关联数据表单。此处使用的是之前建过的凤凰网的表单,创建表单,如图9方法一:通过下拉菜单或表单ID选择已有表单方法二:点击创建表单进入快速建表页面,新建表单方法三:点击“采集配置”-“数据建表”,点击采“采集表单”后面的如图10第七步:配置表单根据所需内容,配置表单字段(即表头),此处配置了包括标题、作者、发布时间、文本内容以及网址五个字段,表单如图11第八步:字段取值取值方法:按住Ctrl+鼠标左键,进行区域选择,按住Shift+鼠标左键,扩大选择区域。title字段,如图12第九步:模板预览① 标右键点击“数据抽取”,然后点击“模板预览”,如图13 ③ 预览结果如图14第十步:采集预览① 击右上角采集预览,如图15②双击任意一条链接,看看是否可以得到和网页对应的规整的数据,如图16。

January 4, 2019 · 1 min · jiezi

不信任的 .exe 怎么办,用 Windows 沙盒啊!

简评:维基百科,在计算机安全领域,沙盒(sandbox)是种安全机制,为执行中的程式提供的隔离环境。通常是作为一些来源不可信、具破坏力或无法判定程序意图的程序提供实验之用。微软正在尝试解决人们对运行未知 .exe 程序带来的恐惧。当一些高级玩家通过建立虚拟机来运行和监测未知程序时,微软开发了一种简单的方式让每个人可以在 Windows 10 上开辟出独立的环境去运行这些程序。Windows 沙盒(Windows Sandbox)将成为明年 Windows 10 的一个新特性,它通过创建一个临时桌面,将特定的应用程序隔离在沙盒中。它被设计成安全且可丢弃的,一旦你用这种模式运行完应用程序,整个沙盒将被删除。你不需要去搭建虚拟机,但是它要求在 BIOS 中启用虚拟化功能。微软正在 Windows 10 Pro 或Windows 10 企业版中增加这一特性。每次启用 Windows 沙盒时,它只是创建一个新的轻量级(100MB)的 Windows 来运行应用程序。微软使用自己的管理程序创建一个独立于主机 PC 的内核。一旦微软发布了 18305 或更高版本后,其测试人员将开始测试这个新特性。你可以通过微软博客了解 Windows Sandbox 的更多技术细节。原文链接:https://www.theverge.com/2018/12/19/18147991/microsoft-windows-sandbox-security-safety-isolation-standalone-apps

January 4, 2019 · 1 min · jiezi

推介几款 windows 下非常好用的工具

在下工具控一枚,平时会留意收集各种各样给我们生活生产带来便捷的工具,毕竟人生苦短;下面介绍一些 Windows 系统上发现的一些好用的工具,并且将一笔带过主要特点,详细用法可以搜一下,相关帖子挺多的,每个都展开介绍的话那就太长啦Listary啥都憋说了,Listary 必须排在第一个,用过 Everything,觉得还是 Listary 更胜一筹;它不仅可以在本地非常快速的搜索,还可以打开网站、在搜索引擎中搜索、随时随地打开快捷菜单、文件快速定位、快速打开cmd窗口等等优秀的功能,轻量、简洁、随时随地;比如输入cmd打开cmd窗口,输入cmda使用管理员权限打开cmd窗口,输入wyyyy打开网易云音乐,焦点在某个文件的时候Enter直接打开,Ctrl + Enter 是打开文件所在文件夹;值得一提的是搜索关键词功能,让我们可以非常便捷的打开相应网站或用搜索引擎搜索,比如输入gg 我的存款呢?就可以直接打开默认浏览器在谷歌搜索中搜索,还可以自定义输入其他关键字,只需把搜索链接中的关键字换成{query} DittoDitto 是一款免费开源的 indows 剪切板管理工具,作为Ctrl C V工程师,复制粘贴少不了,更厉害的是,它可以批量的复制,Ctrl+C一堆别人的代码,一次性全粘上,岂不美哉;使用快捷键打开剪切板历史,然后Ctrl / Shift来选择你希望粘贴的内容,Enter即可选择性的粘贴多行内容;另外剪切板历史还可以搜索,快速找到复制内容;只需设置寥寥几个快捷键,就可以很方便的操作剪切板,带来极大幸福Winsnap看到上边的截图没,旁边都有很骚包的阴影,怎么做到的?不需要各种高大上的图片处理软件,使用 Winsnap ,它可以在截图的时候自动帮你加上背景阴影,然后帮你自动复制到剪切板;它可以使用全屏、应用程序、窗口、对象等捕捉模式,更牛的是它还可以在截图的时候同时选择和捕捉多个对象,按住Ctrl或Shift选择多个窗口或对象…这个就比较厉害了,试试看?CmderCmder 是一个美观又实用的命令行工具,它支持大部分Linux命令,支持ssh连Linux,还可以在它的窗口中新建cmd和powershell,更多玩法等你来战比较方便的是在安装目录下 \config\user-aliases.cmd 设置 alias 别名,比如参见的 Git 操作:ga=git add $*gb=git branch $*gc=git commit $*gch=git checkout $*gd=git diff $*gl=git log $*gs=git status $*还可以将cmder配置到右键菜单,快捷在当前目录打开cmder,方法是先把这个地址加到系统的path环境变量里面,比如我的是D:cmder,然后右键Cmder.exe属性-兼容性-以管理员身份运行此程序,再重新打开Cmder.exe输入Cmder.exe /REGISTER ALL就行了记得安装完在配置Setting-Startup-Environment里面加上set LANG=zh_CN.UTF8,否则输出的一些中文会乱码;Typora使用过很多 Markdown 编辑器,最后选择了 Typora,与主流编辑器一边编辑一边预览的形式不同,Typora 是将编辑和预览合并到一起,简洁大方,目光也不需要在编辑区和预览区中来回切换了,只有当焦点移入的时候才显示 Markdown 语法;另外 Typora 还支持 Latex、[TOC]动态目录、拖拽图片自动生成本地预览链接、自定义主题等方便的功能;Quick LookQuickLook 是在 Microsoft Store 里面下载的一个速览工具,有时候打开一个PDF、视频之类的需要等关联程序启动半天,有了它之后只要选中目标文件,按空格就可以快速预览了,速度非常快,支持图片、视频、音频、压缩包、PDF、文本文件、Markdown、HTML等格式;用它来看一些代码什么的,甚至不需要 SublimeVSCode 启动就可以直接看了,如果只是速览一下的场景的话非常适合。Myper SplashMyper Splash 也是可以在 Microsoft Store 里面下载的一款高质量壁纸库,所有壁纸来源 Unsplash 网站,均无版权可以免费使用,再加上简洁美观的UI/UX设计,让你体验一见钟情的感觉。另外 MyperSplash 可以设置自动每天自动更换壁纸或锁屏,每天早晨来到办公室点亮屏幕就可以看到 Awesome 的锁屏或壁纸,让你带着好心情开启一天的工作。GifCam / ScreenToGif相信大家都有过需要截一个 Gif 的时候,这里有两个免费 Gif 屏幕录制工具都很不错,小而美的 GifCam 和开源强大的 ScreenToGif ;GifCam 小巧便捷,如果希望快速录屏分享,那么它是不二选择,可以选择录屏帧率,录制的过程可以调整窗口大小和位置,也可以暂停和继续,足以满足大部分的使用场景;SceenToGif 的编辑功能更为强大,可以单独操作录制的帧,删除、加速或修改都可以,试试看吧Free Download ManageFree Download Manage (FDM) 是一款免费的下载工具,如果你已经受够了国内一些软件的广告和限速,那么 FDM 是一个不错的选择,另外多线程、断点续传、计划任务等功能让 FDM 值得推介。SourcetreeSourcetree 是跨平台免费的 Git 客户端管理工具,如果受够了手打各种 Git 操作命令,那么 Sourcetree 是一个不错的选择;Sourcetree 可以大大简化你的代码操作,特别是对于一些不甚熟悉 Git 命令的人来说灰常实用;一些对 Git 操作比较熟练的用户也可以用它来提升效率,减少出错。 ...

January 4, 2019 · 1 min · jiezi

从零开始学typescript构建一个rest风格web服务

随着应用的庞大,项目中 javascript 的代码也会越来越臃肿,团队之间的协作也会遇到难题,如果不一直看 api 文档,很难知道团队其他成员写的方法需要什么参数,返回结果又是什么。解决的方案有很多,这里不比较各种方法的优劣,仅说下选择 typescript 的考虑:1、接受程序好,ts 文件中可以直接写 javascript 代码,平滑过渡;2、vs code 的提示够好。下面开始一步一步地搭建 web 服务( windows环境 )一、typescript 开发环境如何配置1、初始化项目yarn init -y2、安装 typescriptyarn add typescript @types/node –dev3、配置 typescript 编译环境在项目根目录下新建文件 tsconfig.json{ “compilerOptions”: { “target”: “es2017”, “outDir”: “./dist”, “module”: “commonjs”, “emitDecoratorMetadata”: true, “experimentalDecorators”: true, “lib”: [ “es6” ], “noImplicitAny”: false, “sourceMap”: false, “allowJs”: true }, “include”: [ “./src//” ], “exclude”: [ “node_modules” ] }4、测试新文件夹 src 并添加文件 server.ts,在文件中写下如下代码console.log(“Hello TypeScript”);5、编译.\node_modules.bin\tsc6、运行node ./dist/server.js如果能看到控制台输出Hello TypeScript恭喜你,typescript 环境配置成功!二、集成 web 开发框架 koa1、安装 koa 及 typesyarn add koa koa-router koa-static @types/koa @types/koa-router @types/koa-static2、修改 server.ts 文件,输入如下内容/ * @Description: 后台服务入口 * @version: 0.1.0 /import * as Koa from ‘koa’;import * as koaStatic from ‘koa-static’import { router } from ‘./router’; const app = new Koa(); / * @name: 设置静态资源目录 * @param : undefined * @return : undefined /app.use(koaStatic(’./www’)); / * @name: 使用路由 * @param : undefined * @return : undefined /app.use(router.routes()); /* * @name: 服务端口 * @param : undefined * @return : undefined /const httpPort = 8080app.listen(httpPort); console.log(Http Server running on port ${httpPort});3、新建路由文件夹 router 及文件 index.ts/ * @Description: 后台路由组件 * @version: 0.1.0 /import * as Router from ‘koa-router’; const router = new Router();router.get(’/’, async (ctx) => { ctx.body = ‘Hell koa’;})export { router }4、编译、运行 打开浏览器,输入 http://localhost:8080如果能看到 Hello Koa,恭喜你,koa 的集成成功。一个简单的 web 服务就实现了。后面如果有机会就讲下如何操作数据库。目录结构如下: ...

January 3, 2019 · 1 min · jiezi

概念详述:一对多直播与多对多互动直播该如何区分?

对于刚接触音视频技术的开发者而言,理清这四个概念需要一些时间,让我们通过一组简单的示意图以及关键词来了解这几个概念:直播:(一对多,RTMP/HLS/HTTP-FLV,CDN)直播是一种非常典型的流媒体系统,通常会分为推流端(Pusher)、拉流端(或者叫播放端,Player)以及直播流媒体中心(直播源站),通常会使用CDN进行直播的分发,因此大部分情况下使用的是通用标准的协议,如RTMP,而经过CDN分发后,播放时一般可以选择RTMP、HTTP-FLV或HLS(H5支持)等方式。直播的特点是只有一个推流端,以及多个的观看端。实时音视频:(双人/多人通话,UDP私有协议,低延时)实时音视频(Real-Time Communication, RTC)主要应用场景是音视频通话,技术关注点是低延时通信,因而使用基于UDP的私有协议,其延迟可低于100ms,适用于双人通话或是多人群组群话,典型的场景就是QQ电话、微信电话。 腾讯云实时音视频(TRTC)覆盖各平台,除了iOS/Android/Windows之后,还支持小程序以及 WebRTC 互通,并且支持通过云端混流的方式将画面旁路直播出去。当业务对延迟敏感,通话场景要求比较高,或是需要小程序或者 H5 场景下的双人或多人音视频通话可以选择实时音视频 TRTC。互动直播:(连麦,二对多/多对多,私有协议+标准协议,DC/OC+CDN)互动直播是在实时音视频的基础上,将实时音视频某个房间中的画面经云端混流后,通过旁路直播的方式直播出来。因此,互动直播主播与连麦者之间延迟与实时音视频一致,而主播/连麦者与普通观众之间的延时则与普通直播相同。旁路直播(关键词:云端混流,转推,CDN)将主/副播实时音视频通话时的整个房间的画面复制一份到云端进行云端混流,并将混流后的画面推流给腾讯云直播系统的工作方式。 因为混流后的视频数据流和主/副播通话房间实际上并不是同一路流,而是在另外平行的一路,因而称为旁路,即不在主路。云端录制时,录制的流也是通过旁路的方式从流媒体中心引出,存到COS中。

January 3, 2019 · 1 min · jiezi

手机直播系统偶尔会需要到的:Windows 下视频采集技术

Windows下视频采集的方法在 Windows 下主要有两种方法来采集视频: 一种是通过 Media Foundation,另一种是通过 DirectShow。 Meida Foundation 是 Windows 从 vista 之后推出的一套全新的 多媒体SDK,简单方便,从 Win7 开始成熟起来。 另一种是 DirectShow,它主要用于 win7 之前的采集视频。使用 DirectShow 编写代码比较麻烦,主要是因为 Windows 工程师按照逻辑电路的思维方式设计了 DirectsShow 的开发接口,引入了什么 filter, pin之类的概念。这些老掉牙的东西现在估计没几个人能搞明白,除非你是从那个时代过来的,哈哈。这也解释了为啥现在很少有人学习 Windows 程序开发了,就是因为跟不上时代。你看人家 Android/iOS做视频采集多简单,你整的这么麻烦,谁还愿意学!Media Foundation的一些概念 DirectShow 方案我们放到以后再分析,今天我们主要讲下 MediaFoundation 如何进行视频采集。 在讲之前,我们先要补充一些基本概念。这些概念大家可以从[Media Foundation Programming Guide][1] 找到。下面的文字基本是翻译的 Windows 的官方文档。MF(MediaFoundation)的整体结构图如下:MF 提供了两种不同的编程模型。第一种是上图的左半部分,媒体数据通过端到端的管道传递。Application首先初始化管道,然后调用相应方法控制管道中的流。第二种如上图的右半部分,Application可以从 Source Reader拉数据,也可以向 Sink Writer 推数据。这种模型对于处理数据非常有用。 Primitives 和 Platfrom 图底部的 Primitives 是一些辅助API:Attributes: 相当于一个 Map, 由 key/value 组成。Media Type: 描述媒体数据流的格式。Media Buffers: 存放一段媒体数据。Media Samples: 存放 Media Buffers 的容器,相当于一个 Buffter List。MF Platform 提供了一些核心功能的API。例如异步调用、工作队列。Media PipelineMedia Pipeline 包括三种类型对象:Media Sources、MFTs(Media Foundation Transfors)、Media Sink。Media Sources: 将数据引入到管道里。数据可以来自本地文件,网络流或都是硬件设备。MFTs: 处理流数据。在 MFTs 里实现了编解码器。Media Sink: 消费数据。显示视频到显示屏上,播放声音或写数据到媒体文件。Media Session 通过管道控制数据流。如质量控制,音频/视频同步,格式的改变。Source Reader 和 Sink WriterSource Reader 和 Sink Writer提供了使用 Media Foundation 的另一种方法(相较于 media source, transforms, media sink)。Source Reader 控制着 media source 和 多个解码器。Sink Writer 控制着 media sink 和 多个编码器。你可以使用 Source Reader 从 media source 获取到压缩或未压缩的数据,并使用 Sinker Writer 编码数据并发送给 media sink。 下面我们就来看看 MF 是如何采集视频数据的。采集视频数据通过上面的介绍,我们基本可以知道 MF 采用 从源采集数据,编解码,输出渲染这种架构来处理多媒体。这种方式通俗易懂,使用起来非常方便。MF采集视频的基本步骤MF采集数据使用的是架构中的第二种编程模型,其步骤如下:初始化 COM 组件。获取视频设备列表。激活某个视频设备,获取该设备的 Media Source。根据请求命令和 Media Source 创建 Source Reader。为 Source Reader 设置 Media Type。通过 Source Reader 从设备中读取 Media Type 格式的视频数据。以上就是 MF 从视频设备采集数所的基本步骤,下面我们来详细介绍每一步。详细分析由于每一步的代码都实分简单,我这里就不做过多的文字描述了,通过下面的代码及其注释大家很容易理解其中的每一步。初始化 COM 组件并启动 MFCoInitializeEx(NULL, COINIT_APARTMENTTHREAD | COINIT_DISABLE_OLEDDE)MFStartup(MF_VERSION)获取所有的视频设备IMFAttributes *videoCmd = NULL; IMFActivate **videoDevices = NULL;UINT32 videoDeviceCount = 0;//设置获取视频设备的命令MFCreateAttributes(videoCmd, 1/表示只分配一项/);videoCmd->setGUID( MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, //key MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID); //value//获取视频设备列表 MFEnumDeviceSources( videoCmd, &videoDevices, //这里是设备列表 &videoDeviceCount); //这里存放的是设备的个数激活某个视频设备IMFMediaSource *mediaSource = NULL;//激活第一个视频设备,并为该设置备生成逻辑上的媒体源(Media Source)videoDevices[0]->ActivateObject(IID_PPV_ARGS(&mediaSource));创建 Source ReaderIMFSourceReader *soureReader = NULL;//通过媒体源和请求命令,可以获取source reader。(第二种开发模型)MFCreateSourceReaderFromMediaSource( mediaSource, videoCmd, &sourceReader);设置 Media TypeIMFMediaType *mediaType = NULL;MFCreateMediaType(&mediaType);//设置媒体为视频mediaType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);//YUV格式为 I420mediaType->SetGUID(MF_MT_SUBTYPE, WMMEDIASUBTYPE_I420); //每个视频帧的大小为 640 * 480MFSetAttributeSize(mediaType, MF_MT_FRAME_SIZE, 640, 480);sourceReader->SetCurrentMediaType(MF_SOURCE_READER_FIRST_VIDEO_STREAM, NULL, mediaType);读取数据IMFSample *sample = NULL;DWORD index, flags;LONGLONG llVideoTs;while(runing){ sourceReader->ReadSample( MF_SOURCE_READER_FIRST_VIDEO_STREAM, 0, &index, //实际流的index &flags, //staus flags &llVideoTs, //时间戳 &sample); //存放采集到的视频数据}通过上面简单的几步,就可以轻松的从视频设备里取到视频数据了。MF相对于 DirectShow真是简单太多了。上面介绍的是使用同步方式使用MF采集视频数据,MF还提供了效率更高的异步方式获取视频数据,有兴趣的朋友可以以本篇文章为基础去学习它的异步方式。小结今天向大家介绍了在 Windows下使用 MF 如何采集视频的方法。通过以下 6 步即可做到:初始化 COM 组件。获取视频设备列表。激活某个视频设备,获取该设备的 Media Source。根据请求命令和 Media Source 创建 Source Reader。为 Source Reader 设置 Media Type。通过 Source Reader 从设备中读取 Media Type 格式的视频数据。另外, MF 的采集方案只适用于 Win7 以后的系统,对于之前的系统还是要使用 DirectShow 方案。我也会在后面再为大家介绍如何使用 DirectShow 采集视频。 ...

January 2, 2019 · 2 min · jiezi

npm包发布记录

下雪了,在家闲着,不如写一个npm 包发布。简单的 npm 包的发布网上有很多教程,我就不记录了。这里记录下,一个复杂的 npm 包发布,复杂指的构建环境复杂。整个工程使用 rollup 来构建,其中会引进 babel 来转译 ES6,利用 Eslint 来规范代码的书写风格,最后代码的发布会经过 uglify 压缩。同时发布 umd、es 格式的版本以供外部调用。完整目录结构如下:下面是整个过程的记录一、初始化工程yarn init -y初始化后,修改 package.json 内容,如 name(项目名),description(项目描述)等信息。二、安装 rollupyarn add rollup@1.0.0 –dev三、创建配置文件 rollup.config.jsexport default { input: ‘src/index.js’, output: { file: ‘index.common.js’, format: ‘umd’, name: ‘index’ }}四、安装 babelyarn add rollup-plugin-babel@4.2.0 @babel/core@7.2.2 @babel/preset-env@7.2.3 –dev五、配置 babel1、创建配置文件 .babelrc{ “presets”: [ [ “@babel/preset-env”, { “modules”: false } ] ]}2、与 rollup 集成,在 rollup.config.js 中配置 pluginsimport babel from ‘rollup-plugin-babel’export default { input: ‘src/index.js’, output: { file: ‘index.common.js’, format: ‘umd’, name: ‘index’ }, plugins: [ babel({ exclude: ’node_modules/’, runtimeHelpers: true }) ]}六、安装 eslintyarn add eslint@5.11.1七、配置 eslint1、生成 eslint 配置.\node_modules.bin\eslint –init2、与 rollup 集成,在 rollup.config.js 中配置 pluginsimport babel from ‘rollup-plugin-babel’import { eslint } from ‘rollup-plugin-eslint’export default { input: ‘src/index.js’, output: { file: ‘index.common.js’, format: ‘umd’, name: ‘index’ }, plugins: [ eslint({ include: [‘src/’], exclude: [’node_modules/’] }), babel({ exclude: ’node_modules/’, runtimeHelpers: true }) ]}八、commonjs 兼容yarn add rollup-plugin-commonjs@9.2.0 rollup-plugin-node-resolve@4.0.0 –dev九、与 rollup 集成,在 rollup.config.js 中配置 pluginsimport babel from ‘rollup-plugin-babel’import { eslint } from ‘rollup-plugin-eslint’import resolve from ‘rollup-plugin-node-resolve’import commonjs from ‘rollup-plugin-commonjs’export default { input: ‘src/index.js’, output: { file: ‘index.common.js’, format: ‘umd’, name: ‘index’ }, plugins: [ resolve({ jsnext: true, main: true, browser: true }), commonjs(), eslint({ include: [‘src/’], exclude: [’node_modules/’] }), babel({ exclude: ’node_modules/’, runtimeHelpers: true }) ]}十、安装 UglifyJS, 用来压缩代码yarn add rollup-plugin-uglify@6.0.0 rollup-plugin-uglify-es@0.0.1 –dev十一、与 rollup 集成,在 rollup.config.js 中配置 pluginsimport babel from ‘rollup-plugin-babel’import { eslint } from ‘rollup-plugin-eslint’import resolve from ‘rollup-plugin-node-resolve’import commonjs from ‘rollup-plugin-commonjs’import { uglify } from ‘rollup-plugin-uglify’export default { input: ‘src/index.js’, output: { file: ‘index.common.js’, format: ‘umd’, name: ‘index’ }, plugins: [ resolve({ jsnext: true, main: true, browser: true }), commonjs(), eslint({ include: [‘src/’], exclude: [’node_modules/’] }), babel({ exclude: ’node_modules/’, runtimeHelpers: true }), uglify() ]}十二、引入环境变量,实践差异化打包1、安装插件yarn add rollup-plugin-replace@2.1.0 –dev2、配置 pluginsimport babel from ‘rollup-plugin-babel’import { eslint } from ‘rollup-plugin-eslint’import resolve from ‘rollup-plugin-node-resolve’import commonjs from ‘rollup-plugin-commonjs’import { uglify } from ‘rollup-plugin-uglify’import replace from ‘rollup-plugin-replace’export default { input: ‘src/index.js’, output: { file: ‘index.common.js’, format: ‘umd’, name: ‘index’ }, plugins: [ resolve({ jsnext: true, main: true, browser: true }), commonjs(), eslint({ include: [‘src/’], exclude: [’node_modules/’] }), babel({ exclude: ’node_modules/’, runtimeHelpers: true }), replace({ exclude: ’node_modules/’, ENV: JSON.stringify(process.env.NODE_ENV) }), uglify() ]}十三、参数化配置,加入版权说明,最终配置如下import resolve from ‘rollup-plugin-node-resolve’import commonjs from ‘rollup-plugin-commonjs’import { eslint } from ‘rollup-plugin-eslint’import babel from ‘rollup-plugin-babel’import replace from ‘rollup-plugin-replace’import { uglify } from ‘rollup-plugin-uglify’import uglifyEs from ‘rollup-plugin-uglify-es’const pJson = require(’./package.json’)const version = pJson.versionconst license = pJson.licenseconst banner = ‘/*!\n’ + * ${pJson.name} v${version}\n + * (c) 2018-${new Date().getFullYear()}\n + * Released under the ${license} License.\n + ’ */‘const ENV = process.env.NODE_ENV.trim()const paths = { input: { root: ‘src/index.js’ }, output: { root: ‘dist/’ }}const fileNames = { development: ‘index.common.js’, production: ‘index.common.js’, production6: ‘index.esm.js’}const fileName = fileNames[ENV]export default { input: ${paths.input.root}, output: { file: ${paths.output.root}${fileName}, format: ENV === ‘production6’ ? ’es’ : ‘umd’, name: ‘index’, banner }, plugins: [ resolve({ jsnext: true, main: true, browser: true }), commonjs(), eslint({ include: [‘src/’], exclude: [’node_modules/’] }), babel({ exclude: ’node_modules/’, runtimeHelpers: true }), replace({ exclude: ’node_modules/’, ENV: JSON.stringify(process.env.NODE_ENV) }), (ENV === ‘production’) && uglify({ output: { comments: /^!/ } }), (ENV === ‘production6’) && uglifyEs({ output: { comments: /^!/ } }) ]}三、业务代码编写在 src/index.js 中编写具体业务代码四、打包在 package.json 中添加"scripts": { “dev”: “set NODE_ENV=development && rollup -c”, “build”: “yarn run buildcjs && yarn run buildesm”, “buildcjs”: “set NODE_ENV=production && rollup -c”, “buildesm”: “set NODE_ENV=production6 && rollup -c”}运行命令yarn run build五、发布npm publish发布前记得记得 注册 帐号,记得修改 package.json 中 private 字段为 false"private": false ...

December 30, 2018 · 3 min · jiezi

好记性不如烂笔头,极光向你发出征文邀请函

由极光 1举办的征文大赛 ✍️️ ——「我和极光的那些事儿」第三届如约而至!过完双十一和双十二,是不是特想剁掉那只买买买的手?千万别 手觉得 ta 还能抢救一下 留着 ta 参赛写文章,赢奖品给你回回血 我们准备了 Filco、Kindle、电动牙刷等诸多大奖,等你带回家 参赛规则:时间:征文截止:2019.01.21公布榜单:2019.01.25标题:极光征文 | ✘✘✘(文章正题)例:极光征文 | 如何用 IMUI 构建你的聊天界面内容:和「极光」有关的文章数据分析、技术、运营、产品、设计、读后感类文章皆可,不知道怎么下笔可以参考文末的写作思路字数 500 字以上、排版美观(建议使用 Markdown 格式)在文末附上「本文为极光征文参赛文章」评定:由极光官方综合评定评定指标:文章质量(重要)、阅读量、点赞数、评论数投稿方式:在「简书」平台发布参赛文章投稿至「极光征文」专题奖品:一等奖:价值 1000 元的 Filco 机械键盘 ,共计 1 名二等奖:价值 600 元的 Kindle 阅读器 ,共计 2 名三等奖:价值 300 元的 Philips 电动牙刷 ,共计 3 名优胜奖:价值 150 元的 极光背包,共计 5 名参与奖 1 :极光减压马克杯(含一套彩笔);参与奖 2 :极光多款周边礼品任选其二。注:参与奖任选其一,参与即有。参与征文的小伙伴均可参与一次抽奖,极光精美周边随心抽。写作思路:一、围绕极光开发者服务和开源项目极光开发者服务涵盖「推送、统计、IM、短信、认证、分享」六大产品,提供了 Cordova、React、Flutter 等丰富的开源插件,还开发了全平台支持的即时通讯 UI 库 「IMUI」。这么多产品,肯定有一款与你产生过一些不得不说的故事,如果不巧还没有,那么我希望现在就是我们故事的开端。可以围绕极光产品,说一说你的接入过程、使用心得、运营趣事,如果极光服务有为你的产品锦上添花或雪中送炭,求夸奖.gif二、围绕极光大数据报告,极光日报大数据报告:可靠、有影响力的数据报告,结合大样本算法开展数据挖掘和统计分析,数据源于极光云服务平台和极光 iAPP 长期对行业及各类 App 的监测采集极光日报:国外技术文章导读,内容涉及硅谷、科技、编程、设计、人工智能等领域,在知乎专栏和简书文集同步连载可以围绕一篇极光文章写读后感,或运用数据做现实问题分析,回忆一下阅读报告对你的工作与生活是否带来了什么帮助,写下你与极光报告的故事一些有趣的、有价值的文章推荐,可能对你的写作有帮助:年年双十一,今年哪些 App 和你一起过 | 2018 年双 11 专题研究报告生活不易,拒绝油腻 | 2018 年 10 月熟男群体研究报告华为销量领军,iPhone 忠诚度持续下跌 | 2018 年 Q3 智能手机行业研究报告班班相报何时了 | 2018 年 K12 教育用户群体研究报告如何在 2 分钟内入睡(二战时期美国飞行员训练法)你想学的一切,只需要这一个网站就够了我们在大学图书馆发现了三本有毒的书互动群:不知道怎么写?写了一半想放弃?想得到文章修改意见?为此我们建了个交流群扫码添加极小光微信拉你入「极光征文交流群」,激发你的灵感,还有随机抽奖给你写作动力声明:版权归原作者所有,极光拥有转载权本活动最终解释权归极光大数据所有 ...

December 29, 2018 · 1 min · jiezi

记一次thinkserver RD430 安装windows server 2008的过程

情景:thinkserver rd430 采用了 版载的SAS RAID 控制器9(LSI megaRAID),在安装server 2008中,需要进行一些特殊的操作。配置raidRAID阵列需要进行配置,先选择要配置的硬盘,然后创建一个VD(虚拟disk)。最后,设置这个VD的模式为RAID 5。保存设置,并执行初始化。安装windows 2008进行到选择系统的安装位置时,会找到我们前面配置好的VD。这是由于windows 2008并没有默认安装RAID的驱动,所以看不到。解决方案下载驱动:google关键字:LSI Onboard SAS RAID driver for Windows Server 2008, 2008 R2 ThinkServer RD430, 并找到以下地址:https://support.lenovo.com/ve…下载EXE文件,然后双击安装。其实这个EXE就是个解压的过程,这里我第一次没有下载,以为自己找的不对。原因是因为我想当然的认为:应该提供ZIP格式的文件,而非EXE。最后,将解压后的文件夹复制到U盘中。在windows安装界面中,选择加载驱动器驱动程序,并找到2008 X64文件夹,选择安装。

December 29, 2018 · 1 min · jiezi

感慨!2018的历途居然做了这些

北京历途科技有限公司是一家专注于人工智能与机器人研发的高新技术企业,经过十几年的技术积累,现已自主研发出专业、高效、安全的高楼外墙清洗机器人,填补了国际外墙清洁市场智能化产品空白。公司以"人人皆创客,完美做产品"为发展理念,打造具有颠覆性的科技产品。看花开花落,云卷云舒。悄悄的,2018已经余额不足,2019正在向我们招手。就在前几天,红帽子、白胡子的老爷爷也如约而至。在我们的床头为我们每个人许下了最美好的祝愿。回顾过去的一年,虽然历途在前进的道路上没能一帆风顺,也遇到了不少的困难,但是历途人以“人人皆创客,完美做产品”的理念,一步一个脚印的实现着自己的梦想,同时也为全球的高楼外墙清洗行业突破着一个又个的难关。接下来,就让我们一起看一下历途在2018到底做了些什么?1、2018年4月,企业文化建设开始落地俗话说“没有规矩,不成方圆”,一个没有企业文化的公司就好像一个没有灵魂的人,寸步难行。企业文化是“企业的粘合剂”,可以把所有的员工紧紧地粘合在一起,使员工明确目的、步调一致。从2018年4月开始,历途的企业文化建设开始落地。比如每月读一本好书、每月举办一场生日趴、每年组织两次团队建设、给员工的妈妈准备母亲节礼物、员工共同回忆小时候和父母一起过的端午节等活动,温暖员工及其家人们。这些活动无不是在为我们营造更好的工作氛围,提高团队的凝聚力。它在无形中发挥了导向的作用,让员工自发的去遵守公司的规章制度,从而把公司和个人的意愿和远景统一起来,促使公司的发展壮大。2、2018年6月,第六代机器人开始在多栋楼宇进行清洗应用从以前的视频里我们可以看到第六代机器人共清洗了三种典型外立面。第一种是玻璃与玻璃之间凹槽宽2厘米的纯玻璃幕楼宇;第二种是帽檐30厘米的麻面石材+玻璃幕楼宇;第三种是窗台25厘米的铝板+麻面石材+玻璃窗户的楼宇 。机器人在骄阳似火的天气情况下依然可以正常工作,足以证明机器人耐高温的特性。再来看看机器人的清洁速度也是相当的溜,人工与之相比简直就是小巫见大巫。清洁效果更是没得说,一闪一闪亮晶晶的楼宇好像也在炫耀着自己洁净的身躯。第六代历途机器人显然已经在整体结构和程序方案上取得了巨大的成功。3、2018年8月,历途被评定为高新技术企业历途机器人拥有5项发明专利和20余项实用新型专利今年同时被评定为国家高新技术企业和中关村高新技术企业。产品主要功能包括三维智能空间建模、工作表面识别、高效高空清洁作业、建筑物外表面自适应、抗横风与姿态调整以及故障回收等几个部分。机器人的多传感器协同和智能控制算法使动作更加柔性和稳定,清洗效果更完美。4、2018年10月,第七代高楼外墙清洗机器人多台联调测试10月,一个举国欢庆的月份,在这个欢快的时候第七代历途高楼外墙清洗机器人也紧锣密鼓的开始了多台联调测试。高耸挺立的大楼上攀爬着多台机器人,远远望去,就好像一只只健硕的壁虎稳稳的爬在了墙面上,时而齐头并进,时而一上一下,所过之处无不焕然一新。第七代高楼外墙清洗机器人多台联调测试的成功,意味着我们又离自己的目标近了一步。5、2018年12月,意向客户已遍布全国23个省55个市。截止到2018年12月我们遍布全国的意向客户已经超过了23个省,55个城市。这也就意味着历途机器人在全国范围的覆盖率已经达到了60%以上,这是一个多么惊人的数字。从去年的15个省21个市到如今的成就,相信每一个人都能看出来,我们在不断的进步,我们的产品在不断的完善。在这里请允许小编代表历途公司由衷的对各位合作伙伴们表示深深的感谢,感谢您们对历途机器人一如既往的支持与信任,感谢您们长时间的陪伴,是您们的鼓励和支持推动着我们勇往直前!2018已近尾声,2019的钟声悄然响起,在新的一年里,历途将继续秉持着“人人皆创客,完美做产品”的理念为广大的人民群众服务,为社会提供更好的产品,为我们中国乃至世界填补高楼外墙清洗市场的空白。元旦来临之际历途所有小伙伴祝愿大家在新的一年“万事如意展宏图,心想事成兴伟业”,2019我们来了!

December 27, 2018 · 1 min · jiezi

分享本人搭建 React Native 开发环境的过程

前言初次学习使用 React-Native,发现环境的搭建都那么繁琐啊,在自己捣鼓了很久之后也算是运行成功了,所以分享一下我的搭建过程,仅供参考本文搭建环境是 Windows 系统和安卓手机安装过程中主要参考React Native 中文官网环境搭建安装 NodeJsNode 的安装非常简单,相信每个前端工程师都会,在这就不多写了。使用命令行工具输入 node -v 出现版本号则安装成功。建议大家尽量不要让自己的 Node 版本太低,保持与官网同步即可。安装 Python 2根据官网的推荐,需要安装 2.x 版本的 Python,附上官网下载地址,点击此处安装过程当中,注意勾选 Add python.exe to Path 项,它会自动为我们添加到系统的 path 环境变量当中,非常方便。当安装完成之后,打开命令行工具输入 python 回车,出现 Python 后跟版本号等等东西就安装成功了,输入 exit() 退出安装 JDK根据官网要求 JDK 的版本必须是 1.8(目前不支持 1.9 及更高版本)在此分享我的 64 位安装包 链接:https://pan.baidu.com/s/1kfnG… 提取码:0jcn配置环境变量以我为例,我的 jdk 安装在 E:_\software\java\jdk1.8, jre 安装在 E:_\software\java\jre1.8打开我的电脑,在环境变量中的系统变量里,新建一个系统变量,变量名为:JAVA_HOME,变量值为:E:_\software\java\jdk1.8在 path 变量值后加入 %JAVA_HOME%\bin,手动添分号CLASSPATH 环境变量可加可不加,我的加不加都是能正常运行的加的话就再新建一个系统变量,变量名为:CLASSPATH,变量值为: .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar检验是否配置正确打开 cmd,依次输入 java,javac,java -version 检验安装 Android StudioAndroid Studio 下载地址按照官网给出的安装教程去安装就可以了安装 SDKSDK 的安装可以通过 Android Studio 去下载,默认会下载到 C 盘里,我自己在 E 盘新建了一个 SDK 的文件夹目录,然后更改了它的下载目录,下载的所有 SDK 都指定到这个文件夹里就可以了拷贝一些官网的原话Android Studio 默认会安装最新版本的 Android SDK。目前编译 React Native 应用需要的是Android 8.1 (Oreo)版本的 SDK你可以在 Android Studio 的 SDK Manager 中选择安装各版本的 SDK。SDK Manager 还可以在 Android Studio 的"Preferences"菜单中找到。具体路径是Appearance & Behavior → System Settings → Android SDK。在 SDK Manager 中选择"SDK Platforms"选项卡,然后在右下角勾选"Show Package Details"。展开Android 8.1 (Oreo)选项,确保勾选了下面这些组件(重申你必须使用稳定的翻墙工具,否则可能都看不到这个界面):Android SDK Platform 27Intel x86 Atom_64 System Image (官方模拟器镜像文件,使用非官方模拟器不需要安装此组件)然后点击"SDK Tools"选项卡,同样勾中右下角的"Show Package Details"。展开"Android SDK Build-Tools"选项,确保选中了 React Native 所必须的27.0.3版本。你可以同时安装多个其他版本。最后点击"Apply"来下载和安装这些组件。配置 SDK 环境变量官网只配置了一个 ANDROID_HOME 的环境变量,但是我还额外配置两个,反正我配置了这俩才能用,先依照官网配置好 ANDROID_HOME然后在 path 中新增两个地址,分别为:%ANDROID_HOME%tools%ANDROID_HOME%platform-tools请注意加分号验证 SDK 是否配置成功打开 cmd 输入 adb 命令检验,若不能使用该命令,请检查 SDK 配置。如果配置正常还不行的话,可能是电脑没有装安卓的驱动,可以下载豌豆荚进行驱动安装。创建 React-Native 项目安装 Yarn 和 React Native 的命令行工具(react-native-cli),也可以不安装 Yarn,使用 npm,但官方推荐使用 Yarnnpm install -g yarn react-native-cli安装完 yarn 后同理也要设置镜像源,提高我们的下载速度yarn config set registry https://registry.npm.taobao.org –globalyarn config set disturl https://npm.taobao.org/dist –global安装完 yarn 之后就可以用 yarn 代替 npm 了,例如用 yarn 代替 npm install 命令,用 yarn add 某第三方库名代替 npm install 某第三方库名。创建新项目找个文件夹创建项目,文件路径不建议有中文,打开 cmd 运行以下命令,等待项目构建完成react-native init AwesomeProject利用真机运行 React-Native 项目项目构建完成后,让我们用真机测试能否正常运行准备 Android 设备使用自己的安卓手机,利用数据线连接上电脑,打开 USB 调试(怎么打开自行百度,很简单)然后通过 cmd 执行 adb devices 命令,若输出的结果中存在 devices ,那么该行就是你的设备,证明连接成功了编译并运行 React Native 应用cd AwesomeProjectreact-native run-android运行以上命令之后,React Native 会自动编译并运行,但编译过程中会下载许多编译依赖的文件,这些文件如果不翻墙的话可能根本就下载不下来分享一款翻墙软件:蓝灯 github 下载地址我在初次运行 react-native run-android 命令时根本就下载不动那些依赖文件,但装了蓝灯过后竟然奇迹般的下载下来了,所有也是有用的啊等编译成功后,React Native 会在你的手机上安装一个 App,就是你创建的项目,需要自己确认安装,确认后它就会自动运行了最终的我项目也是成功的跑了起来!使用 Android Studio 和 安卓模拟器还没有跑起来,正在尝试。结束。 ...

December 20, 2018 · 2 min · jiezi

Python决策权的投票结果诞生了,“指导委员会”模式拔得头筹

2018年12月17日20点,Python 治理提案的投票结果出来了,最终胜出的是 PEP-8016。在几天前,我们推文《最新进展|关于Python治理模式的投票》,已经很明白地预测了这个结果,现在得到了证实。毫无悬念。对于这个结果,暂时没必要多说吧。等过几天,核心开发者们应该会有下一步的计划,到时候,我会关注其后续进展以及带来的影响,再跟大家细谈。此前,我们公众号(Python猫 )连续三篇文章介绍了本次的投票,关注到了多个维度的内容,以下仅附上相关链接,以供阅读。1、Python之父退位后,最高决策权花落谁家?Python 之父退出决策层后,社区里提出了7种治理模式的提案,这些提案各有什么差异点呢?Python 核心开发者 Victor Stinner 做了详细比对,此文可以带你了解各种治理提案的异同。2、这件正在发生的事,关乎所有的Python开发者……本文主要回顾了Python 之父的退位风波、各种治理提案的提出、以及此次事件的重要意义。3、最新进展|关于Python治理模式的投票上周,投票刚进行一半,本文汇总了部分核心开发者的投票意向(主要是Python之父Guido的看法),并做了一个预测。最后,我还注意到了两个小细节:1、共 94 个投票名额,但实际有效投票只有 62 票,也就是总数的 2/3 。实话说,有这么多的无效票/弃权票,我感到很意外,毕竟,整个投票期可是整整 16 天啊!这对投票方案的实施,是否会带来不利的影响呢?2、关于投票时间。首先,投票开启的时间就比几个月前计划的延迟了,而投票结束的时间也有临时的变更——本应结束于17日中午12点,但实际却延迟到晚上8点。这段时间里,发生了什么事情呢?但愿这只是“区区小事”吧……—————–本文原创并首发于微信公众号【Python猫】,后台回复“爱学习”,免费获得20+本精选电子书。

December 17, 2018 · 1 min · jiezi

指令控制 windows 电源选项

1.powercfg命令。使用powercfg.exe控制电源计划(也称为电源使用方案)。2.ac和dc一般电源有两种供电模式:ac代表交流电源dc代表直流电源一般情况下ac就是直接接通电源,dc是使用电池供电。一般电源命令都需要分别设置在ac和dc下的模式。3.电源选项的唯一标识每个电源选项都有一个唯一的guid标识,我们可以使用某些命令通过这个唯一标识来设定这个电源选项。例如官方文档中的电源计划:如图:电源计划 节电,平衡,高性能分别对应了一个guid。我们可以通过查阅windows文档或者使用powercfg /query命令来查询每个选项对应的guid。4.设置电源计划powercfg -setactive guid可以通过-setactive来设置当前电源计划。例如下面的代码将电源设置为平衡模式powercfg -setactive 381b4222-f694-41f0-9685-ff5bb260df2e5.修改电源计划中的电源选项直接查看控制面板中的电源选项可以看到下面的界面我们可以通过下面的命令来修改powercfg -change value后面的value有如下几个选项monitor-timeout-ac <分钟>monitor-timeout-dc <分钟>disk-timeout-ac <分钟>disk-timeout-dc <分钟>standby-timeout-ac <分钟>standby-timeout-dc <分钟>hibernate-timeout-ac <分钟>hibernate-timeout-dc <分钟>monitor:屏幕 disk:磁盘 standby:待机 hibernate:休眠实例:powercfg /change monitor-timeout-ac 5表示:在接通电源模式下设置屏幕5分钟后关闭。powercfg /change monitor-hibernate-dc 0表示:在不接通电源模式下永不休眠6.高级选项还有一些其他选项,例如按下电源按钮,睡眠按钮,关闭盖子等发生的操作。可以使用如下命令设置:powercfg /setacvalueindex scheme_GUID sub_GUID setting_GUID setting_indexpowercfg /setdcvalueindex scheme_GUID sub_GUID setting_GUID setting_indexscheme_GUID : 电源计划guid,可以通过powercfg /list查询sub_GUID:子组guid,可以解释成在众多的电源选项上又分的一层组,可以通过过powercfg /query查询setting_GUID:选项guid,具体的电源选项。setting_index:具体设置的索引,如下图:不采取任何操作,睡眠,休眠,关机例如:powercfg -SetAcValueIndex 381b4222-f694-41f0-9685-ff5bb260df2e 4f971e89-eebd-4455-a8de-9e59040e7347 5ca83367-6e45-459f-a27b-476b1d01c936 0表示:设置接通电源的情况下,电源关盖后不采取任何操作。powercfg -SetDcValueIndex 381b4222-f694-41f0-9685-ff5bb260df2e 4f971e89-eebd-4455-a8de-9e59040e7347 7648efa3-dd9c-4e3e-b566-50f929386280 1表示:设置未接通电源的情况下,按下电源键使电脑进入睡眠。7.总结有了这些操作,我们就可以使用某些语言比如node,来批处理windows电源选项了。更详细的选项可以查询windows官方文档:https://docs.microsoft.com/en…

December 17, 2018 · 1 min · jiezi

利用VBScript写一个定时任务弹窗-提醒休息或喝水

作为一个程序员,在学习或工作的过程中要长时间地面对电脑,经常会出现忘记休息或喝水的时候,有时候一坐就是好几个小时。这对于身体健康是非常不利的,我以前也不是很在意,一般就是口渴了才喝水。直到最近这几天感觉到喉咙有点不舒服,可能是发炎了,我才意识到这是身体内部发出的抗议信号。实际上,当你感觉到口渴的时候,你的身体其实是非常缺水了。所以,我们应该有规律地喝水,一般隔段时间就喝下。闹钟 or 倒计时可是对于很多人来说,要大脑自动条件反射来喝水是很难实现的。因此我们要通过外部手段来提醒我们。提醒的方式有很多,比如设置几个闹钟,或者是倒计时。可惜这种利用手机的方式也存在一个弊端,有时候太专注于工作而没有时间看手机的话,那么闹钟和倒计时也无效了。利用脚本写提醒工具因此,为了更好地解决上面的问题,我们可以从本质出发,一般来说,程序员一天工作时面对电脑的时间较多,那么我们可以在电脑上面写一个定时任务。我的做法是在Windows系统上面写VBScript脚本,每隔一段时间就弹窗,提醒我喝水。具体实现本文主要介绍怎么在Windows系统下用VBScript写一个简易的定时任务弹窗。如果是Macbook,可以用AppleScript,Linux系统可以用Shell。什么是VBScriptVBScript是微软开发的一门脚本语言,使用VBScript,可以在Windows系统下编写自动任务等等。VBScript文件以.vbs为后缀,Windows系统下可以直接双击运行,代码由C:\Windows\System32下面的wscript.exe负责解释执行。VBScript教程我在写这个弹窗小工具之前,没有系统学习过VBScript,现学现用,只是粗略学习了一下,如果想系统了解的,可以看一下菜鸟教程。用到的VBScript知识这个小工具其实很简单,核心就几行代码,类似网页中的setInterval,然后时间一到就alert。下面具体介绍代码中用到的VBScript知识。Dim variableName: 定义变量Do … Loop: 循环,类似do … while(true)If … Then … Else … End If: 条件结构InputBox: 类似网页中的window.propmtMsgBox: 类似网页中的window.alert详细代码以下贴出该工具的全部代码。Dim intervalDim ret’ set task’s intervalDo interval = InputBox(“Please input the interval:”, “Interval(seconds)”, 30 * 60 * 1000) If interval = vbEmpty Then ’ click cancel MsgBox “You input empty, interval is set default half an hour.” interval = 1800000 Exit Do End If If Not IsNumeric(interval) Then ’ input what is’t a numeric MsgBox “Please input number” Else Exit Do End IfLoop’ execute interval taskDo ret = MsgBox(“Drink some water”, vbOKCancel, “Time up”) If ret = 1 Then Wscript.sleep interval Else MsgBox “Close notification”, vbOkOnly, “Close notification” Exit Do End IfLoop总结有时候发现编程能够用在平常的生活中,还是挺有趣的。最后附上项目的Github地址,欢迎Star或Fork支持,谢谢。 ...

November 21, 2018 · 1 min · jiezi

新加坡金融科技节 | 蚂蚁金服CTO程立:面向全球开放,与合作伙伴共赢

小蚂蚁说:11月13日,在新加坡金融科技节上,蚂蚁金服CTO程立分别从TechFin、BASIC战略、SOFAStack全栈分布式体系以及全面开放等方面讲述蚂蚁金融科技。TechFin是一种“倒立”思考,它用科技解决金融服务中核心的信用、风控和触达等难点,让金融服务可以惠及更多的人。蚂蚁金服形成了以BASIC为基石的全栈式服务,其中BASIC分别对应Blockchain(区块链)、AI(金融智能)、Security(安全)、IoT(物联网)和Computing(计算)五大领域。SOFAStack是蚂蚁金服15年技术研发的结晶,主要包括SOFA分布式中间件、OceanBase分布式事务数据库和mPaaS移动开发平台,并已向金融行业开放。蚂蚁金融科技全面开放战略的公布,意味着蚂蚁金融科技正式进入全新的3.0时代。蚂蚁金服希望通过技术全面开放,与合作伙伴一起打造数字时代的普惠支付与金融服务,共同发展与创新。接下来,就和小蚂蚁一起去看看吧~11月13日,蚂蚁金服CTO程立在新加坡金融科技节上发表主题演讲。演讲中,他谈到了蚂蚁金服一直所倡导的TechFin、BASIC战略、SOFAStack全栈分布式体系以及全面开放等等业界普遍关注的内容。蚂蚁金服CTO程立发表主题演讲在开场白中,程立表达了他的欣喜之情。在新加坡的樟宜机场、圣淘沙、环球影城、乌节路等地方,他见到了支付宝给人们带来的移动支付的便利。程立表示,支付宝所带来的便捷服务已经在中国大陆被广泛接受,他希望能够将同样的体验带给世界各地更多的人们。现场座无虚席TechFin是一种“倒立”思考在演讲中,程立首先提到了TechFin。尽管字面上与常见的FinTech称谓刚好相反,但这并不是一种文字游戏,相反它刚好完美地诠释了蚂蚁金服对科技和金融服务的理解。很多人都知道,阿里巴巴一直存在着“倒立”文化,其出发点是倡导“倒过来看世界”,TechFin似乎正好是这一文化的映射。程立表示,蚂蚁金服15年一路走来,是一个不断用科技去创造新的金融服务,解决用户和商户痛点,让支付与金融服务更简单、更透明、更普惠的过程。蚂蚁金服将这一过程称为“TechFin”。从2003年的担保交易,解决网上支付买卖双方的信任难题;到2010年的小微商家贷款,用数据与算法让原本无法获得贷款的小微商家,可以得到实时、低成本的贷款服务;到2013年的余额宝,让普通人用一块钱都可以打开财富管理之门,再到今年的区块链跨境汇款,让出国务工的菲律宾人可以实时、便捷、低成本地向家人汇款。“15年来,科技在不断升级,蚂蚁金服科技的普惠价值观一直没有改变。”程立表示。蚂蚁金服CTO程立发表主题演讲程立指出,TechFin是用科技解决金融服务中核心的信用、风控和触达等难点,让金融服务可以惠及更多的人。TechFin是一种“倒立”思考,倒过来看世界,重构服务,把不可能变成可能的理念与方式。2010年,支付宝推出快捷支付,倒转了网上支付流程中的信任与风控模型,通过支付宝平台统一支付鉴权与风控,让支付成功率从不到70%提升到95%以上。2011年的移动支付,让商户端的收银工具从昂贵的POS机变成极低成本的二维码,让用户无须携带现金,极大拓展了数字支付的覆盖广度,即使在珠穆朗玛峰的帐篷商家,都可以方便地用移动支付收款。2015年的芝麻信用,正在改变商业中的信任机制,在中国,需要用户缴纳押金的地方,正在免除押金,在蚂蚁金服最新推出的相互保险中,用户凭借芝麻信用,可以无须提前缴纳保费,就可以享受到健康保障服务。程立举了以上例子。“我们认为,TechFin也是科技开放与共同创新。”程立在演讲中表示,“从第一天起,我们的每一个重大的服务创新,都来自于与银行等合作伙伴的共同创造。在2015年,我们对支撑新金融服务背后的技术进行了梳理,正式推出了蚂蚁金融云,开放了我们的科技能力。2016年,我们开始科技出海,以授人以渔的方式,赋能我们的合作伙伴打造本地的‘支付宝’与‘蚂蚁金服’,帮助本地数字经济发展。”BASIC为基石的全栈式服务已形成所谓“BASIC”分别对应Blockchain (区块链)、AI(金融智能)、Security(安全)、IoT(物联网)和Computing(计算)五大领域。程立表示,目前蚂蚁金服对支撑未来数字经济与金融的关键技术进行了升级,已经形成了以BASIC为基石的全栈式服务,并将蚂蚁金融云升级为蚂蚁金融科技开放平台,以为数字科技与金融服务的融合创新开启更多机会。程立指出,区块链是影响未来的关键技术之一,其最大价值是用技术重构信任机制。“这个信任机制不是单点到单点,从A到B, 而是贯穿了价值链、产业链,实现数字世界里数据、资产以及人的可信,促进社会价值的可信流转。”程立认为,通过重塑协同关系带来商业效率的极大提升,能够给数字金融、经济与社会带来巨大的变化。过去的几年,蚂蚁区块链只聚焦于两件事。一是攻克核心技术,打造自主可控、高性能、高可靠的金融级区块链平台;二是积极探索区块链的商业应用落地,让技术解决实际问题,服务实体经济,真正惠及人们,惠及全社会。另外,蚂蚁区块链还积极与合作伙伴共建开放的区块链生态,2018年6月,蚂蚁区块链BaaS平台已经上线并对外开放。“蚂蚁区块链坚持全面开放,我们已经宣布了区块链合作伙伴计划,为合作伙伴提供培训、合作、市场等多方面支持,让更多合作伙伴一起参与区块链行业应用,真正让技术为实体经济赋能,为生活添彩。”程立强调说。目前,蚂蚁区块链已经落地于社会公益、房屋租赁、商品溯源、跨境汇款等多个民生领域。今年6月,在香港务工的菲律宾人Grace就通过AlipayHK,仅耗时3秒就完成了全球第一笔区块链跨境汇款,而在此之前,跨境汇款的耗时通常需要几个小时。区块链跨境汇款不仅能做到秒级到账,手续费也大幅降低,而且更加便捷,更加安全和更加透明。程立强调,AI是数字时代另一项关键技术。“AI的价值不仅仅是模拟人的智能,而是在数字世界中浮现的一种新型的智能,让数字世界进化为一个智能体。我们的愿景是,让数字智能(Digital Intelligence)成为金融智能(Financial Intelligence),极大提升金融服务中信用能力、风险防控能力、让金融服务可以给更多小微商家与个人消费者带来有温度的服务。”程立表示。程立认为,由于移动互联网的出现,通过技术手段就可以将支付、信贷、保险等服务快速出大数以亿计的人群,但这也带来巨大的挑战——如何精准地识别好人,打击坏人?此时,信用和风控成为商业模式是否成立和成功的关键。程立介绍说,蚂蚁金服通过AI来实现实时反欺诈、反洗钱。在信贷中,运用AI技术来精准建立商业与个人信用,实时“打击”违规行为。在保险中,通过AI来防范投保、理赔中的欺诈行为。“因为AI技术,我们在金融信用于风险决策方面的洞察能力和决策能力得到极大的提升。”程立说。据程立介绍,蚂蚁金服运用AI技术在去年就推出了“310小微贷款服务”,该模式可以实现3分钟申请,1秒钟获批并到账,整个过程0人工操作。程立将其称为“旗舰型”产品,并认为这是一个非常棒的服务。据悉,该服务目前已经为超过1000万名中小企业借款人提供服务。蚂蚁金服还将AI技术应用于全面风险管理。据介绍,蚂蚁金服目前拥有第五代人工智能驱动的智能风控引擎——AlphaRisk。“先进的人工智能技术极大地提高了我们的风险检测引擎的准确性。”程立表示。程立指出,数字安全至少有三大支柱。第一个是可信的和无处不在的数字身份,为人和事物。二是智能化风控系统,能够深入理解金融交易,检测和控制各种金融风险。第三是一个全面的架构和机制,以保护客户的数据和隐私。对应这三个方面,蚂蚁金服也有着相应的技术布局。据介绍,蚂蚁金服在生物特征技术领域投入大量资源,目前已经研发出金融级人脸识别技术。蚂蚁金服的生物识别技术被命名为ZOLOZ,它是一个稳定、强大的生物身份认证系统,包括脸部、指纹和语音识别,其人脸识别准确率接近100%。同时,蚂蚁金服还参与建立了一个名为IFAA的联盟,以促进数字身份标准的统一与发展。蚂蚁金服还创建了名为“蚂蚁风险大脑”的智能风控系统,可以帮助监管者更好地理解整个金融体系,全面检测风险、快速决策和采取行动。值得一提的是,这套系统还基于机器学习在不断改进中。知名调研机构Gartner预测,未来两年,将有250亿智能事物实现在线互联,物联网时代即将来临,这让每个行业面临巨大的升级转型机遇与挑战。程立认为,和移动互联网重新定义了支付一样,IoT时代也将催生出全新的支付方式与支付体验。基于金融级生物识别技术的积累,支付宝已经率先将人脸识别技术应用于IoT设备上。2017年9月,蚂蚁金服与肯德基合作,开启了线下刷脸支付服务。在售货终端前,用户无需掏出收集,只要扫脸就可以完成购买支付过程。除此之外,蚂蚁金服还帮助小猪短租与智能锁制造商一起创建“智能锁”,付款后,用户的手机可以立即得到一个“数字钥匙”。用这个钥匙开门,无需人工登记服务。程立表示,计算是其他数字技术的基础,而不断增长的计算能力和创新的计算架构是释放数字时代全部潜能的关键。建成SOFASTACK全栈分布式体系在演讲中,程立还向与会者介绍了蚂蚁金服引以为傲的全站分布式体系架构——SOFAStack。据他介绍,SOFAStack是蚂蚁金服15年技术研发的结晶。在这套体系中,包括SOFA分布式中间件、OceanBase分布式事务数据库和mPaaS移动开发平台。程立指出,对于金融级系统,终极的目标是实现持续可用,而且在任何情况下没有数据丢失与资金损失。蚂蚁金服的系统,从最早的单数据中心,到同城双中心,再到两地三中心和四中心,分布式架构可以通过跨区域的多数据中心,实现系统可扩展性,并且提升系统容灾的水平。但两地多中心,无法解决当出现城市级故障时的数据丢失问题。为了解决这个问题,蚂蚁金服开创了三地五中心架构。通过在三个城市部署五个数据中心,用分布式协议实现多中心间数据的实时强一致性。由于数据有五个副本,因此可以做到当任何城市出现故障时,依然有多数的数据副本可用,不会有数据丢失且系统可以在30秒内自动调整部署形成两地三中心结构继续服务。“SOFAStack的OceanBase分布式数据库、SOFA分布式中间件和自动容灾系统,让这一切成为可能。”程立说。据介绍,蚂蚁金服已经将SOFAStack向金融行业开放,以帮助银行等金融机构应对互联网时代的海量交易、持续可用与业务创新的挑战。比如,南京银行在全面应用SOFAStack后,短短数月之内就完成了新一代互联网金融平台的建设,该平台现在每天处理百万笔贷款,平均每笔贷款耗时不到1秒;不仅如此,通过SOAFStack,南京银行的单账户成本也由原来的30-50元,降低到现在的4元。面向全球开放能力数据显示,在“一带一路”沿线国家和地区,目前尚有20亿人没有银行账户,有贷款需求的人中,仅21%通过正规金融机构获得贷款。程立认为,支付宝具有“走出去”的通用性。他说,支付宝是基于中国7亿用户十多年来的实证结果,一是门槛低,一张小小的二维码就让让数字服务触手可及;二是安全可依赖,支付宝的资损率低于千万分之五,远低于国际第三方支付公司千分之二的资损率。三年前,支付宝就以技术出海的方式寻找全球志同道合的合作伙伴,共同打造本地人的“支付宝”。因此,蚂蚁金服是授人以渔,因地制宜地向合作伙伴分享技术和经验,共创当地的移动支付和数字金融生活。目前,有印度、泰国、韩国、菲律宾、印度尼西亚、中国香港、马来西亚,再到巴基斯坦、孟加拉,1+9个“支付宝”已经服务了全球超过9亿人。在演讲接近尾声的时候,程立表达了蚂蚁金服的全球化愿景。他说,蚂蚁金服希望与合作伙伴一起打造数字时代的普惠支付与金融服务,让全球数十亿的消费者,数千万的小微企业可以便捷、安全、低成本地实现全球付、全球收、全球汇,人人拥有普惠的金融服务。“我们已经面向全球开放自己的能力,包括底层的核心技术、核心业务能力和上层业务平台。开放的数字科技与共赢的全球合作相结合,才会给世界带来更多平等的机会,才能共同塑造一个充满‘金融生活之美’的世界。”程立表示。

November 14, 2018 · 1 min · jiezi

蚂蚁金服首席数据科学家漆远:AI技术开放,与业界融合共创

小蚂蚁说:11月8日,在第五届世界互联网大会-《人工智能:融合发展新机遇》论坛上,蚂蚁金服副总裁、首席数据科学家漆远认为AI具有控制风险、降本增效和提升用户体验三大作用。11月8日,第五届世界互联网大会-《人工智能:融合发展新机遇》论坛顺利举行,蚂蚁金服副总裁、首席数据科学家漆远发表了关于AI的精彩观点。本文是精彩摘要。蚂蚁金服副总裁、首席数据科学家漆远(右一)漆远以蚂蚁金服为例,指出AI的作用是非常重要的。第一,可以通过AI控制风险,而风险是金融的核心所在;第二,AI可以提升效率,降低成本;第三,AI可以提升用户体验。对于AI在这三方面的价值,漆远用实例进行了佐证。首先,从风险控制来看,交易风险、贷款风险都可以用AI来进行控制。蚂蚁金服的微贷310模式就是通过AI进行风险控制的很好的例子。“通过AI,蚂蚁金服可以做到3秒贷款申请,1秒做决定,而且0人工。蚂蚁金服通过自研的AI技术,多维分析借贷问题,比如关联度、用户数据等,将这些数据结合在一起分析。”漆远表示。蚂蚁金服在“互联网之光”博览会展示定损宝第二,从降低成本提高效率来看,蚂蚁金服有一个经典的例子,那就是定损宝,通过计算机视觉技术对照片进行分析,就可以评估确定车辆损坏的维修成本,这一过程是通过深度学习和机器学习来完成的。漆远说,定损宝从2017年6月上线,一年节省的人力成本超过10亿元。AI技术在其中的最大价值就是把“原来非常长的痛苦人力过程变成了全自动化的计算机视觉的问题”。第三,从用户体验的角度看。目前,蚂蚁金服通过AI技术构建的智能客服,已经97%以上是“机器人”。这些“机器人”在多个指标方面超过了人。漆远表示,当前AI发展过程中的挑战在于融合共创,因此蚂蚁金服希望把自己在AI方面的技术对外开放出来。之前,蚂蚁金服与中和农信合作一个国家扶贫项目,并开放AI技术,在共享学习的情况下,大规模提升了中和农信的风控能力,充分保障了数字化贷款业务,实现了1+1>2的作用。对于AI的未来,漆远认为,AI技术才刚刚开始,向前发展的过程中还有很多问题没有解决,比如AI发展的目标是什么?怎么让AI做到普惠?从长远来看,这决定了AI能够给整个社会带来怎样的改变。漆远指出,关于AI最为关键的是,当前谈及的都是个体的智能,但是真正的智能是一个组织。“群体智能非常关键,比如无人车、智能导航,这背后不是一辆车,而是一个城市的车,在这背后会产生什么样的影响,这是非常关键的。”漆远表示。

November 13, 2018 · 1 min · jiezi

阿玺:支持天猫双11的核心技术,100%对外开放

小蚂蚁说:每年天猫双11都是技术的最大练兵场,无数技术都是经历了双十一的考验,历练和打磨,最终成为人们的生活日常。今年双11当晚破2000亿时,蚂蚁金服合伙人,副总裁,副CTO胡喜在上海做了一个面向媒体记者朋友的演讲,介绍十年来蚂蚁技术的发展,以及我们的开放战略。以下是演讲全文。我经历了将近十年双11,几乎每年双11我都会参与,我们内部的一个作战室光明顶,每年双11都会在那儿去做双11作战演练,相应的维护服务。我们看着大屏从100亿到破200亿、400亿,破1000亿,用了两小时时间,心情非常激动,包括刚才破2000亿的时候,大家也能感受到这个心情。我今天想给大家介绍一下,蚂蚁在这十年双11当中,我们经历了哪些事情,大家可能看到这个相应的标题有一些感触,十年天猫双11,从“有”到“无”,为什么从有到无,按道理来看,大家熟悉支付宝、熟悉蚂蚁金服都应该知道,我们应该是从无到有的过程,蚂蚁在这十年当中,我们随着双11,创新了很多相关产品,从快捷支付到余额宝,到花呗,到相关物流运费险等等,还有网商贷。我们看到了这么多产品的出现,一个从无到有的过程,为什么说是“有”到“无”呢?从社会的价值角度考虑,我们一个从有到无的过程,让我来给大家讲为什么是从有到无的过程。双11十年,究竟发生了什么事,大家看这张大屏应该心里比较清楚一点,我们从2009年开始做双11,真正感受到双11的威力是2010年,然后是2011年、2012年,一直往上去涨,我们看到双11的峰值,这十年背后究竟发生了什么事情。我们看一下三个不为人知的小数据,我们大家都知道,我们喜欢提大数据,我们今天提一些小数据,从小数据当中看到很多大的变化,114,一秒钟、一元钱、四个钱包,这背后到底是什么样的故事,让我来给大家娓娓道来。 一秒钟。从我2007年加入蚂蚁的第一天起,我们在做什么事情?我们在做一件不可能的事情,我们在做一件能够让整个中国相应的支付能够顺畅的事情。我们最早开始去IOE,把我们的技术真正做成分布式,让支付能够如丝般顺滑。 我们后来做了很多相关的事情,蚂蚁这么多年一直做什么事情,我们能让更多的消费者更好的去支付,能够带来更好的用户体验。而这么多年,我们提升了很大的系统能力,我们做了很多相关的事情,我们发明了担保交易,我们发明了快捷支付,我们从担保交易、快捷支付又到余额宝、花呗,背后我们在做什么事情,我们就是想让用户更好的去支付,更方便的去支付。这背后是为了能够把支付时间缩短到一秒钟,为了缩短到这一秒钟,用了十多年的时间,而我们还在不断追求支付体验,我们不仅仅从线上走向线下,我们从手机端,今天不带手机就可以支付,我们可以通过刷脸支付,可以通过指纹支付,到现在为止,我们看一个数据,生物支付占比,今天整个相关的双11支付,占比是60.3%,这个是我们这么多年积累下来的一个经验,这么多年努力的结果。十多年的第一个变化,无限制的交易,从有到无,无是无限制的交易,我们希望让用户真正能够很方便的交易。今天我相信很多用户去相应的购买,你可以很容易的掏出手机扫描二维码,在线支付、手机支付、指纹支付、用脸支付。背后看到这么十年期间,用户在这过程当中的变化,我们要做能够让用户更好的支付,无限制的交易能力。最终我们期望能够带来安全流畅的支付能力,7×24小时的支付能力,这是我们的第一个无,无限制交易。一元。我相信大家很多人看过这个故事,我恰恰得到了相应的今天双11大促的数据,在贵州的一个地方,一个开店的农户,他在网上卖玉米,我相信很多女士会喝玉米水,他做了一件事,贷款一元钱,我不是想说贷款一元钱多还是少的事情,而是说我们这么多年的付出,能够让小微经营者告别融资难、融资烦、融资贵的问题。这是我们这么多年努力的结果,而背后支撑的是两大产品,一个是310小微贷款,另外是212保险理赔,310大家已经比较清楚了,我们说三分钟申请、一秒钟放款、最后所有过程,零人工参与,这个背后是我们这么多年,针对小微企业,尤其是淘宝上面很多中小企业、小微商户相应的支持,让他们能够解决融资难的问题,真正让普惠金融走向更多中小企业。背后给大家带来一组数据,截止到今天为止,我们已经为1100万中小微企业,提供了2万亿贷款额度,累计2万亿贷款,为4800万小微企业提供了免费医疗保险金服务,这背后是我们这么多年的积累。 而今天看到一个双11数据,我们为343万淘宝商户提供了将近2000亿贷款,为他们今天保障双11能够顺利进行,做了一个很大的保障,而这个数据是去年的将近34.3%倍,这个背后我们做了很多,今年我们为很多小微商户提供3000万的一个资金成本降低的能力,让他们贷款能够更方便。这是一元钱也能贷款,而背后体现的是什么?十年的背后体现的是什么,十年的第二个变化,无差别的服务,这是蚂蚁金服一直想做的一个事情,我们期望于让小企业能够享受中大型企业同样的金融服务,能让普惠金融,让更多中小微企业享受,这是我们的第二个变化,无差别服务。 还想和大家介绍一个巴基斯坦的消费者的故事,他第一次参加大促,他第一次参加整个电商大促,他可以在阿里电商平台上,比如Lazada、Daraz进行购物,跟中国很多双11用户同样的感受,而且他还可以用类似于中国支付宝这样的钱包,同样去付款,这样的事情,我们还在四个国家发生,菲律宾的钱包,印尼的钱包,巴基斯坦钱包,还有孟加拉钱包,这是我们说的第三个变化,无疆界的市场,能够让全球消费者、小企业自由进入全场去消费,和中国双11消费者、卖家同样的待遇,我们期望于真的是为20亿消费者服务,让全球小卖家能够享受到这样的服务,让消费者享受同样的服务,这是我们说的第三个变化,无疆界市场。总结一下,从有到无,从有限制的交易到无限制的交易,从有差别的服务到无差别的服务,能让更多中小企业享受同样的金融服务,无疆界的市场,能够实现全球买、全球卖、全球收、全球付,这样一个能力。而这背后显示无差别的服务,无限制的交易和无疆界的市场,背后就是这个数字经济时代的到来,而这个数字经济时代的到来,是能够带来无限的想象力,而这个无限的想象力,背后是我们想让任何人在任何地点、用任何货币去买任何商品,这我们十年来的变化。十年来,我们有变化,还有一些不变的东西,不变的是什么,首先一点,阿里巴巴的使命、愿景,让天下没有难做的生意,而蚂蚁金服同样秉承这样的使命、愿景,我们期望于通过科技去创造价值,解决实体经济发展的问题。在这十多年,我们随着双11,真正用软科技产生很多相关产品,像担保交易、快捷支付、小微贷款、条形码、余额码、芝麻分、蚂蚁森林,还有很多相关的,比如区块链汇款,背后都体现了蚂蚁金服相关的科技理念,我们希望用科技创造价值,我们期望解决实体经济发展的问题,这是我们的使命、愿景。我们今天有将近1.5亿海外商品通过区块链技术,今天很多时候,你去买牛奶、钻石,买很多东西,都有它自己的身份证,他可以知道从什么原产地过来的,经过什么样的物流路线,背后是科技的力量,在这科技背后是我们这么多年在科技,尤其在区块链方面的积累和不断攻破一个又一个难点。我们期望于区块链能够改变很多信任的问题,在过去几年,我们区块链做两件事,第一是做相应的核心技术,我们期望打造区块链能力,提供更大、高可用、更安全的能力,另外我们还是坚持以场景驱动,通过场景去锻炼相应的技术能力,这是我们用科技相关的能力。今天我们看到的蚂蚁金服支持双11所有的相关技术产品已经100%全面对外开放,这是我们对外的承诺,十年消费拉动经济增长第一大引擎,作为中国的增长,三驾马车,消费是很大的推动力,另外科技从事服务,唤醒蓬勃的消费力,我们期望服务九亿消费者,数千万小微经营企业,能够帮助他去完成很多东西。下一个十年,我们想要做什么,还有哪些东西没来,我们还能走多远,我们看一下,今天很多小女孩买衣服已经习惯了物流运费险,她可以买回来再试,试完以后不行再退回去,这造就了很多相关市场,包括家居行业,都因为物流运费现象而改变很多。我们看到一些事情的发生,海外用户刚刚用上了退运费险,包括澳大利亚、美国等等七个国家都在用这样的物流运费险,中国正在发生的事情也在影响全球。我们期望于这只是一个开始,就像今天是双11一样,Just A Beginning,所有都是一个开始,我们期望于用更多的技术,能够创造更多不可能,能够让全球消费者和卖家、中小企业,能够享受中国同样的普惠金融,科技驱动这样一个能力。让我们继续从有到无,突破边界,带给20亿全球消费者、1亿全球小微经营者的无限想象力,让我们继续相信科技、相信未来。

November 13, 2018 · 1 min · jiezi

WSL 配置指北:打造 Windows 最强命令行

原文发表在我的 博客 上,欢迎订阅。;)在两年前的八月,Microsoft 正式发布了 Windows 10 Anniversary Update 周年更新(它还有着 RS1,Version 1607,Build 14393 等一大堆别名)。其中最让包括我在内的众多开发者感到兴奋的特性之一,就是 WSL(Windows Subsystem for Linux,当时还叫 Bash on Ubuntu on Windows)的正式加入。在 Windows 上原生运行 Linux 可执行文件,牛逼疯了!然而 Bug10 也不是浪得虚名,原本只提供给 Insider 的 WSL 在正式发布后依然问题多多(不仅 zsh、tmux 等工具无法使用,网络相关的操作更是一概欠奉,还有各种各样 奇妙的 BUG),基本没有可用性,我在尝鲜了一段时间后也不得不重回 Cygwin 的怀抱。不过好消息是,在之后的更新中,这些 BUG 都已被逐一消灭。经过了两年的发展,WSL 已经足够成熟,我也是时候完成这篇一咕再咕的博文了。1. 我理想中的命令行界面既然违反广告法取了这么个标题,那我自然得先描述一下我的目标,也就是我理想中的命令行界面应该是什么样子的(如果你不清楚命令行的概念,可以看看我之前写的 这篇文章):好看(配色、字体可以自由设定);支持 UTF-8 字符的输入与显示;支持常见的 NIX 命令行工具(cat、grep、awk 等);自动补全、语法高亮、历史记录;完善的复制粘贴支持;互操作性(共享文件系统、网络栈,可调用 Win32 程序);支持常用的脚本语言(PHP、Python、Node.js 等);包管理器,以及其他各种常用软件的支持;快速呼出(快捷键、右键菜单入口)。然而遗憾的是,Windows 上的命令行一直以来都很微妙。2. 难用的 Windows 命令行停停停,那边的 PowerShell 爱好者 ,咱别动粗成吗?首先我要对标题做出一些订正,Windows 原生命令行其实也可以不那么难用。虽然 cmd.exe 是公认的难用到反人类(毕竟是用来兼容 DOS 的老古董),但后来推出的 PowerShell 已经足够强大且现代化,能够称得上是一个成熟的命令行 Shell 了。如果你愿意学习的话,PowerShell 几乎可以满足你对命令行的所有期待。这一点可以参见:Is PowerShell ready to replace my Cygwin shell on Windows?但是,PowerShell 与 Bash 等类 Unix 系统上的 Shell 程序几乎是两个完全不同的世界。不仅语法不同,其平台上各类常用的命令行工具也基本不一致(比如类 Unix 系统中的 grep 对应 PowerShell 中的 Select-String,uniq 对应 Select-Object -Unique 等)。往深了说,他们的系统设计理念都是不一样的,比如很多人推崇的 Unix 哲学,在 Windows 上就基本不见踪影;而 COM 等概念也是 Windows 独一份。▲ 图片来源:シス管系女子 BEGINS 特別編 まんがでわかる WSL当然,我无意在此挑起操作系统间的圣战。Windows 和类 Unix 系统中的命令行哪个好用,见仁见智。不过对于包括我在内的很多用户都认为 Windows 命令行不怎么好用,仅此而已。回到正题。虽然 Windows 的命令行一直遭人诟病,但是人家的图形界面牛逼啊。于是无数工程师前赴后继,试图在 Windows 上创造出不输给类 Unix 系统的命令行体验 —— 却绝大多数以失败告终。曾经努力过的人,或者回到可爱的 Linux 上,或者进入高贵冷艳的 macOS 的世界。其中有先辈留下了 Cygwin、GnuWin32 等工具集,让我们可以在 Windows 下使用类 Unix 系统中常见的命令行工具,成为了不少 Windows 用户的救赎。然而,就当大家都觉得「也就这样了」的时候,Microsoft 出人意料地站了出来。带着他新鲜出炉的 WSL。3. Windows Subsystem for Linux,参上!大家都把 WSL 吹得这么牛逼,那 WSL 究竟是个什么玩意儿呢?简单来说,WSL 是一个 兼容层,有点像反过来的 Wine。首先,我问个问题,为什么 Linux 上的程序无法在 Windows 上运行呢?了解过一点操作系统原理的同学应该都知道,这是 Windows 与 Linux 的内核提供的接口不同(系统调用、API 等)导致的。举个栗子,我们想知道某目录下的内容,在 Linux 下我们会使用 ls 命令,而在 Windows 下我们会使用 dir 命令。当我们在 Linux 上执行 ls 命令,ls 会调用 getdents 这个系统调用,Linux 内核收到请求,将目录的内容返回给应用程序;当我们在 Windows 上执行 dir 命令,dir 会调用 NtQueryDirectoryFile 这个 API,NT 内核收到请求,将目录的内容返回给应用程序。虽然系统不同,但基本上都是一个道理。然而,当我们把 Linux 上的应用程序拿到 Windows 上运行时,应用程序和内核就双双懵逼了。比如 ls 会尝试调用 getdents 系统调用(理想化的情况下,暂不考虑可执行文件格式等问题),Windows 的 NT 内核一看,心说:「这他娘的什么东西,老子不认识啊,啥情况啊」,ls 也想:「尼玛,内核怎么不回话啊,咋回事儿啊」……两边语言不通,应用程序自然无法正确执行。但是有了 WSL,情况就不一样了。依然拿 ls 举例,当我们在 WSL 中运行 ls 命令时,ls 会调用 getdents 系统调用(这个系统调用接口是 WSL 提供的,Windows 本身并没有这个接口),WSL 收到这个请求,明白了应用程序是想要知道目录的内容,于是把 Linux 的系统调用转换为 NT API NtQueryDirectoryFile。NT 内核收到 WSL 的请求,将目录的内容返回给 WSL,WSL 再把返回的内容包装好后返回给 ls。也就是说,WSL 在 Linux 应用程序与 Windows NT 内核之间起到了翻译者的作用。很简单的道理,既然 NT 内核无法理解 Linux 应用程序的 POSIX 系统调用,那就弄个翻译来将 POSIX 系统调用实时转换为 NT 内核能理解的 API 调用,突出一个见人说人话、见鬼说鬼话。只要实现了足够多的系统调用翻译,那么理论上 WSL 可以完全模拟成一个 Linux 内核。相信各位都听说过鼎鼎大名的 Cygwin。同样是能让 Linux 应用程序运行在 Windows 上,WSL 和 Cygwin 有什么不同呢?其实差别还是挺大的。虽然 Cygwin 提供了完整的 POSIX 系统调用 API(以运行库 Cygwin.dll 的形式提供),但其依然工作在 User Mode;而 WSL 中的 Linux 应用程序进程会被包裹在一个叫做 Pico Process 的东西里,这个东西里发出的所有系统调用请求都会被直接送往 Kernel Mode 中的 lxcore.sys 与 lxss.sys 处理。同样是将 POSIX 系统调用转换为 Windows 中的 API,Cygwin 是转换成 Win32 API 的调用(因为它架设在 Win32 子系统上,很多内核操作受限于 Win32 的实现,比如 fork),而 WSL 则是转换为更底层的 NT API 调用(WSL 是与 Win32 平行的子系统,直接架设在 NT 内核上,可以通过 NT API 原生实现 fork 等系统调用)。▲ WSL 架构示意图。图片来源:Windows for Linux Nerds最重要的一点:如果使用 Cygwin,Linux 应用程序的源码必须 link 至 Cygwin 运行库(Cygwin*.dll),修改源码重新编译后才能在 Windows 下运行。这些重新编译后的 Linux 应用程序在调用 POSIX API 时不会直接去请求内核,而是会去调用 Cygwin 运行库,由运行库翻译成 Win32 API、执行调用后返回结果。这也就意味着,重新编译后的应用程序需要依赖 Cygwin 运行库才能正常运行(有时候你会碰到的「缺少 Cygwin1.dll」报错就是这个原因),而且这样编译出来的可执行程序是纯正的 Win32 PE 格式封装,只能在 Windows 上运行。而在 WSL 下,我们可以直接运行未经任何修改的 ELF 格式 Linux 可执行程序。▲ Cygwin 目录下,被编译成 Win32 可执行程序的 Linux 应用程序们。最后总结一波:WSL 就像是一个翻译官,就算那些未经修改的 Linux 应用程序们操着一口纯正的 POSIX 系统调用语法,WSL 也能快速准确地将其翻译为 NT 内核能听懂的 API 调用;而那些使用了 Cygwin 重新编译后的 Linux 应用程序,就像是改造人一样变成了 Win32 应用程序的形状,还被套了个翻译机。程序自己(源码中)说的是 POSIX,经过翻译机(Cygwin 运行库)之后就变成 Win32 API 调用了,这样 NT 内核也能听得懂。但是每次添加新程序都要改造,多麻烦啊,还是 WSL 原生态更健康(笑)。以上只是我对 WSL 的粗浅解释,其具体实现原理可以参考官方博客上的 这一系列文章。4. 安装 WSL,拥抱可爱的 Linux好了不说废话,让我们开始安装 WSL。注意,WSL 仅支持 64 位系统,且本文中所描述的安装方法仅适用于 Windows 10 Fall Creators Update(秋季创意者更新,RS3,Version 1709,Build 16299)及以上版本。第一步,打开「控制面板」中的「程序与功能」,点击左侧边栏的「启用或关闭 Windows 功能」选项,在弹出的窗口中勾选「适用于 Linux 的 Windows 子系统」,然后点击确定(可能需要重启)。如果你懒得用 GUI,也可以直接在 PowerShell 中以管理员权限执行命令:Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux第二步,打开 Microsoft Store,搜索「WSL」。挑选一个你喜欢的 Linux 发行版,然后点击安装。(截至目前,商店中可用的发行版有 Ubuntu、openSUSE、SUSE Linux Enterprise Server、Debian 以及 Kali Linux。)第三步,在开始菜单中找到你刚刚安装的发行版,打开它。等待几分钟的初始化过程,设定好用户名与密码后(不需要与 Windows 的相同,用过 Linux 的选手应该都懂的)就会自动进入 Linux 环境。至此,你已经完成了 WSL 的安装。你也可以同时安装多个发行版,它们的数据都是独立的,互不影响。5. 使用更专业的终端模拟器我猜你现在正在对上面那个窗口发呆。—— 这个新宋体他娘的是个什么情况?如果你正在使用中文 Windows 系统,而且之前并没有修改过 Win32 Console 的默认配置,那么你的 WSL 终端默认就会是这样的。新宋体,就是这么 Hardcore。惊不惊喜,意不意外?好吧不开玩笑,Windows 这个控制台窗口就是很多人讨厌它的原因之一,难用又难看。丑这一点倒还有解决方法(经过一番设置后还算能看,我以前就写过一篇关于 自定义 Windows 控制台字体 的文章),难用却是实打实的。尽管 Win10 上的控制台已经改进了不少(可以看看 Microsoft 的官方博客:Windows Command Line Tools For Developers),但其依然是最难用的终端模拟器之一,或许没有之一。因此,为了实现我们的目标,一个更强大的终端模拟器是必须的。终端模拟器是什么?为了这个回答这个问题,我专门写了一篇文章,去看看吧。:P我个人比较推荐的终端模拟器有:wsl-terminal专门为 WSL 开发的终端模拟器,基于 mintty 与 wslbridge,稳定易用。ConEmuWindows 上的老牌终端模拟器,功能极为强大,要啥有啥。Hyper基于 Electron 的跨平台终端模拟器,好看和可扩展性是卖点,BUG 不少。还有其他各种各样的终端模拟器,选个自己喜欢的就好。反正不管选哪个,都比默认的那玩意儿要好用。????另外,设定终端模拟器的 Shell 入口时有个坑,需要注意一下(参见下文 6.4)。▲ 我正在使用的终端,wsl-terminal 与 Hyper。好看是第一生产力。6. 让我们更深入一些以下是 WSL 的一些优化技巧。6.1 使用软件源镜像由于众所周知的原因,各大发行版默认的软件源在中国大陆的访问速度都很屎。我目前使用的是 清华大学的 Ubuntu 镜像源。6.2 安装 zsh 与 oh-my-zsh想要快乐地使用命令行,一个趁手的 Shell 是必不可少的。我个人习惯使用 zsh,安装步骤不再赘述。我的自定义 oh-my-zsh 主题:# ~/.oh-my-zsh/custom/themes/robbyrussell-ascii.zsh-theme# Modified from robbyrussell, the default theme of oh-my-zsh.# > blog git:(source) x $local ret_status="%(?:%{$fg_bold[green]%}>:%{$fg_bold[red]%}>%s)“PROMPT=’${ret_status} %{$fg[cyan]%}%c%{$reset_color%} $(git_prompt_info)$ ‘ZSH_THEME_GIT_PROMPT_PREFIX=”%{$fg_bold[blue]%}git:(%{$fg[red]%}“ZSH_THEME_GIT_PROMPT_SUFFIX=”%{$reset_color%} “ZSH_THEME_GIT_PROMPT_DIRTY=”%{$fg[blue]%}) %{$fg[yellow]%}x%{$reset_color%}“ZSH_THEME_GIT_PROMPT_CLEAN=”%{$fg[blue]%})"# ~/.zshrcZSH_THEME=“robbyrussell-ascii"plugins=(git zsh-completions zsh-autosuggestions zsh-syntax-highlighting)6.3 安装多个发行版Windows 10 Fall Creators Update 之后,WSL 支持同时安装多个 Linux 发行版,直接在 Microsoft Store 中搜索想要的发行版并点击安装即可。这些发行版可以同时运行,并且数据互相独立。你可以使用 wslconfig.exe 来查询已安装的发行版,或者更改默认的发行版。删除发行版也很简单,直接卸载对应的商店应用即可(记得备份哦)。6.4 多种进入 WSL 的方式比较新版支持同时安装多个发行版,那自然不能像以前那样只提供一个 bash.exe 入口了。秋季创意者更新之后的 Windows 提供了 多种进入 WSL 环境的方式:wsl.exe打开默认发行版中的默认 Shell。<distroname>.exe打开指定发行版中的默认 Shell。bash.exe (DEPRECATED)打开默认发行版中的 bash Shell。如果你更改了默认 Shell 却总是打开 bash,就说明你使用了这个入口。你也可以通过这些入口直接在 WSL 中执行命令并返回结果:<distroname> -c [command]bash -c [command]wsl [command](不再需要指定 -c)6.5 与 Windows 的互操作性WSL 与 Windows 之间的互操作性 (Interoperability) 很牛逼。怎么个牛逼法呢?Windows 下的所有盘符都挂载在 WSL 中的 /mnt 目录下,可以直接操作。WSL 中的所有数据则存放于 C:\Users{你的用户名}\AppData\Local\Packages{Linux发行版包名}\LocalState\rootfs 目录中(不要在 Windows 中修改这些文件,这会造成文件权限错误):$ ls /mntc d e$ mount -lrootfs on / type lxfs (rw,noatime)C: on /mnt/c type drvfs (rw,noatime,uid=1000,gid=1000)D: on /mnt/d type drvfs (rw,noatime,uid=1000,gid=1000)E: on /mnt/e type drvfs (rw,noatime,uid=1000,gid=1000)你可以在 Windows 命令行环境中直接调用 WSL 中的命令:PS C:\temp> wsl ls -altotal 0drwxrwxrwx 1 printempw printempw 4096 Sep 7 19:04 .drwxrwxrwx 1 printempw printempw 4096 Sep 7 18:38 ..-rwxrwxrwx 1 printempw printempw 4 Sep 7 19:04 foo.txt你也可以在 WSL 中调用 Windows 中的命令行程序:$ which ipconfig.exe/mnt/c/Windows/System32/ipconfig.exe$ ipconfig.exeWindows IP Configuration…你可以在 WSL 中直接启动 Windows 应用:$ notepad.exe “C:\temp\foo.txt"你还可以通过 pipes 与 Windows 程序通信:# 复制内容至 Windows 剪贴板$ cat foo.txt | clip.exe你甚至可以把 Windows 命令和 WSL 命令混着用:PS> ipconfig | wsl grep IPv4IPv4 Address. . . . . . . . . . . : 192.168.1.114$ ipconfig.exe | grep IPv4 | cut -d: -f2192.168.1.114$ ls -al | findstr.exe foo.txt-rwxrwxrwx 1 printempw printempw 4 Sep 7 19:04 foo.txt$ cmd.exe /c dir Volume in drive C is Windows Volume Serial Number is B263-**** Directory of C:\temp2018/09/07 19:04 <DIR> .2018/09/07 19:04 <DIR> ..2018/09/07 19:04 4 foo.txt 1 File(s) 4 bytes 2 Dir(s) 194,422,341,632 bytes free同时,WSL 与 Windows 共享网络栈,也就是说你可以:在 WSL 中启动 web server,在 Windows 上使用浏览器访问;在 Windows 下启动 MySQL/Redis 服务器,在 WSL 中连接;诸如此类。如果你对 WSL 与 Windows 之间互操作的原理有兴趣,可以参考一下这些文章:WSL interoperability with WindowsWindows and Ubuntu Interoperability6.6 DrvFs 文件权限问题虽然 WSL 中可以直接访问 Windows 磁盘的内容,但如果你曾经这么做过,你应该对这样绿油油一片的 ls 不会感到陌生。为什么 NTFS 文件系统中的文件到 WSL 下权限就全部成 0777 了呢?这主要是 DrvFs 中 Linux 文件权限的实现导致的。在 WSL 中,Microsoft 实现了两种文件系统,用于支持不同的使用场景:VolFs着力于在 Windows 文件系统上提供完整的 Linux 文件系统特性,通过各种手段实现了对 Inodes、Directory entries、File objects、File descriptors、Special file types 的支持。比如为了支持 Windows 上没有的 Inodes,VolFs 会把文件权限等信息保存在文件的 NTFS Extended Attributes 中。记得我上面警告过你不要在 Windows 中修改 WSL 里的文件吗?就是因为 Windows 中新建的文件缺少这个扩展参数,VolFs 无法正确获取该文件的 metadata,而且有些 Windows 上的编辑器会在保存时抹掉这些附加参数。WSL 中的 / 使用的就是 VolFs 文件系统。DrvFs着力于提供与 Windows 文件系统的互操作性。与 VolFs 不同,为了提供最大的互操作性,DrvFs 不会在文件的 NTFS Extended Attributes 中储存附加信息,而是从 Windows 的文件权限(Access Control Lists,就是你右键文件 > 属性 > 安全选项卡中的那些权限配置)推断出该文件对应的的 Linux 文件权限。所有 Windows 盘符挂载至 WSL 下的 /mnt 时都是使用的 DrvFs 文件系统。由于 DrvFs 的文件权限继承机制很微妙,最后导致的结果就是所有文件的权限都变成了 0777。而且由于早期的 DrvFs 不支持 metadata,所以你无法给这些文件 chown/chmod,只能对着绿油油的 ls 干瞪眼。不过好消息是,Windows Insider Build 17063 之后,DrvFs 也像 VolFs 一样支持给文件写入 metadata 了。要启用 DrvFs 的 metadata 支持,你需要添加参数重新挂载磁盘:# 修改成你自己的盘符$ sudo umount /mnt/e$ sudo mount -t drvfs E: /mnt/e -o metadata不过如果仅仅是执行了这个,虽然支持了文件权限的修改,但磁盘下的文件权限默认依然还是 0777,除非你给它们整个 chmod 一遍。如果你不想这么做,也可以指定其他的 mount 参数:$ sudo mount -t drvfs E: /mnt/e -o metadata,uid=1000,gid=1000,umask=22,fmask=111这样磁盘下的文件的默认权限就是 0644,ls 也不会再是绿油油一片啦。不过每次使用时都要重新挂载未免也太烦,我们可以通过另一个新特性 Automatically Configuring WSL 实现自动挂载。在 WSL 中创建 /etc/wsl.conf,在其中填写如下内容:[automount]enabled = trueroot = /mnt/options = “metadata,umask=22,fmask=111"mountFsTab = true# 这个文件里还可以添加其他配置项,有兴趣的可以看看上面的链接重启终端,所有的盘符就会使用上面的配置自动挂载啦(可以使用 mount -l 查看)。另外,如果你想要给不同的盘符设定不同的挂载参数(上面的方法对所有盘符都有效,如果你想在 WSL 中运行 Windows 下的应用程序,就得每次都 chmod +x 一下,所以我一般都会把 C: 排除掉),就需要手动修改 /etc/fstab。首先确保 wsl.conf 中的 mountFsTab 为 true,然后编辑 /etc/fstab,添加如下内容:# 不在此列表中的盘符会使用 wsl.conf 中的参数挂载# 格式可以自己去查 fstab 的帮助文档E: /mnt/e drvfs rw,relatime,uid=1000,gid=1000,metadata,umask=22,fmask=111 0 06.7 其他关于 WSL 的折腾虽然 Microsoft 开发 WSL 出来主要是着重于命令行环境的使用,但经过测试,WSL 是可以通过 X Server 执行 GUI 应用程序的,甚至还可以在 WSL 里面用 Wine 执行 Windows 程序……(?????)也有人试过在 WSL 中运行完整的 DE,体验似乎还不错,有兴趣的同学可以去试试。另外,你也可以通过某些神秘的方法用上 Microsoft Store 未提供的 Linux 发行版,比如 Arch Linux。如果你对 WSL 的底层实现有兴趣,也可以去围观一下 WSL 的官方博客:https://blogs.msdn.microsoft….https://blogs.msdn.microsoft….7. 总结虽然 WSL 很不错,但是其比起真正的 Linux 系统还是有很多不足(Docker 等涉及未实现的内核特性的软件无法使用,Raw socket 相关的操作依然容易出错,I/O 性能相比之下较为孱弱等)。如果你日常开发中需要使用到那些 WSL 未提供的 Linux 特性,那么还是乖乖跑 VM 或者装 Linux 吧。对我来说,WSL 最大的意义就是,让我能够用我熟悉的 Linux 那一套去操作 Windows。如果你和我的需求一样,那么比起 Cygwin、VM 等解决方案,WSL 有着完整的 Linux 环境、强大的互操作性、更低的资源占用。离不开 Windows,却又羡慕 Linux 下强大命令行工具的各位,相信你们会喜欢 WSL 的。而且最近几年 Microsoft 在笼络开发者方面的努力大家有目共睹,这里就容我夸上一句:Microsoft,干得漂亮! ...

October 15, 2018 · 5 min · jiezi

Windows下PHP服务nginx不能使用file_get_contents的原因

注意:本文为转载,原文链接:Windows下PHP服务nginx不能使用file_get_contents/curl/fopen的原因!一、问题说明在Windows环境下搭建了一个本地开发服务环境,使用Nginx做服务,但是在使用file_get_contents()获取本地的链接时http://127.0.0.1/index.php,出现了这样的错误:file_get_contents(http://127.0.0.1/index.php) [<a href=‘function.file-get-contents’>function.file-get-contents</a>]: failed to open stream: HTTP request failed! 本地电脑php环境为:nginx+php+mysql;于是找到这篇文章做个笔记,记录下!这两天一直在搞windows下nginx+fastcgi的file_get_contents请求。我想,很多同学都遇到当file_get_contents请求外网的http/https的php文件时毫无压力,比如echo file_get_contents(‘http://www.baidu.com’) ,它会显示百度的页面。但当你请求localhost/127.0.0.1本地网络的php服务时却一直是timeout,无论你将请求时间和脚本运行时间多长都无法返回数据,如file_get_contents(‘http://localhost/phpinfo.php’) 。然而当你尝试请求html这样的静态文件时却完全没有问题。是什么原因呢?!首先,我们知道file_get_contents/curl/fopen打开一个基于tcp/ip的http请求时,请求数据发送到nginx,而nginx则委托给php-cgi(fastcgi)处理php文件,一般情况fastcgi处理完一个php请求后会马上释放结束信号,等待下一个处理请求(当然也有程序假死,一直占用资源的情况)。打开nginx.conf,我们看到下面这一行:location ~ .php { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME d:/www/htdocs$fastcgi_script_name; include fastcgi_params;}上面已经清楚地看到,所有使用php结尾的文件都经过fastcgi处理,而在php.ini的配置文件中也有一句:cgi.force_redirect = 1表明,所有php程序安全地强制转向交给cgi处理。但在windows中,本地127.0.0.1:9000怎样与php-cgi联系的呢?!答案是增加一个php-cgi进程,用它来监听127.0.0.1:9000。通过控制器命令:RunHiddenConsole.exe D:/www/php/php-cgi.exe -b 127.0.0.1:9000 -c C:/WINDOWS/php.ini我们就可以在启动windows时,开启一个php-cgi.exe进程监听来自127.0.0.1:9000 的请求。在dos命令下打开netstat –a就可以看到本地计算机下的9000端口处于listening状态(也就是空置,如果没有发送任何请求的话)。好了,该说说在php中使用file_get_contents()、curl()、fopen()函数访问localhost时为什么不能返回结果。我们再来试验在index.php中加入file_get_contents(‘http://127.0.0.1/phpinfo.php’) 语句向phpinfo.php发送一个请求,这时浏览器中的状态指示一直在打转,表示它一直在工作中。打开Dos中的netstat命令,可以看到本地的9000端口的状态为:ESTABLISHED,表示该进程在联机处理中。实际上,这里我们已经同时向nginx发送了两个基于http的php请求,一个是解析index.php,而另一个是phpinfo.php,这样矛盾就出来了,因为我们的windows系统只加载了一个http进程,因此,它无法同时处理两个php请求,它只能先处理第一个请求(index.php),而index.php却又在等待phpinfo.php处理结果,phpinfo.php没人帮它处理请求,因为它一直在等待index.php释放结束信号,因此,造成了程序的阻塞状态,陷入了死循环。所以我们就看到了浏览器的状态指示一直在打转。Curl()与fopen函数的原因也相同。二、解决方法找到了原因,我们也就有了解决办法。一是,向系统增加一个http请求,当一个php-cig内要加载另一个请求时,它能够分配其它http处理额外的php请求。这时需给另一个http sever分配不同的端口,比如8080。nginx的案例如下:http { server { listen 80; server_name 127.0.0.1; location / { index index.php; root /web/www/htdocs; } } server { listen 8080; server_name 127.0.0.1; location / { index index.html; root /web/www/htdocs; } } include /opt/nginx/conf/vhosts/php.conf; }这样,端口80与8080可以分别处理不同的程序,比如:test.php echo file_get_contents(‘http://localhost:8080/phpinfo.php’);当然,在*unix下有更多选择,比如fork。另外提醒下,网上有人说,通过去掉地址中的http://协议标记,而使用相对地址就规避函数的检查,实际情况是不是这样呢?!当在index.php中使用file_get_contents(‘phpinfo.php’); 时,我们可以看到函数输出了phpinfo.php的源代码,相当于file_get_contents(‘file:c:wwwphpinfo.php’); ,它实际上只是读取你的文本内容,因为file_get_contents()函数首先是处理file协议的,而curl则直接报错无法解析。因此这些人纯粹是不学无术的骗子。还有人提出修改hosts文件,增加localhost www.xxx.com影射关系,函数通过www.xxx.com访问本地php,这其实也是不治本的偏方,因为这只是方便计算机的dns解析,最终www.xxx.com交给127.0.0.1,而后者交给唯一http,还是阻塞。 ...

September 5, 2018 · 1 min · jiezi