关于记录片<河西走廊>

一口气看完了记录片,由感而发说两句。
总体感觉:宏大、厚重、壮丽、深情,很赞的一部纪录片,至今仍在回味。
整片以时间和叙事为线索,从汉初张骞开始,到当代,每一集都以一个主题展开叙述,而且还还用演员还原了场景,比起平时看只拍景物的记录片生动了很多,同时画面唯美,场面宏大。其实我对记录片的拍摄制作一窍不通,个人感觉布局。
我更想说的是看完了这总记录片后,当作对甘肃这个地方的地里地貌作一次科普,对这个地方普经和正在发生的历史在脑海中过了一遍。把从小到大从书本看到的,以及从电视上看到的有关河西走廊的各种零碎知识进行一次生动的串联和展现。
在历史上,河西走廊就是中原地带对外的一个窗口,中原文化从这里输出,西域文化从这里传入(比如佛教),这在这里,也是两种文化碰撞最强烈的地带,丝绸之路,敦煌,壁画。
而更重要的是在军事上的作用,河西走廊就是控制西域地带的一把钥匙,自古以来的王朝,只要参稳定控制河西走廊的,就能把军事影响到西域,就能控制住西域。而丢掉河西走廊控制权的王朝,同时也丢掉了西域的控制权。历史上有名的阳关,玉门关,嘉峪关都在此。
河西走廊不只是一个地理概念,更是一个历史概念,一种文化使命。整部纪录片确实在不遗余力的诠释这一点,没有停留在展现自然风光(自然风光都浓缩到广告后的短片中,如星空、丹霞、古城、河流)或者勾画历史故事的层面,而更多是在梳理河西走廊在历史长河中所扮演的沟通内外角色。最后一集尽管有主旋律味道,但表达起来还算是自然的。
而雅尼创作的《河西走廊之梦》更是不可或缺的浓重一笔,伴着悠扬深远的曲调,我们似乎可以听到从历史深处铺开的丝绸之路上传来的那一声声驼铃与胡笳
我也从来没有踏上这片神奇的地士,记录片中的景色也够唯美的,各种塞外风光,就像片中所说,这里有除了海洋之外的一切地理地貌,希望什么时候时候能路上行程去看看,特别是号称塞上江南的张掖。还有西出阳关无故人的阳关,春风不度玉门关的玉门关,虽然已经成为废墟,失去了原有的军事作用。

杂记

陪媳妇在医院待产。

进产房的头一天晚上,陪媳妇在医院,一晚上我和老婆一分钟都没睡,肚子一阵比一阵疼,疼得越来越频繁,最后那一个小时,媳妇真快要坚持不住了,我只能在一旁紧紧地握着她的手,鼓励她说医生教的方法不断地呼气化解一点疼痛。经过了那一晚上,才真正觉得女人的伟大,我更爱我媳妇了。一个女人生孩子前,还必须要经过这么一段难熬的疼痛期,最终把一个小生命生出来,还有什么比这更令人尊敬的。

在疼房里陪着,亲眼目睹一个小生命的降生。既紧张又兴奋,看着仪器表监测的波线,每一次跳动都无比紧张和害怕,但又不能表现出来,因为媳妇还在旁边,真正的主角是她。当孩子从露一点头,到整个头部出来,再到整个身体全部都出来,这比我平生所看到的任何一部电影,见过的任何一种大自然风景都令我震撼和永生难忘。每一个人都应该好好地爱自己的母亲,没有什么比她生育和抚养了你更重要。

成功升级为老爸后,日子了是若逼的,半夜起床免不了,于是这几天睡眠严重不足,也得给娃起个名字,全家人都得围着这个小家伙转。

最后,希望他快乐健康成长,以后可以做他喜欢的事,选择他的爱好,选择他的人生。

 

git对象存储

之前提到当存储数据内容时,同时会有一个文件头被存储起来。我们花些时间来看看 Git 是如何存储对象的。你将看来如何通过 Ruby 脚本语言存储一个 blob 对象 ,有必要了解一下对象是如何被存储的。以git设计哲学中的test1.txt为例分析blob对象如何被计算校验和?如何被存储?是否和直接调用git命令的结果一致?

sha-1校验和计算

我们需要验证通过ruby计算出来的检验和与这个一致。

为了验证,新建一个git仓库

$ mkdir blobtest
$ cd blobtest

$ git init
Initialized empty Git repository in /Users/lyc/Desktop/tg/.git/

