时间管理-总结

前言:

用时间管理也四年多了,时间管理,番茄工作法,GTD 有很多叫法,如果不细分的话,那他们其实是一个东西,就是给我们的工作、生活、学习、做计划,让他们能更好的完成,把事情做完,并且不感到疲倦,轻松生活。

正文:

一、  三者关系


时间管理

是指通过事先规划和运用一定的技巧、方法与工具实现对时间的灵活以及有效运用,从而实现个人或组织的既定目标。

GTD:

GTD就是Getting Things Done的缩写,翻译过来就是“把事情做完”,GTD的核心理念概括就是必须记录下来要做的事,然后整理安排并使自己一一去执行。GTD的五个核心原则是:收集、整理、组织、回顾、执行。

番茄工作法

番茄工作法是简单易行的时间管理方法,是由弗朗西斯科·西里洛于1992年创立的一种相对于GTD更微观的时间管理方法。

使用番茄工作法,选择一个待完成的任务,将番茄时间设为25分钟,专注工作,中途不允许做任何与该任务无关的事,直到番茄时钟响起,然后在纸上画一个X短暂休息一下(5分钟就行),每4个番茄时段多休息一会儿。

关系对比:

时间管理-番茄工作法-GTD

水果-苹果-红富士

液体-牛奶-鲜牛奶

类-对象-值改变了的对象

时间管理是通指 通过一些方法管理时间,组织,安排,达到目标,GTD是时间管理的一种方法,详细怎么去做的,而番茄工作法更微观,强调的是25分钟一个番茄,在下面统称时间管理。

、认识时间管理


先说下时间管理的目标吧,其实归总一下目标还是蛮多的,我列举了一些主要的

1  把事情做完

我们经常有很多事做不完,如工作有项目延期,或者突发情况导致拖慢进度,生活有想去一个地方一直没有去,想看望父母也没有时间,或一直想做一些什么事,学习上有一直想了解的新技术,有想学的新框架,有想试验的项目,但事实,项目延期,很少去看望父母,想学的也一直没有时间来做,我们要把事情做完!

2  轻松生活

事情不仅做不完,而且一件接着一件,你有没有感觉忙不过来,你有没有感觉脑袋疼,你有没有感觉一天下来累的半死,但是项目还是延期,活还是没有干完…..,有了时间管理会让你的工作学习生活变得无比轻松。

3 高效

其实这个的目标也是把事情做完,但我想但拿出说一下,因为我想会有一些人,做了计划或者做一些事,总是拖拉,延期,感觉事情就是做不动,一拖再拖,做了很长时间但是没有效果,没有成功,没有效率,时间管理帮你提高效率。

三、怎么做?


其实回头看了自己写的博客,写时间管理的这已经是第四次了,之前从认识或总结或实践的方面写,写的都不够全面,那怎么才算全面?永远都全面不了,不过我还是想再写一次怎么做,因为我又有了新的看法。

第一步:清空大脑

        很简单,把你脑袋里,所有!所有!所有要做的事!都出来,纸上,电脑上,都可以,不管你是否已经决定是否做还是不做,都要写出来,先不要问为什么,先写出来,对现在就拿一张纸。

注:上厕所,喝水这都不算一件事,去采购蔬菜,去看望父母这是一件事,简单来说就是需要你脑子记着要办的事。

第二步:安排计划

         现在我们已经有了一个任务清单,现在我们要安排如何做这些事

分类

1 . 按照四象限原则  1 紧急重要 2 紧急不重要 3 重要不紧急 4 不紧急不重要  把任务进行分类

2 . 预估任务的番茄数量(一个番茄25分钟) 写在任务的后面,如洗衣服我需要2个番茄。

3 . 安排一周或者一天的执行计划,初期建议1天(因为你会发现要改!) 一天的工作时间是8 小时 也就是16个番茄 , 建议安排10-12个番茄的任务,留出4-6个番茄应对突发状况,任务执行顺序按照四象限的执行顺序,先执行紧急重要的任务,然后是紧急不重要。

最重要:一定要写上任务的终止日期!在这个日期之前必须完成任务!

第三步: 开始番茄

执行:来吧! 开始我们的番茄之路,按照计划表,25分钟一个番茄专注于这件事执行

休息:执行完一个番茄休息5分钟,执行完4个番茄休息15分钟,

