技术小黑屋

Java程序员必读的9本书

本文列出的9本书在Java程序员界都是被认为很棒的书。当一个程序员开始初学Java时,他的第一个问题应该是如何选择一本书来作为指导学习Java。这个问题也就表明,相对于其他的教程和博客,Java书籍还是很重要的参考,主要表现在以下两点

  • 通常书籍是由比较权威的程序员来撰写的。
  • 相比其他媒介,书籍对于内容的描述更加详细,解释更加明确。

本文列出的九本书是我个人非常喜欢的Java书籍,当我有时间的时候,我就会将它们捧在手里阅读。甚至有些书我反复读过很多遍,每次重新读的时候总会有新的收获。因此这些书也是大部分Java程序员喜欢的书籍。

效率工具:强大的批量删除文件的脚本

最近打包服务器上的apk包又增多了,每次手动rm操作过于麻烦,于是花了几分钟写了一个可以对指定目录下根据最后修改时间和通配符匹配进行批量删除的脚本。将这个脚本加入crontab中之后,以后就再也不用担心多余的安装包占用磁盘空间了。

仿腾讯新闻样式的Toast

厌倦了网易新闻无处不在的喷子,尝试了一下腾讯新闻,果然顿时清净了很多,当然这不是重点。个人感觉腾讯新闻客户端的Toast比较不错,相对于系统默认的Toast,更加能起到提醒的作用。于是反编译了一下,简单分享一下,其实很简单。

Google为何这样设计OnSharedPreferenceChangeListener

之前使用OnSharedPreferenceChangeListener,遇到了点小问题,就是有些时候OnSharedPreferenceChangeListener没有被触发。最近花了点时间研究了一下,小做整理。本文将会介绍监听器不被触发的原因,解决方法,以及其中隐含的一些技术细节。

Android中WebView拦截替换网络请求数据

Android中处理网页时我们必然用到WebView,这里我们有这样一个需求,我们想让WebView在处理网络请求的时候将某些请求拦截替换成某些特殊的资源。具体一点儿说,在WebView加载 http://m.sogou.com 时,会加载一个logo图片,我们的需求就是将这个logo图片换成另一张图片。

点击网页链接调用Android程序

最近前端同事问了我一个问题,如何让网页链接实现启动Android的应用,网上有说重写WebView相关的shouldOverrideUrlLoading方法,但是这种理论上能实现,因为你的网页不是仅仅被你自己的webview来浏览,你需要做的是让市面上的浏览器支持才行。

这里利用零碎的时间整理一下。主要涉及到的问题就是关于Intent在字符串形式和Intent对象之间的转换。如果你是一位前端工程师,请让你的Anroid开发小伙伴来看这篇文章,一同解决问题。

Atom订阅转成RSS2.0

Octopress博客自带的只Atom协议的订阅,但是最近提交收录网站时,需要使用RSS协议。于是利用周末简单实现了一下。

Ruby执行shell命令的六种方法

在Ruby中,执行shell命令是一件不奇怪的事情,Ruby提供了大概6种方法供开发者进行实现。这些方法都很简单,本文将具体介绍一下如何在Ruby脚本中进行调用终端命令。

译文:理解Android中垃圾回收日志信息

如果你是一名Android开发者并且常常看程序日志的话,那么下面的这些信息对你来说可能一点都不陌生。

1
2
3
4
5
GC_CONCURRENT freed 178K, 41% free 3673K/6151K, external 0K/0K, paused 2ms+2ms
GC_EXPLICIT freed 6K, 41% free 3667K/6151K, external 0K/0K, paused 29ms
GC_CONCURRENT freed 379K, 42% free 3856K/6535K, external 0K/0K, paused 2ms+3ms
GC_EXPLICIT freed 144K, 41% free 3898K/6535K, external 0K/0K, paused 32ms
GC_CONCURRENT freed 334K, 40% free 4091K/6727K, external 0K/0K, paused 2ms+3ms

但是这些到底是什么,又有什么含义呢?

啰嗦一下android中的NetworkOnMainThreadException

相信很多Android开发者很多都遇到过android.os.NetworkOnMainThreadException 这个异常,意思就是主线程进行网络操作异常。这个问题比较简单,但是网络上有着鱼龙混杂的答案,这里想花点时间做一个比较完整的描述。

译文:Android中糟糕的AsyncTask

AsyncTask是一个很常用的API,尤其异步处理数据并将数据应用到视图的操作场合。其实AsyncTask并不是那么好,甚至有些糟糕。本文我会讲AsyncTask会引起哪些问题,如何修复这些问题,并且关于AsyncTask的一些替代方案。

AsyncTask

从Android API 3(1.5 Cupcake)开始,AsyncTask被引入用来帮助开发者更简单地管理线程。实际上在Android 1.0和1.1也是有类似的实现,那就是UserTask。UserTask和AsyncTask有着相同的API及实现,但是由于由于1.0和1.1的设备份额微乎其微,这里的概念就不会涉及到UserTask。

Google IO:Android内存管理主题演讲记录

