【JS 报错信息整理】

报错信息:
Uncaught SyntaxError: Unexpected token -
原因往往是格式错误,如js里面的某个地方少了, ) } ;这些符号

【网址收集】

小程序页面栈的管理
https://blog.csdn.net/qq_33802316/article/details/77478921
http://www.xiaoshu168.com/wxapplet/233.html
https://www.cnblogs.com/ihardcoder/p/6186838.html?
https://www.hishop.com.cn/xiaocx/show_55303.html
https://www.cnblogs.com/houyi521/p/8026221.html
https://segmentfault.com/q/1010000008005954
https://www.cnblogs.com/nosqlcoco/p/6195572.html
https://blog.csdn.net/hushilin001/article/details/80321015

[微信小程序]this.setData , that.setData , this.data.val三者之间的区别和作用
https://blog.csdn.net/qq_35713752/article/details/78879984

javascript中var let const三种变量声明方式详解
https://blog.csdn.net/woshizhhblog/article/details/53907005
https://www.cnblogs.com/suiyueshentou/p/5685528.html

微信小程序 —— 自定义带进度条的音频播放控件audio
https://blog.csdn.net/Wu_shuxuan/article/details/78285875?locationNum=5&fps=1
https://blog.csdn.net/Afanbaby/article/details/78779805
https://blog.csdn.net/Akony/article/details/78533553
https://zhuanlan.zhihu.com/p/24519217

javascript语句——条件语句、循环语句和跳转语句
https://www.cnblogs.com/xiaohuochai/p/5673241.html

JavaScript数组常用操作总结
http://www.cnblogs.com/chenyablog/p/6558677.html
https://www.cnblogs.com/chenyablog/p/6477866.html

js笔记一:js中forEach,for in,for of循环的用法
https://blog.csdn.net/zdhsoft/article/details/54017183
https://www.cnblogs.com/yizhilin/p/7344675.html
https://www.cnblogs.com/chenyablog/p/6477866.html
https://www.cnblogs.com/yuqingfamily/articles/5799907.html

js中数组push对象,前面的值总是被最后一次的值覆盖的问题
https://blog.csdn.net/web_longboss/article/details/73395593
https://blog.csdn.net/xiaoye319/article/details/78416762

小程序绑定数据
https://blog.csdn.net/qq_22182279/article/details/78453529

对象的深拷贝和浅拷贝
https://www.cnblogs.com/dabingqi/p/8502932.html
https://www.cnblogs.com/dabingqi/p/8502932.html

给一个对象添加属性和方法
https://blog.csdn.net/qq_33988065/article/details/72307242
https://blog.csdn.net/z18374674/article/details/79056134
https://blog.csdn.net/xxouu/article/details/79582742
https://www.cnblogs.com/yuqingfamily/articles/5798928.html
https://segmentfault.com/q/1010000004225321
https://blog.csdn.net/penwan/article/details/43452463
https://blog.csdn.net/tjcjava/article/details/78369477
https://blog.csdn.net/szu_aker/article/details/52468335
https://www.jb51.net/article/135105.htm
https://blog.csdn.net/xxouu/article/details/79582742
https://www.jianshu.com/p/b91851997481
https://www.cnblogs.com/gromimiss/p/6066268.html

闭包
https://blog.csdn.net/whd526/article/details/70990994
http://www.cnblogs.com/gromimiss/p/5943716.html
https://zhidao.baidu.com/question/1110578788366101219.html
http://www.cnblogs.com/unlockth/p/7068030.html
https://www.cnblogs.com/qieguo/p/5457040.html
https://www.cnblogs.com/wangfupeng1988/p/3994065.html
https://www.cnblogs.com/tiantian123/p/7162062.html
http://www.wxapp-union.com/article-1954-1.html
https://www.jb51.net/article/100053.htm
https://www.cnblogs.com/jiaoyu121/p/6965230.html

小程序调用豆瓣接口403 node的解决方案
https://www.jianshu.com/p/66b9fae950c2

无头浏览器,自动化利器
https://github.com/Dream4ever/knowledge-base/issues/54
何伟的github解决思路

用 Promise 讲一个悲伤的故事给你听
https://mp.weixin.qq.com/s?__biz=MzAwNDcyNjI3OA==&mid=2650841486&idx=2&sn=d7385feeeab3ee29358a2111e9adcb9a&chksm=80d38ae7b7a403f13d8f7542c73a881a2f3a041b91c00c45dc96ba37c4d5817a9111211ab537&mpshare=1&scene=1&srcid=0712uWJvHD0ZoE8lPLhza50
S#rd

promise async await then catch
https://cnodejs.org/topic/5640b80d3a6aa72c5e0030b6
https://www.cnblogs.com/zhangmingzhao/p/8343685.html
https://blog.csdn.net/dear_mr/article/details/75314888
https://www.cnblogs.com/abey/p/7054527.html
https://blog.csdn.net/momDIY/article/details/77856099

koa2 express
https://koa.bootcss.com/

