ssh 连接的时候我们经常使用 screen. 个人觉得 tmux 就是一个 screen 的 wrapper. 我们可以使用 tmux 来代替 screen.
tmux 的按键与 screen 类似.只不过 global key 为 C-b 而不是 C-a. 不过 tmux 的高定制性为我们解决了很多问题.
下面说下配置.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| $ vi ~/.tmux.conf
set -g prefix ^a
unbind ^b
bind a send-prefix
bind - splitw -v
bind | splitw -h
bind k selectp -U
bind j selectp -D
bind h selectp -L
bind l selectp -R
bind-key K resize-pane -U 10
bind-key J resize-pane -D 10
bind-key H resize-pane -L 10
bind-key L resize-pane -R 10 |
1.闭包概念.闭包应用环境.闭包这个词的来源.
闭包(Closure)是词法闭包(Lexical Closure)的简称。可以在词法上下文中引用自由变量。即使在自由变量离开了作用范围。
2.lambda好处.函数式编程.意义?作用?
精简代码,省去复杂的定义过程。对于一些抽象的,不存在复用的函数定义起来不需要考虑命名。有些情况下还可以使代码更容易被理解。
函数式编程:没有变量和副作用。经常使用递归。
3.php return 和 exit 区别.exit退出时系统做了什么·
4.sae如何搭建
5.负载均衡.\
最最输在的地方是紧张和自我介绍.
SAE应用开发与标准的LAMP的差异基本在以下几个地方:
1
2
3
4
5
6
| 传统LAMP环境 SAE平台环境
本地I/O => TmpFS/Wrapper
htaccess => Appconfig
网络I/O => FetchURL
Mail => SaeMail |
1.Appconfig 替代 htaccess.
安全.实现更高效.语法更人性化.
2.MySQL分布式数据库服务.通过RDC提供.
RDC是Relational DB Cluster(关系型数据库集群)的简称,是一种分布式的关系型数据库集群,主要用在支撑公有云计算平台的数据库集群,目前RDC支持的存储后端为MySQL(http://www.mysql.com/)。用户可以简单的理解RDC为MySQL的中间层或者代理层,类似MySQL Proxy。所有的SQL请求都由RDC传递到后端的实际存储上。RDC可以支持千万级的数据库后端,其自身也支持分布式水平扩展. RDC由Sina App Engine(http://sae.sina.com.cn)技术团队开发,目前用来支持Sina App Engine的分布式数据库。RDC虽然为分布式数据库集群,但是对终端用户完全透明,用户在使用RDC时,不会感觉到和使用传统的MySQL数据库有任何差异,甚至用户都不用知道RDC的存在。用户可以使用所有MySQL标准客户端(MySQL5以上)操作RDC,如mysql_query、mysql_connect等,错误处理和标准MySQL客户端处理模式一样。 RDC拥有强大的监控功能,能够实时监控用户的DB的健康状况和同步延迟情况,一旦发现异常,将会在15秒内完成切换工作,用户的请求会被转发到其他正常的机器上。RDC自身采用的是多进程非阻塞方式的通讯框架,自身性能消耗较少,根据内部测试,其代理层性能损耗在5%以内。RDC因为100%兼容MySQL5协议,所以对于普通开发者几乎没有任何学习成本,开发者根本无需关心RDC,甚至无需知道RDC的存在,只需和使用普通MySQL一样就可以了。
3.Memcache分布式缓存服务
4.Storage分布式文件存储服务
5.KVDB分布式key-value持久化存储
6.Cron分布式定时服务
7.Image分布式图像处理服务
8.FetchURL分布式网页抓取服务
9.Mail分布式邮件服务
10.TaskQueue异步轻量级任务队列
11.DeferredQueue异步大任务延迟队列
12.Counter分布式计数器服务
13.Rank实时排行榜服务
14.Appconfig应用配置模块.
15.TmpFS本地临时文件读写模块
16.Wrappers文件读写兼容接口
17.XHProf.PHP调试工具.
Android Thread 退出的时候遇到了问题.无法 destory. 最后搜索到一个比较靠谱的文章. 说可以通过设置一个布尔变量来把 Thread 函数 return 掉就可以了.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
| class RingThread extends Thread {
MediaPlayer mPlayer;
Context mContext;
boolean flag;
public RingThread(Context context){
mPlayer = new MediaPlayer();
mContext = context;
flag = false;
}
@Override
public void run(){
Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
try {
mPlayer.setDataSource(mContext, alert);
final AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) {
mPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
if(mPlayer.isPlaying()){
mPlayer.stop();
mPlayer.reset();
}
mPlayer.setLooping(true);
mPlayer.prepare();
mPlayer.start();
}
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if(flag){
return;
}
}
public void stop_ringing(){
mPlayer.stop();
flag = true;
}
} |