Nitro Hsu

Food

今晚在隔壁哥们的协助下成功做了一道荤菜-土豆炖肉。虽然搬来半年有余也知道隔壁哥们是做酒店行业的但还真不知道是个厨子,所以见缝插针的请教了几招。肉菜配齐后结果在超市就是寻不到干辣椒,无奈只能借用隔壁的调料了。最终出锅,肉入味但还稍微有点欠火候。 对于我这种对肉没有兴奋点的人来说,一日三餐有无荤菜均可,但有些人如果一餐中没有荤菜便是索然无味,难以下咽。也好生奇怪,体胖的人多半喜欢吃肉所以恒胖,瘦子大体不是嗜肉之人也就不会太胖。体胖的人一直下定决心要减肥,但迟迟放不下味蕾与胃,也就只能在这条路上越走越远,胖者恒胖。 过年之前搬来新家大概有5个月了,仔细回忆了一下,我竟然就买过一次肉还是鱼肉,如果把鸡蛋也算作肉类的话应该也不超过5次,听之略有可怕,但每次去超市总不记得去买一些,应该就是习惯使然了。老爸来了之后,买菜做饭的事情便落到他头上,来了第二天晚餐就是蒜苔炒肉、土豆炒肉。下班回来看到桌上的饭菜竟然有些不习惯,便问老爸怎么每个菜都要有肉,老爸说看着冰箱里没有肉,估计你也不怎么吃,我来了就吃点吧。想来还是老爸了解我,小时候过来的一些习惯只有父母最懂你。从那天起我也算过上了隔三差五有肉吃的日
5 min read
Android

Android gradle 库工程多版本编译问题

android application project中对于debug、release类型不同的编译配置可以通过buildConfig文件实现分离,代码如下: debug { buildConfigField "String", "SUFFIX", "\"123\"" } ​ release { buildConfigField "String", "SUFFIX", "\"\"" } 但对于android library project(子module),目前的gradle plugin并不支持debug、release这样的编译类型,如果还是按照如上配置,默认release产生效果,debug被忽略。 android gradle文档是这样说的: For the rest, libraries behave the same as application projects. They have build types and product flavors, and can potentially generate more than one
1 min read
Android

微信扫码直接跳转前台实现

微信在Mac、PC、浏览器都实现了扫码登录的功能,过程如下: 当用户已经使用过一次扫码登录后可以直接点击“Log in via My Phone”,微信服务器会向App发送通知,调用确认界面,用户点击“确认在PC上登录微信”,App向服务器确认请求,服务器响应Mac、PC的登录请求成功。 其中微信Android客户端的一个环节为抢占式弹出确认界面,这个过程参与实现的几个要点:Service、PendingIntent,但是还有一个关键点就是如果微信App 处于前台如何抢占式的将确认界面置为task stack的最上面?如果此Activity如果已经位于stack的任意位置如何保证single in task而且还能置于栈顶? 最近在看Android官方例子才发现Intent其实已经提供了相关的Flag来解答这个疑问。 public static final int FLAG_ACTIVITY_REORDER_TO_FRONT = 0X00020000; Intent类中提供这样一个Flag,官方解释它的作用:当某个Intent增加这个Flag会导致将要运行的Activity从
2 min read
Android

Android View背景与Shape