http://www.ruanyifeng.com/blog/2017/08/koa.html
https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001471087582981d6c0ea265bf241b59a04fa6f61d767f6000

http://javascript.ruanyifeng.com/nodejs/express.html#toc3

http://www.expressjs.com.cn/

微信小程序面试:
http://www.bslxx.com/a/mianshiti/tiku/2017/1020/1027.html

position定位不设置left top 等值,以及position定位的百分比取值
https://blog.csdn.net/qq_35809245/article/details/54259784

小程序地图功能
https://blog.csdn.net/hedong_77/article/details/55189978
https://blog.csdn.net/u011495204/article/details/54772993

深入理解ES6箭头函数中的this
https://blog.csdn.net/yangbingbinga/article/details/61424363
https://blog.csdn.net/liwusen/article/details/70257837
https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001438565969057627e5435793645b7acaee3b6869d1374000

浅谈JS中中括号([])用法
https://blog.csdn.net/jiuweihuxiazhi/article/details/78340637
微信小程序:如何用setData修改数组?
https://segmentfault.com/q/1010000008151383
微信小程序如何使用setData修改data中子对象的属性值
https://blog.csdn.net/fxjzzyo/article/details/79263198
https://www.cnblogs.com/simuhunluo/p/7989461.html

JSON详解
https://www.cnblogs.com/daicunya/p/6166472.html

浏览器兼容性-JS篇
https://www.cnblogs.com/daicunya/p/6195387.html

JS去重及字符串奇数位小写转大写
https://www.cnblogs.com/daicunya/p/6231257.html

字符串、数组方法实战--charAt(),split(),indexOf(),substring()
https://www.cnblogs.com/daicunya/p/6259314.html

微信小程序开发入门第七章:收藏、评论、点赞及计数功能
https://blog.csdn.net/qq_36936876
http://www.php.cn/xiaochengxu-405012.html
https://blog.csdn.net/qq_35713752/article/details/78425866?locationNum=7&fps=1
https://blog.csdn.net/fengye002011/article/details/79211365

传递数据
https://www.jianshu.com/p/dae1bac5fc75
http://www.wxapp-union.com/portal.php?mod=view&aid=2282#comment
https://blog.csdn.net/sinat_33937178/article/details/79124022
微信小程序给template的data属性传入多个数据
https://segmentfault.com/a/1190000014350477
假设A为登录页面并将登录获得的用户信息保存到app.js中的全局变量userInfo中,然后在B页面进行使用。
https://blog.csdn.net/huangfukui/article/details/60591313

vue项目关闭eslint校验
https://blog.csdn.net/sinat_39571186/article/details/79609870

vue中"‘webpack-dev-server’不是内部或外部命令,也不是可运行的程序"的报错
https://blog.csdn.net/lily2016n/article/details/79584344

vue.js的computed,filter,get,set的用法及区别详解
https://www.jb51.net/article/136040.htm

https://www.cnblogs.com/mrszhou/p/7859001.html

http://www.runoob.com/jsref/jsref-filter.html

https://www.cnblogs.com/guangyan/p/6684093.html

https://blog.csdn.net/qq_30811721/article/details/78183161
js keyup、keypress和keydown事件 详解https://www.cnblogs.com/manongxiaobing/archive/2012/11/05/2755412.html

vue.js计算属性computed【getter和setter的一些思考】
https://www.jianshu.com/p/56f337688d6b
https://cn.vuejs.org/v2/guide/computed.html#%E8%AE%A1%E7%AE%97%E5%B1%9E%E6%80%A7-vs-%E4%BE%A6%E5%90%AC%E5%B1%9E%E6%80%A7
https://segmentfault.com/a/1190000012948175

社区部署指南
http://xugaoyang.com/post/5b7e8da956d79a569d97caac

npm --save-dev --save 的区别
https://blog.csdn.net/juzipchy/article/details/65653683

Windows环境下如何安装Docker
https://jingyan.baidu.com/article/cd4c297925a231756e6e60df.html
https://github.com/boot2docker/windows-installer/releases

Windows系统下,彻底删除卸载MySQL
https://www.cnblogs.com/jpfss/p/6652701.html

windows安装mysql 8
https://www.cnblogs.com/reyinever/p/8551977.html
https://www.cnblogs.com/tanshaoxiaoji/p/mysql_open_services.html
http://www.cnblogs.com/tanshaoxiaoji/p/mysql_install_type.html
https://blog.csdn.net/qq_42152399/article/details/80360428
https://www.cnblogs.com/it-note/p/5889184.html
https://dev.mysql.com/downloads/file/?id=479669

mac下mysql 8
https://blog.csdn.net/shylittlestar/article/details/46438695
https://blog.csdn.net/love_dl_forever/article/details/78930488
https://blog.csdn.net/sun_xp_1988/article/details/51425160

https://www.jb51.net/article/105668.htm

https://www.jb51.net/article/87580.htm

Redis 安装 使用docker安装redis,挂载外部配置和数据
http://www.runoob.com/redis/redis-install.html

https://blog.csdn.net/woniu211111/article/details/80970560

