GoCN每日新闻(2017-11-13)

回复

每日新闻astaxie 发起了问题 • 1 人关注 • 0 个回复 • 491 次浏览 • 2017-11-13 13:07 • 来自相关话题

北京与你科技招聘 Golang 中高级工程师,#年底了,是时候打算挪个窝了#

回复

招聘应聘blackbeans 发起了问题 • 1 人关注 • 0 个回复 • 258 次浏览 • 2017-11-13 11:55 • 来自相关话题

fx 简单介绍 [Go Hack 2017]

开源程序metrue 发表了文章 • 2 个评论 • 202 次浏览 • 2017-11-12 17:43 • 来自相关话题

fx 是我在 Go Hack的一个小作品,Go Hack 是一个以Go语言为主要编程语言的黑客马拉松比赛。虽然我和我队友两人都是写... 查看全部


fx 是我在 Go Hack的一个小作品,Go Hack 是一个以Go语言为主要编程语言的黑客马拉松比赛。虽然我和我队友两人都是写JavaScript的前端工程师, 以Golang 零基础参加这次比赛,不过很开心我们完成了fx,也喜欢上 Golang 这门语言.


前言


读了那么多年书,写了那么久的代码,如果说有什么概念是深入骨髓的,只能说是”函数“了。虽然在数学上和编程上,“函数”这个词有很大的不一样的,但是有一点上它们是类似:


接受输入(可能为空值),然后进行处理,最后输出处理结果。

我们几乎可以用这个概念来描述所有的行为. 比如我们可以用下面的函数的来描述我们 fx 的诞生过程:


函数 f = Go Hack (以 Golang 为项目编程语言的黑客马拉松活动)
输入 input = [两个Go语言零基础的JavaScript工程师,两台Macbook,很多很多的功能饮料]
fx = f(input)

fx 是什么


那么 fx 是什么呢,一句话来说就是 : fx 是一个可以把一个函数变成一个服务的工具. 一个简单的例子来说一下 fx 的功能吧. 比如你写好了很棒的函数 , 它是这样的:


func.js


module.exports = (input) => {
return parseInt(input.a, 10) + parseInt(input.b, 10)
}

它的作用就是计算两个数的和. 你把这个函数写在 func.js 这个文件里面。 这时候你希望可以将这个函数编程一个服务,对外提供一个 url 可以供外界访问. 但是想到 nginx, web server, api gateway…, 你头有点大了。 现在你可以简单的这样做。


fx up func.js

如果一切没有什么问题,你可以得到一个url.


$fx list
Function ID Service URL
743a9b0ee5 0.0.0.0:61098

访问你的服务试试看


$ curl -X POST 0.0.0.0:61098 -H "Content-Type: application/json" -d '{"a": 1, "b": 1}'

你会得到 2. 这说明你的函数已经变成了一个服务了。


fx 如何工作


                upload function definition
fx client -------------------------------> fx server
<-------------------------------
url of deployed service

fx 有两个部分组成,fx server 和 fx client . client 很简单,主要就是把 function 的定义内容通过 Websocket 发给 server 而已,而 server 是一个 Websocket sever,接受到 function 的内容了之后,匹配到正确的 Dockerfile 和对应的构建镜像所需的资源, 然后会调用 Docker Engine 的 api 去构建相应的服务,最后把生成的服务的 URL 返回给客户端.


fx 支持哪些编程语言


由于 fx 的一个服务的背后都是一个 Docker Container, 所以 fx 几乎可以支持所有的编程语言,由于精力有限,目前 fx 支持这些编程语言:



  • Golang

  • JavaScript/Node

  • Ruby

  • Python


Code


https://github.com/metrue/fx

GoCN每日新闻(2017-11-12)

回复

每日新闻astaxie 发起了问题 • 2 人关注 • 0 个回复 • 498 次浏览 • 2017-11-12 14:06 • 来自相关话题

GoCN每日新闻(2017-11-11)

每日新闻billgo 回复了问题 • 3 人关注 • 2 个回复 • 520 次浏览 • 2017-11-12 12:09 • 来自相关话题

RobotGo v0.46.6 发布, 大幅度优化 bitmap

回复

开源程序veni 发起了问题 • 1 人关注 • 0 个回复 • 261 次浏览 • 2017-11-10 21:53 • 来自相关话题

结合 Go 读 APUE-文件共享

文章分享zhaohu 发表了文章 • 0 个评论 • 167 次浏览 • 2017-11-10 21:26 • 来自相关话题

在公众号 "别捉急" 上 同步了文章,并且可以点击原文链接阅读:查看全部


在公众号 "别捉急" 上 同步了文章,并且可以点击原文链接阅读:传送门



文件共享


UNIX 系统支持在不同进程间共享打开文件, 知识点:内核用于所有 I/O 的数据结构、原子操作。


概念性的 I/O 数据结构


内核用于所有 I/O 的数据结构,只是个概念性的,不一定适用,有个大体的轮廓就 OK。



  • 进程表 (process table entry) 中的记录

  • 文件表项 (file table entry)

  • v节点表项 (v-node table entry)


