Install Dnsmasq on Centos

1. 安装

yum install dnsmasq

2. 配置

vim /etc/dnsmasq.conf

conf-dir=/etc/dnsmasq.d

vim /etc/dnsmasq.d/mobile-game.conf

address=/www.baidu.com/127.0.0.1
server=8.8.8.8

3. 配置生效

/etc/init.d/dnsmasq restart

Laravel 4

cli

  • php artisan migrate数据库迁移
  • php artisan db:seed 导入种子数据
  • php artisan migrate:refresh 回滚所有迁移并重新运行所有迁移
  • php artisan migrate:refresh --seed 回滚所有迁移并重新运行所有迁移with seed
  • php artisan migrate:make create_users_table 创建迁移
  • php artisan workbench chinanetcenter/cdn 新建workbench
  • php artisan controller:make SessionController 新建Controller

Pokemon X/Y

tips

  • 由于一开始的主角选择了一贯风格火属性,后面发现还可以从初代的三只主角中选择一只当小伙伴,果断小火龙啊,所以删档重玩一开始选泡沫蛙好了。ps:重置存档的方式是一进入开场动画按上箭头 + x + b
  • 第一个道馆虫族,如果主角还没到14级,估计比较难打馆主,可以去右边的22番道路打NPC练到14级出新技能
  • Pokemon Center高端了,可以当商店用,还能给主角换衣服
  • 选初代主角的时候,顺便从博士那里获得学习机器,练级就效率了
  • 防虫喷雾在使用完后会提示是否继续使用下一个,大赞!可以考虑买便宜的性价比高的防虫喷雾了!
  • 战斗动画,大口蝠飞在天上,技能就往天上打,细节有惊喜
  • 发电厂钥匙非常难找,在那里卡了好一会,还有很多反人类野怪从地下冒出,连防虫喷雾都免疫
  • 学习机器改版了,上场的获取100%经验,未上场的获取50%经验,厚道了

refer

关于ETag、Last-Modified、Cache-Control和Expires总结

相关名词

  1. ETag

    • Nginx 1.3.3版本开始支持,打开ETag支持后,Response Header会返回,如ETag:"52468652-169d5"。下一次客户端的http请求中如果包含If-None-Match头,如If-None-Match:"52468652-169d5",Nginx就会比较该值和计算出的ETag,一致就返回304。

    • ETag开关

        etag on | off; // 缺省为on
      
    • If-Modified-SinceIf-None-Match是与的关系,即均满足条件才返回304。

  2. Last-Modified

    • 在第一次请求某个服务器资源时,服务器端的返回状态会是200,同时Response Header会返回Last-Modified,表示该资源在服务期端最后被修改的时间,如Last-Modified:Sat, 28 Sep 2013 07:33:38 GMT
    • 当第二次请求该资源时,浏览器会在Request Header中带有If-Modified-Since,询问该时间之后资源是否有被修改过,如If-Modified-Since:Sat, 28 Sep 2013 07:33:38 GMT,如果服务器端的资源没有变化,则返回304。
    • 配合Expires可以做浏览器或代理服务器本地缓存
  3. Nginx中的expires

    • 如果Nginx设置了expires 1d;,那么Response Header新增返回两个头信息,分别是Cache-ControlExpires
    • 如果Nginx设置了expires -1;,那么Cache-Control会被设为no-cache,Expires则被设为当前服务器时间减1秒
    • 如果设置了expires 1d;,在第一次请求某个服务器资源时,服务器端的返回状态会是200,同时Response Header会返回Last-Modified和Expires和Cache-Control,这时浏览器客户端会把该资源缓存在本地1天,如果使用浏览器的转到按钮、或者在地址栏直接回车、或者打开新窗口重新输入该网址,这时浏览器不会访问服务端,而是直接读取浏览器客户端缓存,在Chrome dev tool的Network下显示的是from cache,在Firefox的firebug下显示的是没有任何请求情况,网络请求为空
  4. Cache-Control

    表示该资源的有效期,如Cache-Control:max-age=86400,优先级比Expires要高

    Cache-Control有如下取值

    • no-cache 数据内容不能被缓存, 每次请求都重新访问服务器
    • max-age 相对过期时间, 即以秒为单位的缓存时间

    Request Header中的Cache-Control

    • Cache-Control:max-age=0 如果使用浏览器的刷新按钮、F5刷新或者是Mac Chrome下的Command + r刷新,浏览器就会设置成这个头,表示不走浏览器客户端缓存,要从服务端获取,服务端有可能返回304或者200
    • Cache-Control:no-cache 如果使用浏览器的强制刷新,如Ctrl+ F5或者是Mac Chrome下的Command + Shift + r,浏览器就会设置成这个头,表示既不走浏览器客户端缓存,也不走服务端缓存,服务端返回200,不会返回304
  5. Expires

    • 表示该资源过期的GMT时间,如Expires:Sun, 29 Sep 2013 08:34:15 GMT
    • 配合Last-Modified可以做浏览器或代理服务器本地缓存