nodemon 基本配置与使用
https://www.cnblogs.com/chris-oil/p/6239097.html

windows下安装mongodb
https://blog.csdn.net/heshushun/article/details/77776706

Docker_入门
https://blog.csdn.net/S_gy_Zetrov/article/details/78161154
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html
https://cloud.tencent.com/developer/article/1007985
http://www.cnblogs.com/jinanxiaolaohu/p/9493287.html
https://blog.csdn.net/yedongfeng_1314/article/details/79549348
https://blog.csdn.net/huangchunxia_1/article/details/81141919
https://blog.csdn.net/lively1982/article/details/48494251?locationNum=3&fps=1

财务报表类:
http://blog.9666.cn/list_jcrm/3821.html

https://www.sohu.com/a/119771785_556426

https://wenku.baidu.com/view/9a8318dadc88d0d233d4b14e852458fb770b38e7.html

http://www.360doc.com/content/17/1108/15/5331635_702077025.shtml

https://www.sohu.com/a/208254929_712322

http://vip.stock.finance.sina.com.cn/corp/go.php/vFD_BalanceSheet/stockid/600519/ctrl/part/displaytype/4.phtml

https://www.jianshu.com/p/ae9d815a3240

https://www.jianshu.com/p/79478fbb0d3a

https://www.jianshu.com/p/0a6cb13a8649

https://www.jianshu.com/p/a8d543801904

https://www.zhihu.com/question/19645090

响应式导航,汉堡按钮,rails 5.1的bug,轮播图

对手机自适应的响应:
在application.html.erb中添加
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
参考:https://v4-alpha.getbootstrap.com/getting-started/introduction/#important-globals

rails 5.1 对 gem bootstrap好像出了点问题有些不支持js了,所以引用一下第三方地址

在网上碰到个差不多的问题,但是他的解决方式我用了是无效的,先mark一下
https://github.com/twbs/bootstrap-rubygem/issues/88

解决方式:因为会碰到很多的未知因素,建议用rails 5.0系列的版本重建专案

比如rails _5.0.3_ new myapp

汉堡按钮:
参考网址:
http://xyy601-blog.logdown.com/posts/1821769
https://www.w3schools.com/bootstrap/tryit.asp?filename=trybs_navbar_collapse&stacked=h
http://www.runoob.com/bootstrap/bootstrap-navbar.html
http://www.runoob.com/bootstrap/bootstrap-collapse-plugin.html

其中application.js推荐加入这个:
application.js
//= require bootstrap-sprockets
它的功能包括了且不限于//= require bootstrap/collapse
参考来自:https://github.com/twbs/bootstrap-sass

轮播图
https://www.w3schools.com/bootstrap/bootstrap_carousel.asp

Atom报错,改用sublime了

向往常一样在终端中用atom .想打开专案,结果却是反馈:

Attempting to call a function in a renderer window that has been closed or released. 
Function provided here: worker.js:71:22 
Remote event names: destroyed, crashed

专案是可以打开,但终端里的命令行不再响应了,没有回车了
找了好多方法都没用,直接暴力重装atom,但又发现有新的问题:
输入atom .会出现以下界面

 chenli@礼晨  ~/railsapp/rails105   testdata  atom .
[warn] kq_init: detected broken kqueue; not using.: Undefined error: 0
[warn] kq_init: detected broken kqueue; not using.: Undefined error: 0
[warn] kq_init: detected broken kqueue; not using.: Undefined error: 0

重新搜寻解决问题之路,发现了一种方法:
在终端里输入

export EVENT_NOKQUEUE=1

但是需要每次打开atom时都输入一遍。。。有时候还无效。。。

重新搜寻方法,最后看到一种方法,试试先:

brew reinstall libevent

但必须紧接着再重装一遍atom

#彻底删除ATOM(MAC)


rm -rf ~/.atom
rm -rf /usr/local/bin/atom
rm -rf /usr/local/bin/apm
rm -rf /Applications/Atom.app
rm -rf ~/Library/Preferences/com.github.atom.plist
rm -rf "~/Library/Application Support/com.github.atom.ShipIt"
rm -rf "~/Library/Application Support/Atom"
rm -rf "~/Library/Saved Application State/com.github.atom.savedState"
rm -rf ~/Library/Caches/com.github.atom
rm -rf ~/Library/Caches/Atom

参考网址:https://discuss.atom.io/t/atom-quits-on-startup/39187/4
http://www.jianshu.com/p/cb428a974636

无法彻底解决,虽然不影响使用,但心里不爽,转战sublime吧~

JavaScript学习记录

// 采购食物的函数
function buyFoods() {
  console.log('采购原料和菜');
  var foodsList = ['fish', 'egg', 'meat'];
  return foodsList;
}

// 做准备工作的函数
function prepare() {
  console.log('努力磨刀...努力洗碗...努力打扫...劳动最光荣');
  return true;
}

// 做菜的函数
//
function cooking(foodsList) {
  console.log('今天要做这些菜' + foodsList);
  console.log('大工告成,上菜');

  var feast = ['鸡蛋西红柿', '红烧肉', '红烧鱼'];
  return feast;
}