打断:如果执行的时候有突发事件,用2分钟原则,如果这个事2分钟之内能做完,就去做,然后继续番茄,如果大于2分钟 就要写入任务列表

第四步:回顾优化

        每天回顾自己的番茄执行,看看因为什么原因打断,以后要提前计划避免打断,看看自己时间花在哪了,有没有可以优化或者注意的地方,在下一次做计划的时候注意下。

四、为什么这么做?

为什么 清空大脑?

为什么还要写出来?感觉很麻烦啊!

1 容易忘记:其实我一开始也这么想,但是你要知道记东西不是大脑的优势,大脑一般只能记住4件事,最多7件(我说的是大多数人),你很有可能忘了做某件事,导致损失。

2 不能专注:如果你脑袋里记着要做的事,为了避免忘记你就会一直重复的想,导致25分钟番茄的时候不能专注的执行任务,降低效率。

3 累:没错一直想要做什么事实非常累的,如果你有20件要做的事,那么你将是崩溃的,何况有很多管理人员不止20件。

为什么 安排计划

为什么还要写出详细计划来?感觉很麻烦啊!

1 最重要的事:如果你不安排计划,不分类,你将不能把真正重要的事情做完,要做的事很多,事情永远做不完,如果所有事是100% 那么有20% 的事是必须做的,不做后果非常严重,有60%的事是尽量做的,如果我们能做,尽量要把这60%的事做完,还有20%不做也没啥事,记住我们不可能把所有事情都做完,只能做完最重要的事。、

2 确定能完成:有了详细的计划就能在任何一个时间确定我们是否能完成任务,比如有个任务做3天,每天做2个番茄,如果第二天没有做2个番茄,或者做的进度没有达到60%那么这个任务肯定做不完,我们就可以更改计划,保证任务的完成,别跟我说你能记住计划,写出来。

3 为啥要写日期:用过一段时间管理后我发现,如果不把一个任务定一个日期,那么就会导致拖延,无限的增加番茄,导致任务不能如期完成,所以一定要给一个任务下一个时间,这个真的非常重要!

为什么 开始番茄

为什么是25分钟?

经过大数据统计,大多数人的专注时间是25分钟,专注做事情效率是最高的!所以是25分钟,当然也可以根据自己的专注度调节,我说的是调低,如20分钟,建议不要高于25分钟,如40分钟一个番茄,一个是累,一个是效率低。

为什么要休息?

休息5分钟是为了下一个25分钟能保证你专注高效的工作和学习!休息非常重要,4个番茄休息15分钟,这样才能保证你每个番茄都很高效,能把事情做完,并且还不疲倦,别小看这个5分钟,不要傻傻的以为一直做效率就是最高的,当你头疼的时候你什么都做不了。

为什么要休息?

根据经验,其实我感觉还有一个好处,就是把时间分段,你有没有感觉一上午刷,过去了,你啥都没做呢还,或者刚开始做,正所谓旧闻花香就不觉得花香了,每25分钟休息5分钟,把时间分段,你会感觉时间更长了,并且做更多的事。

 为什么 回顾优化

        这个我觉得没什么好说的,因为你只有分析自己把时间花在哪了,才能优化计划,回顾建议一周一次,不用很频繁。

 

五、我的经验

那么跟大家说说我这几年用时间管理的经验吧,经验都很碎片,不过都很真实。

1 时间管理最重要的 两 点

1 给任务设定一个最终日期(让你把事情做完不拖延)

2 休息5分钟(让你高效并且轻松)

再次强调!25分钟多1分钟都别做!休息!休息!如果你每次多做1-3分钟,最后一个番茄就没了!你觉得效率高么?

2  还有个24分钟

你会发现 25 分钟结束,突然停止,你在做有可能任务接不上,如写代码,思路就断了,我们需要时间来善后,对每次执行到24分钟的时候 叮咚 提醒 你还有1分钟 ,你可以为你做的事情善后,保证下次做可以接上,很多时间管理软件都有这个功能,如番茄土豆

3 不要有坏心里

哎呀今天没做几个番茄,任务又没做完,计划又变了,首先这些一开始都是正常的,一天10个番茄就很棒了! 任务没做完是估计时间也就是番茄的数量不对,这个长期训练才能把时间估计的差不多,而且也许有很多未知的事根本无法真正预估时间,计划改变也是很正常的,也许是有突发情况,那么我们就每天留出4-6个番茄来应对突发情况,总之不能有消极的心里,心态已经要好。

