Shell 中的一个坑(文件名带有空格时操作)

起因 今天本来想给 U 盘换歌,所以就直接把自己的网易云音乐下载的音乐拷进去,结果发现 U 盘的大小不够(最近比较穷,买不起3GB 以上的 U盘只能拿好多年前的3G U 盘先用着)。 差了400MB,想到车载电脑也放不了 flac 格式的音乐文件,所以就直接写脚本删除这些非 mp3 格式的歌曲文件。 初次尝试 于是按照之前的 allCode.sh 脚本,直接改了个 rmFileByExtension.sh…

MBanner2 项目(二)—编写可测试的代码、实例展示

接上篇的项目基本设计,这次主要是来说具体的实现。 编写可测试的代码 不管在之前的 MBanner 1.0 分支的版本中,还是在借鉴的 QingtingBannerView 中,测试这个环节始终是遗漏的一点。毕竟都是程序员,很少会进行测试驱动开发。所以这次为了解决这个问题,我这边采用了 Junit 进行了部分的代码测试。也是一种测试驱动开发的尝试吧。 具体以具体的代码为例【MBannerLine.java】: 在 1.0 的版本中,MBannerLine 的绘制逻辑和视图的绘画是杂糅在一起的。 protected void onDraw(Canvas canvas) {…

MBanner2 项目(一) — 基本设计

写这篇文章的一个出发点就是,对自己的 第一版本 非常的不满意,很多地方的解决思路不够优雅。换句话说就是基于 lib 的二次自定义非常麻烦。 所以才会开启 2.0 版本的开发(反正用的人也不会多,但是我比较喜欢抠细节)。 自定义程度不高主要体现在三方面: PagerViewAdapter 实现方式为 class,并不是接口,导致无法自定义 Adapter,从而绝了换 view 的路。 PageIndicator 实现方式单一,且无法改变。 代码的可测试性不强。(在安卓的组件中,这个问题还是挺棘手的) 总的来说,这只是个为了项目而催生的一个紧急替代品,并不能算得上是一个比较靠谱的开源库。所以 MBanner2…

MBanner 介绍

最近做了一个安卓项目,因为有个部分是需要实现一个可以展示标题和图片的 AD Banner。所以就同性交友网上(github)上找了一些案例。 作为一个安卓初学者,所以一开始就选用了 star 最多的那个。效果也很好,但是对方提出了一个需求,就是希望在图片上显示标题。做一个类似的蜻蜓上面的 Banner 效果。所以,就搜索到了 QingTingBannerView 这个项目。 这个项目的 star 数非常高。所以一开始认为是挺靠谱的一个。但是使用中发现了如下几个问题。 在执行 BannerView.setEntities 的时候,他并不是直接的将数组替换,而仅仅是做一个 append 操作。也就是说,当刷新的时候,3个 Banner 会变成…

如何实现 PHP 中的 Router

因为最近在写自己的 MFramework, 算是一个 PHP 的 web 框架吧。所以这个 Router 就是首先的一步。 首先看下 Kohana 框架的路由编写方式: Route::set(‘blogs’, ‘blogs/((/)(/))’)->defaults( array ( ‘controller’ => ‘blog’, ‘action’…

从一个问题开始谈秒杀业务场景

这个首先就是从一个知乎提问开始的。有一天我看到这么一个提问: 然后,排名第一的答案就是一个静态页面,一个告知用户当前访问人数过多,请稍后再试。当然,这在很多人看来都是一个笑话。不过,对于一个之前做过秒杀业务的人来说。这真的是一段非常精妙的代码,某种角度上来说,这可以解决90%的秒杀场景。不过,用户体验太差,尤其是那些看到 console 有信息就会高潮的人来说。 所以,这边就先抛砖,来讲下我对秒杀业务的理解。 对于秒杀来说,它和传统的商城系统有着本质的区别: 低廉价格 大幅推广 瞬时售空 一般是定时上架 流量时间短、瞬时并发量高 对于技术人员来说,我们其实常常会把注意力着重的放在第五点上,就是对于流量的处理。 其实,在我的观点里,初期就将全部的精力放在第五点的优化上,这并不是一个最优的解决方案。举个例子,12306售票系统。在第一版的时候,所有的火车票在同一时间点发售,导致服务器不堪重负,常常崩溃。虽然后来进行了紧急的优化,但是始终无法提供一个稳定的服务。但是,后来他采取了一个很巧妙的方法,将流量平分到一天的不同时间节点上,就是,不同票,不同发票时间。 当然,并不是说第五点的优化不重要。而是,既然可以通过业务上的手段,进行削峰操作,何乐而不为。 如果,对于不同的时间点,流量还是很大,那该如何。就如我的前东家。即使是每小时一次的秒杀,流量都极大。所以,这里就有很多的方法进行处理了。 这里就拿我的前东家的技术架构举例。 对于一个 request 请求来说,基本上是这样的一个流程: 最终的落脚点在…

Ubuntu 14.04 添加侧边栏启动图标

5月没写博客。于是,水一波吧。。。。这个月本来是在做一个安卓 APP 的开发,等结束了总结下吧。 有朋友遇到个问题,就是 Ubuntu 上下载使用火狐之后,左侧启动栏上的图标很难看。因为系统无法识别这个新启动的应用是属于什么类型的,它的启动图标是什么。 网上有其他的教程,比如这个:Ubuntu为eclipse添加快捷启动。 基本的思路确实是这样,因为 Unity 或者其他的 X-windows 都会基于 /usr/share/applications 中的启动项来进行图标的配置。 不过这样做有个弊端。就是如果将你下载的软件存放在个人目录下。比如 home,而在 applications 里面添加了启动器,那么就会有可能,其他用户无法使用这个 launcher。如果你说你的电脑上就你一个用户。那么,就不是问题。 而且,作为一个会使用和创造工作并且区别于其他动物的人,有能使用的工具,就必然会找到。…

一次 MySQL 调优经历

最近有一个朋友遇到一个问题,就是突然之间网站的响应时间变成了秒级,而且 MySQL 占用了大量的 CPU 资源。具体如下图: CPU 资源占用: 响应时间: 可以看到这一个很明显的异常值。所以,我就开始排查。一切都是常规的思路,连上服务器,然后看看当前都是些什么任务。 当前任务: 可以看到,基本上所有的 query 都是在等待表锁。然后查了下这张表的表结构,还有 select 和 update 的执行情况。 表结构: SELECT 语句执行情况:…