同样新建一个文件test1.txt,内容为test1,并把它加入暂存区

$ echo test1 > test1.txt
$ git add test1.txt

 

gitt使用’blob ‘ + len(content) + ‘\0’ + content作为文件内容
blob表示对象类型为blob类型,

len表示内容的长度

\0为空字节

其中’blob ‘ + len(content) + ‘\0’ 来组成一个header,然后再将这个header与真正的内容拼接起来,并计算拼接后的新内容的 SHA-1 校验和。

使用 irb 命令进入 Ruby 交互式模式:

$ irb
irb(main):001:0> content = “test1\n”
=> “test1\n”
irb(main):002:0> header = “blob #{content.length}\0”
=> “blob 6\u0000”
irb(main):003:0> store = header + content
=> “blob 6\u0000test1\n”
irb(main):004:0> require ‘digest/sha1’
=> true
irb(main):005:0> sha1 = Digest::SHA1.hexdigest(store)
=> “a5bce3fd2565d8f458555a0c6f42d0504a848bd5”

可见计算出来的校验后与刚开始设定的校验和是一致的。

 

git对象存储

在git设计哲学中我们了解到test1.txt被git add命令添加到git仓库后,存储的路径如下

.git/
|–index
|–objects
| |–a5
| …

git设计哲学

刚开始使用git的时候,总想拿git来和cvs或者svn来作对比,但不久后发现这个想法本身就是错的,git完全就是另外一种物种,一种本属于未来的物种。它的对象存储方式,快照,分支等,都是完全不同的。

相信每个使用git的人,都想了解git内存文件的存储对象,快照,提交在历史和分支等内部的原理。都想知道它是否有传说中的那么强大?

Git 对象

先从本地创建一个空git仓库开始

$ mkdir test
$ cd test
$ git init
Initialized empty Git repository in /Users/lyc/Desktop/test/.git/

这时会发现目录下只有一个.git文件夹,进去后长这样

.git/
|–HEAD
|–config
|–description
|–hooks
| |–applypatch-msg.sample
| |–commit-msg.sample
| |–post-commit.sample
| |–post-receive.sample
| |–post-update.sample
| |–pre-applypatch.sample
| |–pre-commit.sample
| |–pre-rebase.sample
| |–prepare-commit-msg.sample
| |–update.sample
|–info
| |–exclude
|–objects
| |–info
| |–pack
|–refs

description文件仅供GitWeb使用,不用关心它。
config文件包含了项目特有的配置选项,如最常用的用户名和邮箱。
info目录保存了一份不希望在 .gitignore 文件中管理的忽略模式 (ignored patterns) 的全局可执行文件。这个用得比较少,也不用太关心。
hooks目录保存了客户端或服务端钩子脚本,一般我们都是用默认的,很少改,也不用太关心。

因此,我们需要重点关心另外四个重要的文件或目录:HEAD和index文件,objects和refs目录,因为它们是Git的核心:

objects 目录存储所有数据内容。
refs 目录存储指向数据 (分支) 的提交对象的指针。
HEAD 文件指向当前分支。
index 文件保存了暂存区域信息。

刚初使化的一个 Git 仓库, objects 目录是空的:

$ find .git/objects
.git/objects
.git/objects/info
.git/objects/pack

Git 初始化了 objects 目录,同时在该目录下创建了 pack 和 info 子目录,但是该目录下没有其他常规文件

接下来,我们新建一个文件test1.txt,内容为test1,并把它加入暂存区

$ echo test1 > test1.txt
$ git add test1.txt

发现.git目录下多了2个文件,且内容都为字节码:

.git/
|–index
|–objects
| |–a5
| | …

android本地定时通知

android本地通知略有不同,分为立即触发和延时触发

1.即时通知

android默认的Notification为立即触发

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setClass(_gameActivity, _gameActivity.getClass());
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
PendingIntent content = PendingIntent.getActivity(context, 0, intent, 0);
final NotificationManager notiMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
final Notification noti = new Notification(R.drawable.icon, notiResult.getPayload(), System.currentTimeMillis());
String app_name = _gameActivity.getResources().getString(R.string.app_name);
noti.setLatestEventInfo(context, app_name, notiResult.getPayload(), content);

notiMgr.notify(atomicInteger.incrementAndGet(), noti);

 

2.延时触发

想让一定时间后再触发通知,其实是用系统的AlarmManager来实现的。

具体的AlarmManager解释参考

http://yuanzhifei89.iteye.com/blog/1131523