4 2/8定律

不要追求完美,百分之八十做好就已经很不错了,我们可以追求更好,但永远没有最好,一周也可以1天什么都不安排,就让时间‘荒废’过去,彻底的放松下,随便做点什么,这样的好处一个是你会感觉时间管理效率高,另一个是 人不能蹦的太紧,太紧会断,要松弛有度,关键的百分之20的事情做好其实就好,还有百分之六十的事我们尽量做,剩余百分之二十的事不要去做。

5 如果真的不想用时间管理了

感觉记录很多什么任务,安排计划真的很麻烦,也没感觉效率高了,那就停下来不用,我有过几次停止不用,有的时候一周,有的时候1到2个月,但我最后还是又开始用,很简单,因为时间管理真的有效,高效,轻松,直到他融入你的血液,你不自觉的就会用,当然我觉得也有少数人人不适合时间管理。

六、进阶:谷歌日历邮件提醒手机提醒

谷歌日历:

如果说时间管理是战术,那么日历就是战略,你可以规划你一个月,甚至一年要做的一些事,你可以记录你一年后或者十年后要做的某些小事,有意义但是又不重要又不费时间,然后给自己发邮件,收到邮件把事情写到任务列表,同样是清空大脑。

邮件:

我们的任务不光来自大脑,其实大多数任务应该来自邮件,如果再深入说就比较多了,可以简单理解日历的提醒邮件和上司同事给你发的邮件,整理成任务放到任务列表。

手机提醒:

有些小事需要手机提醒,你不可能时时刻刻带着电脑的任务列表(pc手机同步也很费劲,我用的Excel),而且有些小事确实写上去也很麻烦,不如定个手机闹钟提醒你去做。

总结

做了4年多的时间管理,断断续续,人生真是一场漫长的修炼,但又在眨眼之间,我们要学的东西很多,既要站在巨人的肩膀上也要有自己的看法和见解,毕竟我们每个人是不一样的,世界也是丰富多彩的,那么如果你没有做过时间管理不妨开始尝试一下,也许会发现不一样的天空,如果你在做,希望本篇文章能给你带来收获与心得想法。

 

—————————我是chenchen—————————

 

欢迎大家品发邮件与我交流

邮箱:2228664347@qq.com

转载请在开头注明:这文章是chenchen写的!

 

爱学习前端代码规范v0.1

  • 基础配置:

编辑器请采用:vscode 下载链接:https://code.visualstudio.com/

设置代码缩进为2,采用空格缩进:”editor.tabSize”: 2

  • 文件名命名:

文件(文件夹)名单词间隔用“-”隔开,不要采用大小写(因为windows git不识别大小写)

例如:item-scroll.jsx、inner-top.vue、class-list/

  • 文件目录说明:

components/ 基础组件存放位置,*说明:基础组件一定不要携带任何业务及上下文,比如在button中写死了某个文案,就是携带业务

modules/ 基础模块存放位置,*说明:与基础组件一致,有多个基础组件组成

assets/ 静态文件存放目录

utils/ 公共函数库

pages/ 页面存放目录,*说明:每个大的页面尽量拆分子模块,子模块存放到自己页面的文件夹下,例如:pages/index/top.vue、pages/index/body.vue、pages/index/.vue

  • 代码规范(eslint配置):
“no-unused-vars”: “off”, // 关闭未使用变量检测
“no-console”: “off”, // 关闭使用console检测
“no-undef”: “off”, // 关闭未定义变量检测
“no-unreachable”: “off”, // 关闭强制返回检测
“no-constant-condition”: “off”, // 关闭判断条件中的常量检测
“semi”: “off”, // 关闭分号检测
“no-multi-spaces”: 1, // 不能有多余的空格
“curly”: [2, “all”], // 必须使用 if(){} 中的{}
“comma-dangle”: [“error”, “only-multiline”], // 允许对象末尾逗号,也可不写
“comma-spacing”: [“error”, { “before”: false, “after”: true }], // 逗号后面必须带空格
/**
* 对象空格限制 正确的例子
* var obj = { “foo”: 42 }
*/
“key-spacing”: [
  “error”, { “beforeColon”: false, “afterColon”: true, “mode”: “strict” }
],
/**
* 函数定义风格
    function foo() {
    }
    var bar = function () {
    }
    class Foo {
      constructor() {
      }
    }
    var foo = {
      bar() {
      }
    }
*/
“space-before-function-paren”: [
  “error”, {“anonymous”: “always”, “named”: “never”}
],
// 缩进必须用tab缩进 两个空格一个缩进
“indent”: [2, 2, { “SwitchCase”: 1 }],
// 不要写分号,除非自执行函数
“semi”: [“error”, “never”],
// 操作符前后在空格
“space-infix-ops”: “error”,
// 关键字后必须带空格
“space-after-keywords”: [“error”],
// 关键字前不能带空格
“space-before-keywords”: [“error”, “never”]

