求教c#中 这句话怎么理解啊 美在南海给中国划红线线的部分

C#调用C++的dll及MATLAB的dll的方法(一)
为了记录踩坑的过程,避免以后再踩坑,居然专门开通了这么专业的技术博客,正好督促自己以后好好研究技术。
最近需要做一个界面系统来包装一下之前做的人脸属性识别的模型,希望用户随机选取一张图像(后面会实现摄像头拍现场图像),系统自动给出该图像中所包含的人脸属性(有没有戴眼镜,有没有戴帽子之类的)。其中人脸属性预测之前需要进行人脸识别以及人脸对齐等操作,人脸属性识别是由C++写的,人脸对齐是由MATLAB写的,考虑到界面的友好性以及开发的难易性,最终选了C#作为开发语言。(不要问我为啥不用,因为我没装eclipse,没配Java环境,并且C++和C#都是用vs编译,俺个人觉得这样方便些,其实主要是受某位师兄鼓动。。。他说Java也不会比C#容易到哪去)。然后说说为什么要用C#调用C++的dll和MATLAB的dll,直接混编不行么。其实也行,就是更麻烦。。。代码易读性非常差,并且不好调试,相信我,我也试过,但最终放弃了。。。dll相对来说简易许多,虽然封装过程纠结了好几天,但是使用起来像是黑盒子,你只要按照给定的参数类型输入,就可以得到理想输出,一两句话搞定,也基本不需要配置环境啥的,如果有同学遇到和我类似的需求,可以考虑一下我的做法。
下面开始详细详细再详细的记录一下这几天走过的各种坑,希望在帮助自己记录的同时也能帮到一些人。
本机环境:win7 64位 + vs2013 + MATLAB2015
请大家看下面的调用过程之前一定看好你的本机环境是不是和我的一样,如果不一样,那我成功的方式你走一遍不一定成功。我当初Google的时候没一个博客或者资料和我的环境一样,所以都是摸着石头过河,慢慢瞎鼓捣吧,不要放弃,总能搞出来的O(&_&)O。
如何用C#调用C++的dll
我也是最近要做这个演示的demo才知道C++是非托管代码,如果C#(托管代码)要用C++的话,必须要将C++的代码包装一下成为托管代码,并编译为dll文件才可以被C#正常调用。这里贴上从百度里查到的资料:
托管代码 (managed code) :由公共语言运行库环境(而不是直接由操作)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。
非托管代码 (Unmanaged Code) :在公共语言运行库环境的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务;它与托管代码不同,后者从公共语言运行库中获得这些服务。非托管代码的英文名是Unmanaged Code ,它是在公共语言运行库环境的外部,由操作系统直接执行的代码。
好啦,现在具体讲一下怎么做:
假设我有一个人脸检测加5点定位的函数,希望可以在C#里使用这个函数。函数的输入是两个字符串,分别表示输入的人脸图像路径以及想要保存的5点定位路径(一个txt里面存着5点的坐标,用于后面人脸对齐)。首先,我们要把这函数包装成一个类里的成员函数,以便后面再次包装为托管类。我们称这个包装函数的类为native类,为了区别后面的托管类clr类。Native写好之后大概是长成这样的:
图片中的#pragma once是为了防止重复定义,后面的一些include文件你需要什么就写什么。这里有个地方需要注意,就是C#和C++的数据类型是不太一样的。C++里的string参数包装好之后在C#那里显示的并不是string,而是C#里的一种数据格式(忘记截图了,反正看起来还挺复杂的),所以并不推荐大家用string作为输入参数,用char*吧,这样在C#那里就会显示为你需要输入sbyte*的参数,这个类型的可以很容易将C#里的string转换过来,后面会有例子。
好了,有了h文件,根据需求实现一下cpp文件:
现在native类已经准备好了,可以进行托管类的包装了。为了实现托管类,我们需要在在项目属性那里设置一下,不然编译器识别不出来托管类的标志。
主要是改一下画红线的两处,这样生成解决方案后,不会像普通的项目一样生成一个exe文件,而是生成一个dll文件,也就是后面我们在C#里调用的dll文件。第二个画红线的地方可以帮助编译器知道我们要做一个托管类。这样设置好项目属性后,就可以写托管类了。(在这一步设置属性的时候,我发现一个特别奇怪的事情,就是有时我一把这个属性设置好保存之后,原来高亮提示的关键字全都没有高亮提示了,好像是编译器识别不出来了一样,这个我也不知道怎么回事,有时高亮消失,有时就不会。如果有人碰到和我一样的问题,我只能说,亲,你多试几次吧。。。逮着哪次高亮没消失就赶紧接着写,机不可失啊!其实貌似不提示高亮也不影响生成dll文件或者后续调用,不用没有高亮,写代码就木有提示啊!对或不对以及成员函数神马的您就都自己写吧。。。所以还是有提示比较好一点)。
好嘞,下面是最重要的写托管类啦!其实很简单哦!这一步在网上资料也比较多,如果我的不适合你的需求,你可以Google别人的呀!
这里的public可以让这个托管类在C#里被看见,ref表示这是一个托管类。Public成员函数里写上你想要的函数(名字最好不一样),然后private那里一定要有一个native类的对象,这样才可以通过托管类调用非托管类的函数呀!千万别忘了!
然后,实现一下cpp文件:
两处划红线的地方很重要,第一个红线表明在托管类的构造函数里实例化一个native类的对象,一定要实例化,不然后面用不了。第二个红线表明在托管类的函数里调用非托管类的函数。
如此一来,就可以点击&生成解决方案&来生成一个dll啦。比如我的配置管理器里写的是release, x64,那生成的dll文件就在工程目录下的x64目录下的release目录下。
这里画红线的与你工程名字相同的dll就是你后面在C#里需要用到的dll啦!如果你的C++项目还会额外用到什么dll,lib之类的,在后面C#使用时也要一起拷贝过去,不然后提示dll依赖缺失之类的问题。
好啦!准备好dll,我们就可以转眼去看看C#如何使用这个dll。
首先,你要把刚刚生成好的dll以及这个dll依赖的其他dll一起拷贝到C#的工程目录下。比如我的C#配置管理器里选的是release,Any Cpu,那应该是把这些dll一起拷贝到工程目录下的bin目录下的release目录下。像这样:
当然,我所说的C++的dll所依赖的dll不是指的那些opencv配置环境时的dll,而是你在函数里需要用到的外部dll,比如我的函数用了人脸识别dll。像是配置opencv添加在项目附加文件那里的dll以及opencv的头文件好的,都会随着你生成dll后一起包装起来,所以是不是很神奇!是不是很省事!如果你连外部的dll都没用到,那你直接把C++生成的dll拷贝过去就可以直接用啦!
除了把dll拷贝到上面说的C#的文件夹里,还要将其放到C#当前工程目录下,然后在C#项目的引用那里选中这个dll将其引用到C#项目里就可以使用啦!
接下来说说怎么在C#代码里使用C++的dll。像我这边需要给C++的函数传string的参数(当然,为了方便数据类型的转换,我把C++函数里的string换位了char*,前面已经提到了),然后我需要把两种语言的数据类型统一起来,C++的char*对应的是C#里的sbyte*,因此我先讲C#里的string转为sbyte*,像这样:
在这里,如果想使用Marshal,C#编译器会提示你这是一段不安全的代码,如何避免错误提示呢,我们需要在这段代码的外面加上unsafe标志,告诉编译器我们知道不安全但我们就是要用!
如果此时它还提示你不安全,那么就可以到项目属性那里设置一下:
在项目属性的&生成&那里会有&允许不安全代码&的选项,勾上就可以啦!另外,换红线的地方,提示一下各位童鞋。如果你的C++的dll编译生成的时候是选的x64配置环境,那么在这里一定一定要把&首选32位&这个选项去掉,不然运行C#就会报错。好了,下面讲一下如何调用。
简单吧!只有三行,第一行创建一个C++的dll封装的托管类的对象(你托管类叫啥这里就写啥,不是非托管类的名字哦),然后第二行就是调用函数,第三行就是把sbyte*再转会string。(不过int参数好像可以直接传,不需要改类型,其他类型的参数我就不清楚了)。
至此,C#调用C++的dll就大功告成啦!!!鼓掌!!!虽说现在说起来好像不难,但是自己也是鼓捣了两天,碰到各种问题,踩了各种坑才成功,如果大家按照我的方法没成功,一是可能环境和我不一样,二嘛,可能是你人品不好,哈哈,开玩笑。网上的资料千千万,不一定会有你需要的,参考着来吧,自己慢慢试慢慢研究总会搞出来的。
本来想一篇写好C++和MATLAB的调用。不过由于废话多,篇幅过长,MATLAB的调用放到下一篇讲。
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'C# WPF向面板中添加子控件出错如何解决?_百度知道
C# WPF向面板中添加子控件出错如何解决?
jpg" esrc="http://e://e.com/zhidao/pic/item/d043ad4bd28eaac0f4bfbfbed044c.baidu.hiphotos;使用Visual C# 2010 Express划红线的都是同一个错误://e.hiphotos.jpg" target="_blank" title="点击查看大图" class="ikqb_img_alink"><img class="ikqb_img" src="http,请问怎么解决.baidu?<a href="/zhidao/wh%3D600%2C800/sign=fa0ec7f926c0b16a775d6/d043ad4bd28eaac0f4bfbfbed044c./zhidao/wh%3D450%2C600/sign=257e54d251ee3d6d22938fcf3ad4bd28eaac0f4bfbfbed044c零基础自学C#
NET-&gt,确定。VisualC# 菜单栏-&添加引用-&;选择PresentationCore我知道了。自问自答吧;项目-&gt
提问者采纳
Children改成Controls
提问者评价
来自团队:
其他类似问题
为您推荐:
wpf的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁(点击上方公号,可快速关注)网络服务器通常使用一个独立的进程或线程来实现每个连接。由于高性能应用程序需要同时处理大量的客户端,这种方法就不太好用了,因为资源占用和上下文切换时间等因素影响了同时处理大量客户端的能力。另一种方法是在一个线程中使用非阻塞 I/O,以及一些就绪通知方法,即当你可以在一个套接字上读写更多数据的时候告诉你。本文介绍了 Linux 的 epoll(7) 机制,它是 Linux 最好的就绪通知机制。我们用 C 语言编写了示例代码,实现了一个完整的 TCP 服务器。 我假设您有一定 C 语言编程经验,知道如何在 Linux 上编译和运行程序,并且可以阅读手册查看各种需要的 C 函数。epoll 是在 Linux 2.6 中引入的,在其他类 UNIX 操作系统上不可用。它提供了一个类似于 select(2) 和 poll(2) 函数的功能:select(2) 一次可以监测 FD_SETSIZE数量大小的描述符,FD_SETSIZE 通常是一个在 libc 编译时指定的小数字。poll(2) 一次可以监测的描述符数量并没有限制,但撇开其它因素,我们每次都不得不检查就绪通知,线性扫描所有通过描述符,这样时间复杂度为 O(n)而且很慢。epoll 没有这些固定限制,也不执行任何线性扫描。因此它可以更高效地执行和处理大量事件。一个 epoll 实例可由 epoll_create(2) 或 epoll_create1(2) (它们采用不同的参数)创建,它们的返回值是一个 epoll 实例。epoll_ctl(2) 用来添加或删除监听 epoll 实例的描述符。epoll_wait(2) 用来等待被监听的描述符事件,一直阻塞到事件可用。更多信息请参见相关手册。当描述符被添加到 epoll 实例时,有两种模式:电平触发和边缘触发(译者注:借鉴电路里面的概念)。当你使用电平触发模式,并且数据可以被读取,epoll_wait(2) 函数总是会返回就绪事件。如果你还没有读完数据,并且再次在 epoll 实例上调用 epoll_wait(2) 函数监听这个描述符,由于还有数据可读,那么它会再次返回这个事件。在边缘触发模式下,你只会得到一次就绪通知。如果你没有将数据全部读走,并且再次在 epoll 实例上调用 epoll_wait(2) 函数监听这个描述符,它就会阻塞,因为就绪事件已经发送过了。传递到 epoll_ctl(2) 的 epoll 事件结构体如下。对每一个被监听的描述符,你可以关联到一个整数或者一个用户数据的指针。typedef union epoll_data{
__uint32_t
__uint64_t
u64;} epoll_data_t; struct epoll_event{
__uint32_ /* Epoll events */
epoll_data_
/* User data variable */};现在我们开始写代码。我们将实现一个小的 TCP 服务器,将发送到这个套接字的所有数据打印到标准输出上。首先编写一个 create_and_bind() 函数,用来创建和绑定 TCP 套接字:static intcreate_and_bind (char *port){
struct addrinfo *result, *
memset (&hints, 0, sizeof (struct addrinfo));
hints.ai_family = AF_UNSPEC;
/* Return IPv4 and IPv6 choices */
hints.ai_socktype = SOCK_STREAM; /* We want a TCP socket */
hints.ai_flags = AI_PASSIVE;
/* All interfaces */
s = getaddrinfo (NULL, port, &hints, &result);
if (s != 0)
fprintf (stderr, &getaddrinfo: %sn&, gai_strerror (s));
return -1;
for (rp = rp != NULL; rp = rp-&ai_next)
sfd = socket (rp-&ai_family, rp-&ai_socktype, rp-&ai_protocol);
if (sfd == -1)
s = bind (sfd, rp-&ai_addr, rp-&ai_addrlen);
if (s == 0)
/* We managed to bind successfully! */
close (sfd);
if (rp == NULL)
fprintf (stderr, &Could not bindn&);
return -1;
freeaddrinfo (result); }create_and_bind() 包含一个标准代码块,用一种可移植的方式来获得 IPv4 和 IPv6 套接字。它接受一个 port 字符串参数,可由 argv[1] 传递。getaddrinfo(3) 函数返回一堆 addrinfo 结构体到 result 变量中,它们与传入的 hints参数是兼容的。addrinfo结构体像这样:struct addrinfo{
struct sockaddr *ai_
struct addrinfo *ai_};我们依次遍历这些结构体并用它们创建套接字,直到可以创建并绑定一个套接字。如果成功了,create_and_bind() 返回这个套接字描述符。如果失败则返回 -1。下面我们编写一个函数,用于将套接字设置为非阻塞状态。make_socket_non_blocking() 为传入的 sfd 参数设置 O_NONBLOCK 标志:static intmake_socket_non_blocking (int sfd){
int flags,
flags = fcntl (sfd, F_GETFL, 0);
if (flags == -1)
perror (&fcntl&);
return -1;
flags |= O_NONBLOCK;
s = fcntl (sfd, F_SETFL, flags);
if (s == -1)
perror (&fcntl&);
return -1;
return 0;}现在说说 main() 函数吧,它里面包含了这个程序的事件循环。这是主要代码:#define MAXEVENTS 64 intmain (int argc, char *argv[]){
struct epoll_
struct epoll_event *
if (argc != 2)
fprintf (stderr, &Usage: %s [port]n&, argv[0]);
exit (EXIT_FAILURE);
sfd = create_and_bind (argv[1]);
if (sfd == -1)
s = make_socket_non_blocking (sfd);
if (s == -1)
s = listen (sfd, SOMAXCONN);
if (s == -1)
perror (&listen&);
efd = epoll_create1 (0);
if (efd == -1)
perror (&epoll_create&);
event.data.fd =
event.events = EPOLLIN | EPOLLET;
s = epoll_ctl (efd, EPOLL_CTL_ADD, sfd, &event);
if (s == -1)
perror (&epoll_ctl&);
/* Buffer where events are returned */
events = calloc (MAXEVENTS, sizeof event);
/* The event loop */
n = epoll_wait (efd, events, MAXEVENTS, -1);
for (i = 0; i & i++)
if ((events[i].events & EPOLLERR) ||
(events[i].events & EPOLLHUP) ||
(!(events[i].events & EPOLLIN)))
/* An error has occured on this fd, or the socket is not
ready for reading (why were we notified then?) */
fprintf (stderr, &epoll errorn&);
close (events[i].data.fd);
else if (sfd == events[i].data.fd)
/* We have a notification on the listening socket, which
means one or more incoming connections. */
struct sockaddr in_
socklen_t in_
char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
in_len = sizeof in_
infd = accept (sfd, &in_addr, &in_len);
if (infd == -1)
if ((errno == EAGAIN) ||
(errno == EWOULDBLOCK))
/* We have processed all incoming
connections. */
perror (&accept&);
s = getnameinfo (&in_addr, in_len,
hbuf, sizeof hbuf,
sbuf, sizeof sbuf,
NI_NUMERICHOST | NI_NUMERICSERV);
if (s == 0)
printf(&Accepted connection on descriptor %d &
&(host=%s, port=%s)n&, infd, hbuf, sbuf);
/* Make the incoming socket non-blocking and add it to the
list of fds to monitor. */
s = make_socket_non_blocking (infd);
if (s == -1)
event.data.fd =
event.events = EPOLLIN | EPOLLET;
s = epoll_ctl (efd, EPOLL_CTL_ADD, infd, &event);
if (s == -1)
perror (&epoll_ctl&);
/* We have data on the fd waiting to be read. Read and
display it. We must read whatever data is available
completely, as we are running in edge-triggered mode
and won&#39;t get a notification again for the same
int done = 0;
char buf[512];
count = read (events[i].data.fd, buf, sizeof buf);
if (count == -1)
/* If errno == EAGAIN, that means we have read all
data. So go back to the main loop. */
if (errno != EAGAIN)
perror (&read&);
else if (count == 0)
/* End of file. The remote has closed the
connection. */
/* Write the buffer to standard output */
s = write (1, buf, count);
if (s == -1)
perror (&write&);
printf (&Closed connection on descriptor %dn&,
events[i].data.fd);
/* Closing the descriptor will make epoll remove it
from the set of descriptors which are monitored. */
close (events[i].data.fd);
free (events);
close (sfd);
return EXIT_SUCCESS;}main() 首先调用 create_and_bind() 新建套接字。然后把套接字设置非阻塞模式,再调用listen(2)。接下来它创建一个 epoll 实例 efd,添加监听套接字 sfd ,用电平触发模式来监听输入事件。外层的 while 循环是主要事件循环。它调用epoll_wait(2),线程保持阻塞以等待事件到来。当事件就绪,epoll_wait(2) 用 events 参数返回事件,这个参数是一群 epoll_event 结构体。当我们添加新的监听输入连接以及删除终止的现有连接时,efd 这个 epoll 实例在事件循环中不断更新。当事件是可用的,它们可以有三种类型:错误:当一个错误连接出现,或事件不是一个可以读取数据的通知,我们只要简单地关闭相关的描述符。关闭描述符会自动地移除 efd 这个 epoll 实例的监听列表。新连接:当监听描述符 sfd 是可读状态,这表明一个或多个连接已经到达。当有一个新连接, accept(2) 接受这个连接,打印一条相应的消息,把这个到来的套接字设置为非阻塞状态,并将其添加到 efd 这个 epoll 实例的监听列表。客户端数据:当任何一个客户端描述符的数据可读时,我们在内部 while 循环中用 read(2) 以 512 字节大小读取数据。这是因为当前我们必须读走所有可读的数据,当监听描述符是边缘触发模式下,我们不会再得到事件。被读取的数据使用 write(2) 被写入标准输出(fd=1)。如果 read(2) 返回 0,这表示 EOF 并且我们可以关闭这个客户端的连接。如果返回 -1,errno 被设置为 EAGAIN,这表示这个事件的所有数据被读走,我们可以返回主循环。就是这样。它在一个循环中运行,在监听列表中添加和删除描述符。下载 epoll-example.c 代码。更新1:电平和边缘触发的定义被颠倒错误了(虽然代码是正确的)。这是被Reddit用户 bodski 发现的。文章现在正确了。我应该在发布前校对的。对不起,并感谢谢指出错误。:)更新2:代码被修改成连接将被阻塞时才执行accept(2),所以如果多个连接到达,我们全部接受。这是Reddit用户 pitchford 提出。谢谢你的评论。 :)【今日微信公号推荐↓】微信号:LinuxHub长按上图,弹出“识别二维码”后关注「Linux爱好者」专注分享 Linux/Unix 相关内容,包括:工具资源、使用技巧、课程、书籍等。在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线博客团队正试图以我们微薄的力量,把优秀的原创/译文分享给读者,为“快餐”添加一些“营养”元素。微信号: jobbole(长按上图,弹出「识别二维码」后可快速关注)--------------------------------------商务合作QQ:投稿网址:伯乐在线(jobbole) 
 文章为作者独立观点,不代表微头条立场