打开文件的内核数据结构


这是一个 打开文件的内核数据结构 图。打开文件 这个操作是一个进程, 每个进程在进程表中都有一个记录,而 打开文件进程记录 中包含一张打开文件描述符表, 包括:



  • 文件描述符标志

  • 指向一个文件表项的指针


文件描述符表用 Go 抽象如下表示:


type fd struct {
flags int
pointer *FileTableEntry
}

代码中 flags 的类型是随便定义的(实际我没查),由图中看出 pointer 指向文件表项 (file table entry), 内核为所有打开文件维持一张文件表, 每个文件表项包括:



  • 文件状态标志 (读、写、添写、同步和非阻塞)

  • 当前文件偏移量

  • 指向该文件 v 节点表项的指针


文件表项用 Go 抽象如下表示:


type FileTableEntry struct {
status int
offset int
pointer *VNodeTableEntry
}

由图中看出 pointer 指向v节点表项 (v-node table entry), 每个打开文件都有一个 v 节点结构如下所示:



  • 文件类型和对此文件进行各种操作函数的指针,统称为 v节点信息

  • 该文件的 i 节点: 文件所有者、文件长度、指向文件实际数据块在磁盘上所在位置的指针等


V 节点表项和 i 节点用 Go 抽象如下:


type VNodeTableEntry struct {
information *Information
vData *INode
}

type INode struct {
owner *Owner
length int
vNodeTableEntry *VNodeTableEntry
}

通过这种方式,来加深对 内核通用 I/O 数据结构 的理解。


如果两个独立进程各自打开同一个文件,则三者关系如下所示:


两个独立进程打开同一个文件


原子操作


一般而言,原子操作 (atomic operation) 指的是由多步组成的一个操作。如果该操作原子地执行,则要么执行完所有步骤,要么一步也不执行,不可能只执行所有步骤的一个子集。


函数 dup 和 dup2


下面两个函数都可用来复制一个现有的文件描述符。


#include <unistd.h>

int dup(int fd);

int dup2(int fd, int fd2);

上面函数中的参数:



  • fd 表示要复制的文件描述符

  • fd2 表示复制后的文件描述符


dup2 函数是可以指定复制后的文件描述符,而 dup 是返回当前可用文件描述符中的最小数值。


调用 dup(1) 函数后,进程表项,文件表,v 节点表,之间的关系图如下:
dup(1) 后的内核数据结构


对于传入的参数 fd2, 已经被打开了,会先关闭。知道了这个点,就明白了,下面的操作中会先调用 close(fd2)


很不爽了,没找到相应的 Go 的源码。复制一个描述符的另一种方法是使用 fcntl函数, dup2(fd, fd2) 等效于 close(fd2)fcntl(fd, F_DUPFD, fd2), 但不完全等效,因为 dup2(fd, fd2) 是个原子操作。


目前我先知道 fcntl函数 可以改变已经打开文件的属性,就可以啦。

切图缩放后的图片左边有黑边???

回复

有问必答gary 发起了问题 • 1 人关注 • 0 个回复 • 129 次浏览 • 2017-11-10 16:31 • 来自相关话题

cgo 类型转换问题??

有问必答gary 回复了问题 • 2 人关注 • 8 个回复 • 413 次浏览 • 2017-11-10 16:30 • 来自相关话题

GoCN每日新闻(2017-11-10)

回复

每日新闻astaxie 发起了问题 • 1 人关注 • 0 个回复 • 414 次浏览 • 2017-11-10 12:16 • 来自相关话题

太颠覆我对golang的认知了,调试时明明有值,但打印出来就是零,要崩溃了

有问必答CodyGuo 回复了问题 • 6 人关注 • 8 个回复 • 603 次浏览 • 2017-11-10 11:18 • 来自相关话题

go的大文件内容比较

有问必答littledriver 回复了问题 • 4 人关注 • 4 个回复 • 371 次浏览 • 2017-11-10 08:12 • 来自相关话题

golang有什么好的纯web路由框架推荐吗?

有问必答ego008 回复了问题 • 7 人关注 • 6 个回复 • 1548 次浏览 • 2017-11-09 21:37 • 来自相关话题

不再傻傻分不清:atoi, itoa, iota

文章分享Xanthus 发表了文章 • 0 个评论 • 181 次浏览 • 2017-11-09 21:01 • 来自相关话题

atoi

Array to Integer 字符数组(字符串)转化为整数。golang标准库与C++标准库均有

itoa

Integer to Array 整数转化为字符串。golang标准库与C++标准... 查看全部

atoi


Array to Integer
字符数组(字符串)转化为整数。golang标准库与C++标准库均有


itoa


Integer to Array
整数转化为字符串。golang标准库与C++标准库均有


iota


希腊字母。golang中定义常量经常用的iota关键字,C艹中用于Store increasing sequence

emmmmm, 都是递增

GoCN每日新闻(2017-11-09)

回复

每日新闻astaxie 发起了问题 • 2 人关注 • 0 个回复 • 478 次浏览 • 2017-11-09 14:32 • 来自相关话题