博文

目前显示的是标签为“编程”的博文

Wav文件格式解析

参考资料: https://en.wikipedia.org/wiki/WAV http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html http://www.lightlink.com/tjweber/StripWav/Canon.html Wav是RIFF的一种音频格式,所以 开始的4个字节一定是RIFF这4个char 接下来4个字节是接下来的文件的总长度,加上之前的RIFF占了8字节,所以文件目测总长度应该是这个字节的数值+8,在Wav中所有的数值类的值都是int,字节序为little endian 接下来4个字节是WAVE这个4个Char 接下来4个字节是fmt 这 4 个Char,是的,是4个,后面有个空格别漏了         但是,也有例外,如果这个地方出现的不是fmt 这个字符串,那么可能还会有别的信息继续被放在了文件头,但是它一定是如下的格式:         4个字节的信息头名称,我这里见过的有(JUNK和FAKE)         4个字节的附加信息头长度(int)         对应长度的chunk信息         在这之后一定还会出现fmt 这4个char的组合,即回到正轨 接下来4个字节是整个Wave文件 fmt头的长度 , 类型是int,可选择的是16、18或者40 接下来4个字节是WAVE文件的编码方式,类型是int,一般来说是1、3、6、7或者65534,1代表PCM,3代表IEEE浮点,6代表8-bit ITU-T G.711 A-law,8代表8-bit ITU-T G.711 μ-law,65534代表在后面的subFormat中定义,除了1之外,后面的都没有见过实例,也无法得知它的实际是个什么样子了,PCM也是用得最多的 接下来2个字节是音频的声道数量,类型是short,1=单声道,2=stereo=立体声,其他多声道的可能也...

解决自建docker registry客户端无法push的问题

按照官方推荐的方式,下载了registry的镜像,结果在另外一台电脑上镜像死活也推送不上去,持续报告这个错误: [root@localhost network-scripts]# docker push 192.168.120.129:5000/test The push refers to a repository [192.168.120.129:5000/test] (len: 1) unable to ping registry endpoint https://192.168.120.129:5000/v0/ v2 ping attempt failed with error: Get https://192.168.120.129:5000/v2/: dial tcp 192.168.120.129:5000: connection refused v1 ping attempt failed with error: Get https://192.168.120.129:5000/v1/_ping: dial tcp 192.168.120.129:5000: connection refused 其实就是docker尝试去使用https来增强安全性,但是我组建的docker registry是纯内网使用的,这种莫名其妙的增强安全性纯属浪费性能,所以直接禁用就好 直接禁用的办法也很简单,编辑/etc/sysconfig/docker,修改 OPTIONS='--selinux-enabled' 改为(后面的IP是你的registry所在的地址与端口) OPTIONS='--selinux-enabled --insecure-registry 192.168.120.129:5000' 当然,你也可以使用更为纯粹的方法,自己颁发证书或者是使用购买了的证书……方法见这里:https://docs.docker.com/registry/insecure/

SlikSVN安装小记

之前的个人项目开发因为总是觉得项目量并不是很大,所以很大程度上无视了版本控制的存在。 毕竟就我一个人,怎么改都无所谓的。 但是在开发过程中还是出现了项目文件丢失、想要恢复到之前的版本却找不到备份等种种问题。 看来就算是一个人单干也还是需要版本控制配合啊。 于是想到了用SVN,至于为什么要选他,自然是因为PHP官方团队管理PHP的源代码也是用了SVN了…… 到SVN的官方玩站  http://subversion.apache.org/ 然后我选择了SlikSVN,因为似乎只有它提供了64bit的版本。官方网站: http://www.sliksvn.com/en/download 然后很正常的下载安装,安装过程中选择自定义安装,然后记得把Server端装上去,否则它默认就给安装一个客户端。 默不吭声的它就安装完了。可以说完全就是一个RAR打包之后也是同样的效果。自己到安装目录下找到/bin/svnadmin.exe,到CMD下运行它。 代码类似这个 c:\Program Files\SlikSvn\bin>svnadmin create D:\dev\popgo 意思就是建立一个工作区了,我的工作区在D盘下 然后该目录下就出现了一大堆生成的文件了,首先是编辑conf目录下的svnserve.conf了 里面所有的项目都是被注释掉的,消除以下行的注释 anon-access = none auth-access = write password-db = passwd authz-db = authz realm = My First Repository 这几项都没啥难度,指定用户的权限,指定Password文件的位置,指定权限指派文件的位置。 接下来编辑passwd文件,自己在后面建立一个就可以了,或者你可以用默认的那个 sally = sallyssecret 前面的代表用户名,等号后面是密码 然后编辑authz文件,[aliases]是代表用户的别名,如果需要定义的话是类似这样的 [aliases] sa=sally 不过使用别名的时候就需要用&符号放在前面了...