代码示例

基础组件示例:
DB5788DA-3AD6-4306-B6C9-752EC425E47C
DB5788DA-3AD6-4306-B6C9-752EC425E47C
68A218B7-B57A-4BEA-B0C0-5E878DF5889E
具体页面代码示例:
64EDC79B-A1D5-4183-9F34-94DD41C9DC76
业务页面具体实例:
2E4DEB19-A917-414B-954A-F2614A859D2F
方法名定义
所有绑定事件类的方法统一前缀 on 例如:onOpen、onMessage
所有后端拉取数据的方法统一前缀 get 例如:getList、getStudentDetail、保存统一前缀save、更新统一前缀update、删除统一前缀delete
所有内部私有方法统一前缀 _ 例如:_compareTime、_isStudent

数据库和数据仓库的区别

整理自知乎问答,非原创:数据库 与 数据仓库的本质区别是什么?

举个最常见的例子,拿电商行业来说好了。

基本每家电商公司都会经历,从只需要业务数据库到要数据仓库的阶段。

* 电商早期启动非常容易,入行门槛低。找个外包团队,做了一个可以下单的网页前端 + 几台服务器 + 一个MySQL,就能开门迎客了。这好比手工作坊时期。

* 第二阶段,流量来了,客户和订单都多起来了,普通查询已经有压力了,这个时候就需要升级架构变成多台服务器和多个业务数据库(量大+分库分表),这个阶段的业务数字和指标还可以勉强从业务数据库里查询。初步进入工业化。

* 第三个阶段,一般需要 3-5 年左右的时间,随着业务指数级的增长,数据量的会陡增,公司角色也开始多了起来,开始有了 CEO、CMO、CIO,大家需要面临的问题越来越复杂,越来越深入。高管们关心的问题,从最初非常粗放的:“昨天的收入是多少”、“上个月的 PV、UV 是多少”,逐渐演化到非常精细化和具体的用户的集群分析,特定用户在某种使用场景中,例如“20~30岁女性用户在过去五年的第一季度化妆品类商品的购买行为与公司进行的促销活动方案之间的关系”。

具体分析二者的不同:
* 数据库 OLTP(Online Transaction Processing) ;数据仓库 OLAP(Online Analytical Processing)
* 业务数据库中的数据结构是为了完成交易而设计的,数据仓库是为了查询和分析的便利设计的。
* 数据库通常追求交易的速度,交易完整性,数据的一致性,等等,在数据库模型上主要遵从范式模型(1NF,2NF,3NF,等等),从而尽可能减少数据冗余,保证引用完整性;而数据仓库强调数据分析的效率,复杂查询的速度,数据之间的相关性分析,所以在数据库模型上,数据仓库喜欢使用多维模型,从而提高数据分析的效率。
* 业务数据库面向的是业务人员,而数据仓库面向的是分析人员
* 数据库一般存储在线交易数据,数据实时在变;数据仓库存储的一般是历史数据,固定间隔形成快照

Android Easypermission的介绍

1.相关文档

官方文档: https://github.com/googlesamples/easypermissions

运行时权限官方文档介绍:https://developer.android.com/training/permissions/requesting.html

2.为什么使用Easypermissions

Android M对权限系统进行了改变。Android M之前所需权限只需要AndroidManifest中申请即可。但更新Android M系统后,部分“Dangerous Permission”需要在运行时询问申请。

Android 权限分类:

Nomal Permission:

ACCESS_LOCATION_EXTRA_COMMANDS
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
BLUETOOTH
BLUETOOTH_ADMIN
BROADCAST_STICKY
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
DISABLE_KEYGUARD
EXPAND_STATUS_BAR
GET_PACKAGE_SIZE
INSTALL_SHORTCUT
INTERNET
KILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_INSTALL_PACKAGES
SET_ALARM
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
UNINSTALL_SHORTCUT
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS

Dangerous Permission:

group:android.permission-group.CONTACTS
  permission:android.permission.WRITE_CONTACTS
  permission:android.permission.GET_ACCOUNTS
  permission:android.permission.READ_CONTACTS

group:android.permission-group.PHONE
  permission:android.permission.READ_CALL_LOG
  permission:android.permission.READ_PHONE_STATE
  permission:android.permission.CALL_PHONE
  permission:android.permission.WRITE_CALL_LOG
  permission:android.permission.USE_SIP
  permission:android.permission.PROCESS_OUTGOING_CALLS
  permission:com.android.voicemail.permission.ADD_VOICEMAIL

group:android.permission-group.CALENDAR
  permission:android.permission.READ_CALENDAR
  permission:android.permission.WRITE_CALENDAR

group:android.permission-group.CAMERA
  permission:android.permission.CAMERA

group:android.permission-group.SENSORS
  permission:android.permission.BODY_SENSORS

group:android.permission-group.LOCATION
  permission:android.permission.ACCESS_FINE_LOCATION
  permission:android.permission.ACCESS_COARSE_LOCATION

group:android.permission-group.STORAGE
  permission:android.permission.READ_EXTERNAL_STORAGE
  permission:android.permission.WRITE_EXTERNAL_STORAGE

group:android.permission-group.MICROPHONE
  permission:android.permission.RECORD_AUDIO

group:android.permission-group.SMS
  permission:android.permission.READ_SMS
  permission:android.permission.RECEIVE_WAP_PUSH
  permission:android.permission.RECEIVE_MMS
  permission:android.permission.RECEIVE_SMS
  permission:android.permission.SEND_SMS
  permission:android.permission.READ_CELL_BROADCASTS

123

运行时权限申请

代码中如果需要申请运行时权限步骤:

1 检查运行时权限

ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED

2 申请权限

ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);

3 接收权限处理结果

@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the
                // contacts-related task you need to do.

            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

以上即是google建议的运行时权限处理过程。代码量和处理地方还是比较繁琐的。so,Easypermissions应运而生。

3.如何使用

引入库

dependencies {
  compile 'pub.devrel:easypermissions:0.1.9'
}

easypermissions处理权限分为3步:

1 检查权限

String[] perms = {Manifest.permission.CAMERA, Manifest.permission.CHANGE_WIFI_STATE};
if (EasyPermissions.hasPermissions(this, perms)) {
   //...     
} else {
    //...
}

2 申请权限

EasyPermissions.requestPermissions(this, "拍照需要摄像头权限",
                    RC_CAMERA_AND_WIFI, perms);

3 实现EasyPermissions.PermissionCallbacks接口,直接处理权限是否成功申请

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        // Forward results to EasyPermissions
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }

    //成功
    @Override
    public void onPermissionsGranted(int requestCode, List<String> list) {
        // Some permissions have been granted
        // ...
    }

    //失败
    @Override
    public void onPermissionsDenied(int requestCode, List<String> list) {
        // Some permissions have been denied
        // ...
    }

4.总结

Easypermissions主要简化了对权限申请结果的处理和判断,直接以接口的方式回调处理结果.不需要再自行进行处理,代码简介明了.

 

2017前端发展趋势

回顾2016年前端市场,可谓如火如荼。各种前端的框架/库层出不穷,给大家带来方便的同时,也使得前端开发人员面临更多的学习成本。

2017年的前端会有怎样的变化呢?

一、微信小程序

微信小程序

微信小程序是一种可以媲美原生app的“app”,上市当天便在业内引起较大轰动。其实早在小程序之前也有百度轻应用这样的产品,很遗憾并未做起来。

究竟小程序会爆发多大的威力,我们拭目以待。但是可以肯定的是,一定会催生大量的小程序开发人员。而小程序用到的开发语言,就是我们前端的Java。相对于其他开发人员,这也是前端开发的一波红利。

二、Vue.js

Vue.js

是一个构建数据驱动的 web 界面的渐进式MVVM框架。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。它只聚焦视图层,是一个构建数据驱动的Web界面的库。通过简单的API(应用程序编程接口)提供高效的数据绑定和灵活的组件系统。

它有如下优点:

1.轻量级的框架

2.双向数据绑定

3.指令

4.插件化

作为一个国产框架,又做的如此优秀,这里强烈推荐大家学习使用该框架。

