- 博客(65)
- 收藏
- 关注
翻译 浮点数的直观解释
对于一个给定的浮点数表示:假设这是一个规格化的单精度浮点数(S占用1bit, E占用8bit,M占用23bit),通常的解释是:(-1)^S * 1.M * 2^(E-127)如果我们把浮点数的表示看成这样的三个部分,可以得到一个更直观的解释:符号位不变。对于指数部分,可以认为是一个窗口,这个窗口边界由两个连续的2的幂的整数构成。尾数部分则认为是窗口中的偏移。窗口表示了这个浮点数将会落在那两个整数中间:[0.5,1], [1,2], [2,4], [4,8]直到[2^127,2^128]。偏移
2021-12-03 17:31:49 447
翻译 chadstr,小巧的C语言字符串库
https://github.com/skullchap/chadstr/blob/master/chadstr.h用法示例:int table = 13;int id = 37;// 字符串插值str test1 = str("SELECT * FROM ", table, " where person_id ", id);// 复制test1str test2 = str(test1);// 字符串拼接str test3 = str(test2, test1);puts(st
2021-05-19 15:41:16 218
原创 正则表达式概述及其在Python中的应用
正则表达式描述了一种字符串的模式,主要由下列构件组成。字符和字符集比如有一个从a到z的字符串,如果要写一个正则表达式来描述,最笨的方法当然是abcdefghijklmnopqrstuvwxyz。使用字符集可以写成[a-z],0到9的自然数可以写成[0-9]。还有更简便的方式,那就是通过一些\转义的特殊字符用来表达字符集,比如\d用来表达数字[0-9],非数字是\D或者[^0-9](字符集前的^...
2020-02-28 13:48:21 324
原创 使用对象包装算法
一提到写算法就想着用一个很长的函数来实现,这种代码维护起来很麻烦。其实用一个类来做会更好。如何知道自己写的算法需要使用对象来包装代码坏味道1,太长并且有多层嵌套太长是多长呢,Martin Fowler说大概10行的样子。当然这不是硬性的规则,大致的原则就是不要让别人在看一个函数时需要滚动屏幕。代码坏味道2,横幅式的注释"""The following section of code i...
2020-02-28 11:07:03 438
原创 你的域名前要加www吗?
一些历史背景即便人们经常将“域名”(domain name)和“主机名”(host name)两个术语交替使用,然而他们是有区别的,不仅仅是语义上的区别。我简要的说明一下:作为一名IT管理员,你的网络就是你的域。现在需要给这个域命名,以及搭配相应的域名服务,因此你注册了一个域名,比如“example.com”。现在你的域下面有很多的主机。每一个接入网络的机器都被认为是一个主机。在你的域下提供万...
2020-02-28 11:05:40 5408
翻译 正则表达式的真正威力(3)
不受限文法乔姆斯基谱系中的再上一层是不受限文法。这个语言集合可以组成所有的递归可枚举语言集合。这个文法是不受限的,所以没啥可说的。不受限文法的产生式规则有这样的形式α -> β,这里面α和β是任意的符号串。基本上不受限文法就是去掉了非收缩文法中的限制。所以A B C -> H Q是合法的,即便在非收缩文法看来不合法。那么不受限文法到底有多强大呢?他们是图灵完备的。甚至有一个基于...
2020-02-28 11:03:11 400
翻译 正则表达式的真正威力(2)
上下文有关文法接下来再看乔姆斯基谱系上一层:上下文有关语言。上下文有关语言中的产生式都具有以下形式:α A β → α γ β这种混合字符初看很复杂,其实很简单。核心依然具有形式A → γ,...
2020-02-28 11:00:48 233
翻译 正则表达式的真正威力(1)
匹配上下文无关语言举个上下文无关语言的例子,{a^n b^n, n>0},意思就是“一连串a接着相同数量的b”。相应的正则表达式(PCRE)是:/^(a(?1)?b)$/(?1)引用第一个匹配的子模式(由最外面的小括号包围),也就是(a(?1)?b)。你可以用子模式替换(?1),所以这形成了递归的依赖:/^(a(?1)?b)$//^(a(a(?1)?b)?b)$//^(a(a(...
2018-11-02 17:52:09 364
翻译 正则表达式的真正威力(0)
原文我在浏览StackOverflow上关于PHP的问题时经常看到有人提问如何使用正则表达式解析HTML。对于该问题的回答通常是这样的:你不能使用正则表达式解析HTML,因为HTML不是正则的。使用XML解析器吧。这种回答——在该问题的语境下——是有误导性的甚至是完全错误的。接下来我会展示现代正则表达式是多么强大。“正则”到底是什么意思在形式语言理论中,说一个东西是“正则(regul...
2018-10-31 12:18:09 390
翻译 Lisp神化之路
程序员在谈论不同编程语言的相对优劣时,其口吻就像是在说别在工具腰带上的不同工具——这个适合系统编程,另一个更适合用于胶合其他程序来完成一些临时任务。这是理所当然的,编程语言各有所长,在脱离具体应用场景的情况下声称一个语言优于其他只会引起无益和恶意的争吵。然而有一个语言会引发普遍的尊崇:Lisp。要是有人胆敢声称某些语言优于其他语言,键盘侠们定然会开始攻击,如果说的是Lisp那就不同了。Lisp超...
2018-10-23 18:01:31 30588 2
原创 浮点数是如何表示的
如何编码浮点数?我们知道计算机表示的任何信息都是一串bit,具体内容决定于如何解释。IEEE浮点标准用V = (-1)^s * M * 2^E的形式来表示一个数。s表示符号(1表示负,0表示正); M表示尾数,二进制小数,取值范围为1~2或者0~1,不包括上限值;E表示阶码,对浮点数加权,这个权重是2的E次幂(可能是负数)。在单精度浮点格式中,s占用最高位1位,exp占用接下来的8位,...
2018-09-11 17:05:06 2273
原创 如何写一个简单的解释器-1
Lan的源代码由一些基本元素构成,我们称之为Token,在词法分析阶段我们需要将输入的字符流转化成Token流(简单说就是Token列表)。下面是Token的类型定义,为了节省资源采用整数表示而不用枚举类型。public class TokenType { public static final int PLUS = 0;//("+") public stat...
2018-09-07 22:47:46 1042
原创 如何写一个简单的解释器-0
在接下来的几篇文章中,我们一起用Java写一个简单的编程语言(我称之为Lan)解释器。该语言不会有实际用处,仅仅作为演示Pratt解析算法。目标读者是对编程语言的解析感兴趣的初学者,当然我也是。先看看Lan的一些代码:变量类型(数字,布尔值,字符串,函数,null)n = 123 + 1 - 23 * 21 / 3b = true s = "hello lan"hello = fun...
2018-09-07 15:25:11 1372
翻译 Parse 简介
导言提到Rebol语言的优秀特性那就不得不说它的解析引擎,简称Parse。这项来自Carl Sassenrath的伟大设计,在过去的15年里,使得Rebol用户免受正则表达式(以不可维护著称)的折磨。现如今,Parse的增强版本在Red语言中重装上阵。简而言之,Parse是一个使用语法规则来解析输入序列的内部DSL(在Rebol生态圈称为“方言”)。Parse方言是TDPL家族的突出一员。
2018-01-22 13:33:48 14388
原创 Java核心技术之泛型
泛型类(generic class)是带有一个或者多个类型形参(type parameter)的类。泛型方法是带有类型形参的方法。可以要求类型形参必须是一个或多个类型的子类型。泛型类不是协变的(invariant):当S是T的子类型时,G<S>和G<T>没有任何关系。通过使用通配类型形参(wildcards)G<? extends T>或者G<? super T>,使得一个方法可以接受使用T
2017-11-22 14:17:33 383
原创 JavaScript原型链
Object-Prototype凭空诞生,为所有对象的根原型。在此基础上派生出了Function-Prototype,为所有函数对象的原型。Function函数对象以Function-Prototype为原型,以自身为构造器创建了自己。可以认为这是元构造器。此后用户便拥有了构造函数对象的能力,例如上图中的Foo。function Foo() {}//或者var Foo = function()
2017-06-17 17:03:56 648
原创 使用Let's Encrypt证书签名服务创建Java Keystore(.jks)
安装certbotsudo apt-get install software-properties-commonsudo add-apt-repository ppa:certbot/certbotsudo apt-get updatesudo apt-get install certbot创建keys并获取证书certbot certonly --standalone -d coderock
2017-06-06 19:30:24 2317
原创 Android开发进阶——使用Dagger2
前言关于Dagger2的学习,首先看的官方文档,确实看不懂。然后搜索网络上的介绍博文,不乏一些讲得比较好的,如这个。但终究不够透彻,还是得回头研究官方文档。本文不仅仅是翻译,而是记录了自己对官方文档的理解。提供依赖的两种方式使用@Inject注解构造器class Thermosiphon implements Pump { private final Heater heater; @I
2017-06-02 21:56:06 902
翻译 Android App架构指南
该指南针的目标人群是已经知道如何建构简单的app,并且希望了解构建健壮的产品级app的最佳实践和推荐架构。app开发者面临的难题不同于大部分的传统桌面应用只有一个入口,并且作为一个整体的进程运行,Android app有更加复杂的结构。一个典型的app由多种组件构成,包括activity,fragment,service,content provider和broadcast receiver。几乎所
2017-05-19 17:53:18 6174
原创 Spring实战——如何运行第一章的代码(如何生成一个可执行的jar包)
手动创建一个目录kni,进入kni创建一个build.gradle文件,内容如下:apply plugin: 'java'jar { baseName = 'knight' version = '0.0.1-SNAPSHOT'}repositories { mavenCentral()}dependencies { compile("org.springfram
2017-03-24 17:01:57 2871
原创 Intellij IDEA创建基于Gradle的SpringMVC工程
在创建工程时选择基于Gradle的工程,勾选Web 如果选择使用gradle wrapper导致下载很慢,可以选择本地安装的gradle 添加tomcat(Run->Edit Configuration),最后点击绿三角运行工程 在build.gradle中添加Spring MVC依赖,并同步工程接下来要开始编写Java代码了,在main下创建java文件夹,并在java文件夹下创建一个pack
2017-02-28 17:07:18 8392
原创 ubuntu14.04安装WordPress
安装apache2apt-get install apache2启动apache2service apache2 start如果看到警告”AH00558: apache2: Could not reliably determine the server’s fully qualified domain name…”,打开apache2配置文件/etc/apache2/apache2.conf,在末尾
2017-01-10 14:41:49 649
原创 Java泛型小结
泛型类(generic class)是带有一个或者多个类型形参(type parameter)的类。泛型方法是带有类型形参的方法。可以要求类型形参必须是一个或多个类型的子类型。泛型类不是协变的(invariant):当S是T的子类型时,G<S>和G<T>没有任何关系。通过使用通配类型形参(wildcards)G<? extends T>或者G<? super T>,使得一个方法可以接受使用T
2017-01-10 14:37:40 593
原创 Building and Testing with Gradle笔记3——Ant and Gradle
Hello Ant可以将Ant理解为Java世界的make,正如使用make需要编写Makefile。Ant也有类似Makefile的构建文件,只不过是使用xml来描述的。创建一个文件build.xml,内容如下:<project> <target name="helloViaAttribute"> <echo message="hello from Ant"/> <
2016-11-14 10:29:25 512
原创 Building and Testing with Gradle笔记2——Gradle Tasks
声明一个Tasktask hello执行gradle tasks输出当前Project中所有task:tasks------------------------------------------------------------All tasks runnable from root project-----------------------------------------------
2016-11-11 14:02:18 549
原创 Building and Testing with Gradle笔记1——Hello,Gradle
导言Gradle构建文件是基于Groovy的DSL编写而成安装下载Gradle压缩包并解压,添加GRADLE_HOME环境变量指向安装路径。并将bin目录添加到Path中。构建文件的Hello World新建build.gradle文件,内容如下task helloWorld << { println 'hello, world'}进入该文件的目录,执行gradle -q helloWor
2016-11-11 14:00:38 395
原创 Android开发进阶——测试
导言每次使用Android Studio创建一个新的工程,都会看到类似如下的目录结构: 我们编写的Java代码全部放在最上面的包中,下面两个使用红线圈中的包总是没有用过,仅仅知道他们是用于放置测试代码的。标注为androidTest的包放置UI相关的测试,标注为test的包放置普通的单元测试(使用jUnit4)。下面就来探索如何编写具体的测试代码。测试金字塔如图,最基础的是Unit TestAnd
2016-11-11 13:59:05 496
原创 Java核心技术之注解处理
注解处理运行时处理定义一个注解ToString(注解本质上就是一种接口)@Target({ElementType.FIELD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface ToString { boolean includeName() default true;}任意需要格式化打印的类对
2016-08-29 10:43:41 691
原创 Java核心技术之脚本和编译
脚本//创建一个脚本引擎管理器ScriptEngineManager manager = new ScriptEngineManager();//遍历引擎管理器所支持的所有脚本引擎for (ScriptEngineFactory factory : manager.getEngineFactories()) { System.out.println(factory.getEngineNa
2016-08-29 10:14:28 573
转载 Shell程序设计
本文其实是《Linux程序设计》第二章第六节的内容,原文点这里。这里之所以搬过来,只是对自己学习的记录而已。变量所有的变量都以字符串来存储,即便其值为数值也是如此。使用$对变量取值给变量赋值时等号两边不能有空格如果字符串里面包含空格,必须使用引号引起来$ salutation=Hello$ echo $salutationHello$ salutation="Yes Dear"$
2016-07-14 17:17:28 948
翻译 500 Lines or Less——可视化编程工具(Blockcode)
原文Dethe 是一个极客老爸,具有审美趣味的程序员,导师,以及可视化编程工具Waterbear的作者。他联合创办了温哥华手工制作教育沙龙并且满心希望机器纸折兔能火遍全球。在基于块(block-based)的编程语言中,你通过拖动和连接代表程序不同部分的块来进行编程。而在一般的编程语言中,你是通过键入字符来编程的。学习编程可能很困难,因为一般编程语言对于拼写错误是零容忍的。大部分的编程语言都是大小写
2016-07-13 18:32:19 19173 5
翻译 500 Lines or Less——导言
这是开源应用架构系列丛书的第四卷,首次不在标题中使用“开源应用”字样。头三卷都是关于解决大型问题的大型程序。对于刚开始职业生涯的工程师,超过几千行的代码量的程序可能就显得过于复杂而难以理解,因而大型问题即便有趣,但是难以用于学习。500 Lines or Less专注于程序员在创造一个新软件之初的各种设计抉择。本书中程序都是从头开始编写的小型程序(然而有些程序的灵感是作者所从事的大型工程)。在阅读每
2016-07-13 14:39:32 4409
原创 Gradle初探
要彻底理解Gradle的行为,需要了解一点Groovy语言。一些基础简单来说,Gradle是使用Groovy语言编写的一个框架,主要用于建构。作为框架,主要的基础设施都已经做好了。那么作为用户的我们只需要调用接口完成完成特定的任务即可。 首先,要明白你编写的所有的Gradle脚本都是配置脚本,也就是所有.gradle后缀文件,都是为了配置几个基本对象(Project,Gradle,Settings
2016-07-05 14:38:48 563
转载 Gradle基础——Groovy语言
原文见深入理解Android基本概念println "hello groovy"//定义变量,不必显示指定类型def va1 = 1def var2 = "I am a person"def int val3 = 3//定义函数,关键字return不是必须的String testFunction(arg1, arg2) { "xxxx"}println testFunction(
2016-07-04 15:18:00 669
原创 Java web学习笔记之二——编写Servlet
创建一个Servlet类 A Servlet is a small Java program that runs within a Web server. Servlets receive and respond to requests from Web clients, usually across HTTP, the HyperText Transfer Protocol.jav
2016-06-28 15:07:51 572
原创 Java web学习笔记之一——环境搭建
安装Tomcat下载Tomcat的zip文件,直接解压到某一个目录运行之前,添加一个管理用户。打开conf/tomcat-users.xml文件。在标签之间添加如下内容。<user username="xxx" password="xxx" roles="manager-gui,admin-gui" />打开conf/web.xml文件。搜索文本org.apache.jasper.servle
2016-06-24 17:02:14 529
原创 Java核心技术之代理
什么是代理(proxy)?使用代理服务器翻过墙的都知道那大概是怎么一回事。比如,我想访问google,结果GFW不允许。假如存在于某地的一台主机可以访问google,并且可以提供访问google的服务,这时我们向这台主机发出访问google的请求,这台主机然后将我们的请求转发给google,并且将google的响应内容返回给我们,那么这个主机就是一个代理了。Java中的代理是这样定义的,利用代理可以
2016-06-24 13:34:09 796
原创 Activity的Launch Mode
standard启动模式:该模式保证总是生成一个activity实例放入当前的task顶部。(Android5.0及以后,跨应用的activity在新建的task中创建)singleTop启动模式同上,除非task顶部为被启动的activity实例。(即如果被启动的activity已经位于task顶部,不再生成实例,而是调用已有实例的onNewIntent方法。)该模式一般用于展示搜索结果的acti
2016-06-24 11:35:27 522
原创 Android源码中内置包含so文件的APK文件
在packages/apps下面以需要预置的APK名字创建文件夹,以预置一个名为Test的APK为例将Test.apk放到packages/apps/Test下面在packages/apps/Test下面创建文件Android.mk,文件内容如下:include $(CLEAR_VARS)# Module name should match apk name to be inst...
2016-06-23 11:04:59 7413 6
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人