Schema 与数据类型优化

参考内容: 《高性能 MySQL(第三版))》 选择优化的数据类型 世面上常见的数据库大多支持了多种多样的数据类型,选择正确的数据类型对于获得高性能至关重要,一般都需要遵循如下的几个原则: 更小的通常更好:更小的通常更快,因为占用着更少的磁盘、内存和 CPU,并且处理时需要的 CPU 周期也更少; 简单就好:简单数据类型的操作通常需要更少的 CPU 周期; 尽量避免 NULL:如果查询中包含可为 NULL 的列,就会使得索引、索引统计和值比较变得复杂,因此在设计表是最好指定列为 NOT NULL。 整数类型 在 MYSQL 中可以为整数类型指定宽度,例如INT(11),但是这对大多数应用是没有意义的,它不会限制值的合法范围,只是规定了 MySQL 的一些交互工具(如 MySQL 命令行客户端)用来显示字符的个数。对于存储和计算来说INT(1)和INT(20)是相同的。 字符串类型 需要注意的是当 MySQL 存储 CHAR 值时,它会删掉所有的末尾空格,因为 CHAR 值会根据需要采用空格进行填充以方便比较,这导致的问题就是你使用 CHAR 存储的string 会变成string。CHAR 的好处在于它是定长的,很适合存储像 MD5 值一样的定长值,定长值的 CHAR 类型不易产生碎片,而且对于非常短的列 CHAR 也会比 VERCHAR 好,比如CHAR(1)只需要一个字节,而VERCHAR(1)则需要两个字节,因为它还需要一个字节来存长度。 VERCHAR 类型在存储可变长字符串时,会比 CHAR 更节省空间,它需要使用 1 或者 2 个额外的字节记录字符串的长度。但由于行是变长的,当一个行占用的空间增长,并且在页内没有更多的可用空间可以存储,就容易产生碎片。 使用枚举代替字符串 有时候可以使用枚举列代替常用的字符串类型,枚举列可以把一些不重复的字符串存储成一个预定义的集合,而且 MySQL 在存储枚举时非常紧凑,会根据列的数量压缩到一个或两个字节。比如下面的例子: CREATE TABLE enum_test( e ENUM('fish', 'apple', 'dog') NOT NULL ); INSERT INTO enum_test(e) VALUES('fish'), ('dog'), ('apple'); SELECT e+0 FROM enum_test; # result +-----+ | e+0 | +-----+ | 1 | | 2 | | 3 | +-----+ 可以看到使用枚举类型后,上面三行数据实际上存储为了整数,而不是字符串,而且还有一个让人吃惊的地方:枚举字段是按照内部存储的整数而不是定义的字符串进行排序的,这一点需要特别注意,不然在写程序时容易中犯错。当然你也可以在查询时使用FIELD()函数显式地指定排序顺序。 可以看到上面 范式和反范式 关系型数据库有设计范式的概念,这一点在大学的数据库课程中肯定都会提及。因为有比较高的范式,那么就只有很少或者没有重复的数据,因此在 UPDATE 时只需要修改更少的数据;高范式的表通常也更小,因此占用的内存也会更小,操作起来也会更快...... 但是高范式也带来了另一个缺点,比较好的范式通常意味着需要关联,稍微复杂一点的查询就需要使用 JOIN,关联的代价是昂贵的,甚至让一些索引策略失效;而如果不需要关联,即使某个查询需要全表扫描,当数据比内存大时可能会比关联查询快的多。所以一般都会根据实际情况将范式与反范式混用,完全的范式化和完全的反范式化都是实验室才有的东西。 缓存表和汇总表 这里的「缓存表」和「汇总表」并没有什么标准的含义。我们用「缓存表」来存储那些可以从其他表获取,但是获取的速度很慢的数据;而「汇总表」则用来保存那些使用 GROUP BY 语句聚合数据的表。毫无疑问,我们存这些冗余数据也是为了性能。 比如近两年各种应用流行的年终报告,每次网易云音乐的年终报告都会把朋友圈撑满,其它类似于缓存一个用户的朋友数、一个文件的下载次数等等。这些数据实时计算的开销是很大的,而且多数情况下用户也等不起实时计算的时间,一般的解决方案都是通过增加计数器表(缓存表)来解决这个问题。 计算机科学中总是伴随着双面性,上面的计数器表带来性能提升的同时也带来了并发问题。网站的每一次点击都会导致对计数器的更新,对于任何想要更新这一行的事务来说,这条记录都有一个全局的互斥锁,这会使得这些事务只能串行的进行。每一次点击都会触发下面的语句,但大量的点击伴随着该行数据的互斥锁,想想性能也不会提升到哪里去吧。 UPDATE hit_counter SET cnt = cnt + 1; 大多数应用都是读查询居多,为了提升读查询的速度,经常会需要增加一些额外的索引,增加冗余列、汇总表、缓存表等等。但是不要忘了这些技巧也会增加写查询的负担,还会增加开发难度,因此应该根据实际应用场景来做权衡。 加快 ALTER TABLE 表的速度 MySQL 执行大部分修改表结构的方法都是用新的结构创建一个空表,然后从旧表中查出所有数据插入到新表,然后删除旧表。在内存不足、表很大、索引多的情况下会花费很长的时间。一个很严重的缺点是大部分 ALTER TABLE 操作将导致 MySQL 服务中断。 对于常见的场景我们有两种技巧避免服务中断。一种是先在一台不提供服务的机器上执行 ALTER TABLE 操作,然后和提供服务的主库进行切换;另一种技巧是「影子拷贝」,即用要求的表结构创建一张和源表无关的新表,然后通过重命名和删除表的操作交换两张表。
Read More ~

转载——我的喜欢从误会开始|最后的记忆

我的喜欢从误会开始 作者:伍什弦 我说过 我不擅长和男生做朋友 所以 一点点的小事 都能让我误会 误以为你喜欢我 课堂上 向我借笔 下课后 加我 QQ 那时候 QQ 封面出现点赞 整个假期 我们不停的互赞 空间里互相留言 这些小事偷偷在我脑中生根 而我被你深深的吸引 想多见你 想靠近你 在运动会上看到你胜利冲过终点 这一晚我梦里是你 连着四晚我梦里都是你 我知道 我喜欢你是从这个时候开始 可是喜欢的种子早在课堂上埋下 我误会了 误以为 你也是喜欢我 最后的记忆 作者:伍什弦 我想啊 人这一生 大抵都有疯狂的喜欢过一人 除此一人之外 剩下的喜欢相比不过十之一二 读大学前 以为从小学喜欢到高中的那个人 当算作我的初恋 可是他闯入我的心怀 从此苍山洱海不过一人 那时节 他总能出现在我的梦里 我呢 总想把最好的都给他 为他做这样那样的事情 可是他对这样的我说 我们永远都是好哥们 就这一句 之后近一个月 我几乎不说一句话 从不逃课的我逃了不止一节 整个学期 我几乎是在图书馆生活的 读完了 一部十三本的德川家康 看了 不知多少部电影 那种伤心仍是挥之不去 不过是随着时间淡淡忘却罢了 后来 身边也有喜欢我的人 开始我也觉得这人还好 总是一段时间过后 就没缘由的厌恶 在还没来得及向我任何表示前 就已经疏远了他们 毕业的时候 我对他说:祝你幸福 之后班级一起去 K 歌 我走前 最后唱了一首 每每听到都忍不住要流泪的歌 Someone Like You 回去的路上 好友告诉我 我在唱的时候 他是闭着眼睛听的 是他第一个鼓掌的 听到这句话的我 眼泪不受控制般流下 我 站在天桥上大声呼喊 我再也不喜欢你了 可真的是这样吗 无论如何 青春 已离我远去 那感觉如此清晰 以后再不会如此喜欢一人 纵有 江山万里织锦绣 我心 除却巫山不是云
Read More ~