某个view需要有点击、焦点、选中的背景反馈是一般使用selector设置各个状态时的背景色。每一个item设置纯色一般比较少见,比较多的是使用bitmap或者shape,如果是bitmap很好理解,状态变化时直接切换渲染的图片就OK,但比较好的方式是用shape自定义图形。 这样做有两点好处,第一能够减小APK包的大小,现在的App很多已经是20+M,对用户的更新造成诸多不便,所以保持App大小很重要,其次能够避免图片平铺拉伸的处理,虽然.9图片从一定程度上保证了屏幕尺寸的兼容。 Shape使用时要注意Padding标签。 在Shape XML中定义了Padding并且此Shape作为某个View的Background时,View就不需要再设置android:padding,因为两者会产生冲突。 源代码分析可见冲突点: View.java setBackgroundDrawable()主要读取Drawable的Padding来设置当前View的Padding ------ if (background != null) { Rect padding = sThreadLocal
2 min read
Summary

一里路一本书

前几天上班的时候看着同事在QQ群里聊Hi,凑近去一看原来是技术交流群,他略带点紧张我也报以微笑,大家就都明白了。回头一想,我倒也没有加入那么多的技术群,因为一来感觉意义不大,聊天海侃占大多数而且这些时间基本是在上班时间,二来真正当自己遇到技术问题是多数还是Stackoverflow、GitHub或者看源码解决问题,再者求职找工作这事也不是全靠技术群,互联网的专职招聘现在做的也是风生水起。翻看了一下自己的Q群,除了从小学到大学的同学群、老乡群、公司业务群、两个技术群,最后剩下的竟是两个读书群。而勾起回忆的也是这两个读书群。 每天朝9晚6的上班,对我来说朝9晚9也罢,总之生活规律了,这是毕业之后的一大改变,但当回到家吃完饭坐下来写会儿代码之后你会时间太快,而却又愈发空虚,除了代码自己竟找不到一丝存在感,每天面无表情郁郁不乐,除了与朋友会会面吃个饭...待续
1 min read
Summary

2015新年小记

前段时间由于VPS使用VPN的原因,导致域名被封,恰好又在APEC期间,所以导致博客无法访问,一气之下将VPS退掉了,博客备份好没再动,后来想想不能这么放弃了,又把老的域名 www.n2hsu.com重新启用,解析好后,一切顺畅了。 上周在公司又试了一下原来的域名www.nitrohsu.com结果又可以访问了,真心不知道墙到底在搞什么鬼,趁着周末有空又切换回原来的域名,Google Analysis、Goods Webmaster都需要重新配置一次。但惊闻Gmail被封的噩耗,再不也对这堵墙抱任何希望了。 匆匆忙忙地总结完自己的2014,回去上班还要继续写公司的工作总结,任务完成情况,部门评审一系列的年终总结就此开始。 回头才发现2014年自己的博文数量竟然停留在个位数,心中不免惭愧。而且干货还比较少。技术之路还需继续努力。 2015年的目标或许已经有两个了: * 博客别再长草,墙在于不在,别荒废了自己。 * 读书行路,2014年的书单也是寥寥可见,争取2015年读15本经典非技术书。 2015年的其他: * 学习一门新的编程语言; * 将Android技术向下
2 min read
Summary

写在2014-发现更大的世界

圣诞刚过,元旦马上就到。经历了一场洋节与传统节日之争后,大家一致认为这些都是商家的节日。与一群狐朋狗友在一起吃饭聊天嗨皮过节最好不过了,家人不懂我们的圣诞为何要以苹果祝福今夜,商家也只懂苹果圣诞一定要涨价,团购一家嗨吃店,订两张电影票,冬夜里也算在诺大的都市有了些许的存在感。酒店餐馆酒吧电影院,订不上房,没有餐位,没有连续的座位时存在感瞬间爆满,原来你不孤单,只是商家让你觉得这个世界没有你的存在,他们将不复存在。 平安夜那天公司互动礼物,作为天使要给抽到的国王一件礼物。当天在大群里,各种刷新爆棚,从吃的小蛋糕到围巾,从一盒鸡蛋到早早孕试纸条,各种刷新三观,唯独技术中心的各位同事思索良久不知送些什么为好,这里当然有我,回家想了想,零食吃过后满足了味蕾也没留下太多意义,男士送大龄女士(某部门总监)围巾也略不妥当,忽然一想送本书吧,OK,就此敲定,到某东上就买了本科普类的《数学之美》,第二天到货。同事还在愁眉苦脸想礼物时,我买的书已经送到,同事一看这书,惊呆了,数学!数学!大学最讨厌的课程或许就有数学吧,应该还有English,但我却自我感觉良好,科普读物应该还算中规中矩。委托前台送给国王
10 min read
Java

Java的位运算、移位运算

上个月在做蓝牙通讯协议实现时数据操作基本处于Byte级别,所以用到了大量的位运算,恰巧看到这篇简单而又容易遗忘的基础点,所以翻译一下,顺便熟悉熟悉。 -------------------------------------------------------------------------------- Java的位运算和移位运算非常强大,它可以在bit级别上使用int、long、short、byte以及boolean类型的数据,而且相比其他运算方式,位运算和移位运算的速度要快很多。但是很多Java程序员却对此了解不多,尤其时那些没有接触过C、C++语言的程序员。当然对于在学习Java之前已经了解了C、C++的程序员来说就没有那么陌生了,因为这些运算基本与C类似。 在许多面试题中也会经常出现这种运算题目。这个实例代码主要时为了快速的了解Java的位运算符之间的不同,以及如何使用他们,其次我们也会介绍一下无符号移位和有符号的移位运算。 基础 在介绍位运算和移位运算之前,你必须区分二进制、位、字节和位运算。良好的二进制运算基础对理解位运算将大有裨益。 1)二进制数据只会
2 min read
Android

