目录

  1. 前沿
  2. 准备工作
  3. 在路由器中设置 DDNS
  4. 配置端口转发
    1. 为什么要将 80 映射到 8000,而 ssh 却不用?
    2. 为什么我一切都配置好了,为啥还是不行?
  5. 配置 Gitlab 中的 external_url
  6. Over

前沿

我个人参加了一个外包项目,其中他们有一台 Dell 服务器,里面装有最新版本的 Gitlab,我的任务就是将这个 Gitlab 通过 DDNS 暴露到公网中去。

在这里,我记录一下其中遇到的一些问题。

准备工作

  • 花生壳帐号(有一个免费或者收费的域名)
  • 路由器(带有 DDNS 功能的路由器,我这里采用 小米路由器)
  • 一个域名
  • 一台刚刚安装完成并且成功启动的 Gitlab 服务器

至于如何申请花生壳,我就不在这里多说了,不过我要说一点,在花生壳里面,你注册的时候会给你一个免费的域名。这个域名有一个神奇的名字,叫过壳域名,我第一次没有意识到,这个就是免费域名,找了好久,也没有找到在哪里。😂

在路由器中设置 DDNS

进入路由器设置,寻找 DDNS 或者 动态域名解析,选择花生壳服务,填写相关的用户名和密码,以及送与的免费的域名地址。

链接测试,路由器显示链接成功,并且进入花生壳域名管理,查看域名解析的情况。

如果失败了,请查看是否免费的域名填写错误,或者密码用户名错误等等。

此时,如果你运行如下命令

1
ping your.deamon.com

会正常的 ping 到自己的主机。

配置端口转发

当解析成功的时候,仅仅说明域名可以正常的找到这台路由器,但是还不能找到路由器内部的主机。

所以我们需要将路由器的部分端口映射到内部的服务器的主机的端口,这就是端口转发

根据需要,将服务器的 80 映射到路由器的 8000。
因为 Gitlab 需要 ssh 服务端口,所以还需要将 20 端口映射到路由器上。

为什么要将 80 映射到 8000,而 ssh 却不用?

这是因为,我们的网络都是接入到外部运营商提供的网络,而运营商不允许用户私自搭建服务器(至于为啥,谁知道这群运营商怎么想的)。所以会封锁 80 端口。

这也就会产生一个很神奇的现象,如果你映射 80 端口,你在内网中,可以通过域名正常,但是你在外网,却不能访问。

为啥呢?根据 计算机网络 中所说的,获取目标 ip,之后,发现是局域网,于是就直接不走运营商了。。。。

弄完之后,就可以在地址中输入 http://your.domain.com:8000 访问 Gitlab 了。

为什么我一切都配置好了,为啥还是不行?

答案:请尝试关闭防火墙,或者将端口加入白名单。

PS: 因为服务器是 Centos 7, 所以采用了 firewall 的管理方式,而不是以前的 iptables,这一点需要注意。

配置 Gitlab 中的 external_url

在安装之后,你还需要配置 external_url 来在 repo 中正确显示url。

之所以没有从 host 中获取 URL ,是因为,很多情况下,git 仓库和前端管理是分离的,所以你需要自己去配置。

至于配置方式,详情请查看 Configuring the external URL for GitLab

然后按照教程 gitlab-ctl reconfigure 即可

Over

至此,在添加了 Gitlab 成员之后,我就可以洗洗睡了,晚安~~~

注释和共享

目录

  1. 纯函数
    1. 简介
    2. 定义
    3. 解释
  2. I/O 在纯函数中的例外
  3. 和纯函数相关的 —— 纯表达式
    1. 简介
  4. 用处
  5. 优点
  6. 参考文章

在学习 React/Redux 的时候,提到了纯函数,那么到底什么是纯函数呢?

纯函数

简介

纯函数,顾名思义就是很纯净的函数,不会背着你去干什么乱七八糟的事情。

简而言之,就是这个与外界交换数据的方式只有 参数值返回值

也就是说,所有的数据输入和输出都是显式的,都在你的可监控范围之下。

定义