一个通过建网站赚钱的暴利项目(灰产勿碰)

这个项目的前提是你已经有了一个可以发布文章的网站,网站的主要就是收集投诉相关内容,如果你还不知道怎么去建一个网站,可以看我之前发的如何搭建一个属于自己的博客/企业网站,按照文中的方法建一个网站的成本投入不到 150 元。 网站建起来了怎么去赚钱呢?相信大家都会想通过 SEO 把自己网站排名优化到足够高,然后利用谷歌联盟或是百度联盟赚广告费,没事的时候更新更新文章,只要保持一个比较好的更新频率,并且能长期坚持下来,那肯定是可以赚钱的,而且收入也会逐渐递增甚至可能呈现指数型增长。 此时得承认我有点标题党了,这个快速赚钱的套路属于灰产,因为我作为证人协助警察叔叔抓获了一个做这件事情的站长。下面进入正题。 现在有一些专门做维权的平台,比如聚投诉、新浪旗下的黑猫投诉等,可以进去看看这样的平台可能在维权方面起不到多大的作用,但是它随随便便就能上百度的首页啊。谁最害怕网络上的负面信息?肯定是被投诉公司啊!在信息时代,一条负面信息不知道要损失多少客户。 我说的就是做一个类似的网站,首先网民都喜欢看这一类的内容,另外这样的网站也很容易进来访问量,有了访问量那么广告费就是一笔不菲的收入,比如你可以去搜「笑捧博客」看下里面的内容,我截了个图放在这里,先告诉你的是它最大的收入并不是广告费。 鉴于上面的信息都是网络上公开的内容,这里我就不打码了。可以看到这个网站里面的绝大部分内容都是 XXXXXXX公司-警惕,里面就是简单描述一下事情经过,然后放个合同的照片、再放几张聊天截图,而且这些内容都是受骗用户自己投稿的,完全不用花时间自己去创造内容。 假设某客户早这个平台上面投诉了 A 公司,A 公司的人看到在百度轻易就能搜到不利于自己公司的信息,想要快速删除这样的内容怎么办?顶部特地留了个「联系站长」看见了吗?假设现在你就是这个站长,你可以像下面那样给对方回话: 平台的内容都是用户自己发的,我这边会跟进用户投诉的进度,你这边有和客户协商处理的聊天记录吗?或者有给客户的退款记录也行,我去核实如果无误就把这篇帖子屏蔽掉。 都把客户逼到去网上发负面信息了,逼到客户去投诉公司了,基本上这样的公司不会有和客户协商处理的聊天记录,不到万不得已他们是不会给客户退款的,一般对方都会回答没有,此时你可以这样说: 你需要马上处理这个帖子可以先交 600 元的押金,我这边先去后台设置不展示这篇内容,你那边抓紧时间去处理,处理好了联系我退换押金即可。 到这里就玩概率了,如果公司很快的就把这个事情处理了,那么对方找你这个站长退还押金也不能不给是不是?但就是有很多公司在一个月内都没有把这样的客户处理好,因为他们本身做的就是割韭菜项目,怎么会轻易退客户钱呢?过了一个月后可以这样说: 当时给你说的是一个月内处理,与客户沟通处理的聊天截图、退款记录发给我,这边去删除帖子!时间有点久,而且后台设置的一个月就会清理一次数据,进程什么的都已经死了............ 简单说就是各种扯皮各种赖,几百块钱对方应该也不会太在意,对方顶多骂你两句也拿你没什么办法,是不是轻轻松松的 600 元就到手了!!! 最后再次强调一点,这个被警察叔叔发现了是要来请你的,而且自己搭的网站没有官方授权,都知道投诉电话是 12315,你个人的一个博客网站凭什么能接收这种投诉?再去看看这个「笑捧博客」的服务器在香港,而且这个网站的所有内容最后更新时间是 2020 年 9 月份,知道为什么吗? 因为这个站长已经被公安局请进去了!
Read More ~

大学生可以尝试操作的项目

很多大学生第一次远离爸妈的怀抱都是因为上大学,刚好此时也已经是 18 岁的成年人了,从小耳濡目染的 18 岁成人礼撬动着内心那颗渴望独立的心,通过自己能力赚到钱放在手里那一刻的感觉,人类的文字已经无法描述那一刻的美妙了。 估计也有不少学生都被一些网上兼职网站给坑过(本人也被坑过),满怀期待的在某个兼职网站提交了自己的个人信息,不一会儿对方就打电话过来和你确定一个时间去面试,此时心中的你是不是还在想自己要准备什么啊?从来没有面试经验的自己能通过面试吗? 到了现场才发现所谓的面试不过只是让你交几百块钱给他们,他们给你在网站上面注册一个账号,这样你就可以去网站上面领取兼职工作了,虽然交了几百块钱有割心头肉的痛感,但是想想多做几天兼职这些钱就挣回来了,而且还能挣更多的钱,心中又充满了期望。 本文本着童叟无欺的价值观,良心分享几个线下必赚项目。 收集毕业生的被子 学校每年都会有大批的毕业生走出校园,本科、硕士(博士一般都在外面有房子)加起来少则几千多则几万,这些学生基本都从外地到学校就读的,每一年这些学生一走都会留下大量的被子等在宿舍,还给给后勤集团留下一大堆的烦恼,那为啥不帮助后勤集团去解决这个烦恼顺道再赚点钱呢? 先辛苦一下去外面的酒店了解他们是不是需要这些被子(不要把酒店的服务想象的那么好,我好像又透露了点什么),别去那种太高端的酒店就行,多问几家比一比价格,别忘了顺道也问下路过的棉花厂。做好记录,毕竟好记性不如烂笔头嘛! 评估一下在自己学校的可行性,价格比较完了觉得可以做那就开始拉上自己的哥们干!为了省点钱可以先找后勤集团领导问问,现在可以为他解决毕业生离校后宿舍被子的问题,可否把这个项目作为勤工俭学工作给点钱,就算不给钱可以不可以给出个车费把被子拉到指定地点。当然如果人家不愿意那就自己出点车费钱啰。 后面要做的事情就不用我多说了吧!去每个宿舍询问一下,把被子抱走就行,毕业生是陆陆续续走的,所以每个宿舍楼记得多跑一两遍。过程是比较累的,坚持下来赚到一笔可供挥霍的基金绝对没问题。 给宿舍提供零食 想象一下自己打游戏打到大半夜饿肚子的感觉,此时楼下的小卖部已经关门了,去校外的超市又太冷、太远了,这一点在北方尤其常见。在南方生活的我有一次肚子饿了,跑到学校的腐败街希望能找点吃的,结果基本上的商家都关门了,要知道那还不到 12 点。 可能也有同学想过甚至实践过这个项目,我自己同班同学也拉着自己的哥们实践过,但是他们并没有做到多好,并没有赚到多少钱,所以下面说几个值得注意的地方! 选品很重要,先选比较容易出手的薯片、肥宅快乐水、辣条等,水果可以留着下一步做,因为保质期不够长!给同学送货的时候一定不要见到是熟人就瞎唠嗑,那样会浪费给其它顾客送货的时间。能加微信记得把顾客和他室友的微信加上,这样方便收集大家的需求和意见,微信和 Excel 能解决 90% 以上的问题。比较重要的一点是记得不定时做做活动,比如从已下单客户种抽取第二日免单优惠,满 30 元送一瓶可乐等等,要让顾客真正体验到在你这里购买的便捷与实惠。 有了上面的基础之后你就可以去和货源老板压价了,当你的流量足够大的时候甚至可以和老板谈判先卖出去在付货款,只有把自己的成本压到足够低才有利润可图,这个项目主要看的是执行力! 给新生办电话卡 这个相信很多同学都多少听过或者尝试过,每年三大运营商的抢人大战尤其激烈,我入学的时候中国移动直接疯狂到给学生免费送卡(那时候实名制还没那么严),在暑假快放假的时候去学校的各个营业厅了解一下情况,问问他们办一张卡都有多少提成之类的(我当时是一张卡 15 元),如果能同时拿到是那个运营商的卡最好,如果拿不到那就拿中国移动的卡(这个也有例外,比如我学校的楼就很神奇,基本每一栋楼里面都接收不到移动信号,图书馆能屏蔽一切信号,因地制宜也很重要)。 去哪里拉客户呢?新生报到处对不对?错了!你的同行都会想到新生报到处,竞争比较大。新生报到处都是办理各种手续对不对?那里也没有桌子什么的方便填写资料,而且新生报到处是第一站,后续的流程还没走完人家也没那耐心给你这里耗,所以新生报到处绝对不是最佳地点。 哪里是最佳的地点呢?宿舍。新生宿舍总共就那么三四栋楼,会呆在宿舍的新生基本都是把各种手续已经跑完了,爸妈正陪着他铺床或是简单歇歇就去吃饭呢,正处于一个放松休闲的状态。这时你去给他说你这里有学生优惠的卡,对方是不是该很高兴?只要他们还没有办卡,那他们吃完饭也会去办电话卡的。 组织租车 这个项目得根据学校的实际情况了,有些学校所处的位置就很适合这样的项目。比如中北大学,在一个离市区很远的村子里面,周末大家都想去市里玩,我去那里看女朋友的时候可遭罪了,虽然有公交但是超级挤啊,所以很多学生宁愿多花几块甚至十多块去坐黑车。何况有的学校还没有公交。 那些司机师傅也很焦灼,一面是已经坐上车的顾客在死命的催他,一面是车上还没有坐满跑一趟划不来,旁边还有很多同行在和他竞争,这样的场面即使你没有在学校见过相信也在车站见过吧!所以这个项目就是在司机与同学之间搭起一座桥梁。 还是上面的话,微信和 Excel 可以解决 90% 以上的问题,你一遍把班次定好让大家交钱预约,一边和司机师傅联系,保证发车的准时性。这个项目在特定环境是刚需,所以很容易在同学之间传开,再稍加一点活动优惠基本就躺赚了,我看到有利用这个项目赚了好几十万的!
Read More ~