三、React

React

React 起源于 Facebook 的内部项目,因为该公司对市场上所有 Java MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站。React 的设计思想极其独特,属于革命性创新,性能出众,代码逻辑却非常简单。所以,越来越多的人开始关注和使用,认为它可能是将来 Web 开发的主流工具。

和Vue有点类似,React采用特殊的JSX语法,Vue.js在组件开发中也推崇编写.vue特殊文件格式,对文件内容都有一些约定,两者都需要编译后使用。

区别于Vue.js使用的是DOM模板,而React依赖Virtual DOM。React采用的Virtual DOM会对渲染出来的结果做脏检查。

四、es6

es6

ECMA 6.0(简称ES6)是Java语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得Java语言可以用来编写复杂的大型应用程序,成为企业级开发语言。相对于es5它有如下特点:

  • 箭头函数
  • 字符串
  • 解构
  • 模块
  • 参数

等等重大变革……

你可以简单理解es6相对于es5,犹如css2.0相对于css3.0。虽然es6还不能做到所有浏览器都支持,但这或许也不影响你开始学习它。

五、支付宝小程序

支付宝小程序

无独有偶,支付宝也将推出小程序(其实其团队内部已经好几个产品是基于支付宝小程序开发的了)。如果说微信小程序能够让前端翻了天,那我们也相信支付宝小程序也会是一股强大的力量。让我们持续关注吧。

六、Electron

Electron

Electron 提供了一个实时构建桌面应用的纯 Java 环境。简单来说,你可以使用Electron 来写一个桌面程序。比如:一个可以运行在windows上的百度云软件。

Node.js学习

用node读取xxx.lrc歌词进行循环滚动
个人连接:https://zhangzs000.github.io/
//读取歌词文件
//使用cmd进入node脚本模式
const fs=require(“fs”);
const path = require(“path”);
let _path=path.join(__dirname,‘./xxx.lrc’)
fs.stat(_path,(err,stats)=>{
if(err) throw err;
//console.log(stats)
fs.readFile(_path,(err,content)=>{
if(err) throw err;
//默认的就是utf-8,所以不用写。
//console.log(content.toString(‘utf-8’))
let lines = content.toString(‘utf-8’).split(‘\n’);
//console.log(lines);
let rg=/\[(\d{2})\:(\d{2})\.(\d{2})\](.+)/;
lines.forEach((line,index)=>{
//console.log(rg.test(line))
let matchs =rg.exec(line);
if(matchs){
//console.log(matchs)
let h = matchs[1];
let m = matchs[2];
let _s = matchs[3];
let w = matchs[4];
setTimeout(()=>{
console.log(w);
//定时器的参数是毫秒
},h*60*1000+m*1000+_s*10)
}
})
})
});

Git命令浅尝

最初使用git是觉得分布式的管理代码方式很酷与集中式管理的小乌龟相比感觉,代码管理变的更方便。但自己使用的git常用命令就那么几个(clone、checkout、 add、commit、pull、push…)没有认真去思考过太深层次的东西,还有一些冷门的指令,为什么没使用过呢,对于哪些场景可以用呢?

  1. git stash

git stash 可用来暂存当前正在进行的工作, 比如想pull 最新代码, 又不想加新commit, 或者另外一种情况,为了fix 一个紧急的bug,  先stash, 使返回到自己上一个commit, 改完bug之后再stash pop, 继续原来的工作。
基础命令:
$git stash
$git stash pop