http://blog.csdn.net/ryantang03/article/details/9317499

添加一个ALARM_SERVICE

/*
* name:通知名字,作为通知id使用
* content:通知内容
* time:倒时时(秒)
* */
public static void addLocalNotication(String name, String content, int time)
{
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(System.currentTimeMillis());
cal.add(Calendar.SECOND, (int) time);

Activity activity = _gameActivity;
Intent intent = new Intent(activity, NotificationReceiver.class);
intent.setClass(activity, NotificationReceiver.class);
intent.setData(Uri.parse(name));
intent.putExtra(“msg”, “play_hskay”);

intent.putExtra(“content”, content);
PendingIntent pi = PendingIntent.getBroadcast(activity, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

AlarmManager am = (AlarmManager) activity.getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pi);
}

 

添加一个系统通知类,用于在倒计时间到时,接收系统轮询通知

import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import …

升级xcode7开发问题汇总

1.The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.

Xcode7 编译程序无法连接网络,是因为Xcode7下,Apple要求数据传输协议必须支持Https协议(AST),否则将会默认无法连接网络。

目前网上已经给出临时解决办法:

1.在Info.plist中添加 NSAppTransportSecurity 类型 Dictionary;
2.Dictionary 下添加 NSAllowsArbitraryLoads 类型为 Boolean ,值设为 YES。

2. fembed-bitcode is not supported on versions of iOS prior to 6.0

原因:Xcode7 及以上版本会默认开启 bitcode 。  

Xcode 7.0中, enable_bitcode选项是默认YES,导致所有的对象,静态库和用户框架中使用时必须包含bitcode,否则,编译发出错误。如果你使用了第三方提供的库或框架,需要更新包含bitcode的版本(包括第三方库)。

解决办法:

(1).更新library使包含Bitcode,否则会出现以上问题。
(2).关闭Bitcode,简单粗暴。

如果不想打开enable_bitcode,可以设置成NO。

 

3.Scheme白名单问题

-canOpenURL: failed for URL: “weixin://app/wxdaae92a9cfe5d54c/” – error: “This app is not allowed to query for scheme weixin”

 

近期苹果公司iOS 9系统策略更新,限制了http协议的访问,此外应用需要在“Info.plist”中将要使用的URL Schemes列为白名单,才可正常检查其他应用是否安装。
受此影响,当你的应用在iOS 9中需要使用微信SDK的相关能力(分享、收藏、支付、登录等)时,需要在“Info.plist”里增加如下代码:

<key>LSApplicationQueriesSchemes</key>
<array>
<!– 微信 URL Scheme 白名单–>
<string>wechat</string>

为wordpress文章评论添加算术验证码

从网上搜到http://www.yuju.org/379.html使用的方法,
但也许是我用的workpress版本不同,没有找到相关的代码,于是参考了作者文章的基础了,研究了下,最终这样实现。

修改wordpress根目录下的 wp-comments-post.php

修改源代码其实没那么难,只是任何源代码的修改都记得先备份一个就是了。

网站根目录下的 wp-comments-post.php,查找:

if ( ” == $comment_content )
在此代码的上面增加:

 

//my code

if ( !$user->ID ) {

$aaa = trim($_POST[aaa]);

$bbb = trim($_POST[bbb]);

$subab = trim($_POST[subab]);

if((($aaa+$bbb)!=$subab)|| empty($subab)){

wp_die( __(‘错误提示:请正确输入的两数字相加的结果。’) );

}

}

//my code

 

然后修改wp-includes文件夹下的的文件comment-template.php
找到function comment_form( $args = array(), $post_id = null ) 方法

查找相关代码,我修改后如下