为什么会出现网店代运营服务?

本文写于 2020 年 4 月,较于 4 月版本本文已做部分修改 最近在深圳待的厌烦了,网店代运营这个行业兴起来没有多久,逮着清明假期索性到成都几个做淘宝和拼多多代运营的公司走了走,主要是想实地感受一下电商代运营是个什么玩意!截止此文章发布时间,我已经在这个公司待了一周了,但限于理解能力有限,对网店代运营这个东西还是一头雾水,下面就先说说我理解的为什么会出现代运营这样一个行业吧。 一般经过某种生产过程我们可以得到一个或多个产品,然后再把把这些产品拿到集市上去销售,比如农民伯伯种菜拿到菜市场去买。工业的发展、社会的进步等因素使得生产力有显著的提高,但是要生产一个产品依旧离不开生产过程,只是这个生产过程效率变得更高了而已。商品不一定是实体的,比如电视剧里面用钱换取情报,这里的情报也是一种商品,网店代运营公司提供的网店代运营服务也是一种商品,这一点可以类比各种保险。 以前都是租一个门面把商品摆在店铺里,等着附近赶集市的人前来购买。这种模式的弊端在于,一个人一天能走的距离是有限的,会走到你店铺的人更是少之又少,如此一来店铺的客流量依赖于一个村(镇、市),而一个村(镇、市)再大也不过那么点人,销售量的前提是客流量。淘宝、京东、拼多多、苏宁易购等大型电商平台的兴起,就是致力于解决这一类「做生意难」的问题,通过这些电商平台把互联网大流量的优势发挥出来了,互联网提供了巨大的流量池,怎么利用这个流量池就是靠自己的能力了。 问题在于很多人不会操作这一类电商平台的后台系统,初学者可能连一个后台怎么操作发货都不会,更别说如何利用增长思维来玩流量。少部分年轻人能自主学会如何操作电商平台的后台系统,大部分中年人士对复杂的后台就望而却步了。而就算你能操作复杂的后台系统,但是如何优化商品信息(标题、关键词、展示图等)来提高销量可能就不一定会了。 其它诸如站外推广、美工做图、活动上报、刷销量、刷收藏等等一系列操作更不是随随便便找个人就能做的。网店代运营公司提供的这种代运营服务则是为了解决电商运营难的问题,网店代运营公司专注于提供网店代运营服务,而客户则专注于出单发货,这也符合随着社会发展工作会逐渐细分的规律。 说实话,从几天观察来看,我走过的工资在网店运营领域的实力是非常不值得信赖的,虽然这个行业也不乏佼佼者,但是我看到的大部分都是没有真正创造价值,只是不断的去坑客户。我个人倾向于把专业的事情交给专业的团队去做,第一是能大大节省自己的时间、人力成本,另外也不会被运营这些事情扰乱到自己的好心情,但是要真正寻找到一个靠谱的代运营公司可真是难上加难。 我拜访的几个公司都有一个通病,那就是前期过于注重销售导致后续服务没有跟上来,或者说的更直白一点就是他们根本就没想过如何去提升自己的服务质量,客户进来洗一遍之后就不管了,这个过程叫做洗小白。也有一个公司老板已经意识到这一块的问题了,但是公司自身实力和公司人员素质都跟不上。 每个行业的兴起都不是没有原因的,代运营服务的出现的原因是为了解决了「网店运营难」的问题。虽然市场上绝大部分代运营公司都是在割韭菜,但是我相信网店代运营行业会越来越正规化,当然也可以代运营被这绝大多数人给作死。专业的人做专业的事,是社会发展的必然结果。 行业目前是很乱的,同行之间相互伪造聊天记录截图、伪造转账记录、伪造合同等手段去各平台发布诋毁对方的言论,甚至伪装成新客户去盗取别家公司内部的一些信息。让人觉得搞笑的是,还有直接冒充大一点的公司去骗客户的,我看到公司管理层因为这些事情搞的极为头大,表现出了秀才遇上兵的无奈。 换个角度看同行恶意竞争这件事,如果一个公司在搜索引擎都搜索不到的话,那只能说明这个公司随时都可能死去,前期承诺了再好的服务也不一定有用,公司死了怎么能提供服务呢?如果一个公司在上面全是负面,或者全是正面的信息都太假了。只不过这个行业的负面新闻太多了! 一个良性的市场竞争环境是行业发展的必要,但是像上述冒充同行公司、伪造事实依据诋毁同行公司的人,把整个市场都搞的乌烟瘴气了。这是非常短视的行为,短期可能会让自己有一定的收入,但是长期来看这是非常不利于行业发展的,这会逐渐让潜在客户甚至签约客户都逐渐对行业失去信心。 后面专门写一篇文章来揭露我看到的网店代运营行业乱象吧!!!!
Read More ~

Git 基本原理及常用命令速查

