Windows环境-Git提交代码到Github附python-读写Excel文件Demo

目录Git提交代码常用命令python 读写Excel文件Demo一、Git常用命令 git clone #从远程仓库克隆整个项目代码 git status #列出当前目录所有还没有被git管理的文件和被git管理且被修改但还未提交的文件git add . #提交全部未跟踪和修改文件,但是不处理删除文件 git commit -m "message" #将暂存区里的改动给提交到本地的版本库 -m 参数表示可以直接输入后面的"message",如果不加 -m参数,那么是不能直接输入message的,而是会调用一个编辑器一般是vim来让你输入这个message git push #将本地分支上传到远程分支 注:此时已经把我们的代码已经提交到远程仓库,后续还会提到企业办公中git常用命令的使用。 2.python 读写Excel文件Demo Pandas处理Excel数据 1.pandas依赖处理Excel的xlrd模块,安装命令是:pip install xlrd 2.安装pandas,安装命令是:pip install pandas Xlsxwriter模块的使用 1.Xlsxwriter模块主要用来生成Excel表格,插入数据、插入图标等表格操作 2.安装Xlsxwriter,安装命令是:pip install xlsxwriter requests调用有道翻译接口 1.requests 是一个功能强大、简单易用的 HTTP 请求库,可以使用 pip install requests 命令进行安装 2.lxml是python的一个解析库,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高,可以使用pip install lxml命令进行安装 Github源码地址: ExcelHandle

July 3, 2019 · 1 min · jiezi

你可能不知道的-npm-实用技巧

作者: LeanCloud weakish 分享一些 npm 包管理工具的实用小窍门,希望能够略微提高下前端、Node.js 开发者的生活质量。绝大多数前端和 Node.js 开发者每天的日常工作都离不开 npm,不知道你对 npm 的观感如何?如果你觉得 npm 很棒,那么不妨看下这篇文章,说不定其中有你之前没留意过的小窍门,可以让你 npm 用得更顺手。如果你觉得 npm 很糟糕,那也可以看下这篇文章,也许会发现用上一些小技巧,npm 会变得稍微不那么糟糕。 npm ci别被它的名字骗了。npm ci 并不仅仅适用于持续集成系统,在日常开发中,npm ci 非常实用。和 npm install 不同,npm ci 根据 package-lock.json 安装依赖,这可以保证整个开发团队都使用版本完全一致的依赖,避免把时间浪费在排查因为依赖不一致而导致的各种奇怪问题上。不仅如此,npm ci 还有一个很好的副作用,加快 node 模块安装速度。因为 npm ci 直接根据 package-lock.json 中指定的版本安装,无需计算求解依赖满足问题,在大多数情况下都可以大大加速 node 模块安装过程。如果你曾经因为嫌 npm install 太慢而换用兼容性不那么好的 yarn 以及兼容性更不好的 pnpm,那么不妨试下 npm ci,也许你会发现,其实 npm 也可以不那么慢。 另外,如果 package-lock.json 过时(和 package.json 冲突),那么 npm ci 会很贴心地报错,避免项目依赖陷入过时状态。 有了 npm ci,基本上我只在引入新依赖时才使用 npm install。 ...

July 3, 2019 · 2 min · jiezi

Scrum的五个价值观勇气-承诺-尊重-专注和开放

Scrum的五个价值观:勇气,承诺,尊重,专注和开放。了解自组织首先要了解这些价值观是如何融入您的项目中的实际事物: 每个人都致力于项目的目标当团队有权做出决策以实现这些目标时,可以实现这种承诺水平,每个人都对项目的计划和执行方式有发言权。第3章中的电子书阅读器团队最初被要求建立一个互联网店面。为了使产品成功,他们不得不忽略这一要求,以便提供更有价值的项目。这是唯一可能的,因为他们被允许做出这个决定 只有团队,Scrum Master和产品负责人。他们不需要通过官僚机构来完成任务。 团队成员互相尊重当团队成员相互尊重时,他们能够相互信任,以完成他们所做的工作。但对于程序员和其他技术人员而言,这种尊重并不总是那么容易。许多程序员,尤其是高技能程序员,往往纯粹基于技术能力。这可能是有效采用Scrum的障碍。如果程序员不尊重产品负责人,他在谈论项目目标时不会听取产品负责人的意见。 一个优秀的Scrum Master会找到方法来增加团队成员之间的相互尊重。例如,他可以向程序员展示产品负责人对用户的思考方式以及公司需求有深刻的理解。随着程序员开始了解该知识如何对项目成功有用,他们开始重视并尊重产品负责人的意见。 每个人都专注于工作当Scrum团队成员正在进行sprint工作时,这是他在sprint 期间唯一的工作。 他可以自由地完成完成sprint积压所需的任何工作,并处理sprint期间对该积压所做的任何更改。当每个团队成员专注于sprint目标并且可以自由地完成满足这些目标所需的任何工作时,整个团队能够组织自己并在需要变更时轻松地重定向。 另一方面,分心的团队是一个效率较低的团队。在现代工作场所中有一个神话,人们 - 特别是程序员 - 在多任务处理时工作得最好,因为他们可以在第一个项目被阻止时转移到第二个项目的任务。这不是人们在现实生活中的工作方式!在项目之间切换,甚至在同一项目中的不相关任务之间切换会增加意外的延迟和工作量,因为上下文切换需要大量的认知开销。放下你目前的工作需要花费大量的心理努力,然后从另一个项目的中心开始。你最终不得不回顾你上次做的事情,只是为了提醒自己你试图解决的问题。告诉团队成员切换到另一个项目上的任务不仅需要执行新任务所需的时间, 不买吗?试试这个思想实验。假设你有两个为期一周的任务。并假装通过物理定律的一些惊人的弯曲,多任务处理不会增加任何开销。您可以无缝地切换这些任务,而无需增加一秒的开销或延迟,因此这两项任务将花费两周的时间。即使在这些完美(和不可能)的情况下,多任务也没有意义。如果你没有多任务,你将在第一周结束时完成第一个任务,第二个任务在第二周结束时完成。但是,如果你执行多任务,那么你必须在第一周花费至少一些时间完成第二项任务,所以直到下周某个时候它才会完成。这就是为什么即使人类擅长多任务处理(我们也不是),这样做也没有意义。 多任务处理不是团队成员分心的唯一方式。他们经常被要求参加无用的会议和无关的委员会,开展与项目无关的活动,并为其他项目提供支持工作。一个好的Scrum团队被允许忽视这些分心而不冒他们的职业或晋升风险。24(现在必须完成的当前项目的支持工作可以添加到sprint backlog中 - 但是只有在取出其他东西才能使其适合时间框时。) 团队重视开放性当您在Scrum团队工作时,团队中的其他人应该始终了解您正在进行的工作以及如何将项目推向其当前目标。 这就是为什么基本Scrum模式中的实践旨在鼓励团队成员之间的开放性。例如,任务板允许每个人看到每个团队成员正在完成的所有工作,以及剩下多少工作要做。Burndown图表让每个人都可以自己测量sprint实现sprint目标的速度。每日Scrum在有效完成时,是一项几乎纯粹的开放式练习,因为每个人都分享他或她的任务,挑战和整个团队的进步。所有这些都可以帮助团队营造相互支持和鼓励的氛围。 为Scrum团队创造一种开放文化听起来很棒,也很积极,而且确实如此。但它通常是Scrum团队最困难的事情之一,因为它是Scrum价值观与公司先前存在的文化冲突的最常见方式之一。 许多公司都有一种不鼓励透明度的文化,并用一种依赖于不透明的严格等级来取而代之。建立这样一种文化的管理者可以通过多种方式从中受益。在一个不透明的组织中,告诉团队实现一个不切实际的目标(“我不关心你是怎么做的,只是完成它!”)会更容易,迫使团队加班加点来实现它。当球队不可避免地无法实现这一目标时,它会让经理对CYA有可能的拒绝(“这不是我的错,他们搞砸了!”)。 这就是为什么开放性和自组织通常是Scrum采用的不可触及的“第三轨”。这是使Scrum采用正确的一个核心概念,但它也要求公司以不同于过去的方式对待团队。接触发展的细节否定了不透明的经理人对CYA的掩护。许多初出茅庐的Scrum团队发现,一旦不透明的管理人员开始看到香肠是如何制作的,他们的采用工作就会受到影响。 开放性威胁着卡通,尖尖,不透明的经理。但实际上,即使是一支优秀的团队也很难采用。从开发人员的角度考虑开放性,开发人员被视为代码的一部分的专家,或者是计划的“守护者”的项目经理,或者是许多用户的唯一联系人的产品负责人关于软件内容的主要决策者。这些团队成员中的每一个都有权将这些事物视为对项目的贡献。将这些内容打开给团队是非常困难的,并且鼓励其他团队成员在未获得许可的情况下共享所有权并进行更改。 这是个人团队成员抵制开放的一种非常自然的方式。但是,当他们通过这个并分享所有权 - 包括在出现问题时的责任 - 与整个团队的所有这些事情,每个人都会受益,因为这是相互信任并快速提供更有价值的软件的唯一方式。 团队成员有勇气站出来参与该项目当你选择开放而不是不透明时,你会让团队变得更强大,而不是以牺牲团队为代价来强化自己。这样做需要勇气,但是当你这样做时,你最终会得到更好的产品和更好的工作环境。 Scrum团队有勇气通过有益于项目的价值观和原则来生活。要想避免价值与Scrum和敏捷价值观发生冲突的公司不断回击,需要勇气。这需要每个团队成员,特别是Scrum Master保持警惕。但它也要求每个人都愿意相信提供有价值的软件将有助于他或她克服对这些价值观的抵制。这也需要勇气,尤其是在与老板坐下来进行审查的时候。要对自己说,“帮助这个团队生产有价值的软件对我来说比对自己的个人贡献吹嘘权利更重要。” 那么你将如何在团队中建立勇气?您如何让团队相信自己,并相信Scrum不仅可以帮助他们构建更有价值的软件,而且他们的公司将看到他们新方法的价值? Agile & Scrum Basis Comprehensive Scrum GuideWhat are Scrum's Three Pillars?What is Agile Software Development?Scrum in 3 MinutesWhat are the 5 Scrum Values?What is the Evolution of Scrum?Classical Project Management vs Agile Project ManagementWhy is Scrum Difficult to Master?What is Velocity in Scrum?What is Agile? What is Scrum?What are the Three Amigos Development Strategy in Agile?Empirical Process Control vs Defined Process ControlHow to Maintain Transparency in Scrum?Scrum vs Waterfall vs Agile vs Lean vs KanbanWhat is 3355 in Scrum Framework?Why Scrum? How Does Scrum Overcome 8 Pain Points We Always face?The Best Free and Commercial Agile Tools - Every Scrum Team Needs!What are the 8 Wastes in Lean?Extreme Programming (XP) vs ScrumWhat is Timeboxing in Scrum?Agile Myth: Documentation and Planning not Needed?

July 3, 2019 · 1 min · jiezi

小程序公众号免费商城系统源码

源码地址 功能简介 1.商品: 能够对商品的状态分类管理 (出售中、待上架、库存中、已售馨、库存警戒、回收站)、添加产品、添加商品分类等功能 2.会员:站内会员的管理 (发放优惠劵、发通知、发图文消息、增加余额、会员行为详情)、站内通知 、微信端用户管理 (微信用 户的管理、分组、行为观察、添加标签) 等功能 3.营销:能够管理优惠的发放和制作、用户积分的统计使用情况、秒杀产品的管理等 4.财务:能够对用户的消费、充值、返佣的记录 5.订单:能够完成用户的订单管理(发货、订单详情、修改订单、订单备注、订单记录、订单退款) 、售后服务 (评论的回复与删除) 6.分销:后台有分销统计管理,分销可以设置人人分销和指定人分销,也可以自己稍微开发一下修改规则,例如下单后成为分销等 7.数据统计图表统计分析(财务统计、产品统计、会员统计、营销统计、分销统计、交易统计等) 8.设置:能够完成管理员对网站的商品资料(添加大类、添加小类、商品添加、属性快速生成、商品审查)、商品交易(外理订单、发 货查询)、会员管理(会员审查)、操作管理(管理员添加、管理员审查、管理员退出)、系统配置、后台通知等功能 9.内容:管理文章分类 (添加分类、删除分类、修改分类) 、 管理文章 10.维护:查看系统日志、文件变动效验、刷新网站缓存、在线更新系统、清除数据、文件管理等功能 11.强大的权限管理系统

July 3, 2019 · 1 min · jiezi

Windows10下配置SSH连接Github配置SSH-Key

工具/原料 GithubGit Windows版本配置SSH通道访问Github 检测本机本地机是否含有ssh设置 注:因为我的机器已经存在ssh key设置,所以删除id_rsa、id_rsa.pub、known_hosts 这三个文件 使用git base生成心的ssh key git base命令工具是Windows版的git提供的,Windows环境很好使用的命令行工具 cd study/ssh(自己创建的路径) $ ssh-keygen -t rsa -C "xxxxxxx@163.com"(填写自己有效的邮箱) 按照提示填写自己相关信息 *本机已完成ssh key设置,其存放路径为:C:/Users/xxxx_000/.ssh下 注:可生成ssh key已经生成的密钥,默认id_rsa 添加ssh key到GitHub 1.登录GitHub系统;点击右上角账号头像的“▼”→Settings→SSH kyes→Add SSH key 2.复制id_rsa.pub的公钥内容 a.进入c:/Users/xxxx_000/.ssh/目录下,打开id_rsa.pub文件,全选复制公钥内容 b.Title自定义,将公钥粘贴到GitHub中Add an SSH key的key输入框,最后“Add Key” 参考:window下配置SSH连接GitHub、GitHub配置ssh key

July 2, 2019 · 1 min · jiezi

github

New GitHub Repositorieserror: src refspec master does not match anyfix: 空目录无法提交-README.md//创建空的仓库-链接本地仓库git inittouch README.md // 创建README.md文件git add README.mdgit commit "description"git remote add origin https://github.com/xxx/xxx.gitgit push -u origin master//创建初始化README.md文件的仓库-链接本地仓库git initgit remote add origin https://github.com/xxx/xxx.gitgit push -u origin master

July 1, 2019 · 1 min · jiezi

RageFrame-一个-Yii2-AdminLET-免费开源多商户通用后台管理系统

RageFrame 2.0为二次开发而生,让开发变得更简单 项目地址:https://github.com/jianyan74/... 前言这是一款现代化、快速、高效、便捷、灵活、方便扩展的应用开发骨架。 RageFrame创建于2016年4月16日,一个基于Yii2高级框架的快速开发引擎,目前正在成长中,目的是为了集成更多的基础功能,不在为相同的基础功能重复制造轮子,开箱即用,让开发变得更加简单。 2018年9月10日 2.0版本正式上线,经过1.0版本一年多的开源反馈磨合,以更加优秀的形态出现。对1.0的版本进行了重构优化完善,更好的面向开发者进行二次开发。2.3.x版本更是优化了底层突出了服务层,分离业务逻辑,支持多商户。 特色极强的可扩展性,应用化,模块化,插件化机制敏捷开发。极致的插件机制,系统内的系统,安装和卸载不会对原来的系统产生影响,强大的功能完全满足各阶段的需求,支持用户多端访问(后台、微信、Api、前台等),系统中的系统。极完善的RBAC权限控制管理、无限父子级权限分组、可自由分配子级权限,且按钮/链接/自定义内容/插件等都可加入权限控制。只做基础底层内容,不会在上面开发过多的业务内容,满足绝大多数的系统二次开发。多入口模式,多入口分为 backend(后台)、frontend(PC前端),wechat(微信),api(对内接口),oauth2 server(对外接口),不同的业务,不同的设备,进入不同的入口。对接微信公众号且支持小程序,使用了一款优秀的微信非官方SDK Easywechat 4.x,开箱即用,预置了绝大部分功能,大幅度的提升了微信开发效率。整合了第三方登录,目前有QQ、微信、微博、GitHub等等。整合了第三方支付,目前有微信支付、支付宝支付、银联支付,二次封装为网关多个支付一个入口一个出口。整合了RESTful API,支持前后端分离接口开发和app接口开发,可直接上手开发业务。一键切换云存储,本地存储、腾讯COS、阿里云OOS、七牛云存储都可一键切换,且增加其他第三方存储也非常方便。全面监控系统报错,报错日志写入数据库,方便定位错误信息。快速高效的Servises(服务层),遵循Yii2的懒加载方式,只初始化使用到的组件服务。丰富的表单控件(时间、日期、时间日期、日期范围选择、颜色选择器、省市区三级联动、省市区勾选、单图上传、多图上传、单文件上传、多文件上传、百度编辑器、图表、多文本编辑框、地图经纬度选择器、图片裁剪上传、TreeGrid)和组件(二维码生成、Curl、IP地址转地区),快速开发,不必在为基础组件而担忧。完善的文档和辅助类,方便二次开发与集成。思维导图 开始之前具备 PHP 基础知识具备 Yii2 基础开发知识具备 开发环境的搭建仔细阅读文档,一般常见的报错可以自行先解决,解决不了在来提问\如果要做小程序或微信开发需要明白微信接口的组成,自有服务器、微信服务器、公众号(还有其它各种号)、测试号、以及通信原理(交互过程)如果需要做接口开发(RESTful API)了解基本的 HTTP 协议,Header 头、请求方式(GET\POST\PUT\PATCH\DELETE)等能查看日志和Debug技能一定要仔细走一遍文档Demo地址:http://demo2.rageframe.com/ba... 账号:demo 密码:123456 官网http://www.rageframe.com 文档安装文档 · 本地文档 · 更新历史 · 常见问题 问题反馈在使用中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流 QQ群:655084090 Github:https://github.com/jianyan74/... 特别鸣谢感谢以下的项目,排名不分先后 Yii:http://www.yiiframework.com EasyWechat:https://www.easywechat.com Bootstrap:http://getbootstrap.com AdminLTE:https://adminlte.io 版权信息RageFrame遵循Apache2开源协议发布,并提供免费使用。 本项目包含的第三方源码和二进制文件之版权信息另行标注。 版权所有Copyright © 2016-2019 by RageFrame www.rageframe.com All rights reserved。

July 1, 2019 · 1 min · jiezi

Excelize发布201版本Go语言Excel文档基础库

Excelize 是 Go 语言编写的用于操作 Office Excel 文档类库,基于 ECMA-376 Office OpenXML 标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的 XLSX 文档。相比较其他的开源类库,Excelize 支持写入原本带有图片(表)、透视表和切片器等复杂样式的文档,还支持向 Excel 文档中插入图片与图表,并且在保存后不会丢失文档原有样式,可以应用于各类报表系统中。 GitHub: github.com/360EntSecGroup-Skylar/excelize 2019年7月1日,社区正式发布了 2.0.1 版本,该版本包含了多项新增功能、错误修复和兼容性提升优化。下面是有关该版本更新内容的摘要,完整的更改列表可查看 change log。 Release Notes此版本中最显著的变化包括: 新增功能新增 SetHeaderFooter() 方法,支持设置页眉和页脚,相关 issue #394新增 SetColStyle() 方法,支持设置列样式,相关 issue #397新增 SetDefaultFont() 和 GetDefaultFont() 方法,支持设置工作簿默认字体,相关 issue #390新增 SetDocProps() 和 GetDocProps() 方法,支持设置和获取文档属性,相关 issue #415函数 AddChart() 新增加了 26 种图表的创建:簇状圆锥、堆积圆锥、百分比堆积圆锥、三维圆锥图、簇状水平圆锥图、堆积水平圆锥图、堆积百分比水平圆锥图、簇状棱锥图、堆积棱锥、百分比堆积棱锥、三维棱锥图、簇状水平棱锥图、堆积水平棱锥图、堆积百分比水平棱锥图、簇状柱形图 、堆积柱形图、百分比堆积柱形图、三维柱形图、簇状水平圆柱图、堆积水平圆柱图、堆积百分比水平圆柱图、三维曲面图、俯视框架曲面图、三维曲面框架图、气泡图与三维气泡图,不受支持的图表类型将返回错误提示新增 SetDefinedName() 和 GetDefinedName() 方法,支持设置和获取名称优化并明确了打开加密文件时的错误提示信息函数 AddPicture() 现在支持添加 TIF 和 TIFF 格式的图片问题修复修复当数据验证公式中存在双引号时产生的问题修复内部计数错误导致的部分情况下产生重复批注问题,相关 issue #373修复部分情况下因读取内部工作表 map 错误导致读取文件失败的问题,相关 issue #404提升了处理包含数据透视表的文档兼容性,相关 issue #413提升了字号与粗体样式的兼容性,相关 issue #411、#420 和 #425优化内部重算组件以修复部分情况下在工作表中删除或插入行造成文档损坏的问题,相关 issue #421 和 #424修复部分情况下隐藏工作表失效的问题,相关 issue #418修复内部主题颜色索引溢出导致部分情况下图表系列过多导致文档损坏的问题,相关 issue #422其他完善单元测试提升覆盖度,行覆盖度达到 96.05%代码优化,修复 golint 问题

July 1, 2019 · 1 min · jiezi

全国站与子站的开发

关于如何合理的进行子站的开发参考 1,vuepress --- 主题定制 2,ant design landing 3,DataV 数据可视化 4,ElementUI 作为依赖 5,jd.com 京东设计思路(模块化) read.jd.com www.jd.com mall.jd.com product.jd.com sales.jd.com 同一套用户体系 6,模块化开发 7,可插拔 8,环境变量 9,分支 git 版本 10,组件化 11, ant design

June 29, 2019 · 1 min · jiezi

Git添加beyond-compare4作为比较工具

使用 git diff 或者是 git difftool 命令去比较文件都是在git小黑窗口去打开,比较起来很不友好。所以我们通过配置文件把比较功能强大的“beyond compare4”作为Git的比较工具,这样我们就可以通过命令行调用强大的“beyond compare4”。通过“beyond compare4”工具更加轻松的去比较本地和远程文件的差异性1.配置“.gitconfig”文件首先我们找到Git的配置文件“.gitconfig”,在 C:\Users\Administrator\.gitconfig 文件中配置,具体配置如下: [gui] encoding = utf-8[diff] tool = bc4[difftool] prompt = false[difftool "bc4"] cmd = "\"C:/Program Files/Beyond Compare 4/bcomp.exe\" \"$LOCAL\" \"$REMOTE\"" [merge] tool = bc[mergetool] prompt = false keepBackup = false[mergetool "bc"] cmd = "\"C:/Program Files/Beyond Compare 4/bcomp.exe\" \"$LOCAL\" \"$REMOTE\" \"$BASE\" \"$MERGED\""mergetool是merge解决冲突时会弹出对应的运行软件, keepBackup=false可以防止合并后生产后缀为.orig的备份文件 说明:cmd = "\"C:/Program Files/BeyondCompare/bcomp.exe\" \"$LOCAL\" \"$REMOTE\"" 表示输入命令 git difftool后去找对应的运行文件并传(大字符串里面用空格分开)递参数处理。用空格分开(相当于参数),\"表示单个输入的参数必须为字符串(个人理解)。 第一个表示调用可执行文件的路径第二个$LOCAL表示远程文件临时存储在本地的C:\Users\Administrator\AppData\Local\Temp\wj9D8b_.eslintrc中去第三个$REMOTE表示去拿当前需要比较的文件注意:建议只比较一个文件,否则git会递归对比每一个文件。 配置完成后可以使用git difftool <文件>,默认就会打开“Beyond Compare 4”工具 ...

June 28, 2019 · 1 min · jiezi

Learning-Git-Branching-最好用的-Git-在线学习工具

你如果对 Git 感兴趣吗?那么 “Learning Git Branching” 可以说是目前为止最好的教程了,在沙盒里你能执行相应的命令,还能看到每个命令的执行情况; 通过一系列刺激的关卡挑战,逐步深入的学习 Git 的强大功能,在这个过程中你可能还会发现一些有意思的事情。 你会看到“Learning Git Branching” 提供的许多关卡。如果你是初学者,从第一关开始逐个向后挑战就是了。 而如果你已经入门了,可以略过前面,直接挑战后面更有难度的关卡。以下是一些截图:

June 26, 2019 · 1 min · jiezi

首次腾讯全面公开整体开源路线图

6月25日,由Cloud Native Computing Foundation (CNCF) 主办的云原生技术大会在上海举办,腾讯开源联盟主席、腾讯开源管理办公室委员、Apache Member堵俊平首次公开了腾讯整体的开源战略路线图。在开源的道路上,腾讯不仅将内部优质项目持续对外开放,还积极与国际开源社区协同合作,发挥中国企业的科技力量,推动开源和开放进一步升级。 堵俊平表示:“腾讯开源提倡‘开放、共享、合力开发’的研发模式,以发起者和贡献者的方式积极参与国内外开源社区建设,对内成立开源管理办公室,每个开源项目都设立相应的管理委员会;对外积极参与开源社区合作,持续不断地向开源社区捐赠项目、贡献patch,并输出行业标准。同时,腾讯还加大投入,成为诸多国际知名开源组织的白金会员或白金赞助商,通过参与国际通行的协作方式,发挥中国企业的科技影响力,成为社区中活跃的中国力量。” 腾讯开源路线图 基于代码开放和社区运营,腾讯开源路线通过“三步走”的开源计划,不断深化腾讯已有的技术能力,推动从封闭孤立向协同开放向社区开放治理的纵深方向发展。 具体来说,第一步是内部开源协同。首先拉通内部项目和组织,通过部门小团队作战或跨部门大团队作战的方式协同推进,以优化资源配置的方式集中优势寻求技术突破。随后,腾讯建立起筛选机制将代码开放出来。第二步是外部代码开放。优化设计与代码结构,不断拓展落地场景,有效利用外部贡献者资源实现资源整合,构建技术影响力。第三步是社区开放治理,在这一阶段,注重大规模技术推广与应用、开发者生态体系构建、社区领袖与领导力培养、全社会研发资源的优化配置四个方面。 据堵俊平现场透露,腾讯开源将重点关注IaaS、容器与云原生、数据库、大数据与AI、中间件、IoT/边缘计算、小程序生态等。 对内成立腾讯开源管理办公室 自2010年以来,腾讯内部就开始试水开源,好的项目会跨团队、跨部门、跨业务的广泛使用,由此积累了对外开源的基础。从2016年开始,腾讯不断将内部开源出来的优质项目在GitHub上发布,腾讯开源逐步进入快节奏时代。 随着腾讯开源工作的不断深入,各式各样的问题也接踵而至,既有一些企业开源共同的难题,也有一些特殊开源文化下的矛盾。经过多年的开源实践,腾讯形成了一套成熟的开源机制,包括组织架构、规范、平台工具等,将开源过程中产生的宝贵的治理经验共享出来,为更多团队提供借鉴,从而扩展思路,实现精益管理和协同发展。 为此,腾讯特别成立了开源管理办公室,下设项目管理委员会、腾讯开源联盟和开源合规组三大组织,自上而下地传递腾讯开源策略,自下而上地落地开源技术生态。同时,通过开放的开源评审平台,孵化和培育优秀的自主开源项目。 此外,腾讯开源管理办公室还为开发者们提供与国内外开源基金会和开源社区合作交流的机会,将优秀的项目有效回馈给社区,建立起以开源为核心的技术生态圈。 对外全力投身开源社区 除了优化内部开源机制之外,腾讯也不断活跃在各大国际开源社区中,加大对开源领域的投入,参与国际通行的协作方式,成为开源社区的积极贡献者,发挥中国企业的科技力量。 在Apache基金会参与方面,腾讯主导发布了Hadoop 2.8.4、2.8.5和Spark 2.3.2,也是多个项目的核心贡献者,包括Hadoop 、Spark 、Flink、HBase、Hive、MXNet、Parquet等。腾讯游戏TenDB经过多年积累,向MariaDB数据库提交的四个核心特性,已经合入到MariaDB的主线版本中。而在Linux基金会参与方面,腾讯向Linux贡献了Tars和TSeer两大项目,并将AI开源项目Angel贡献给LFAI基金会(原名LF deep learning基金会)。去年,腾讯云向 KVM 内核贡献了 40 个 patch,连续第二年登上 KVM 全球开源贡献榜,也成为中国唯一入选云厂商。今年初,腾讯云正式发布基础设施层面四大核心技术项目,分别涵盖数据中心、网络、服务器以及自动化平台领域,并宣布将这四大技术项目全部贡献给开源OCP社区。 此外,腾讯已经获得OpenStack社区、Linux基金会、LFAI基金会、MariaDB 基金会、Apache基金会等多个白金会员或白金赞助商身份。在积极参与开源社区建设的同时,以更加活跃的姿态为开源项目提供支持。 自主开源硕果累累 截至目前,腾讯共开源了75个项目,覆盖云计算、腾讯游戏、腾讯AI、腾讯安全、小程序等领域,这些项目都是经过腾讯众多明星业务和海量用户的检验后对外开放的,参与贡献人数超过600名。 Star是在GitHub上收藏开源项目的功能,Star数越多,表示该项目越受欢迎。截至目前,腾讯累计在GitHub获得了超过22万个Star。 具体项目上,超过1万Star数的项目有5个,超过5000 Star数的项目有15个,超过3000的有23个。这说明腾讯开源的项目深受开发者关注,证明了项目本身的高质量和腾讯的技术实力。 腾讯始终保持着与社区健康、良好的互动,旗下开源项目的issue和PR的关闭比例都非常高。以微信终端开源项目Tinker为例,平均每月发布一个版本,issue解决率在99%以上。TARS这种基础技术架构开源也保持着平均2个月发布一次新版本,收获了上千位个人开发者用户。

June 26, 2019 · 1 min · jiezi

Git多人协作