Android 读取classpath路径下的文件流&证书问题

今天在读取HTTPS证书时遇到的一个问题,src文件夹下的cer证书读取始终为空。 经过对APK包反编译发现cer证书竟然一直没有打包进去,怎么可能?!之前一直都很正常的。最后把问题聚焦在了Android Studio使用的Gradle编译环境上,因为之前Eclipse下的编译环境都可以将src文件夹下的XML、CER等文件一并打包进去,但是Gradle却不是这么做的。 由于刚刚切换到Android Studio,对Gradle编译系统还不是特别熟悉,从Intellij工程配置到Gradle编译配置没有发现对src下*.class以外文件的特殊配置,无奈只能选择其他方法。 解决方法: 将cer证书文件放在assets文件夹下,assets文件夹会被编译系统打包到APK包内,并且处于Root Path级别。 InputStream caInput = this.getClass().getClassLoader().getResourceAsStream("assets/d.com.cer"); 这样就可以读取到证书文件。 可能还有其他方式读取类似这种文件,比如通过cont
2 min read
Translate

POP3协议 中文翻译

翻译:N2Hsu 校对:Nii Ma 3-基本流程: 首先,服务器启动POP3服务监听TCP 100端口; 当客户机要使用这个服务器上的POP3服务时,与POP3服务器建立一个TCP连接; 连接建立后,POP3服务器发送一条问候语; 客户机和POP3服务器就可以进行命令和响应的交互,直到连接关闭或终止。 POP3协议中的命令是一个不区分大小的关键字,后面可能会有一个或多个参数。所有的命令都以一对换行符结尾。关键字和参数都是可打印的ASCII字符。关键字和参数之间、参数与参数之间都用一个空格相隔。关键字为三个或四个字符。每一个参数的长度最长为40个字符。 POP3协议的响应包含一个状态指示码、一个关键字,后面可能会有一些额外的信息。所有的响应都以一对换行符结尾。每个响应的长度最长为512个字符(包含最后的换行符)。当前有两种状态指示码:正确响应("+OK")、错误响应("-ERR")。服务器必须发送大写的"+OK"和"-ERR"。 某些命令的响应可能会有多行。这种情况遵循如下约定:首先发送第一行和一个换行符,此后要发送的其他行都以一对换行符结尾。当所有的响应行发送完成以后
18 min read
Life

我们到底遇到了什么困难

最近手头的工作不是特别忙,临近年关了正好也做做总结。2013年的主要工作是一个移动互联网项目,其间还有一些零散的工作,比如现场实施、项目调研需求分析等等。从目前的情况来看,这个移动互联网项目如果是百分制,或许它还在四十五分的路上... 2012年10月份XX银行与我们正式接触,提出要做一个移动互联网方向的项目。此时的移动互联网概念正在整个业界蔓延,各大银行纷纷开始布局移动互联网,网银客户端终于有了iOS、Android版,微信也开始崭露头角,尤其是移动互联网公司越来越高的估值让每个人的心中不免骚动,都想在这一大潮中掘得一桶金。前景确实很美好,但在拿到需求说明书之后,也开始陷入了深深的思考。我们公司的主要方向就是金融行业,所以从业务角度考略完全没有问题,但之前的项目基本都是运行在内网环境下而且用户量极小,这与互联网项目相比不仅仅是开发语言、平台的差异,而是思维的转变与架构设计重建的问题。开发人员上,公司的主要开发人员是WEB方向,Android平台开发我一个人负责,UI/UE半把手凑合,iOS平台基础为0。虽然有这些困难需要解决,但是项目最终是签下来了。 项目初期目标是先出Andro
8 min read
App

嘟噜(Dulu)