参考内容:Pro Git book 如果你只是想查看 Git 常用命令可以选择直接到文章底部「Git 常用命令」阅读,文章大部分内容是 Git 进阶知识,均是自己的读书笔记,如果还想在此基础上再上一层楼,那可以直接看 Pro Git book。 Git 历史 版本控制器是一种记录一个或若干文件内容变化,以便将来查阅特定版本的修订情况。也就是说,版本控制器记录了一个可供考证的历史数据,通过该数据可以知道文件是怎么一步一步发展到今天这个样子的。 最初 Linux 项目使用 BitKeeper 来管理和维护代码,但是到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了免费使用 BitKeeper 的权力。那 Linux 开源社区的解决方案就是自己搞一个版本控制器,所以就有了 Git。 简单说就是 Linus 被逼的去开发了这一款叫做 Git 的版本控制器,因为 Linus 本身就是内核专家与文件专家,所以 Git 也就自然而然具备了非凡的存储能力与性能。 安装 关于如何安装 git 可以查看 Pro Git book,安装完成后需要进行一些必要的配置,比如用户信息、文本编辑器、差异分析工具等等,我们可以通过git config --list来查看配置信息。比如我们要配置用户和邮箱,就可以像下面这样输入命令。 $ git config --global user.name "John Doe" $ git config --global user.email johndoe@example.com Git 原理 Git 和大多数版本控制器有一个重要的区别,就是它直接记录快照,而非差异比较,其它大部分系统以文件变更列表的方式存储信息,而 Git 则存储每个文件与初始版本的差异。换句话说,只要你的文件有改动,那么 Git 就会将该文件复制一份,正因为 Git 的这个特性,所以 Git 仓库很容易就变得非常大;为了高效,如果文件没有修改,那么 Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。Git 对待数据更像是一个快照流。 Git 有三个区,分别为:仓库、工作目录、暂存区。基本的 Git 流程为:1)在工作目录中修改文件;2)暂存文件,将文件的快照放入暂存区域;3)提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。那么相应的 Git 就有三种状态:已提交(committed)、已修改(modified)和已暂存(staged),你的文件可能处于其中之一。 Git 基础 工作目录中的文件不外乎处于两种状态:已跟踪或未跟踪。已跟踪是指那些纳入了版本控制的文件,在上一次快照中有它们的记录;工作目录中除了已跟踪文件以外的所有文件都属于未跟踪文件,们既不存在于上次快照的记录中,也没有放入暂存区。 查看文件状态 如果需要查看哪些文件处于什么状态,可以使用git status命令,这个命令显示的信息十分详细,如果你喜欢简洁一点的信息,那么可以在其后添加一个-s,其报告格式类似于下面这样。 $ git status -s M README MM Rakefile A lib/git.rb M lib/simplegit.rb ?? LICENSE.txt ??表示新添加的未跟踪文件;修改过的文件前面有M标记,右边的表示还没有放入暂存区,左边的表示已经放入暂存区了。当然你可能不希望每个文件都出现在未跟踪列表中,比如编译过程临时创建的文件、日志文件等等,所以可以通过创建一个名为.gitignore 的文件,列出要忽略的文件模式,它支持标准的glob模式匹配(shell 所使用的简化了的正则表达式),在 gitignore 中有一个十分详细的针对数十种项目及语言的.gitignore文件列表。 git status对于具体修改显示的过于模糊,如果想查看具体修改了什么地方,可以使用git diff命令,比如git diff README.md。需要注意的是git diff本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动,如果需要查看已经暂存起来的变化,则要加上--staged或者--cached,比如git diff --cached README.md。 删除文件 当然我们不可避免的需要删除某个文件,如果你仅仅是简单的从工作目录中手工删除文件,那它并没有真正的从 Git 中删除,Git 会将这次删除识别为一次改动。更好的方式是使用git rm命令来完成删除文件的工作,比如git rm README.md就会从已跟踪文件中删除,并且连带从工作目录中删除指定文件。 如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项-f(译注:即 force 的首字母)。 这是一种安全特性,用于防止误删还没有添加到快照的数据,这样的数据不能被 Git 恢复。 另外一种情况是,我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。 换句话说,你想让文件保留在磁盘,但是并不想让 Git 继续跟踪。 当你忘记添加 .gitignore 文件,不小心把一个很大的日志文件或一堆 .a 这样的编译生成文件添加到暂存区时,这一做法尤其有用。这时就需要使用--cached选项了,比如git rm --cached README。 查看历史 我们或许因为某种原因需要回顾一下提交历史,这时git log就派上用场了,默认不用任何参数的话,git log会按提交时间列出所有的更新,最近的更新排在最上面,这个命令会列出每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明。 git log提供的选项很多,更详细的内容可以查看 Git 基础 - 查看提交历史。除了不带选项的命令,我个人更常用的命令还有另外两个,分别为:git log --pretty=oneline它将每个提交放在一行显示,在查看的提交数很大时非常有用;git log --graph或者git log --pretty=oneline --graph用于显示 ASCII 图形表示的分支合并历史。 撤销操作 在任何一个阶段我们都可能有想要撤销的操作,我们只需要掌握几个基本的撤销操作就能够应对日常的工作了。 第一种情况:取消上一次提交。有时候当我们提交完之后才发现漏掉了几个文件没有添加,或者是提交信息写错了,此时可以使用带--amend选项的提交命令尝试重新提交,即git commit --amend。这个命令会将暂存区的文件全部提交,如果自上次提交以来你还没一做任何修改(比如,在上次提交后马上执行了此命令),那么快照将会保持不变,而所修改的只是提交信息。 第二种情况:取消暂存的文件。假设你修改了两个文件并且想要将它们作为两次独立提交,但是却不小心输入了git add *暂存了它们两个,如何取消其中一个暂存呢?其实在运行git status时已经给出提示了。 $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) renamed: README.md -> README modified: CONTRIBUTING.md 所以如果我们想要取消CONTRIBUTING.md的暂存,那么就可以用git reset HEAD CONTRIBUTING.md命令来完成。 第三种情况:撤销对文件的修改。有时候我们可能并不想保留对某个(若干)文件的修改,git status也给出了详细的提示,告诉我们如何将文件还原成上次提交时的样子,即git checkout -- <file>,比如输入命令git checkout -- CONTRIBUTING.md,就会将CONTRIBUTING.md重置到上一次提交时的样子。 需要注意的是git checkout -- <file>是一个比较危险的命令,因为它仅仅是拷贝了另一个文件来覆盖当前文件,所以你对那个文件的所有修改都会消失,而且不可恢复。 远程仓库 前面我们都是在讲本地操作,远程仓库的使用是必不可少的技能。可以使用git remote命令查看每一个远程服务器的简写,对于已经克隆的仓库,它至少会包含一个origin,这是 Git 给克隆仓库服务器取的默认名字,它和其它服务器并没有什么区别,只是很少人会去修改这个默认名字而已。 如果想要给一个远程仓库重新取一个简写名,那么可以运行git remote rename来完成,比如git remote rename pb paul就是将pb重命名为paul。值得注意的是这样同样也会修改你的远程分支名字,那些过去引用pb/master的现在全引用paul/master。 当想要将自己的成果分享给他人时,就需要将其推送到上游,使用git push [remote-name] [branch-name]即可,比如你想要将master分支推送到origin服务器时,就可以运行git push origin master。 除了分享自己的成果,我们也需要获取他人的成果,即从仓库拉取自己没有的信息,比如git fetch origin,需要注意的是git fetch命令会将数据拉取到你的本地仓库,但它并不会自动合并或修改你当前的工作,所以你还需要git merge来合并分支,实际上有一个git pull命令可以帮我们把这两个步骤都做了,你可以简单的将git pull理解为git fetch后面紧接着一个git merge。 分支管理 Git 的分支模型是它的必杀技特性,它处理分支的方式是难以置信的轻量,创建分支几乎是在一瞬间完成,而且在不同分支间的切换也非常的便捷,要理解 Git 的分支,我们必须要再次回顾 Git 是如何保存数据的。 下图是我们的一个工作流,可以看到所谓的分支实际上就是一个可以移动的指针而已,master、v1.0都仅仅是一个指针,而创建分支、切换分支等操作也都只是对指针的操作,因此就不奇怪为什么 Git 这么快了。 那么 Git 又是如何知道当前在哪一个分支上呢?它仅仅是用了一个名为HEAD的特殊指针,你可以将HEAD想象为当前分支的别名,HEAD指向哪个分支,就表示当前处于哪个分支。 分支创建与切换 我们可以使用git branch [branch-name]来创建一个新的分支,比如git branch testing;如果使用不带选项的git branch,那么它会列出当前所有的分支,这里需要注意的是master分支也不是特殊分支,它是运行git init时自动创建的默认分支,因为大家都懒得去改它,所以它就好像变得特殊了一样。 git branch [branch-name]只是创建了一个新分支,并不会切换到这个分支上面去,分支的切换说白了就是移动HEAD指针,我们只需要使用git checkout testing就可以切换到testing分支上去了。 当然我们可以使用git checkout -b [branch-name]来创建一个分支并同时切换到这个分支,把这个命令与git commit -a -m来对比,你就会发现它们的类似之处。 分支的合并与删除 当我们零时在一个新分支上解决了问题后,需要将其合并到master分支,只需要切换到master再运行git merge命令即可,Git 会自动找到这两个分支的共同祖先,然后做一个简单的三方合并。 当然理想情况下是直接合并成功,但是不免会遇到合并冲突的情况,一旦遇到冲突了,Git 会像下面这样来标记冲突内容,你需要做的是选择由=======分割的令部分的其中一个或者自行合并,当<<<<<<<,=======,和>>>>>>>这些行被完全删除了,你需要对每个文件使用git add将其标记为冲突已解决。 <<<<<<< HEAD:index.html <div id="footer">contact : email.support@github.com</div> ======= <div id="footer"> please contact us at support@github.com </div> >>>>>>> testing:index.html 当合并完分支后,之前的分支一般就不会再要了,这时你可以运行git branch -d [branch-name]来删除指定分支,比如使用git branch -d testing来删除testing分支。 远程分支 远程分支以(remote)/(branch)的形式来命名。如下图所示,如果你克隆一个仓库下来,那么这个仓库除了会有一个本地的分支指针,还会有一个远程分支指针。如果你在本地的master分支做了一些工作,但是你并没有与origin服务器连接,那么你的origin/master指针就不会移动。 在这之前我们已经讲过通过推送分享自己的成果,在运行git push origin master命令时,Git 会自动的将master分支名字展开为refs/heads/master:refs/heads/master,即意味着推送本地的master分支来更新远程仓库上的master分支,所以你也可以运行git push origin master:testing来做类似的事,如果远程仓库没有testing分支,那它会自己创建一个新的testing分支。 我们肯定需要创建一个跟踪远程仓库的其它分支,最简单的就是运行git checkout -b [new-branch] [remote-name]/[branch],该命令会以远端[branch]分支的内容来创建本地的[new-branch]分支,Git 也对该命令做了一个简化,git checkout --track [remote-name]/[branch],该命令就会在本地创建一个[branch]分支用于跟踪远端的[branch]分支。 当然,我们还需要了解一个删除远程分支的命令git push origin --delete [branch],需要注意的是这个命令基本上只是从服务器上移除这个指针。 Git 服务器通常会保留数据一段时间直到垃圾回收运行,所以如果不小心删除掉了,通常是很容易恢复的。 Git 常用命令 挑了一些比较重要 Git 命令,我把个人常用的命令使用代码块标记出来了。 命令 作用 git init 将一个目录转变成一个 Git 仓库 git clone 从远程克隆一个仓库到本地,它是多个命令的组合, git add 将内容从工作目录添加到暂存区 git commit 将暂存区文件在数据库中创建一个快照,然后将分支指针移到其上 git commit -a -m [msg] git add和git commit的组合 git status 展示工作区及暂存区域中不同状态的文件 git status -s 比git status展示的内容更加简洁 git diff 对比工作目录文件和暂存区快照之间的差异 git diff --cached 对比已暂存的差异 git reset 根据你传递给动作的参数来执行撤销操作 git rm 从工作区,或者暂存区移除文件 git clean 从工作区中移除不想要的文件的命令 git checkout 切换分支,或者检出内容到工作目录 git branch 列出你所有的分支、创建新分支、删除分支及重命名分支 git checkout -b [branch] 创建新分支并切换到该分支 git log 展示历史记录 git log --pretty=oneline 简洁版历史记录 git merge 合并一个或者多个分支到已检出的分支中 git stash 临时地保存一些还没有提交的工作 git pull git fetch 和 git merge 命令的组合体 git push 将本地工作内容推送到远程仓库 git push origin local_branch:remote_branch 比git push更加详细的推送 git checkout --track [remote-name]/[branch] 在本地创建一个分支用于跟踪远程同名分支 git remote -v 显示所有远程仓库地址 git remote set-url origin [url] 设置远程仓库地址为url
Read More ~