终于用VBA解决了一直以来统计这个大麻烦

每次各地方要数据的时候总是我最受虐的时候. 因为各地方的报表都是以单个的EXCEL文件的形式上报的,缺乏整体的汇总整理,一旦要数据,要么手工加和,要么用Excel的公式完成,随着需要统计的时间段的增加,工作量也成倍增加. 这次一次让我统计2年半的数据我终于出离的崩溃了...于是我终于下定决心要写个程序来搞定这该死的机械劳动. 虽然我本意是想用Python来分析Excel文件然后加入到MySQL数据库中,但是后来发现这样太绕弯子了,因为1.Python本身对Excel进行分析就不是很得力.2.输入进MySQL以后就算是调数据要么还要写一个GUI让它把数据掉出来,要么还是需要手工SQL...无疑是增加了麻烦绕了圈子. 所以看来微软的东西还是要用微软自己的软件来搞定,Access不就是这样一个东西么? 作为一个相当简单的数据库,Access提供了我最需要的功能...那就是和Excel的相当简单的数据互通,起码从Access到Excel是相当简单的..而我需要解决的难题就是怎么把Excel中的数据,准确的说是我想要的那一部分数据导入进来.而我面对的就是600多个Excel文件... 因为之前从未接触过Vba,不得不从头学起,不过好在不难就是了,直接到网上找了几个例子稍稍修修改改了一下. Function testttt(folderspec As String, tratablename As String) Dim objRs As New ADODB.Recordset Dim objFields As ADODB.Fields Dim myArray() As String '存放access表中字段名 Dim tempArray() As String '存放新增的字段名 Dim fs, f, f1, fc, s, t, u, a, b, c, intloop, t2, t3, t4, t5, t6, t7, t8, t9, fn Set fs = CreateObject("Scripting.FileSystemObject") If Not fs.FolderExists(folderspec) Then ...

熬了一个晚上,程序写完了.

这程序提出来到现在快三个月了,早就写完了的东西到现在还拖着没有验收,搞得我也没有动力去写完它.结果昨天处长说起这个事,说这周就要验收了,于是精神头就来了. 其实系统大的架构早就已经完成了,一些细节上的调整对我来说根本微不足道,也就是添加个别的数据项目,而且还不参与搜索中,所以根本就没啥值得注意的,但是唯一不同的就是分类的项目由之前的一级分类变成了联动的二级分类,这样最大的问题就是导致了报表系统的变化. 这个报表系统又是最麻烦的一个部分,因为涉及到了主要的选项需要重新构架的话整个系统基本上留不下来什么东西了,不过也正好可以趁这个机会修正一下之前恶心的程序就是了. 于是昨晚从八点开始就开始修正这个程序,整整用了6个半小时,到临晨2:30才完成.整个报表系统其实也就是2个SQL语句就完成了,但是针对数组的处理,排序,编排表格,输出EXCEL文件花费了大量的时间,特别是EXCEL文件的输出,相当的麻烦,又缺乏调试,提示的错误经常是不着边际,只能自己手工一个个的排查. 比如我写错了一个函数对应的两个变量的位置,一个是EXCEL文件的表格位置变量,一个是变量需要赋予的值,结果给写翻了,于是提示了一大堆乱七八糟的东西,我搞了半天才知道原来是变量写错了,还只能采用传统的逐步注释掉语句的办法才能完成调试... 最后为了排查一个大概是出现了内存溢出的错误,花了我大概一个小时的时间,主要就是因为点击那个程序之后本来应该提供一个EXCEL文件下载,结果直接给我一个503,PHP都被拖到死掉了....这下子更加不谈什么错误提示了,我找了好久才发现原来是其中的一个公式写错了,一个=SUM(A1:A30)的公式被写入了A30,造成了公式的循环冗余,本来Excel的话会提示你写错了,但是这个类就会直接把内存耗到挂掉为止.... 不过最终说来,终于算是完美的结束了.具体的内部验收定在明天了,这个星期大概能够完成全部的验收工作,剩下的就是拿钱请客吃饭咯. 另,读书计划进度报表: 社会契约论,读完了.不过打算再看一遍...找时间 论法的精神,进度40%左右,具体进度到第三章中部,孟德斯鸠已经开始研究生物学和环境影响了...OTL 国富论,刚刚开了一个头,这个只是在用手机的时候才偶尔看看的东西,不过发现它前面所讲的内容和马克思的政治经济学基本上如出一辙...

