yujianAI/segmentfault_upvote5_clean huggingface dataset:
问题：js产生1-20之间的数，要求数越小出现的概率越高，要怎么写？
需要随机产生1-20之间的数，数字越小，出现的概率越高。
请教大家，该怎么写？

回答：`1 + Math.floor(Math.random() * Math.random() * 20)`
`Math.random()`的几率是相等的，结果在0到1之间，落在0到0.5和0.5到1之间的概率都是0.5；
两个`Math.random()`相乘落在0到0.5之间的概率是`3 / 4`，落在0.5到1之间的概率是`1/4`，因为只有当两次`Math.random()`的结果都在0.5以上时，结果才会在0.5到1之间。
所以多个`Math.random()`相乘会使数越小出现的概率越高。
Update:
上面所说的：
落在0到0.5之间的概率是`3 / 4`，落在0.5到1之间的概率是`1/4`，应该是`不对`的。因为即使两次`Math.random()`的结果都在0.5以上时，结果也不一定会在0.5到1之间，比如`0.6 * 0.6 = 0.36; 0.7 * 0.7 = 0.49`，所以上面的描述更正如下：
感谢@manggo指正！

标签: javascript
问题：正则表达式中 (?:)到底是什么意思
例子：
1.(w)((?=111)(1))+ 为什么=重复4次以上的字母数字，则匹配其剩下最后2位之前的部分
2."abcabc".match(/(?:a)(b).*1/g);   结果为 ["abcab"]

回答：先回答问题题目的`(?:)`意思
这个代表不捕获分组
比较`(X)`和`(?:X)`，前者是捕获分组，后者不捕获，区别在于正则表达式匹配输入字符串之后所获得的匹配的（数）组当中没有`(?:X)`匹配的部分；
比如
```
var m = "abcabc".match(/(?:a)(b)(c)/)
//结果 ["abc", "b", "c"]
// m[0] 是/(?:a)(b)(c)/匹配到的整个字符串，这里包括了a
// m[1] 是捕获组1，即(b)匹配的子字符串substring or sub sequence
// m[2] 是捕获组2，即(c)匹配到的
```
如果这样
```
var m = "abcabc".match(/(a)(b)(c)/)
//结果 ["abc", "a", "b", "c"]
```
第一小题应该是这样的正则表达式
```
/(\w)((?=111)(1))+/
```
这里有一个知识点`zero-width positive lookahead`，零宽断言，正向前瞻（反正我记不住
意思是`(?=X)`匹配某个位置，右边（正向）是X，它不真正匹配捕获子串。
看几个匹配的测试例子
```
/(\w)((?=111)(1))+/.test("1111") // true
/(\w)((?=111)(1))+/.test("2222") // false
```
匹配重复4次以上的字母或数字可以这么写
```
/(\w)(?=\1{3,})/.test("AAAAAAAA") //true
/(\w)(?=\1{3,})/.test("AAAB") //false
```

标签: 正则表达式
问题：mysql like 模糊搜索
问题一   name like '%联想%'  是全表搜索，如何使用索引来优化查询？
```
            有推荐用mysql 函数  locate/instr

            explain SELECT * FROM product where name like '%联想%';
            explain SELECT * FROM product where LOCATE('联想',name)>0 ;
            explain SELECT * FROM product where instr(name, '联想')>0 ;

            看着解释没什么区别啊，都是用了全表搜索
            
            

```
问题二   name like '%联想%'  是匹配的 XX联想XX。如何匹配 XX联XX XX想XX，现在是把搜索内容拆分了，name like '%联%' or name like '%想%'

回答：第一个问题: 如果左边有通配符`%`的话,是无法走索引的,只能走全表扫描,最好的结果是`select`中只查询索引覆盖的列,比如假设只有`name`s列带索引,`select name from product where name like '%联想%'`,走的是扫描整个索引,比全表扫描要快一点,但是应用很局限,一般不会只查被索引覆盖的列啊.
第二个问题: 这种分词查询简单点就用全文索引, 如果表超级大,性能差的话, 上搜索引擎,比如`solr`,`Lucene`、`Sphinx`.

标签: mysql索引, mysql优化, 索引, mysql
问题：webpack 生产环境打包出的 map 文件有什么用
发现打包出的map文件体积比较大，想知道这个文件有什么用处，还有是否可以不打包生成这些文件？

回答：打包后产生后缀名为.map的文件是由于配置了sourcemap选项生成的，打包后的文件不容易找到出bug对应的源代码的位置，sourcemap就是来帮我们解决这个问题的，具体配置可以查看官网devtool配置
或者其它的webpack sourcemap 选项多种模式的一些解释

标签: webpack
问题：Vue 点击切换颜色
第一次点击span 字体变颜色，再次点击恢复原来颜色，做成选中的效果
代码：
```
<li><span>健康医疗</span><span>生活服务</span><span>旅游</span><span>金融</span></li>
<li><span>信息安全</span><span>广告营销</span><span>数据服务</span><span>智能硬化</span></li>
<li><span>文化娱乐</span><span>网络招聘</span><span>分类信息</span><span>电子商务</span></li>
<li><span>移动互联网</span><span>企业服务</span><span>社交网络</span></li>

```
我是小白>_<   大神们，这个怎么弄？？？
。。。有木有选择span标签进行判断的方法>_<。。。

回答：修改后：
 <ul v-for="(item,index) in lidata">