Git多人协作github进行多人协作,需要协作人员拥有自己的github账户,在需要多人的github库中添加协作者即可。 1.添加协作者添加协作者:在github库中的设置选项中有添加协作者选项。 添加协作者有两种方式,一使用协作者的邮箱、二使用用户名来搜索。如果用邮箱地址没有搜索到他,是他的github账户将邮箱设置成私人,可以使用账户名进行搜索。协作者需要修改邮箱设置,使能够用邮箱搜索他。 修改邮箱设置: 点击后下拉,可以看到keep my email address private按钮以选中,这就是设置为我的邮箱为私人,我们现在需要我的邮箱设置为开发,点击keep my email address private前的按钮,变成未勾选。 之后在配置个人信息选择邮箱,如图所示:选中自己要开放的邮箱 成功添加协作者 点击后就可以使用邮箱搜索了,之后添加协作者,协作者会收到一封邮件,需要协作者同意成为这个github库的协作者。添加协作者完成后,协作者就可以将修改推送到这个github库了。 2. 检验协作者的协作权限接下来就是协作者的操作,检验一下协作者是否能够推送到这个github库。在桌面右键打开Git Bash Here命令工具 协作者首先需要克隆这个github库: Git clone git@github.com:自己的用户名/github库名.git我们查看一下分支 Git branch 运行命令,显示只有一个分支,github库克隆到本地只有一个master主分支,需要我们在本地新建分支与github远程分支连接。前面两章我们已经将本地dev分支推送到远端,远端是有两个分支的。如果对这里有疑问可以查看前两章内容。 新建一个dev分支:git checkout -b dev 接下来就是连接github上的dev分支: git branch --set-upstream-to origin/<branch-name>现在修改ss.html文件,如在文件中加几个div标签。 提交修改:Git add ss.htmlGit commit -m””在dev分支下进行推送: git push origin dev 推送成功了,也就是说,我们之前进行的分支连接是成功的,并且我们现在也已经将协作者的修改提交到了github远端库中。 3.验证协作者推送的修改现在,我们用github库拥有者或其他协作者来进行验证推送的结果。 刚才的协作者已经把dev分支推送到了github上,我们进行拉取,查看是否成功将修改推送到github。 拉取:git pull这个账户还没有进行本地dev分支与远端dev分支连接,连接的命令上面我们已经实现了,可以自己进行连接,在命令工具中输入:git branch --set-upstream-to origin/<branch-name> 连接之后我们才能拉取dev分支的修改。连接之后,在执行git pull命令: 现在打开ss.html文件查看是否发生了更改,发现确实发生了更改。协作者进行的修改确实是推送到了github库里,我们成功实现了git的多人协作。 ...

June 26, 2019 · 1 min · jiezi

git-rebase使用020

git rebase 使用rebase:顾名思义 ==变基== 假设现在从master 分支上,切出一个本地开发分支mydev git checkout -b mydev这时候master上的git记录是这样子的 A-->B-->C-->D这个时候另外一个开发人员把ta的dev分支合并到master分支了tadev A-->B-->C-->D |-->E-->F-->G查看git记录git lg or git log实际上现在master上的分支的git 提交记录已经是这样子的了: A-->B-->C-->D-->E-->F-->G但是你本地上的分支还是这样的,你分别了提交了 3个 commit记录。 |—->M-->N-->OA-->B-->C-->D这时,你的代码开发完成了,需要合并代码。这时候有两种选择: 直接 git merge 或者 经过 git rebase 再提交 git merge git merge如果直接git merge,假设你提交commit的时间和刚才合并进去的其他人的dev分支是有重合的: A-->B-->C-->D |-->E |-->F-->G |-->M-->N |-->O这样的提交的记录就比较乱,假设现在需要回退代码什么的,就有点小麻烦了,就需要一个文件去回退。对于多人协作的话 就比较需要git rebase git rebase先对mydev分支进行 git rebase 操作 这时候分支的提交记录就会变为如下所示: A-->B-->C-->D-->E-->F-->G |-->M-->N-->O会把mydev分支新增的commit记录新增在master分支最新的后面,这个时候push分支,就需要强制更新你的分支。再提交merge。 git push -f 变基的作用就是修整历史,将分支历史并入主线。 git rebase 注意事项确保没有其它分支同时更改同一个文件git rebase前需要确保master分支为最新。变基会修整历史,然后将分支历史并入主线,可以理解成美化过的历史,而合并则可以不修改历史,让分支历史依然独立存在,可以看作原始的历史。永远不要对已经推到主干分支服务器或者团队其他成员的提交进行变基,我们选择变基还是合并的范围应该在自己当前工作范围内。如果git rebase之后提示冲突的话,需要解决冲突: 解决冲突后 add 更改的文件git add 无需 commit, 继续 rebasegit rebase --continuegit rebase还有一些其他的操作, ...

June 25, 2019 · 1 min · jiezi

如何挑选注册到合适的域名

为了选择一个好域名,有很多需要注意的地方。 我已经准备了一份详细的参考准则列表,尽管无法满足所有这些标准(这是不可能的),但仍然为你提供了一些需要考虑的提示信息。在文章最后,我会告诉你在哪里注册域名最好。 好了,我们继续吧! 1、选择.com后缀大多数时候,互联网用户在浏览时会假设网址以 .com 结束,如果采用 .net、.info、.tv,或其他后缀,那很可能会给潜在的访客留下障碍。话虽如此,仍然有很多成功的网站使用 .net(或其他)后缀,但对于绝大部分人来说,.com 是最理想的。 2、短小精致越短越好,足够表明意思。 3、容易朗读和拼写目的是让你和别人可以轻松分享,如果大家不必停下来思考如何朗读或拼写,那么分享起来就更加容易。 4、不含连字符包含连字符的域名不够流畅,看起来也很奇怪。 5、使用关键字你的域名是使用一两个关键字的最佳位置之一,而且越紧凑、越接近域名的开头越好。 6、考虑使用你的名字我强烈建议你将名字注册为域名,即使你没有计划对其进行任何操作。为什么?因为你永远不知道自己将来是否会成为家喻户晓的人物。 如果你打算使用博客来销售服务,或者你希望演讲或成为出版作家,那么你的名字可能就是最完美的域名。 如果你的名字非常难以阅读或拼写,那你可以考虑使用昵称,或者定义一个全新的名字。 7、使其可扩展你永远不知道自己的业务可能会如何扩展,所以请避免使用限制性名称。例如,LovelyCat.com很不错,但是如果你想谈论狗狗呢?此外,我还建议避免使用特定于生命阶段的名称,例如AllAboutMyCrazyBabies.com,现在好了,但他们蹒跚学步的岁月过得这么快! 8、避免使用单词如果你拥有广泛的兴趣爱好,并且还希望在域名中使用所有这些关键字,那你很可能想要将它们全部串在一起。但我建议不要这样做,因为这可能会令人困惑。 9、避免使用晦涩的术语如果你试图吸引广泛的受众群体,那就请避免在域名中使用特定范围的字词,因为这会导致你的 Niche 之外的访客不熟悉。 10、但是所有好名字都被拿走了!你很可能已经想出了一个完美的域名,但是在注册时才发现它已被采用。不要害怕失败,尝试在词库中查找类似的单词,询问别人的想法,向上或向左混合单词,使用你一直说的标语、昵称或短语。 有时候实在对域名想不出来,我们可以借助一些工具来给我们 idea,比如: namemesh.comBustname.comdomainr.com 这三个网站使用大数据,有时取出来的名字挺酷的, 有时会加一些像 ”ly” 或者 “ista” 的后缀,让整个域名看起来更酷,像一个品牌官方网站。Faucetista.com 或 Brushtoothly.com 相比 BestBrushTooth.com 或 FaucetReviews.com 更加吸引人,对吧? 11、确保该名称在其他社交媒体网站上可用选择你的域名时,请检查其他社交媒体,以确保它可以在这些网站上使用。如果你在博客、Twitter、Facebook 等媒体上使用相同的名称,那么你的品牌会更加巩固,并且更令人难以忘怀。 12、不要过度思考我听到很多人在这个问题上陷入困境,因为他们害怕做出错误的选择。最常见的理由是他们找不到可用的 .com。如果你也这样,那就做出最好的猜测并继续前进,一个不太完美的域名比没有更好,尽力而为,开始注册吧! 希望我已经说服了你,那么该怎样注册域名呢? 如果你没有网站并且不打算尽快创建一个,只需在输入框中键入你想要的域名,然后点击搜索按钮即可开始使用。

June 25, 2019 · 1 min · jiezi

年中杂想

前言有两个月没写总结了,不管原因如何,总要把欠了的补上。这个周末抽出时间,好好整理一下前两个月的工作内容以及感想,内容涉及: GithubFlutter产品思维与用户意识新的技术观新的团队观自我认可 Github具体技术点,已写在文章中:????自动化的Github Workflow自做开源组件以来,文档、预览、构建、发布这几个环节,一直都是很繁琐,手工操作多,易出错,十分不得要领。 于是参考vue/nuxt/element, 一点一点地摸索,反复地尝试,终于找到了适合我们的github wokflow。 于是我们就对所有组件进行升级改造,相关脑图如下: Flutter滴雀APP(意为滴普语雀)下载地址这个星期,我们由Flutter开发的APP终于登录App Store了。这是我们第一款由Flutter开发的应用,我也经历了第一次从0到1完整的上架的过程。 我在语雀官方论坛上发布相关信息,也获得了官方人员的认可。 我感触比较深的是两点: 增长了信心实践才是王道 信心年初的时候,与某团队进行技术交流,听说他们不但做了小程序,还做了APP,甚至他们已经完成了从RN到Flutter的转型。我们当时只涉及H5,并没有过APP方面的积累,因此虽然表面不动声色,其实心里大吃一惊,不免有些没底气。 时至今日,我们开发的APP已被当初那个团队的人使用着,我心里已不虚。 实践如今很多社区、论坛、公众号,都在报道Flutter的相关信息,各种比较Flutter与其他技术的优缺点; 身边很多人也早就跃跃欲试,却一直说没时间而停滞不前,或因为做不出最佳选择而犹豫不决。 而我们已经在实践,并且上生产了。要想真正了解一件事,唯有通过亲身实践。所以,如果真的想尝试,赶紧行动起来吧,不用再犹豫了,也不需要把没时间当借口。 产品思维与用户意识通过实践,我认为做产品有两点很重要: 搞清楚用户最想要解决的是什么问题自己用起来 MVP第1点也就是mvp,但这点理论上说起来简单,做起来却难。 首先,用户的声音不一定能听到,就算听到了,也可能因为沟通表达的问题,理解有偏差。 其次,很多时候产品规划都是很宏大的,功能都是很齐全的,从0到1的过程中,很容易在这种规划中迷失。 同时,优先解决核心问题,先实现最小功能闭环,思路是没错,但这样的产物可能过于简陋,因此有人可能会觉得这不像是产品,而持否定意见。 吃自己的狗粮所以,第2点就很重要。自己做的产品,自己用起来,也即“吃自己的狗粮”。 自己去动手前,想一想,这个东西做出来自己会不会用?如果答案是否定的,那就先别动手,重新再想一想。 自己作为用户,才能真正地培养用户意识。 最后还要注意的是,产品越早投入使用越好,这样可以根据用户反馈,快速调整与完善。 新的技术观对于技术,我新增了以下方面来观察与思考: 全局金钱用户开源 全局全局意味着要有整体思维,从团队、从整条生产链路来思考。 现在市面上很多媒体,过分强调个人或单个环节,导致人们普遍过分关注局部,而忽略了整体。 比如有很多开发技术方面的“练级攻略”,给人一种错觉,似乎掌握了这些技术,就能横扫江湖,走向巅峰。但其实开发只是软件工程的一个环节罢了,如果不能掌握整体,在局部再登峰造极,也会有捉襟见肘的时候。 再比如某些教程,说是“教你从0到1开发一个APP”,但其实也只是聚焦在开发领域,也只是能在自己的机器上构建一个APP,安装在自己手机里而已。真正要上线到生产,让别人也能安装使用,同时保持后续的更新迭代,前前后后还有很多内容要涉及,并不是学了教程,开发好了,就完事了。 使用全局的思维来看待这些事情,这样才能看得更清楚、更透彻。 金钱其实很多技术是可以用金钱来买的。这个交易的本质是:用金钱来买时间。 下面举些例子: 我们没有相关新技术的知识,我们可以自己去预研、去实践,然后自己再写一份教程,也可以直接买付费的教程,让大家快速进入系统的学习我们要想一个功能,目前没有,可以自己去实现,也可以买第三方服务我们缺少具备某些经验的人员,可以内部花时间培养,也可以直接从外部招聘有相关经验的人员上面的例子都是常见的待决策的情况,前者都是自己亲力亲为,花费的是时间; 后者则是做资源整合,付出的是金钱。值得一提的是,时间也是金钱,也是成本,因为员工是要发工资的,这一点千万不要忽略了。 遇到上述情况如何决策,需要具体情况具体分析。 只不过,在筛选简历时,每每遇到一些人描述自己“全栈工程师”,但其实只是泛泛而谈时,我都在想,我为何不直接招一个专职的前端、一个专职的后端?这对于企业而言,一个月增加的成本,微不足道。这种类似的思想,池建强在《Flutter 要全平台制霸?我看悬》一文也提到了。 用户 没有愚蠢的用户产品上线后,就会收到用户的反馈。有可能产品的第一个界面,就让用户困惑了。此时技术人员常见的反应是:这都不懂,真笨! 请尽早把用户愚蠢的想法抛弃掉。用户遇到了任何问题,首先应该想想,是不是产品有需要优化的地方。技术是用来解决问题,提升效率的,不是用来彰显自己高端、与众不同的,做技术的千万不能曲高和寡。 用户第一很多时候技术人员评估的事情的优先级,是按照技术难易程度、有趣程度而排列的,但其实上线后,最重要的,是倾向用户的声音,根据反馈进行开发调整。 也许你觉得做个炫酷的动画是很有挑战性、很有趣的事情,但用户也许更关心产品首页的错别字。这种情况下,请优先改正错别字。 开源总有一些技术团队在讲自己是设计这个系统的,怎么实现的,讲了一大堆,即没有附上代码地址,说什么与内部业务联系太紧密,不方便开源。 我也写过一些文章,所以我清楚,很多时候文字并不能完整地表达意图,更别说一个大型系统的设计。也许文章作者觉得自己写出关键点了,但读者的知识背景参差不齐,难保文章没写出来的,才是读者更需要的。因此,软件设计没有附上相关的可执行产物,我认为做的就是不到位。 很多时候,大家重复造轮子,就是因为资源不共享,前人的成果没法复用。 vue、k8s都开源了,把我们的实践成果开个源,其实也什么大不了的。如果涉及商业机密,把相关内容替换成demo就好了。说到底,分享的意愿不够罢了。 如果我们实践了想分享,一定会开源,不搞虚的。 新的团队观去年,我的团队理念是,基于团队现有成员,把每个人打造出我想象中的样子。 当时,我看人主要还是看技术能力; 对于一些技术能力并不符合预期,但态度好的人,我也愿意招聘进来,因为可以培养。 今年,我更强调的是适者生存,也即,团队是有淘汰的,跟不上步伐的人,只能离开。 我现在招聘更愿意招已经技术能力过关,不太需要进行技术培养的人,也即宁缺勿滥,纵然这样很可能一个月也招不到一个人。 另外,我还会注重对软实力的考察,比如热情、目标规划、自我定位、思维方式等,我希望团队成员是自我驱动的,最终能成为自己想要的样子。 一句话总结:去年我想让团队的所有人变得合适; 现在我只想要合适的人留在团队里。 ...

June 25, 2019 · 1 min · jiezi

git-分支操作

Git分支操作推荐在完成“git从零到推送到远端”之后再进行分支的学习现在我们进行分支操作,多人协作会有很多次的重复提交,所以要进行分支管理,一般master分支是主分支,一般不会在此分支进行开发,我所知道项目分支有主分支(master)、开发分支(dev),功能分支(Feature),我们现在创建一个新分支,如果以后要用其他分支,可以继续创建创建+切换分支: git checkout -b <name> 查看分支: git branch 现在我们做一些修改:将ss.txt改为ss.html并添加html代码。查看修改: Git add . 提交所有更改Git commit -m “说明” 提交暂存库到本地Git push -u origin dev 提交到远端 远端已经有了两个分支 master dev 现在我们把本地的分支切换到master,如果你打开以前创建的git本地仓库目录(文件夹),会发现ss.html文件变成了ss.txt,将在dev中的修改添加到master,需要进行分支合并。 合并分支: git merge <name> 我们查看现在的分支:git branch 现在dev分支已经用不到了,我们删除dev分支。删除分支: git branch -d <name>将合并后的master分支提交到github Git push -u origin master 如有疑问可在留言区,留言,若有错误,也敬请指正。谢谢!

June 24, 2019 · 1 min · jiezi

Touch-Bar-废物利用系列-在触控栏上显示-Dock-应用图标

简评: 这是我见过的最有用的 TouchBar 应用,感谢@Acyclee 分享都说 Intel 第八代 CPU 对比上代是牙膏不小心挤多了,而配备第八代 CPU 的 MacBook Pro,只有 Touch Bar 版本,虽然贵了一点,但就一个字 —— 买! 收到电脑后,兴冲冲地体验了一把 Touch Bar,真的很有新鲜感!前提是你是一个影像工作者 ???? 然而随着时间推移,我的 Touch Bar 渐渐地变成了一个耗电的无用配件,还时不时地误触到「Siri」按钮。只有当我调整音量或亮度的时候,我才会有意识地使用 Touch Bar,让我多花的钱,显得有那么些意义…… 可是今天,我发现了一款让 Touch Bar 废物利用的方法了! 有人开发了一款 macOS App,可以把 Touch Bar 当作「Dock」,直接用来切换和启动 App,叫:Pock,还是开源的。 笔记本的屏幕其实是不够用的,Dock(程序坞)又会让可视面积减少一截。虽然可以隐藏 Dock,但来回唤出也挺麻烦的。 想要最大化屏幕空间利用但又不喜欢自动隐藏 Dock?试试 Pock,把 Dock 放到 Touch Bar 上,好好利用一下这块触控屏。 Pock 具有以下特性: 支持显示通知角标提供了 ESC 按钮,所以不必隐藏 Pock 来使用系统的 ESC可设置是否在进入系统时启动 Pock很久以前 macOS 就把应用程序的菜单栏放到顶部状态栏,现在 Pock 把 Dock 放到 Touch Bar 上,是不是挺对称的?Pock 会保留应用图标的小红点,这样你就不会错过重要的通知信息。亮度、音量、播放之类的常用功能键也都在,用起来很方便。 ...

June 24, 2019 · 1 min · jiezi

聊聊-print-的前世今生

本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/Nu... (一) 上周,我翻译了一篇文章,解释了为什么 Python 3 把 print 改为函数? 概括有如下几点原因:1、print 不适宜作为应用程序级的语句。2、改为一个函数,可以实现更复杂的功能。3、改为一个函数,能方便地进行替换。 在 Python 2 中,print 是个语句(statement),它的级别就跟 for、if、def 等关键字相同,这是一个古老的设计(毕竟 Python 诞生于 1989 年),改成 print() 函数,意味着它升级了。 在查阅资料的时候,我发现 print 在历代版本中,一直发展变化,到了今天,它自身已足够完善了,可是外部的挑战一直不断。 因此,这篇文章再来聊聊它:介绍 print 的现状,追溯它的历史,说说它的挑战者,挖挖那些更加本质的东西。 (二) 在 3.0 版本中,print() 函数全新登场,开发者可以自定义打印对象的间隔(默认是空格)、终止方式(默认是换行)、以及输出位置(默认是标准输出 sys.stdout)。 而到了 3.3 版本,它还添加了一个新的参数,可以决定是否要刷新数据流。 至此,这个函数的完整格式就变成了 print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False) ,与升级前的 print 语句是天壤之别啦。 优点是显而易见的,可定制的参数带来了使用场景的扩充。 (三) 其实,在这次大版本的改动之前,早期的 print 语句并非是一成不变的,核心开发者们一直在完善它。 例如,在 2000 年的 PEP-214 之前,print 语句只能用于标准输出(sys.stdout),只有当提出这个提案后,print 才可以打印内容到类文件对象(file-like object)中。 (注:PEP 即 Python 改进提案,更多介绍详见旧文《学习Python,怎能不懂点PEP呢?》) ...

June 23, 2019 · 2 min · jiezi

工具资源系列之-github-上各式各样的小徽章从何而来

前言平时大家在在逛 github 时或多或少都看到过项目首页各式各样的小徽章,不知道你是否和我一样好奇这些小徽章都是哪来的呢? 首先我们先来一睹为快目前前端开发的三大主流框架: var ,看一看他们的 github 项目首页有哪些小徽章吧! Vue : https://github.com/vuejs/vue Angular : https://github.com/angular/angular React : https://github.com/facebook/react 小结: 前端三大框架的徽章均不相同,由此可见,这应该不是 github 统一分发而是自定义行为! 虽然不是统一分配的,但也不是毫无规律可寻,想要制作专属的小徽章,其实真的很简单!什么是徽章徽章是一种小巧精美的小图标,一般配有相关文字进行辅助说明,富有表现力. 不仅出现于 github 项目主页,凡是能够表现图片的地方都可以出现徽章,本质上是一种 svg 格式的矢量图标. 下面以自定义 github-snowdreams1006-brightgreen.svg 徽章为例,简单认识一下徽章. 在线链接在线链接: github-snowdreams1006-brightgreen.svghttps://img.shields.io/badge/github-snowdreams1006-brightgreen.svg浏览器效果打开在线链接,并检查当前网页,豁然开朗,徽章是一种 svg 实现的矢量图标.svg VS png如果说 svg 是矢量图形而 png 却不是,所以不妨将 png 姑且称之为标量图形.svg 是矢量图形,png 是标量图形,两者均能实现类似效果,只不过矢量图形不论怎么方法都能保持原样,并不会像 png 那样会失真而已. 既然两种均能表现相同的效果,现在我们就来演示一下 png 的实现效果. svg 转 png 在线网站: https://cloudconvert.com/svg-to-svg 左侧的 svg 无论放大多少倍,依然保持原样,清晰度保持不变.右侧的 png 一旦放大,立马变得模糊不清.如何使用徽章大多数徽章都是 svg 格式,当然也不排除某些徽章是 png 格式,不论怎么说,一律当成图标使用就可以了. 如果你和我一样,希望在 markdown 文件中使用徽章,那么建议使用在线链接,或者引入本地 svg 相关文件. ...

June 22, 2019 · 2 min · jiezi

GitHub-最新-Android-热门开源项目公布