现在才开始看设计模式...是不是太晚了...OTL

面向对象这种东西如果不是碰到实际需要,我才不要学呢... (傲娇这东西我果然连学都学不会啊......

昨天的Python问题解决了

其实问题的毛病很简单 那就是没有提交Submit变量. 这个变量被有些程序判断为无关紧要的,但是也有程序中可能含有多个动作,可能对这个Submit变量做了判断,所以昨天我没有提交这个Submit导致得到了错误的提示结果. 今天加上去了之后就正确了....结果却冒出来一个新问题,那就是无法显示出操作人..理论上说这个东西应该是程序自己取得Cookie中的人,结果程序竟然就这样报错着通过了... 结果不得不把Post表单中的全部变量统统提交上去,结果发现一个没有做选择的选项卡框决定了这个操作人是否显示出来...OTL 于是问题很顺利的就解决了,接下来就是完善一点异常处理,显示提示而已,让它自己在处理的流程中自己提示出处理的流程.自定义输入理由框内容等等... 于是,我的Python处女作就这样完成了~

最近在很不务正业的玩Python

理由是单位里的机械劳动 我这个人是最讨厌机械劳动的,特别是大批量重复的无意义的机械劳动 这个劳动很简单,也就是把之前已经被确认删除的再次确认一遍,这个本来是用来针对其他厅局的一个审查办法,但是毫无疑问,针对被自己人删除过了的东西这样的重复审核毫无意义,但是每次都要让我多费好多时间来做这个事情. 最初是采用最简单最为原始的办法.那就是下个按键精灵,然后用按键精灵做个脚本出来. 这个脚本也经历了好多次变革,从最初的依赖于鼠标,到后来全键盘操作减低误操作的可能性.到最新的一版可以自动检测屏幕区域颜色用以确定页面是否已经正常载入. 但是无论这个程序写的多么的美妙,这个毕竟还是基于IE的,毕竟还是在不同分辨率的显示器上缺乏可移植性,甚至IE的版本不同都需要我再写一遍.同时,它不具备判定是否是我们本局所判定为删除的这样一个逻辑判断机制,导致最后可能会产生误操作. 所以我想到了用Python写个直接HTTP判断并且提交的,这样直接分析HTML或者正则表达式来解析网页文件,剥开我所想要的文件就可以了. 但是不得不说,我是个连Python的门都没有怎么入过的家伙.用的面向对象的程序仅限于一点点皮毛的PHP,以及一点点的JavaScript而已..于是赶鸭子上架的就开始写这个程序了. 要求很简单,不一定需要GUI,Python本身保证了可移植性,所以这点也不用担心,我所需要做的只有三个东西,1.登录.2,用正则表达式找到需要程序处理的部分.3.提交删除. 但是就这简单的三个东西,我琢磨了三天了...最初我卡在了该使用什么类上的问题,Python的HTTP请求类有很多,有原始的urllib,也有更新版本的urllib2,也有HTTP类,这样就迷糊了...不过最终发现,没有必要使用太多的类,直接使用urllib2就完全可以搞定了 之后我卡在了Session方面(至少我自认为是卡在Session了,其实则不是),虽然我登录了,但是我却一直无法得到列表页面...后来发现因为网站是Java写的,它每次都要你一定要在页面链接中传递一个Session值,而我则没有把这个值带入到我所指向的链接中,导致我每次登陆都无效.这个其实很好处理,只需要在登录了之后,处理登录之后的连接提取Session值,然后每次用分号加参数名带入进去就行了. 最后就是正则表达式的写法,这个和JavaScript以及PHP的正则...

拐弯抹角的解决Share站XSLT+XML搜索引擎收录问题

正如我之前所说的,XSLT+XML的站点无论从结构上而言还是从实际运用来说,都是非常理想化的一个东西..当然,也很好..但是有个非常实际的问题那就是... 搜索引擎的收录. Share站还在内部测试的时候,hiei就已经把站点提交到了baidu和Google,但是时至今日,百度的收录条数为1.内容为"<![CDATA[ gundam uc 01 ]]>"毫无意义的一些XML中的字符..而Google则干脆没有收录. 现在基本的功能都完善了,解决share站的搜索引擎检索功能自然成为了当务之急. 于是想到了用PHP来拼接XSLT与XML. 这个函数早在PHP4中就已经存在了,我也一直知道它,但是却从来未用过..只是知道有这么个东西. 今日一试,果然才知道它的强大. 简简单单的几行代码,可以说就是用了XSL类里面ImportStyleSheet方法的示范代码就解决了这个问题. 用DOMDocument类的load方法来载入已经在磁盘中存在的缓冲,然后再同样的载入XSL文件.接着用XSL类的ImportStyleSheet方法拼接二者,再用transformToDoc方法转换拼接结果为DOMDocument,接着最后用saveHTML方法直接Echo出来,任务就完成了. PHP拼接的结果可以说是非常的完美...包括了XSL里面全部内含的JS文件,以及做的一些小手脚都很精确的展现了出来...其实我原本最初认为它可能做不到这么好的,以为我需要重新写一个较为简单一点的XSL来方便它拼接,没想到这么简单,这么完美...大大出乎了我的意料..orz 最后用$_Sever变量判断客户端的User Agent,判断为是蜘蛛之后就给出合并了之后的页面,而普通用户继续访问XML核心页面..作为服务器端我自然是希望负载越小越好..如果我直接让客户端载入XML文件,我每次就给个不到2K的XML,其余的完全依赖客户端已有的缓冲就可以生成页面了,理想状况下我甚至连一个SQL查询都不需要,这何乐而不为呢? 至此,这个XML+XSL的大难题也算是告一段落了..不过最近听闻到一个消息,那就是StratCraft2的首页也是采用这个架构的...但是很不幸的是,它明显只是看中了XSLT可以比较完美的隐藏页面内容而已,并没有严格的按照"表现与结构分离,数据与表现分离...

写在Share站基本完成之后

Share站的策划始动于08年.一眨眼,过了2年了. 但是真正动手做了也只有三个时期.08年始动的时候,09年年初以及现在...中间因为hiei不大愿意换导致我的编程的热情也不是很高. 这个程序自从最开始的时候就确认的两个方针. 1.要使用XSL+XML技术.这个东西我窥视了很久了...这个东西是个不算新的东西,但是使用的人却并不多.优点很明显,数据和显示完全的隔离;模板很容易修改;客户端可以使用大缓存时间来缓冲XSL文件,而XML文件非常小.于是每次访问的时候只需要下载很小的一个文件. 但是缺点也很明显.那就是这个技术对编程要求很高,必须要写非常标准的XHTML,只要XSL文件有一点错误,页面就会直接报错而不会被任何浏览器掠过错误.同时XSL文件对流的要求很高,不能流式载入,也就是说页面是一次性显示出来的,而绝对不能如同HTML一样慢慢的一点点的载入进来,而这个问题在网速很慢的时候就很大.因为这个时候网速很慢导致XSL长时间无法载入的时候,页面就会报告未知的错误.然后最后一点.没有任何搜索引擎可以支持对XML+XSL文件网站的检索. 2.要使用类编程.这个只是探索.因为PHP最初就并不是面向对象的.所以我也一直只是一个面向过程的程序员而已.面向对象需要新的思想和新的思考方式.我觉得这个是个必须要跨越出来的步骤,虽然有悖PHP一向的高速高效的理论,我认为这个是一条必由之路.于是就要在这里尝试一下. 整个编程中让我学到了很多,特别是在Javascript在XSL中的应用方面,同时也对XSL有了更加深入而不是仅限于概念的理解..同时,因为采用了XSL+XML的架构,整个服务器也可以非常容易的使用XML文件做高速缓冲处理.这样明显优于使用HTML文件缓冲.因为毕竟在磁盘空间的消耗量上,XML文件要远远小于HTML文件的. 但是整个编程的过程中也暴露出来了很多问题,最大的问题就是文档的编写存在巨大的问题...因为整个编程的过程跨越的时间很长.某些时候要回忆起以前的一些构思反倒非常有难度.而且一些函数和方法的设置在当时就定义模糊,仅仅只是依赖于函数中的一些注释语句,有时候根本无法让人回忆起当时的构思. 比如说最简单的一个事例:取得种子文件的Hash值.Hash值分为两种,一种是底层服务器所承认的二进制的Hash数值,另外一种是表现在外面的以十六进制表现出来的数值.但是为了将二...

JavaScript基础

跨浏览器、跨语言 文档对象模型是一种 W3C 标准。因此,所有现代 Web 浏览器都支持 DOM —— 至少在一定程度上支持。虽然不同的浏览器有一些区别,但如果使用 DOM 核心功能并注意少数特殊情况和例外,DOM 代码就能以同样的方式用于任何浏览器。修改 Opera 网页的代码同样能用于 Apple's Safari®、Firefox®、Microsoft® Internet Explorer® 和 Mozilla®。 DOM 也是一种跨语言 的规范,换句话说,大多数主流编程语言都能使用它。W3C 为 DOM 定义了几种语言绑定。一种语言绑定就是为特定语言定义的让您使用 DOM 的 API。比如,可以使用为 C、Java 和 JavaScript 定义的 DOM 语言绑定。因此可以从这些语言中使用 DOM。还有几种用于其他语言的语言绑定,尽管很多是由 W3C 以外的第三方定义的。 本系列文章主要讨论 JavaScript 的 DOM 绑定。这是因为多数异步应用程序开发都需要编写在 Web 浏览器中运行的 JavaScript 代码。使用 JavaScript 和 DOM 可以即时修改用户界面、响应用户事件和输入等等 —— 使用的完全是标准的 JavaScript。 总之,建议您也尝试一下其他语言中的 DOM 绑定。比如,使用 Java 语言绑定不仅能处理 HTML 还可处理 XML,这些内容将在以后的文章中讨论。因此本文介绍的技术还可用于 HTML 之外的其他语言,客户端 JavaScript 之外的其他环境。 节点的概念 节点是 DOM 中最基本的对象类型。实际上,您将在本文中看到,基本上 DOM 定义的其他所有对象都是节点对象的扩展。但是在深入分析语义之前,必须了解节点所代表的概念,然后再学习节点的具体属性和方法就非常简单了。 在 DOM 树中,基本上一切都是节点。每个元素在最底层上都是 DOM 树中的节点。每个属性都是节点。每段文本都是节点。甚至注释、特殊字符(如版权符号 ©)、DOCTYPE 声明(如果 HTML 或者 XHTML 中有的话)全都是节点。因此在讨论这些具体的类型之前必须清楚地把握什么是节点。 节点是…… 用最简单的话说,DOM 树中的任何事物都是节点 。之所以用 “事物” 这个模糊的字眼,是因为只能明确到这个程度。比如 HTML 中...

有時候看看別人写的程序,感觉自己也有不少的提高

比如昨天调教Blogger的模板中的CSS,其实只是去掉几个虚线框和更换一下title的图片,但是却意外的发现在Blogger的CSS中很少直接指定hight值,绝大多数都是用Padding和Margin来撑起来全部的页面,让页面可以随着字数的变化而变化,不至于把原有的高度撑开.... 在处理浮动问题上,也是很小心的注意到了IE和FF的不同,利用一些小的hack来解决比如/* */:/**/,而在我之前的程序中,很多时候重复定义了太多的东西,比如定义了padding和margin,又把high和width定的死死的,导致文字改变了的时候就把原有的布局撑开了,直接导致FF和IE下的显示出现截然不同,毕竟你无法规范每个浏览器在处理违规的操作上的不同,你只能把各种的可能性都考虑在自己所限定的范围内.这个应该就是Blogger的Web Designer的思考的方式吧. 但是唯一有个小问题就是:为什么我昨天只是改动了了一点布局而已,在"页面元素"这个栏目中的"博客帖子"一栏就变得无比的巨大,甚至全屏了,我确定我的CSS并未改动太多啊,只是改动了三个宽度值和Title的Padding值而已...虽然功能并未太多的改变,但是总感觉不爽的样子....不过算了,可能是程序本身的BUG了,外观显示没有问题就行了- -

找到的一些不错的Python学习资料

首推:《Python编程金典》 难得的一本中文的Python编程教材。涉及的方面也比较全,基础的到GUI、多线程编程都有涉及到,很不错的入门级书目。 当然,也有应该比它还要好的东西,可惜都是英文原版的影印本了。英文苦手的就阅读困难了……

开始接触一下python,先放一点资料点..

早就耳闻到这个东西好用了的... 一直都想找时间看看,可惜一直没有见识到它真正的强大.. 这几天和hiei合作写程序,终于可以见到它的庐山一角,了解到它的强大了.. 果然是太拘泥于网页编程是不行的呀,还是要学习一下实用的工具才好 就这样,从现在开始好了~ 当然,首先是官方网站: http://www.python.org/ 基本上支持了全部的平台,我现在没办法用虚拟机,所以在用Win32下的Python了,不过那个GUI的工具还真的是慢...基本上还是依赖Command line了.. 这个算是教科书站点: http://man.chinaunix.net/ 以上,走出了第一步...

关于正则表达式...

说老实话,虽然一直在用正则,一直在写正则,但是还是没有完全的把它参透.. 今天就是,碰上问题了,无法在PHP中使用开头和结尾断言.. 结果半天才想起来要这样用{^$} 结果再想想我一直要用//把内容包括起来,又是为什么呢...不理解了-__- 然后就是现在才记起来,如果要求输入一个大的范围其实是这样写的: [a-zA-Z0-9] 我还一直以为要加来间隔...果然还是未够班啊...

让我怎么说你好,setTimeout()和clearTimeout()

这俩函数,一个是延时循环执行函数,一个是解除执行函数. setTimeout()的作用是让程序一段时间内反复执行,带的参数一个是函数,后面一个是毫秒数(1000为1秒) 现在的要求是:需要延时执行一个让层消失的函数,但是当这个函数还在排队执行的过程中,一个新的函数执行,一个让新的层出现的函数..但是让新的层出现又需要延时,但是在新层出现之前,又会调用clearTimeout()来解除之前不断循环的让层hide的函数,否则层不可能显示出来.但是延时函数还在延时的过程中,所以还没有顺利的让层消失就被取消掉了.. 因此出现了连续存在但内容变化的层,但是如果要让层顺利的消失,又考虑消失等待的话,就又需要一个延时函数来执行解除执行的函数,但是这个延时解除执行函数的函数又需要一个解除执行的函数来来解除,而且还不能解除的太快..因此又需要延时...如此反复...orz 我说...Javascript里面就没有一个单纯的执行延时的函数么?为啥非要搞个不断执行...难道这样很方便么...仅仅只是少些了一个while(1)循环而已...orz 现在唯一的解决方式就是在clearTimeout()之外放一个死循环反复的判断层是否已经消除,如果消除了则执行clearTimeout()并且break掉...真麻烦,估计看页面卡的都不行了...orz