```
 <li><span :class="{active:index==isActive}"  @click="changeClass(index)"> {{item.name}}
</span></li>  
```
</ul>
data(){
```
    return{
    isActive:-1，
    lidata:[
    {index:0,name:'健康医疗'},
    {index:1,name:'生活服务'},
    {index:2,name:'旅游'},
    {index:3,name:'金融'},
    {index:4,name:'信息安全'},
    {index:5,name:'广告营销'},
    {index:6,name:'数据服务'},
    {index:7,name:'智能硬化'},
    {index:8,name:'文化娱乐'},
    {index:9,name:'网络招聘'},
    {index:10,name:'分类信息'},
    {index:11,name:'电子商务'},
    {index:12,name:'移动互联网'},
    {index:13,name:'企业服务'},
    {index:14,name:'社交网络'}
    ]
    }
   }
   
changeClass(index){
 this.isActive=index;
},


实现多选：

 <ul v-for="(item,index) in lidata">
<li><span :class="{active:item.checked}"  @click="changeClass(item)"> {{item.name}}</span>
 </li>  
```
</ul>
changeClass(item){
```
 if(typeof item.checked=='undefined'){
    this.$set(item,"checked",true)
 }else{
   item.checked=!item.checked
 }
},


限制三次：
  changeClass(item){
    let a=document.getElementsByClassName('active'); 
   if(typeof item.checked=='undefined'){
     if(a.length<=3){
      this.$set(item,"checked",true); 
   }else{
    alert(2222222222)
   }  
  }else{
   item.checked=!item.checked; 
  }
},
```

标签: vue.js
问题：如何部署nodejs应用到服务器？
事情是这样的，我是做前端开发的，最近学习nodejs并做了些练手项目。想把他们部署到服务器上，对linux和服务器部署相关知识了解较少。通过google得到大致思路如下：购买一台vps安装linux系统，安装nodejs和mongodb,用Nginx做端口映射，用pm2做进程监控管理。发现这些操作全是命令行，而且感觉好复杂，有好多不了解的知识。我只是单纯的想把项目部署到服务器，之前用php开发的程序的时候，就购买一个虚拟主机，然后ftp上传一下程序就好了，大家部署nodejs应用都是如何操作的，有没有啥简单的方法？

回答：nodejs服务器部署教程一
nodejs服务器部署教程二，把vue项目部署到线上
nodejs服务器部署教程三，部署基于node+vue+mongodb的项目
nodejs服务器部署教程四，部署ssl证书，升级为https

标签: node.js, linux, pm2, ngnix, mongodb
问题：antd Table 如何根据某一行的数据控制行tr的样式
如果
```
[{nmae:xx,repeat:1},{nmae:xx,repeat:-1},{nmae:xx,repeat:1},{nmae:xx,repeat:-1},{nmae:xx,repeat:1}]
```
数据结构类似与上面，现在通过antd Tabel组件中的columns如何只能改变某一个单元格的式样。请问一下如何设置当repeat为1的时候改变整行tr背景？

回答：以下代码供参考
```
<Table columns={configColumns} rowClassName={(record, index) => index % 2  === 0 ? styles.classname : ''} dataSource={data}/>

```

标签: antd, react.js
问题：java8 stream根据下标分组
我有个list想要按照奇偶下标生成两组list，只利用java8的stream可以做到吗？
比如[1,3,5,7,9]，按照奇偶下标分成[1,5,9]和[3,7],但是stream似乎无法获取下标，所以试了半天也不行。
另外，java8的stream以后可以完全取代for循环吗？我感觉有些复杂的逻辑拿stream折腾不是一个好的选择

回答：这个要从为什么`java8`会弄出`stream`这种循环方式说起了
以前的`for`循环是属于外部循环，由调用者自己显式的取出每个元素加以处理，尤其是并行处理时，非常痛苦
而stream是属于内部循环，你可以无需关心它是如何循环的，要是并行的时候如何优化，这些你都可以不管，你只需要简简单单告诉他需要做什么处理即可
举个简单的例子：
地上有很多乒乓球，爸爸要让你儿子捡起来放到盒子里
如果是外部循环，可能这种模式
爸爸：地上还有球么
儿子：有
爸爸：那把它捡起来放到盒子里，还有么？
儿子：有
爸爸：继续捡起来放到盒子里，还有么？
儿子：有
爸爸：接着捡起来放到盒子里，还有么？
儿子：没有了
爸爸：ok，收拾好了
如果是内部循环
爸爸：把地上的球捡起来全部放到盒子里
儿子：好，完成
例子可能很牵强，但是我们作为开发者，就是爸爸，只需要告诉儿子（`JDK`）把球放进盒子这个动作就好，具体儿子怎么放，一次一个手拿一个，还是一次每个手拿一个，由它自己来思考，不需要我们去指挥，我们只关注具体需要做的事就好
所以说stream是一种内部循环，你不需要去关注下标...关注下标的话，从某种意义上来说，还是外部循环的思想在处理了，当然您的问题中，明确就是要求是关注下标了，貌似好像`stream`是没法写似的
其实不然，写肯定能写的，只是说换一种方式而已，不把下标当成循环用的元素，而是把它与具体需要循环的数字绑定起来，写出来差不多是这个样子
```
public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1,3,5,7,9);

        Map<Boolean, List<Integer>> collect = IntStream.rangeClosed(1, list.size())
                                                      .boxed()
                                                      // 把数字和下标绑定起来
                                                      .map(i -> mapToEntry(i, list.get(i-1)))
                                                      // 按照下标是否能被2整除进行分组
                                                      .collect(Collectors.partitioningBy(simpleEntry -> Integer.parseInt(simpleEntry.getKey().toString()) % 2 == 0,
                                                               Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
        // 偶数列表 3,9
        List<Integer> evenList = collect.get(Boolean.TRUE);
        // 奇数列表 1,5,7
        List<Integer> oddList = collect.get(Boolean.FALSE);
    }

    private static AbstractMap.SimpleEntry<Integer, Integer> mapToEntry(Integer i, Integer integer) {
        return new AbstractMap.SimpleEntry(i, integer);
    }
```

标签: java, stream
问题：如何实现PHP版本共存?
## 描述
由于一个服务器多至多个项目.  有些项目对php版本有不一样的需求 如何实现每个项目对应指定的PHP版本?
## 服务器环境
- ubuntu
- Nginx
- MySQL
- php.x (N个)
ubuntu
Nginx
MySQL
php.x (N个)
## 实现效果
www.demo.com -> 对应PHP7.x
a.demo.com   -> 对应PHP5.x
b.demo.com   -> 对应PHP4.x

回答：配置下让Nginx监听不同的端口或文件就可以实现了。大体思路如下：
因为Nginx是通过PHP-FastCGI与PHP交互的，然后，PHP-FastCGI运行后会通过文件、或本地端口两种方式进行监听，在Nginx中配置相应的FastCGI监听端口或文件即实现Nginx请求对PHP的解释。因此，Nginx中根据需求配置调用不同的PHP-FastCGI端口或文件，便实现不同版本PHP共存了。
修改php-fpm.conf，监听端口：
```
<value name="listen_address">127.0.0.1:8001</value>
```
或者
```
<value name="listen_address">/path/to/unix/socket</value>
```
修改好后，配置好php.ini相关的参数后重启一下
然后，再修改Nginx
```
location ~ .*.(php|php5)?$
    {
      fastcgi_pass 127.0.0.1:8001;
      fastcgi_index index.php;
      include fcgi.conf;
    }
```
就可以通过监听不同端口来实现，不同版本的php-fpm调用了。

标签: linux, php, nginx, apache
问题：一道原生JS的问题
```
    <div>
        <input/>
        <span></span>
    </div>
    
    
    function nodeToFragme(node){
            var flag = document.createDocumentFragment();
            var child;

            while(child = node.firstChild ){
                flag.appendChild(child);    //请问为什么能够每次插入不同的节点？
            }

            return flag ;
        }
```
为什么每次appendChild都能够插入不同的节点？不应该每次都是第一个节点么？

回答：appendChild 成功后，会把节点从原来的节点位置移除；
当进入 while 循环的下次执行 (child=node.firstChild) 时, 这里面运算的 firstChild 已经变成了原先移除的下一个节点;
直到 node 中再也没有节点时，(child=node.firstChild) 的返回值会为「false」,这时循环就结束了，appendChild 也完成了。
附注：
https://developer.mozilla.org...

标签: javascript
问题：laravel中如何区分get数据和post数据
可能有时候会碰到这样的场景：
有一个post提交请求，请求地址为:xxx?id=10，提交的post数据为:id=20
而在控制器中，我要同时得到get和post中数据
get中的id为10，而post中的id为20
这两个id分别要如何取出来？

回答：```
// 路由
route::any('input', 'YourController@input')

// 测试方法
public function input(Request $request)
{
    // get方法
    echo $request->get('id');
    // get方法
    echo $request->query('id');
    // get方法
    echo $request->query->get('id');
    // 有post会覆盖get improve by amu(您)
    echo $request->id;
    // 有post会覆盖get
    echo $request->input('id');
}
```
通过测试，一般情况下，如果post／get键名一样，post过来的数据，$request->xxx和$request->input('xxx')会覆盖掉get的取值。

标签: laravel, php
问题：www.baidu.com为什么属于二级域名？
baidu.com属于一级域名？
www.baidu.com属于二级域名？
www.google.com.hk属于三级域名？他的顶级域名是.hk还是.com呀？
tieba.baidu.com前面为什么没有www？
www.zhaopin.longfor.com前面为啥加了www，也是属于三级域名？

回答：.com —— 根域（.com.cn .net.cn 等也属于根域）
baidu.com —— 顶级域名、一级域名
xxx.baidu.com —— 二级域名
www（World Wide Web）俗称万维网，只是大家“默认”的域名前缀，但它并不是必须的。

标签: 网站, 域名解析, dns, c++, c
问题：javascript字符串提取数字？
需求：要把一串字符拆分成有用的信息，字符串的格式有两种情形
1、abc10
2、123abc100
字符与数字长度不固定，提取后的结果应为:
1、['abc','10']
2、['123','abc','100']
补充需求
输出结果
1、['abc','10']
2、['abc','123','100']
这样使用的时候更方便。
当abc为某个特定的字符时，字符前面的数字与本身合并一起。如：1ab23=>['1ab','23']

回答：```
/**
 * @param {string} str
 * @param {string|string[]} [keywords]
 * @returns {string}
 */
function match (str, keywords) {
  str = String(str)
  var ks = ''
  if (Array.isArray(keywords)) {
    ks = keywords.map(k => '\\d+' + k).join('|') + '|'
  } else if (typeof keywords === 'string') {
    ks = `\\d+${keywords}|`
  }
  var checker = new RegExp(`${ks}\\d+|\\D+`, 'g')
  return str.match(checker).sort((a, b) => !isNaN(a * 1) && isNaN(b * 1) ? 1 : -1)
}

console.log(match('123abc100')) // [ 'abc', '123', '100' ]
console.log(match('1ab23', 'ab')) // [ '1ab', '23' ]
console.log(match('ab23', 'ab')) // [ 'ab', '23' ]
console.log(match('1ab23cd244gh3', ['ab', 'cd'])) // [ '1ab', '23cd', 'gh', '244', '3' ]
```

标签: javascript
问题：与php相比，python在采集方面有哪些优势？
最新需要做采集功能，据说用python来做会比php直接用curl来写方便很多，请问主要是有哪些优势？
如果是有特定的类库的话，PHP有类似的类库可以代替么？
python大概看过hello word之类，感觉上手也算简单，如果为了采集单开一个项目用python来写值不值？

回答：会啥用啥，
- python 和 php 数据采集方面的各自特点
- PHP或者python进行数据采集和分析，有什么比较成熟的框架？

python 和 php 数据采集方面的各自特点
PHP或者python进行数据采集和分析，有什么比较成熟的框架？
不过你有空可以深入了解了解`python`，毕竟人生苦短，不玩`python`可惜了

标签: python, php
问题：python set中的对象如何去重
定义Person对象
class Person():
```
def __init__(self,name,number):
    self.name=name
    self.number=number
   
```
person1=Person('yms',('123456','123'))
person2=Person('yms',('123456','123'))
将两个对象都放到set里面
set([person1,person2])
我得出的结果set里面含有2个对象，但是明显这俩个对象一样的，请问怎么去重呢?注意一下('123456','123')是个元组不是普通字符串

回答：你需要为这个类定义`__eq__`、`__ne__`、`__hash__`这三个函数，缺一不可：
```
class Person(object):
    def __init__(self, name, number):
        self.name = name
        self.number = number
        
    def __eq__(self, other):
        if isinstance(other, Person):
            return ((self.name == other.name) and (self.number == other.number))
        else:
            return False
            
    def __ne__(self, other):
        return (not self.__eq__(other))
        
    def __hash__(self):
        return hash(self.name) + hash(self.number)
        
p1 = Person('yms', ('123456','123'))
p2 = Person('yms', ('123456','123'))
print(set([p1, p2]))

```
由于你说`number`是元组，所以我就直接对其使用`hash`函数了。这个`hash`函数是随便写的，你自己根据实际情况调整。

标签: python
问题：Vue img使用@路径报错，import中使用正常
1.webpack.base代码：
```
 extensions: ['.js', '.vue', '.json'],
 alias: {
        'vue$': 'vue/dist/vue.esm.js',
        '@': resolve('src')
    }
```
2.img报错代码：
```
       <div class="m-icon-head">
                <img src="@/assets/head.png" alt="">
            </div>
```
3.import正常代码：
index.js
import manageJob from '@/pages/jobhunter/Job/manage-job';
import loginSelect from '@/components/index/login_select';
import phoneLogin from '@/components/index/phone_login';
import passwordLogin from '@/components/index/password_login';
组件：
```
import mHeader from '@/components/header/header';
import mContent from './mine-content';

```
错误提示：GET http://localhost:8880/@/asset... 404 (Not Found)
为啥会这样？？？

回答：- 因为`@`是webpack中定义的别名，在JS中可以使用此别名，代替`resolve('src')`指向的路径
- `import xxxxxx`是JS语法，所以可以使用`@`别名
- 而`<img src="@/assets/head.png" alt="">`标签中，src作为一个属性值，其值是字符串并非是JS，所以不能用`@`别名
- 参见https://github.com/vuejs/vue-...
- 这个方法我还没试验过，不过据上面的Issue所说，`url`地址前加`~`标记可以让解析器将地址中的别名解析出来
- Issue中提出的方案是：`<img src="~@/assets/head.png" alt="">`

因为`@`是webpack中定义的别名，在JS中可以使用此别名，代替`resolve('src')`指向的路径
`import xxxxxx`是JS语法，所以可以使用`@`别名
而`<img src="@/assets/head.png" alt="">`标签中，src作为一个属性值，其值是字符串并非是JS，所以不能用`@`别名
参见https://github.com/vuejs/vue-...
这个方法我还没试验过，不过据上面的Issue所说，`url`地址前加`~`标记可以让解析器将地址中的别名解析出来
Issue中提出的方案是：`<img src="~@/assets/head.png" alt="">`

标签: vue.js, vue-router
问题：Vue 怎么做scrolltop 的滚动动画
做个了需求是点击右侧的item 左边滚动到队员的位置。。
请问怎么可以在滚的时候加一些过度效果。。下面是我的代码
```
scrollToEl(name){
      let scrollPosition=0
      this.playerlist.forEach((item,index)=>{
        if(item.players_name==name){
          scrollPosition=index
        }
      })
      // this.$refs.index[scrollPosition].scrollIntoView()
      let jump=document.querySelectorAll('.pick-right-item')
      let total=jump[scrollPosition].offsetTop
      console.log(total);
      // Chrome
      document.body.scrollTop = total
    }
```
这样可以直接滚动到制定位置，但是在vue中怎么做scroll的滚动动画。。

回答：非常遗憾的告诉你, scrollTop是js属性, 不是css属性, 所以无法使用transition或者animate去加动画。只能借助一些动画类库, 或者自己编写一个scroll滚动的效果.

标签: javascript, css, vue.js, scroll
问题：AJAX发送POST请求，请求提交后Method从POST变成GET
代码如下：
```
$.ajax({
    type: "post",
    dataType: "json",
    url: "http://xxx",
    data: {'xxx':'xxx'},
    success: function(returnData) {}
})
```
url 是经过 nginx 重定向的 http 地址，原地址为 https 地址
AJAX 发送的是 POST 请求，请求提交后 chrome 调试工具中看到的请求 Method 从 POST 变成 GET

回答：服务器如果返回`301`或者`302`状态码，所有请求方法都会切换成`GET`头部的`location`
如果要保证重定向后的请求方法，需要在服务端返回`307`(临时)或者`308`(永久)状态码，这两个状态码不会更改原请求方法（需要客户端支持）

标签: 重定向, nginx, post, ajax
问题：怎么使用java8的stream合并HashMap的所有value为一个List，value的类型为Stack
怎么使用java8的stream合并HashMap的所有value为一个List，value的类型为Stack
`map = new HashMap<String, Stack<String>>;`
要求把map的value合并成`List<String>`，并使用java8的stream方法操作
Stack是java自带的容器，在这里完全可以看成是ArrayList

回答：在写`stream`的时候，一定要心里非常清楚当前`stream`中到底是什么元素，这样你才能结合`map`,`filter`,`peek`等方法来转化你的数据
首先开始的时候还没有`stream`，数据源是一个`map`，把`map`转化为`stream`，我还是建议使用`entryset`的方式
```
// 此时stream里的元素是Map.Entry<String, Stack<String>>
map.entrySet().stream()
```
您是想要`Entry`里面的`value`，也就是`Stack<String>`，那就要把`Map.Entry<String, Stack<String>>`转化为`Stack<String>`，那这里肯定要用`map`操作啦
```
// 此时stream里的元素是Stack<String>
map.entrySet().stream().map(Map.Entry::getValue)
```
拿到了`Stack<String>`的`stream`还不够，看您的意思，是想取出`Stack`中的一个`String`的属性或者一个计算出来的值，那就是要把`Stack`转化为`String`，根据您的信息，这个`Stack`其实就是`java.util.Stack`,那这个也相当于是一个集合了，集合都会有都可以变成`stream`的，由于需要集合里的`string`对象，那就相当于要把这个`Stack`集合压平，压平的话，那就肯定要用`flatmap`啦
```
List<String> collect = map.entrySet().stream()
                                     .map(Map.Entry::getValue)
                                     .flatmap(Stack::stream)
                                     .collect(Collectors.toList());
```
这样就完整啦，当然`map`中我用的是方法引用，觉得这么写更直观一点，可以看得到当前`stream`里到底是啥类型元素，你也可以写成`lamdba`的形式啦

标签: java
问题：javascript中forEach,map,for of的应用场景与效率？
这裡讨论的是lodash版本的_.forEach和_.map，原生ES6 javascript的for of这三种方法。
目前我的使用思路是，如果是要遍历并改变Array并回传一个新的Array，那我就选择_.map。
至于for of 和_.forEach，我用了以下的方式测试效能:
forEach
```
let arr = [];
for(var i = 0 ; i<50000000 ; i++){
    arr.push(i);
}
var start = Date.now();
let sum = 0;
_.forEach(arr,(a)=>{
    sum += a;
});
var end = Date.now();
console.log('总数:'+sum,'毫秒数:'+(end-start));
//总数:1249999975000000 毫秒数:1530

```
for of
```
let arr = [];
for(var i = 0 ; i<50000000 ; i++){
  arr.push(i);
}
var start = Date.now();
let sum = 0;
for(let a of arr){
  sum += a;
}
var end = Date.now();
console.log('总数:'+sum,'毫秒数:'+(end-start));
//总数:1249999975000000 毫秒数:575
```
for of速度大胜_.forEach，所以在遍历Array时，我现在会使用for of而不是_.forEach。
我想问的是，这样的思路有问题吗？
_.forEach要在什麽时候使用呢？
我自己想到的_.forEach使用时机是遍历Object时，javascript原生的话应该是和for in比较。

回答：有问题。
JS中不存在传统意义上的数组，静态语言中，数组是一段连续的内存，每一个元素都是固定字节长度的，所以通过下标可以取地址，快速找到引用值。
但是JS中的数组是对象，这导致你遍历数组时，其实是在遍历对象的key(静态语言中的HashMap)，而JS中对数组类型的遍历做了特殊处理，所以foreach遍历不到非数值类型的键，这也解释了为什么foreach比forin慢，因为多了一层判断。
但是如果你使用forin遍历数组，会带出非数字键：
```
var x = [1, 2, 3];
x.a = 'a';
x.b = 'b';
x.c = 'c';
for (let k in x)
  console.log(k)

```
即使你不会这么干，谁知道你的同伴们呢？第三方框架中呢？自定义原型链呢？
结论：ES5中遍历数组还是老老实实的foreach或者for循环.
你的例子中使用的是ES6，由于Array类型实现了Iterator接口，所以forof是安全的，但是如果通过babel编译成es5，我猜想由于需要引入Iterator的pollyfill，效率不可能比foreach高。

标签: javascript, lodash, performance
问题：这种switch语句块中default放前面的情况怎么走
```
int c,i;
for (int i = 1; i < 3; ++i)
{
    switch (i)
    {
        default: c+=i;
        case 2: c++;break;
        case 4: c+=2;break;
    }
}
printf("%d\n", c);

```
这个代码为什么会等于3啊？这里面不是default第一次i为1的时候走default: c+=i;，第二次i等于2就走case 2: c++;break;然后就结束，最后输出c=2吗？为什么是3呢？

回答：首先明确一下switch中的一些注意点：
## 1.
`switch` 语句体由一系列 `case` 标签和一个可选 `default` 标签组成。 `case` 语句中的两个常量表达式的计算结果不能为同一个值。 `default` 标签只能出现一次。 标记语句不是语法要求，但如果它们不存在，`switch` 语句是无意义的。默认语句（即`default`标签）无需显示在末尾；它可以显示在 switch 语句体的任何位置。 `case` 或 `default` 标签只能显示在 `switch` 语句内。  
摘自：Microsoft Visual Studio 2015 c++ Switch语句官方文档
## 2.
上述所说的`case`和`default`本身就是标签，就是告诉编译器从满足这个标签开始向后执行，之后不会再判断其他标签的正确性，直到`break`语句或者`switch`语句的作用域结束。
## For this problem
STEP 1 :当`i=1`时，由于`i!=2&&i!=4`故从`default`标签后开始执行，此时执行语句`c+=i;`(我们现在就假设编译器帮你把c初始化为0，要知道并不是所有的编译器都这么友好)执行后c的值为1；  
STEP 2：综合上述1，2可知由于此时没有碰到任何`break`语句也没有到`switch`语句的作用域结束（因为这个`default`语句是放在第一个的）所以它接着向后执行`case 2`后的语句（此时编译器已经不看满不满足`case`标签了）此时执行语句`c++`;执行后c的值为2；遇到`break`语句跳出`switch`语句。  
STEP 3:当`i=2`时，由于i满足`case 2`的情况，所以直接从`case 2`便签后的语句开始执行，此时执行语句`c++`,执行后c的值为3，遇到`break`语句跳出`switch`语句。  
STEP 4:当i=3时，跳出`for`循环输出c=3；  
（上述过程为本人用 Visual Studio 2015单步调试并结合资料得出的结论）

标签: c, c++
问题：if语句如何判断中文
```
<?php if (96 < ($this->category_info['id']) && 108 > ($this->category_info['id'])) { ?>
标题1
<?php } else { ?>
标题2
<?php } ?>
```
通过以上代码可以定位如果id范围在97-107之间就显示标题1的内容，否则返回2
怎么修改可以当搜索词$this->search这个变量 包含"价格"这个词的时候显示标题1
否则返回标题2

回答：使用 strpos
```
int strpos ( string $haystack , string $needle [, int $offset = 0 ] )
```
```
strpos($this->search, '价格') === false //说明不包含价格
```

标签: php
问题：webpack中配置文件的module中的rules和use什么关系
module有没有rules？rules中为什么还有loader，use不是也是加载loader的吗？

回答：rules是一个数组，指定多个Rule，Rule当中的loader是use中loader的简写，
官方的文档的话语能很清楚的说明此疑问(建议看看官方documentation，链接: https://webpack.js.org/config... )：
```
Rule.loader is a shortcut to Rule.use: [ { loader } ]

```

标签: webpack
问题：git 分支的作用
如果有A和B两个人同时在开发，通常一个feature或者bugfix会建一个新分支再合并进develop分支，那如果A和B直接在develop上（pull下代码再push，有冲突再解决）不也可以开发吗，如果考虑回滚，在develop上不也可以reset或者revert吗？
感觉同一个分支反而更简单，忽然不知道建新的feature或bugfix分支到底有什么好处？

回答：如果你在开发新功能的时候，急需修改一个 bug 怎么办？那你要把你新功能不稳定的代码也部署了？显然不可能。所以要有 feature 分支来保证新功能开发的差不多的时候才能进入主分支的代码。那你的 bug 可以随时修改。
那么，如果你有两个 bug 是先后发现的，但是一个 bug 改好了需要上线，另一个还在改，怎么办？你把改到一般的 bug 部署上线么？显然不可能。所以你需要一个 bugfix 分支，来确保 bug 改好了代码才能回到主分支。
最后，你在开发一个新功能，到一半。突然，产品经理跟你说，我这有个新功能，明天上线！！怎么办？你要把产品暴打一顿辞职还是明天上线新功能？那你第一个一半的新功能代码怎么办？扔了？还是半成品部署上线？所以你需要多个 feature 分支来开发不同的新功能。
怎么样，主分支健壮了吧？随时随地可以部署了吧？

标签: git, javascript, php, python, java
问题：React 如何监听路由变化重新渲染组件
```
// route.js
<Router>
  <Switch>
    <Route path="/" component={NewsList} />
    <Route path="/new" component={NewsList} />
    <Route path="/show" component={NewsList} />
    <Route path="/ask" component={NewsList} />
    <Route path="/jobs" component={NewsList} />
  </Switch>
</Router>
```
```
class NewsList extends Component {
  componentWillMount () {
    const type = this.props.location.pathname.replace('/', '') || 'top'
    this.props.dispatch(fetchListData(type))
  }
    
  render () {
    ...
  }
}
```
react: v15.6.1  
react-router: v4.1.1
部分代码如上，现在的问题是切换路由时，组件并不会重新渲染。请问如何解决？

回答：为什么需要重新渲染组件？实质上，你想要的只是当路由变化，请求对应路由的数据而已。
那么考虑一下React组件的生命周期钩子。第一次加载时:
```
"constructor"
"componentWillMount"
"render"
"componentDidMount"
```
当组件的props发生改变时，组件更新，会调用如下的生命周期钩子
```
"componentWillReceiveProps"
"shouldComponentUpdate"
"componentWillUpdate"
"render"
"componentDidUpdate"
```
当路由变化时，即组件的props发生了变化，会调用componentWillReceiveProps等生命周期钩子
### 那我们所需要做的只是： 当路由改变时，根据路由，也去请求一下数据就OK了，于是乎:
```
class NewsList extends Component {
  componentDidMount () {
     this.fetchData(this.props.location);
  }
  
  fetchData(location) {
    const type = location.pathname.replace('/', '') || 'top'
    this.props.dispatch(fetchListData(type))
  }

  componentWillReceiveProps(nextProps) {
     if (nextProps.location.pathname != this.props.location.pathname) {
         this.fetchData(nextProps.location);
     } 
  }

  render () {
    ...
  }
}
```

标签: react.js
问题：Vue.prototype的问题
我用Vue在main.js中创建
```
Vue.prototype.a = 1;  这个全局的变量后；
```
在组件a中使用
```
console.log(this.a);     // => 1
this.a = 2;
```
然后从a跳到b后；
```
console.log(this.a);
```
还是1，不是2，为什么？ 怎么修改这种全局的变量啊？还是说用其他的方法设置和修改全局的变量或对象？

回答：这个不是全局变量，而是原型。
因为每一次跳转到新的Vue页面，都是一个独立的Vue实例，实例中`this.a`从`Vue.prototype.a`而来，所以仍然是1。
如果需要设置全局变量，在`main.js`中，Vue实例化的代码里添加
```
new Vue({
    ...
    data() {
        return {
            ...,
            a: 1
            ...
        };
    },
    ...
});
```
其他所有组件中通过`$root.a`可访问此变量。

标签: vue.js
问题：数据库如何判断一条数据是否被修改?
A ,B同时在一页面上访问一组数据, A针对其中一条数据做了修改. B的页面没有刷新,所以B看见的信息是在A修改之前的,这时候B也要修改这条数据. 我如何做才能提醒B,这条数据已经被修改过.  
看到一个办法,修改数据之前根据这条数据最后修改的时间先将这条数据查出来(select * from xxx where updatetime = xxx and id= xxx),如果查不到说明修改过,查到了说明没有修改.
我想问问有没有更好的办法?

回答：我记得hibernate中乐观锁用的是版本号字段实现的，每次更新成功后时候版本号字段的值加1
在更新前，先检查数据库中的版本号和页面中保存的版本号是否相同，如果版本号变大，提示用户在编辑期间已有其他用户修改了数据。
当然也可以用悲观锁，进入页面的时候使用的select ... for update锁定记录，这时候其他用户就不能同时编辑锁定的记录了。

标签: php, mysql, sql, sqlserver
问题：关于NumPy数组操作的问题
```
['000001_2017-03-17.csv', '000001_2017-03-20.csv',
 '000002_2017-03-21.csv', '000002_2017-03-22.csv',
 '000003_2017-03-23.csv', '000004_2017-03-24.csv']
```
numpy数组，总共有几个万个元素。现在想保留每个元素前面的编号000001之类的，并且去掉重复，只保留唯一的一个编号。结果应该是`['000001','000002','000003','000004']`
除了用for语句实现外，有没有更高效的办法？

回答：写个NumPy的吧~
python3
```
>>> import numpy as np
>>> a = np.array(['000001_2017-03-17.csv', '000001_2017-03-20.csv',
 '000002_2017-03-21.csv', '000002_2017-03-22.csv',
 '000003_2017-03-23.csv', '000004_2017-03-24.csv'])

>>> b = np.unique(np.fromiter(map(lambda x:x.split('_')[0],a),'|S6'))
>>> b
array([b'000001', b'000002', b'000003', b'000004'], 
      dtype='|S6')
```
还可以这样写：`np.frompyfunc`
`'|S6'`是以6个字节存储字符串
`'<U6'`是以6个`小端序Unicode字符`存储字符串
```
>>> b = np.array(np.unique(np.frompyfunc(lambda x:x[:6],1,1)(a)),dtype='<U6')
>>> b
array(['000001', '000002', '000003', '000004'], 
      dtype='<U6')
```

标签: python
问题：webpack rebuild 速度太慢
工程的开发环境使用`express`+`webpack-dev-middleware`+`webpack-hot-middleware`，热加载+网页的错误提示开发起来很爽。
之前webpack每次启动的build速度都比较慢，后来参照这篇文章做了优化：
开发工具心得：如何 10 倍提高你的 Webpack 构建效率
加上dll plugin和happypack等之后，构建速度一下子由120s缩短到30s以内，随着工程越来越大（12万业务代码），rebuild速度越来越慢，现在一次rebuild速度大概得12s左右，实在是不能忍受。
哪位有这方面优化经验的，还请不吝赐教。

回答：There are quite a few conditions that can contribute to slowness. From personal experience, I have found that the best way about trying to solve it, is to Measure, Profile, and Diagnose the issue first. 
When you run webpack, instead run it with node and the following flags: 
`node --inspect --debug-brk ./node_modules/webpack/bin/webpack.js`
Then open up Chrome Browser and goto `chrome://inspect` and click 'Open Dedicated Node Debugger'. 
This will give you debug, breakpoint, and profiling features that you can use to measure and analyze what functions and areas of webpack are taking the longest. Once you have found that out, you can start to determine exactly what is causing the issue. Here is a great post (although a little outdated for the instructions), that shows how these steps might look like
If this doesn't help, then you can try other webpack build features like DllPlugin, using `devtool: 'eval-source-map'`, look for specific loaders that have caching features, as well as our new cache-loader.

标签: webpack
问题：golang的slice问题
```
s1 := []int{1, 2, 3, 4}
s2 := []int{-1, -2, -3}

fmt.Println(append(s1[:1], s2...))

fmt.Println(s1)
```
打印的结果：
```
[1 -1 -2 -3]
[1 -1 -2 -3]

```
弄不明白的是：为什么s1的值也变了？

回答：因为append函数并不保障slice是否被修改，也就是说append可能会修改slice，也可能不修改，所以使用append有两个原则：
append函数调用后，应该使用返回值作为结果。
1. append函数调用后，不应该再使用实参传入的slice。
2. 所以使用append函数一般都是`s = append(s,elem1)`这种用法，也就是把结果重新赋值给原来的slice。
|append函数之所以有这个表现，是因为slice的底层存储依赖于底层数组（underlying array），用你的例子来给你说明一下：
你的s1初始化的值是`[]int{1, 2, 3, 4}`，它的len和cap都是4，所以它的底层数组是一个长度为4的数组`[4]int{1,2,3,4}`。
基于slice的特点，`s1[:1]`和s1是共享底层数组的，所以`s1[:1]`这个slice的改变是会影响到underlying array的。

> If it has sufficient capacity, the destination is resliced to accommodate the new elements. If it does not, a new underlying array will be allocated.

append函数在填充elem1,elem2的时候会先判断slice的cap是否能容纳所有追加的值，这个计算方式是从slice的尾部计算的，在你的例子里，slice的尾部是第一个元素，后面的容量恰好可以满足3个元素，所以它不会申请新的底层数组，而会直接使用原有的底层数组作为存储，这也就把原本的底层数组改成了[1 -1 -2 -3],由于s1的存储依赖于这个底层数组，自然也就变成了`[1 -1 -2 -3]`。

如果把你的例子改成`append(s1[:1],1, s2...)`，或者改成`append(s1[1:2], s2...)`,你就会发现s1没有被改变，这是因为容量不能容纳所有追加元素，append会申请一个新的底层数组用来存储，也会返回一个新的slice，这不会影响到原本的底层数组，也就不会影响到原本的slice。

所以使用`s = append(s,elem1)`是一个好习惯，尽量使用这个用法。

标签: go
问题：react-router中嵌套的子组件拿location对象的问题
比如说一个页面有个modal组件，modal组件里面的内容写在子组件里面(ModalDetail),在这个组件里面拿不到this.props.location，求解答，除了从父组件传进去和通过window对象拿，还有什么方法

回答：react-router v4之前的版本，有一个叫做`withRouter`的高阶组件。你在定义自己的modal组件时包一层即可。
v4版本暂时没有用过，有没有改动不清楚
```
import React from 'react'
import PropTypes from 'prop-types'
import { withRouter } from 'react-router'

// A simple component that shows the pathname of the current location
class ShowTheLocation extends React.Component {
  static propTypes = {
    match: PropTypes.object.isRequired,
    location: PropTypes.object.isRequired,
    history: PropTypes.object.isRequired
  }

  render() {
    const { match, location, history } = this.props

    return (
      <div>You are now at {location.pathname}</div>
    )
  }
}

// Create a new component that is "connected" (to borrow redux
// terminology) to the router.
export default withRouter(ShowTheLocation)
```
包一层withRouter之后，就可以访问到你想要的属性了，你还可以进一步学习，看看里面都有些什么。

标签: javascript
问题：dockerfile 与 docker-compose的区别是什么?
docker-compose是编排镜像, 那么docker-compose是不是可以做Dockerfile的能做的事?

回答：我所理解的docker-compose是编排容器的。例如，你有一个php镜像，一个mysql镜像，一个nginx镜像。如果没有docker-compose，那么每次启动的时候，你需要敲各个容器的启动参数，环境变量，容器命名，指定不同容器的链接参数等等一系列的操作，相当繁琐。而用了docker-composer之后，你就可以把这些命令一次性写在docker-composer.yml文件中，以后每次启动这一整个环境（含3个容器）的时候，你只要敲一个docker-composer up命令就ok了。
而dockerfile的作用是从无到有的构建镜像。
两个完全不是一码事

标签: dockerfile, docker, docker-compose
问题：php 的 opcache 和最近的 php jit 有什么区别？
opcache 是用于缓存 zend 引擎编译生成的 opcode，下次就无需编译。  
最近听说了 php jit,看了一下 jit 的概念，描述是这样的:
JIT编译（just-in-time compilation），即即时编译，狭义指某段代码即将第一次被执行时进行编译，而后则不用编译直接执行，它为动态编译的一种特例。
那 php 的 jit 和 opcache 有什么区别呢？

回答：`源代码(人认识)->字节码(解释器认识)->机器码(硬件认识)`
来看下PHP的执行流程，假设有个a.php文件，不启用opacache的流程如下：
`a.php->经过zend编译->opcode->PHP解释器->机器码`
启用opacache的流程如下
`a.php->查找opacache缓存，如果没有则进行zend编译为opcode并缓存->opacode->PHP解释器->机器码`
启用jit的流程如下
`a.php->编译->机器码`
以后都只执行机器码，不编译，效率上高了很多

标签: php, jit, opcache, opcode, zend-opcache
问题：python redis 列表插入 速度太慢
```
pool = redis.ConnectionPool(host=host, port=port)
client = redis.StrictRedis(connection_pool=pool)

for i in range(10000):
    for j in range(30):
        client.lpush(IDLE_TASKS, json.dumps(args))
 
```
这种执行效率低的可怕。
需要等几十秒，才能插入完成。
请问有没更高效率的处理手法？
args 只是以一个元组内容随意(1,2,"3")之类

回答：用 Redis 的 Pipeline ， 先在循环内生成数据，最后一次性插入
```
>>> p = r.pipeline()        --创建一个管道
>>> p.set('hello','redis')
>>> p.sadd('faz','baz')
>>> p.incr('num')
>>> p.execute()        -- 执行管道内命令
[True, 1, 1]

>>> r.get('hello')
'redis'
```
```

pool = redis.ConnectionPool(host=host, port=port)
client = redis.StrictRedis(connection_pool=pool)

p = client.pipeline()
for i in range(10000):
    for j in range(30):
        p.lpush(IDLE_TASKS, json.dumps(args))
p.execute()   
```
使用管道，Redis 会将命令暂时存储，当遇到 `execute()` 时才会执行，所以上面代码只需要和 Redis 服务器通信一次即可将数据全部插入

标签: redis, python
问题：如何向localStorage上的数组push数据
我想做的一个功能是向localstorage上设置一个空数组，每次点击就push当前点击的数据到localstorage的数组中，但是localstorage不允许push，我试过深拷贝localstorage的数组出来再push到深拷贝的数组中，在设置localstorage的数组为深拷贝的数组，但是也没尝试出来，请大神支招

回答：localStorage只能存储String，要用Json对象转化下：
```
var arrayObject = [];
arrayObject.push('a','b','c');
localStorage.setItem("array",JSON.stringify(arrayObject));
var arrayObjectLocal = JSON.parse(localStorage.getItem("array"));
arrayObjectLocal.push('d','e','f');
for (i = 0; i < arrayObjectLocal.length; i++) { 
    console.log(arrayObjectLocal[i]);
}
```

标签: javascript, html5, html
问题：Vue v-for判断是否为第4列，然后加个横线或者第4行才显示这一个<li>
```
<ul id="right-notice">
    <li v-for="site in sites">
        <span class='time'>{{site.ntime}}</span>
        <a title='{{site.qtitle}}'>{{site.ntitle}}</a>
    </li>
    //  思路一：<li 如果是第4行，在这里加一个什么显示属性？></li>
    // 思路二，如果是第4行，在这里插入一个`<hr>`是否可行
</ul>
```
初学vue,翻了好久，没有解决问题，特来求助。望前辈们指点

回答：```
<ul id="right-notice">
    <li v-for="(site, index) in sites">
        <span class='time'>{{site.ntime}}</span>
        <a title='{{site.qtitle}}'>{{site.ntitle}}</a>
        <hr v-if="!((index + 1) % 4)" />
    </li>
</ul>
```

1. 其中，用`(site, index) in sites`代替`site in sites`，`index`为获取到的元素顺序。
2. 这里用到了`v-if`。其中对于index值为3（第四项）,7（第八项），11（第十二项）... （4的倍数项），需要显示`hr`，对于这些值，`(index + 1) % 4`为0，所以`!((index + 1) % 4)`为`true`，显示`hr`。【这里`index`按顺序从0开始计数，所以`index + 1`为表示当前site在sites数组中是第几个，然后`(index + 1) % 4`，每满4，顺序数除以4余数都为0】

添加class的方法：（假设class名叫`underline`）
```
<ul id="right-notice">
    <li v-for="(site, index) in sites" :class="{underline: !((index + 1) % 4)}">
        <span class='time'>{{site.ntime}}</span>
        <a title='{{site.qtitle}}'>{{site.ntitle}}</a>
    </li>
</ul>
```

标签: javascript
问题：vue-router登录成功后回到登录前页面是如何实现的？
例如复制了一个链接https://segmentfault.com/ask/...
到浏览器粘贴回车 会进入登录页面  登录成功后想再回到https://segmentfault.com/ask/...这个页面

回答：大概思路：
1.当你想进入 `http://localhost:8080/user` (该页面需要登录授权)
2.检查是否登录，如果没有登录跳转到登录页，需要将上一页的path(‘/user’)作为query存到login页地址中，如：`http://localhost:8080/login?redirect=%2Fuser`
```
if (!isLogin()) {
   this.$router.push({
    path: '/login',
    query: {redirect: 'your path'} // 如果你使用钩子函数，your path 可以替换成to.fullPath
  })
}
```
3.登录成功后，获取query中的redirect属性，然后跳转到这个地址
```
this.$router.push(this.$route.query.redirect || '/')
```
这是一种方式，你也可以用其他方式存储上一页的地址

标签: vue.js, vue-router
问题：js中向下取整
在js中，以前向下取整都是使用Math.floor方法，现在有看到这样的用法：或运算
 interval = interval | 0
为什么这样就可以向下取整了，这种用法和Math.floor比较，有什么好处？

回答：注意，`|` 不是逻辑或，而是按位或 （OR）。
一些小区别。比如 `Math.floor(NaN)` 还是返回 `NaN`。但 `NaN | 0` 返回 0。
再比如 `Math.floor(Infinity)` 返回 `Infinity`，但 `Infinity | 0` 返回 0

标签: javascript
问题：vue2.0如何设置全局变量
比如资源服务器的host，后台api的host，微信第三方的host。这些host不能挨个去代码里面写吧。
其实，我就是想知道vue如何设置全局变量。总感觉放到window，localstorage，sessionstorage不太正规。

回答：webpack 有global关键字
比如在一个a.js文件中定义全局变量：
```
global.COURSES = 'xxxxx'

```
在入口的main.js
```
import './a'

```
就可以，别的js不需要import也能用到COURSES

标签: javascript, vue.js
问题：为什么Github要把代码合并请求称为pull request而不是push request？
https://stackoverflow.com/que...
我看了这里面的解释，感觉还是不够有说服力啊
我的理解是：我做了一些修改，我请求把我的修改push到你的仓库，然后你review一下我的代码，如果没问题就接受请求merge，这样的话叫做push request岂不是更合适？因为这个操作是我主动发起的。pull是仓库主向我fork的仓库发起的操作，那么pull request这种操作应该是要上游仓库主来向我发起啊，而不是我主动让上游仓库主来pull我仓库中的代码。

回答：是这样的，这个应该分开来解释。
这个pull指的是权限主体的操作。你提交了代码，但是你没有操作上游repo的权限，你需要上游repo的主人review你的代码，然后把你的代码修改pull到他的repo中去，这是对于pull的解释。
而request则指的是发起主体的操作。也就是说，上游repo的主人虽然有repo的控制权，可以把你的代码更改pull到他自己的repo里，但是他不会主动去pull。而是需要你（发起主体）向上游repo的主人提交申请，也就是request，上游repo的主人才会去响应你的request，也就是执行你所说的review和pull的过程。
所以，pull request的理解方法是：一个通知上游repo所有者拉取代码(pull)的请求(request)。
在英语中，request一般指的是提交一个申请，需要对方对申请给予答复的。而request之前的修饰词，则是答复方的动作，当然，中文中也是一样。比如“入团申请”，你提交申请之后，需要对方允许你入团你才算是团员。所以，入团的动作不是你主动做的，而是由审核的人把你的名字加上去才算“入团”。同理“pull request”中，request是你提交的，而pull则是对方做的事情。

标签: github, git
问题：vuejs页面加载完成后执行函数
module.exports = {
```
data: function(){
    return {
        memberQrcodeState: false
    }
},
components: {memberQrcode},
created: function(){
},
beforeRouteEnter: function(to, from, next) {
    // 在渲染该组件的对应路由被 confirm 前调用
    // 不！能！获取组件实例 `this`
    // 因为当钩子执行前，组件实例还没被创建
    //$e.target.src= require("../imgs/test/232.jpg")
    next();
    return true;
},
methods: {
    
},
beforeRouteLeave: function(to, from, next) {
    // 导航离开该组件的对应路由时调用
    // 可以访问组件实例 `this`
    next();
}
```
};
在这基础上加一个页面加载完成后执行的函数！我是小白，第二天接触vuejs，希望大神指点一二

回答：```
mounted(){
    this.init()
},
methods:{
    init(){
        console.log('hello,world')
    }
}
```
谨供参考~

标签: javascript, html5
问题：怎么把自己fork别人的仓库中的代码更新至最新版本？
我在Github上fork了别人一个项目，然后修改之后按照正常流程提交PR，并且对方merged了。
我现在又需要对该项目进行贡献代码，但是发现对方的项目仓库也有别人更新了新代码上去，我怎么让我自己仓库中fork的这个项目代码也同步到和对方仓库一样的最新版本代码，然后我再进行贡献？

回答：首先 把别人的仓库添加到你的上游远程，通常命名为 upstream。操作一次就可以了。
```
git remote add upstream  原作者仓库地址
```
此时再用 `git remote -v` 就可以看到一个origin是你的，另外一个upstream是原作者的。
其次 更新代码
使用`git fetch upstream` 拉去原作者的仓库更新。
使用`git checkout master` 切换到自己的`master`
使用 `git merge upstream/master`, merge或者rebase到你的master

标签: git, github
问题：JSON.parse(JSON.stringify(data))
问下JSON.parse(JSON.stringify(data))是什么情况下要用

回答：一般用来深拷贝一个json对象吧，还可以用来去除值不具有JSON 表示形式（数字、字符串、逻辑值、数组、对象、null）的属性，也就是说像undefined和function这样的属性值。
```
a: {
    age: 1,
    name: undefined,
    time: () => {...}
}
变成：
b: {
    age: 1
}
```

标签: javascript
问题：用户余额和收入支出mysql表设计和实现方案
因为第一次做相关业务，所以经验不足，想来取点经。
1.用户余额表除了用户id和余额还应该有哪些字段？
2.收入表和支出表是分开好还是合并？
3.比如注册送100优惠券这种场景。注册成功后给余额字段加100，给明细表添加一条记录，这2个步骤放在一个事务中，还是明细表用消息队列处理等其他解决方案。

回答：1.用户ID，余额，开始时间（创建时间），最后交易（收入，支出）改变时间，收入总额，支出总额（看情况决定是否冗余，冗余为了避免每次统计都要查库）
2.收入表和支出表看情况。如果收入来源和支出方式都有多种，适合分开，比如说收入（1.打赏，2充值，3转账），支出（1购买业务，2充值会员， 3转赠）等等
3.放在一起直接事务也可，消息队列也行，只要涉及金钱，打好日志即可。因为送钱和明细表操作都不是耗时间操作。
4.金钱计算，尽量避开浮点数，如1元应该存成100分

标签: php, mysql, java
问题：如何把数组对象相同的key值合并，并且把对应的id放到一个数组
例如旧数据：
var old = [
```
{
    id: 1,
    name: 'css',
    type: 'html'
},
{
    id: 2,
    name: 'css',
    type: 'html'
},
 {
    id: 3,
    name: 'javacript',
    type: 'code'
},
{
    id: 4,
    name: 'javacript',
    type: 'code'
}
```
]
想得到的 var new = [
```
{
    id: [1,2],
    name: 'css',
    type: 'html'
},
 {
    id: [3,4],
    name: 'javacript',
    type: 'code'
},
```
]
希望把相同name的对象合并，并且把对应的id放到一个数组

回答：```
var hash = {};
var i = 0;
var res = [];
old.forEach(function(item) {
    var name = item.name;
    hash[name] ? res[hash[name] - 1].id.push(item.id) : hash[name] = ++i && res.push({
        id: [item.id],
        name: name,
        type: item.type
    })

});
console.log(JSON.stringify(res))
```

标签: javascript
问题：github怎么提交回退旧版本代码并更改后的文件到主分支上
可能说的不是很明白，就是我代码写着写着，发现我已经不想这么弄了，用`git reset --hard <版本号>`退回到之前的某个版本重新写，这样当我当我写完之后，想在提交到远程仓库，它就会报错
```
To https://github.com/zifenggao/wenda.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/zifenggao/wenda.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```
说我版本是之前的版本，要我合并后再提交，那我应该怎么弄，能了几遍都没搞懂。

回答：首先，根据你的描述，既然你用到了 `git reset --hard`，那就可以推断出你已经 `add` 和 `commit` 过了。
其次，根据报错，可以推断出你已经 `push` 过了（这个推断基于只有你一个人拥有 master branch 的更改权限。
那么当你执行 `git reset --hard` 之后，历史纪录是不能跟远程的记录直接合并的。因此才会有这个报错。
举个例子，远程是 `A -> B -> C -> D`，你 `git reset --hard` 之后是 `A -> B`。这时候除非远程那边抹掉 `C` 和 `D`，否则是不能合并的。
因此，这时候，你应该使用 `git push origin master --force` 来强行覆盖远程记录。
请不要根据提示使用 `git pull`。否则，你的本地又会变成 `A -> B -> C -> D`。因为 `git pull` 相当于 `git fetch` + `git merge`
（以下内容基于上面的例子，远程是 `A -> B -> C -> D`，你想回滚到 B 那个状态）
另外对于 `git revert`。其实，`git reset --hard` 和 `git revert` 都可以实现“回滚代码”。但区别在于：
`git revert` 会把你的本地变成 `A -> B -> C -> D -> E`。其中，`E` 干的事儿是删除 `C` 和 `D`。这样做的好处在于，你 `git push origin master` 就不会有上面的报错了。但，历史线上还是会保留 `C` 和 `D` 这两个 commit。如果使用这个命令，记得要 `add` 然后 `commit`。
`git reset --hard` 会直接删掉 `C` 和 `D`，形成 `A -> B` 这样的结果。好处在于更直接更彻底。缺点在于，首先要通过 `git push origin master --force` 去强行更改。其次，一旦你后悔了，除非根据本地的 `reflog` 直接恢复 HEAD 指针，此外没有其他办法。
用哪个都是没错的，请根据自己的需要来选择。

标签: git, github
问题：输入一段不减的整数，如11111223333，怎么快速计算重复次数最多的那个数
输入
一段不减整数，如：11111223333
输出
出现次数最多的那个数字，如：本例中1的出现次数最多，输出1
输入的数字具有以下规律
1.数字为正整数，不一定从1开始
2.如果增长，则increment = 1
3.整数的总量不会超过1W，但是事先无法知道总共会输入多少整数

回答：这题不用对所有数字计数，那样很慢。
如果增长，则increment = 1
把数字当作字符串来处理，只要找出所有增长的点的位置就可以了，然后把相邻的点的位置相减，即可得到长度。
因为不一定是从1开始，所有可能的增长的点为："12"，"23"，"34"，。。。"78"，"89"
例如：
将11111223333转为字符串，查找增长点
结果：12-位置4，23-位置6
增长点补正（加1）：12-位置5，23-位置7
初始位置补0，末尾补字符串长度len,得到
[0,5,7,11]
取相邻两点之差
[5,2,4]
所以，出现次数最多的是第一个元素，5次
除此之外，还有不需要遍历的算法：
由于increment = 1，所以看开头和结尾2个数，即可算出出现数字有几种
（如11111223333，开头为1，结尾为3，则出现的数为1到3，共3种）
那么，考虑出现N种数的情况
N=1就不用说了，等于白送答案。
先从简单的N=2说起吧，因为有些细节在N=2的情况说了，后面N>2的情况类似的细节就省略了。
2分采样
若len为奇数，取len/2处的数，这个数就是出现次数最多的数。
若len为偶数，len/2处是间隙，所以取该间隙前后2个数，这2个数相同的话，答案就是这个数，如果不同的话，答案是这两个数出现次数一样，并列最多。
N分采样，取0、len/N、2len/N、...、（N-1）len/N、len处的（N+1）个点，（由于间隙的情况太复杂，这里省略，请参考N=2的处理方法）
然后统计这（N+1）个点里面，出现次数最多的数，把出现次数最多的数叫做M1，出现第二多的叫做M2，依次类推
若 （M1的次数 - M2次数） 大于等于2，则答案为M1
若 （M1的次数 - M2次数） 小于2，那么
2N分采样(若2N>len,则len分采样)，取len/2N、3len/2N、5len/2N、。。。。、处的N个点，与前面N分法时候取的（N+1）个点组合，重新求M1，M2，。。。。
若 （M1的次数 - M2次数） 大于等于2，则答案为M1
若 （M1的次数 - M2次数） 小于2，
则4N分采样(若4N>len,则len分采样)
。。。。依次类推，8N，16N。。。。
直至找到 （M1的次数 - M2次数） 大于等于2为止。其中若变为len分采样，结束条件不需要（M1的次数 - M2次数）大于等于2，M1就是答案。
#### 小结
这个算法大部分时候是比较快的，最差的情况是N个数的各个次数都相差很小，或者都相同，那就会进入最后的len分采样，等于遍历，那还不如一开始就直接遍历比较快。
但是数据的分布越是不均匀，这个算法就越快。
#### 杂谈
写完这个算法之后，我觉得有似曾相识的感觉，大家了解通信原理的有没有一样的感觉？  
如果把这段不减整数映射到频域，那么这就是递增阶梯的方波，问题就是确定其最长一段方波，如果这个方波太长，数据量太大，我们可以对其特征点采样来压缩数据，根据奈奎斯特采样定理（或者叫香农采样定理）：
当采样频率fs.max大于信号中最高频率fmax的2倍时(fs.max>2fmax)，采样之后的数字信号完整地保留了原始信号中的信息。
上文的2N分采样与此正好相似，是不是很有趣～

标签: 算法
问题：assets 和static的区别
使用 vue-cli 搭建的项目中有 assets 和 static 文件夹，一直不懂两者的区别，看到网上的说法太模糊，希望有位大神可以举例说明两者的区别。

回答：请参考 vue-cli 的 webpack 模板的文档 - Handing Static Assets，作者知道会有人有这个疑惑，所以作了详情的解释：
You will notice in the project structure we have two directories for static assets: `src/assets` and `static/`. What is the difference between them?
简单翻译一下。
## Webpacked Assets
为了回答这个问题，我们首先需要了解Webpack如何处理静态资产。在 `*.vue` 组件中，所有模板和CSS都会被 `vue-html-loader` 及 `css-loader` 解析，并查找资源URL。例如，在 `<img src="./logo.png">`
 和 `background: url(./logo.png)` 中，`"./logo.png"` 是相对的资源路径，将由Webpack解析为模块依赖。
因为 `logo.png` 不是 JavaScript，当被视为模块依赖时，需要使用 `url-loader` 和 `file-loader`
 处理它。vue-cli 的 webpack 脚手架已经配置了这些 loader，因此可以使用相对/模块路径。
由于这些资源可能在构建过程中被内联/复制/重命名，所以它们基本上是源代码的一部分。这就是为什么建议将
 Webpack 处理的静态资源放在 `/src` 目录中和其它源文件放一起的原因。事实上，甚至不必把它们全部放在 `/src/assets`：可以用`模块/组件`的组织方式来使用它们。例如，可以在每个放置组件的目录中存放静态资源。
## "Real" Static Assets
相比之下，`static/` 目录下的文件并不会被 Webpack 处理：它们会直接被复制到最终目录（默认是`dist/static`）下。必须使用绝对路径引用这些文件，这是通过在 `config.js` 文件中的 `build.assetsPublicPath` 和 `build.assetsSubDirectory` 连接来确定的。
任何放在 `static/` 中文件需要以绝对路径的形式引用：`/static/[filename]`。如果更改 `assetSubDirectory` 的值为 `assets`，那么路径需改为 `/assets/[filename]`。

标签: vue.js
问题：请问如何在html中输出字符串中的换行符
我在后台获取了一段字符串输出到前台的<p>标签中，但是字符串中有换行符'n'，我想同样输出换行的效果。请问应该如何处理这段字符串呢？我把'n'替换成了<br/>还是不行，原样输出了。
谢谢大家

回答：有两中方式，一是设置  `white-space: pre;`，空白会被浏览器保留。或者使用
```
<pre>
    我是换行字

    符串
</pre>

```
，pre 元素可定义预格式化的文本。被包围在 pre 元素中的文本通常会保留空格和换行符。

标签: html, javascript
问题：python 如何将字符串转换成列表
如何将字符串如`a = "我是中国人"`，转换成列表`li =["我","是","中","国","人"]`
```
a = "我是一个中国人"
li = list(a)
print li
```
输出却是
```
['\xe6', '\x88', '\x91', '\xe6', '\x98', '\xaf', '\xe4', '\xb8', '\x80', '\xe4', '\xb8', '\xaa', '\xe4', '\xb8', '\xad', '\xe5', '\x9b', '\xbd', '\xe4', '\xba', '\xba']
```
我用JavaScript很简单的就实现了
```
var a = "我是中国人"
li = a.split("")
console.log(li) // >>>["我","是","中","国","人"]
```
不知道python应该如何实现？

回答：可以先将字符串解编码成`unicode`, 再用`list`
```
# 第一种:
>>> a = u"我是中国人"
>>> s = list(a)
>>> print s
[u'\u6211', u'\u662f', u'\u4e2d', u'\u56fd', u'\u4eba']
>>> print s[1]
是

# 第二种
>>> a = "我是中国人"
>>> s = a.decode('utf8')
>>> s = list(a.decode('utf8'))
>>> s
[u'\u6211', u'\u662f', u'\u4e2d', u'\u56fd', u'\u4eba']
>>> print s[1]
是
```

标签: python
问题：为什么说promise不能取消是一个缺点
什么场景下我需要取消一个promise？
我不理解的地方：
http是无状态的，那取消是不是意味着新的请求？
还是说取消仅是本地取消，不处理之前请求的结果？

回答：Promise 的设计就是一个状态机，pending 到 resolve / reject 的状态变换是单向且唯一的，没有所谓的 cancel 状态。cancel 的加入会带来更多的状态问题，并不适合 Promise 这一模式来处理（这类场景下，RxJS 这类 FRP 的方案应该更为适合）。
cancel 会带来什么状态问题呢？拿电商的退款来举例子。你买了一个东西（开始一个 pending 的 promise），然后东西还没收到（还没 resolve），你后悔了，点击了退款（把状态改为 cancel），但这时退款流程也不能立刻生效，需要审核（cancel 后不能立刻 reject），那这时候你发工资了，又不想退款了，又点了【取消退款】，这时候又是一个异步的状态更改（把 cancel 再 cancel 掉），而【取消退款】也是异步的，你还能取消【取消退款】的操作（把 cancel 在 cancel 掉前再 cancel 掉？）别忘了，这时候每一步状态变化还都可以对应到 resolve 和 reject 呢。好的同学们，接下来请画出流程的状态变化图，并编码实现这个支持 cancel 的 promise?
这是一道送命题啊。

标签: ecmascript, javascript
问题：api 使用session替代token 的利弊在哪？
补充：几种常用的验证机制
 最近写app的api，使用laravel 框架的session替代了传统的存贮到数据库的token作为校验登录用户的方法！
以下是我们目前的做法
登录后后台生产session，会往返回信息head头里写一个set_cookie
ios和安卓 会从head头里得到拿到这个cookie的东西
然后再请求需要登录的地方的时候，ios和安卓会把cookie放到head头里，让框架完成自我的校验
ps:
有人说不安全
有人说不好管理
有人说性能问题
有谁具体研究过，请帮我分析分析其利弊
我个人认为的观点：
说session不安全的，感觉有点牵强，假如真的一点不安全的话，那网站也就完全被暴露了，而且laravel的session也是有自己加密的方式，不是直接暴露的！
有人说不好管理，放在redis里了，我不太知道不好管理在哪里。
性能问题，session可以存贮的位置有很多，mysql，文件，redis，我觉得性能也不是问题。我也不知其弊端在哪里，
有谁具体研究过，请帮我分析分析其利弊
也请大家有想法的各抒己见，我们一起讨论下

回答：在存储过等同的情况下，在只是简单运用上，我只能说session与token没有本质的区别，二者不都是一串被加密过的字符串，拿他来做校验都一样。
以上，是因为你把token拿来当作用户是不是当事人做这么一个简单的校验的情况下。
当然，如果我们抛开一些比较极端的操作，token比session也有很大的区别：
- token可以存在任何位置（cookie、local storage）
- token比session更容易跨域。
- CORS预检查时token比较更简单。
- token有更多的控制权，比如当token过期时，你可以拿通过刷新token，让用户一直保持有效登录。

token可以存在任何位置（cookie、local storage）
token比session更容易跨域。
CORS预检查时token比较更简单。
token有更多的控制权，比如当token过期时，你可以拿通过刷新token，让用户一直保持有效登录。
等……其实如果你只是单纯拿着token做一下自己网站内用户登录检验的话是无太多区别的。
但假如token指的是OAuth Token提供认证和授权这类机制的话，那么就可以把session甩开N条街了，甚至是已经完全是两种不同的概念。
假设有这么一个场景，你们用户在你们网站产生的订单，而另一家公司是专业ERP公司；而你的用户希望他的订单同时授权给这家ERP公司使用的情况下，难道你希望用户拿在你家网站的用户名和密码给这家ERP公司吗？
这时候OAuth Token就有意义了，OAuth Token的授权大概是这样的：
- ERP需要调用我们提供的登录界面。
- 用户输入用户名和密码后，我们再向ERP发送一个TOKEN。
- ERP拿TOKEN换数据。

ERP需要调用我们提供的登录界面。
用户输入用户名和密码后，我们再向ERP发送一个TOKEN。
ERP拿TOKEN换数据。
总之，如果你只是在自己网站内部上使用二者没有什么太多区别。而如果你的API是在不同终端上使用，token会更方便。

标签: linux, nginx, php, laravel, redis
问题：正则表达式如何匹配重复出现的字符串
比如说`aaabccc11fdsa`这个字符串，我要把aaa，ccc和11这种会重复两次以上的字符串匹配出来，该怎么办？如果正则表达式做不到的话，有其他什么PHP，Python内置函数可以做到吗？内置函数也没有的话只能手写算法了吗？

回答：JS代码：
```
var s = 'aaabccc11fdsa';
var re = /(.)\1+/g;

console.log(s.match(re));
```
其中，正则表达式中`.`表示任意字符，`\1`表示第一个被匹配到的分组，`+`表示匹配前一个字符一次或一次以上。

标签: php, java, javascript, python, c
问题：vuex 中的 store 和 $store  的区别
```
<router-link to="/login">{{ $store.state.userName }}</router-link>
<router-link to="/login">{{ store.state.userName }}</router-link>
<router-link to="/login">{{ this.store.state.userName }}</router-link>
<router-link to="/login">{{ this.$store.state.userName }}</router-link>
```
一直搞不清楚 vuex 中 `store` 和 `$store` 的区别，也不知道什么时候前面应该加`this`,求大神告知。
—— thanks in advance

回答：`$store` 是挂载在 Vue 实例上的（即Vue.prototype），而组件也其实是一个Vue实例，在组件中可使用 `this` 访问原型上的属性，template 拥有组件实例的上下文，可直接通过 `{{ $store.state.userName }}` 访问，等价于 script 中的 `this.$store.state.userName`。
至于 `{{ store.state.userName }}`，script 中的 `data` 需声明过 `store` 才可访问。

标签: vue.js, vuex, javascript