$req = get_option( ‘require_name_email’ );
$aria_req = ( $req ? ” aria-required=’true'” : ” );
$html5 = ‘html5’ === $args[‘format’];
$aaa=rand(0,5);
$bbb=rand(3,9);
$fields = array(
‘author’ => ‘<p class=”comment-form-author”>’ . ‘<label for=”author”>’ . __( ‘Name’ ) . ( $req ? ‘ <span class=”required”>*</span>’ : ” ) . ‘</label> ‘ .
‘<input id=”author” name=”author” type=”text” value=”‘ . …

苹果审核踩过的坑

最近一段时间由于有三款应用需要申请appstore,三款应用加起来先后被拒绝了七八次,好在这些应用现在都通过了。其中包含了一些条款理解不浅析,也踩过一些坑,收集一下,为以后不会再踩上同一个坑。

1.包含竞赛与赌博
程序内有抽奖的,在评级处必须选上竞赛与赌博。
也必须在抽奖页面加上抽奖规则与说明。
在抽奖规则里必须声明苹果并不是这些抽奖与赌博的发起者和参与者。说白了就是声明这些活动都与苹果无关。

2.不能包含显示的版本信息和检查版本更新

3.提供测试账号
即使是只需要输入手机和手机验证码,也需要提供一个可登录的手机号的验证码,不然会登录不进去直接被拒。

3.包含注册登录
如果包含注册功能,必须包含有相应的用户信息系统(比如登录,个人中心之类的和用户注册的必须要性相关的功能),或者你在审核备注里添加说明为什么需要注册,不然会直接被拒,因为苹果怀疑你收集个人信息。

如果注册包含隐私信息(如手机号,性别等)也必须在注册页包含一个隐私条款的说明。

4.有黄色和侮辱性内容
比如图片内容涉及黄色内容,或者恶心等侮辱等内容。会被拒绝,比如我们有一张漫画看上去是竖中指,就被拒绝了

5.支付
苹果条款里说明购买虚拟产品或者内容,支付不能用第三方支付,只能使用苹果支付。但购买线下产品或者实际产品的,可以接入第三方支付(如微信,支付宝)。

App Store 审核条款

1.1
As a developer of Apps for the App Store you are bound by the terms of the Program License Agreement (PLA), Human Interface Guidelines (HIG), and any other licenses or contracts between you and Apple. The following rules and examples are intended to assist you in gaining acceptance for your App in the App Store, not to amend or remove provisions from any other agreement.

为App Store开发程序,开发者必须遵守 Program License Agreement (PLA)、人机交互指南(HIG)以及开发者和苹果签订的任何协议和合同。以下规则和示例旨在帮助开发者的程序能获得
2.1
Apps that crash will be rejected

崩溃的程序将会被拒绝。
2.2
Apps that exhibit bugs will …

skynet中的协程

这篇是转来的,http://www.cnblogs.com/iirecord/p/skynet_coroutine.html
也是这一直很想写的,作者已经把skynet处理消息过程中的协程解释得很清析了,如下文

——————

阅读云大的博客以及网上关于 skynet 的文章,总是会谈服务与消息。不怎么看得懂代码,光读这些文字真的很空洞,不明白说啥。网络的力量是伟大的,相信总能找到一些解决自己疑惑的文章。然后找到了这篇讲解 skynet 消息队列的文章(最新的 skynet 消息队列代码已经有更新,变得更简洁易读)。了解了 skynet 消息是如何派发的,就想知道消息被派发出去到一个服务后,如何调用服务的 callback 函数,从而处理此消息。碰巧博主写了这篇讲解 skynet 如何注册回调函数的文章,于是 skynet 的概念“服务与消息”便在代码中得到了定位,便可以此为入口点探究 skynet 实现。

消息派发

这里云大已经很详细的介绍了,我就仅仅在这里略提一下。skynet 把消息分为不同的类别,不同类别的消息有不同的编码方式,若编写一个服务,你需要为此服务关注的消息类型注册 dispatch 函数用来接收此类别的消息。skynet 注册类别消息的 dispatch 函数有两种方式。

调用 skynet.register_protocol 注册。函数的参数是一个 table ,以”lua”类消息为例,里面有若干字段含义如下:

{
name = “lua”, — 消息组的字符串名称
id = skynet.PTYPE_LUA, — 消息组的数字 id
pack = skynet.pack, — 打包消息
unpack = skynet.unpack, — 解包消息
dispatch = function(session, source, cmd, …) … end — 消息回调/分发函数
}

指定了 table 中的 dispatch 字段,以后”lua”类消息到达时便会调用此函数。

调用 skynet.dispatch 函数注册。为此,云大给出了一个惯用写法,以”lua”类消息为例,如下:

local CMD = {}
skynet.dispatch(“lua”, function(session, source, cmd, …)
local f = assert(CMD[cmd])
f(…)
end)

两种方式可以根据喜好选择,毕竟一个服务可能需要处理多种类型的消息,需要注册多个 dispatch 函数。

在 skynet 中用 Lua 编写一个服务必须调用 skynet.start 启动函数启动此服务。

function skynet.start(start_func)
c.callback(dispatch_message)
skynet.timeout(0, function()
init_service(start_func)
end)
end

skynet.start 其中在一个作用是调用 …