Java 垃圾回收机制详解

最近主要时间都放在知识图谱构建中,但是还是需要给自己充电。想在近段时间好好把 JVM 的垃圾回收好好看一下,学习然后输出,是我新找到的有效学习方法,希望你看了之后能有收获。 什么是垃圾 垃圾回收(常称做GC——Garbage Collection)诞生于1960年 MIT 的 Lisp 语言,垃圾回收机制也已经用在了很多编程语言中,比如 Java、Python、C# 等。我们这里主要说 Java 中的垃圾回收。 在JVM中,程序计数器、虚拟机栈、本地方法栈都是随线程生而生,随线程灭而灭;栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理;常说的垃圾回收主要集中在堆和方法区,这部分内存是随着程序运行动态分配的。 既然要回收垃圾,那么我们首先需要知道的就是,什么样的对象是垃圾。一般有两种方式: 引用计数 每个对象有一个引用计数属性,新增一个引用时计数加 1,引用释放时计数减 1,当引用计数变为 0 的时候,这个对象就可以回收了。但是这个方法无法解决对象循环引用的问题。 // 对象循环引用示例 Object objectA = new Object(); Object objectB = new Object(); objectA.instance = objectB; objectB.instance = objectA; objectA = null; objectB = null; 假设我们有上面的代码。程序启动后,objectA和objectB两个对象被创建并在堆中分配内存,它们都相互持有对方的引用,但是除了它们相互持有的引用之外,再无别的引用。而实际上,引用已经被置空,这两个对象不可能再被访问了,但是因为它们相互引用着对方,导致它们的引用计数都不为 0,因此引用计数算法无法通知GC回收它们,造成了内存的浪费。如下图:对象之间的引用形成一个有环图。 可达性分析 或者叫根搜索算法,在主流的JVM中,都是使用的这种方法来判断对象是否存活的。这个算法的思路很简单,它把内存中的每一个对象都看作一个结点,然后定义了一些可以作为根结点的对象,我们称之为「GC Roots」。果一个对象中有另一个对象的引用,那么就认这个对象有一条指向另一个对象的边。 像上面这张图,JVM会起一个线程从所有的GC Roots开始往下遍历,当遍历完之后如果发现有一些对象不可到达,那么就认为这些对象已经没有用了,需要被回收。(这里多说一句,我们的JVM一起动,就至少有两个线程启动,一个是垃圾回收线程,一个是我们自己的主线程。) 那么现在问题就变成了——什么样的对象可以当作 GC Roots?共有四种对象可以作为 GC Roots。 虚拟机栈中的引用的对象 们在程序中正常创建一个对象,对象会在堆上开辟一块空间,同时会将这块空间的地址作为引用保存到虚拟机栈中,如果对象生命周期结束了,那么引用就会从虚拟机栈中出栈,因此如果在虚拟机栈中有引用,就说明这个对象还是有用的,这种对象可以作为 GC Roots。 全局的静态的对象 也就是使用了static关键字定义了的对象,这种对象的引用保存在共有的方法区中,因为虚拟机栈是线程私有的,如果保存在栈里,就不叫全局了,很显然,这种对象是要作为 GC Roots 的。 常量引用 就是使用了static final关键字,由于这种引用初始化之后不会修改,所以方法区常量池里的引用的对象也作为GC Roots。 本地方法栈中JNI引用的对象 有时候单纯的java代码不能满足我们的需求,就可能需要调用 C 或 C++ 代码(Java 本身就是用 C 和 C++ 写的嘛),因此会使用native方法,JVM 内存中专门有一块本地方法栈,用来保存这些对象的引用,所以本地方法栈中引用的对象也会被作为 GC Roots。 垃圾回收算法 有意思的是在 JVM 规范中,并没有明确指明 GC 的运作方式,各个厂商可以采用不同的方式去实现垃圾收集器。这篇文章简单介绍常见的垃圾回收算法。 标记-清除算法 标记-清除算法分两个步骤,分别为「标记」和「清除」,字如其人。它是一个最基础的垃圾回收算法,更高级的垃圾回收算法都是基于它改进的。 它的运行过程是这样的:首先标记出所有需要回收的对象,标记完成后,再统一回收掉所有被标记的对象。 标记-清除算法的缺点有两个,一个是空间问题,标记清除之后会产生大量的不连续内存碎片。内存碎片太多,程序在之后的运行过程中就有可能找不到足够的连续内存来分配较大的对象,进而不得不提前触发另一次垃圾回收,导致程序效率降低。标记-清除算法的另一个缺点是效率问题,标记和清除的效率都不高,两次扫描耗时严重。 复制算法 复制算法把内存按容量划分为大小相等的两块,每次只使用其中的一块。如果正在用的这块没有足够的可使用空间了,那么就将还活着的对象复制到另一块去,再把使用过的内存一次性清掉。 这样就实现了简单高效的做法,每一次进行内存回收时,就不用再去考虑内存碎片这些复杂的情况,只需要移动堆顶指针就可以。但是缺点也很明显,可使用内存只有原来的一半了,而且持续复制生命力很旺盛的对象也会让效率降低哇。复制算法适用于存活对象少、垃圾对象多的情况,这种情况在新生代比较常见。 标记-压缩算法 在老年代,大部分对象都是存活的对象,复制算法在这里就不靠谱了,所以有人提出了标记压缩算法,标记过程和标记清除算法一样,但是清理时不是简单的清理,而是让所有存活的对象都向一端移动,然后直接清理掉边界以外的内存,需要移动对象的成本。 分代算法 前面的几种垃圾回收算法中,没有一种可以完全替代其他算法,他们具备各自的特点与优势,因此更好的方法是根据垃圾对象的特性来选择合适的回收算法。 分代算法的思想就是将内存空间根据对象的特点不同进行划分,选择合适的垃圾回收算法来提高回收效率。分代的思想已经被现有的虚拟机广泛采用。 分区算法 分区算法就是将整个堆空间再划分为连续的不同小区间,每一个小区间独立使用,也独立回收。 一般在相同条件下,堆空间越大,那么一次GC的时间就越长,因此而产生的停顿时间也就越长。为了控制GC的停顿时间,根据目标停顿时间,每次合理回收若干个小区间,而不是整个堆空间,进而减少一个GC的停顿时间。 垃圾收集器 上面讲的是垃圾收集算法,讲的是理论,垃圾收集器就是这些理论的具体实现。下面介绍一些垃圾收集器 Serial收集器 串行收集器是高效率的、古老的收集器,它只用了一个线程去回收垃圾。新生代、老年代使用串行回收;新生代复制算法、老年代标记-压缩算法。串行是指 GC 过程和用户过程是串行的,在垃圾收集过程中会 stop the world,JVM在后台自动发起垃圾回收,会在用户不可见的情况下,把用户的线程全部停掉,就是 GC 停顿,给用户带来不良体验。 红色代表 GC 线程,灰色代表用户线程,下同。 ParNew收集器 ParNew 收集器就是 Serial 收集器的多线程版本,除了多线程以外,其余行为都和 Serial 收集器一样。新生代并行收集,老年代串行收集;新生代使用复制算法、老年代使用标记-压缩算法。 Parallel Scavenge收集器 Parallel Scavenge 收集器类似于 ParNew 收集器,因为与吞吐量密切,也称为吞吐量收集器。可以通过参数来打开自适应调节策略,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或最大的吞吐量;也可以通过参数控制 GC 的时间不大于多少毫秒或者比例。Parallel Scavenge 收集器以高吞吐量为目标,减少垃圾收集时间,让用户代码获得更长的运行时间;GC 停顿时间的缩短,是用牺牲吞吐量和新生代空间来换取的。 Parallel Old收集器 Parallel Old 收集器是 Parallel Scavenge 收集器的老年代版本,使用多线程和「标记-压缩」算法,在 JDK1.6 版本才开始提供。 CMS收集器 CMS(Concorrect mask sweep)收集器是一种以获取最短停顿时间为目标的收集器;也称为并发低停顿收集器。常用在 WEB、B/S 架构的服务系统中,因为这类应用很注重响应速度,尽可能减少系统停顿时间,给用户带来较好的体验。从名字上就可以看出来,它是基于「标记-清除」算法实现的,整个过程分为 4 步: 初始标记 初始标记仅仅标记 GC Roots 能直接关联到的对象,所以速度很快,需要停止服务(Stop The World)。 并发标记 并发标记是进行 GC Roots Tracing 的过程,为了标记上一步集合中的存活对象,因为用户程序这段时间也在运行,所以并不能保证可以标记出所有的存活对象。 重新标记 重新标记阶段是为了修正并发标记阶段因用户程序继续运作而导致标记变动的那一部分对象,采用多线程并行来提升效率,会停止服务,时间上远比并发标记短,较初始标记稍长。 并发清除 这个阶段即并发收集垃圾对象,可以与用户线程一起工作。 虽然 CMS 收集器线程可以和用户线程一起进行,但是它肯定会占用 CPU 资源,拖慢应用程序是肯定的,总的吞吐量会降低。 G1收集器 (看下垃圾回收算法中的分区算法)这是目前最新的前沿成果,它基于“标记-压缩”算法,可以进行空间整理,不会产生碎片。前面的垃圾收集器,收集范围都是整个新生代或老年代,但是 G1 收集器不是这样,使用 G1 收集器时,java堆的内存模型不同,它还保留有新生代和老年代的概念,它们都是一部分区域(可以不连续)的集合。除此之外,G1 收集器还能建立可预测的停顿时间模型,可以明确指定M毫秒时间片内,垃圾收集消耗的时间不超过N毫秒。G1 跟踪各个区域(Region)获得其收集价值大小,在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的 Region。G1 垃圾回收也分4步: 初始标记 仅标记 GC Roots 能直接关联到的对象。 并发标记 进行 GC Roots Tracing 的过程,并不能保证可以标记出所有的存活对象。这个阶段若发现区域对象中的所有对象都是垃圾,那个这个区域会被立即回收。 最终标记 为了修正并发标记期间因用户程序继续运作而导致标记变动的那一部分对象的标记记录,G1 中采用了比 CMS 更快的初始快照算法: snapshot-at-the-beginning (SATB)。 筛选回收 首先排序各个 Region 的回收价值和成本,然后根据用户期望的 GC 停顿时间来制定回收计划,最后按计划回收一些价值高的 Region 中垃圾对象,回收时采用"复制"算法,从一个或多个 Region 复制存活对象到堆上的另一个空的 Region,并且在此过程中压缩和释放内存。
Read More ~