作者: LeanCloud weakish 分享 2019 年 5 月 GitHub 上比较流行的 9 个和 Android 开发相关的开源项目,包括对话框、日历、矢量绘图组件,内存泄露检测库,Kotlin 的 linter、mock 库、依赖注入框架等。 LeakCanarysquare 开源的内存泄露检测库。 使用起来极为便捷,只需在 build.gradle 中引入依赖: dependencies { debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.0-alpha-2'}LeakCanary 会自动检测 debug build 中的内存泄露,并显示提示。无需修改代码,也不会影响正式发布版本。 GitHub 仓库:square/leakcanary Material Dialogs美观、可扩展的 Material Design 风格对话框。 Material Dialogs 采用模块化架构,核心模块(core)包含了核心功能和基本功能,文本输入框、文件选择器、色彩选择器、时间日期选择器、弹出表单等功能作为扩展模块提供,可单独引入。支持 AndroidX 生命周期组件。 GitHub 仓库:afollestad/material-dialogs CalendarView基于 RecyclerView 的日历库。 这个库借鉴了 iOS 的 [JTAppleCalendar],提供了比较齐全的日历视图所需特性,支持定制样式。 GitHub 仓库:kizitonwose/CalendarView KyrieVectorDrawable 和 AnimatedVectorDrawable 的超集。 VectorDrawable 提供了像素密度无关性——在任意设备上随意缩放而不损失画质。AnimatedVectorDrawable 在其基础上添加了动画特性。然而,它们有三大缺陷: 无法暂停和继续。无法在运行时动态创建。相比 web 上的 SVG,它们仅仅支持少量特性。Kyrie 提供了 KyrieDrawable 类,支持 VectorDrawable 和 AnimatedVectorDrawable 的所有特性,同时改进了上述缺陷。 ...

June 20, 2019 · 2 min · jiezi

一个命令行音乐下载器

music-php 是一个 PHP 写的命令行音乐下载器 安装全局安装$ composer global require guanguans/music-php当前目录安装$ composer create-project guanguans/music-php使用$ ./path/music-php参考链接https://github.com/0xHJK/music-dlhttps://github.com/maicong/musichttps://github.com/metowolf/MetingLicenseMIT

June 19, 2019 · 1 min · jiezi

6款支持敏捷开发的项目管理工具助力开发者驶入开发快车道

随着市场的瞬息万变和软件行业的迅猛发展,传统的瀑布式软件开发模型因其漫长的开发与反馈周期,在抢占市场先机和快速满足用户需求方面日渐失去竞争优势。与此同时,敏捷开发以其快速迭代,持续满足不断变化的用户需求而受到越来越多人的重视。 在一项调查中,有 71% 的组织表示他们在开发过程中会用到敏捷方法。 此外,用敏捷方法管理项目比传统方法管理项目成功率高 28%。 在这次工具推荐中,我们从一些比较受欢迎的项目管理工具中摘取了支持敏捷的几项。 无论您的组织已经在使用敏捷,还是正计划使用,相信这6款开源的项目管理工具都能给你带来帮助。1、 CORNERSTONECORNERSTONE一款问世不久的项目管理工具,产品定位是解决企业研发痛点,支持持续交付与集成,透过各个维度跟踪记录项目进度。除了一些对比禅道更简洁更智能化的操作外,里面还有自带的DevOps自动打包工具。通过这个平台,用户可以不借助任何第三方工具完成产品、开发、测试、运维等所有角色的工作流程并记录下来,形成智能化的工作报表。传送门:https://www.cornerstone365.cn/ 2、 Teambition Teambition是一个主打简洁高效的团队项目协作工具, 强调的是易用和轻量化,更主导从不同场景切入去管理单个项目。其从项目立项、任务的设定、分配、跟进到最后的知识沉淀的角度,帮助团队完成并记录项目的整个生命周期。 3、 TAPD TAPD敏捷研发解决方案,覆盖从产品概念形成、产品规划、需求分析、项目规划和跟踪、质量测试到构建发布、用户反馈跟踪的产品研发全生命周期,帮助研发团队有效地管理需求、资源、进度和质量,规范和改进产品研发过程,提高研发效率和产品质量。 4、 JIRAJIRA是Atlassian公司出品的项目与事务跟踪工具,被广泛应用于缺陷跟踪、客户服务、需求收集、流程审批、任务跟踪、项目跟踪和敏捷管理等工作领域。JIRA中配置灵活、功能全面、部署简单、扩展丰富。 5、 禅道禅道项目管理软件是国产的开源项目管理软件,专注研发项目管理,内置需求管理、任务管理、bug管理、缺陷管理、用例管理、计划发布等功能,实现了软件的完整生命周期管理。 6、 workliteWorktile是更好的企业协作平台, 贯通企业IM、项目管理、日程安排、电话会议、日报周报月报、企业网盘、审批、考勤、CRM,以及100+ 服务集成,让企业协作更高效、更简单

June 18, 2019 · 1 min · jiezi

Knative-初体验Eventing-Hello-World

作者 | 阿里云智能事业群高级开发工程师 元毅 基于事件驱动是Serveless的核心功能之一,通过事件驱动服务,满足了用户按需付费(Pay-as-you-go)的需求。在之前的文章中我们介绍过 Knative Eventing 由事件源、事件处理模型和事件消费 3 个主要部分构成,那么事件如何通过这 3 个组件产生、处理以及消费呢? 本文通过 Kubernetes Event Source 示例介绍一下 Knative Eventing 中如何获取事件,并且将事件传递给 Serving 进行消费。其中事件处理基于 Broker/Trigger 模型。 []() 背景知识 先了解一下Broker/Trigger 事件处理模型。从 v0.5 开始,Knative Eventing 定义 Broker 和 Trigger 对象,从而能方便的对事件进行过滤。 Broker 提供一个事件集,可以通过属性选择该事件集。它负责接收事件并将其转发给由一个或多个匹配 Trigger 定义的订阅者。Trigger 描述基于事件属性的过滤器。同时可以根据需要创建多个 Trigger。Broker/Tiggger 模型流程处理如图所示: []() 前置准备 Knative 版本 >= 0.5安装完成 Knative Serving安装完成 Knative Eventing[]() 操作步骤先看一下 Kubernetes Event Source 示例处理流程,如图所示: 接下来介绍一下各个阶段如何进行操作处理。 []() 创建 Service Account 为 ApiServerSource 创建 Service Account, 用于授权 ApiServerSource 获取 Kubernetes Events 。 ...

June 18, 2019 · 3 min · jiezi

制作可全局执行的NPM包批量清理github仓库

不知什么时候开始,自家github堆满了仓库代码。。。各种demo开头的项目,还有些空仓库,啥都没写的。自然,程序员写的最差的代码就是以前写的代码了,为了维护心中美好的光辉形象,我决定—————— 不过,删除过程确实麻烦了些,身为“头脑简单,四肢发达” ,哦不对,“四肢简单,头脑发达”的程序员,怎么会甘心做苦力劳动呢?我决定搞个命令行批量执行下。 找到github API文档要删除当然是要找API啦,不过,我开始想的是用puppeteer无头chrome搞的,后来发现直接有API,就直接用喽。删除git仓库需要认证权限,我这里直接用Basic Auth验证,简单!Basic验证,简单说就是在请求头里,搞个Authorization:用户名:密码 命令行工具必须是要美美的命令行优化工具啦,I pick这个inquirer。 有一些带颜色的终端字看着还是ok的,所以还带上了chalk这个库。 just do it具体的代码,调用API,实在简单,看看就好: #!/usr/bin/env nodevar inquirer = require('inquirer');var axios = require('axios');var chalk = require('chalk');var log = console.log;var api = { user: async () => { return await axios({ url: 'https://api.github.com/user', method: 'GET', }); }, repos: async () => { return await axios({ url: 'https://api.github.com/user/repos', method: 'GET', }); }, deleteRepos: async (user, name) => { return await axios({ method: 'DELETE', url: `https://api.github.com/repos/${user}/${name}`, }); }, login: async () => { return await inquirer.prompt([ { name: 'username', message: 'username?' }, { name: 'password', type: 'password', message: 'password?' } ]); }, listRepos: async (repos) => { var list = []; repos.forEach(v => { var desc = v.description === null ? '' : v.description; list.push({name: v.full_name + ' ' + desc}); }); return await inquirer.prompt([ { type: 'checkbox', name: 'rep', message: 'select need cleared repos', choices: list } ]); }};(async () => { var inf = await api.login(); var base64 = new Buffer.from(inf.username + ':' + inf.password).toString('base64'); axios.interceptors.request.use(config => { config.headers = { Authorization: 'Basic ' + base64 }; return config; }); var user = await api.user(); log(`welcome ! ${chalk.green(user.data.name || user.data.login)}`); var repos = await api.repos(); var selectRepos = await api.listRepos(repos.data); for (var j = 0; j < selectRepos.rep.length; j++) { var name = selectRepos.rep[j].indexOf(' ') === -1 ? selectRepos.rep[j] : selectRepos.rep[j].substring(0, selectRepos.rep[j].indexOf(' ')); await api.deleteRepos(user.data.login, name); } log(chalk.green('successfull!'));})();npm打包发布就这样打包,肯定不会有全局执行文件滴。 ...

June 15, 2019 · 2 min · jiezi

强烈推荐-GitHub-上值得前端学习的开源实战项目

强烈推荐 GitHub 上值得前端学习的开源实战项目。 Vue.jsvue-element-admin 是一个后台前端解决方案,它基于和 element-ui 实现基于 iView 的 Vue 2.0 管理系统模板基于 vue2 + vuex 构建一个具有 45 个页面的大型单页面应用基于 vue + element-ui 的后台管理系统基于Vue.js + Element UI 的后台管理系统解决方案基于 Vue(2.5) + vuex + vue-router + vue-axios +better-scroll + Scss + ES6 等开发一款移动端音乐 WebAppSpring Boot 后端 + Vue 管理员前端 + 微信小程序用户前端 + Vue 用户移动端高仿网易云音乐的 webapp,只实现了 APP 的核心功能Vue + TypeScript + Element-Ui 支持 markdown 渲染的博客前台展示更多...React.js一套优秀的中后台前端解决方案网易云音乐第三方一个 react + redux 的完整项目 和 个人总结 react 后台管理系统解决方案这是一个用来查看GitHub最受欢迎与最热项目的App,它基于React Native支持Android和iOS双平台RN写的饿了么,还原度相当高,实现了各类动效仿知乎日报一个商城类的RN项目react + Ant Design + 支持 markdown 的博客前台展示基于 pro.ant.design 的 react + Ant Design 的博客管理后台项目使用 react hooks + koa2 + sequelize + mysql 搭建的前后台的博客 基于typescript koa2 react的个人博客更多...Angular基于angular.js,weui和node.js重写的新闻客户端 管理仪表板模板基于Angular 7+,Bootstrap 4Node.js基于 node.js + Mongodb 构建的后台系统Nodeclub 是使用 Node.js 和 MongoDB 开发的社区系统基于Node.js+MySQL开发的开源微信小程序商城(微信小程序)NideShop 开源微信小程序商城服务端 API(Node.js + ThinkJS)基于react, node.js, go开发的微商城(含微信小程序) React+Express+Mongo ->前后端博客网站 基于 node + express + mongodb 的博客网站后台最后笔者博客首更地址 :https://github.com/biaochenxuying/blog ...

June 15, 2019 · 1 min · jiezi

从GitHub仓库下载单个文件夹或目录

现在我们开发项目时已经习惯了面向搜索,面向GitHub编程,有时候想把仓库中的某个文件夹或文件下载到本地,通常只能通过git clone先把整个仓库克隆到本地,遇到仓库中文件比较多或有较大文件时常常需要等待很长时间。 最近学习开发VS Code extension,文档中给出了官方例子的仓库:https://github.com/microsoft/... 可以看到,这个仓库下有2-30个例子,我要开发的扩展和树视图有关,所以想把tree-view-sample下载下来运行参考。现在我要做的是把整个仓库克隆下来,或者把这个文件夹下的文件一个个下载下来(下载单个文件可以用图中左侧Octotree这个浏览器扩展,比较方便),但是都很麻烦。 于是我搜索有没有下载仓库子目录的方法,发现stackover上有挺多讨论的,很多人给出了不同的方案,比如这里提到的方法 > 1. git init bootstrap && cd bootstrap > 2. git config core.sparsecheckout true > 3. echo '/js/tests/*' >> .git/info/sparse-checkout > 4. git remote add origin https://github.com/twbs/bootstrap.git> 5. git pull origin master 这个是以前看到过的,试验过,确实可行,当时还做了笔记。还有其他比如git clone --depth ...、git archive ...,这些使用git命令的方法看起来都挺复杂的,而且像是把整个仓库下载下来后再做处理。(当然我没验证过╮(╯▽╰)╭) 还看到很多人提到了用SVN,自从用了Git后,就挺排斥SVN的,但是看到一些答案说使用SVN很简单,我就试了下,发现,真香。 首先,我不需要SVN客户端,只要简单命令行工具,有人推荐SlikSVN就用它了。(安装点的飞快,好像出错最后还回退了,不过文件倒是安装上了,最后加上环境变量就好了╮(╯▽╰)╭) 主要用到两个命令,svn ls和svn export,前者和shell命令ls差不多,当然没有那些“花里胡哨”的选项。后者跟git clone差不多吧,就是下载。 基本用法: svn export https://github.com/username/repo-name/trunk/path dest其中trunk大概是master吧,dest是下载到本地的目录名,可省略。 下面以jQuery仓库为例,仓库地址:https://github.com/jquery/jquery 首先运行 svn ls https://github.com/jquery/jquery结果提示错误@_@,后面加上.git就好,有些仓库要加,有些不需要,我也不懂为什么,出错了先加上吧,以后研究。 svn ls https://github.com/jquery/jquery.git列出branches/、tags/、trunk/,这里把它们当成目录理解就好了,可以继续svn ls下一层的路径。.../branches/xx/,tags/x.y.z/,...trunk/后就是文件路径。 ...

June 15, 2019 · 1 min · jiezi

iOS-中gif图的显示

一、前言iOS开发中,大部分时候我们显示一张静态图就可以了,但是有的时候为了UI表现更生动,我就有可能需要展示gif图来达到效果了。 网上找了一下,显示gif图的框架找到了两个。 SDWebImageYYImage 二、显示本地gif图SDWebImage和YYImage的显示本地图片代码。 //load loacle gif image- (void)loadLocaleGifImage{ //sdwebimage [self labelFactoryWithFrame:CGRectMake(0, 80, kScreenWidth, 20) title:@"SDWebImage"]; NSString *path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"gif"]; NSData *gifData = [NSData dataWithContentsOfFile:path]; UIImageView *sdImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 100, kScreenWidth, kScreenHeight/3)]; sdImageView.image = [UIImage sd_animatedGIFWithData:gifData]; [self.view addSubview:sdImageView]; //yyImage show gif image [self labelFactoryWithFrame:CGRectMake(0, kScreenHeight/2 - 20, kScreenWidth, 20) title:@"yyImage"]; YYImage *yyimage = [YYImage imageNamed:@"test.gif"]; YYAnimatedImageView *yyImageView = [[YYAnimatedImageView alloc] initWithImage:yyimage]; yyImageView.frame = CGRectMake(0, kScreenHeight/2, kScreenWidth, kScreenHeight/3); [self.view addSubview:yyImageView];}三、加载网络的gif图SDWebImage和YYImage的加载网络图片代码。 ...

June 14, 2019 · 1 min · jiezi

对NSArray和NSMutableArray的深拷贝浅拷贝的探究

一、原起下面两个问题,面试的时候应该经常会被问到。 对NSArray和NSMutableArray进行copy和mutableCopy分别会得到什么样的数组?当NSString作为一个对象的属性时,我们应该使用strong还是copy来修饰呢?今年三月份面试的时候,被这两个问题搞得很迷茫,今天特地研究了一下。相信您看完我的这篇文章和我有一样疑惑的您,心里会有一个清晰的答案。 二、NSMutableArray的copy和mutableCopy操作进行探究//1、对NSArray分别使用`copy` & `mutableCopy`进行内存地址的对比 NSArray *orgArr = @[@"ningjianwen", @"kongjiangmei"]; NSArray *copyArr = [orgArr copy]; NSMutableArray *mcopyArr = [orgArr mutableCopy]; [mcopyArr addObject:@"jiangxianjin"]; NSLog(@"NSArray 地址对比结果打印:"); NSLog(@"orgArr 地址: %p", orgArr); NSLog(@"copyArr 地址: %p", copyArr); NSLog(@"mcopyArr 地址: %p", mcopyArr);打印结果如下: 2019-06-13 20:05:48.915949+0800 ArrayCopyAndMutableCopy[54942:3399095] NSArray 地址对比结果打印:2019-06-13 20:05:48.916073+0800 ArrayCopyAndMutableCopy[54942:3399095] orgArr 地址: 0x600003716bc02019-06-13 20:05:48.916189+0800 ArrayCopyAndMutableCopy[54942:3399095] copyArr 地址: 0x600003716bc02019-06-13 20:05:48.916266+0800 ArrayCopyAndMutableCopy[54942:3399095] mcopyArr 地址: 0x600003951b90结果分析:从打印结果可以看出orgArr与copyArr内存地址是一致的,说明copy对NSArray进行的是浅拷贝。mcopyArr与orgArr内存地址是不一致的,说明mutableCopy对NSArray进行的是深拷贝,且拷贝之后数组变成了一个可变数组。 三、NSArray的copy和mutableCopy操作进行探究//2、对NSMutableArray分别使用`copy` & `mutableCopy`进行内存地址的对比 NSMutableArray *orgMArr = [NSMutableArray arrayWithObjects:@"星辰", @"江河",nil]; NSArray *copyMArr = [orgMArr copy]; NSMutableArray *mcopyMArr = [orgMArr mutableCopy]; [mcopyMArr addObject:@"日月"]; NSLog(@"NSMutableArray 地址对比结果打印:"); NSLog(@"orgMArr 地址: %p", orgMArr); NSLog(@"copyMArr 地址: %p", copyMArr); NSLog(@"mcopyMArr 地址: %p", mcopyMArr);打印结果如下: ...

June 14, 2019 · 2 min · jiezi

推荐12个实用的gitbook插件

➢ 安装和使用插件方法在根目录下创建book.json 在该文件中按照指定格式插入以下插件对应的代码。 安装插件有两种方式 : 一种是在book.json写入相应插件和配置后, 使用gitbook install安装插件。 一种是使用npm install pluginName安装,然后写入配置 ➢ hide-element 隐藏元素主要用来隐藏不想看到的元素。 如: 默认的gitbook左侧提示:Published with GitBook 使用方式:在book.json中写入以下内容 { "plugins": [ "hide-element" ], "pluginsConfig": { "hide-element": { "elements": [".gitbook-link"] } }}➢ back-to-top-button 回到顶部当文章篇幅较长时,页面底部会显示按钮,一键点击自动回到顶部。 使用方式: 在book.json中写入以下内容 { "plugins": [ "back-to-top-button" ]}➢ chapter-fold 导航目录折叠gitbook默认目录没有折叠效果。 使用方式:在book.json中写入以下内容 { "plugins": ["chapter-fold"]}➢ code 复制代码在代码域的右上角添加一个复制按钮,点击一键复制代码。 使用方式: 在book.json中写入以下内容 { "plugins" : [ "code" ]}➢ splitter 侧边栏宽度可调节左侧目录和右侧文章可以拖动调节宽度。 使用方式: 在book.json中写入以下内容 ...

June 13, 2019 · 2 min · jiezi

macOS-下ffmpeg源码编译安装

1. 下载ffmpeg源码打开mac 的控制台,切换到您想要保存源码的目录,执行git clone https://git.ffmpeg.org/ffmpeg.git命令下载源码。 2. 进入到ffmpeg目录源码下载完后执行cd /ffmpeg命令,切换到ffmpeg目录下,会看到如下内容。 3.执行如下命令进行编译安装3.1对ffmpeg进行配置在ffmpeg目录下执行如下命令进行ffmpeg的编译前配置。 ./configure --prefix=/usr/local/ffmpeg --enable-gpl --enable-nonfree --enable-libfdk-aac --enable-libx264 --enable-libx265 --enable-filter=delogo --enable-debug --disable-optimizations --enable-libspeex --enable-videotoolbox --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --cc=clang --host-cflags= --host-ldflags= --disable-x86asm配置的时候会报错,这个时候不要慌,一般都是缺少库,查看错误信息,确实什么库,使用brew install XXX进行安装即可。 如果配置的时候报错,请看这篇文章 3.2编译配置成功以后,就该对ffmpeg进行编译了。在ffmpeg目录下,执行make命令进行编译。温馨提示,这一步需要等待的时间有点长,耐心等待编译完成再继续下一步。 3.3 进行ffmpeg的安装还是在ffmpeg目录下,执行sudo make install命令进行ffmpeg的安装。安装完成后,切换到/usr/local/ffmpeg/bin目录,如果bin目录下有ffmpeg、ffmplay、ffprobe三个目录。恭喜您,你的ffmpeg安装成功了。 敲黑板!!!注意啦!如果目录下缺失ffmplay,那是因为缺少SDL2库,导致编译不出ffmplay,这个时候需要我们先安装sdl2。在ffmpeg目录下执行brew install sdl2。安装完成之后,再重新依次执行3.1、3.2、3.3的命令。 如果在/usr/local/ffmpeg/bin目录下,看到了ffmpeg、ffmplay、ffprobe三个目录,那么这次真的安装成功了,可以开启您的ffmpeg学习之路了。

June 13, 2019 · 1 min · jiezi

青春科技24小时无限可能THE-Hack-2019-初心不变使命不改

Hackathon  Hackathon(创客马拉松)是 hacker 和 marathon 的结合,是一项从美国高校引入的科技活动。   参赛选手们组成 2-4人 的团队,在 24小时 的限时内,从头脑风暴开始 创意计划一个科技项目 ,针对日常生活中发生的具体问题制定解决方案,然后利用自己的技术能力和比赛提供的硬件设备,完成项目的开发 。最后,每支队伍将以路演的形式,把产品演示给评委,以评选奖项。  THE Hack 2019 “THE”= Technology Harvests EnlightenmentTHE Hack 2019 将于7月13-14日在上海交通大学闵行校区举办。 2018年的参赛者或许记得,我们将选手分为hack.init()新手组和hackShanghai进阶组。 今年,为减小创客之间的距离,THE Hack 2019将融合hack.init()和hackShanghai两大组别,各年龄、各水平的开发者都可以报名参加。 届时,我们将通过设置各具特色的奖项,强调不同角度,从而在允许新手和经验丰富者同台竞技的同时保证比赛的公平性和趣味性,呼吁全体创客共同加入这场创新盛宴。 Why THE Hack?在THE Hack,你将收获: 与跨领域的各大企业沟通交流 从科技到教育,从文创到家居,THE Hack的赞助商们热心于青年的科技能力培养,也对各位创客的创意和能力展现出了十分的兴趣,为THE Hack提供了资金、技术、奖品、媒体等等支持。在THE Hack现场,将有赞助商演讲与摊位,这将是大家近距离了解这些企业的绝佳机会。加入全国性创客社区,对话各年龄段的创客 THE Hack的参赛选手来自全球各地,身份与背景充满着多样性。但相同的是,他们都对科技怀抱着无尽的向往和热情。他们中隐藏着超高水平的大佬、古灵精怪的点子创造者、潜力无限的萌新,都值得你去发掘、结识。 收获丰厚的奖金、奖品、纪念品 在THE Hack 2019,你有可能获得单支队伍五位数的奖金、总价值六位数的奖品、设计感超强的THE Hack专属定制纪念品(贴纸、笔记本、帆布袋...)...... 作为国内的大型科技赛事,我们的评委是来自各大科技企业的工程师、专业STEM教育者和从业者,因此THE Hack在各领域都有一定知名度。 在工作坊中快速学习,锻炼各项综合能力 THE Hack 2019赛前和现场将组织免费的线上线下工作坊,讲师来自赞助商企业或经验选手,分析各领域的开发前景,速成不同方向产品所需的技能,为现场开发做准备。      同时,一场创客马拉松不仅仅考验开发水平,还考验参赛者的demo演讲、合作沟通、时间安排、商业规划等等能力,因此THE Hack也将锻炼和培养的各项综合能力。 这24个小时里,你和朋友同吃同住,在深夜却依然灯火通明的大楼里交替着休息和工作,眼前的3D打印机和你一起忙碌,身边是此起彼伏的敲代码的声音。你转身和隔壁桌的队伍商量硬件能不能一起用,正好聊起了未来生物科技的前景。夜宵和小蛋糕已经吃过了,桌上的产品也逐渐成型。队友醒了,揉揉眼睛开始准备测试,也摇醒了另一个队友,让她开始做demo用的ppt。 报名参赛访问链接 my.thehack.org.cn,填写申请。我们在收到了你的申请后,会进行全方面的审核,最终已邮件回复的形式,邀请300名创客来到现场。 THE Hack的申请与参赛全程免费,现场免费提供正餐、零食和休息空间;非上海的参赛选手我们将依据交通凭证,提供一定数额的路费报销。  申请入口将会于 7月1日 关闭,请准确填写申请中的所有信息,并认真回答每一个问题,让THE Hack团队感受到你的能力与对科技的热情。    创客马拉松本质上确实是一场比赛,队伍之间竞争为数不多的奖项。但我们不想把它称为一场比赛。没有主办方,没有参赛者,我们都是这场科技狂欢中的一员,在几线流光的代码中,把天马行空的想象转化成实实在在的项目。在科技里,我们都有自己的情怀。准备好了吗? ...

June 12, 2019 · 1 min · jiezi

Git常用命令小结

Git版本库原理Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库 创建版本库:#创建文件$ mkdir myapp#进入文件$ cd myapp#初始化代码仓库$ git init#把需要提交的所有修改放到暂存区(Stage)$ git add file#提交所有文件#$ git add . #提交所有.js格式文件#$ git add *.js#强制添加#$ git add -f file#提交代码$ git commit -m "commit info"查看#查看历史记录,git log命令显示从最近到最远的提交日志$ git log#查看分支合并图$ git log --graph#Git提供了一个命令git reflog用来记录你的每一次命令:$ git reflog#git status命令用于显示工作目录和暂存区的状态。使用此命令能看到那些修改被暂存到了, 哪些没有, 哪些文件没有被Git tracked到。git status不显示已经commit到项目历史中去的信息。$ git status#当暂存区中没有文件时,git diff比较的是,工作区中的文件与上次提交到版本库中的文件。#当暂存区中有文件时,git diff则比较的是,当前工作区中的文件与暂存区中的文$ git diff#比较工作区中的文件与版本库中文件的差异。HEAD指向的是版本库中的当前版本,而file指的是当前工作区中的文件。$ git diff HEAD -- file版本回退:#Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当回退版本较早时可以写成HEAD~100。#版本回退$ git reset --hard HEAD^#取消回退,commitId为你想要回到的未来版本号$ git re**set** --hard commitId撤销修改命令git checkout ——file 把文件在工作区的修改全部撤销,这里有两种情况: * 一种是file修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;* 一种是file已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。#文件在工作区的修改全部撤销$ git checkout --file删除文件命令git rm用于从版本库删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。 ...

June 10, 2019 · 1 min · jiezi

Python基础练习100题-71-80

刷题继续昨天和大家分享了61-70题,今天继续来刷71~80题 Question 71:Please write a program to output a random number, which is divisible by 5 and 7, between 10 and 150 inclusive using random module and list comprehension.解法一import randomprint (random.choice([i for i in range(10,151) if i%5==0 and i%7==0]))解法二import randomresp = [i for i in range(10,151) if i % 35 == 0 ]print(random.choice(resp))Question 72:Please write a program to generate a list with 5 random numbers between 100 and 200 inclusive.解法一import randomresp = random.sample(range(100,201),5)print(resp)Question 73:Please write a program to randomly generate a list with 5 even numbers between 100 and 200 inclusive.解法一import randomnumbers = random.sample(range(100,201,2),5)print(numbers)解法二import randomprint (random.sample([i for i in range(100,201) if i%2==0], 5))Question 74:Please write a program to randomly generate a list with 5 numbers, which are divisible by 5 and 7 , between 1 and 1000 inclusive.解法一import randomlst = [i for i in range(1,1001) if i%35 == 0]resp = random.sample(lst,5)print(resp)Question 75:Please write a program to randomly print a integer number between 7 and 15 inclusive.解法一import randomnumber= random.choice([x for x in range(7,16)])print(number)解法二import randomprint(random.randrange(7,16))Question 76:Please write a program to compress and decompress the string "hello world!hello world!hello world!hello world!".解法一import zlibs = 'hello world!hello world!hello world!hello world!'.encode()t = zlib.compress(s)print(t)print(zlib.decompress(t))Question 77:Please write a program to print the running time of execution of "1+1" for 100 times.解法一from timeit import Timert = Timer("for i in range(100):1+1")t.timeit()解法二import timebefore = time.time()for i in range(100): x = 1 + 1after = time.time()execution_time = after - beforeprint(execution_time)Question 78:Please write a program to shuffle and print the list [3,6,7,8].解法一import random lst = [3,6,7,8] random.shuffle(lst) print(lst) 解法二import randomlst = [3,6,7,8]seed = 7random.Random(seed).shuffle(lst)print(lst)Question 79:Please write a program to generate all sentences where subject is in ["I", "You"] and verb is in ["Play", "Love"] and the object is in ["Hockey","Football"].解法一subjects=["I", "You"]verbs=["Play", "Love"]objects=["Hockey","Football"]res = [[i, j, k] for i in subjects for j in verbs for k in objects] for x in res: print(" ".join(x))Out: I Play Hockey I Play Football I Love Hockey I Love Football You Play Hockey You Play Football You Love Hockey You Love Football解法二subjects=["I", "You"]verbs=["Play", "Love"]objects=["Hockey","Football"]for sub in subjects: for verb in verbs: for obj in objects: print("{} {} {}".format(sub,verb,obj))Out: I Play Hockey I Play Football I Love Hockey I Love Football You Play Hockey You Play Football You Love Hockey You Love Football解法三import itertools subjects=["I", "You"]verbs=["Play", "Love"]objects=["Hockey","Football"]all_list = [subjects,verbs,objects]res = list(itertools.product(*all_list)) for x in res: print(" ".join(x))Out: I Play Hockey I Play Football I Love Hockey I Love Football You Play Hockey You Play Football You Love Hockey You Love FootballQuestion 80:Please write a program to print the list after removing even numbers in [5,6,77,45,22,12,24].解法一def isEven(n): return n%2!=0li = [5,6,77,45,22,12,24]lst = list(filter(isEven,li))print(lst)解法二li = [5,6,77,45,22,12,24] lst = list(filter(lambda n:n%2!=0,li)) print(lst)源代码下载这十道题的代码在我的github上,如果大家想看一下每道题的输出结果,可以点击以下链接下载: ...

June 9, 2019 · 3 min · jiezi

github常用命令集合

创建版本库mkdir learngitcd learngitpwdpwd命令用于显示当前目录,在我的电脑中,这个仓库位于/users/michael/learngit若是window系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文 仓库初始化git init通过这个命令把目录变成git可以管理的仓库如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。 文件添加到暂存区git add <file>把文件添加到暂存区 提交到版本库git commit -m "message"简单解释一下git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。 执行后输出: $ git commit -m "wrote a readme file"[master (root-commit) eaadf4e] wrote a readme file 1 file changed, 2 insertions(+) create mode 100644 readme.txtgit commit命令执行成功后会告诉你,1 file changed:1个文件被改动(我们新添加的readme.txt文件);2 insertions:插入了两行内容(readme.txt有两行内容) git statusgit status命令可以让我们时刻掌握暂存区当前的状态,上面的命令输出告诉我们,readme.txt被修改过了,但还没有准备提交的修改。 git diffgit diff顾名思义就是查看difference,知道了对readme.txt作了什么修改后,再把它提交到仓库就放心多了,提交修改和提交新文件是一样的两步 git loggit log命令显示从最近到最远的提交日志,我们可以看到3次提交,最近的一次是append GPL,上一次是add distributed,最早的一次是wrote a readme file 如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数 你看到的一大串类似1094adb...的是commit id(版本号) git reset --hard HEAD^回退到上一个版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^最新的那个版本add disbributed已经看不到了!好比你从21世纪坐时光穿梭机来到了19世纪,想再回去已经回不去了,肿么办? 办法其实还是有的,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个add disbributed的commit id是 2bfef3b...,于是就可以指定回到未来的某个版本: ...

June 8, 2019 · 2 min · jiezi

推荐一款让你纵横Github的读码神器

当我们想深入了解一个开源项目的时候,通常我们有以下几种姿势: 懒汉型 通过Web的方式,逐个的点击页面寻找和查看具体的源码内容。 优点:不依赖任何工具,无须任何额外的操作缺点:效率低下,查找文件不便,切换查看更不便 极客型 通过git clone或download的方式,将项目源文件下载到本地,然后通过自己最顺手的IDE打开阅读。 优点:依靠强大的IDE功能可以快速的搜索以及高效的查看源码缺点:需要下载源码,并且依赖第三方工具 本期推荐上面的方式从效率与成本上来说,都各有优缺点。那么是不是有什么方式,可以同时兼顾呢? 下面就隆重请出本期的重点推荐:Chrome插件Octotree。 TJ我将其定义为:优雅型。 先来看看效果,比如我们来看看它自己的源代码(该插件本身也是个开源项目,有兴趣的读者也可以直接查看哦:https://github.com/ovity/octo...): 可以看到,在页面的左侧区域会展现出当前打开项目的树状结构。我们可以很轻松的在这里查看到整个项目的目录结构,可以很方便的定位和打开我们想要查看的源代码文件。再也不用像懒汉型方式那样,一个个目录的点开刷新页面逐层查看那么笨拙、低效,同时由于通过Chrome插件的方式扩展,所以我们也不需要额外的成本支出。 所以,我觉得如果用两次字来形容,那么”优雅“二字当之无愧。如果要用一个字来形容,那么我觉得只能用”骚“字了,你们觉得呢? 如何安装如果您对这个插件感兴趣,并且还不知道如何安装Chrome插件,那么就继续看下去: 第一步:打开Chrome的扩展商店,搜索”Octotree“ 第二步:在搜索结果中,点击”添加至Chrome“即可完成安装! 第三步:重启Chrome,打开Github,开始探索神器的Github大陆吧~ 如果因为各种原因,您无法通过Google安装插件。那么关注公众号”程序猿DD”,回复:Octotree,直接获取安装文件。

June 8, 2019 · 1 min · jiezi

Pelican+Github搭建博客

Github设置注册后登录Github,点击“Creat a new repo”,版本库名使用'username.github.io'的格式,这里将username替换成自己的用户名即可。 安装Python、Pelican和Markdownyum install python pip install pelican pip install markdown http://wowubuntu.com/markdown/ 创建博客骨架搭建博客目录:mkdir blog; cd blog; pelican-quickstart。 进入output文件夹,把username.github.io版本库clone下来:cd output; git clone https://github.com/username/u...。 设置上传部署到Github,修改根目录下的Makefile文件: OUTPUTDIR=$(BASEDIR)/output/username.github.io publish: $(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) github: publish cd OUTPUTDIR ; git add . ; git commit -am 'your comments' ; git push 定制博客设置pelicanconf.py。 导航目录项MENUITEMS = (("ITEM1","http://github.com"),("ITEM2",URL), ......)。 安装主题安装主题:git clone https://github.com/getpelican...;cd pelican-themes;pelican-themes -i bootstrap2。 设置主题:THEME = 'bootstrap2'。 推荐主题:Elegant http://oncrashreboot.com/eleg...。 ...

June 8, 2019 · 1 min · jiezi

青春科技24小时无限可能

鹰科技官方微信公众号协办方Techomedia官方公众号

June 5, 2019 · 1 min · jiezi

vue如何自动化打包测试环境和正式环境的disttest文件

使用vue现在已经差不多2年了,想起来两年前的一次和某阿里处理的技术大牛(当时我们的技术总监)一起开发一个SPA项目的时候被硬着头皮去解决的一个难题,因为技术老大是阿里出身的,所以很多东西都是比较倾向于自动化,从项目ui设计到项目管理,到打包测试,到发布全部都要求我们要实现自动化,尽可能的减少手动操作。 当时技术大佬要求的事在jenkins进行一键打包,就是他点击不同的按钮在同一套代码上面分别打包测试环境运行的包和正式环境运行的包,刚刚接触vue的我摸不着头脑,老大给了我一天时间研究这个玩意,没办法,只好硬着头皮做,后来想想改造一下,也比较简单。 Step1、package.json中新增命令行脚本test命令,并指向build文件夹下的test.js。 Step2、在在build文件夹中新建test.js,内容可以直接拷贝同目录build.js内容,修改一些参数 这样就多了个test环境 Step3、 在build文件夹中新建webpack.test.conf.js,内容可以直接拷贝同目录webpack.prod.conf.js内容,修改一些参数。 这样构建时就会去config文件夹下的test.env.js寻找环境变量。 Step4、在config下创建test.js文件 Step5、在封装的axios.js的文件夹下创建config.js Step6、在封装的axios引入config.js 封装的get 和post请求 Step7、在config文件下的index增加test模块(可复制build)并更改相应的参数。 在打包的时候执行:npm run test 就会自动的指向测试环境的域名dist文件,执行npm run build 就会打包指向正式环境的域名的dist文件,在Jenkins里面的分别连接至gitlab/github,并将命令分别分配给run test && run build,需要发布的时候就直接点击不同的按钮,然后再Linux下自动打包不同环境的dist,可以提高开发效率,减少开发和沟通成本。

June 5, 2019 · 1 min · jiezi

对github-的push免密码设置

首先确保本机已经安装git工具:1、 对Git 进行用户名和邮箱进行设置,参照下面格式,替换为用户名和邮箱来完成设置: $ git config --global user.name "Your Name"$ git config --global user.email your@example.com//解释: --global 选项代表对 Git 进行全局设置。2、在本地主机中 打印出公钥 id_rsa.pub 文件里的内容,并把输出的内容复制到剪贴板里:没有公钥的需要先制作出来 cat ~/.ssh/id_rsa.pub需要将公钥添加到 GitHub 账号,先打开 Github SSH 令牌管理页面,然后把你刚刚复制的公钥按照下图示例添加到这里: 3、使用 ssh 方式,设置远程仓库地址,下次提交免密 git remote set-url origin [your ssh repositories]注意use ssh

June 5, 2019 · 1 min · jiezi

QQ音乐API-koa2实现-全接口实现

QQMusicAPIQQ音乐API koa2 版本, 通过Web网页版请求QQ音乐接口数据, 有问题请提 issue, 或者你有其他想法欢迎PR.Github 知乎 掘金 环境要求因为本项目采用的是koa2, 所以请确保你的node版本是7.6.0+node -v安装git@github.com:Rain120/qq-music-api.gitnpm install项目启动// npm i -g nodemonnpm run start// or don't install nodemonnode app.js项目监听端口是3200 使用文档使用apis详见文档 关于本人Rain120: 前端菜鸟, 入职前端1年, 公司的技术栈是React, 因为公司官网由我重构过, 我使用的Vue.js重构的。目前正在脱坑, 求大佬内推呀API结构图 API接口koa接口说明(参数, 地址, 效果图)获取QQ音乐产品的下载地址接口说明: 调用此接口, 可获取QQ音乐标准产品下载链接 接口地址: /downloadQQMusic 调用例子: /downloadQQMusic 示例截图: 获取歌单分类接口说明: 调用此接口, 可获取歌单分类, 包含category信息 接口地址: /getSongListCategories 调用例子: /getSongListCategories <details> <summary>SortID</summary> sortId: 1, sortName: 默认sortId: 2, sortName: 最新sortId: 3, sortName: 最热sortId: 4, sortName: 评分sortId: 5, sortName: none</details> ...

June 4, 2019 · 4 min · jiezi

GitHub-上受欢迎的-Android-UI-Library-整理一

抽屉菜单 https://github.com/mikepenz/M... ★7337 - 安卓抽屉效果实现方案https://github.com/Yalantis/S... ★3865 - 创意边侧菜单https://github.com/mxn21/Flow... ★1744 - 向右滑动流动抽屉效果https://github.com/yarolegovi... ★1338 - 仿DrawerLayout的ViewGrouphttps://github.com/mzule/Fant... ★1049 - 单手势滑出侧边栏与选择菜单https://github.com/andremion/... ★779 - 浮动菜单显示锚导航视图https://github.com/heinrichre... ★525 - MD风格的自定义抽屉实现https://github.com/Brioal/Swi... ★514 - 侧滑菜单动画效果库https://github.com/rom4ek/Arc... ★326 - 具有曲线边缘的NavigationViewhttps://github.com/drakeet/QQ... ★106 - 与QQ5.0 完全一模一样的侧滑菜单https://github.com/lemonade-h... ★60 - 滑动侧菜单的布局部件 ListView https://github.com/hongyangAn... ★2475 - Android 万能的Adapterhttps://github.com/beworker/p... ★2363 - 便于使用的ListViewhttps://github.com/felipecsl/... ★1388 - Android自定义列表视图https://github.com/pedrovgs/R... ★1023 - 创建适配器的Android库https://github.com/Kelin-Hong... ★726 - 可互动的ListView+CalendarViewhttps://github.com/diegodobel... ★515 - 创建Android动画折叠视图https://github.com/lurbas/Lis... ★490 - 基于MD风格的列表item实现https://github.com/venshine/W... ★411 - 基于ListView实现的Android滚轮控件https://github.com/yll2wcf/YL... ★209 - 仿IOS弹簧效果的ListViewhttps://github.com/vivian8725... ★149 - 带搜索栏的 listviewhttps://github.com/ruzhan123/... ★38 - 优雅的漫画阅读器插件 ...

June 4, 2019 · 9 min · jiezi

基于-java-注解的-csv-文件读写框架

csv基于 java 注解生成加签验签 csv。 开源地址: github csv) 创作原由以前觉得 csv 文件的多写非常简单,就懒得封装。 最近一个月写了两次 csv 文件相关的东西,发现要处理的细节还是有的,还浪费比较多的时间。 比如: UTF-8 中文编码使用 excel 打开乱码,因为缺少 BOM 头。不同类型字段转化为字符串,顺序的指定,head 头的指定,如果手写都会很繁琐。读取的时候最后 , 后无元素,split 会缺失等。为了解决上述问题,此框架应运而生。 特性Fluent 流式写法基于 java 注解字段类型转换的灵活支持,内置 8 大基本类型以及 String 类型转换快速开始环境jdk7+ maven 3.x maven 引入<dependency> <groupId>com.github.houbb</groupId> <artifactId>csv</artifactId> <version>0.0.2</version></dependency>示例代码User.java演示基本类型的转换 public class User { private String name; private int age; private float score; private double money; private boolean sex; private short level; private long id; private char status; private byte coin; //Getter & Setter & toString()}对象列表构建 /** * 构建通用测试列表 * @return 列表 */ private List<User> buildCommonList() { User user = new User(); short s = 4; byte b = 1; user.age(10) .name("你好") .id(1L) .score(60) .coin(b) .level(s) .money(200) .sex(true) .status('Y'); return Arrays.asList(user); }写入测试代码public void commonTest() { final String path = "src\\test\\resources\\common.csv"; CsvWriteBs.newInstance(path) .write(buildCommonList());}文件生成name,age,score,money,sex,level,id,status,coin你好,10,60.0,200.0,true,4,1,Y,1读取public void commonTest() { final String path = "src\\test\\resources\\common.csv"; List<User> userList = CsvReadBs.newInstance(path) .read(User.class); System.out.println(userList);}日志信息[User{name='你好', age=10, score=60.0, money=200.0, sex=true, level=4, id=1, status=Y, coin=1}]CSV 引导类为了用户使用的便利性,和后期拓展的灵活性。 ...

June 3, 2019 · 2 min · jiezi

详解-Github-App-的玩法

之前在使用 Github issues 搭建博客平台的时候,研究过一番如何取得 Github 授权并调用 API 的办法。后来选择了较简单的账号密码和 Token 的方法。但是有读者反馈这样的操作依然稍显麻烦,且在第三方的页面输入账号密码总感觉不安全。后来经过研究,总算找到了 Github App 这种更为优雅的办法。 什么是 Github App要回答这个问题,可以直接套用官方文档的说法: GitHub Apps are first-class actors within GitHub. A GitHub App acts on its own behalf, taking actions via the API directly using its own identity, which means you don't need to maintain a bot or service account as a separate user.简单翻译一下,就是 Github App 可以通过 Github 提供的认证信息去调用 Github API。 细心的读者会发现,Github 还提供了一个叫做“OAuth App”的东西,它的使用方式和 Github App 非常类似,最大的不同点是 OAuth App 所获取的权限都是固定且只读的,用户只能读取固定的数据而不能修改数据;而 Github App 几乎可以获取Github提供的所有功能权限,且所获取的权限可以被设定为“只读”,“可读可写”和“禁止访问”,对于权限的授权粒度会更细。 ...

May 30, 2019 · 2 min · jiezi

git常用命令分享

1.简写git config --global alias.st 'status' // git stgit config --global alias.cm 'commit' // git cm -m 'msg'git config --global alias.unstage 'reset HEAD' // git unstage fimeNamegit config --global alias.last 'log -1' // git last// 查看历史提交,推荐git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" // git lg2.存储暂时存储// !只能存储已经被track的文件git stash取出最近存储git stash pop3.合并commitgit rebase -i 要合并的两个分支的上一个分支号squash 表示这个 commit 会被合并到前一个commit4.merge另一个分支上指定的文件git checkout --patch 要merge的分支 filePath5.将一个分支指定的commits合并到另一个分支git cherry-pick 62ecb36.回退版本git reset --hard HEAD^ // 回退到上个版本git reset --hard HEAD~n // 回退到n次提交之前git reset --hard commit_id // 退到/进到指定commit版本7.切换并跟踪远程新分支git checkout --track origin/branch_namegit checkout -b localBranch origin/originBranch8.标签操作git tag tagNamegit tag -a tagName -m 'tagMsg'// 将本地标签推到远程git push origin --tags/tagName// 删除本地标签git tag -d tagName// 删除远程标签git push origin :refs/tags/标签名9.如何将已经track的文件加入.gitignoregit rm -r --cached .git add .git commit -m 'update .gitignore'如果还是不行的话在先将想要取消追踪的文件移到项目目录外,并提交,然后提交后再将刚刚移出的文件再移入项目中即可如果是对所有文件都取消跟踪的话,就是 ...

May 30, 2019 · 1 min · jiezi

制作一个-JavaScript-小游戏

简评: 作者学习了编程两个月,边学边做了一个 JavaScript 小游戏,在文中总结了自己在这个过程中的一些体会,希望能给其他初学者一些帮助。对于很多想学编程但一直没下定决心的同学来说,最大的问题可能就是没有一个切实可行的计划。这里作者将自己要完成游戏的这件事划分成了很多小任务,比如: 先构思要做一个怎样的游戏,解谜?角色扮演?考虑不同类型游戏需要有什么样的要素。写下所有需要编程完成的事,对于作者的这个游戏来说就是: 界面一个技能系统一个事件系统角色状态系统保存功能寻找好的游戏美术资源: Game-Icons.net**:里面的图标简单但看起来很不错。Open Game Art**:免费的游戏资源,不只包含美术资源,还有音频等等的资源。Bulk Resize Photos**:一个帮助制作小图标的在线工具。CSS Sprite Generator**:制作 CSS Sprite 的在线工具。开始编程完成游戏。解决发现的 bug。当然实际做起来要复杂得多,作者在文中也谈到了自己的遇到的问题和解决办法,并开源了自己的代码,感兴趣的可以去原文详细看看。: ) 项目地址:Loot RPG v1.05** 原文链接: I built a role playing game in JavaScript. You can, too. Here’s how.推荐阅读:Android 开发工具推荐

May 30, 2019 · 1 min · jiezi

基于注解的-java-加签验签框架-checksum

checksum基于 java 注解生成加签验签 checksum。 开源地址:github checksum创作缘由原来的代码中,checksum 的生成是用的工具类方法。 后来发现如下的问题: 有些字段太大,不想参与验签,但是无法方便的调整。不同系统的 checksum 字段不同,只好把工具方法 copy 过去,改来改去。感觉这样有很大的弊端,完全失去了灵活性。 特性基于注解的 checksum 加签验签Fluent 流式语法支持灵活的策略自定义更新记录更新记录快速开始环境要求jdk7+ maven 3.x+ 引入<dependency> <groupId>com.github.houbb</groupId> <artifactId>checksum</artifactId> <version>0.0.1</version></dependency>定义待加签的示例对象User.javapublic class User { @CheckField private String name; @CheckField private String password; private String address; @Checksum private String checksum; //Getter & Setter //toString()}核心注解@CheckField 表示参与加签的字段信息 @Checksum 表示加签结果存放的字段 调用测试package com.github.houbb.checksum.core;import com.github.houbb.checksum.model.User;import org.junit.Assert;import org.junit.Test;/** * @author binbin.hou * @since 0.0.1 */public class ChecksumBsTest { @Test public void checksumTest() { User user = buildUser(); final String checksum = ChecksumBs .newInstance(user) .checksum(); Assert.assertEquals("8D62F2BC49A9AB51280C8F42A483ED54", checksum); } @Test public void fillTest() { User user = buildUser(); ChecksumBs.newInstance(user).fill(); Assert.assertEquals("User{name='ryo', password='1234', address='china', checksum='8D62F2BC49A9AB51280C8F42A483ED54'}", user.toString()); } /** * 构建示例对象 * @return 构建示例对象 */ private User buildUser() { User user = new User(); user.name("ryo") .password("1234") .address("china"); return user; }}ChecksumBs 引导类用来创建加签的相关配置及实现。 ...

May 29, 2019 · 1 min · jiezi

应用案例-Blink-有何特别之处菜鸟供应链场景最佳实践

本文授权转自阿里技术官方公众号(ali_tech):菜鸟供应链业务链路长、节点多、实体多,使得技术团队在建设供应链实时数仓的过程中,面临着诸多挑战,如:如何实现实时变Key统计?如何实现实时超时统计?如何进行有效地资源优化?如何提升多实时流关联效率?如何提升实时作业的开发效率? 而 Blink 能否解决这些问题?下面一起来深入了解。 背景菜鸟从2017年4月开始探索 Blink(即 Apache Flink 的阿里内部版本),2017年7月开始在线上环境使用 Blink,作为我们的主流实时计算引擎。 为什么短短几个月的探索之后,我们就选择Blink作为我们主要的实时计算引擎呢? 在效率上,Blink 提供 DataStream、TableAPI、SQL 三种开发模式,强大的 SQL 模式已经满足大部分业务场景,配合半智能资源优化、智能倾斜优化、智能作业压测等功能,可以极大地提升实时作业的开发效率;在性能上,诸如 MiniBatch&MicroBatch、维表 Async&Cache、利用 Niagara 进行本地状态管理等内部优化方案,可以极大地提升实时作业的性能;在保障上,Blink 自带的 Failover 恢复机制,能够实现线程级的恢复,可以做到分钟级恢复,配合 Kmonitor 监控平台、烽火台预警平台,可以有效地实现实时作业的数据保障。 接下来,我将结合供应链业务的一些业务场景,简要说明,Blink 如何解决我们遇到的一些实际问题。 回撤机制订单履行是供应链业务中最常见的物流场景。什么是订单履行呢?当商家 ERP 推单给菜鸟之后,菜鸟履行系统会实时计算出每笔订单的出库、揽收、签收等节点的预计时间,配送公司需要按照各节点的预计时间进行订单的配送。为了保证订单的准点履约,我们经常需要统计每家配送公司每天各个节点的预计单量,便于配送公司提前准备产能。 看似很简单的实时统计加工,我们在开发过程中遇到了什么问题呢?履行重算!当物流订单的上游某个节点延迟时,履行系统会自动重算该笔订单下游所有节点的预计时间。比如某个物流订单出库晚点后,其后的预计揽收时间、预计签收时间都会重算。而对于大部分的实时计算引擎来说,并不能很友好的支持这种变 Key 统计的问题。以前,数据量没那么大的时候,还可以通过 OLAP 数据库来解决这类场景,当量上来后, OLAP 方案的成本、性能都是很大的问题。 除了 OLAP 方案,我们提倡采用 Blink 已经内置的 Retraction 机制,来解决这类变 Key 统计的问题,这也是我们在2017年初就开始尝试 Blink 的重要原因。Blink 的 Retraction 机制,使用 State 在内存或者外部存储设备中对数据进行统计处理,当上游数据源对某些汇总 Key 的数据做更新时,Blink 会主动给下游下发一个删除消息从而“撤回”之前的那条消息,并用最新下发的消息对表做更新操作。 下面是一个简化后的案例,供了解 Blink Retraction 的内部计算过程: 对于上述案例,可以通过 Blink 提供的强大的、灵活的、简易的 SQL 开发模式来实现,只需要几行 SQL 即可完成。 ...

May 29, 2019 · 2 min · jiezi

Spring-Framework系列教程汇总

最近整理出了之前学习Spring Framework系列,记载了一些学习笔记,特地在此罗列出来。大家也可直接关注笔者github(Spring Framework)获取最新资讯。 TutorialSpring-framework-4.x1. Spring Annotation驱动编程2. Java Beans内省机制以及在Spring中的应用3. Java资源管理以及在Spring中的应用4. Spring自定义XML配置扩展Spring-framework-5.x1. 深入Java之国际化2. JSP在Spring中的应用(Annotation版)3. JSP在Spring中的应用(XML版)4. Java Reactive Web设计与实现5. Servlet在Spring中的应用6. Spring5新特性之测试7. Spring5新特性之Web Flux8. Spring Web自动装配(Annotation)Spring-framework-common1. Spring Aware接口应用

May 28, 2019 · 1 min · jiezi

github新功能统计一个项目的受欢迎程度

近期github版本更新了这个玩意: 用这个来看一个库的欢迎程度,比 star 和 fork 更确切,更准确。used代表这个项目最有用,实际是在使用当前的库 我对比了前端二大主流的框架截图如下: react达到了200多万, vue目前是85万。

May 27, 2019 · 1 min · jiezi

git

安装git三个工作区域概念以及文件状态三个工作区域概念:工作目录(Working Directory)、暂存区(Staging Area)、git仓库(.git Direactory Repository);文件状态:划分一:未修改 已修改 已暂存 已提交划分二:未跟踪 已跟踪 注:已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。 工作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。 建立git仓库两种场景:1)在现有目录中初始化仓库把已有的项目纳入git管理$cd 项目代码所在的文件夹$git init新建的项目直接用git管理$cd 某个文件夹$git init ‘your_project_name’ // 会在当前目录下创建your_project_name文件夹(含有.git)注:通过git init 初始化的项目,工作目录中的所有文件都属于未跟踪的文件,可通过git add 将其变成已跟踪文件2)从服务器克隆一个git仓库$git clone <url> [your_project_name]注:初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。 配置信息添加配置$git config [--local | --global | --system] user.name 'Your name'$git config [--local | --global | --system] user.email 'Your email' 查看配置$git config --list [--local | --global | --system]$git config [[--local | --global | --system] user.name 区别local:区域为本仓库global: 当前用户的所有仓库system: 本系统的所有用户

May 27, 2019 · 1 min · jiezi

使用代码将github仓库里某个issue同步到CSDN博客上

我是一个懒惰的程序员。我在github仓库里用issue的方式写了很多分享文章,想同步到CSDN上。但是我又不想一篇篇手动复制粘贴,因此想用代码来实现自动化。 例子:https://github.com/i042416/Kn... 这是我的一个issue: 我使用下面这些nodejs代码实现从github 仓库issue到CSDN博客的拷贝: var config = require("./mcConfig");var request = require('request');var querystring = require('querystring');function createPost(oPost) { var url = "https://mp.csdn.net/mdeditor/saveArticle"; var oBody = { title: oPost.title, markdowncontent: oPost.body, tags:"Fiori", categories:"Fiori", channel:"14", type:"original", articleedittype:"1", content: oPost.body };var formData = querystring.stringify(oBody);var contentLength = formData.length;var createPostOptions = { url: url, method: "POST", headers: { "content-type": "application/x-www-form-urlencoded", "Content-Length": contentLength, "origin" :"https://mp.csdn.net", "referer" :"https://mp.csdn.net/mdeditor", "User-Agent" :"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36", "cookie": config.cookie }, body: formData}; return new Promise(function(resolve,reject){ var requestC = request.defaults({jar: true}); console.log("Step1: create post via url: " url ); requestC(createPostOptions,function(error,response,body){ if(error){ reject(error); } console.log("response: " body); resolve(body); }); });}module.exports = createPost;var request = require('request');function getIssue(issueNumber) { var url = "https://api.github.com/repos/i042416/KnowlegeRepository/issues/" issueNumber; var getIssueOptions = { url: url, method: "GET", json:true, headers: { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36" } }; return new Promise(function(resolve,reject){ var requestC = request.defaults({jar: true}); console.log("Step1: get issue detail via url: " url ); requestC(getIssueOptions,function(error,response,body){ if(error){ console.log("error occurred: " error); reject(error); } console.log("title:" body.title); console.log("body: " body.body); for( var i = 0; i < body.labels.length; i ){ console.log("label: " body.labels[i].name); } resolve(body); }); });}module.exports = getIssue;var readIssue = require("./readIssueMod");var createPost = require("./createPostMod");readIssue(2215).then(createPost).catch((error)=>{console.log("error: " error)});执行结果: ...

May 25, 2019 · 1 min · jiezi

createreactapp项目部署到Github-Pages

描述本文讲解使用create-react-app创建的项目,如何部署GitHub Pages,以及这部署到过程中遇到到坑。 创建项目使用官网方式创建项目。 npx create-react-app my-appcd my-appnpm install弹出配置 npm run ejectGithub Pages部署讲解把项目部署成github pages,在github上点开项目到设置,翻到Github Pages设置处,可以看到Github Pages只能使用master、gh-pages分支或者master下面的docs文件夹。我们这里使用的是gh-pages分支的方式来创建。 安装gh-pagesnpm install gh-pages --save-dev通过gh-pages中间件可以把build文件下到文件推送到github,并且创建gh-pages branch。 修改package.json增加homepage "name": "react_demo", "version": "1.1.0", "private": true, "homepage": "./", //加上这一句注意:homepage不要设置成github page上生成的那个链接路径,比如https://username.github.io/react_demo/。如果设置成上面的连接,build打的包会这所有路径前面加上react_demo。比如index.html文件中对同等目录下的文件引用应该是src='./index.css',结果会变成src='./react_demo/index.css',这样部署后肯定无法访问,所有资源都找不到。增加npm scripts命令,推送gh-pages "scripts": { ... + "deploy": "gh-pages -d build" //加上这一句}推送项目GitHub Pages只是部署项目,react代码直接放上去是识别不了的,所以部署的是打包编译后到代码。 npm run build编译后就可以推送了,执行上面配置的命令。 npm run deploy这时github上项目就多出了一个gh-pages的branch,在设置中Github Pages处选择gh-pages分支保存,部署完成。点击生成的连接,查看是否部署成功。 2019-05-25

May 25, 2019 · 1 min · jiezi

Flutter高内聚组件怎么做阿里闲鱼打造开源高效方案

fish_redux是闲鱼技术团队打造的flutter应用开发框架,旨在解决页面内组件间的高内聚、低耦合问题。开源地址:https://github.com/alibaba/fish-redux 从react_redux说起redux对于前端的同学来说是一个比较熟悉的框架了,fish_redux借鉴了redux单项数据流思想。在flutter上说到redux,大家可能第一反应会类比到react上的react_redux。在react_redux中有个重要的概念——connect, connect([mapStateToProps], [mapDispatchToProps], [mergeProps], [options])简单得说,connect允许使用者从Redux store中获取数据并绑定到组件的props上,可以dispatch一个action去修改数据。 那么fish_redux中的connector是做什么的呢?为什么说connector解决了组件内聚的问题?我们应该如何理解它的设计呢? connector in fish_redux尽管都起到了连接的作用,但fish_redux与react_redux在抽象层面有很大的不同。 fish_redux本身是一个flutter上的应用框架,建立了自己的component体系,用来解决组件内的高内聚和组件间的低耦合。从connector角度来说,如何解决内聚问题,是设计中的重要考量。 fish_redux自己制造了Component树,Component聚合了state和dispatch,每一个子Component的state通过connector从父Component的state中筛选。如图所示: 可以看到,fish_redux的connector的主要作用把父子Component关联起来,最重要的操作是filter。state从上之下是一个严谨的树形结构,它的结构复用了Component的树形结构。类似一个漏斗形的数据管道,管理数据的分拆与组装。它表达了如何组装一个Component。 而对于react_redux来说,它主要的作用在于把react框架和redux绑定起来,重点在于如何让React component具有Redux的功能。 从图中可以看到,react_redux和React是平行的结构,经过mapStateToProps后的state也不存在严谨的树形结构,即对于一个React component来说,它的state来自于Redux store而不是父component的state。从框架设计的角度来说,react_redux最重要的一个操作就是attach。 源码分析说完概念,我们从源码的角度来看看fish_redux中的connector是如何运作的,以fish_redux提供的example为例。 class ToDoListPage extends Page<PageState, Map<String, dynamic>> { ToDoListPage() : super( ... dependencies: Dependencies<PageState>( adapter: ToDoListAdapter(), slots: <String, Dependent<PageState>>{ 'report': ReportConnector() + ReportComponent() }), ... );}在ToDoListPage的构造函数中,向父类构造传递了一个Dependencies对象,在构造Dependencies时,参数slots中包含了名叫"report"的item,注意这个item的生成,是由一个ReportConnector+ReportComponent产生的。 从这里我们得出一个简单却非常重要的结论: 在fish_redux中,一个Dependent = connector + Component 。Dependent代表页面拼装中的一个单元,它可以是一个Component(通过buildComponent函数产生),也可以是一个Adapter(由buildAdapter函数产生)。这样设计的好处是,对于View拼装操作来说,Dependent对外统一了API而不需要透出更多的细节。 根据上面我们得出的结论,connector用来把一个更小的Component单元链接到一个更大的Component或Adapter上。这与我们之前的描述相符合。 connector到底是什么知道了connector的基本作用,我们来看一下它到底链接了哪些东西以及如何链接。 先来看一下ReportConnector类的定义: class ReportConnector extends ConnOp<PageState, ReportState>ReportConnector继承了ConnOp类,所有connector的操作包括+操作,都来自于ConnOp类。 set/get 既然是数据管道,就会有获取和放置 set函数的入参很好得表达了T和P的意思,即把一个P类型的subState合并到T类型的state中。 ...

May 24, 2019 · 1 min · jiezi

git撤销与合并操作

前奏很多时候,发现自己真的不曾学会过git,特别是本地多个分支在同时开发,合并master产生各种冲突,commit了不必要的信息,commit了错误的修改等等情况下,总感觉很害怕操作git,细思而知,git很强大,自己却不曾认识到它的强大之处。直观的理解git,下面是一张很好的图(图片来源网络,不知源处): git的撤销git reset - git reset --soft: 将分支回退到指定提交,工作区维持现状不变,暂存区会在现有基础上增加该commit之后的提交。- git reset --mixed: (默认操作)将分支回退到指定提交,暂存区也被同步为该指定提交,工作区保持不变。- git reset --hard: 将分支回退到指定分支,暂存区和工作区都会被同步为该指定的提交。git reset后的三个参数回退程度是依次递进。soft最轻微,它不会重置当前工作区和暂存区,只会将回退版本后续的提交加到暂存区。mixed会改变暂存区,使它和回退版本同步。hard则会重置工作区和暂存区,使它和回退版本一致。 /* git reset --soft target*/working index HEAD target working index HEAD-------------------------------------------------------------A B C C A B CA B C A A B+C A/* git reset --mixed target*/working index HEAD target working index HEAD-------------------------------------------------------------A B C C A C CA B C A A A A/* git reset --hard target*/working index HEAD target working index HEAD-------------------------------------------------------------A B C C C C CA B C A A A Agit checkout ...

May 23, 2019 · 1 min · jiezi

为什么我选择用-Github-issues-来写博客

对于爱写东西的人来说,挑一个合适的博客平台是非常重要的。而作为一个 Web 开发者,我们肯定都希望能够拥有一个高度定制化的博客平台,用以展示我们独一无二的个性以及记录长久以来的学习工作等。与此同时,我们也希望这个平台可以让我们方便地发布内容,提供完整的点赞、留言等操作。在经历过 Hexo,Wordpress,自行搭建服务等一系列尝试以后,我最后选择了以 Github issues 来作为我的博客平台。 博客的基本能力对于一个合格的博客平台来说,它主要提供了下列几种能力: 个人介绍对于个人博客来说,它首先要支持展示博主的个人介绍。这个个人介绍里面可能包括了头像、昵称、联系方式等基本内容,能够让读者能够对这个博客的主人有一个基本的认识。文章的撰写与展示对一个博客来说,最重要的就是它的内容,也就是里面的文章。一个好用的博客平台应该具备方便的撰写文章的能力,让够让用户毫无负担地撰写、编辑自己的文章。此外,还必须能够文章的信息,比如展示标题、节选、封面,创建/修改时间,评论点赞数等等。归档能力一篇文章的撰写时间、内容标签/分类等都是不同的,如何按照不同的要求对这些文章进行归档整理,也是考验博客平台的能力之一。再者,当文章数量较多的时候,添加一个搜索的功能也能大大方便读者对博客的浏览。博主与读者互动的能力仅仅只有博主一个人自嗨可能难以激发写作的动力,如果博客能够提供博主与读者互动的能力,将能有效激励博主持续创作,更能提升文章的传播度——点赞和评论功能则是互动能力中最重要的功能之一。经过上面的几个点,基本可以知道一个博客平台,其主要功能就是“展示自己,沟通外界”。在满足这个基础的前提下,它也应该具备方便操作,高度定制化的特点。 为什么不选择其他方案 在文章的开头我有提到,我曾经尝试过用 Wordpress,Hexo,自行搭建服务等途径去尝试维护博客。但这些尝试的结果均不合我意,最后无疾而终。归根结底,就是不够自由和方便。 举个例子,Wordpress 和 Hexo 都具备搭建一个主题漂亮、功能齐全的博客的能力,但是这些都必须要在它们所制定的规则下进行。如果我想 DIY 一个主题,或者加入任何我想要的新能力,都必须仔细翻阅它们的文档,找到对应的规则再尝试去实现,可谓是戴着镣铐跳舞。除此之外,要发布新的文章,动辄就要在本地跑命令行,实在是非常不优雅。更有甚者,如果希望为文章添加评论功能,还要费一大番周折,想必体验过的人都懂。 至于自行搭建服务,可谓是既自由又方便,想要任何功能都可以自己实现。但这种方案最大的缺点是成本较高。对于人力成本来说,服务器数据库配置、域名、备案等一系列操作非常烦人,甚至还要考虑告警、负载、宕机等一堆的运维问题。折腾多了,也没什么心思往里面写文章。对于金钱成本来说,买域名,买服务器也是一笔花销,尤其是当我们某段时间文章产出特别少的时候,总觉得白养了一台服务器…… 选择 Github issues首先是 Github,然后才是 issues。 作为全球最大的代码托管平台,又刚刚被微软收入麾下,其可靠程度是非常高的,基本不用担心存放在里面的数据会丢失(想想看国内说没就没的网易博客,百度贴吧等)。 在 Github 上我们可以精心编辑自己的账户信息,包括头像、昵称、邮箱、工作单位等等。 Github issues 提供了非常方便快捷的编辑能力,尤其是贴图。它支持通过拖拽、粘贴、选择的方式上传图片,图片会存放在 https://user-images.githubuse... 这个地方,且支持外链——这也意味着我们可以很方便地把 issue 的内容转载到其他的平台。 在 Github issues 里面,可以为某条 issue 添加点赞、爱心等互动标签(Reactions),也可以设置分类标签(Labels),更可以给 issue 添加评论(Comment)。 最为重要的是 Github 提供了一套满足了绝大部分需求的 API,囊括了 REST 和 GraphQL 的调用方式,这才是 Github 能够成为我们博客平台的大杀器,这个接下来会详细说明。 不难看出,Github issues 拥有着前文提及的一个博客平台所应具备的各种能力。接下来我们将以 Github issues 作为博客平台的管理后端,以 API 来实现和客户端的数据交互。 天生的前后端分离关于 Github API 的授权和调试,可以查阅我的另一篇文章《基于 Github API 的图床 Chrome 插件开发全纪录》。我们使用 Github issues 作为博客平台,也就是相当于管理后端。我们在管理后端里面撰写文章,设置标签,回复评论,然后通过 API 调用把数据传送给客户端。 ...

May 22, 2019 · 1 min · jiezi

语义化标签以及常用标签

_版权声明:本文为博主原创文章,转载请注明出处。_#1 一开始接触到页面这个东西,毫无疑问大家首页看到的是html这玩意。我对html有了初步的认识是在我大二上数据结构这门课程的时候老师讲课之余就给我们讲讲深度学习,网页设计之类的简单知识。自从那以后就断断续续在W3school以及MDN学习它,以下内容是对之前的学习做个较为简单的总结。???? 常用标签html标签又称为html元素,html元素分为行内(内联)元素、行内块级元素以及块级元素。 行内元素的特点 这些行内元素本身的属性display:inline,而行内块级元素则为display:inline-block;和其他行内元素从左到右在一行显示,给它设置的宽高值无效,但可以设置内外边距的值(左右有效,上下无效)行内元素的宽高是由本身内容的大小决定(文字、图片等)行内元素只能容纳文本或者其他内联元素,不要在行内元素嵌套块级元素常见的行内元素“span” 标签,通常用于放一些文字和icon图标之类作为内敛容器等”script“ 标签,常用于引入外部文件,嵌入代码等“a” 标签,常用于超链接,锚点等方面“img” 标签,用于引入外部图像文件“br” 标签用于换行“input” 标签,用于表单控件“button" 标签,页面按钮”label“ 标签,通常结合input来使用,相当命名标签“select” 标签,选项标签”textarea“ 标签, 文本区域“i” 标签,呈现斜体文本,此外许多框架用它制作页面小图标等“b" 标签,加粗文本,新的标准出来不推荐使用“em” 标签,用于将文本进行强调”strong“ 标签, 用于将文本进行强调加粗“big” 标签, 大字体文本”small“ 标签, 小字体文本 常见的行内块级元素 行内块级元素的特征 不自动换行,如果超出父元素(不为行内元素)width则换行可以设置宽高在一行内从左到右依次排列在HTML5中,开发者可以自定义标签,在任意定义标签中,设置display:block属性即可变为块级元素,display:inline就为行内元素,display:inline-block则为行内块级。绝大多数标签都是可以互相转换的。 常见的块级元素块级元素的特征 可以设置宽高,内外边距等可以内嵌其他元素(不管是块级的内联的还是行内块级的元素)独占每个块级元素默认一行,可以自动换行,默认排列方式为从上至下div - 常用块级容易,也是 css layout 的主要标签p - 段落标签主要用于文章段落,多行文字方面ul - 无序列表ol - 有序列表form - 交互表单h1~h6 标题标签hr - 水平分割线dl - 定义列表address - 地址blockquote - 块引用center - 举中对齐块, 等等其他不常用的标签HTML5中新增常见的标签以及其语义化(以下顺序不分先后)header ???? 页眉(网页(部分区域)的头部 顶部 导航区域等等) 块级元素nav ???? 导航链接部分 块级元素section ???? 标签定义网页中的区域(部分)。比如章节、页眉、页脚或文档中的其他部分。块级元素article ???? 内容是引用其他地方的。一个区域中的,另外一部分内容;块级元素aside ???? 和article 是一起使用;是辅助 article 区域的内容。也可以理解为整个网页的 辅助区域footer ???? 页脚(网页(部分区域)的底部|版权区域等等) 块级元素audio ???? 播放声音文件,比如音乐或其它音频流 行内元素video ???? 播放视频文件,比如电影或其它视频流 行内元素canvas ???? 定义图形,比如图表和其他图像 有着默认宽高 行内元素hgroup 给标题分组,为标题或者子标题进行分组 块级元素figure 对多个元素进行组合 块级元素figcaption 定义 figure 元素的标题 块级元素output 定义输出的一些类型。details 定义元素的细节command 定义命令按钮summary 为 details 元素定义可见的标题mark 主要用来在视觉上向用户呈现那些需要突出的文字 高亮字体meter ???? 标签定义度量衡。仅用于已知最大和最小值的度量。必须定义度量的范围,既可以在元素的文本中,也可以在 min/max 属性中定义。progress 定义任何类型的任务的进度 标签运行中的进程。可以使用 标签来显示 JavaScript 中耗费时间的函数的进程time ???? 定义日期或时间,或者两者 行内元素datalist ???? 定义可选数据的列表。与 input 元素配合使用,就可以制作出输入值的下拉列表 行内元素embed 定义嵌入的内容,比如插件。用来插入各种多媒体,格式可以是MIDI、MP3等 行内元素 有默认宽高keygen 定义生成密钥source ???? 为媒介元素(比如 video 和 audio)指定多个播放格式与编码,浏览器会自动选择第一个可以识别的格式 行内元素 ...

May 22, 2019 · 1 min · jiezi

github上传大文件大于100MB

使用github作为仓库的时候面向开发者还好,几乎代码都是属于细小零碎文件,但是如果面向大部分文件都是 .mp3、.psd 这类的就要谨慎了,因为这类文件很轻松就超过100MB,然而在github上传协议中,超过100MB的文件需要使用扩展来处理,而不是可以直接上传的。 Git Large File Storagegithub 官方扩展 (https://help.github.com/en/ar... macOS 举例 安装命令:brew install git-lfs使用命令:git lfs track "*.psd" //所有psd文件都使用lfs上传⬆️注意:1、lfs 只能根据扩展名来过滤哪些使用lfs上传2、以上命令执行之后,会在当前目录生成文件".gitattributes",内容大概是这样⬇️*.psd filter=lfs diff=lfs merge=lfs -text以后再次上传psd类型的大文件,系统会自动使用lfs上传

May 22, 2019 · 1 min · jiezi

同步Github-fork

前言选择拥抱开源,无疑参与 github的开源项目是最好的选择,先从同步 fork 仓库开始做起! 一、确认本地 fork 仓库版本是否落后于原仓库1. 查看 github fork 仓库后的 commit数量及提交日志 本地 clone 自己仓库 后的 commit log 日志,与 gihub 上一致 2. 查看原仓库的相关信息,比较 比较后得知:本地 fork仓库的版本落后于原始仓库下一步计划,准备开始同步! 二、 同步1. 查看本地仓库设置的远端仓库,是否有连接上游原始远端仓库如果未连接上游仓库,添加远程仓库的变量地址 $ git remote -vorigin https://github.com/xiaoyueyue165/taro.git (fetch)origin https://github.com/xiaoyueyue165/taro.git (push)添加上游仓库$ git remote add upsteream https://github.com/NervJS/taro.git 再次查看远程仓库指向地址列表,确认添加$ git remote -vorigin https://github.com/xiaoyueyue165/taro.git (fetch)origin https://github.com/xiaoyueyue165/taro.git (push)upsteream https://github.com/NervJS/taro.git (fetch)upsteream https://github.com/NervJS/taro.git (push)2. fetch,取回原仓库的更新$ git fetch upsteream默认情况下,git fetch 取回所有分支(branch)的更新3. 将 fetch 后的更新内容合并至主分支所取回的更新,在本地主机上要用"远程主机名/分支名"的形式读取。比如upsteream主机的master,就要用 upsteream/master 读取。 $ git merge upsteream/master此时会发现本地 master 分支的 commit 日志已经与原仓库的日志保持一致 ...

May 19, 2019 · 1 min · jiezi

hexo-githubpage-搭建个人博客

github + hexo 搭建博客大学时搭建过 github 博客,但是后来没怎么弄了。感觉有点折腾,就没有继续维护了,今天再来重新搭建一个博客。本文记录搭建操作。 预备知识:npm 命令;git 命令github 常见操作环境要求: nodegit我的环境: $ git versiongit version 2.15.1.windows.2$ node -vv8.11.1$ npm -v6.4.0安装 hexonpm i -g hexo-cli 在某个文件夹内初始化 hexo 博客所需要的文件 mkdir myBlog # /e/HexoPages 新建一个文件夹cd myBlognpm i # 安装npm 依赖得到如下目录: ├── _config.yml # 网站的配置信息,您可以在此配置大部分的参数。 ├── package.json├── scaffolds # 模版文件夹├── source # 资源文件夹,除 _posts 文件,其他以下划线_开头的文件或者文件夹不会被编译打包到public文件夹| ├── _drafts # 草稿文件| └── _posts # 文章Markdowm文件 └── themes # 主题文件夹本地预览博客: hexo s打开http://localhost:4000即可看到效果。 ...

May 19, 2019 · 1 min · jiezi

我是如何做到-GitHub-star-在-5-天内从-0-飙至-666-的

前言很高兴和大家见面! 上周五我在掘金发表了 《真香警告:即使不用饿了么订餐,也请务必收藏好该库!》,文中主角 Linkage-RecyclerView 原本只是为 《RxJava魔法师》 这个项目的需求而存在的,没想到在各路读者的积极参与下,让一个本来默默无闻的项目,在内容发布的第三天,登陆 GitHub 今日趋势 Java 专区榜单前三,并在 5 天内做到 GitHub star 从 0 飙至 666。(不要慌,项目链接文末已给出) 在此我首先特别感谢热心读者的见证和参与。掘金社区、WanAndroid 读者对源码的认真阅读和交流,让我备受感动。 开源这个项目的初衷每个架构都有专属的用武之地开源这个项目的初衷有两个,一个是方便读者借助该项目深入理解,当我们为项目选择架构时,选材的依据是什么。 就我当前的认知来看,项目开发,无非就是顾及 “配置解耦” 和 “职责分离” 这两件事。 对于通用必用的控件库和组件库,我们可以将其抽取成模块,做成可供多个项目依赖的第三方库。 第三方库的目标是让使用者无需了解内部逻辑、通过外部简单的配置即可轻松上手,因而第三方库适合使用 MVP 架构,来实现 “配置解耦”。 对于多人参与的主干工程,我们需要确保 UI 和 业务之间可以分工给不同的人协作,这就要求架构必须具备 “关注点分离(SoC)” 或 “职责分离(SoD)” 的特性。 因而我们可以在主干工程中采用目前主流的关注点分离架构 JetPack MVVM,或者由我自主设计并在公司项目重构中采用的职责分离的 VIABUS Architecture。 未雨绸缪方能在关键时刻拯救自己开源这个项目的另一个缘由是: 有些事我都已忘记,但我现在还记得,在一个晚上,同事阿左问我,今天怎么不开心。...我说在我的想象中,有一个开源库,与众不同最时尚,接入肯定棒,整个 GitHub 找遍所有的 Repo,都没有。他说将来会找到的,时间,时间,会给我答案。。哈哈,开玩笑的。缘于,公司某个项目中的另一个需求:为多级联动表单动态绑定数据。 用过 Spinner 的读者都知道,原生的 Spinner 在 onSelectItem 回调中存在延迟的 bug,虽然延迟只有 100ms,但对于哼哧哼哧地装载、绑定、协调表单数据的多级联动表单来说,实在是致命的错误。 因而在那天晚上加班改需求的时候,我非常盼望着找到一款当下就可以使用的 PopupWindow + RecyclerView 实现的第三方 Spinner 开源库。 ...

May 19, 2019 · 1 min · jiezi

如何将-GitHub-中的项目导入到-stackblitzcom-中

如何将一个 GitHub 中的项目导入到 stackblitz.com 中,然后开始编辑和编译呢? 例如,我们有一个项目在 GitHub 中的地址为:https://github.com/cwiki-us-a... 如何将这个项目导入到 stackblitz.com 中进行编辑和测试呢? 首先你需要在 stackblitz.com 中注册一个用户名和密码。 你可以可以使用你 GitHub 的用户名进行关联。 当你注册成功后,你可以访问下面的地址:https://stackblitz.com/github... 这个地址将会自动将 GitHub 中的 https://github.com/cwiki-us-a... 项目导入到编辑器中。 显示的界面如下: 请注意,stackblitz 是通过 URL 来进行项目导入的。 官方的说明连接如下:https://stackblitz.com/docs#i... 简单来说,是使用下面的链接,告诉 stackblitz 到哪里去获取源代码。 stackblitz.com/github/{GH_USERNAME}/{REPO_NAME} 如果你还希望使用分支,那么可以使用下面的链接: .../github/{GH_USERNAME}/{REPO_NAME}/tree/{TAG|BRANCH|COMMIT}

May 18, 2019 · 1 min · jiezi

Java设计模式综合运用门面模版方法责任链策略

引言:很久没有更新了,主要是工作忙。最近,工作中一个子系统升级,把之前不易扩展的缺点给改进了一下,主要是运用了几个设计模式进行稍微改造了一下。本文也同步发布至简书,地址: https://www.jianshu.com/p/962...1.项目背景在公司的一个实际项目中,需要做一个第三方公司(以下简称GMG)的系统集成工作,把该公司的一些订单数据集成到自己公司平台下,各个订单具有一些共性,但是也有其特有的特征。 经过设计,目前我把订单分为POLICY和BOB类型(暂且这么说吧,反正就是一种订单类型,大家参照着看就OK)。 在订单数据集成到公司平台前,需要对订单数据进行一些必要的业务逻辑校验操作,并且每个订单都有自己的校验逻辑(包含公共的校验逻辑)。 本节介绍的便是整个订单集成系统中的校验逻辑在综合利用设计模式的基础上进行架构设计。 2.校验逻辑本校验逻辑主要分为四个部分: 校验文件名称(RequestValidator.validateFileInfo)校验文件内容中的概要部分(RequestValidator.validateSummary)校验文件内容中的列名称(RequestValidator.validateHeaders)校验文件内容中的明细(RequestValidator.validateDetails)其实上面的RequestValidator的实现逻辑最后都是委托给RequestValidationFacade这个门面类进行相应的校验操作。 3.实现细节3.1 domain介绍主要分为RequestFile和RequestDetail两个domain,RequestFile接收泛型的类型(即RequestFile), 使得其子类能够自动识别相应的RequestDetail的子类。RequestFile为抽象类,定义了以下抽象方法,由子类实现: //由子类实现具体的获取文件明细内容public abstract List<T> getRequestDetails();//由子类实现具体的获取workflow的值public abstract WorkflowEnum getProcessWorkFlow();//由子类实现文件列字段名列表public abstract String[] getDetailHeaders();RequestDetail及其子类就是workflow对应文件的明细内容。 3.2 WorkflowEnum枚举策略本例中如下规定: workflow为WorkflowEnum.POLICY对应文件名为:csync_policy_yyyyMMdd_HHmmss_count.txtworkflow为WorkflowEnum.BOB对应文件名为:csync_bob_integration_yyyyMMdd_HHmmss_count.txt以上校验逻辑在AbstractRequestValidation类相应的子类中实现(validateFileName方法),其实这个枚举贯穿整个校验组件,它就是一个针对每个业务流程定义的一个枚举策略。 3.3 涉及到的设计模式实现思路3.3.1 门面模式在客户端调用程序中,采用门面模式进行统一的入口(门面模式讲究的是脱离具体的业务逻辑代码)。门面模式封装的结果就是避免高层模块深入子系统内部,同时提供系统的高内聚、低耦合的特性。 此案例中,门面类为RequestValidationFacade,然后各个门面方法的参数均为抽象类RequestFile,通过RequestFile->getProcessWorkFlow()决定调用AbstractRequestValidation中的哪个子类。 AbstractRequestValidation类构造方法中定义了如下逻辑: requestValidationHandlerMap.put(this.accessWorkflow(),this.accessBeanName());把子类中Spring自动注入的实体bean缓存到requestValidationHandlerMap中,key即为WorkflowEnum枚举值,value为spring bean name, 然后在门面类中可以通过对应的枚举值取得BeanName,进而得到AbstractRequestValidation相应的子类对象,进行相应的校验操作。 注:这边动态调用到AbstractRequestValidation相应的子类对象,其实也是隐藏着【策略模式】的影子。 类图如下: 3.3.2 模版方法模式在具体的校验逻辑中,用到核心设计模式便是模版方法模式,AbstractRequestValidation抽象类中定义了以下抽象方法: /** * validate the file details * @param errMsg * @param requestFile * @return */ protected abstract StringBuilder validateFileDetails(StringBuilder errMsg,RequestFile requestFile); /** * validate the file name * @param fileName * @return */ protected abstract String validateFileName(String fileName); /** * return the current CSYNC_UPDATE_WORKFLOW.UPDATE_WORKFLOW_ID * @return */ protected abstract WorkflowEnum accessWorkflow(); /** * return the current file name's format ,such as: csync_policy_yyyyMMdd_HHmmss_count.txt * @return */ protected abstract String accessFileNameFormat(); /** * return the subclass's spring bean name * @return */ protected abstract String accessBeanName();以上抽象方法就类似我们常说的钩子函数,由子类实现即可。类图如下图所示: ...

May 18, 2019 · 2 min · jiezi

小猿圈Web之前端学习应具体掌握哪些内容

学习不能好高骛远,须一步一个脚印;进步不能一步登天,须一步一级台阶。 一、就业前景 Web前端就业前景分析 大数据直观显示,Web前端开发依然值得大家选择的职业。目前各个企业对于这块的人才稀缺量比较大,可以说这块是有市场的,和其他的行业相比它还没有达到饱和状态,所以说这方面的岗位也是很好就业的。 二、学习内容 对于想学习web前端的同学来说,不知道该学哪些,从哪里着手,按照什么顺序学习,这是很多新同学普遍会遇到的问题,目前国内大学课程里面,很少单独开web前端这门课程,但是网上有很多免费的视频去学习!怎么才能更好的去学习,怎么学才能熟练使用ps切图、熟练掌握html+css布局等,都是值得好好去思考的,掌握正确方向才能进行更深入的学习、实践并且勤加练习!Web前端主要学习哪些内容呢? 第一阶段:前端页面重构:PC端网站布局、HTML5+CSS3基础项目、WebAPP页面布局; 第二阶段:JavaScript高级程序设计:原生JavaScript交互功能开发、面向对象开发与ES5/ES6、JavaScript工具库自主研发; 第三阶段:PC端全栈项目开发:jQuery经典特效交互开发、HTTP协议,Ajxa进阶与后端开发、前端工程化与模块化应用、PC端网站开发、PC端管理信息系统前端开发; 第四阶段:移动端项目开发:Touch端项目、微信场景项目、应用Vue.js开发WebApp项目、应用Ionic开发WebApp项目、应用React.js开发WebApp; 第五阶段:混合(Hybrid)开发:各类混合应用开发; 第六阶段:NodeJS全栈开发:WebApp后端系统开发。 如果你对前端开发感兴趣,那么请利用好你的课余或业余时间时间来学习这些技能,一旦你掌握了这些技能以后,进入web前端行业不是问题,当然,学习方法和学习技巧是十分重要的,如果你现在没有系统的学习方法,建议你在小猿圈上学习,个人感觉很不错,想要学习前端的,抓紧时间学起来吧,时间就是金钱,而且机会不等人,加油吧~

May 16, 2019 · 1 min · jiezi

小猿圈Web之前端开发学习路线及建议

人生在勤,不索何获。——张衡 很多人已经下定决心学习前端开发,但是学习很盲目,没有一个明确的目标,导致学了很长时间效果也没有很明显,最终放弃了,这个结果是我们最不想看到的结果,那么学习路线就十分重要了,好的学习路线对学习会引向成功之路,事半功倍,所以要明确,我该走哪个方向,我该学习什么,我怎么学习才会更好,下面小编说一下,web前端的学习路线,和针对学习路线有什么好的建议给你们。 第一阶段:HTML的学习 超文本标记语言(HyperText Mark-up Language 简称HTML)是一个网页的骨架,无论是静态网页还是动态网页,最终返回到浏览器端的都是HTML代码,浏览器将HTML代码解释渲染后呈现给用户。因 此,我们必须掌握HTML的基本结构和常用标记及属性。 HTML 的学习是一个记忆和理解的过程,在学习过程中可以借助Dreamweaver的“拆分”视图辅助学习。在“设计”视图中看效果,在“代码”视图中学本质, 将各种视图的优势发挥到极致,这种对照学习的方法弥补了单纯识记HTML标签和属性的枯燥乏味,想必对各位初学的宝宝们来说必定是极好的! 在学习了HTML之后,我们只是掌握了各种“原材料”的制作方法,要想盖一幢楼房就还需要把这些“原材料”按照我们设计的方案组合布局在一起并进行一些样式的美化。 第二个阶段:CSS的学习 CSS是英文Cascading Style Sheets的缩写,叫做层叠样式表,是能够真正做到网页表现与内容分离的一种样式设计语言。相对于传统HTML的表现而言其样式是可以复用的,这样就极大地提高了我们开发的速度,降低了维护的成本。 同时CSS中的盒子模型、相对布局、绝对布局等能够实现对网页中各对象的位置排版进行像素级的精确控制。通过此阶段的学习,我们就可以顺利完成“一幢楼房”的建设。 “楼房”建设完成之后,我们可以交给用户使用,但是如果想让用户获得更佳的体验,我们还可以对“楼房”进行更深一步的“装修”,让它看起来更“豪华”一些。 第三个阶段:javascript的学习 JavaScript是一种在客户端广泛使用的脚步语言,在JavaScript当中为我们提供了一些内置函数、对象和DOM操作,借助这些内容我们可以来实现一些客户端的特效、验证、交互等,使我们的页面看起来不那么呆板,给人眼前一亮的体验。 此时,也许你还沉浸在JavaScript给你带来的惊喜之中,但你的项目经理却突然对你大吼道 “这个效果在××浏览器下不兼容,重新搞……” “不兼容?”瞬间石化了有木有? “我擦,坑爹啊!那可是花了我一个晚上写了几百行代码搞定的啊,吐血了都!” JavaScript的兼容性和复杂性有时候的确让我们头疼,还好有“大神”帮我们做了封装。 第四个阶段:jQUery的学习 jQuery 是一个免费、开源的轻量级的JavaScript库,并且兼容各种浏览器(jQuery2.0及后续版本放弃了对IE6/7/8浏览器的支持),同时现在有很多基于jQuery的插件可供选择,这样在我们实现一些丰富的动态效果时更方便快捷,大大节省了我们开发的时间,提高了开发速度,这也充分体现了其 write less,do more的核心宗旨。这个Feel倍儿爽!有么有? “豪华大楼”至此拔地而起,但是每天这样日复一日,年复一年的盖楼,好繁琐!能不能将大楼里面每一个单独部件模块化,当需要盖楼时就像堆积木一样组合在一起,这样岂不是爽歪歪?可以实现吗?答案是肯定的。 这种思想在Web前端开发中也是适合的,于是乎就出现了各种前端框架,在这里推荐给大家的是Bootstrap。 Bootstrap是Twitter推出的一个开源的用于前端开发的工具包,是一个CSS/HTML框架,并且支持响应式布局。一经推出后颇受欢迎,一直是github上的热门开源项目。 在项目开发过程中,我们可以借助Bootstrap提供的CSS样式、组件、JavaScript插件等快速的完成页面布局和样式设置,然后再有针对性的微调样式,这样基于框架进行开发大大缩短了开发周期。站在巨人的肩膀上就是爽! 建议: 首先,任何技术实际都是从零基础开始的,不管是直接学习还是通过相近经历转行。所以不需要因零基础担心。 其次,一定要做好准备:一项技术的学习,意味着你各方面资源不同程度的消耗——时间、工具、资金,甚至融入相关交流圈子的准备。在这个准备过程中,最好是带有一个强硬的目标:“我要在一个月内达到能够实现XXX的水平”或者“我一定要在2周内把XXX项目完成”。如果没有这个规划,一般人都会越来越懒惰,最终放弃。 然后,选准一个或多个老师。这个老师,可以是一个页面,一本书,也可以是一个真实的人。对于前端这块来说,个人的理解是读十本书不如写一个页面,而我本人也是实实在在地硬着头皮一个标签一个标签百度出来的。只有在实际去写的时候,才会出现各种问题,只有在凭自己的思考来解决这些问题的时候,才会得到非常深刻的印象,把相关知识真正转变为自己的。 学习路线和学习方法决定一个人掌握一门技能的效率,有的人几个月,有的人几年也不一定可以掌握,小编希望看到我的文章后有一个明确的方向,学习的方法,然后在定一个目标,逐渐去实现它,这样的学习才是最有效率的学习,希望你在前端的道路上越走越远,可以关注小编成为好朋友,小编也从那个阶段过来的,可以相互学习,相互进步!

May 16, 2019 · 1 min · jiezi

OPPO数据中台之基石基于Flink-SQL构建实数据仓库

本文整理自 2019 年 4 月 13 日在深圳举行的 Flink Meetup 会议,分享嘉宾张俊,目前担任 OPPO 大数据平台研发负责人,也是 Apache Flink contributor。本文主要内容如下: OPPO 实时数仓的演进思路;基于 Flink SQL 的扩展工作;构建实时数仓的应用案例;未来工作的思考和展望。一.OPPO 实时数仓的演进思路 1.1.OPPO 业务与数据规模 大家都知道 OPPO 是做智能手机的,但并不知道 OPPO 与互联网以及大数据有什么关系,下图概要介绍了 OPPO 的业务与数据情况: OPPO 作为手机厂商,基于 Android 定制了自己的 ColorOS 系统,当前日活跃用户超过 2 亿。围绕 ColorOS,OPPO 构建了很多互联网应用,比如应用商店、浏览器、信息流等。在运营这些互联网应用的过程中,OPPO 积累了大量的数据,上图右边是整体数据规模的演进:从 2012 年开始每年都是 2~3 倍的增长速度,截至目前总数据量已经超过 100PB,日增数据量超过 200TB。要支撑这么大的一个数据量,OPPO 研发出一整套的数据系统与服务,并逐渐形成了自己的数据中台体系。 1.2.OPPO 数据中台 今年大家都在谈数据中台,OPPO 是如何理解数据中台的呢?我们把它分成了 4 个层次: 最下层是统一工具体系,涵盖了"接入 - 治理 - 开发 - 消费"全数据链路;基于工具体系之上构建了数据仓库,划分成"原始层 - 明细层 - 汇总层 - 应用层",这也是经典的数仓架构;再往上是全域的数据体系,什么是全域呢?就是把公司所有的业务数据都打通,形成统一的数据资产,比如 ID-Mapping、用户标签等;最终,数据要能被业务用起来,需要场景驱动的数据产品与服务。以上就是 OPPO 数据中台的整个体系,而数据仓库在其中处于非常基础与核心的位置。 ...

May 14, 2019 · 4 min · jiezi

10秒钟构建你自己的造轮子工厂-2019年githubnpm工程化协作开发栈最佳实践

灵魂拷问:你有发布过npm包吗?发起过多人协作的github开源项目吗?据统计,70%的前端工程师从来没发布过npm包 对于初中级前端,维护开源项目是比较遥远的, 而前端工具的变化太快,高级前端也难以确定自己能写出开发栈的最佳实践,只能不断花时间摸索。 发起一个github/npm工程协作项目,门槛太高了!! 最基础的问题,你都要花很久去研究: 如何在项目中全线使用es2017代码? 答案是babel如何统一所有协作者的代码风格? 答案是eslint + prettier如何测试驱动开发,让项目更健壮? 答案是jest如何持续化集成,方便更多协作者参与项目? 答案是circleci这四样工具的配置,是每个github项目都会用上的。另外,gitignore配置editconfigreadmelisence。。。也是必不可缺的。 你可能需要花数天时间去研究文档、数天时间去做基础配置。 这样的时间成本,可以直接劝退大多数人。 然而,有的开发者,我们仰视的“神”,一年可以发上百个github/npm项目,其中更有几千上万的Star的大项目。 他们是正常人吗? 他们如何这样批量的造轮子的? 今天,这篇文章,让你第一次,拥有“神”的能力。 文章不是很长,但对你的前端生涯可能产生决定性影响,你会发现你与“神”之间的距离如此之近。 一切配置标准、正式、现代化。从此,你随手写的小工具、小函数,可以不断吸引协作开发者,膨帐成大型协作项目。就像当初的尤雨溪仿写angular时一样的起点。 你可以先来体验一下“轮子工厂”,在命令行输入: npx lunz myapp一路回车,然后试一试yarn lint,yarn test,yarn build命令 第一部分: 2019年github + npm工程化协作开发栈最佳实践 第二部分: 使用脚手架,10秒钟构建可自由配置的开发栈。 2019年github + npm工程化协作开发栈最佳实践我们将花半小时实战撸一个包含package.json, babel, jest, eslint, prettify, gitignore, readme, lisence的标准的用于github工程协作的npm包开发栈。 如果能实际操作,就实际操作。如果不能实际操作,请在bash下输入npx lunz npmdev获得同样的效果。 1. 新建文件夹mkdir npmdev && cd npmdev2. 初始化package.jsonnpm initpackage name: 回车version: 回车description: 自己瞎写一个,不填也行entry point: 输入`dist/index.js`test command: 输入`npx jest`git repository: 输入你的英文名加上包名,例如`wanthering/npmdev`keywords: 自己瞎写一个,不填也行author: 你的英文名,例如`wanthering`license: 输入`MIT`在package.json中添加files字段,使npm发包时只发布dist ...

May 13, 2019 · 7 min · jiezi

github-入门教程之-github-访问速度太慢怎么办

github 是全世界最流行的开源项目托管平台,其代表的开源文化从根本上改变了软件开发的方式. 基本上所有的需求都能从 github 上或多或少找到现成的实现方案,再也不用重头开始造轮子而是自定义轮子! 然而,有时候国内访问 https://github.com/ 速度太慢,如何加速访问 github.com 网站就成了刚需. 由于 github.com 网站位于美国旧金山,所以初始访问 github.com 时网络寻址会比较耗费时间,这也是网站打开速度慢的其中一个原因. 国外在线检测网站: https://www.ipaddress.com/最初用户从浏览器中输入 github.com 网址时,浏览器并不知道这个域名对应的真实 ip 地址,先问问自己电脑认识不认识这个域名的门牌号,如果本机不认识会接着往上问,当地运行商也不认识这个域名的话,继续问上级,直到问道 github.com 的门牌号是 192.30.253.113 为止! 如此繁琐的问路过程被称之为 DNS 寻址,如果问路的时间都占用很久,那么访问网站的速度自然会很慢. 所以,如果我们直接告诉浏览器目的地,那么浏览器也就不会一步一步去费劲问路了,这在一定程度上也就优化了访问网站的速度. $ ping github.com -c 3PING github.com (192.30.253.113): 56 data bytes64 bytes from 192.30.253.113: icmp_seq=0 ttl=41 time=405.924 ms64 bytes from 192.30.253.113: icmp_seq=1 ttl=41 time=346.654 ms64 bytes from 192.30.253.113: icmp_seq=2 ttl=41 time=345.485 ms--- github.com ping statistics ---3 packets transmitted, 3 packets received, 0.0% packet lossround-trip min/avg/max/stddev = 345.485/366.021/405.924/28.220 msping github.com -c 3 查看 github.com 网站的门牌号正常来说,网站的主域名下会存在多个子域名,由这些域名组合在一起提供完整的服务. ...

May 12, 2019 · 2 min · jiezi

swift5展示全球国家列表

CountryCodeList是swift5学习的一个项目。主要练习了UITableView的swift使用,使用HandyJson把从本地读取的json文件转化为数据模型数组。全球国家列表的数据来源是之前从一张全球国家列表的sql表中使用Python洗出来的数据,经过处理之后形成了一个Json文件。 每一个国家对象主要包括了:国家的英文名、国家的缩写、国际区号。 全球国家列表已经进过精心整理成JSON文件,数据对于要做面向海外开发的同学还是有一定帮助的,可以直接使用。demo地址 demo结构概览:效果图:

May 12, 2019 · 1 min · jiezi

手把手教你把项目上传到github上

原起为什么要把自己做的一些东西上传到github上?在软件行业竞争日益激烈的行情下,面试的时候,github上有高Star开源项目,绝对是个加分项。同时知识分享也是一种美德。这种双向受益的事,何乐而不为呢。下面就手把手教你把你自己做的项目上传到github上,让你在面试的时候脱颖而出。 项目上传github的步骤步骤快速一览: cd 到本地项目的根目录下git initgit add .git commit -m "提交说明"git remote add origin '你在github为该项目创建的仓库地址'git pull origin mastergit push -u origin master -f第一步:初始化git仓库cd到你的本地根目录下,执行git init,在你的项目下创建了一个git仓库。 第二步:将项目下的所有文件添加到git仓库在上一步的同级目录下执行git add .。提别提示,此步如果怕git add .出问题,可以先使用git status先查看那些文件被修改了,然后在分别添加就保险了,只是那样会比较麻烦,此处看个人习惯。 第三步:加add到缓存区的文件commit到本地仓库还是在刚才的目录,执行git commit -m "提交注释"。 第四步:去github上创建自己的Repository只有本地仓库肯定是不够的,这一步,我们就去github上创建仓库。在github上创建仓库的步骤如下: 第五步:将本地的仓库关联到github上git remote add origin https://github.com/ningjianwe...记得把上面的仓库地址换成你自己的仓库地址。 第六步:上传代码之前先pull以下github上的代码git pull origin master第七步:把代码push到github上git push -u origin master执行完后,如果没有异常,等待执行完就上传成功了,中间可能会让你输入Username和Password,你只要输入github的账号和密码就行了。 注意事项如果执行最后一步的时候报了类似下方的错, 不要慌,在第七步的命令后跟一个参数-f即可。 git push -u origin master -f这个时候会显示项目正在上传,等着上传完就可以在github上看到你的项目了。 温馨提示:不要忘记在github上添加你的SSHkey,这个请自行百度。

May 12, 2019 · 1 min · jiezi

ios-原生骨架库网络过渡动画封装

最新版 2.0.5,release版本目录关于 TABAnimated实现原理优点演变过程效果图安装 使用Cocoapods手动导入使用步骤扩展回调Tips属性相关强调最后关于 TABAnimatedTABAnimated的起源版本是模仿简书网页的骨架屏动态效果。在v1.9探索过模版模式,但是重复的工作量并不利于快速构建,而且两种模式的存在不合理,所以在v2.1删除了这种设定,但是模版模式的出现到删除,并不是没有收获,相反带来了更合理的实现方案,更便捷的构建方式。 实现原理TABAnimated 需要一个控制视图,进行开关动画。该控制视图下的所有subViews都将加入动画队列。 TABAnimated通过控制视图的subViews的位置及相关信息创建TABCompentLayer。普通控制视图,有一个TABLayer表格视图,每一个cell都有一个TABLayerTABLayer负责管理并显示所有的TABCompentLayer。 当使用约束进行布局时,约束不足且没有数据时,致使subViews的位置信息不能体现出来,TABAnimated会进行数据预填充。 优点集成迅速零耦合,易于将其动画逻辑封装到基础库高性能,极少的内存损耗链式语法,方便快捷,可读性高完全自定制,适应99.99%的视图演变过程看不清楚可以放大一下 简单说明一下:第一张图:原有表格组件, 有数据时的展示情况第二张图:是在该表格组件开启动画后,映射出的动画组,相信你可以看出来,效果并不是很美观。第三张图:针对这个不美观的动画组,通过回调,进行预处理,下文进行说明 效果图| 动态效果 | 卡片投影 | 呼吸灯 | | ------ | ------ | ------ | | | | | | 闪光灯 | 分段视图 | 嵌套表格 || ------ | ------ | ------ | | | | | 安装使用 CocoaPodspod 'TABAnimated'手动导入将TABAnimated文件夹拖入工程 使用步骤您只需要四步 在 didFinishLaunchingWithOptions 中初始化 TABAimated还有其他的全局属性,下文用表格呈现。 **老用户注意:原TABViewAnimated已经改名为TABAnimated**如今的TABViewAnimated已经成为UIView的骨架对象 // init `TABAnimated`, and set the properties you need.[[TABAnimated sharedAnimated] initWithOnlySkeleton];// open log[TABAnimated sharedAnimated].openLog = YES;控制视图初始化tabAnimated普通view: ...

May 10, 2019 · 2 min · jiezi

一个简单的例子学会github-repository的webhook

github的webhook是个有用的功能,允许开发人员指定一个服务器的url。当开发者对github仓库施加操作,比如提交代码,创建issue时,github网站会自动向该url指定的服务器推送事件。借助webhook,我们可以实现很多自动化流程。比如部署一个应用在AWS上,本地提交代码后,github网站自动触发webhook,调用AWS上应用的逻辑,在AWS上将本地提交的最新代码用git pull抓取到AWS上并重新部署。 下面我们通过一个具体的例子来学习github webhook的用法。 新建一个github仓库,点击Settings链接: 在Payload url里指定一个应用的url,该url对应的应用监听github网站推送的事件。 Content Type指定成application/json便于我们在nodejs应用里解析payload。 创建后点Add webhook保存,github会发送一个json paload到这个url指定的应用上。 在Recent Deliveries里查看负载明细: 负载明细如下: 我们现在来做个实验,把webhook指定的url对应的应用设置一个断点,然后在github仓库里新建一个issue: 断点立即触发了。 从调试器里能观察到这个create issue事件的所有负载。 我部署在AWS上监听github webhook框架推送github repository发生变化的事件的应用源代码,可以从我的github上获取:https://github.com/i042416/we... 代码很短,我的同事Haytham写的: var http = require('http')var createHandler = require('github-webhook-handler')var handler = createHandler({ path: '/push', secret: 'dis-koi' }) function run_cmd(cmd, args, callback) { var spawn = require('child_process').spawn; var child = spawn(cmd, args); var resp = ""; child.stdout.on('data', function(buffer) { resp += buffer.toString(); }); child.stdout.on('end', function() { callback (resp) });}http.createServer(function (req, res) { handler(req, res, function (err) { res.statusCode = 404 res.end('no such location') })}).listen(8083) handler.on('error', function (err) { console.error('Error:', err.message);}) handler.on('push', function (event) { switch(event.payload.repository.name) { case 'githubHook': //this push event is from my persional github account, as SAP github.tool's github hook do not work, so I use this one to test push event console.log("reveive a push event from githubHook"); run_cmd('sh', ['./webshop.sh'], function(text){ console.log(text) }); break; case 'frontend-web': //push event from frontend-web console.log("reveive a push event from frontend-web"); run_cmd('sh', ['./webshop.sh'], function(text){ console.log(text) }); break; case 'backend-ms': //push event from backenf-ms console.log("reveive a push event from backend-ms"); run_cmd('sh', ['./backend_ms.sh'], function(text){ console.log(text) }); break; }}) handler.on('issues', function (event) { console.log('Received an issue event for %s action=%s: #%d %s', event.payload.repository.name, event.payload.action, event.payload.issue.number, event.payload.issue.title);})要获取更多Jerry的原创文章,请关注公众号"汪子熙": ...

May 9, 2019 · 1 min · jiezi

DOS-Network与DUO-Network达成战略合作加速通证化加密衍生品的开发

各位亲爱的DOS Network的支持者和关注者,我们很高兴地宣布DOS网络已与DUO Network达成战略合作。双方将紧密合作,以促进和加速通证化加密衍生品的开发。 过去几年,加密市场迅速增长。然而,加密货币的迅速崛起伴随着以前未曾见过的波动性,阻碍了常规投资者和机构的进一步接受和投资,并且持续升高的价格波动已经成为现实世界采用区块链技术的主要障碍。 DUO Network团队认为,人们应该从传统金融市场中学到的是需要成熟的市场工具(如衍生品)来帮助管理波动性,增加流动性并对冲下行风险。 什么是DUO网络?DUO Network是一个去中心化的平台,可以进行通证化衍生产品的发行,交易和结算。它主要由抵押自治令牌(简称CAT),Price Oracle,DUO DEX组成。该平台旨在通过抵押智能合约和自治参考利率降低传统衍生品交易中的风险和障碍,从而创建透明和自主的衍生品市场。 DUO旨在解决当前加密市场中高波动性,流动性不足以及缺乏风险管理工具的问题。正如传统市场所见,衍生品市场的成功发展往往证明了标的资产类别的深度和成熟度。 什么是DOS网络?DOS网络一个支持多链的可扩展的去中心化预言机二层服务网络,为多个区块链网络提供实时数据传输和计算预言机解决方案。它使Dapps能够以安全有效的方式,通过链下分布式网络获取外部数据并执行复杂的计算,这将鼓励越来越多的应用场景出现在区块链上。 衍生品定价和交易的核心是对衍生品与底层证券对冲的能力,而底层证券的定价应具备一系列理想的特征 - 相关性,及时性和操纵性。但是,区块链授权的智能合约与现实中的互联网世界隔离,无法直接访问外部数据。 因此,作为DUO令牌生态系统的三个主要组成部分之一,数据传输预言机对DUO网络非常重要。DUO需要数据预言机为其提供时实时不可篡改的价位数据。 为何选择DOS网络?与其他预言机项目相比,DOS网络有 6 项主要的技术创新,使得与前面提到的理想特性完美匹配的价格数据能够以安全、可靠、高效和可扩展的方式提供给DUO Network: 网络去中心化:设计完全符合区块链思想,可以避免单点故障问题,无需信任第三方独立机构;实时可验证结果:数据结果可实时获取基本零延迟,并且通过密码学存储,可在链上验证数据正确性;完美多链兼容:轻量级链上接口,密码学共识于链下完成,可服务所有主流公链;极强的安全性:可验证的随机数引擎及加密签名技术,保证服务网络结果的可靠性;高拓展性低成本:由多节点于链下完成可靠数据获取或复杂计算,高性能却降低链上开销;正向奖励机制:服务网络中完成数据获取或计算任务的诚实节点将获得奖励激励。与DUO Network合作,DOS网络的服务范围将大大扩展。DUO Network将成为DOS网络早期的采用者之一,并将成为DOS网络数据预言机的重要客户。随着DOS网络的Beta版即将上线,DUO Network将在未来提供全面支持,甚至加入我们的DOS网络作为节点运营商。 DOS网络和DUO网络将密切合作,实现资源共享,实现合作共赢。双方将致力于通过抵押智能合约和分布式的数据预言机来降低传统衍生品交易中的风险和障碍,从而加速通证化加密衍生品的开发并促进Dapps的大规模采用。 END -如果你对DOS Network感兴趣,欢迎添加小助手(dosnetwork001)进入社区! 关于DOS NetworkDOS Network 是一个实现了去中心化预言机的可扩展的二层网络,为主流区块链提供数据上链服务和计算力。它将区块链智能合约与真实世界的数据和事件连接起来,还为区块链提供可验证的计算能力,从而使更多应用场景能够在区块链上实现。可支持各种主流区块链,如 Ethereum、EOS、TRON、ThunderCore、Ultrain、QuarkChain 等。 官方网站:https://dos.network/中文电报群:https://t.me/dosnetwork_cn英文电报群:https://t.me/dosnetwork_enTwitter:https://twitter.com/DOSNetworkMedium:https://medium.com/@dosnetworkGithub:https://github.com/DOSNetwork

May 9, 2019 · 1 min · jiezi

反思搭建博客时出现的emacs问题

第一个问题本地执行bundle exec jekyll serve命令时,本地启了一个服务器,只要在浏览器上访问localhost:4000就可以显示,博客文章。之后使用git命令,更新到个人github仓库后。使用username.github.io访问发现,跟本地localhost:4000内容不一致。 诶怎么会这样?想了许久,直到我无意间在github展示博客的仓库上的设置里,去选择了博客主题。选择了也更改了仓库内容。但我本地没有同步更新,所以使用git pull 拉取github仓库上的内容,融合过程进入了编辑器模式。我并不想更改东西,只想快点退出编辑模式。 我一开始自己认为进入的vi编辑器,当时认知是这样,根本没有怀疑过自己的想法从何而来。按ESC,以为是命令模式,然后输入wq!回车,发现根本没用,自己大脑就好像凭着感觉随意输入,看看碰碰运气。试了一会,但想起计算机科学家吴军老师送给我们读者的一段话,”注意你的态度,因为它决定你的想法....“,好吧,既然遇到了点麻烦,就正面解决它才是最节约时间的。 冷静一会,事情的出现总有原因吧。出现这结果前提条件是什么?总有依赖的环境吧,不然怎么会出现。我就耐心阅读编辑器的英文如果截图上的Debugger什么的。不知道怎么输入,发现了这是调式模式,我就谷歌,搜索”Mac vi 调式模式“关键词,发现没有我要的答案。就在想,我自己再进入一个vi编辑器,vi index.html诶,发现按下ESC,输入wq!回车是可以退出的。我就猜测也许这不是vi编辑器。运气很好,果然不是vi编辑器,感谢终端的标题。 原来答案早在终端的标题上了,我进入的emacs编辑器,终于问题锁定了,就去谷歌,看看使用什么命令可以退出emacs编辑器。 问题终于解决,我回过想想,我是怎么解决的?起码一开始态度是正确的,这段时间不干别的事就思考如何怎么解决出现无法退出编辑器的问题。这个过程一开始没有想到就搜索一些vi、deugger mode、mac这些关键词,都没有结果,当时根本的方向在哪里都不知道,只知道要退出这个编辑模式。直到锁定了emacs编辑器,才知道,要往这个方向去解决。 当时有一种说不出感觉,一定有因果关系,就觉得事情发生了总有原因,大方向是什么?不能凭感觉搜索什么就什么吧。就感觉我自己被很细节的事情困住了,完全不知道身在何方,我内心想说,我得知道我身在何方吧。隐约想起吴军老师的话,技术的依赖条件,你说屏幕上显示这东西,肯定依赖什么才会出现的。当时想到是vi编辑器,进入了编辑模式,那么我就去查vi的使用手册,也在终端输入了vi --help。解决这个问题真的有偶然性,要不是无意间看到两个截图上的标题,我还没有幡然醒悟。 第二个问题当时自己username.github.io早就已经写了index.html,然后通过jekyll new blog再复制进usename.github.io仓库上,其实一开始,我就应该直接jekyll new username.github.io,然后推送到个人仓库上的。 发现自己并不太能描述问题,描述问题能力差。描述问题有待提高。 总结自己解决问题的思维方式完全没有形成好的依据理论。此刻想起得到专栏,解决问题的四个步骤。第一个明确和理解问题、第二个是拆分和定位问题、第三个提出解决方案、第四个总结问题。 当平时的行为产生跟以往完全不同的结果时,想想这个问题跟之前的环境不一样。我一直以为这个是vi编辑器,按照以往的命令怎么也退不出,还会抱怨怎么回事。解决问题思维方式没有形成自己的一套。

May 7, 2019 · 1 min · jiezi

MaskRCNNBenchmarkPytorch版本训练自己的数据以及避坑指南

一、安装 地址:MaskRCNN-Benchmark(Pytorch版本) 首先要阅读官网说明的环境要求,千万不要一股脑直接安装,不然后面程序很有可能会报错!!! PyTorch 1.0 from a nightly release. It will not work with 1.0 nor 1.0.1. Installation instructions can be found in https://pytorch.org/get-start...torchvision from mastercocoapiyacsmatplotlibGCC >= 4.9OpenCV# first, make sure that your conda is setup properly with the right environment# for that, check that `which conda`, `which pip` and `which python` points to the# right path. From a clean conda env, this is what you need to doconda create --name maskrcnn_benchmarkconda activate maskrcnn_benchmark# this installs the right pip and dependencies for the fresh pythonconda install ipython# maskrcnn_benchmark and coco api dependenciespip install ninja yacs cython matplotlib tqdm opencv-python# follow PyTorch installation in https://pytorch.org/get-started/locally/# we give the instructions for CUDA 9.0conda install -c pytorch pytorch-nightly torchvision cudatoolkit=9.0export INSTALL_DIR=$PWD# install pycocotoolscd $INSTALL_DIRgit clone https://github.com/cocodataset/cocoapi.gitcd cocoapi/PythonAPIpython setup.py build_ext install# install apexcd $INSTALL_DIRgit clone https://github.com/NVIDIA/apex.gitcd apexpython setup.py install --cuda_ext --cpp_ext# install PyTorch Detectioncd $INSTALL_DIRgit clone https://github.com/facebookresearch/maskrcnn-benchmark.gitcd maskrcnn-benchmark# the following will install the lib with# symbolic links, so that you can modify# the files if you want and won't need to# re-build itpython setup.py build developunset INSTALL_DIR# or if you are on macOS# MACOSX_DEPLOYMENT_TARGET=10.9 CC=clang CXX=clang++ python setup.py build develop一定要按上面的说明一步一步来,千万别省略,不然后面程序很有可能会报错!!! ...

May 6, 2019 · 6 min · jiezi

Github-导航栏加强

由于 GitHub 的功能链接大部分在右上角的个人中心,每次看主页、仓库、gist、star 等都得点击头像才能显示功能链接,所以写了个油猴脚本将这些常用功能链接加在了导航栏中,便于更加方便的浏览 GitHub 的各个功能。 GitHub导航栏加强安装链接常用Chrome插件和油猴脚本

May 6, 2019 · 1 min · jiezi

解决Git-Pullpush每次都需要输入密码问题

如果我们 git clone 的下载代码的时候是连接的https://而不是git@git (ssh)的形式,当我们操作 git pull/push 到远程的时候,总是提示我们输入账号和密码才能操作成功,频繁的输入账号和密码会很麻烦。 1. 本地保存帐号密码git bash 进入你的项目目录,输入:git config --global credential.helper store 然后你会在你本地生成一个文本,上边记录你的账号和密码。当然这些你可以不用关心。然后你使用上述的命令配置好之后,再操作一次 git pull,然后它会提示你输入账号密码,这一次之后就不需要再次输入密码了。 2. 使用 SSH 连接Git Bash 进入 ssh 目录cd ~/.ssh生成 SSH key (文件名:id_rsa, id_rsa.pub) ssh-keygen -t rsa -C "xxxxxx@yy.com" #建议填写自己真实有效的邮箱地址文本编辑器打开公钥 id_rsa.pub 复制内容,添加到 Github setting。测试ssh -T git@github.comYou've successfully authenticated, but GitHub does not provide shell access.说明配置成功 本文作者: Shellming本文链接: https://shellming.com/2019/05/05/git-ssh-pwd/版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!

May 5, 2019 · 1 min · jiezi

用-Travis-CI-自动部署-Github-Pages

原文链接:用 Travis CI 自动部署 Github Pages 前言Github Pages 不能运行动态程序,只能输出一些静态内容。因此 Github Pages 非常适合用于前端项目的展示。可用于存放项目介绍、项目文档或者个人博客。本文介绍了怎么用 Travis CI 自动化部署 Github Pages。 关于 CI持续集成(Continuous integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。目前 github 开源项目用的较多的 CI 主要是 Circle CI 和 Travis CI,两者都是利用容器技术来适配不同项目环境。 (图一 CIrcle CI,图二 Travis CI) 步骤1. 安装 Github App在 Github Market Place 安装 Travis CI。安装时选择你想要的项目权限。<img src="https://s2.ax1x.com/2019/05/0...; width="50%" alt="ENCylT.png" title="ENCylT.png" /> 2. 配置 Github Token配置 Github Token 用于 Travis CI 对你项目的访问权限,配置完了之后 不要刷新页面,先点一下 Token 后面的复制按钮,因为你只能看见这个 Token 一次,刷新了它就没了 不得不赞一下 Github 的安全性 :+1: ...

May 4, 2019 · 2 min · jiezi

解决github提交代码没有绿色格子问题

今天发现github提交代码突然没有了格子更新,然后看了看问题所在原来是邮箱问题; 之前改过邮箱,so看图, 查看自己设置的邮箱是否与本地git提交的邮箱一直,不一致的话改一下 或者把你本地的邮箱改一下本地查看git日志 命令:git log git config --global user.email "example@norimaki.cn"

April 29, 2019 · 1 min · jiezi

如何管理多个-Github-账号的-ssh-key

背景通常我们有使用 Github、Gitlab,当 Github 或 Gitlab 下有多个账号,你会发现你的 ssh key 不够用了,因为站点会给你个提示: ssh key already in use github这个时候我们可以采用如下做法 生成多个公钥/私钥对对不同的域名配置不同的私钥实操生成多个公钥/私钥对ssh-keygen -t rsa -C "你的邮箱"用不同的邮箱创建不同的公钥/私钥对 添加私钥ssh-add '私钥路径'ssh-add 提示并将用户的使用的私钥添加到由ssh-agent 维护的列表中. 此后, 当使用公钥连接到远程 SSH 或 SCP 主机时,不再提示相关信息 创建配置文件在 .ssh 目录创建 config 文件,配置如下内容 # gitlab Host git.iboxpay.com HostName git.iboxpay.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa# github Host github2.com HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/feygh# github Host github.com HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa这个配置文件中 Gitlab 下的 ssh 通信都走 id_rsa 公钥加密,所以你在 Gitlab 仓库中要复制 id_rsa 这个公钥过去;值得注意的是,这里有两个 Github 配置,仔细观察下 HostName 都是 github.com,但是 Host 不一样,这就是关键之处。 ...

April 28, 2019 · 1 min · jiezi

AutoML数据增广

DeepAugment是一个专注于数据扩充的自动化工具。 它利用贝叶斯优化来发现针对您的图像数据集定制的数据增强策略。 DeepAugment的主要优点和特点是: 降低CNN模型的错误率(WRN-28-10显示CIFAR10的错误率降低了60%)通过自动化流程可以节省时间比谷歌之前的解决方案——AutoAugment——快50倍完成的包在PyPI上。你可以通过运行以下命令来在终端上安装它: $ pip install deepaugment你也可以访问项目的自述文件或运行谷歌Colab笔记本教程。要想了解更多关于我是如何构建这个的,请继续阅读! 引言数据是人工智能应用中最关键的部分。没有足够的标记数据常常导致过度拟合,这意味着模型将无法归纳为未发现的示例。这可以通过数据扩充来缓解,数据扩充可以有效地增加网络所看到的数据的数量和多样性。它是通过对原始数据集(如旋转、裁剪、遮挡等)应用转换,人为地生成新数据来实现的。然而,确定哪种增强对手头的数据集最有效并不是一项简单的任务。为了解决这个问题,谷歌去年发布了AutoAugment,它通过使用强化学习发现了给定数据集的优化增强。由于强化学习模块的存在,使用谷歌的AutoAugment需要强大的计算资源。由于获得所需的计算能力代价高昂,因此我开发了一种新的方法——DeepAugment,它使用贝叶斯优化而不是强化学习。 如何获得更好的数据努力改进数据质量通常比努力改进模型获得更高的投资回报。改进数据有三种主要方法:收集更多的数据、合成新数据或扩展现有数据。收集额外的数据并不总是可行的,而且可能很昂贵。GANs所做的数据合成是很有前途的,但也很复杂,可能与实际的例子有所不同。 另一方面,数据扩充简单且影响很大。它适用于大多数数据集,并通过简单的图像转换完成。然而,问题是确定哪种增强技术最适合当前的数据集。发现正确的方法需要耗时的实验。即使经过多次实验,机器学习(ML)工程师仍然可能找不到最佳选择。对于每个图像数据集,有效的增强策略是不同的,一些增强技术甚至可能对模型有害。例如,如果使用MNIST digits数据集,应用旋转会使模型变得更糟,因为在“6”上180度旋转会使它看起来像“9”,而仍然被标记为“6”。另一方面,对卫星图像应用旋转可以显著改善结果,因为无论旋转多少次,从空中拍摄的汽车图像仍然是一辆汽车。 DeepAugment:闪电般迅速的autoMLDeepAugment旨在作为一种快速灵活的autoML数据扩充解决方案。更具体地说,它被设计为AutoAugment的更快和更灵活的替代品。(2018年Cubuk等人的博客)AutoAugment是2018年最令人兴奋的发布之一,也是第一种使用强化学习来解决这一特定问题的方法。在本文发表时,AutoAugment的开源版本没有提供控制器模块,这阻碍了用户为自己的数据集使用它。此外,学习增强策略需要15,000次迭代,这需要巨大的计算资源。即使源代码完全可用,大多数人也无法从中受益。deepaugmented通过以下设计目标来解决这些问题:1.在保证结果质量的前提下,最小化数据扩充优化的计算复杂度。2.模块化和人性化。为了实现第一个目标,与AutoAugment相比,DeepAugment的设计具有以下差异: 使用贝叶斯优化代替强化学习(需要更少的迭代)(~100x加速)最小化子模型大小(降低每次训练的计算复杂度)(~20x加速)减少随机扩充搜索空间设计(减少所需的迭代次数)为了实现第二个目标,即使DeepAugment模块化和人性化,用户界面的设计方式为用户提供了广泛的可能性配置和模型选择(例如,选择子模型或输入自设计的子模型,请参阅配置选项)。 设计扩充策略DeepAugment旨在为给定的图像数据集找到最佳的扩充策略。增强策略被定义为五个子策略的总和,这两个子策略由两种类型的增强技术和两个实值[0,1]组成,决定了每种增强技术的应用能力。我使用imgaug包实现了增强技术,imgaug包以其大量的增强技术(见下文)而闻名。 当多样化和随机应用时,增强是最有效的。例如,与其旋转每个图像,不如旋转图像的某些部分,剪切另一部分,然后对另一部分应用颜色反转。基于这一观察,Deepaugment对图像随机应用五个子策略之一(包括两个增强)。优化过程中,每个图像被五个子策略之一增强的概率(16%)相等,而完全不被增强的概率为20%。虽然这个策略设计受到了autoaugmented的启发,但有一个主要的区别:我没有使用任何参数来应用子策略的概率,以便使策略的随机性更低,并允许在更少的迭代中进行优化。 这个策略设计为贝叶斯优化器创建了一个20维的搜索空间,其中10个维度是分类(增强技术的类型),其他10个维度是实值(大小)。由于涉及到分类值,我将贝叶斯优化器配置为使用随机森林估计器。 DeepAugment如何找到最佳策略DeepAugment的三个主要组件是控制器(贝叶斯优化器),增强器和子模型,整个工作流程如下:控制器采样新的增强策略,增强器按新策略转换图像,子模型是通过增强图像从头开始训练。根据子模型的训练历史计算奖励。奖励返回给控制器,控制器使用此奖励和相关的增强策略更新代理模型(请参阅下面的“贝叶斯优化如何工作”一节)。然后控制器再次采样新策略,并重复相同的步骤。此过程循环,直到达到用户确定的最大迭代次数。控制器(贝叶斯优化器)是使用scikit- optimization库的ask-and-tell方法实现的。它被配置为使用一个随机森林估计器作为其基本估计器,并期望改进作为其获取函数。 贝叶斯优化是如何工作的贝叶斯优化的目的是找到一组最大化目标函数值的参数。 贝叶斯优化的工作循环可以概括为:1.建立目标函数的代理模型2.查找代理上执行得最好的参数3.使用这些参数执行目标函数4.使用这些参数和目标函数的得分更新代理模型5.重复步骤2-4,直到达到最大迭代次数有关贝叶斯优化的更多信息,请阅读高级的这篇解释的博客,或者看一下这篇综述文章。 贝叶斯优化的二维描述,其中x和y轴表示增强类型,点(i,j)处的颜色表示用增强i和j所增强的数据进行训练时CNN模型的精度。 贝叶斯优化的权衡目前用于超参数优化的标准方法有随机搜索、网格搜索、贝叶斯优化、进化算法和强化学习,按方法复杂度排序。在超参数优化的精度、成本和计算时间方面,贝叶斯优化优于网格搜索和随机搜索(参见这里的经验比较)。这是因为贝叶斯优化从先前参数的运行中学习,与网格搜索和随机搜索相反。当贝叶斯优化与强化学习和进化算法进行比较时,它提供了具有竞争力的准确性,同时需要更少的迭代。例如,为了学习好的策略,谷歌的AutoAugment迭代15,000次(这意味着训练子CNN模型15,000次)。另一方面,贝叶斯优化在100-300次迭代中学习良好的策略。贝叶斯优化的经验法则是使迭代次数等于优化参数的次数乘以10。 挑战及对策挑战1:优化增强需要大量的计算资源,因为子模型应该从头开始反复训练。大大减慢了我的工具的开发过程。 尽管使用贝叶斯优化使其更快,但优化过程仍然不够快,无法使开发变得可行。对策:我开发了两种解决方案。首先,我优化了子CNN模型(见下图),这是该过程的计算瓶颈。其次,我以更确定的方式设计了增强策略,使贝叶斯优化器需要更少的迭代。 设计子CNN模型。它在AWS p3.2x大型实例(带有112 TensorFLOPS的Tesla V100 GPU)上以32x32图像在约30秒(120个周期)的时间内完成培训。 挑战2:我在DeepAugment的开发过程中遇到了一个有趣的问题。在通过一遍又一遍地训练子模型来优化增强期间,它们开始过度拟合验证集。当我更改验证集时,我发现的最佳策略表现不佳。这是一个有趣的例子,因为它不同于一般意义上的过度拟合,即模型权重过度拟合数据中的噪声。对策:我没有使用相同的验证集,而是将剩余的数据和训练数据保留为“种子验证集”,并在每次子CNN模型训练时对1000个图像的验证集进行采样(参见下面的数据管道)。这解决了增强过度拟合问题。 如何集成到ML pipeline中DeepAugment发布在PyPI上。你可以通过运行以下命令来在终端安装它: $ pip install deepaugment并且使用方便: from deepaugment.deepaugment import DeepAugmentdeepaug = DeepAugment(my_images, my_labels)best_policies = deepaug.optimize()通过配置DeepAugment,可以获得更高级的用法: from keras.datasets import cifar10# my configurationmy_config = { "model": "basiccnn", "method": "bayesian_optimization", "train_set_size": 2000, "opt_samples": 3, "opt_last_n_epochs": 3, "opt_initial_points": 10, "child_epochs": 50, "child_first_train_epochs": 0, "child_batch_size": 64}(x_train, y_train), (x_test, y_test) = cifar10.load_data()# X_train.shape -> (N, M, M, 3)# y_train.shape -> (N)deepaug = DeepAugment(x_train, y_train, config=my_config)best_policies = deepaug.optimize(300)有关更详细的安装/使用信息,请访问项目的自述文件或运行Google Colab笔记本教程。 ...

April 28, 2019 · 1 min · jiezi

从B站的代码泄露事件中我们能学到些什么

先声明一下,本文不聊ISSUE中的七七八八,也不聊代码是否写的好,更不聊是不是跟蔡徐坤有关之类的吃瓜内容。仅站在技术人的角度,从这次的代码泄露事件,聊聊在代码的安全管理上,通常都需要做哪些事来预防此类事件的发生。同时,大家在阅读本文的时候,也可以深入思考下,自己团队是否也存在类似的问题,经过这次的事件,是否有必要针对性的做一些优化。 最小权限“最小权限”原则是我们在学习Linux用户管理时候经常被提到,并且被反复强调的内容。该原则是指每个程序和系统用户都应该具有完成任务所必需的最小权限集合。赋予每一个合法动作最小的权限,就是为了保护数据以及功能避免受到错误或者恶意行为的破坏。 在代码的安全管理上,“最小权限”原则同样适用。但是,从此次的代码泄露内容中可以看到,这一点做的并不好,一起来看看源自泄露代码的README介绍: 从说明中,可以知道这是一个后端项目的大仓库,每个业务线都通过文件夹的方式管理自己的业务模块。那也就是说,每个业务模块的人都是可以看到这个大仓库的。继续看README最后的负责人信息: 可以看到这个大仓库中包含了非常多的业务模块与相关负责人信息。 由于Git的权限管理都是对整个仓库的,无法精细化到具体的文件夹。换言之,对于这个大仓库的访问,其实是有非常多的人员可以拿到全量代码的,而其中有大部分代码可能并不是自己业务线的内容。可见,这个仓库的内容,对于代码自身的保护上,并没有做到最小权限控制。所以,当出现代码泄漏的时候、对于泄露范围就很难控制。可能一个小环节的过失,就会导致非常大的泄漏灾难。 配置分离配置与代码的分离,自云原生应用的流行开始,就一直被反复的强调。将配置内容隔离开之后,赋予代码的将仅仅是逻辑,对于各种与环境相关的敏感信息都应该被剥离出去,这就使得代码中将不再含有各种环境信息和敏感信息。同时,这么做也可以轻松的实现多环境的不同配置,这种实现方式与我们传统通过构建工具来实现的多环境是完全不同的。只有在严格分离了配置之后,才真正的可以实现:一次构建,多处运行的目标。基于构建工具实现的多环境部署,实质上多次构建,多处运行的结果,每个环境运行的介质只是上都不是同一个程序。 为什么要强调这一点呢?同样的,我们看看从网络上流出的一段代码片段: 如果这段代码是真实存在的话,那么配置管理和安全意识上确实就做得非常差了。 所以,对于配置中心的建设,大论大小团队,从安全角度上来说,都是非常重要的。何况在目前有大量开源配置中心的大背景之下,做到配置分离,是一件性价比非常高的事。如果做到这一点,那么即使代码有流出,对于重要密钥、数据库账户密码等等敏感信息也不会被泄露。 外部监控任何与安全相关的内容,都少不了监控。事前的所有策略,最终都有可能被一一击破,留给我们最后的一道防线就是在事件发生之后马上得将其堵住,以防止问题的扩大,而造成更大的损失。 在笔者知道这件事的时候,距离代码上传已经有6小时之久了。各类技术讨论群中几乎也都是相关信息的八卦。几乎每一次刷新页面,都是几百Star的增长。虽然处理的速度不能说快,但是没过多久,与之相关的仓库都开始无法访问。至于,是不是有做代码泄露扫描的监控,我们不得而知。因为,在扫描告警之后,对于代码的扩散控制,作为B站来说,本身是被动的,还是需要Github等仓库运营方来完成。所以,这中间到底哪一步慢了,我们无法考证。 不过这些都不重要,这里主要强调一点,除了管理上的防护之外,必须留一手外部监控,以快速的发现泄漏并采取措施。这块可能大部分开发人员不太了解,这边我就稍微提一下。做一下这个是不是很费劲? 对于很多中小团队来说,可能本身就没有什么人力去做这件事,那么是不是就没办法了呢?实际上,很多安全服务商,甚至一些大型互联网公司都有提供这样的产品服务,比如携程的Github Scan: 如果说,你连买这类产品的钱都不想出,那么顺手推荐一个开源项目可以参考一下:Github leaked patrol 最近,欢迎留言交流,说说大家所在团队对于代码的安全性都是如何做的?用了什么商业服务?或是用了什么开源软件?欢迎一起分享学习与进步!

April 27, 2019 · 1 min · jiezi

sum-函数性能堪忧列表降维有何良方

本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/mK1nav2vKykZaKw_TY-rtw Python 的内置函数 sum() 可以接收两个参数,当第一个参数是二维列表,第二个参数是一维列表的时候,它可以实现列表降维的效果。 在上一篇《如何给列表降维?sum()函数的妙用》中,我们介绍了这个用法,还对 sum() 函数做了扩展的学习。 那篇文章发布后,猫哥收到了一些很有价值的反馈,不仅在知识面上获得了扩充,在思维能力上也得到了一些启发,因此,我决定再写一篇文章,继续跟大家聊聊 sum() 函数以及列表降维。若你读后有所启发,欢迎留言与我交流。 有些同学表示,没想到 sum() 函数竟然可以这么用,涨见识了!猫哥最初在交流群里看到这种用法时,也有同样的想法。整理成文章后,能得到别人的认可,我非常开心。 学到新东西,进行分享,最后令读者也有所获,这鼓舞了我——应该每日精进,并把所学分享出去。 也有的同学早已知道 sum() 的这个用法,还指出它的性能并不好,不建议使用。这是我不曾考虑到的问题,但又不得不认真对待。 是的,sum() 函数做列表降维有奇效,但它性能堪忧,并不是最好的选择。 因此,本文想继续探讨的话题是:(1)sum() 函数的性能到底差多少,为什么会差?(2)既然 sum() 不是最好的列表降维方法,那是否有什么替代方案呢? 在 stackoverflow 网站上,有人问了个“How to make a flat list out of list of lists”问题,正是我们在上篇文章中提出的问题。在回答中,有人分析了 7 种方法的时间性能。 先看看测试代码: import functoolsimport itertoolsimport numpyimport operatorimport perfplotdef forfor(a): return [item for sublist in a for item in sublist]def sum_brackets(a): return sum(a, [])def functools_reduce(a): return functools.reduce(operator.concat, a)def functools_reduce_iconcat(a): return functools.reduce(operator.iconcat, a, [])def itertools_chain(a): return list(itertools.chain.from_iterable(a))def numpy_flat(a): return list(numpy.array(a).flat)def numpy_concatenate(a): return list(numpy.concatenate(a))perfplot.show( setup=lambda n: [list(range(10))] * n, kernels=[ forfor, sum_brackets, functools_reduce, functools_reduce_iconcat, itertools_chain, numpy_flat, numpy_concatenate ], n_range=[2**k for k in range(16)], logx=True, logy=True, xlabel='num lists' )代码囊括了最具代表性的 7 种解法,使用了 perfplot (注:这是该测试者本人开发的库)作可视化,结果很直观地展示出,随着数据量的增加,这几种方法的效率变化。 ...

April 27, 2019 · 2 min · jiezi

使用Python挖掘GitHub的流行趋势上

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:10min 在本文中,我们将探讨如何利用Python的强大功能来收集和处理来自GitHub的数据并使其准备好分析。 GitHub采用广泛使用的版本控制方法,通过在编程领域实现社交网络功能,将编码提升到最高水平。GitHub允许您创建代码存储库并提供多种协作功能,错误跟踪,功能请求,任务管理和维基。它拥有大约2000万用户和5700万个代码库(来源:维基百科)。这些统计数据很容易证明这是程序员最具代表性的平台。它也是几个开源项目的平台,这些项目为软件开发领域做出了巨大贡献。假设GitHub使用了最新的编程工具和技术,分析GitHub可以帮助我们检测最流行的技术。存储库在GitHub上的受欢迎程度是通过它从社区收到的提交数量来评估的。我们将在本文中使用GitHub API来收集具有最多提交数量的存储库的数据,然后发现其中最流行的技术。 范围和流程GitHub API允许我们获取有关用户提交的公共代码存储库的信息。它涵盖了许多开源,教育和个人项目。我们的重点是找到过去几个月的趋势技术和编程语言,并与过去几年的存储库进行比较。我们将收集有关存储库的所有元信息,例如: Name:存储库的名称Description:存储库的描述Watchers:人们关注存储库并获得有关其活动的通知Forks :用户将存储库克隆到自己的帐户Open Issues:提交的有关存储库的问题我们将使用这些数据,定性和定量信息的组合,来识别最新趋势和微弱信号。该过程可以通过下图中显示的步骤表示: 获取数据在使用API之前,我们需要设置授权。API允许您访问所有公开可用的数据,但某些端点需要用户权限。您可以使用应用程序设置创建具有某些特定范围访问权限的新令牌。范围取决于您的应用程序的需求,例如访问用户电子邮件,更新用户配置文件等。 密码授权仅在某些情况下需要,例如用户授权的应用程序访问。在这种情况下,您需要提供用户名或电子邮件以及密码。所有API访问均通过HTTPS进行,并可从https://api.github.com/ 域访问。所有数据都以JSON的形式发送和接收。 速率限制GitHub Search API旨在帮助查找特定项(存储库,用户等)。速率限制策略允许每次搜索最多1,000个结果。对于使用基本身份验证,OAuth或客户端ID和密钥的请求,您每分钟最多可以发出30个请求。对于未经身份验证的请求,速率限制允许您每分钟最多发出10个请求。 连接到GitHubGitHub提供了一个搜索端点,它返回与查询匹配的所有存储库。随着我们的进展,在分析的不同步骤中,我们将更改变量q(查询)的值。在第一部分中,我们将检索自2017年1月1日以来创建的所有存储库,然后我们将比较前几年的结果。 首先,我们初始化一个空列表结果,该结果存储有关存储库的所有数据。其次,我们使用API所需的参数构建get请求。我们每个请求只能获得100个结果,因此我们必须使用分页技术来构建完整的数据集。 results = []q = "created:>2017-01-01"def search_repo_paging(q):url = 'https://api.github.com/search/repositories'params = {'q' : q, 'sort' : 'forks', 'order': 'desc', 'per_page' : 100}while True:res = requests.get(url,params = params)result = res.json()results.extend(result['items'])params = {}try:url = res.links['next']['url']except:break在第一个请求中,我们必须将所有参数传递给请求中的方法。然后,我们为每个下一页创建一个新请求,可以在链接中找到包含所有其他参数的资源的完整链接。这就是我们清空params词典的原因。GET res.links'next'. res.  重复该操作,直到字典中没有下一页键。对于其他数据集,我们修改搜索查询的方式是从前几年检索存储库。例如,要从2015年获取数据,我们定义以下查询:res.links  q = "created:2015-01-01..2015-12-31"为了找到合适的存储库,API提供了大量的查询参数。使用限定符系统可以高精度地搜索存储库。从主搜索参数q开始,我们有以下选项: ...

April 25, 2019 · 2 min · jiezi

D2-日报-2019年4月23日

???? 新闻➡️ 疑似B站后端源码流出 juejin.im???? 开源项目➡️ gridsome/gridsome 非中文 watch 112 star 2835 fork 130 基于 Vue 的静态站点生成器,从 headless CMS、本地文件、API 构建支持 CDN 的站点 github.com➡️ nathancahill/split 非中文 watch 91 star 3903 fork 299 帮助实现可调整大小的分屏。基于 CSS,JS 只用于拖曳时重新计算 CSSy样式 github.com➡️ transloadit/uppy 非中文 watch 290 star 16380 fork 766 模块化的 JavaScript 文件上传器,可以和任何应用无缝集成 github.com➡️ Dawninest/jikeCalendar-macOS watch 2 star 46 fork 0 即刻黄历屏幕保护程序 github.com➡️ hzwer/LearningToPaint 非中文 watch 8 star 182 fork 17 绘画 AI github.com???? 分享➡️ Vue 的小奇技(第十三篇):在 Nuxt.js 中重定向 404 页面 juejin.im➡️ Web调试技术详解 juejin.im➡️ 前端时光机(神技) juejin.im???? 网站➡️ 秘迹搜索 一个不追踪你的搜索引擎,不会根据搜索关键词追踪用户,也不会通过历史搜索内容做广告推荐,它也没有在你的浏览器上种任何Cookie mijisou.com➡️ toolzl在线工具-让生活变得更有效率! 聚合了超过 150 个实用工具的在线工具资料箱 www.toolzl.com➡️ 非书资料管理系统 各类书籍光盘素材下载网站 202.38.93.29➡️ iData-知识检索 代替知网 www.cn-ki.net➡️ 小熊免费文件格式在线转换工具 免费在线转换Office文档,音视频文件,图像等各种文件格式 www.ofoct.com???? 工具➡️ ZhiMap 在线思维导图、电脑与手机微信里都能作图 zhimap.com☕️ 更优雅地阅读移至官网阅读我们精心排版之后的页面 《D2 日报 2019年4月23日》 ...

April 23, 2019 · 1 min · jiezi

RPC框架是啥之Java自带RPC实现,RMI框架入门

本博客 猫叔的博客,转载请申明出处学习系列RPC框架是啥?Java自带RPC实现,RMI框架入门首先RMI(Remote Method Invocation)是Java特有的一种RPC实现,它能够使部署在不同主机上的Java对象进行通信与方法调用,它是一种基于Java的远程方法调用技术。 让我们优先来实现一个RMI的RPC案例吧。 项目源码地址:RPC_Demo,记得是项目里面的comgithubrmi1、首先我们需要为服务端创建一个接口方法,而且这个接口最好继承Remotepackage com.github.rmi.server;import java.rmi.Remote;import java.rmi.RemoteException;/** * Create by UncleCatMySelf in 21:03 2019\4\20 0020 */public interface MyService extends Remote { String say(String someOne)throws RemoteException;}2、对于接口实现类,RMI接口方法定义必须显式声明抛出RemoteException异常,服务端方法实现必须继承UnicastRemoteObject类,该类定义了服务调用与服务提供方对象实现,并建立一对一的连接。package com.github.rmi.server;import java.rmi.RemoteException;import java.rmi.server.UnicastRemoteObject;/** * Create by UncleCatMySelf in 21:05 2019\4\20 0020 */public class MyServiceImpl extends UnicastRemoteObject implements MyService { protected MyServiceImpl() throws RemoteException { } public String say(String someOne) throws RemoteException { return someOne + ",Welcome to Study!"; }}3、这里我们还需要一个针对服务端的配置类,因为RMI的通信端口是随机产生的,因此有可能会被防火墙拦截。为了防止被防火墙拦截,需要强制制定RMI的通信端口,一般通过自定义一个RMISocketFactory类来实现。package com.github.rmi.config;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.rmi.server.RMISocketFactory;/** * Create by UncleCatMySelf in 21:15 2019\4\20 0020 */public class CustomerSocketFactory extends RMISocketFactory { public Socket createSocket(String host, int port) throws IOException { return new Socket(host, port); } public ServerSocket createServerSocket(int port) throws IOException { if (port == 0){ port = 8855; } System.out.println("RMI 通信端口 : " + port); return new ServerSocket(port); }}4、好了,这时你可以写出服务端的启动代码了。package com.github.rmi.server;import com.github.rmi.config.CustomerSocketFactory;import java.rmi.Naming;import java.rmi.registry.LocateRegistry;import java.rmi.server.RMISocketFactory;/** * Create by UncleCatMySelf in 21:07 2019\4\20 0020 */public class ServerMain { public static void main(String[] args) throws Exception { //注册服务 LocateRegistry.createRegistry(8866); //指定通信端口,防止被防火墙拦截 RMISocketFactory.setSocketFactory(new CustomerSocketFactory()); //创建服务 MyService myService = new MyServiceImpl(); Naming.bind("rmi://localhost:8866/myService",myService); System.out.println("RMI 服务端启动正常"); }}5、客户端的启动就相对比较简单,我们仅需要进入服务,并调用对应的远程方法即可。package com.github.rmi.client;import com.github.rmi.server.MyService;import java.rmi.Naming;/** * Create by UncleCatMySelf in 21:10 2019\4\20 0020 */public class ClientMain { public static void main(String[] args) throws Exception { //服务引入 MyService myService = (MyService) Naming.lookup("rmi://localhost:8866/myService"); //调用远程方法 System.out.println("RMI 服务端调用返回:" + myService.say("MySelf")); }}最后可以看看效果。 ...

April 22, 2019 · 1 min · jiezi

解决GitHub下载速度太慢的问题

方法一:从GitHub下载文件一直非常慢,查看下载链接发现最终被指向了Amazon的服务器,下载地址是http://github-cloud.s3.amazonaws.com/,从国内访问Amazon非常慢,所以总是下载失败,解决方法时更改host文件,使该域名指向香港的服务器:更改hosts文件:Windows更改C:WindowsSystem32driversetchosts文件,在文件中追加219.76.4.4 github-cloud.s3.amazonaws.com, 将域名指向该IP即可Mac执行 sudo vi /etc/hosts 追加 219.76.4.4 github-cloud.s3.amazonaws.com最后执行ipconfig /flushdns命令,刷新 DNS 缓存。方法二: https://www.ipaddress.com/ 使用 IP Lookup 工具获得下面这两个github域名的ip地址,该网站可能需要梯子,输入域名github.com和github.global.ssl.fastly.net后,分别获得对应的ip,比如192.30.xx.xx和151.101.xx.xx。准备工作做完之后,打开的hosts文件中添加如下格式,IP修改为自己查询到的IP:192.30.xx.xx github.com151.101.xx.xx github.global.ssl.fastly.net最后执行ipconfig /flushdns命令,刷新 DNS 缓存。修改后的下载速度能达到 200KB/S 以上。

April 20, 2019 · 1 min · jiezi

Node爬虫练手项目

First项目地址:Crawler-for-Github-Trending 项目中基本每一句代码都写有注释(因为就这么几行????),适合对Node爬虫感兴趣的同学入入门。Introduction50 lines, minimalist node crawler for Trending. 一个50行的node爬虫,一个简单的 axios, express, cheerio 体验项目。Usage首先保证电脑已存在node环境,然后 1.拉取本项目git clone https://github.com/ZY2071/Crawler-for-Github-Trending.gitcd Crawler-for-Github-Trendingnpm inode index.js2.或者下载本项目压缩包,解压cd Crawler-for-Github-Trending-master // 进入项目文件夹npm inode index.jsExamples当启动项目后,可以看到控制台输出Listening on port 3000!此时打开浏览器,进入本地服务 http://localhost:3000/dailyhttp://localhost:3000/time-language // time表示周期,language代表语言 例如:http://localhost:3000/daily // 代表今日 可选参数:weekly,monthlyhttp://localhost:3000/daily-JavaScript // 代表今日的java分类 可选参数:任意语言稍微等待即可看到爬取完毕的返回数据:[ { “title”: “lib-pku / libpku”, “links”: “https://github.com/lib-pku/libpku”, “description”: “贵校课程资料民间整理”, “language”: “JavaScript”, “stars”: “14,297”, “forks”: “4,360”, “info”: “3,121 stars this week” }, { “title”: “SqueezerIO / squeezer”, “links”: “https://github.com/SqueezerIO/squeezer”, “description”: “Squeezer Framework - Build serverless dApps”, “language”: “JavaScript”, “stars”: “3,212”, “forks”: “80”, “info”: “2,807 stars this week” }, …]More本项目仅供爬取体验,每次访问都会实时爬取数据,所以数据返回速度会比较慢,实际操作应该是定时爬取数据然后将数据存进数据库,数据从数据库返回从而提高数据返回效率。但项目很基础,可以作为以上各个node模块最基础的练手使用,希望可以帮到大家 ???? ...

April 20, 2019 · 1 min · jiezi

如何在github上传项目?(小白适用)

温馨提示:此文适用于不太想敲命令,想通过鼠标点击来上传github项目的小白们。安装Github Desktop 首先,在你的电脑上安装这个东东: 下载地址:https://desktop.github.com/ 记得安装和自己电脑对应的版本哦我这边安装的是windows版本在GitHub网页新建仓库 首先,在你的网页点击你的头像,点击Your Repositories进入仓库页面。 然后,就开始新建你自己的仓库啦! 现在我们新建了自己的仓库,然后去配置它~ 网页会弹出确认框,问你是否要打开链接去打开GitHub Desktop应用程序,我们按确认就好啦在Github Desktop配置仓库 首先,我们会看到弹出这个东东: 点击Clone之后,我们把自己的项目代码粘贴到刚刚配置的Local path路径中 然后,看到这个界面之后,一顿操作猛如虎:当当当!大功告成!快去GitHub网页看代码是不是成功放上去了 倘若有什么毛病的话,就点这个按钮试试(小白揣测大概是更新或者同步的作用):完~若有不足,请多指教,万般感谢!

April 19, 2019 · 1 min · jiezi

git创建新仓库相关配置

今天在github创建新仓库时遇到了很多意想不到的问题,查了很多东西才顺利地将自己的小项目保存到github上,因此在这记录一下配置过程。相关命令 - git clone [github仓库] - git init - git pull origin master - git remote add origin git@github.com:username/repository.git - git add . - git commit -m "" - git push origin master

April 18, 2019 · 1 min · jiezi

D2 日报 2019年4月18日

???? 新闻➡️ 今天,小程序正式支持 SVG juejin.im➡️ Facebook:公司曾「无意中上传」150 万用户邮件联系人 readhub.cn???? 开源项目➡️ NtesEyes/pylane 非中文 watch 7 star 164 fork 10 基于 gdb 的 Python 进程注入和调试工具 github.com➡️ wasmerio/python-ext-wasm 非中文 watch 7 star 469 fork 13 用于执行WebAssembly二进制文件的Python库 github.com➡️ zincPower/UI2018 watch 5 star 166 fork 22 安卓高级UI代码整理和博客代码Demo github.com➡️ holylovelqq/vue-unit-test-with-jest watch 0 star 10 fork 0 吃透本仓库,变身vue项目单体测试大神 github.com➡️ easychen/howto-make-more-money watch 399 star 5700 fork 691 程序员如何优雅的挣零花钱 github.com➡️ kyleneideck/BackgroundMusic 非中文 watch 109 star 5089 fork 223 macOS 音频工具,包含功能:自动暂停音乐、设置各个应用程序的音量、录制系统音频 github.com➡️ Ji4n1ng/OpenInTerminal 非中文 watch 3 star 265 fork 22 帮助你在 Finder 中快速打开 Terminal, iTerm 或者 Hyper 并且自动定位到当前文件夹 github.com???? 分享➡️ keep-alive + vuex 让缓存的页面灵活起来 juejin.im➡️ 5 款适合程序员的开源字体 juejin.im➡️ React-Router V5 尝鲜???????? - 个人文章 segmentfault.com➡️ 在 React Hooks 中如何请求数据? - 自然醒技术笔记 segmentfault.com➡️ Asynchronous programming. Blocking I/O and non-blocking I/O luminousmen.com➡️ vue客户端渲染首屏优化之道 juejin.im➡️ 一波Flutter酷炫特效来袭,持续更新 juejin.im???? 网站➡️ Generate Mozilla Security Recommended Web Server Configuration Files Mozilla 的在线 SSL 配置生成器,支持 Nginx、HAProxy、AWS ELB mozilla.github.io➡️ Easing Functions Cheat Sheet 各种 CSS 缓动曲线 easings.net➡️ 复联4电影票整蛊二维码 用朋友的名字生成一张复联4电影票,扫描即你输入的内容 knb.im➡️ StackBlitz 在线运行你的前端项目 stackblitz.com➡️ CaptionBot 微软出品的,一个会给你上传的图片或复制的图片链接生成注释的网站,本地上传一张图片之后程序会解读图片生成对应的“解读” www.captionbot.ai☕️ 更优雅地阅读移至官网阅读我们精心排版之后的页面 《D2 日报 2019年4月18日》⚙ 推荐产品详情访问 ????https://github.com/d2-projects/d2-admin???? 往期回顾您可以访问下面的链接浏览往期内容,或者模糊检索。https://daily.fairyever.com???? 日报提交分享你的发现和创造 投稿/提交方式???? 日报获取➡️ 官方官方网站 ????RSS ????Github | Releases➡️ 微信公众号扫描下方二维码关注“今日前端”公众号,看日报不迷路!????公众号文章版本经过特殊优化,以提高微信环境内的阅读体验。➡️ 社区主页掘金 ????即刻 ????Segmentfault简书开源中国CSDN ...

April 18, 2019 · 1 min · jiezi

D2 日报 2019年4月17日

???? 新闻➡️ Is React Translated Yet? ¡Sí! Sim! はい! react 文档翻译了多种语言 reactjs.org???? 开源项目➡️ formal/packages/formal-web at master · kevinwolfcr/formal React Hooks 版本的 rc-form,集成了 React 表单组件通用的的非受控值缓存、值校验等功能 github.com➡️ drcmda/react-three-fiber 非中文 watch 37 star 3240 fork 80 Three.js 在 React 上渲染的工具,可以用 React 组件语法完成 WebGL 渲染 github.com➡️ mokia/README.zh-cn.md at master · varHarrie/mokia 一个集成了数据模拟和HTTP服务的Mock工具。 github.com➡️ withspectrum/spectrum watch 128 star 6698 fork 543 社区系统 github.com???? 分享➡️ 对称加密与非对称加密 zhuanlan.zhihu.com➡️ 节流阀和去抖动的基本实现 - 个人文章 segmentfault.com➡️ 人类首张黑洞照片幕后英雄:29岁女算法工程师 www.infoq.cn➡️ 封装Vue组件的一些技巧 juejin.im➡️ 一文教你用 Neo4j 快速构建明星关系图谱 mp.weixin.qq.com???? 网站➡️ 在线文件转换器 在线转换视频,在线音频转换,在线图形转换,在线文档转换和在线压缩格式 cn.office-converter.com➡️ 好工具网 在线工具大全,用完即走,触手可及 www.nicetool.net➡️ 吾道幻灯片 专业演示文档制作工具,PPT模板,协同办公 www.woodo.cn➡️ React 官方中文文档 zh-hans.reactjs.org➡️ All effects - PhotoFunia: Free pic editor online with library of picture effects & photo filters 线编辑照片的工具,你可以给照片添加各种特效,给特定文字添加背景图 photofunia.com➡️ GIF之家 一个可以压缩 GIF 图片、制作 GIF、裁剪 GIF 的工具 tool.gifhome.com???? 工具➡️ MDX 支持使用 JSX 和 markdown 混合编写文档的格式 mdxjs.com➡️ 传送门 一个可以让你随时随地位置定位在国外、马尔代夫度假、塞班岛、印度尼西亚的虚拟定位软件 portal.pongj.com???? 设计➡️ Bg-patterns 背景パターン配布&作成サイト 矢量平铺背景纹理免费生成及免费下载 bg-patterns.com➡️ Share Icon - more than 250.000 free icons 非中文 免费提供超过 25 万 icon 矢量图片素材的站点 www.shareicon.net➡️ unDraw 一个插画网站,每幅画都是作者自己话的,不定时更新,大多都是扁平化PNG图 undraw.co➡️ Stockio.com - Download Free Vectors, Photos, Icons, Fonts and Videos 提供很多类型素材的一个网站,有照片,有图标,还有字体等 www.stockio.com➡️ Simple Icons 按颜色,对品牌logo进行分类的一个网站,我们可以在这个页面上,下载很多企业logo的素材 simpleicons.org➡️ Illustrations Gallery · ManyPixels 非中文 整套插画下载,可以用在网站上表达信息 gallery.manypixels.co➡️ Free icons by first-class designers 非中文 下载成套的 svg 图标 iconstore.co☕️ 更优雅地阅读移至官网阅读我们精心排版之后的页面 《D2 日报 2019年4月17日》⚙ 推荐产品???? 往期回顾您可以访问下面的链接浏览往期内容,或者模糊检索。https://daily.fairyever.com???? 日报提交分享你的发现和创造 投稿/提交方式???? 日报获取➡️ 官方官方网站 ????RSS ????Github | Releases➡️ 微信公众号扫描下方二维码关注“今日前端”公众号,看日报不迷路!????公众号文章版本经过特殊优化,以提高微信环境内的阅读体验。➡️ 社区主页掘金 ????即刻 ????Segmentfault简书开源中国CSDN ...

April 17, 2019 · 1 min · jiezi

D2 日报 2019年4月16日

???? 新闻➡️ 巴黎圣母院发生严重火灾,屋顶三分之二被烧毁 mp.weixin.qq.com➡️ 周鸿祎谈996:强制没有意义,我要不是老板也不一定能做到 juejin.im???? 开源项目➡️ xiaolai/public-speaking-with-meaning watch 20 star 338 fork 92 《我也有话要说》—— 普通人的当众讲话技能 github.com➡️ getgridea/gridea watch 19 star 730 fork 70 静态博客写作客户端 github.com➡️ lo-th/Oimo.js 非中文 watch 97 star 1817 fork 183 轻量级的 js 3D 引擎 github.com➡️ ctripcorp/CRN watch 18 star 567 fork 70 CRN是Ctrip React Native简称,由携程无线平台研发团队基于React Native框架优化,定制成稳定性和性能更佳、也更适合业务场景的跨平台开发框架。 github.com???? 分享➡️ 阿里毕玄:我在系统设计上犯过的 14 个错 mp.weixin.qq.com➡️ 程序员的黑砖窑,东南亚博彩骗局详解 mp.weixin.qq.com➡️ Apple跨越四十年的广告 www.yuque.com➡️ Web 性能优化:Preload,Prefetch的使用及在 Chrome 中的优先级 - 终身学习者 segmentfault.com➡️ 正确配置 Visual Studio Code 开发和调试 TypeScript - 优雅的前端 segmentfault.com???? 网站➡️ 书栈网 · BookStack_分享知识,共享智慧;知识,因分享,传承久远! www.bookstack.cn➡️ ZEIT Serverless 时代的极简美学 zeit.co➡️ 图片拼接工具 在线拼接电影字幕 screenshots.hpday.cn➡️ PDF派 一个实用的综合 PDF 编辑转换导航网站 www.pdfpai.com➡️ bookset 精品电子书免费下载 bookset.me???? 工具➡️ wonderbeyond/HitUP star 1 fork 18 Find top things in New Tab, including GitHub Trending Repositories. github.com➡️ SSR 免费EDU学术引擎 wangzi.edu.pl☕️ 更优雅地阅读阅读我们精心排版之后的页面 《D2 日报 2019年4月16日》???? 往期回顾您可以访问下面的链接浏览往期内容,或者模糊检索。https://daily.fairyever.com???? 提交分享你的发现和创造 投稿/提交方式???? 如何获取日报➡️ 官方官方网站 ????RSS ????Github | Releases➡️ 微信公众号扫描下方二维码关注“今日前端”公众号,看日报不迷路!????公众号文章版本经过特殊优化,以提高微信环境内的阅读体验。➡️ 社区主页掘金 ????即刻 ????Segmentfault简书开源中国CSDN ...

April 16, 2019 · 1 min · jiezi

GitHub+Hexo 搭建个人网站

一、创建GitHub Pages站点GitHub Pages是一种静态站点托管服务,旨在直接从GitHub仓库托管您的个人,组织或项目页面。每个GitHub帐户和组织都有一个站点。1.新建仓库访问GitHub官网 https://github.com 登陆GitHub账号,新建仓库,名称固定格式为: <username>.github.io其中username是GitHub上的用户名(或组织名称)如果仓库名称的第一部分与您的用户名不完全匹配,则无法正常工作,因此请务必正确使用。2.将仓库代码clone到本地使用SSH或HTTPS方式, 将仓库代码拉取到本地(SSH方式需要配置SSH keys, HTTPS方式需要输入账号密码) 3.本地新建index.html文件4.将本地代码推送到github5. 访问站点在浏览器中访问 http://&lt;username>.github.io, 即可访问到你的网站首页, 内容为你刚才新建的index.html文件二、自定义域名1.项目代码中设置自定义域名(创建CNAME文件)点击当前项目的【Settings】, 在【Custom domain】一栏输入你自定义的二级域名, 然后点【Save】此时会在你的项目根目录下会自动生成一个CNAME文件, 文件内容为你自定义的二级域名。2.域名解析中添加CNAME类型的解析记录登陆到你自己的域名管理后台,新增一条CNAME类型的域名解析记录, 内容如下:记录类型: CNAME主机记录: 自定义的二级域名记录值: <github用户名>.github.io保存后, 稍等几分钟,在浏览器访问你自定义的二级域名即可正常链接到你的github个人网站。三、Hexo搭建网站Hexo官网中文版 https://hexo.io/zh-cnHexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。1.安装Hexo(1) 安装依赖的应用程序:Node.js (最低支持版本6.9,下载地址: https://nodejs.org/en)Git (下载地址:https://git-scm.com/download)(2) 使用 npm 安装全局安装Hexo如果npm安装速度过慢, 可使用淘宝NPM镜像(http://npm.taobao.org) 代替npm$ npm install -g hexo-cli2.Hexo新建项目(1) 新建网站项目, 并安装依赖库在本地电脑上, 指定一个文件夹用于存放hexo项目代码, 执行以下指令:$ hexo init <folder>$ cd <folder>$ npm install新建完成后,指定文件夹的目录如下:.├── _config.yml├── package.json├── scaffolds├── source| ├── _drafts| └── _posts└── themes(2) 本地预览首先在当前项目下, 安装 hexo-server 模块npm install hexo-server –save安装完成后,输入以下命令以启动服务器,您的网站会在 http://localhost:4000 下启动。在服务器启动期间,Hexo 会监视文件变动并自动更新,您无须重启服务器。hexo server浏览器访问 http://localhost:4000, 即可访问网站首页。3.Hexo配置与部署(1) 修改配置文件_config.yml安装 hexo-deployer-git依赖库npm install hexo-deployer-git –save修改配置(改为你自己的GitHub项目地址, 并且确保GitHub已配置了你当前机器的SSH密钥)deploy: type: git repo: <repository url> #git@github.com:sufaith/sufaith.github.io.git branch: [branch] #master message: [message]repo: 库(Repository)地址branch: 分支名称。message: 自定义提交信息 (默认为 Site updated: {{ now(‘YYYY-MM-DD HH:mm:ss’) }})将url 修改为 您的站点网址 http://yoursite.com/(2) source目录下,创建CNAME文件CNAME文件的内容为你自定义的二级域名(3) 生成静态文件hexo generate#简写为:hexo g执行 hexo generate g命令后, 会在项目根目录下自动生成 public 文件夹, 该文件夹即是我们网站所需的静态文件。(4) 一键部署静态文件至github#先清除站点文件,然后重新生成站点文件并将之推送到指定的库分支hexo clean && hexo deploy#简写为:hexo clean && hexo d执行命令后, 成功将生成的静态文件推送到GitHub。(5) 访问网站在浏览器输入你自定义的二级域名, 即可正常访问到你用GitHub+Hexo搭建的网站。 ...

April 16, 2019 · 1 min · jiezi

袋鼠云研发手记 | 数栈·开源:Github上400+Star的硬核分布式同步工具FlinkX

作为一家创新驱动的科技公司,袋鼠云每年研发投入达数千万,公司80%员工都是技术人员,袋鼠云产品家族包括企业级一站式数据中台PaaS数栈、交互式数据可视化大屏开发平台Easy[V]等产品也在迅速迭代。在进行产品研发的过程中,技术小哥哥们能文能武,不断提升产品性能和体验的同时,也把这些提升和优化过程记录下来,现录入“袋鼠云研发手记”专栏中,以和业内童鞋们分享交流。下为“袋鼠云研发手记”专栏第二期,本期作者为袋鼠云数栈引擎团队。袋鼠云数栈引擎团队袋鼠云数栈引擎团队拥有多名专家级别,经验丰富的后端开发工程师,分别支撑公司大数栈产品线的不同子项目的开发需求,从项目中提取并开源了FlinkX(基于Flink的数据同步),Jlogstash(logstash 的java 版本实现),FlinkStreamSQL(扩展原生FlinkSQL,实现流与维表的join)多个项目。在长期的项目实践与产品迭代过程中,团队成员在 Hadoop技术栈上不断深耕探索,积累了丰富的经验与最佳实践。第二期数栈·开源Github上400+Star的「硬核」分布式同步工具FlinkXFlinkX 已经开源在Github上目前已获400+Star,查看地址:https://github.com/DTStack/fl…1、袋鼠云为什么要自研数据同步工具?袋鼠云作为一家数据智能公司,自研开发企业级一站式数据中台PaaS产品——数栈。关于数栈数栈具有8大产品模块离线/实时开发套件一站式大数据开发平台,帮助企业快速完全数据中台搭建分析引擎海量数据秒级查询,极速响应能力,帮助企业自由的数据探索数据质量对过程数据和结果数据进行质量校验,帮助企业及时发现数据质量问题数据地图可视化的数据资产中心,帮助企业全盘掌控数据资产情况和数据的来源去向数据模型使企业数据标准化,模型化,帮助企业实现数据管理规范化数据API快速生成数据API、统一管理API服务,帮助企业提高数据开放效率Easy[V]在线拖拉拽的方式快速搭建交互式数据可视化大屏,让数据价值看得见EasyManager全自动化,全生命周期的运维管家,提供安全稳定的数栈部署与监控服务其中,「数据同步」是数栈开发套件中一个非常重要的功能,我们对数据同步工具有3点要求:一是支持多种部署模式,比如测试单机部署,生产分布式部署。二要基于yarn,mesos或者k8s做资源调度,提高资源利用率。三要支持断点续传。因为在大数据量的传输场景下,由于网络出现抖动等原因,可能导致任务失败,那这个时候不可能重跑任务,这样太耗时了,需要从失败的点继续跑;当时,市面上,并没有满足以上三点要求的数据同步工具。2、为什么基于Flink?Flink是新型的计算框架,支持多种部署方式local(单机),standalone模式,也可以基于yarn,mesos或者k8s做资源调度;并且flink提供了比较高级的API,我们能比较方便地扩展现有的API来满足我们自己的特殊需求;而且Flink提供了完整的状态管理体系(checkpoint),断点续传就是基于checkpoint机制来实现的。数据同步工具对比3、FlinkX 概览FlinkX是在袋鼠云内部广泛使用的一个基于Flink的异构数据源离线同步工具,用于在多种数据源(MySQL、Oracle、SqlServer、Ftp、Hdfs,HBase、Hive、Elasticsearch等)之间进行高效稳定的数据同步。FlinkX简化了数据同步任务的开发过程,用户只需提供一份数据同步任务的配置,FlinkX会将配置转化为Flink任务,并自动提交到Flink集群上执行。作为一个面向分布式数据流处理和批量数据处理的开源计算平台,Flink具有分布式、低延迟、高吞吐和高可靠的特性。FlinkX实现了多种异构数据源之间高效的数据迁移4、FlinkX的设计思路2.1 插件式架构FlinkX采用了一种插件式的架构:不同的源数据库被抽象成不同的Reader插件;不同的目标数据库被抽象成不同的Writer插件;整个数据同步任务共有的处理逻辑被抽象在Template模块中,该模块根据数据同步任务配置加载对应的Reader和Writer插件,组装Flink任务,并提交到Flink集群执行;FlinkX支持任意数据源类型的数据同步工作FlinkX框架可以支持任意数据源类型的数据同步工作。作为一个开放式系统,用户可以根据需要开发新的插件,以接入新的数据库类型。2.2 Flink任务的自动组装Template模块根据同步任务的配置信息加载源数据库和目的数据库对应的Reader插件和Writer插件;Reader插件实现了InputFormat接口,从源数据库中获取DataStream对象;Writer插件实现了OutputFormat接口,将目的数据库与DataStream对象相关联;Template模块通过DataStream对象将Reader和Writer串接在一起,组装成一个Flink任务,并提交到Flink集群上执行。Flink任务的自动组装5、FlinkX的优势一、便于使用用户只需要提供一份数据同步配置信息,无需编写程序,FlinkX会配置信息自动转换为Flink任务并提交到Flink集群执行。二、性能优越FlinkX会将数据同步任务提交到Flink集群中的执行,使得FlinkX天然具有Flink的性能优势,主要表现为分布式、低延迟、高吞吐和高可靠。三、多运行模式同普通的Flink任务一样,FlinkX支持local、standalone和yarn三种运行模式。「local模式」就是在本地开启一个mini的Flink集群执行Flink任务,这种运行模式的好处是使用方便,不需要预先启动分布式集群,适用于测试和实验环境;缺点是由于单点执行,可靠性差,当数据量大时吞吐量受限;「standalone模式」是指以独立部署的方式启动一个Flink集群,然后将提交Flink任务到该集群上执行;「yarn模式」是指在yarn集群中部署Flink集群,然后将Flink任务提交到部署在yarn集群中的Flink集群上执行;standalone模式和yarn模式都是分布式地执行FlinkX,而yarn模式可以利用yarn的资源管理功能,因而成为部署FlinkX应用时的首选。四、开放式可扩展只要你愿意,你可以给任何类型的数据源开发Reader和Writer插件。五、错误控制和脏数据管理错误控制可以在数据同步配置信息中设置错误记录阈值、错误占比阈值,使得数据同步任务在出错时及时停止,避免系统资源的浪费。脏数据管理可以将错误记录、错误原因、错误类型输出到Hive表中,便于日后的排查工作。6、FlinkX在数栈产品中的应用使用数栈的数据开发套件,用户可以通过界面向导可视化的创建一个数据同步任务,而FlinkX正是数据同步的底层执行引擎。FlinkX在袋鼠云数栈产品中的应用

April 15, 2019 · 1 min · jiezi

D2 日报 2019年4月15日

???? 新闻➡️ 崇尚奋斗,不等于强制996 mp.weixin.qq.com???? 开源项目➡️ NVlabs/SPADE 非中文 watch 391 star 3137 fork 206 将粗糙涂鸦变成逼真画作的应用程序GauGAN github.com➡️ css-doodle/css-doodle 非中文 watch 32 star 1968 fork 85 一个用 css 来绘制图案 web 组件 github.com➡️ lukechilds/merge-images watch 16 star 765 fork 62 将多张图片合成一张图片 github.com➡️ jaywcjlove/github-rank watch 1 star 9 fork 1 GitHub 中国用户排行榜 github.com➡️ lvxianchao/the-fucking-github watch 0 star 1 fork 0 A Chrome extension for Github. View starred repositories, organizing stars, searching stars and searching repositories online for Github。 github.com➡️ mathdroid / crop-github-images-cli:为你的Github配置文件裁剪图像/ gif到swag中 star 3 fork 249 github.com➡️ java-aodeng/hope-plus star 20 fork 367 Hope-plus是一款权限管理系统。整合Springboot2,sso+mybatis+shiro+redis+thymeleaf+maven+swagger等实用技术。 github.com???? 分享➡️ 我建议你了解一点儿Serverless 码农翻身 mp.weixin.qq.com➡️ 前端高频面试题及答案汇总 juejin.im➡️ Vue CLI 3结合Lerna进行UI框架设计 juejin.im???? 网站➡️ Front-end Developer Handbook 2019 - Learn the entire JavaScript, CSS and HTML development practice! 非中文 前端开发手册 frontendmasters.com➡️ Firefox Monitor 帮助用户检查自己的信息是否被泄露 monitor.firefox.com???? 工具➡️ ApiPost - 可直接生成文档的API调试、管理工具 www.apipost.cn☕️ 更优雅地阅读阅读我们精心排版之后的页面 《D2 日报 2019年4月15日》???? 往期回顾您可以访问下面的链接浏览往期内容,或者模糊检索。https://daily.fairyever.com???? 提交分享你的发现和创造 投稿/提交方式???? 如何获取日报➡️ 官方官方网站 ????RSS ????Github | Releases➡️ 微信公众号扫描下方二维码关注“今日前端”公众号,看日报不迷路!????公众号文章版本经过特殊优化,以提高微信环境内的阅读体验。➡️ 社区主页掘金 ????即刻 ????Segmentfault简书开源中国CSDN ...

April 15, 2019 · 1 min · jiezi

springboot实战(一)

最近在看《JavaEE开发的颠覆者 Spring Boot实战》,顺便写了一个小框架,在这里作为记录,供以后回顾github:源码地址当前进度描述core 核心模块aop定义(aop包)日志切面异常切面抽象(base包)controller抽象,封装返回结果对象|controler异常通知器service抽象,为业务模块提供通用的业务逻辑,如增、删、改、查等mapper抽象,为业务模块提供通用的持久化逻辑,如增、删、改、查等。通过反射技术结合Mybatis的注解,提供通用的SQLentity抽象,定义通用的字段,如创建人、创建时间、修改人、修改时间、删除标识等通用工具Spring上下文工具Spring属性文件工具配置Http请求过滤器条件注入,根据配置文件中定义的spring.http.encoding的配置,动态创建CharacterEncodingFilter通用配置druid数据源、监视器配置动态数据源注册器 引入bean扫描目录的定义,扫描范围是com.wt 下属的所有包多数据源(datasource包)核心代码是DynamicDataSource,通过继承Springboot提供的DynamicDataSource,来实现多数据源定义了aop切面DynamicDattaSourceInterceptor,拦截方法调用,发现有指定的@TargetDataSource注解,就会将当前线程的数据源指定为注解指定的数据源多数据源相关的配置类,利用了Springboot的动态配置特性,定义spring.factories文件指定DynamicDataSourceConfiguration配置类,根据配置文件中的slave.enable的值决定是否加载动态数据源的相关配置反射工具j2ee 依赖管理,添加必要的web项目依赖root maven构建方式定义version 管理依赖的版本

April 15, 2019 · 1 min · jiezi

git常用命令

git // 添加指定文件到暂存区$ git add [file1] [file2] …// 添加指定目录到暂存区,包括子目录$ git add [dir]// 添加当前目录的所有文件到暂存区$ git add .// 删除工作区文件,并且将这次删除放入暂存区$ git rm [file1] [file2] …// 停止追踪指定文件,但该文件会保留在工作区$ git rm –cached [file]// 改名文件,并且将这个改名放入暂存区$ git mv [file-original] [file-renamed]// 提交暂存区到仓库区$ git commit -m [message]// 提交暂存区的指定文件到仓库区$ git commit [file1] [file2] … -m [message]// 列出所有本地分支$ git branch// 列出所有远程分支$ git branch -r// 列出所有本地分支和远程分支$ git branch -a// 新建一个分支,但依然停留在当前分支$ git branch [branch-name]// 新建一个分支,并切换到该分支$ git checkout -b [branch]$ git push origin [branch] //第一次要先空 push // 切换到指定分支,并更新工作区$ git checkout [branch-name]// 切换到上一个分支$ git checkout -// 合并分支 git merge origin/branch-name// 删除本地分支$ git branch -d [branch-name]// 删除远程分支$ git branch -r -d origin/test$ git push origin -d test// 冲突合并 (待测试)$ git mergetool$ beyond compare// 显示有变更的文件$ git status// 显示当前分支的版本历史$ git log// 显示暂存区和工作区的代码差异$ git diff// 取回远程仓库的变化,并与本地分支合并$ git pull [remote] [branch]origin master// 上传本地指定分支到远程仓库$ git push [remote] [branch]origin master$ git init在工作目录中初始化新仓库要对现有的某个项目开始用 Git 管理,只需到此项目所在的目录。// 版本回退$ git reset –hard 版本号① git pull origin master② git add [dir]git add [file1] [file2] …git add .③git commit -m [str message]④git push origin master// git强制覆盖本地代码:$ git fetch –all$ git reset –hard origin/remoteresposity$ git pull// git强制覆盖本地命令(单条执行):$ git fetch –all && git reset –hard origin/develop && git pull// git强制推送本地代码到远程仓库 (待检验)$ git push -u origin develop; ng 启动 start nginx.exe重启 nginx.exe -s reload 【ng根目录 nginx-reload.bat】退出 nginx.exe -s quit ...

April 14, 2019 · 1 min · jiezi

D2 日报 2019年4月12日

???? 开源项目➡️ chuangker/nice-mail watch 1 star 44 fork 2 Nice Mail 是一款以 Markdown 为基础的邮件编辑器。 github.com➡️ pigigaldi/Pock watch 38 star 2663 fork 57 在 MacOS 的 Touch Bar 上显示 Dock github.com➡️ Akryum/vue-apollo watch 100 star 3546 fork 239 Apollo/GraphQL integration for VueJS github.com➡️ shuiRong/vue-drag-tree watch 7 star 230 fork 76 Vue’s drag and drop tree component github.com➡️ moolighty/geo watch 5 star 87 fork 57 全球国家城市地区信息 github.com➡️ kennethreitz/responder watch 130 star 3001 fork 185 a familiar HTTP Service Framework for Python github.com➡️ jaywcjlove/linux-command watch 138 star 3374 fork 860 Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集 github.com???? 分享➡️ 原以为玩 GitHub 的 “贡献墙” 已经够无聊的了,直到今天发现了这个 web.okjike.com➡️ 在谷歌日本(Google Japan)工作是怎样一番体验? mp.weixin.qq.com➡️ TingFM 可以直接在线听全国广播电台 tingfm.com???? 网站➡️ 苦瓜书盘 书籍搜索网站 www.kgbook.com➡️ parsevideo 一个功能非常强大的视频下载网站,支持国内外多个主流视频网站的视频下载;包括:优酷,腾讯视频,芒果TV,哔哩哔哩,梨视频,酷燃视频,头条视频,微博视频,还有各种短视频平台的视频和国外视频平台的视频 www.parsevideo.com➡️ yizhansou 影视搜索网站 videos.yizhansou.com➡️ MovieGeeks 非中文 极简主义在线电影目录 moviegeeks.co➡️ Daily Hack: A community of Makers and Geeks 非中文 dailyhack.xyz???? 工具➡️ Kapwing 操作简单但功能强大的在线 GIF 和视频编辑器 www.kapwing.com➡️ social screen sharing | lightbeam 非中文 跨平台手机屏幕共享 www.lightbeam.app➡️ Spider 非中文 帮助你将网站整理为可以导出的数据,无需写代码 spider.amie-chen.com☕️ 更优雅地阅读阅读我们精心排版之后的页面 《D2 日报 2019年4月12日》???? 往期回顾您可以访问下面的链接浏览往期内容,或者模糊检索。https://daily.fairyever.com???? 提交分享你的发现和创造 投稿/提交方式???? 如何获取日报➡️ 官方官方网站 ????RSS ????Github | Releases➡️ 微信公众号扫描下方二维码关注“今日前端”公众号,看日报不迷路!????公众号文章版本经过特殊优化,以提高微信环境内的阅读体验。➡️ 社区主页掘金 ????即刻 ????Segmentfault简书开源中国CSDN ...

April 12, 2019 · 1 min · jiezi

关于写作那些事之github告诉我构建失败,然后呢?

The page build failed for the master branch with the following error问题描述看到这封邮件,一脸懵逼,本地运行 gitbook 服务是正常渲染的,控制台并没有任何报错,谁知道推送到 github 时就报错了!登录到 github 网站查看网站源码已经同步过来了,但是静态网站无法同步,本地实在找不到任何报错信息,这让我如何是好?再看 github 反馈用的邮件中说道,如有问题可以回复邮件(If you have any questions you can contact us by replying to this email.).然后死马当活马医,尝试阐释了我的问题,请求帮助定位错误日志,没想到当天下午就收到 github 的回复邮件,提供了解决办法!问题是由于 Liquid Warning: Liquid syntax error (line 334) 错误,然而我确定这部分代码是没有任何问题的,因为这是我改造 gitbook-plugin-tbfed-pagefooter 插件时的一段代码,反复确认后发现并没有复制粘贴出错啊!var moment = require(‘moment’);module.exports = { book: { assets: ‘./assets’, css: [ ‘footer.css’ ], }, hooks: { ‘page:before’: function(page) { var _label = ‘最后更新时间: ‘, _format = ‘YYYY-MM-DD’, _copy = ‘powered by snowdreams1006’ if(this.options.pluginsConfig[’tbfed-pagefooter’]) { _label = this.options.pluginsConfig[’tbfed-pagefooter’][‘modify_label’] || _label; _format = this.options.pluginsConfig[’tbfed-pagefooter’][‘modify_format’] || _format; var _c = this.options.pluginsConfig[’tbfed-pagefooter’][‘copyright’]; _copy = _c ? _c + ’ all right reserved,’ + _copy : _copy; } var _copy = ‘<span class=“copyright”>’+_copy+’</span>’; var str = ’ \n\n<footer class=“page-footer”>’ + _copy + ‘<span class=“footer-modification”>’ + _label + ‘\n{{file.mtime | date("’ + _format + ‘")}}\n</span></footer>’; str += ‘\n\n<link rel=“stylesheet” href=“https://unpkg.com/gitalk/dist/gitalk.css">'+ ‘\n\n<script src=“https://unpkg.com/gitalk@latest/dist/gitalk.min.js"></script>'+ ‘\n\n<div id=“gitalk-container”></div>’+ ‘\n\n<script src=“https://snowdreams1006.github.io/gitalk-config.js"></script>'; page.content = page.content + str; return page; } }, filters: { date: function(d, format) { return moment(d).format(format) } }};来源于 gitbook-plugin-tbfed-pagefooter 插件的 index.js 文件,这里为了兼容 gitalk 插件而集成了相关代码,详情请参考 gitalk 评论插件解决方案根据邮件回复,定位到出错代码片段,真的没发现有什么问题啊?既然已经确定不是我的问题,那很可能就是 github 的问题了,邮件中推荐我使用 Jekyll 进行构建网站,不不不!既然已经选择 gitbook 搭建静态网站,那就没必要再使用 Jekyll ,我可不想那么麻烦!If you are not using Jekyll you can disable it by including a .nojekyll file in the root of your repository.所以我不妨试试新增 .nojekyll 文件,说不定就好使了呢!$ touch .nojekyll$ git add .nojekyll$ git commit -m “add .nojekyll”$ git push天不负我!竟然真的好使了,再也没有收到 github 的报错邮件反馈了,源码和网站都正常更新了!小结据我推测,可能是 github 误认为我的网站是使用 Jekyll 工具构建的,实际上,是使用 gitbook 构建的!因此,增加 .nojekyll 文件禁用 Jekyll 工具,自然不会再受相关语法限制而报错了.所以,遇到问题时,不仅要多思考,更应该寻求官方人员的帮助,即使不回你,你也要尝试一下! ...

April 12, 2019 · 2 min · jiezi