首先纯函数要满足以下两个条件:

  1. 函数在给出相同的参数的时候,计算的值总是相同的。同时函数的结果并不依赖任何可能随着程序运行而改变的或者在不同程序中结果不同的隐藏的信息或者状态。也不能隐式依赖任何从 I/O 设备的输入。
  2. 这些计算结果不能引起任何副作用或者输出。例如改变可变对象,或者是输出到 I/O 设备。

计算结果不需要全部依赖输入的参数值。但是,绝对不能依赖除了参数值以外的东西。
函数可以返回多重结果(类似py里的元组),那么对于任意一个返回值,都需要满足上面的条件。(这个感觉显得有点多余)
如果其中的参数是被引用的,那么修改引用的参数将会导致外部变量修改,从而导致函数变得非纯。(这不是废话么)

解释

看上面的那几条,肯定会变得很糊涂,那么我稍微总结了以下内容:

  1. 最最基本的判定方法,就是看参数相同是否结果相同。不相同,是非纯函数。
  2. 在满足 1 的前提下,同时保证输入相同,并且这个函数不管在什么地方,是什么时候运行,结果都并不是完全相同。那么则为非纯函数。

    那么意味着函数内不得使用获取时间,获取进程ID,获取环境变量等等会根据时间环境而变化的内容。例如 Date.now() process.env Math.random()

  3. 换句话说,纯函数内不得使用非纯函数
  4. 纯函数不得与 I/O 产生任何交互,不得从 I/O 输入或者输出,甚至包括网络流。

    也就说不能读取输出文件,读取输出终端内容,不得请求API内容等等,前提,这些是隐式调用的,后文会讲到特例。

  5. 不得产生函数副作用,所谓函数副作用就是指当调用函数时,除了返回函数值之外,还对主调用函数产生附加的影响。例如修改全局变量(函数外的变量)或修改参数。

I/O 在纯函数中的例外

如果一个函数跟 I/O 产生交互,除非满足以下内容,才不会导致函数变的不纯:

这些 I/O 操作是显式通过函数参数或者返回值来传入和传出的,并且当输入内容不合法的时候,I/O 操作失败

其中第一点确保了 I/O 操作的函数返回不同值,是因为输入的内容不同。并且必须要作为函数的参数或者返回值。
第二点确保了当输入作为函数的参数的时候,必须根据不同的 I/O 动作而改变。也就是针对不同的输入有不同的反应。

说明一下,这里的第二点,其实是保证了函数的行为的可预测性,因为输入不同,可能其中包含着很多非法操作,而对于函数来说,面对这些非法操作,没有定义如何去处理,所以统一认为操作失败,这样就增加了行为的可预测性。

和纯函数相关的 —— 纯表达式

简介

类似一个纯函数,就是不论在什么时候,什么地点,执行了多少次纯表达式,结果都不变。

在这里,我就不详细介绍了,很明显的一点,一个常量肯定是纯表达式。

用处

讲了这么多,可是纯表达式在什么地方会使用到呢?

就我所知,大约有以下几个地方:

  • Redux 的 Reducer
  • Scala
  • wolfarm

优点

优点在不同的语言中有不同的用处,但是最重要的几点就是:

  • 简单,便于测试
  • 无状态,可以采用缓存的方式加速计算
  • 纯函数相互组合,还是纯函数(类似于高中所学的奇函数偶函数)

参考文章

注释和共享

My Blog of 0.1.0

发布在 Blog Event

目录

  1. 新增
  2. 更新
  3. 修复
  4. 遗留

经过长时间的进展,几乎没有写过什么博客,就这样迎来了 0.1.0 版本。

新增

  1. 友情链接
  2. 链接 hover 动画
  3. Changelog 页面,以后的所有的 Changelog 都在这个页面下展示

更新

  1. 更新主题(tranquilpeak)更新至 1.6.2
  2. 跟随潮流,使用《功夫熊猫3》海报背景
  3. 在列表页面,更新为全文显示,以前是只显示部分内容

修复

  1. disqus 无法通过 http 获取到对应的脚本,只能通过 https

遗留

  1. disqus 的 css 依旧受到上面问题的困扰

注释和共享

目录

  1. 主要更新
  2. 移除的方法
  3. 重命名的方法
  4. 分离出的方法
  5. 其他的小修改
  6. 总结