// 流程控制函数
var startWork = function () {
// function startWork() {   #等同于上面一行

  var success = prepare();

  if (success) {
    var foodsList = buyFoods();
    var feast = cooking(foodsList);

    console.log('----酒席准备好了----');

    for (var i = 0; i < feast.length; i++) {
      console.log(feast[i]);
    }
  } else {
    console.log('还没准备好');
  }
}

// 干活啦~~
// console.log(startWork());
//startWork();    #如果写这个是不会有undefined的


// var kitchenObj = startWork(); #这种写法会导致undefined出现在结尾

// console.log(kitchenObj);

function abc(startTime) {     //#解决了undefined的问题

  console.log(startTime); 
}
startWork(abc);

输出:

努力磨刀...努力洗碗...努力打扫...劳动最光荣
采购原料和菜
今天要做这些菜fish,egg,meat
大工告成,上菜
----酒席准备好了----
鸡蛋西红柿
红烧肉
红烧鱼
// 模拟异步处理的手法

// 定义一个函数,函数名为callback
var callback = function() {
    console.log('我终于被调用了');
  }
  
  // 5秒钟后调用callback函数
  setTimeout(callback, 1000);

和下面是一样的

// 模拟异步处理的手法

// 定义一个函数,函数名为callback
function callback() {
    console.log('我终于被调用了');
  }
  
  // 5秒钟后调用callback函数
  setTimeout(callback, 1000);
function checkFlightSchedule(callback) {
    console.log('开始查航班信息');
  
    function check() {
        // 模拟构建航班的时间信息
        var scheduleInfo = {
          start: '8/23 8:00',
          end: '8/23 10:30',
          from: 'beijing',
          to: 'hangzhou'
        };
    
        callback(scheduleInfo.start);
      }

    setTimeout(check, 2000);
  }
  
  //---------------------------------------
  function callback(startTime) {
    console.log('通过反馈通道获得了信息');
    console.log(startTime);
  }
  
  // 执行查询函数
  checkFlightSchedule(callback);

和下面是一样的

function checkFlightSchedule(callback) {
  console.log('开始查航班信息');

  setTimeout(function() {
    // 模拟构建航班的时间信息
    var scheduleInfo = {
      start: '8/23 8:00',
      end: '8/23 10:30',
      from: 'beijing',
      to: 'hangzhou'
    };

    callback(scheduleInfo.start);
  }, 5000);
  console.log('先去喝口水');
}
//---------------------------------------
function callback(startTime) {
  console.log('通过反馈通道获得了信息');
  console.log(startTime);
}
// 执行查询函数
checkFlightSchedule(callback);

输出:
开始查航班信息
先去喝口水
通过反馈通道获得了信息
8/23 8:00

一个小结:A(B);是一种调用的格式,A是函数,B可以是被定义的函数也可以是被定义的变量也可以是空,碰到A(B);就会马上去执行函数A的内容,这时可以无视B,直到需要调用B的时候才执行函数B,执行完再回到A(B);;后面。

当然,如果B在没遇到调用它的代码时,B的函数是不做任何事的。
A(B);里面还可以继续嵌套A(B);这样的形式,用法同理。
比如这样的:

function caller(callback) {
    // do something
    var data = XXX;
    // pass data to callee
    callback(data);
}

funtion callee(data) {
    // do following thing
}
caller(callee);
for(var i = 0; i < myLikeColorsList.length; i++) {
    console.log(myLikeColorsList[i]);
}

和下面是一样的

for(i =0; i < myLikeColorsList.length; i++) {
    console.log(myLikeColorsList[i]);    
}
var config = {
    height: 170,
    weight: 120,
    sex: 'man',
    age: 18,
    run: function() {
      console.log('\n###### function ######');
      console.log('i am running');
      console.log('#####################');
      console.log(config);
    }
  };

// 执行对象config2的函数run
config.run();
function sum(x, y) {
  var result = x + y;
  return result;
}

var resul = sum(1, 2);
console.log(resul);
/*
* 间接回调处理案例
*/

// checkFlightSchedule函数的定义者设计了一个通过回调给结果的方案。
// 当函数处理完后,通过调用者设置过来的回调执行输出
function checkFlightSchedule(callback2) {
  console.log('开始查航班信息');

  // 模拟构建航班的时间信息
  var scheduleInfo = {
    start: '8/23 8:00',
    end: '8/23 10:30',
    from: 'beijing',
    to: 'hangzhou'
  };

  if (typeof callback2 === 'function') {   //写成callback1也可以
    callback2(scheduleInfo.start);
    } else {
    console.log('callback is not function');
  }

}

//---------------------------------------
function callback1(startTime) {
  console.log(startTime);
}

// 调用函数checkFlightSchedule,并塞一个回调函数以获取结果
checkFlightSchedule(callback1);

代码解析:先有callback1,再传到callback2中,但这个callback1在没遇到调用它的代码时,是不做任何事的
等同于下面的代码