的最新文章
很多程序员在写代码的时候往往都不注意代码的可读性,让别人在阅读代码时花费更多的时间。其实,只要程序员在写代码的时候,注意为代码加注释,并以合理的格式为代码加注释,这样就方便别人查看代码,也方便自己以后查看了。编程虽是复杂活,但成就优秀程序员的很多因素和我们在学校中最早学到的相差无几我在微博上收到过一个女孩子的咨询,她刚工作没几年,是一家外企外包公司的程序员,工作环境轻松,分配的任务简单,每天做完事情后有大把的时间。但是她的工资不高,当前也没有太多晋升的机会。作为一个经验丰富的程序员,有哪些事情是你希望在一开始编程的时候就知道的?或者换个方式来说,你认为每个新手程序员应该做或者学什么才能让自己的编程水平更好?有位网友看过 Raman 的故事后,在 Quora 上问「有视觉障碍的程序员是怎样编程的?」伯乐在线摘译了 3 位网友的分享,其中 2 位就是盲人程序员。10 种极品求职者的漫画版。虽然有些夸张,但均来源于现实事例。每一种都能引起HR和求职者的思考毕业快满三年了,由于种种原因想换一份互联网行业的工作。总共面完 8 家收了 7 个 offer,应该算是比较成功的吧现在找工作也基本收尾了,来聊一聊我所遇到的一些面试经历。这是我的第二份面试经验,希望会给你们带来帮助为什么在程序员的照片、博客中,喵星人出镜率为什么这么高?你有没有在养一只猫呢昨天我做了一些事情使我的编程效率提高了一倍。简单容易,使我的生活发生了巨大的变化。2014年8月我们发布了一则招聘开发者的广告,并同时附上了在线编程测试的链接。应聘者得通过测试之后,我们才会和他们进行视频面试。我大儿子如今已经七岁多了。如果可以用玩两个小时《我的世界》的时间来交换家人,他会马上行动。他在生活中还喜欢玩《超级马里奥制作大师》,看到他玩这个游戏我也非常兴奋,因为我像他这么大时,也玩相同的游戏,水平都一样。这几乎是不可避免的事情:我在互联网上与 Minecraft 不期而遇,是很容易发生的事情,因为有太多关于 Minecraft 的报道和传言 - 我最终确信,我可能在这件事情上犯了一个错误。Facebook COO 谢丽尔·桑德伯格在加州伯克利大学 2016 年毕业典礼上的演讲。有人曾从我工作的一家公司盗取了 9 千万美元。我不太懂得如何观人识人。这家公司最终关门了。有一些事情我就是学不会。我很容易相信一个人。因此,无论我如何尝试,判断一个人对我来说,简直太难了。所以,我寻找擅长做这件事的人,我让他们给我提供帮助。几年前,我在埃及学了两周的风筝冲浪。那段时间,我正好处于白手创业的初始阶段,压力很大。但有位朋友设法说服了我。我从这次学习之旅获得了一项有趣发现,极大加速了我的学习过程。现在,每当我需要学习新东西时,我都会采用这项学习技巧。作者Nicolas Bize是一名技术面试官,他为我们介绍了他是如何跨越艰难险阻,在经历数次失败后,探索出一条“能真正发现编程人才”的面试方式。搞IT有很多好处——但是审时度势一下,你也许会考虑别的职业选择。Jack Wallen 阐述了哪些影响因素会成为压垮某些IT人士的最后一根稻草。有谁起码有那么一两次快想不干了的?这里的沟通是指与人的沟通,而不是 socket 编程。有时你的确会遇上棘手的技术问题,但是这种情况根本不常见。常见的问题在于那些你和项目经理之间的、你和客户之间的、还有你和其他开发者之间的误解Stack Overflow 2015 年开发者调查:有对开发者地理分布,技术喜好,职位分类的常规统计;也有对开发者男女比例,收入情况,工作满意度等社会化因素的统计;甚至还有对文本编辑器选择,IDE的主题…… 程序员必读!本文从更深层次的视角看待我的生活、以及塑造我当前职业生涯和选择的转折点。如果你不介意,本文更像是自传。如果你感到不可思议,请把你的手交给我,让我们盲人为视力正常的人指路。到年底,Freckle Time Tracking 就5岁了。这5年里,作为创始人之一,我学到了很多事情,但最重要的却是下面这几条。希望它也能给你在你的产品涅磐道路上带来帮助。对于缺乏编程知识的人来说,完全有可能编写一个网页或小程序。如果在用Google搜索相关示例时幸运的话,可以搜到现成的代码。即使是经验丰富的程序员,通常也会为了节省时间和精力而在网上搜索解决方案。本文是对如何制定团队沟通协作的方法的一些思考,适用的团队大概应该在10-30人左右,最好focus在一个产品上,和业务团队有一定地理或者部门距离,不能完全坐在一起工作。原文作者Jenkov是一位丹麦资深开发人员,从事软件开发已有十多年。常有读者咨询他,“怎么才能成为一位专家级的开发人员?”所以他在下文中给出了相关建议。另外,他也提醒到,这些建议因人而异、因所用技术而异,并非适合所有人。(3)View在ASP.NET MVC中提供了aspx与Razor等模板引擎,这里我偷了懒,直接借助了NVe对于一些没有编程经验的人来说,一开始就学习web开发会让人觉得非常困难。因为你的能力处于初始阶段(你根本不知道你缺少哪方面的知识),所以在你能够建立一个任意复杂的网站之前,你可能会认为你需要大概几个月的时间来夯实计算机方面的基础知识。刚进公司时,在你正式动手写代码前,很可能要理解code base。这一过程至少持续1个月,取决于你所在项目的规模。你会发现你不得不使用你浑身所学之能事,理解上古程序员是如何解决一个个实际的问题的。(点击上方公号,可快速关注)覆盖使用Python进行数据挖掘查找和描述数据结构模式的实践工具。第一节介绍数据我在11年前认识了的我丈夫。当时是南缅因州大学新生入校的日子,我带着吉他去宿舍。他饶有兴趣的盯着我的吉他。之后他敲响了我的房门,自我介绍道:“嗨,我叫Adam,我就住在走廊的对面。我是个计算机程序员!”(点击上方蓝字,可快速关注我们)英文出处:本文由 伯乐在线 -(点击上方蓝字,可快速关注我们)来源:Jeff Atwood 译文:伯乐在线 - 豆巴陆其明链接:http: 头条Systemd 是 Linux 系统工具,
用来启动守护进程,已成为大多数发行版的标准配置。(点击上方公号,可快速关注)出处:Solidot - AnkhMorpork网址:http://www.so(点击上方蓝字,可快速关注我们)来源:Jean Hsu译文:伯乐在线 - 高志翔链接:http://blog工作于压力之下,感觉就像始终被批评家们的准星瞄准着,动弹不得。不幸的是,你压根没法看到这些狙击手在哪里,他们隐藏自己的技巧十分巧妙 – 实际上他们就在你自己的头脑当中。本次分享主题:电商网站架构案例。从电商网站的需求,到单机架构,逐步演变为常用的,可供参考的分布式架构的原型。除具备功能需求外,还具备一定的高性能,高可用,可伸缩,可扩展等非功能质量需求(架构目标)。最近,深度学习成为一个流行语。有分析人士称,它会吞噬掉目前已知的其他机器学习(ML)方法。其他人则将深度学习的市场形容为一个金矿,称该技术有望取代整个行业和应用的大量人力干预。(点击上方公众号,可快速关注)来源:Hollie Kay译文:伯乐在线 - sinofalcon链接:ht(点击上方公众号,可快速关注)来源:Quora译文:伯乐在线 - Eric.M.Y.H链接:http://本文的主旨是使用 .NET/C# 实现 TCP 高性能服务的不同方式我每天都会到 Reddit Programming 和 Hacker News 网站上看看,因为那儿每天都有很多新鲜有趣的内容。
我以编程为生,不能孤注一掷地把时间都用在学习新技术上。因为我无法全都学会,甚至会忘了曾经看过很酷的技术名字。随着移动互联网时代的大潮,越来越多的App不光是需要和网络服务器进行数据传输和交互,也需要和其他 App 进行数据传递。承担App与网络来进行传输和存储数据的一般是XML或者JSON。在移动互联网时代,XML和JSON很重要。右值引用的概念有些读者可能会感到陌生,其实他和C++98/03中的左值引用有些类似,例如,c++98/03中的左值引用是这样的:int i = 0;int& j =你可以从你们现在项目里面随便找几处注释,看看写注释的代码是不是存在如下两种毛病之一:1. 命名不准确;2. 方法太长(超过50行)。
如果你找到的代码,没有出现上面两种毛病而注释依然存在,那你再看看这个注释是否有实际意义。如果你是创业者,渴望高速成长,你面前是一片红海,放眼全球市场,蓝海才是出路!你缺钱、永远没有足够的时间、你的同一个人申请了两个职位,软件工程师和副总。他本人技能更倾向于资深软件工程师,但在面试工程师时,他却因为“只得了90分”而失败,面试副总时,却因为他的工程师技能全都可以加分而成功。个中道理,可以去看文章,也可以自己体会。这份清单,既是一份有助于对这些题目做深入研究的快速指南和参考,也算是计算机科学课程中不能忘记的基础知识总结。本文中我们将使用另外一个工具来实现纯前端站点的部署。其中包括:①持续集成(单元测试,集成测试等)、②持续部署/持续交付、③静态站点托管
除此之外,还会涉及到:①自动化UI测试site_prism、②静态站点的发布脚本、③aws的命令行工具jobbole关注职业资讯;学习各类职业感悟、心得和经验分享,扩大职业视野;体会求职、工作和创业的历程 - 就在 伯乐在线热门文章最新文章jobbole关注职业资讯;学习各类职业感悟、心得和经验分享,扩大职业视野;体会求职、工作和创业的历程 - 就在 伯乐在线

我要回帖

更多关于 生态红线划定 的文章

 

随机推荐