1. 博文 2018-2-22 17:07

    浅谈 SQL 中的锁(七)如何生成自定义的自增 ID

    在 SQL 表设计中,自增 ID 的使用很广泛。因为有些数据的属性并不具有唯一性,所以要给它加上一个生成的主键。生成主键最方便的方式,就是采用 SQL 产品提供的自增 ID 功能。可能自增 ID 的使用太过方便了,现在大有泛滥的趋势,甚至有资深的工程师说:所有的表都应该有一个自增的主键。

    不过 SQL 产品的自增 ID 功能,一般都只使用简单的自增整型,就是第一行记录的 ID 是 1,第二行记录的 ID 是 2,如此类推。有时候我们会希望 ID 带有除序号之外额外的信息,比如希望用户的 ID 带有其部门简写:人事部的员工以 HR 做前缀;信息部的员工以 IT 做前缀:

    create table app_user
    (
    	id char(5) primary key,
    	dept char(2),
    	number int
    )
    
    insert app_user values('HR001', 'HR', 1)
    insert app_user values('IT001', 'IT', 1)
    

    面对这样的需求,一般的处理逻辑是:先找出对应部门的最大 ID,把这个 ID 的序号部分加 1,作为新用户的 ID 添加到用户表中:

    查看全文>
  2. 推特 2018-2-5 14:51

    MySQL 的 LAST_INSERT_ID() 对应的 .NET 类型是 ulong;SQL Server 的 SCOPE_IDENTITY() 对应的 .NET 类型是 decimal,特此记录。

    锚点
  3. 推特 2018-1-23 13:32

    大家不要到【闪修侠】更换手机屏幕。我几个星期前更换的手机屏幕是山寨货,今天在没有任何碰撞的情况下自然碎裂!注意!没有摔,是用着用着自然裂开的!

    锚点
  4. 推特 2017-12-28 17:09

    我对比了《芳华》里面黄轩的角色和《少女小渔》里面刘若英的角色,发现角色的塑造手法是一样的。《芳华》的男主角,实际上是一个女性,只不过被巧妙地包装成了男性。

    锚点
  5. 推特 2017-12-18 14:57

    昨天去看了《至爱梵高·星空之谜》。影片并没有明确表示梵高死于自杀还是他杀,但是无论如何,他的悲剧都是因为无法融入社会。

    锚点
  6. 推特 2017-12-7 17:20

    我对卡罗拉的后排地板的平整度印象很深刻。在汽车之家找到了一张底盘的图,好像把三元催化器往车头的方向移动就可以做到,技术上应该是很简单的,但是大多数的前驱车都不做这个改变。

    锚点
  7. 推特 2017-12-5 15:05

    现在的悬疑片拍得很复杂,但是逻辑性很差。观众爱看,主要是这种电影会让人产生自己很聪明的错觉。他们以看懂没看懂,作为欣赏水平的判断标准,这是很片面的。现在的什么《嫌疑人X的献身》就属于这种电影,最荒谬的要数《LOST》这部美剧,很多人在猜故事的答案,其实连编剧自己都不知道自己在写什么,编剧唯一要做的,就是让观众觉得自己很聪明。这是一种智商的圈套。

    锚点
  8. 推特 2017-11-22 13:16

    中秋节的时候,有个猎头在微信祝我节日快乐。我很开心!因为这样我不用把他找出来,就可以把他删除了。

    锚点
  9. 推特 2017-11-22 11:33

    很多人看不起 sql 这么简单的语言,但事实上,sql 的使用者比 java 都要多。而且 sql 比较接近自然语言,也就是更符合直觉,学习成本更低。当然,sql 只是一种领域语言,并不是像 java 一样的编程语言。

    锚点
  10. 推特 2017-11-22 09:25

    Hibernate 的实现难度,是比 MyBatis 要高的,难在从 java 到 sql 的映射。之所以现在 MyBatis 比较流行,是因为 MyBatis 设计为 sql 的补充,这是谦虚又聪明的做法。

    锚点
  11. 推特 2017-11-22 09:13

    Hibernate 之类 ORM 的问题就在于企图完全代替 sql。sql 是关系数据库的专用语言,你很难用一种通用性的编程语言,比如 Java 去代替它。

    锚点
  12. 推特 2017-11-21 16:44

    MyBatis 把 sql 写在 xml 里面的设计的确是有问题的。这并不是动态 sql 的完全解决办法,动态 sql 的问题只能通过对 sql 的完全解析来解决。

    锚点
  13. 推特 2017-11-21 15:23

    很多解决方案虽然有标准做法,但也是可以灵活变通的。我这几天做了一个单点登录,因为涉及与旧登录模式的合并,我设计了一个非标准的单点登录。这样可以少改动代码,也可以节省很多测试的时间。

    锚点
  14. 推特 2017-11-20 11:41

    如果要求高的话,文字的换行是很难处理的问题,特别是中英文混写的时候。微信聊天是动态宽度显示,朋友圈又采用了动态的文字距离。原生应用在这方面就有优势,用 css 发挥空间是有限的。

    锚点
  15. 推特 2017-11-20 11:35

    中文在计算机的处理中,有一些不方便的地方,比如输入比英文难,分词也比较难。我想说一个优点,就是中文的显示,对换行是很友好的,只要不是有标点符号,随时可以换行。而且,中文原来是没有标点符号的。

    锚点
  16. 推特 2017-11-17 15:21

    如果复制粘贴算是 Repeat,那么 DRY 原则就是错误的。编程中流行的大部分所谓原则,都有缺乏可操作性的特点。DRY 原则,开闭原则等等,没有判断符合或违反的标准,全靠代码作者胡吹。

    锚点
  17. 推特 2017-11-17 14:58

    编程有个著名的 DRY(Don't Repeat Yourseft) 原则,但是没有指出怎么样才算是 Repeat,比如复制粘贴算不算 Repeat。其实复制粘贴是最简单的复用代码的方法,朴素的跨语言,跨平台。聪明的程序员会把自己的代码写成对复制粘贴友好的。

    锚点
  18. 推特 2017-11-17 11:03

    现在应用在商业领域的分布式计算,解决的主要是吞吐量的问题,具体来说,主要是硬盘的 IOPS 问题。web 项目的瓶颈就在硬盘的 IOPS 上,所以把内存当硬盘用的 Redis 才会这么流行。

    锚点
  19. 推特 2017-11-17 10:54

    IT 界的热点,从大数据切换到人工智能,时间并不长。其实我们需要的并不是大数据,也不是人工智能,我们需要的只是梦想。给人一个梦想,也是一种安慰的形式,能不能实现,那是另外一回事。

    锚点
  20. 推特 2017-11-16 10:12

    分页并不是 count 一下然后 limit 一下就行的,因为这样是动态计算序号,越到后面的页码就越慢。高性能的分页都是预先计算好序号的,这样可抽象的逻辑就不多了,也就是没有什么通用的做法。

    锚点
  21. 推特 2017-11-10 15:06

    联通商城的正式环境!不服不行。

    锚点
  22. 推特 2017-11-10 10:00

    以前我有个领导,用一个叫“世界之窗”的浏览器,还开启了屏蔽广告的功能。有一次这个浏览器有个图片显示不出来,领导叫我同事去查,原来这个屏蔽广告的功能,其中一个逻辑就是不显示 class="ad" 的 img 标签。就是这么简单粗暴!现在很多人在做人工智能创业,他们演示自己的产品,经常会问机器人:“今天北京的天气怎么样?”机器人回答之后,他们又问:"那上海呢?",机器人又回答了上海的天气。然后演示者就总结说自己的人工智能产品可以理解语境。由于这个例子在人工智能的演示中重复率太高,懂技术的人都知道其中的猫腻。

    锚点
  23. 推特 2017-11-8 15:25

    【如何和美女搭讪】张爱玲说,没有早一步,也没有迟一步,遇上了也只能轻轻地说一句:“哦,你也在这里吗?”振华很喜欢这句话,他认为这里面蕴含了通用的搭讪的开场白,就是当对方在做某件事的时候,你也去做某事,然后就不经意地说:“哦,你也在~~吗?”有一次,振华在学校的洗手间方便完出来洗手,刚好碰到了自己暗恋的女生也在洗手,然后装作平淡地说:“哦,你也尿手上啦?”

    锚点
  24. 推特 2017-11-8 13:53

    我觉得 python 之于 google,有点像 VB 之于微软,都是群众基础不佳,但是老板喜欢的语言。VB 的特点是傻瓜,python 是适合写胶水代码。它们的缺点就是 C++、Java 这些语言的优点,很难概括是什么,大概就是不太适合用来造轮子。当我了解到 python 3 竟然放弃了向下兼容,很惊讶,很少语言会做这种决定。python 这样做,应该是争取要摆脱胶水语言的影子的。

    锚点
  25. 推特 2017-11-8 11:35

    编程并不都是高智商活动,很多都是脏活累活。比如编写跨平台的桌面软件,多系统、多版本的兼容是技术难度低又繁琐无趣的工作。web 编程以前要兼容 IE6,现在要做多屏的响应式产品,都属于这种工作。如果你使用了通用的框架,你就会失去灵活性,比如 Bootstrap

    锚点
  26. 推特 2017-11-6 15:38

    有一种说法是一般人的谈话中有 80% 以上是没有意义的废话,我看了马云在云栖大会上的演讲之后,发现马云真的不是等闲之辈,他的话有 99% 以上是废话。

    锚点
  27. 推特 2017-7-10 11:26

    远程桌面连接会占用服务器不少的内存,内存不足会导致连接失败。对于内存紧张的服务器来说,降低分辨率是节省内存的有效办法。我现在使用的是 1024×768 的分辨率。

    锚点
  28. 推特 2017-7-7 15:21

    本来打算使用 F#,但是编译太慢了,一个不够二十行代码的控制台程序要编译五秒钟,真是用不起,还是暂时用 C# 吧。

    锚点
  29. 推特 2017-7-6 09:27

    我有个坏习惯,编程的时候喜欢反复 Ctrl+S,坚持了十年,终于派上用场了,因为现在停电了!

    锚点
  30. 推特 2017-7-5 10:27

    我昨天在 Reference Source 看了一下 .NET Framework 类库的一些代码,就我看的这部分来说,并没有我写得好。

    不过想深一层,这些代码应该是 .NET Framework 2.0 或者更早的时候写下的,以现在的标准去评判,是不公平的。代码里面充斥着 a = null 这种操作,这在 C# 和 Java 这种托管语言里面,是没有用的。这应该是 C++ 程序员的释放内存习惯。

    锚点
  31. 博文 2017-6-29 16:41

    KindEditor 的 html 标签自动解码问题

    我的博客是使用 KindEditor 编辑的。我经常会使用代码模式在<pre>标签里面写一些 html 标记,我是在输入的时候,已经使用编辑器进行了编码的,比如<p>,我输入的是&lt;p&gt;

    如果文章只编辑一次,是没有问题的。但是在第二次打开,想要修改一点东西的时候,发现我输入的编码后的 html 标签被自动解码了,这样显示的文章内容就和预期不符了。

    开始我以为这是 KindEditor 的 bug,在 GitHub 上 fork 了这个项目,打算修改一下。在查看源码的时候,我发现 KindEditor 在初始化的时候,会获取绑定的 textarea 标签的值。我没有查看所有的调用栈,不过我猜获取的是 value 属性,而这个属性获取到的值,就是会对 html 标签进行解码的。

    既然 value 属性不能使用,那么其他属性呢?我查看了 innerText 和 innerHTML 的值,发现 innerText 获取到的值是和 value 一样的,而 innerHTML 的值刚好相反,它会把所有的 html 标签都进行编码。这样的话,这种使用 textarea 标签初始化编辑器的方式就不能使用了。

    查看全文>
  32. 博文 2017-6-29 15:01

    Less.Html 示例五:使用方法详解

    0. 从解析开始

    引入 Less.Html 的命名空间:

    using Less.Html;

    调用静态类型 HtmlParser 的 Parse 方法:

    查看全文>
  33. 博文 2017-6-29 10:19

    Less.Html 示例四:与 WebBrowser 的配合使用,以抓取京东手机价格为例

    很多网页使用了 ajax 技术,浏览器地址栏的链接并不返回全部的内容,而是在加载文档之后,采用异步的请求获取对应的内容。京东商城的商品价格就是 ajax 获取的。这样做有可能是为了优化速度,也有可能是为了防止抓取,或者两者都有。这种网页单纯用 WebClient 无法得到和浏览器访问相同的内容,需要使用 WebBrowser 控件,这个控件相当于在程序中嵌入了一个 IE 浏览器,可以运行网页的脚本,也就可以得到 ajax 请求的内容了。

    我写了一个示例四,演示了 Less.Html 和 WebBrowser 的搭配使用。之所要使用 Less.Html,是因为 WebBrowser 只能得到网页的 HTML DOM,DOM 的方法对于获取指定元素的内容是不太方便的,利用 Less.Html 的 css 选择器,可以快速地获取你想要的内容。

    源代码:GitHub    码云

    这个示例有两个要点,一个是异步线程去检查 ajax 是否完成加载,之所以要使用异步线程,是因为不能阻塞 WebBrowser 的线程;第二个就是使用 Less.Html 的 css 选择器快速获取内容的部分了。这是可以直接用在实际的项目中的,所以我选择了抓取京东手机价格为例:

    查看全文>
  34. 博文 2017-6-27 12:16

    Less.Html 示例三:与 WebClient 的配合使用,以抓取 CSDN 论坛内容为例

    WebClient 是做内容采集经常会用到的类,提供了方便的获取网页内容的方法。但是获取到的是字符串类型,如果使用 Less.Html 解析成节点树,可以大大的加快开发的速度:

    WebClient client = new WebClient();
    
    client.Encoding = Encoding.UTF8;
    
    string aspDotNet = client.DownloadString(
        "http://bbs.csdn.net/forums/ASPDotNET");
    
    var q = HtmlParser.Query(aspDotNet);
    
    var title = q("table.child_forum tr td.title");
    
    foreach (Element i in title)
    {
        q(i).find(".forum_link").remove();
    
        this.WriteLine(i.textContent);
    }

    上面的代码以抓取 CSDN 的 asp.net 论坛为例,列出了帖子的列表,代码总共就这么几行。

    css 选择器参数“table.child_forum tr td.title”就指定了帖子列表的标题,在循环的时候,调用了 remove 方法,这是因为标题里面有一个隐藏的元素,然后用 DOM 标准的 textContent 属性输出元素里面的文本内容就可以了。

    查看全文>
  35. 博文 2017-6-21 12:00

    Less.Html 示例二:以 Less.Html 做视图引擎

    这个示例来源于帖子 http://bbs.csdn.net/topics/392182238。楼主要生成一个树形结构的 html 视图:

    这个 html 的要求比较简单,Less.Html 的解析优势并不是很明显,但总比拼接要好的。我在这个示例中使用了三个修改 html 节点的方法,分别是 html、after 和 append,还有修改节点属性的方法 attr:

    //绘制本节点
    q("span").html("用户" + item.name);
    
    //绘制子节点
    q("div").after("<ul></ul>");
    
    //左边节点
    dynamic left = data.Where(
        i =>
        i.pid == id &&
        i._float == "left").FirstOrDefault();
    
    q("ul:first").append(
        q(
            "
    
  36. " + this.RenderNode( data, left != null ? left.id : -1, template) + "
  37. ").attr("style", "float:left")); //右边节点 dynamic right = data.Where( i => i.pid == id && i._float == "right").FirstOrDefault(); q("ul:first").append( q( "
  38. " + this.RenderNode( data, right != null ? right.id : -1, template) + "
  39. ").attr("style", "float:right"));
    查看全文>
  40. 博文 2017-6-19 09:54

    Less.Html 示例一:获取嵌套元素中的正确内容

    这个示例来源于这个帖子 http://bbs.csdn.net/topics/392175840,需要获取内容的 html 如下:

    <table>
      <tr>
        <td>姓名</td>
        <td>学号</td>
        <td>学分</td>
      </tr>
      <tr>
        <td>张三</td>
        <td>
            <table>
                <tr>
                  <td>201505047</td>
                </tr>
              </table>
          </td>
        <td>52</td>
      </tr>
      <tr>
        <td>李四</td>
        <td>
            <table>
                <tr>
                  <td>201502072</td>
                </tr>
              </table>
        </td>
        <td>65</td>
      </tr>
    </table>

    楼主通过循环 td 元素的方式来获取内容,但是因为学号的内容是嵌套在 td 的 table 里面的,会被获取到两次。

    如果使用 Less.Html,可以这样写:

    查看全文>
  41. 博文 2017-6-16 14:22

    一个犀利的 HTML 解析器 —— Less.Html

    我写了这个解析器之后才知道,原来 C# 写的 html 解析器有很多。但是因为我没有参照别人的做法,Less.Html 有一个特点,就是它的用法是最接近 jQuery 的。我刻意模仿了 jQuery。比如我写的 示例一

    var q = HtmlParser.Query(testHtml);
    
    foreach (Element i in q("td"))
    {
        if (!q(i).find("table").hasElement)
        {
            Console.WriteLine(i.textContent);
        }
    }
    

    解析之后返回的 q 对象,等同于 jQuery 的 $,因为 C# 不支持用 $ 做变量名,所以我用 q 代替。foreach 循环的部分,在 jQuery 的写法应该是 for(var i = 0; i < $("td").length; i++) ,其实在 Less.Html 里面,同样可以这样写,jQuery 不能使用foreach 的原因是,它会枚举对象的属性,C# 没有这个烦恼,所以我做了些改进。if 条件部分,q 和 jQuery 的 $ 一样,是可以传入 Element 类型的,然后调用的 find 方法,作用也是和 jQuery 一样的。hasElement 这个属性,实际上就是 length > 0 的判断,是我写的一个扩展属性,当然,你在 jQuery 里面也可以通过 prototype 做同样的事情。输出部分,textContent 是 HTML DOM 标准的一个方法,作用是获取节点及其后代的文本内容,这和你在编写浏览器运行的 javascript 是一样的。

    Less.Html 从解析核心到 DOM、选择器都是我手写的,没有任何依赖项,编译之后只有两个 dll:

    查看全文>
  42. 推特 2017-6-16 13:44

    我的云服务器内存紧张,无法远程桌面连接了,

    锚点
  43. 推特 2017-6-16 10:09

    我没有在自己的项目里面使用 NuGet,因为几次想用都出错了,安装一个简单的 Newtonsoft.Json 都找不到正确的版本,就不想用了,自己去下载还快点。

    昨天用了一下 python 的 pip,竟然很流畅,除了安装 MySql-python 出了点问题,其他的包都顺利安装了,可能是因为 python 的包版本还比较简单吧。看着那一行行的输出,不知道过程都做了什么,不过只要 PyCharm 里面 import 后面的红线消失了就行。

    锚点
  44. 博文 2017-6-9 18:00

    一个简单的 C# 图片缩放模块 —— Less.Image

    对于 web 项目来说,对图片进行不同尺寸的缩小是必须的。

    如果你编写过支持 IE6 的 web 项目,你会记得 IE6 对图片的缩放效果是很差的,要禁止你的图片被浏览器缩放,就要在服务端先把图片缩放到适合的尺寸。现在 IE6 基本被淘汰了,但是为了页面的加载速度,你还是要在服务器端把图片缩小。特别是现在很多人用移动流量浏览网页,为了节省用户的流量费,也要在服务器端把图片缩小,最好服务器端响应的图片,大小和在浏览器呈现的是一样的。

    大约在七八年前,我写了一些服务器端缩放图片的代码。现在修改一下开源出来。

    取一张测试用的原图,尺寸为 600×721:

    查看全文>
  45. 推特 2017-6-7 12:55

    我这两天在试用一下必应,发现它比以前已经进步了很多,和一流的搜索引擎的距离拉近了。

    必应有个特点,就是会显示一张高清的壁纸,有时候看上去挺舒服,有时候:

    今天是高考日,壁纸是吉利的大红色,浏览器窗口最大化的话,就整个屏都是大红色。

    嗯,祝莘莘学子都能取得好成绩!

    锚点
  46. 博文 2017-6-6 12:39

    一个网页 icon 的创意

    浏览器允许你在每个页面都指定一个 icon,然后浏览器会把它显示到需要的地方。一般在收藏夹、tab 标签,都会显示 icon,增加网页的个性。比如百度的 icon 在 chrome 的 tab 标签的效果:

    百度的 icon 是一个动物的脚印,可能代表凭足迹去寻找的意思吧。可以肯定的是,给网页指定 icon,可以增加识别度。人对图形的认知比起文字,认得更快,记得更久。

    我的工作是写代码,我不会用 PhotoShop。以前试过用 Fireworks 做简单的图片处理,但是毕竟没有美术功底,想象很美好,却无法用键盘鼠标表达出来。所以我给自己的网站设计了一个动态 icon 的方案,用网页 title 的第一个字画在图片上作为网页的 icon:

    查看全文>
  47. 博文 2017-6-6 09:27

    C# 判断手机访问的方法

    有一个网站,提供了各种语言判断手机访问的方法,http://detectmobilebrowsers.com/

    其中 C# 的代码如下:

    <%@ Page Language="C#" %> 
    <%@ Import Namespace="System.Text.RegularExpressions" %>
    <%
        string u = Request.ServerVariables["HTTP_USER_AGENT"];
        Regex b = new Regex(@"(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino", RegexOptions.IgnoreCase | RegexOptions.Multiline);
        Regex v = new Regex(@"1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-", RegexOptions.IgnoreCase | RegexOptions.Multiline);
        if ((b.IsMatch(u) || v.IsMatch(u.Substring(0, 4)))) {
            Response.Redirect("http://detectmobilebrowser.com/mobile");
        }
    %>

    和网络上流行的方法一样,这个方法也是通过请求的 HTTP_USER_AGENT 参数去判断的。我修改了一下,用在了自己的网站上:

    查看全文>
  48. 博文 2017-6-5 14:24

    桌面网站与手机网站

    不用看统计数据都知道,近几年手机网站的浏览量比起桌面网站肯定是大幅度上升的。所以编写网站的手机版本,是一个很重要的工作。

    手机网站的做法,主要有两种。

    一种是让你桌面网站兼容手机,或者说倒过来,让你的手机网站兼容桌面。这样你的网站在桌面和在手机是共用 css 文件的,只是在不同的屏幕会使用不同的样式。我的博客之前也是这样做的,加上这样的样式供手机屏幕使用:

    @media screen and (orientation: portrait)
    {
        body, input, textarea, select
        {
            font-size: 28px;
        }  
    }
    查看全文>
  49. 博文 2017-5-17 12:49

    session 为什么不见了?谈 IIS 应用程序池的两个重要设置

    经常听到程序员会说,明明设置了很长的超时时间,为什么没有生效呢?session 很快就被清空了。

    asp.net 默认的 session state 模式是 in proc(进程内),数据是在网站的应用程序池里面保存的。这样在 web.config 设置的超时时间,是在应用程序池没有发生回收的基础上才是有效的。

    这样就出现了问题,为什么应用程序池会发生回收?如何禁止应用程序池的回收,让 session 的数据可以保存得时间长一点呢?

    这和 IIS 应用程序池的两个设置有关:

    查看全文>
  50. 推特 2017-5-17 12:44

    朋友圈:“与一群比你优秀的人共事是一件幸事!”

    评论:“拍得一手好马屁,离升职加薪不远了!

    锚点
  51. 博文 2017-5-11 13:09

    网页加载的思考

    浏览器加载一个页面,会先加载 html 文档,在渲染文档的同时加载图片。很多网站的 img 元素是没有 width、height 属性的,我的也没有设置。这样浏览器在渲染文档的时候,不会给图片留出空间,在开始加载图片,知道图片的实际宽高之后,再留出图片的空间。这样就造成在网页加载的过程中,网页的高度会逐渐变高,垂直滚动条会闪烁跳动。

    之前我采用了这样的一个解决方案,先设置 body 元素为不可见:

            body
            {
                visibility: hidden;
            }

    在 onload 事件里面设置为可见:

    查看全文>
  52. 博文 2017-5-10 18:03

    asp.net 中的相对路径

    在 web form 编程中,一个完整的 url 是一般是这样的:

    http://yourdomain.com/dir/file.aspx

    程序员在编写指向 file.aspx 这个页面的代码的时候,往往不知道项目会部署到什么域名中,又或者测试的时候所使用域名与正式环境所使用域名不相同。在 IIS 中,还有在一个网站中创建应用程序的做法,更有多个域名指向同一个网站的情况……

    可能在网页部署的时候,是这样的:

    查看全文>
  53. 推特 2017-5-10 11:38

    这个我不认同,引导用户行为的基础是满足用户的需求。假设用户每天都发好看的图片是天真的想法,多数只是随便上张和文字无关的图,或者干脆把广告词 P 到图片上。也过于高看人对优美文字的追求了,我们都只是随便说说而已。

    锚点
  54. 推特 2017-5-10 11:34

    不需要已送达状态可以理解,但是并没有说为什么没有已读状态。

    锚点
  55. 推特 2017-5-10 10:22

    《星你》里面,我看到千颂伊用的 LINE,是有两个消息状态的,估计是发送成功一个 ✔,对方接收成功一个 ✔。

    据说张小龙曾经纠结过要不要在微信里面使用消息状态。现在微信的做法是反过来的,只有发送失败会有一个 ✘。没有对方接收成功这个状态。

    张小龙是乔布斯的粉丝,崇尚简洁,擅长做减法。不过在消息状态这个设计上,我稍稍倾向于 LINE 的做法。可能和我最近比较喜欢技术驱动有关,我认为应该追求尽可能多的技术实现,即使在产品设计上可以把这些实现隐藏。当然,这是缺乏经济上的考虑的,每一个技术实现都会带来更多的成本。

    张小龙的这种风格使得微信比较简单易用,用户年龄跨度大,主要是中老年人都会用。前段时间还有一个有趣的新闻,现在很多学生为了避开父母,不用微信用起了 QQ。

    锚点
  56. 推特 2017-5-9 17:37

    之前公司招了个“大数据科学家”,是只做管理、不写代码的。我不是说不写代码不好,我看过德鲁克的书,管理是一门实用的学问。

    有一天,这个“大数据科学家”突然嚷着说我们要用 png 存储图片,因为 png 比 jpg 体积小。这个成为我和一个同事饭后的笑料。

    其实无论一个程序员的水平多高,长时间不在前线会失去对技术的敏感度,很难了解一些具体的技术细节的。

    今天我刚好写了一点图像处理的代码,发现同样的 bitmap 转换成 png 和 jpg,没有透明像素,jpg 使用无损压缩的情况下,体积是完全一样的。jpg 可以使用有损压缩,少一个 alpha 通道,所以如果按这个“大数据科学家”所说,用 png 存储图像,体积只会变大。

    锚点
  57. 推特 2017-5-8 10:06

    ——林帝浣  

    锚点
  58. 推特 2017-5-5 17:28

    做产品就是用 Axure、MindManager,做管理就是 JIRA、禅道,真的是走错了。

    就像写程序不是学会用编辑器和 IDE 一样。

    当结果难以控制,我们就会炫耀过程。

    当然,我们都不会对号入座。

    锚点
  59. 推特 2017-5-5 15:45

    说起 .net 网站,还经常会提起 stackoverflow.com,他们在中国有备案:

     中文名叫“静态流,还挺技术的,但是好像有点跑题,为什么不直接叫“栈溢出呢?

    stackoverflow.com 的 alexa 排名是 53,jd.com 则是 21,还有一家传言是采用 .net 技术的网站携程 ctrip.com 排名是 3149,没想到这么后。

    还有 ctrip.com 的服务器竟然是 Tengine,这是开源的吗?

    锚点
  60. 推特 2017-5-5 13:31

    有一个农民给地主打工,地主说我给你每个月一石米。

    农民却说:“我有一个大胆的想法:你给我第一天一颗米,第二天两颗,第三天四颗,第五天八颗...后面全部翻一倍。”

    地主想这农民傻了吧,要这么少,就答应了。

    后来农民坚持了十天终于饿死了。

    ——haOFei  

    锚点
  61. 推特 2017-5-5 12:32

    知乎的前端工程师挺有想法,用 svg 做图标和二维码。我同事说知乎对浏览器的要求较高,不支持低版本的浏览器,这也是他们“高端”社区定位的一个方面吧。

    刚才在知乎上传了几张图片,竟然要求宽和高都要够 120px,我还写了个小程序放大图片。我认为他们应该在服务端就做好这件事的。

    可能他们的前端工程师比较多,后端人手不够吧。

    锚点
  62. 推特 2017-5-4 10:53

    在介绍一个人的成功的时候,往往过分强调一个人的个人能力。某某成功人士孤身一人,白手起家之类的。

    我认为这是有偏差的,人是社会性的动物,际遇没法逃脱社会的环境和家庭的情况。只是我们常常强调正面的影响而忽略反面的影响,比如战火纷飞的国家、不幸的家庭对人的影响是很大的。

    最近虽然运气不太好,但是家人帮助了我很多。这是体现在点滴生活中的。

    锚点
  63. 博文 2017-5-4 10:10

    京东在用 .NET 吗?

    很多人在讨论 .net 的时候,都会拿出京东做例子。支持者说京东能用 .net,说明 .net 很好,只要用得好,可以做大型网站。反对者说京东早期是用 .net 的,但是网站做得很烂,完全不能支撑业务,转投 java 的怀抱之后才好转,所以 .net 不如 java。

    其实 web 程序员都知道,一个网站用什么技术,可以在 http 请求和响应中看出来,只要这个网站不是故意去伪装的话。一般网站没有什么动机去伪装自己所用的技术。

    web 的早期,几种技术架构的请求链接都不同,java structs 的喜欢用 .action 和 .do 后缀,php 则是 .php,.net 是 .aspx。现在的大型网站一般都会隐藏后缀,因为从链接的设计美学来说,后缀不能表达任何有用的信息。

    访问京东的首页:www.jd.com,响应头如下:

    查看全文>
  64. 推特 2017-5-3 22:27

    那一年,振华高考落榜了,我拍拍他的肩膀,安慰他说:“华仔,不要伤心,人生的路很长,一次失败不代表什么。”

    振华擦了擦眼泪,看着我说:“好的,我不伤心,我应该向你学习,你高中考了三年都考不上,从来就没见你伤心过。”

    锚点
  65. 推特 2017-5-3 18:13

    最近看得比较多程序员的博客、微博,相比之下,我对编程是不够虔诚的。

    不过想来编程其实给我很多,我以后可能还要花比较多的时间在这项工作上面,毕竟这也是个有趣的事情。

    锚点
  66. 推特 2017-5-3 17:39

    我大学的时候有一次上讲台操作电脑,频繁地用 Caps Lock 切换大小写,台下有同学在笑。是的,我学习计算机知识起步比较晚,那个时候还不会用 Shift 切换大小写。

    锚点
  67. 推特 2017-5-3 10:24

    我小时候学习成绩不好,很自卑,经常怀疑自己,是不是我天生就比别人差呢?

    随着自己渐渐长大,我不再怀疑自己,我相信自己就是比别人差。

    锚点
  68. 推特 2017-5-3 09:30

    工作不久,我就指出了领导代码中的一个低级错误,被领导骂了一顿。我愤愤不平,难道仅仅因为你是领导,就可以不分对错吗?

    后来经过了多年的职场历练,我对此渐渐释怀——没有错,领导说的都是对的。

    锚点
  69. 推特 2017-5-3 08:59

    我小学的时候对振华说:“等我以后有钱了,我一定不会忘记你的。”

    我没有食言,我现在已经不记得他了。

    锚点
  70. 推特 2017-5-3 08:53

    女朋友半夜把我摇醒:“给我说个段子吧,我特别喜欢听你说段子。”“夜深了,睡吧,明天一早给你说,啊。”

    闹钟响了,我转过身去准备给女友说段子,发现自己根本没有女朋友。

    锚点
  71. 推特 2017-5-3 08:45

    振华小时候很喜欢汽车,特别喜欢保时捷。我跟他说:“等我以后成功了,我送你一台保时捷。”

    现在当然是没送啦,因为我从小就知道自己不可能成功。

    锚点
  72. 推特 2017-5-2 16:12

    今天做了一下手机的前端,才知道默认的情况下手机浏览器会对网页进行缩放。css 中的 px 在手机浏览器里面并不是显示为一个像素。

    这是因为手机的像素比 PC 要少,但是密度大,一个像素一般可以作为 PC 上面的两个像素使用。像素密度到达一个水平,就叫做 Retina 屏。

    一般的大型网站,都要建一个手机站,编写专门给移动端使用的 css,这样就可以禁用手机浏览器的缩放。

    如果一个网页同时要支持 PC 和手机,还是需要使用手机浏览器的自动缩放的。PC 端宽度 600px 的图片,在手机里面无法完全显示,这是不能容忍的。对图片缩小显示,在手机的高密度像素里面效果也很好。可以在 html 里面设置默认的缩放比例,这个博客的比例是 0.55。

    锚点
  73. 推特 2017-4-28 16:24

    刚才因为一些权限的限制,我没法在数据库里面 join 数据,而是把数据复制到本机,用 excel 逐条人肉 join 了一百条数据。

    是的,这个方法很蠢。但是如果有一万条数据,我会写一个程序,数据少的话就算了。

    如果我们把编程看做是一项工作的话,还是要接受去做一些乏味的事情。虽然这是我们的兴趣,但是也无法保证所有的时间都是快乐的。况且在编程上所做的这些无趣的事,无论如何也比搬砖要好,只要你真的把它当做一份工作。

    我记得以前中田英寿说:“踢球是我的工作,我的兴趣是打篮球。”真奇怪。

    刚开始工作的几年,我写了一个程序收集整理网上的行政区划信息,我的经理看到了,说:“就这么一点数据,你还不如一条一条去整理呢。”两种方法所用的时间应该差不多吧,他说的也有一定的道理。

    锚点
  74. 推特 2017-4-28 12:55

    乙方的业务员小妹心情很差,因为我公司还没转账,她的绩效没法完成,要被扣工资了。

    想不到几千元的订单对一个人影响这么大。

    不过我觉得这种情况乙方公司可以灵活一点,这个月底才确定续约,下个月不到账再扣工资也不迟。还好,最后他们的人跟我电话确认订单后,不扣业务员的工资了。

    明天就是五一假期了,想不到这么快二零一七已经过了三分之一。

    我希望一切可以好起来。

    祝大家五一愉快!

    锚点
  75. 推特 2017-4-28 12:54

    我小学的时候做过一次纸质板报,感觉很像现在的网页设计。

    我给板报的不同栏目涂上了不同的鲜艳色块,实际内容没多少。我的一个同学的板报则内容丰富,不同的栏目通过间距,字体,灰度的不同去区分,对比起来高下立见。

    现在看 web 产品水平的高低,也差不多是这种感觉。

    锚点
  76. 推特 2017-4-28 11:53

    现在的社交应用,要找到“曾经看到过,有一点印象”的信息是比较难的,不知道是不是有些信息,本来就应该随着记忆的模糊而消失。

    微博的“未读池”的排序,更加深了找回以前看到过的信息的难度,经常是一刷没了,就再也找不到了。

    锚点
  77. 推特 2017-4-28 11:53

    越长大越孤单,并不是因为你长大导致的,而是因为你的小伙伴长大了,他们发现你这种人并不值得交往。

    ——@银教授  

    锚点
  78. 推特 2017-4-28 11:52

    为了活跃气氛,我每晚在饭桌上都会讲段子,但从来没人笑。我以为是因为我的段子不好笑,后来才知道,是因为我每天都一个人吃饭。

    ——@银教授  

    锚点
  79. 推特 2017-4-28 11:31

    内裤是男人最后的底线。

                               ——野原广志

    锚点
  80. 推特 2017-4-27 09:07

    野比大雄毕业之后找不到工作,于是创立了只有他自己一个员工的“野比大雄”公司,这就是万众创业。

    锚点
  81. 推特 2017-4-26 17:45

    我不赞同什么“努力是为了你夹菜的时候没人敢转盘子”这种话,因为谁夹菜我都不敢转盘子。

    锚点
  82. 博文 2017-4-7 00:00

    浅谈 SQL 中的锁(六)查看锁的基本方法

    像前面的例子  http://bibaoke.com/post/29  那样,阻塞事务的语句是必须的:

    --延长处理时间
    waitfor delay '0:00:10'
    


    这个语句代表在查询中等待 10秒,这样我们才能模拟并发的情况,如果事务很快执行完毕了,就无法重现并发的情况。

    我在网上看到有些例子是使用 C#、Java 等语言启动多个线程去模拟并发,而不是使用阻塞,虽然这样更接近生产环境,但并不利于简化问题。多个线程模拟并发,取决于线程数和事务执行的速度,难以确认并发发生了,而且编码量稍多。

    然后是使用 sys.dm_tran_locks 视图去查看锁:

    查看全文>
  83. 博文 2017-4-7 00:00

    浅谈 SQL 中的锁(五)另一种解决方案

    余额问题  http://bibaoke.com/post/24  的处理,还有一种等价方法:

    update balance set value = value - 1 
    where id = 1 and value >= 1
    


    用一个 update 语句表示如果用户余额足够,即扣减余额,数据库会对数据放置排它锁。这样既不会出现余额负数的情况,也不会产生死锁。

    相比之前的方案,这个方案更加的简便。

    之前的方案则更加的灵活,因为事务的创建和提交一般在 Web 服务器里通过 ODBC 去调用。检查余额是否足够这个查询也可以在多个地方重用,比如在用户使用余额之前,就提醒用户充值。

    重复用户问题  http://bibaoke.com/post/26  也有一种等价的处理方法:

    insert app_user 
    select '13800002222' 
    where not exists(
    	select * from app_user with(holdlock, updlock) 
    	where mobile = '13800002222')
    
    查看全文>
  84. 博文 2017-4-7 00:00

    浅谈 SQL 中的锁(四)如何检查重复用户

    上一节  http://bibaoke.com/post/25  说了一个注册用户的事务没有互斥,导致注册用户失败的问题。

    也说了解决方法就是使用 serializable 隔离级别去执行事务:

    --开始事务
    begin transaction
    
    --设置串行式事务
    set transaction isolation level serializable
    
    --检查用户用户存在
    if(not exists(select * from app_user(updlock) 
                  where mobile = '13800002222'))
    begin
    	--延长处理时间
    	waitfor delay '0:00:10'
    
    	--添加用户
    	insert app_user values('13800002222')
    end
    
    --提交事务
    commit transaction
    
    --查看处理结果
    select * from app_user


    只是在原来的脚本加了一句:

    查看全文>
  85. 博文 2017-4-7 00:00

    浅谈 SQL 中的锁(三)重复用户问题

    拿 Web 项目中常见的注册用户场景做例子:

    --测试用户表
    create table app_user
    (
    	mobile varchar(11) primary key
    )
    
    --添加测试数据
    delete app_user
    insert app_user values('13800001111')
    


    现在新注册一个手机号为 13800002222 的用户:

    --开始事务
    begin transaction
    
    --检查用户是否存在
    if(not exists(
    	select * from app_user(updlock) 
    	where mobile = '13800002222'))
    begin
    	--延长处理时间
    	waitfor delay '0:00:10'
    
    	--添加用户
    	insert app_user values('13800002222')
    end
    
    --提交事务
    commit transaction
    
    --查看处理结果
    select * from app_user
    
    查看全文>
  86. 博文 2017-4-7 00:00

    浅谈 SQL 中的锁(二)余额问题的处理

    上次模拟了 SQL 中并发执行更新余额的语句,出现余额负数的问题:

    http://bibaoke.com/post/23

    现在说说它的解决方法。

    事务要正确地执行,就需要【隔离性】这个基本要素。更新余额的语句之所以会偏离期望的结果,是由于查询并没有互斥,也就是没有相互隔离:

    查看全文>
  87. 博文 2017-4-7 00:00

    浅谈 SQL 中的锁(一)余额问题

    举一个用户余额的例子,余额可以是现金、虚拟币、积分等,可以看作对数据准确度要求高的数据,一旦出错,就会造成客户或公司的直接损失。

    在 SQL Server 建立一个测试表:

    --测试用余额表
    create table balance
    (
    	id int primary key,	--用户ID
    	value int			--余额
    )
    
    --插入测试数据
    delete balance
    insert balance values(1, 1)
    


    ID 为 1 的用户有 1 块钱的余额

    查看全文>
广州必简信息科技有限公司 版权所有 粤ICP备15047625号-2