/*
* 间接回调处理案例
*/

// checkFlightSchedule函数的定义者设计了一个通过回调给结果的方案。
// 当函数处理完后,通过调用者设置过来的回调执行输出
function checkFlightSchedule(callback2) {
  console.log('开始查航班信息');

  // 模拟构建航班的时间信息
  var scheduleInfo = {
    start: '8/23 8:00',
    end: '8/23 10:30',
    from: 'beijing',
    to: 'hangzhou'
  };

  if (typeof callback2 === 'function') {   //callback1也可以
    callback2(scheduleInfo.start);
    } else {
    console.log('callback is not function');
  }

}

//---------------------------------------
// function callback1(startTime) {
//   console.log(startTime);
// }

// 调用函数checkFlightSchedule,并塞一个回调函数以获取结果
checkFlightSchedule(function callback1(startTime) {
  console.log(startTime);
});

kitchen流程的升级版解析

 // 采购食物的函数
function buyFoods(callback) {
    console.log('2、安排人开始采购食物啦。。。。');
  
    // 模拟5秒后通过callback返回结果
    setTimeout(function() {
      console.log('4、~~~~~~~~~~~~~~~~~采购完毕');
      var foodsList = ['fish', 'egg', 'meat'];
      callback(foodsList);
    }, 2000);
  }
  
  // 做准备工作的函数
  function prepare() {
    console.log('1、努力磨刀...努力洗碗...努力打扫...劳动最光荣');
    return true;
  }
  
  // 做菜的函数
  function cooking(foodsList, callback) {
    console.log('5、开始做菜啦~~~');
  
    // 模拟5秒后通过callback返回结果
    
    setTimeout(function() {
      console.log('6、~~~~~~~~~~~~~~~~~今天要做这些菜' + foodsList);
      console.log('7、大工告成,上菜');
  
      var feast = ['鸡蛋西红柿', '红烧肉', '红烧鱼'];
      callback(feast);
    }, 2000);
  }
  
  //------------------------------------------------
  
  // 流程控制函数
  function startWork() {
    var success = prepare();
  
    if (!success) {
      console.log('还没准备好');
      return;
    }
  
    buyFoods(function(foodsList1) {
      cooking(foodsList1, function(feast) {
        console.log('8、----酒席准备好了----');
        for (var i = 0; i < feast.length; i++) {
          console.log(feast[i]);
        }
      });
    });
  
    console.log('3、劳动好,事情安排好,我先去洗个澡');
  }
  
  // 干活啦~~
  startWork();
  

等同于

// 采购食物的函数
function buyFoods(callback) {
  console.log('我要开始采购食物了。。。');

  // 模拟2秒后通过callback返回结果
  setTimeout(function() {
    console.log('采购完毕!');
    var foodList1 = ['fish', 'egg', 'meat'];
    callback(foodList1);
  }, 2000);
}

// 做准备工作的函数
function prepare() {
  console.log('努力磨刀。。。洗碗。。。打扫。。。劳动很棒!');
  return true;
}

// 做菜的函数
function cooking(foodList3, callback) {
  console.log('开始做菜了。。。。。');

  // 模拟2秒后通过callback返回结果
  setTimeout(function() {
    console.log('今天要做这些菜' + foodList3);
    console.log('大功告成,上菜吧');

    var feast1 = ['鸡蛋西红柿', '红烧肉', '红烧鱼'];
    callback(feast1);
  }, 2000);
}

// 流程控制函数
function startWork() {
  var success = prepare();

  if (!success) {
    console.log('not yet!');
    return;
  }

  function buyfo(foodList2) {

    function dinnerFeast(feast2) {
      console.log('酒席准备好了');
      for(var i = 0; i < feast2.length; i++) {
        console.log(feast2[i]);
      }
    }
    cooking(foodList2, dinnerFeast);
    
  }
  
  buyFoods(buyfo);

  console.log('事情都安排好了,我去洗个澡');
}

startWork();

console.log('Something else happen');
function getData(callback) {
  var timer = setTimeout(function(){
    var dataArray = [123, 456, 789];
    callback(dataArray);
  }, 2000);
}

function writeData(myData) {
  console.log(myData);
}

getData(writeData);
console.log('开始查航班信息');

setTimeout(function() {
    // do something
    callback(scheduleInfo.start);
}, 5000);

console.log('先去喝口水'); // 自己补充的一行代码
/*
* 异步方案
*
* 扫描某个文件夹的所有内容
*/

// 引入fs模块
var fs = require('fs');

// 定义要查询的目标文件夹。如果你想查lesson2的内容,就修改下面路径字符串。
var dirPathString = '../../homework/lesson1';

// -----------------------------------
// 异步方案

// 定义一个callback函数,用于接收读取文件夹内容后的结果
function callback(err, files) {
  if (err) {
    console.log('读取文件失败');
    return;
  }

  if (files.length > 0) {
    console.log(files);
  } else {
    console.log('没有找到任何文件');
  }
}