SEO 入门——你必须了解站长平台知识

我自己也刚接触建站不久,10 月 1 日开始购买服务器和域名学习建站,10 月 11 日一查已经被 Google 收录了 20 多个链接了,下面是我个人就我自己的实践总结的一点关于站长平台的知识。 基本上只要做的大的搜索引擎都会有站长平台的,站长平台是搜索引擎官方提供的辅助网站优化管理的工具,它可以针对我们的网站提供一定的优化方向,而且新站一开始搜索引擎的爬虫可能来都不会来,我们一开始也需要通过站长平台主动给搜索引擎提交我们的站点地图。 盘点业界主流站长平台 既然我们讲的是站长平台知识,肯定是得先要去了解一些主流的站长平台,那业内知名的站长平台有哪些呢?下面是 Guanngxu 为大家盘点的主流站长平台。 谷歌站长平台 入口:https://search.google.com/search-console 谷歌在搜索引擎领域的地位不言而喻,稍微遗憾的是它已经退出中国市场了,它的技术、算法等在业界都是一流,即使它已经退出中国市场了,但也绝对是一个不可忽略的存在 百度站长平台 入口:https://ziyuan.baidu.com/ 目前国内使用最多的站长平台就是百度了,谷歌退出中国之后就百度一家独大,也是目前国内功能最完善的站长平台,对于网站管理、数据检测等都有一定的参考意义。 搜狗站长平台 入口:http://zhanzhang.sogou.com/index.php/site/index 搜狗的功能相对来说简单一些,只提供了一些基础的网站优化功能,虽然目前看搜狗搜索的流量也跟不上,搜狗现在已经被腾讯收购,不知道后续是否会有更大的发展,在国内搜狗的流量也还是不小的。 必应站长平台 入口:https://www.bing.com/toolbox/webmaster/ 必应是微软旗下的搜索引擎,必应在国内的市场占有率不太高,使用必应的大部分是讨厌百度的广告,又暂时不知道如何科学上网的人群,不过它的站长平台做的相对来说还是可以。 头条站长平台 入口:https://zhanzhang.toutiao.com/ 大家都知道字节跳动是互联网界的一匹黑马,字节跳动最近正在抖音等旗下的应用开始测试搜索广告业务,虽然头条站长平台很多功能处于不完善的状态,但是它之前的成绩也是大家有目共睹的,值得期待。 神马站长平台 入口:https://zhanzhang.sm.cn/ 神马站长平台是依托于 UC 浏览器和神马搜索衍生出来的一个平台,它大部分的流量都来自于移动端,所以它平台的功能比较偏向于移动端,功能比较基础,几乎没有什么算法和优化的通知。 利用站长平台我们可以做些什么? 新站一般都不会有搜索引擎的爬虫程序主动来爬取的,人家甚至都不知道你这个小网站的存在,那么我们就需要主动的去告诉各个搜索引擎,让他们知道我们这个小网站的存在。比如百度站长平台,我们可以先到「站点管理」添加一个自己的站点。 说一下每个站长平台都具备的一个功能,那就是提交自己网站地图的接口。新站一开始都可以通过这些接口去提交我们网站的链接,将站点提交到各个搜索引擎以后,可以加快蜘蛛抓取我们网站的速度,增加网站被收录的速度。当然也有人说用老的域名比较好,这一点我自己并没有亲身尝试过,不敢妄下断论。 像必应站长后台还有个网站扫描功能,谷歌也有类似的网址检查功能,我们可以借用这些工具看看如何优化自己的网站,让自己网站的内容对搜索引擎爬虫程序更加友好。
Read More ~