当你多次使用’git stash’命令后,你的栈里将充满了未提交的代码,这时候你会对将哪个版本应用回来有些困惑,’git stash list’ 命令可以将当前的Git栈信息打印出来,你只需要将找到对应的版本号,例如使用’git stash apply stash@{1}’就可以将你指定版本号为stash@{1}的工作取出来,当你将所有的栈都应用回来的时候,可以使用’git stash clear’来将栈清空。

  1. git rebase 和 git merge
    (相关的资料:https://www.atlassian.com/git/tutorials/merging-vs-rebasing)

这两个都是用来做合并的,rebase的意思是复位基底,merge 是合并。Merge 操作会产生一个新的节点,之前的提交会分开显示。而rebase操作不会产生新的节点,是将两个分支融合成一个线性提交。想要更好的提交树,使用rebase操作会更好一点。这样可以线性的看到每一次提交,并且没有增加提交节点。 在我们操作过程中。merge 操作遇到冲突的时候,当前merge不能继续进行下去。手动修改冲突内容后,add 修改,commit 就可以了。而rebase 操作的话,会中断rebase,同时会提示去解决冲突。解决冲突后,将修改add后执行git rebase –continue继续操作,或者git rebase –skip忽略冲突。

例如,如果您和另一名名为John的开发人员向该feature分支机构添加了提交,则在feature从John’s repository 获取远程分支之后,您的存储库可能如下所示:在同一功能部门进行协作

您可以与您集成上游更改的方法完全相同master:将您的本地feature与您的本地组合john/feature,或将您的本地重新绑定featurejohn/feature

合并与重新分配到远程分支上

这个rebase并没有违反“ 黄金feature治理准则”(git rebase是永远不要在公共分支上使用它),因为只有您的本地提交被移动 – 在此之前的所有事情都未被触动。这就像说“将我的更改添加到John已经完成的内容”中。在大多数情况下,这比通过合并提交与远程分支进行同步更直观。

默认情况下,该git pull命令执行合并,但您可以强制它通过传递该--rebase选项来将远程分支与rebase集成。

以上就是最近使用过的一些git命令,以后会多多留心这些细节的地方,归纳总结,探究明白,更好的运营到工作和学习里。

ES7初步 Async/Await 之于异步编程

在前端的业务中经常出现一种场景:我们先执行promise1,然后根据返回值,作为参数传入promise2,之后再根据这两个Promises得值,执行promise3。

如果使用Promise

const makeRequest = () => {
return promise1()
.then(value1 => {
// do something
return promise2(value1)
.then(value2 => {
// do something
return promise3(value1, value2)
})
})
}

Promise.all可以来避免很深的嵌套。

const makeRequest = () => {
return promise1()
.then(value1 => {
// do something
return Promise.all([value1, promise2(value1)])
})
.then(([value1, value2]) => {
// do something
return promise3(value1, value2)
})
}

使用async/await会非常简单:

const makeRequest = async () => {
const value1 = await promise1()
const value2 = await promise2(value1)
return promise3(value1, value2)
}

async 函数的用法:

async 函数返回一个 Promise 对象,可以使用 then 方法添加回调函数。当函数执行的时候,一旦遇到 await 就会先返回,等到触发的异步操作完成,再接着执行函数体内后面的语句。下面的例子,指定多少毫秒后输出一个值。

function timeout(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}

async function asyncPrint(value, ms) {
await timeout(ms);
console.log(value)
}

asyncPrint(‘hello world’, 50);

上面代码指定50毫秒以后,输出”hello world”。

如果希望多个请求并发执行,可以使用 Promise.all 方法:

async function dbFuc(db) {
let docs = [{}, {}, {}];
let promises = docs.map((doc) => db.post(doc));

let results = [];
for (let promise of promises) {
results.push(await promise);
}
console.log(results);
}
还有些注意的地方: await 命令只能用在 async 函数之中,如果用在普通函数,就会报错。

Spring MVC 更灵活的控制 json 返回(自定义过滤字段)

前言:

其实这篇文章也不算完全的原创,因为是看了https://my.oschina.net/diamondfsd/blog/836727实践后做的总结,并且文章后面附上源码下载链接。

我们要做什么?

我们要在springmvc的控制层,在返回字符串的时候,动态改变一下到底要返回哪些字符串,比如我们要返回实体Article,他里面有4个属性我们只想返回其中的3个如图

如何实现?很简单加一个注解,如图,传入实体类型和拦截的属性名

当然这个注解不是springMVC自带的,是我们自定义的,下面就告诉大家如何实现。

1  首先我们要配置一个拦截器,拦截控制层的请求如图

2  实现HandlerMethodReturnValueHandler接口,其实就实现两个方法,一个是拦截后判定是否有对应的注解,也就是@JSON注解,如果有,就执行第二个方法,解析注解中的数据进行一些操作如图

3 我们定义一个类专门进行注解的解析,设置过滤器,和返回json 被jsonReturnHandler调用

4 过滤器

调用关系

源码(只包含工具类):https://pan.baidu.com/s/1jHCnySI

整个程序:https://pan.baidu.com/s/1dFgPNe5

总结:其实挺简单的,就是通过自定义注解,和拦截器实现注解的识别读取,通过jackson实现转换json,通过拦截器,拦截不需要的属性

————————————————chenchen