翻出了3年前的Google IO大会的主题演讲 Google IO 2011 Memory management for Android Apps,该演讲介绍了Android系统在垃圾回收上的变化和如何发现并内存泄露以及如何管理Android中的内存。本演讲对开发者还是有很大的帮助。

目前全文内容为英文,但是大部分很容易理解。以下内容在原有基础上,进行了分段整理,更加便于阅读。

Note for Google IO Memory Management for Android

This is the subtitle for Google I/O 2011: Memory management for Android Apps.

The Video

The Subtitles

Hi everybody,

My name’s Patrick Dubroy and today I’m going to talk to you about memory management for Android. So I’m really happy to see so many people here who care about memory management, especially near the end of the day.

So let’s get started. So I’m sure you all remember this device. This is the T-Mobile G1. Hugo talked about it in the keynote yesterday. It was released about two and a half years ago. So, is there anybody here who actually developed on the G1? All right, impressive. That’s about maybe 40% of the room. So you may remember that the G1 came with 192 megabytes of RAM. And in fact, most of that was used up by the system. There wasn’t a whole lot left over for apps.

效率脚本:删除已经合并的git分支

使用Git管理代码工程,着实方便了很多,但是当做完feature分支或者完成hotfix之后,总是忘记删除这些无用的分支,一个一个地删除着实麻烦,重复手工劳动不符合程序员的风格,于是写了一个简单的脚本。一键删除那些不需要的分支,让多余的干扰信息离开视线。

人生苦短,让你的Git飞起来吧

git是一款超极优秀的版本控制工具,包括Linus大神的linux项目在内的千千万万的项目在使用。你可以使用Eclipse插件管理,亦可以使用终端工具。

git虽然有着svn不能匹及的本地仓库,但是和svn一样,和远程服务器通信也相当常用。常用的pull和push就是比较常见的命令。

然后,你是不是觉得从远程拉取(pull)到本地是不是很慢,从本地推到服务器端(push)又是不是很耗时呢,是吧,正所谓人生苦短,赶紧加速你的git吧。

译文:理解Java中的弱引用

不久之前,我面试了一些求职Java高级开发工程师的应聘者。我常常会面试他们说,“你能给我介绍一些Java中得弱引用吗?”,如果面试者这样说,“嗯,是不是垃圾回收有关的?”,我就会基本满意了,我并不期待回答是一篇诘究本末的论文描述。

然而事与愿违,我很吃惊的发现,在将近20多个有着平均5年开发经验和高学历背景的应聘者中,居然只有两个人知道弱引用的存在,但是在这两个人之中只有一个人真正了解这方面的知识。在面试过程中,我还尝试提示一些东西,来看看有没有人突然说一声“原来是这个啊”,结果很是让我失望。我开始困惑,为什么这块的知识如此不被重视,毕竟弱引用是一个很有用途的特性,况且这个特性已经在7年前 Java 1.2发布时便引入了。

腾讯云分析问题

今天使用腾讯云分析按照给出的文档开始集成,遇到了一个问题。

1
2
3
4
5
6
E/AndroidRuntime( 4606): FATAL EXCEPTION: pool-1-thread-1
E/AndroidRuntime( 4606): java.lang.NoClassDefFoundError: com.tencent.mid.api.MidService
E/AndroidRuntime( 4606):    at com.tencent.stat.j.run(Unknown Source)
E/AndroidRuntime( 4606):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
E/AndroidRuntime( 4606):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
E/AndroidRuntime( 4606):    at java.lang.Thread.run(Thread.java:864)

修改Linux系统时间的最简单方法

在Linux桌面发行版提供了设置系统时间的界面程序,这个设置很简单,但是当你学会了下面的方法之后,你就开始厌烦用GUI界面设置了。

最简单的设置方法 就是创建一个符号链接/etc/localtime,其指向目标设置的时区城市代表(/usr/share/zoneinfo/ 目录下)

细话Java:”失效”的private修饰符

在Java编程中,使用private关键字修饰了某个成员,只有这个成员所在的类和这个类的方法可以使用,其他的类都无法访问到这个private成员。

上面描述了private修饰符的基本职能,今天来研究一下private功能失效的情况。

WebView处理网页位置请求

随着移动设备的激增,LBS(Location Based Service)已然成为趋势,其最关键的还是获取设备的位置信息。native代码获取位置信息轻轻松松可以搞定,实际上网页获取位置信息也不是那么困难。

在HTML5中,提供了一套定位用户信息的接口,当然这个位置信息是通过客户端,准确说是浏览器获取的。

实时预览Markdown利器

使用MBP15寸有点高不成低不就,接显示器分辨率下降(浪费Retina屏),不接显示器屏幕不是很大。

常用的markdown编辑器设置为左侧编辑器(Editor),右边实时查看器(Viewer)。受制于屏幕尺寸,editor和viewer都显示不完整,于是尝试找一个浏览器渲染markdown文件的插件。于是就发现了markdown-reader。

利用WebView实现网页的i18n

软件如果想在全球获得更多的用户,国际化与本地化(internationalization and localization 简称:i18n 和L10n)是非常必要的。本文将介绍一个很geeky的方法来利用webview实现html的i18n。