买课程囤在那里不看,你怎么可能进步

文章于 2018-04-15 在微信公众号「刘小绪同学」发布,原文链接:你如果只是一直囤干货,那永远不可能进步,今日重读做了部分改动 这两天,没事整理了自己的微信收藏和 QQ 收藏文件夹下面的文章。发现了一个在大多数人身上都存在的问题,那就是囤干货。 我使用微信的时间比较晚,从14年才开始,但是仅仅不到4年的时间,在微信收藏里面就有几百篇文章,有一些传授技能的文章,比如 word、ps 等简单教程;其他一些属于心灵鸡汤类文章(现在反倒不觉得这类文章值得看),还有一些搞笑的文章,当然里面也夹杂着些许的优秀视频。文章数量数 14 年和 15 年最多。 现在回头看,我当时就陷入了囤文章的陷阱了,或者说自己是在“假装阅读”。仔细一想,其实生活中大多数人都有类似的举动。早成起床、饭后的一段时间、晚上睡觉前,这些时间大多数人都习惯性的去翻翻公众号、朋友圈,这里面不乏有好文章、干货文章。然而没多少人会静下心来把文章读完,而是在大概读到一半的时候,选择收藏这篇文章,然后在心里告诉自己,明天要好好读一下这篇文章。到了明天,其实又是重复了今天的这样一个过程。 记得大概一年前也无意中看到大学认识的一位师弟发的说说,内容如下: 上面的图是我特地翻出来的,一年后这个师弟又发了一条说说,存满了两个云盘,应该是有 5000 G 左右的资源。 我认为这都是在假装学习,而且假装学习的人不计其数。为什么上学的时候,那些每天都静静的待在教室学习的同学,成绩反倒不是很好呢?而且大多数这样的学生在班级都是排在中等,而成绩好的学生却不是学习投入最多的人。背后的原因显而易见。 我囤课最严重的时间段是也是 14 年和 15 年,网上有不少干货资源,什么 Linux、各种项目实战、计算机网络等等培训视频不计其数。那时候干的第一件事就是,上百度云把这些资源下下来,而且一个资源往往要下一周甚至更久;然后告诉自己,下周开始每天看一段视频,但是最终的结果是过去了 N 个下周,依然没有去处理这些资源。 现在博客、公众号也有一些不知道是为了获取更多人的关注,还是仅仅是做公益,文章末尾会标注:关注公众号,回复“XXXXX”,即可获得多少多少G的资源,这个「多少」一般是在 500 以上。我个人现在是对这类文章没有什么兴趣的,因为几百 G 甚至上千 G 的东西,我是不可能看完的,我清楚自己的能力,我也不否认可能有人有毅力能看完,那肯定是凤毛菱角了,我一个普通人不与凤毛菱角对比。 我于 19 年开始使用豆瓣,用上豆瓣之后就冒出来另外一个毛病,总想快速的把一本书看完而不去管有没有真正理解书里面的知识,总花很多时间看更多的电影,仅仅是为了在豆瓣上标记「看过」、「读过」那一刻的快感。 走出象牙塔之后事情变得繁杂琐碎,什么事都想做到最好还什么事都想去做,问题是那些边边角角的事情还经常扰乱自己的视线,结果没有一件做的像样的事情。 当然,我现在的认识相比几年前,得到了一些提升,至少我现在不糊干囤课之类的事了,仅仅是把干货囤在那里,其时你还是昨天的自己,并没有进步,重要的不是自己买了多少优质的课程,而是去动手动脑学习,最好的学习就是实践。现在我都会把自己收藏的好文章在一周之内处理掉。 所以要想真正取得进步,首先就需要告别囤课的习惯,不能假装学习,如果学习是为了给比别人看,那还不如不学。文章仅是我个人的一点感悟,没有文采逻辑和言,希望与你共勉。
Read More ~

如何搭建一个属于自己的博客/企业网站