浏览器的三种刷新方式

  1. 使用浏览器的转到按钮、或者在地址栏直接回车、或者打开新窗口重新输入该网址

    优先走浏览器本地缓存,如果本地有缓存则根本不会访问服务器

    注:如果是chrome下,在本窗口下的地址栏直接回车,html不会走本地缓存,如果是新开窗口在地址栏输入网址回车,则html依然会走本地缓存。估计是chrome的策略,firefox下则都会走本地缓存

  2. 使用浏览器的刷新按钮、F5刷新或者是Mac Chrome下的Command + r刷新

    不走浏览器本地缓存,不过会走服务端缓存,会返回304

  3. 使用浏览器的强制刷新,如Ctrl+ F5或者是Mac Chrome下的Command + Shift + r

    既不走浏览器本地缓存,也不走服务端缓存,不返回304

PHP Construct Sql With Implode

使用implode拼接sql

<?php
function construct_sql($base, $logic, $clauses, $suffix = '') {
    // initialise array to avoid warnings/notices on some PHP installations
    $queries = array();

    // create array of strings to be glued together by logic
    foreach ($clauses as $key => $value)
        $queries[] = "`" . escape($key) . "`='" . escape($value) . "'";

    // add a space in case $base doesn't have a space at the end and glue clauses together
    $base .= " " . implode(" $logic ", $queries) . " " . $suffix;

    return $base;
}

/**
 * @param string $str string to escape for intended use
 * @return string
 */
function escape($str) {
    return mysql_real_escape_string($str);
}

$updates = array(
    'field1' => 'val1',
    'field2' => 'val2'
);
$wheres = array(
    'field1' => 'cond1',
    'field2' => 'cond2'
);
echo construct_sql(construct_sql("UPDATE table SET", ", ", $updates) . " WHERE ", " AND ", $wheres);

Jetbrains Idea Config

通用设置

针对IntelliJ IDEA, WebStorm, PhpStorm等均有效

  • 设置光标不允许在行结尾以外

    Preferences - IDE Settings - Editor - Allow placement of create after end of line

  • 安装vim插件

    Preferences - Plugins - Install JetBrains plugin - IdeaVim

IntelliJ IDEA

  • 在Intellij idea下安装IdeaVim插件后,关闭当前tab无法使用command + w快捷键,只能使用command + F4,需要更改Keymap

    Preferences - Keymap - Main menu - Window - Editor Tabs - Close

快捷键

  • control + enter generate 代码自动生成
  • alt + F7 查找被引用

Javascript Error Class

  • Error

      function Error(msg,id) {}
      Error = {};
    
  • EvalError

      EvalError.prototype = new Error();
      EvalError = {};
    
  • RangeError

      RangeError.prototype = new Error();
      RangeError = {};
    
  • ReferenceError

      ReferenceError.prototype = new Error();
      ReferenceError = {};
    
  • SyntaxError

      SyntaxError.prototype = new Error();
      SyntaxError = {};
    
  • TypeError

    A TypeError is thrown when a value is a different type than what was expected
    比较常用,当参数或变量跟预期不一样,就可以抛出这个异常

      TypeError.prototype = new Error();
      TypeError = {};
    
  • URIError

      URIError.prototype = new Error();
      URIError = {};
    

使用Intellij IDEA创建Maven模块

自己的一个Java的Clint工程,由于包依赖原来越多,决定使用Maven做依赖管理,提高日后的开发效率,IDE使用Intellij

  1. 创建Maven Module

    File - New Module - 选择Maven Module - 填写Module name - Next - 使用默认配置 Finish

Java Inputstream to String

A nice way to do this is using Apache commons IOUtils to copy the InputStream into a StringWriter

StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer, encoding);
String theString = writer.toString();

http://stackoverflow.com/questions/309424/read-convert-an-inputstream-to-a-string

Apple IAP

In-APP Purchase(IAP),iOS支付方式

iOS应用内付费(IAP)开发步骤列表 - 唐巧的技术博客
iOS应用内支付(IAP)的那些坑 - 唐巧的技术博客
In-App Purchase(iap)快速指南 - GungYi - 博客频道 - CSDN.NET
服务端验证接口

verify接口返回status码

  • 21000 App Store不能读取你提供的JSON对象
  • 21002 receipt-data域的数据有问题
  • 21003 receipt无法通过验证
  • 21004 提供的shared secret不匹配你账号中的shared secret
  • 21005 receipt服务器当前不可用
  • 21006 receipt合法,但是订阅已过期。服务器接收到这个状态码时,receipt数据仍然会解码并一起发送
  • 21007 receipt是Sandbox receipt,但却发送至生产系统的验证服务
  • 21008 receipt是生产receipt,但却发送至Sandbox环境的验证服务