//调用fsreaddir函数读取所有文件
fs.readdir(dirPathString, callback);

等同于

/*
* 异步方案
*
* 扫描某个文件夹的所有内容
*/

// 引入fs模块
var fs = require('fs');

// 定义要查询的目标文件夹。如果你想查lesson2的内容,就修改下面路径字符串。
var dirPathString = './homework/lesson1';

// -----------------------------------
// 异步方案
//调用fsreaddir函数读取所有文件
fs.readdir(dirPathString, function(err, files) {
    if (err) {
        console.log('读取文件错误');
        return;
    }
    if (files.length > 0) {
        console.log(files);
    } else {
        console.log('没有找到任何文件');
    }
});

Mac下Android studio真机调试的配置

准备工作:

1.下载好Android studio,安装后打开下载SDK。

  1. SDK应该自带ADB,后面的步骤里可在platform-tools目录下查看

开始配置:

1.打开终端,输入如下命令,进入用户主目录
cd ~

2.然后输入命令,创建.bash_profile文件
touch .bash_profile

3.然后输入命令,打开.bash_profile文件。
open -e .bash_profile

4.在该文件中,输入export PATH=${PATH}:你的ADB位置,比如
export PATH=${PATH}:/Users/xxxx/Library/Android/sdk/platform-tools
这里有个坑:你会不知道Library是怎么来的
通过软件Android Studio(Mac) 查看SDK默认安装位置:
Tools-Android-SDK Manager (就能看到默认位置是:/Users/xxxx/Library/Android/sdk)
或者默认位置查找:
右键Finder-前往文件夹 输入 ~/资源库(或 ~/Library) 注:Library默认隐藏了。

5.保存并退出.bash_profile文件,同时关闭bash终端。

6.重新打开终端,进行测试前的环境配置
这里有个坑,输入adb -version可能会提示:“zsh: command not found: adb”
字面意思是相关命令没有没有找到
其实就是bash shell 以及zsh shell 是两种读取系统环境变量
(使用adb的前提是你肯定已经在bash的 .bash_profile 已经配置相关Android tool的环境变量了,从而才能使用adb命令)
然而在使用zsh shell的时候,你并没有把相关的环境变量的配置设置到 .zshrc 中(功能上类似bash 的.bash_profile)
解决办法:
既然是.zshrc 没有配置相关环境变量设置,把 bash 中.bash_profile 全部环境变量加入就好
终端输入:open .zshrc
然后找到# User configuration部分,在下面添加
source ~/.bash_profile
终端执行
source .zshrc

7.测试adb版本
终端执行adb version
出现类似如下版本号,那么就是配置成功了

Android Debug Bridge version 1.0.39
Revision 84e3321d5db3-android
Installed as /Users/xxxx/Library/Android/sdk/platform-tools/adb

8.查看usb设备信息
确保真机开启了调试模式,并通过数据线接入了mac
在终端输入如下命令,查看已连接的USB设备信息
system_profiler SPUSBDataType

M351:
 
          Product ID: 0x4e26
          Vendor ID: 0x18d1  (Google Inc.)
          Version:  2.33
          Serial Number: 351BBJHCBWT6
          Speed: Up to 480 Mb/sec
          Manufacturer: MEIZU
          Location ID: 0x1a120000 / 4
          Current Available (mA): 500
          Current Required (mA): 2

9.记住 Vendor ID 的值
比如其中 Vendor ID: 0x18d1的数值0x18d1很重要,很重要,很重要,复制并记下来。

10.创建adb_usb.ini文件,输入如下命令
进入vim环境:
vi ~/.android/adb_usb.ini

11.在vi编辑器中输入需要先按键盘上的i键,才能插入编辑
在打开的文件中将刚才让你记下来的vendor ID数值0x18d1粘贴进去

12.输入之后,按下esc键,再输入:wq,然后回车就是保存退出
如果是不保存退出 就输入!q,千万不要用command+s保存退出。

13.重启finder :
鼠标单击窗口左上角的苹果标志-强制退出-Finder-重新启动

14.重启adb,输入如下命令
adb kill-server会看到

* server not running *


adb start-server会看到

* daemon not running. starting it now at tcp:5037 *
* daemon started successfully *


adb devices
看到类似如下的信息说明配置完成

List of devices attached
f0bacf3f device

15.到这里全部配置应该就完成了,小伙伴们现在可以打开studio,使用真机运行项目啦!
如果你的安卓手机版本较低,比如我的是Android 4.4.4,它对应的API是19,这时最新版的Android Studio会拒绝你调试,该怎么办呢?
解决方法:
通过commond+shift+F键全局搜索这个单词minSdkVersion对应的文件,把后面的数字21改成19或者你的版本,重启软件即可开启真机调试了。

nvm 安装流程

开始

nvm全称是node version manager,中文意思是node版本管理。

在使用node时,不要直接安装node,先安装nvm,由nvm来安装node。

安装NVM

Win安装NVM

请参考https://segmentfault.com/a/1190000007612011

MAC安装NVM

打开终端,输入
> curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash

和下图一样结果,说明你已经安装成功。

验证安装

关掉终端,重新再打开终端。输入
> nvm --version

【注意】
如果你验证安装还是提示nvm: command not found,请按照下面的步骤来操作。

> touch ~/.bash_profile
> touch ~/.bashrc
> curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash

执行成功后,关掉终端开启终端,然后继续往下走。

安装node

通过nvm安装node的v8.0.0版本
> nvm install v8.0.0

执行node

在终端,输入node
> node
此时会直接进入到node的终端编辑模式。
在node的终端编辑模式下,输入一行代码
> console.log('hello, js')


你在node环境下运行的第一行代码就大功告成了。

退出node编辑模式

快捷键:ctl + c2

Xcode 或 编辑器 下如何写C语言

Xcode下如何写C

首先是创建一个C语言方案:左上角File——New——Project


接着会有一个弹窗,询问你创建的是什么类型的方案
选择OS X——Application——Command Line Tool 点击Next

然后会继续弹窗,询问你创建的其他信息,辣么我们给文件命个名,修改一下Language为C语言,其他的修改就不辣么重要了~

然后它会继续弹窗,这时候问的是你文件的保存位置(我选择的是桌面),它会在桌面自动生成一个文件夹~

这时候就创建好了~不过你还要看一下左侧边栏,点中文件mian.c,这时候中间的区域就会进入编辑区域

调试

点击右上角的

中间辣个按钮,会变蓝,这时候我们的界面就成了这样~

下方的区域左侧是调试的,右侧是输出结果~编译好了程序以后,直接按Command+R编译

示范一下断点(Breakpoint)调试!
我们先编一个最简单的for循环


我们在那个分号的一行选择调试,具体方法就是单击一下左边的 11 ,对哒,点一下就好

这时候我们再编译,Command+R
这时下部的框框变成了这样:

可以发现,i 现在是等于 0
按一下

这个键,就会发现跳转到了下一个循环,这时

i变成了1,嗯,这就是断点调试
调试完了不想要断点了怎么办呢?直接再点一下之前设置的断点的位置11,像这样

蓝色变淡了,下一次调试就不会有(这个)断点了~
或者可以直接删除断点,在行号那里右键点击,选择delete

Sublime Text 结合 iterm2(terminal)

Step1

使用Sublime Text
选择File->New File建立一个文件,或者使用快捷键Command+N
然后选择File->Save保存,这里示范将它保存在桌面上,并命名为test.c


此时在Sublime的右下角能看到当前的模式已经变成了C
我们编写一个见得的Hello World程序

Command + s保存

Step 2

找到Terminal(终端)这个应用程序, 长这样


然后使用几个基本的命令:
ls 列出当前目录下的文件和文件夹
cd 切换目录
gcc 编译.c源文件
使用cd命令切换到桌面目录

再次使用ls

发现了之前写的那个c源程序文件了吧, 现在我们要做的就是编译它, 使用gcc命令就可以了
gcc + 要编译的文件名

如果没有报错, 恭喜你, 就成功编译了!
再看看桌面目录下多了什么, 还是使用ls命令

多出了一个a.out的文件, 这个就是编译后的可执行文件啦
怎么来执行它呢, 很简单, 只需要下面这条命令即可
./a.out
./ 代表当前目录的意思, 就是你要执行当前目录下的a.out程序

至此屏幕上回打印出Hello World,程序结束。

ruby的环境建置简要(也适合重装第二台mac)

前提:

确认 Mac 操作系统为 10.10 ( Yosemite ) 以上

一、安装 Xcode
程序开发环境的辅助应用程序
在app store中可以找到
在安装 xcode 请暂时关闭 VPN

二、打开VPN

三、安装 Command Line Tools
在 Mac 的 Spotlight 搜寻 Terminal
在终端机(Terminal)中输入指令:xcode-select --install
将会安装 command line tools ( 这是安装 Ruby 所需要的 Library)
如何确定已经装好?
在终端机输入:xcode-select -p
显示出:/Applications/Xcode.app/Contents/Developer
即是成功安装!

四、安装 Homebrew
可以从 Homebrew 取得安装 Ruby 需要一些编译工具或函式库。
在终端机输入:/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
按提示敲击 “return” 回车键,期间可以选择要不要输密码,没有就略过

五、使用 Homebrew 安装 Git
Git 是目前最流行的原始码版本控制软体
终端机里输入指令:brew install git
如何确定已经装好?
在终端机输入:git --version
会显示:git version 2.9.0(数字依照各版本可能会不同)

六、安装 ImageMagick
ImageMagick 是专门处理图片的函式库。
在终端机里输入指令:brew install imagemagick

七、安装 PostgreSQL
PostgreSQL 是一套强大的底层资料库。
在终端机里输入指令:brew install postgresql
安装完毕后:brew services start postgresql (会确保在你下次开机时,也一并启动资料库)