嘟噜是一款针对新浪微博定制的客户端 * 优化的微博时间线,更加注重微博的重要性,不论它来自你的好友还是某个草根,你都可以无障碍的浏览阅读; * 界面简洁清新,保留最核心的功能,去除冗繁复杂的交互操作,只为阅读每一条有价值的微博; * 一键直达,发微博就要快,文字、图片、位置、表情、@某死党 统统都能搞定; * 根据网络状况优化图片加载,想看就看; * 支持Android 4.0以上; 更新: 2014-01-16 2.7.7 * 适配Android 4.4 * 增加Google Map、百度地图支持 * 重新设计微博发布器 * 增加超链接内部导航 * 增加图片缓存机制 * 修复个人关注数问题 * 修复导致崩溃的BUG
2 min read
Java

优化String StringBuffer

这篇文章主要介绍了一下String、StringBuffer对象在初始化和字符串连接时的优化,很不错。 -------------------------------------------------------------------------------- This topic illustrates the performance improvement techniques in String and StringBuffer with the following sections: * Overview of String and StringBuffer [https://www.nitrohsu.com/optimize-string-string-buffer.html#Strings101] * Better way of creating Strings [https://www.nitrohsu.com/optimize-string-string-buffer.html#Strings102] * Optimization by i
8 min read
Summary

写在2013

2014年还有几个小时就要来了,赶在这最后的几个小时总结一下自己的2013。 上幼儿园小学时,生活无忧无虑,小伙伴们在一块就是玩,在教室里本是学习但开小差那也是常有的事情,不用刻意记下今天是不是周末,因为每一天都是轻松而欢乐的; 后来上了中学大学,时间渐渐变成了用分来计算,6:30准时起床,8点整第一节课,22:30准时熄灯,此时的生活是规律的,按照规则来作息起居,偶尔的卧下而谈也会止于彼此的困意而息; 两年前换了一种生活方式,没有了鸣号的起床声,没有了小伙伴们挤在厕所门口等着Previous君蹲号出来一脸不舒服的样子,没有了三块五的肉夹馍,没有了鸡蛋灌饼来一个的吆喝,一切都变了,某个线程执行时间用微秒来衡量,双11准时开抢用秒来计算,还有一些十分诡异的公司早一秒没迟到后一脚扣掉200块钱,此时的生活用秒来定义。 2013,满满的31536000秒,惊喜、悲伤、挑战。 4.18---遇见你 紫色呢子大衣,红色包包,有点害羞腼腆,以至于坐下来了还有点紧张,就这样让我认识了你。刚过年那会儿,自己特别得瑟地默念了一遍:今年我24岁了,本命年,神马恋爱婚姻与我无关,因为按照老家习俗
4 min read
Android

Android CSS 渐变 阴影

CSS中线性渐变的方向可以通过角度或关键字来指定,渐变中间色可以叠加多个。 语法: linear-gradient([[ | to ],]?[,]+) 角度值表示:从0deg到360deg,0表示从下向上,90表示从左到右,顺时针方向旋转; 关键字表示:“to top”表示从下向上,“to right”表示从左向右; 第三个参数为起始颜色,后面第N个参数依次指定后续渐变颜色。 Android中线性渐变的方向只能通过android:angle属性来指定角度,渐变色最多为三个。 其中Android线性渐变的角度与CSS的方向并不一致,0表示从左向右,90表示从下向上,逆时针方向旋转。
1 min read
Android

Android 读取媒体库文件 4.4

Nexus 4更新Android 4.4之后Doplus无法发送图片微博,今晚修复了这个问题,记录一下。 获取图片资源是通过Intent来调用媒体库。示例如下: Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); startActivityForResult(intent, 0x01); Android4.4之前会默认调用Galley Provider选择图片,对应返回的URI是 content://media/external/images/media/65360 Android4.4则会调用Document Provider选择图片,在Document Provider整合了最近查看、内部存储器、SD卡、下载内容等本地资源,以及第三方的图片资源读取Provider比如Galley、Photos(Google+独立出来的图片应用)、Drive、Dropbox、Box、SkyDrive等等。 本地资源通过Document Provider选择后返回的URI如下:
2 min read
CSharp

C# 调用动态链接库