参考内容: 如何做博客/企业站以及注意事项 Typecho支持Emoji表情方法 说明:此篇文章得益于王红星的指导,喜欢直接粗暴一点的朋友可以跳过前面,直接从程序的选择开始阅读。 我的博客搭建之路 说起来有点惭愧,我自己是计算机科学与技术专业出身,虽然博客系统在我眼里是很简单的系统,但是我却一直畏惧从零开始搭建一个系统的麻烦性,因为但是安装程序的运行环境就会耗掉我大量的时间,再加上我写代码、测试、上线等工作少说也得要四五天!所以我一直都在 CSDN 一类的平台写作,然而这些平台为了利益把体验做的越来越差! 还在大学时听说过 WordPress 可以搭建博客,不过总是迈不出行动的步伐,认为一旦涉及到服务器的工作就不会简单。直到我在 Twitter 发现有人推荐 Gridea,才发现搭建博客系统原来可以这么简单,主要还是免费的。 于是我借用 Gridea 和 Github Pages 搭建了一个博客系统,EryouHao 开发的这个写作软件用起来相当便捷。但是 Github Pages 在国内总是速度很慢,而且图片资源经常加载不出来,而且 Gridea 是用 Vue 技术开发的,打包成桌面软件后总会出现卡顿情况,自己写作的那个劲又逐渐褪去了。在2020 年国庆观《我和我的家乡》有感所写中也提到在知乎一不小心就违反了社区规范,索性花功夫研究如何搭建自己的博客系统,也才有了这篇简单的教程。 一个博客/企业站需要什么 可以在网络上访问的东西背后都有一套程序支撑,博客系统(企业站点)就是运行在某处的一套程序。要把一套程序运行起来,肯定需要运行程序的空间和驱动程序运行的系统,比如我们的手里的电脑就是一种运行程序的空间,你使用的系统(Windows、macOS、Linux)就是驱动程序运行的系统,下面推荐的服务器都已经把把空间和驱动给你安装好了,所以完全不用担心自己不懂如何安装。 程序运行起来了还得让外面的人看到才行,所以我们还需要一个域名(类似于www.baidu.com一样的东西),我们把这个域名绑定到服务器上,别人在浏览器输入这个域名就能看到我们的博客(程序)了。 如果希望自己的博客打开速度很快,除了选择比较好的空间外,还可以购买 CDN 服务;希望自己的文章能更好的被百度之类搜索引擎收录的话,可以购买独立 IP 主机。 程序的选择 WordPress 应该是目前全球使用的最广泛的开源程序,结构良好,功能强大,社区内容丰富。但是对于博客(企业站点)来说,WordPress 就显得比较臃肿。Typecho 是一个轻量、简洁、快速的程序,除了官方论坛,在https://typecho.me/也有很多主题和插件。虽然 Typecho 各种主题、插件没有 WordPress 丰富,但是对于搭建博客系统已经足够了。 网上也有文章对两个系统做了对比,比如这篇:个人博客平台选择 Typecho 还是 WordPress ?Typecho 是原生支持 Markdown 语法的,可能是喜欢 Markdown 写作同学的福音,具体选 Typecho 还是 WordPress 可以凭自己的感觉,两个程序之间也是可以互相迁移的。 WordPress 安装包下载:https://wordpress.org/download/(12.4M) Typecho 安装包下载:http://typecho.org/(400K) 空间的选择 空间类型包括服务器、VPS和虚拟主机,它们的价格是逐渐减少的。对大部分人来说并不是越贵越好,比如服务器和 VPS 还需要自己懂一些运维知识才行。仅仅只是搭建博客(企业站点)的话,一个虚拟机就足够使用了,又便宜又不费心。 空间地理位置是需要重点考虑的一个因素,如果你做的是英文站点、都是国外用户,那可能一个美国主机更适合你;如果你的用户是国内的话,那大陆主机和香港主机可能更适合你。 王红星在他的文章中推荐了两个主机商,分别是衡天主机和戈戈主机。我自己选的是衡天主机,有问题可以随时通过他们的客服询问或是提工单,体验很不错!偷偷告诉你,在购买前可以搜搜优惠码!阿里云也很不错,只是稍微有点贵! 域名注册 国内有腾讯云、阿里云、爱名网等域名注册商,国外有 Name、Namecheap、Godaddy、Dynadot 等域名注册商。有些域名商默认会提供域名保护功能,有的则需要购买该功能。各个域名注册商的价格也都差不多,根据自己的实际需求选一个就可以了。 我自己选的是腾讯云,它第一年域名的优惠力度比较大,比如我要注册guanngxu.com这个域名,可以看到都是有优惠的。 腾讯云:https://dnspod.cloud.tencent.com/ 阿里云:https://wanwang.aliyun.com/ 爱名网:https://www.22.cn/ 域名解析 我们所有的准备工作都做好了,下一步就是安装程序搭建博客系统了,下面我以衡天主机安装 Typecho 为例进行一个简略的讲解,结合我下面的内容和网上的资料,应该很快就能搭建自己的博客系统了。 主机购买后就知道它的 IP 地址了,首先我们去域名注册商处选择把域名解析到我们买的服务器上面。以腾讯云为例,在「我的域名」页面点击「解析」-->「快速添加网站/邮件解析」后会弹出如下页面。 选择「网站解析」的「立即设置」后会弹出另一个页面,你只需要在这个页面把你购买的主机 IP 地址填进去就可以了。稍等几分钟直接在浏览器输入域名访问,如果浏览器出现了页面而不是报找不到服务器 IP 地址,那么域名解析就完成了。 安装 Typecho 进入到云主机管理面板后,点击「文件管理器」可以看到如下图的目录,其中public_html目录就是咱们博客程序的目录,我们把下载好的 Typecho 包上传到这个目录并解压。 需要注意的是解压后的目录是build目录,我们需要将解压后的目录移动到上一级,,保证public_html目录看到的是下图这个样子的,然后再输入域名去访问自己的博客。 如果不出意外,输入域名后出现的应该是下面的页面,点击「我准备好了,开始下一步」发现了什么?需要填写数据库信息。我们再回到衡天云主机管理面板,滑到「数据库管理」选择「新建数据库」,设置数据库名、数据库用户名、密码等,点击「创建」即可,这些信息就是安装 Typecho 需要的信息,再回到之前的页面把这些信息填进去,自己的博客系统就搭建完成了。 那么现在你就拥有了一个自己的博客系统,如果样子不太好看你可以去官方论坛或https://typecho.me/里面找自己喜欢的主题,如果有能力甚至可以自己修改或原创主题,一些插件在上面也都是可以找到的。 Typecho 官方也提供了相应的安装文档,如何使用插件、如何调整网站外观等常见问题在官方链接http://docs.typecho.org/doku.php也都已经有说明了,此处便不再作赘述! 让 Typecho 支持 Emoji 表情 21 世纪的互联网时代怎么能少了 Emoji 表情呢?由于编码问题,Typecho 默认是不支持 Emoji 表情的,所以我们只需要将编码改成支持 Emoji 表情的编码就可以了,具体一点就是把原来的utf8编码修改为utf8mb4,修改编码的方式如下: 修改数据库编码 在衡天云主机管理面板选择「phpMyAdmin」,然后选择你刚才建立的数据库,选择「操作」-->「排序规则」-->「utf8mb4_unicode_ci」-->「执行」 修改表编码 在 phpMyAdmin 面板点击「SQL」,直接运行下面的语句就可以了。要注意你所建表的前缀,我建表所填写的前缀是gx,所以我都是gx_xxxxxxxxx,默认前缀是typecho。 alter table gx_comments convert to character set utf8mb4 collate utf8mb4_unicode_ci; alter table gx_contents convert to character set utf8mb4 collate utf8mb4_unicode_ci; alter table gx_fields convert to character set utf8mb4 collate utf8mb4_unicode_ci; alter table gx_metas convert to character set utf8mb4 collate utf8mb4_unicode_ci; alter table gx_options convert to character set utf8mb4 collate utf8mb4_unicode_ci; alter table gx_relationships convert to character set utf8mb4 collate utf8mb4_unicode_ci; alter table gx_users convert to character set utf8mb4 collate utf8mb4_unicode_ci; 修改数据库配置文件 数据库配置文件在public_html文件夹下,文件名为config.inc.php,其中有一行的内容是charset => utf8,将它修改为charset => utf8mb4就可以了。 看看有了小表情是不是很可爱?
Read More ~