八、安装 RVM
因为 Ruby 版本更新很快,我们通常不会使用系统内建的 Ruby。而是会改采用一套 Ruby Version Manager 去管理 Ruby 的安装与升级。透过 Ruby Version Manager ( RVM) 去安装 Ruby。
请在终端机输入:\curl -sSL https://get.rvm.io | bash -s stable
安装完再输入:source ~/.rvm/scripts/rvm 让 rvm 生效。
然后安装一个套件,在终端机输入:brew install libxml2

九、安装 Ruby
一种程式语言,它经常和框架(Rails)结合,常用于快速开发。
请在终端机输入:rvm install 2.3.1
然后输入:rvm use 2.3.1 --default (使用 ruby 2.3.1 为预设版本 (可改自己需要的版本))
安装完成后需要重开 Terminal。(在 Terminal 界面按 command + Q 退出,然后重新打开)
输入 rvm list 可以列出目前已安装的 Ruby 版本。
一直无法连上怎么办?如果遇到连不太上 https://rubygems.org
可以指定 RubyGems 来源
方法:多执行這一行
gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/

十、安装 Rails 开发框架
在终端机输入:gem install rails -v 5.0.0 (后面的参数是指定版本,预设会抓最新版。)
安装失败怎么办?!
失败的可能原因是 gem 或 xcode-select 不是最新版本
可以使用这两个指令来更新
gem update --system
xcode-select --install

十一、Atom 编辑器
https://atom.io下载

十二、设定在 Terminal 内可以打开 Atom
如何在 Terminal 内可以“用惯用的编辑器”快速打开“目前正在做”的专案(project)呢?
启动功能 Shell commands


执行完上述动作要关闭Terminal重启才能生效(在 “3-9 安装 Ruby”有提示如何重启 Terminal)。

十三、在 Github 上设定自己的电子签名(如果有第二台mac最好也这么做)
步骤 1
在 Terminal 先输入 more ~/.ssh/id_rsa.pub 看看有没有东西。


有的话 copy 整个内容,到步骤 3。
没有的话到步骤 2。
步骤 2
如果没有 id_rsa.pub 这个档案, 请输入 ssh-keygen 连按三个回车(enter)

然后再输入一次 more ~/.ssh/id_rsa.pub , 把出来的内容 copy 起来
步骤 3
前往 https://github.com/settings/ssh
新增 ssh key

十四、调配Terminal为zsh与安装oh-my-zsh
第一:下载安装 iTerm2
到官方网址下载 iTerm:http://www.iterm2.com/

第二:调配 Terminal: zsh与oh-my-zsh

Step1:改变 shell 为 zsh 设置为默认shell
打开刚刚安装的 iTerm,在这个终端机里面输入:chsh -s /bin/zsh

Step2:安装 oh-my-zsh
在终端中分别输入以下指令:
cd ~/
git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
cp ~/.zshrc ~/.zshrc.orig
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc

Step3:修改 theme
在终端输入:atom .zshrc
Atom 会打开名为 “.zshrc” 的文件,把里面内容为以下的这样:
ZSH_THEME="robbyrussell"
修改替换成下面两行:

#ZSH_THEME="robbyrussell"

ZSH_THEME="agnoster"

并在最后添加:

alias stree='/Applications/SourceTree.app/Contents/Resources/stree'

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

Step4:修改 agnoster 的 theme source code
在终端输入:atom ~/.oh-my-zsh/themes/agnoster.zsh-theme
Atom 会打开名为 “agnoster.zsh-theme” 的文件。然后把这个文件里的全部内容替换成这个链接里面的内容。
https://gist.github.com/agnoster/3712874/raw/c3107c06c04fb42b0ca27b0a81b15854819969c6/agnoster.zsh-theme
存档(按 command + s)后关闭 Atom。

Step5:安装字型
因为 agnoster 需要特殊字型,所以必须安装 patched 过的三个字体。请去这个链接下载三个字体:https://gist.github.com/1595572
下载后安装这三个字体。

Step6: 替换布景
下载 solarized,解压缩后,进行iterm2的Preferences操作
替换掉 iTerm 布景
请在 iTerm 里按command+,(就是键盘上的逗号)打开 Preferences 对话框
Preferences -> Profiles -> Colors -> Color Presets -> Import,载入 iterm2-colors-solarized 目录下的两个 itermcolors
Preferences -> Profiles -> Colors -> Color Presets,选择 Solarized Dark
替换掉 iTerm 字体
Preferences -> Profiles -> Text -> Change Font换成 Menlo 字体,字号 14
按cmd+q退出,再打开,可以获得如下效果

十五、设置MAC终端命令行下用atom、sublime、vscode打开文件或目录
修改 zsh 配置文件
open ~/.zshrc
在文件中加上这几行代码
对应 atom、Sublime Text、与 vcCode。

alias atom='/Applications/Atom.app/Contents/MacOS/Atom'
alias subl='/Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl'
alias code='/Applications/Visual\ Studio\ Code.app/Contents/Resources/app/bin/code'

测试
分别使用 Atom、Sublime Text、与 vcCode 打开
atom .
subl .
code .

十六、安装heroku
brew install heroku/brew/heroku