C#调用动态链接库主要是通过DllImport来实现的. 1. 在调用DLL的CS文件中引入using System.Runtime.InteropServices; 2. 将DLL拷贝至工程目录bin下的Debug或者Release文件夹内; 声明调用函数,以打开磁卡读写器为例:/* 丛指定的端口打开磁卡读写机 */ [DllImport("HCE300_API.dll", EntryPoint = "HCE300_Open", CharSet = CharSet.Auto, SetLastError = true)] public static extern int init(int ComPort); DllImport 指定要动态调用的DLL位置名称 EntryPoint 指定DLL内部函数名 CharSet 说明内部数据返回编码 SetLastError 确定在函数返回前是否调用Win32的SetLastError 下面是对应于Dll函数的自定义函数声明,一定要保证参数列表一致。如果再DllImport中指定ExactSpelling=true,函数名要与E
1 min read
Android

观察者模式 监听器

位置:platform/packages/apps/Contacts 位置:platform/packages/apps/ContactsCommon 1、观察者模式 com.android.contacts.ContactSaveService 事件源类集中处理联系人、用户组的增删改,处理这些数据Activity注册ContactSaveService.RegisterListener监听,当调用数据处理方法完毕后通知各自的监听器。 //定义接口 public interface Listener { //触发事件后通知方法 public void onServiceCompleted(Intent callbackIntent); } //监听器列表 private static final CopyOnWriteArrayList sListeners = new CopyOnWriteArrayList(); ​ //注册监听 public static void registerListener(Listener listene
2 min read
Android

Android 4.4.1即将来袭

根据AOSP的编译信息,12月5号Android4.4.1_r1已通过测试平台被发布出来。 Android4.4.1_r1的最新代码为KOT49E。 11月底,Nexus系列的设备包括Nexus4、Nexus7、Nexus10均已获得Android 4.4的OTA更新。但是很多网友随后发现,Nexus 4、Nexus7更新至4.4后并没有出现透明可隐藏的状态栏、导航栏(虚拟按键),通过ROM提取发现,Google没有将更新设备的Launcher切换到Android4.4后才发布的Launcher3而是继续使用原有Launcher2,仅将原厂ROM的Nexus5切换到了Launcher。不知道Google会不会在4.4.1更新中正式安装Launcher3. 小道消息称,Google Play版的HTC One将直接从Android 4.3升级至4.4.1,目前尚未得到Google或者HTC的官方确认。 其他手机制造商的Android 4.4可升级设备信息: 三星: * Samsung Galaxy S4 Active * Samsung Galaxy S4 Zoom
1 min read
Android

Android 4.4 沉浸式设计思考

Android 4.4对UI的一大调整就是沉浸式设计,所谓沉浸式设计就是状态栏、虚拟按键可以动态隐藏,这使得开发者可以100%的使用屏幕,以Nexus 4为例,之前的竖屏可用空间为1084x768(顶部状态栏高度64px,底部虚拟按键132px)。这其中的好处也不止一点,在玩全屏游戏时一直受人诟病的虚拟按键问题通过这一设计也得到了解决。 最近几天Google自家的应用都开始陆续更新加入了这一设计,Google Play Book是最先更新使用这一设计风格的App。 图1-全屏幕的空间使用 图2-全屏后点击阅读区恢复状态栏、虚拟按键 Google Play Book在进入阅读界面是图2,当用户点击阅读区域,触发沉浸模式,与此同时ActionBar、SplitContentBar隐藏,完全实现全屏阅读。 但是在使用换另外一种情况,这一设计就显得有点捉襟见肘。与Google Play Book类似但在用户点击阅读区域时不隐藏ActionBar,但继续调用SystemUIVisiblablity()隐藏状态栏,在这个过程中界面会出现一个中间状态,如图。 此时顶部状态栏会被移除,但是
2 min read
Google

谷歌眼镜以旧换新计划