在 2016 年 1 月 12 日,Lo-Dash 迎来了半年来第一次大更新,也就是 4.0,这次更新了很多的内容,包括了不兼容更新方法分离函数重命名等等操作,下面我们来一一分析一下。
简单的翻译了一下官方的更新日志。

主要更新

  • 不再支持 Bower & Component,而是使用 npm,到发稿为止,已经无法在 bower 找到相关 Lo-Dash 的内容
  • 移除了对 IE6-8 的支持
  • 使用了 es5-shim 或者 es6-shim
  • 移除了大部分的 thisArg 参数
1
2
3
4
5
6
7
8
9
10
11
12
var objects = [{ 'a': 1 }, { 'a': 2 }];
var context = { 'b': 5 };

function callback(item) {
return item.a + this.b;
}

// in 3.10.1
_.map(objects, callback, context);

// in 4.0.0
_.map(objects, _.bind(callback, context));
  • node 中引用包的时候去除了类别的二级目录
1
2
3
4
5
// in 3.10.1
var chunk = require('lodash/array/chunk');

// in 4.0.0
var chunk = require('lodash/chunk');
  • 拆分出 _.max & _.min_.maxBy & _.minBy

  • 添加了足足 80 个方法

移除的方法

  • 移除了 _.support
  • 移除了 _.findWhere ,用 _.find 来替代(with iteratee shorthand)
  • 移除了 _.where ,用 _.filter 来替代(with iteratee shorthand)
  • 移除了 _.pluck ,用 _.map 来替代(with iteratee shorthand)

重命名的方法

  • 重命名 _.first_.head
  • 重命名 _.indexBy_.keyBy
  • 重命名 _.invoke_.invokeMap
  • 重命名 _.modArgs_.overArgs
  • 重命名 _.padLeft & _.padRight_.padStart & _.padEnd
  • 重命名 _.pairs_.为Pairs
  • 重命名 _.rest_.tail
  • 重命名 _.restParam_.rest
  • 重命名 _.sortByOrder_.orderBy
  • 重命名 _.trimLeft & _.trimRight_.trimStart & _.trimEnd
  • 重命名 _.trunc_.truncate

分离出的方法

也就是说从原来的方法中,将部分功能分离出来,成为一个新的方法。

  • 分离出 _.indexOf & _.lastIndexOf_.sortedIndexOf & _.sortedLastIndexOf
  • 分离出 _.max & _.min_.maxBy & _.minBy
  • 分离出 _.omit & _.pick_.omitBy & _.pickBy
  • 分离出 _.sample_.sampleSize
  • 分离出 _.sortedIndex_.sortedIndexBy
  • 分离出 _.sortedLastIndex_.sortedLastIndexBy
  • 分离出 _.uniq_.sortedUniq, _.sortedUniqBy, & _.uniqBy

其他的小修改

  • _.sortByAll 融合到了 _.sortBy
  • 改变这个类别 _.at“Object”
  • 改变这个类别 _.bindAll“Utility”
  • master 分支下,将 ./lodash.js 移动到 ./dist/lodash.js
  • npm 分支下,将 ./index.js 移动到 ./lodash.js
  • _.clone & _.flatten 函数的参数中删除了 isDeep 参数
  • _.bindAll 将不再支持绑定所有的函数,当没有名字传入的时候

总结

总之这次更新来的挺突然,感觉改动了好多东西,如果你的代码用了较多的话,暂时不建议去更新的。
更多内容呢详情请看官方 changelog

注释和共享

你有没有发现自己保存东西的时候、下载东西的时候弹出来的保存对话框没有以前的收藏(favorites)分类了。

这个时候,自己想点击一个下载或者文档都非常的麻烦。

一开始的时候,以为这只是个别的现象,就没有理会,随着时间的推移,才发现,这是一个普遍现象。开始寻找解决方案。

经过寻找,终于解决了这个问题:

解决方法如下:

  1. 进入 Libary -> Perference 文件夹,找打 com.apple.finder.plist 文件,删除之
  2. 然后重启 Finder 或者 系统

然后就可以惊奇的发现,这个问题已经修复了

注释和共享

  • 第 1 页 共 1 页

XGHeaven

一个弱弱的码农


杭州电子科技大学学生一枚


Weifang Shandong, China