谷歌针对2013年10月28号之前购买谷歌眼镜的用户提供以旧换新。 详细信息: 新版本都有哪些改变? 外观一样,质感一样,但还是有稍许的改进,比如速度更快、更加耐用,同时兼容即将发布的眼镜框。镜片、耳塞都已经是为新版眼镜设计的了,这些马上就会发布。 哪些人有资格以旧换新? 每一位在2013年10月28号之前购买体验版的用户都有资格。按照我们的贸易条款,眼镜只能被寄送到美国的地址。包括之前已经返还眼镜的体验用户也可以重新加入。关于重新加入体验,请 联系我们 [https://support.google.com/glass/answer/3079854]。 以旧换新计划需要等多久? 一旦计划开始执行,我们将会陆续给每一位用户发送邮件。在你收到邮件的60之内(截止到2014年1月5号)注册这个计划。在你收到回收盒的两周内,请将原眼镜尽快寄递给我们。 我可以换颜色吗? 可以,你有一次机会来更换其他颜色的眼镜。 什么时候能收到回收盒? 首先请确保你已经通过邮件的链接注册了这个计划,这个非常关键。当你想要的新版眼镜可以出货时,我们会通知你并且寄递给你一个放置老版眼镜的盒子。
2 min read
Android

Android 图片数组定义和读取

位置:packages/apps/Launcher2 1、图片数组定义、资源读取 如果有多张图片,这些图片的使用与顺序无关,可以采取这种方式。 drawable-nodpi中有3张图片,wallpaper_1.jpg、wallpaper_2.jpg、wallpaper_3.jpg XML中定义数组ID wallpaper_1 wallpaper_2 wallpaper_3 Java代码获取图片资源ID final Resources resources = context.getResources(); final String packageName = resources.getResourcePackageName(R.array.wallpaper); ​ String[] wallPaperNames = resources.getStringArray(R.array.wallpaper); ​ for(String
1 min read
Android

Android Activity 启动方式

在mainfest文件中,activity标签有一个属性launchMode,它确定了当前Activity在Task栈中的运行模式,共分为四种模式: * standard 如果在Activity标签中没有指明运行模式的话,系统会默认采用此种方式运行。 系统按照Intent的定义创建新的Activity实例并置入Task栈中。这个Activity可以被实例化多次,每一个实例可以放入不同的Task栈,同一个Task栈也可以包含多个Activity实例。 * singleTop 如果在当前Task栈的栈顶已经包含了这个Activity的实例,系统会将Intent信息通过onNewIntent()方法传入当前已经实例化的Activity中,而不是创建一个新的Activity实例。这个Activity可以被实例化多次,每一个实例也可以放入不同的Task栈,同一个Task栈也可以包含多个实例 (这必须满足一个条件,在Task栈的栈顶不存在一个Activity实例)。 举个例子,假设一个Task栈中包含根Activity A、Activity B、C以及位于栈顶的Activity D
3 min read
Android

Android Tasks and Back Stack

每一个Android应用都由多个activities组成,每一个Activity可以执行特定的action也可以打开其他的activity。举例说明,一个Email应用会有一个Activity来显示未读邮件列表,当用户点击其中一封邮件时,一个用来显示这封邮件内容的Activity就会被创建出来。 Activity甚至可以启动本机上其他应用的Activity。比如说,当你的应用要发送邮件时,你可以定义一个包含邮件地址征文等信息和发送消息action的Intent。与此同时另外一个应用的Activity被声明为可以执行这个Intent然后打开它。在这个过程中,Intent被定义为发送邮件,所以一个Email应用会启动并创建“写邮件”Activity,(当然,如果系统中包含多个可以支持此Intent的Activity,系统会弹出一个列表来供你选择)。当Email被发送出去后,启动这个Intent目标的Activity会被恢复,这就好像是发送Email的Activity是应用自身的一部分一样。通过将两个来自于不同的应用Activity放入同一个Task,Android完美实现了用户操作的无缝
5 min read
Android

Android 蓝牙模式定义 Activity运行方式

位置:platform/packages/apps/Bluetooth 位置:platform/packages/apps/Calendar 1、Bluetooth Profile 不同类型的蓝牙设备的通信依赖于各自Profile的定义。 Profile是在蓝牙通讯连接管理层之上为不同类型设备之间通讯而定义的一套描述规范。在Bluetooth 4.0之前主要有A2DP(Advanced Audio Distribution Profile)、HDP(Health Device Profile)、HFP(Hand-Free Profile)、HID(Human Interface Device Pro)、OPP(Object Push Profile)、PAN(Person Area Networking)、PBAP(Phone Book Access Profile),android原生系统的Bluetooth管理器均实现了上述Profile,在Bluetooth 4.
1 min read