Mac终端常用命令

记住这些终端命令并应用起来,会带给你诸多便利。

Mac osx系统采用Linux文件系统.

所有文件都挂载到更目录下,没有磁盘分区的概念;
区分大小写,A.txt和a.txt是不同的文件;
文件通配符为星号 *

/和./

/表示根目录,./表示当前目录,
例如,列出根目录下文件用命令:ls /
列出当前目录下文件用命令:ls ./

df和du,查看文件夹/文件大小

查看一级文件夹大小、使用比例、档案系统及其挂入点,但对文件却无能为力: df -h
参数 -h 表示使用「Human-readable」的输出,也就是在档案系统大小使用 GB、MB 等易读的格式。
查看文件及文件夹的大小 : du

取得root权限

sudo -s
输入时不会有任何提示,只管输完后按回车键

查看摸个命令的使用说明

man 命令
如:man find

Tab键,自动补全

如想输入 : cd /Users
只需要输入: cd /Us 按Tab 会自动补全为 :cd /Users

基本命令

列出文件
ls 参数 目录名
例如: ls -wla /Users/zhangdan/blog
参数:-w 显示中文,-l 详细信息, -a 包括隐藏文件

新建文件夹
mkdir 文件夹名称

查找文件
find . -name 文件名
例如查找文件 android-interact.sh
find . -name “android-interact.sh”

切换目录
cd 目录名

拷贝文件
cp 参数 源文件 目标文件
例如 : cp -r newtest ./backup
复制当前路径下文件夹newtest 到当前路径下文件夹backup中
参数 -r 表递归

删除
rm 参数 文件名
例 删除当前路径下backup中文件夹newtest和其下的所有文件: rm -rf ./backup/newtest
参数 -r 递归; -f 强制

移动
mv 源文件 目标文件夹

更改文件权限
chmod 参数 权限
例:把驱动目录下所有文件设定到root读写,其他用户只读
chmod -R 755 /System/Library/Extensions
参数R 表示递归,755表示各用户的权限

获取当前路径
pwd

文件编辑
nano 文件名
编辑完成后 用 Ctrl +O 存盘,Ctrl+X 退出
另一个文本编辑软件是 vi

执行脚本
sh 脚本文件
例如:
终端运行命令:nano ./delete
粘贴下面内容到文件delete
rm -rf /Users/zhangdan/Desktop/test
Ctrl +O 存盘,Ctrl+X 退出
终端运行:sh ./delete
桌面上的test文件夹将被删除

比较两个目录的内容
dircmp dir1 dir2

比较两个文件的不同
diff file1 file2

在文件中按模式查找
grep “^[a-zA-Z]” filename

统计文件的字符数、词数和行数
wc filename

显示进程当前状态
ps u

终止进程
kill -9 30142

显示当前设备时间
date

列出最近执行过的 几条命令及编号
history

显示操作系统的有关信息
uname -a

清除屏幕或窗口内容
clear

显示当前所有设置过的环境变量
env

列出当前登录的所有用户
who

显示当前正进行操作的用户名
whoami

显示文件系统的总空间和可用空间
df /tmp

查询磁盘使用情况
du -k subdir

显示当前系统活动的总信息
w

Weex学习索引

简介

Weex的口号是“Write once, run everywhere”,支持iOS、安卓、YunOS及Web等多端部署,
能够完美兼顾性能与动态性,让移动开发者通过捷的前端语法写出Native级别的性能体验。
开发者只需要在自己的APP中嵌入Weex的SDK,就可以通过撰写HTML/CSS/JavaScript来开发Native级别的Weex界面。Weex界面的生成码其实就是一段很小的JS,可以像发布网页一样轻松部署在服务端,然后在APP中请求执行。

官方首页

学习资源

android例子

weex基本原理

提前了解:

weex使用入门

js css基础补充

推荐开发工具

Android之代码性能优化

对于占用系统资源,两条基本原则:不要做不必要的事;不要分配不必要的内存。

1. 避免建立对象

对象都需要占用系统内存。除非必要,应尽量避免创建对象实例。

Primitive数据类型内存占用情况(单位:Byte):
byte 1 ;short 2 ; int 4 ; long 8; float 4;double 8 ;boolean 1 ;char 2

例如 long[] data = new long[100]
占用内存8*1000 Bytes ,data本身是一个Object,也需占用内存。

Java中一个引用占4byte ,在32位系统上
Object obj=null; //4byte
Object[] objs=new Object[1000]; //至少4*1000byte

一个对象使用的内存量,需要将所有实例变量使用的内存与对象本身的开销(一般是16个字节)相加。这些开销包括一个指向对象的类的引用、垃圾收集信息以及同步信息。另外,一般内存的使用都会被填充为8个字节的倍数。
一个Integer对象会使用24字节(16个字节的对象开销,4个字节用于保存它的int值以及4个填充字节)。
注明:64位操作系统对象开销为16,引用为8;32位系统,对象开销8,应用为4Bytes

2. 使用本地方法

3. 使用实现类比接口好

4. 避免使用内部的getter/setter方法

5. 优先使用改进的for循环,在性能要求苛刻的Arraylist迭代中,考虑采用手写计数循环。

6. 避免使用枚举,

7. 避免使用浮点数。Android设备中,通常浮点数比整数慢两倍

8. 避免深度继承:子类的构建会导致父类的递归构建

9. 谨慎使用异常,且不要在循环中使用try/catch

10. 慎用static

尽可能将常量定义为static final类型:当没有final修饰时,即为变量,访问时通过地址字段查找,取得具体内容;而常量不需要经过查找
例如 :static final int intVal=10; //引用intVal的代码,将直接调用整型值10

11. 使用局部变量

调用方法时传递的参数以及在方法中创建的零时变量都是保存在栈(stack)中,速度较快。其他变量都在堆(Heap)中创建。

12. 乘法和除法用移位操作符代替:左移 <<1位相当于乘以2

13. 集合类

  • 非线程安全的性能较好。Vector , HashTable 是线程安全的,ArrayList和HashMap不是
  • Iterator遍历比直接遍历慢
  • LinkedList插入和删除元素比ArrayList快
  • 固定长度的集合数组较高效:Vector的默认存储能力为10个元素,每次扩展长度时默认自动加一倍,ArrayList是原来的50%。每次扩展,需要将所有现有元素复制到新空间,原先的数组再被回收,比较费时。

14. I/O操作优化

  • 字节流性能优于字符流操作:基于字节操作的I/O接口:InputStream和OutputStream;字符:Writer和Reader
  • 使用缓存优化性能(BufferedInputStream,BufferedReader)
  • 及时关闭I/O流,释放资源

15. 字符串连接使用StringBuffer/StringBuilder(后者非线程安全,性能更好)

16. System.arraycopy()代替通过循环复制数组

17. 避免在循环中调用同步方法

18. 使用条件操作符代替简单的if语句

19. 强引用、弱引用、软引用、虚引用

20. 用static修饰的变量属于类,生命周期很长,应尽量避免static成员变量引用资源消耗过多的实例;Context尽量使用application context;使用弱引用代替强引用,如可以用WeakReference mContext

21. 线程的生命周期不可控,需谨慎对待

22. 图片资源注意及时recycle,压缩减低内存消耗,巧用软引用

23. Cursor及时close

24. onTouchEvent 方法Action_move 事件处理频率控制

25. ListView充分使用缓存机制

26. Android TraceView + MemoryAnalyzer 分析内存使用情况

  • TraceView使用:在DDMS中选中线程,单击“Method Profiling”(stop按钮的左边),…,单击“Method Profiling”按钮停止。然后会相应窗口会弹出
  • 导出heap信息.hprof,在sdk的tools命令下,命令行执行如下命令,讲导出的hprof文件转换成MemoryAnalyzer支持的格式:hprof-conv .hprof newfile.hprof

转载请注明出处

http://andr112.github.io/2016/07/28/Android%E4%B9%8B%E4%BB%A3%E7%A0%81%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/


原文地址
MemoryAnalyzer下载
Java内存占用参考文献1
Java内存占用参考文献2

2016个人阅读书单

读书是让自己长知识明事理的一种很好的途径。可是,我们的大脑不大能记住很多东西。很多时候看过的学过的随着时间的流逝就会逐渐模糊忘记。好些时候一本好书看过了,想再翻来 看看时,书名都不记得了。挺遗憾的,甚至还会对自己懊恼一会。每年列个书单,这样的情况应该就可避免了。

值得推荐

  • 《我看电商》黄若

    电子商务日益发展对我们的生活已产生很大影响。本书推荐给所有从事互联网或电商运营的企业和个人、投资电商或服务电商的相关业界人士、有志进军电商领域的年轻学生、创业者

  • 《从你的全世界路过》张嘉佳

    作家、编剧张嘉佳于2013年编著。该书以故事的讲述方式,讲述33个真实的爱情故事。

  • 《灵魂有香气的女子》李筱懿

    民国时期26位女神的故事。一本揭穿人生的启示录。有张幼仪 林徽因 唐瑛 江冬秀 宋美龄 孟小冬 胡蝶 潘素 孙多慈 ……

  • 《三体》刘慈欣

    系列长篇科幻小说,以文化大革命为背景、叶文洁、“红岸工程”、游戏与现实世界、科技和环境保护,还有对文明、人生观的思考

  • 《你在天堂里遇见的五个人》(美)米奇.阿尔博姆

    故事的讲述视角很独特,是一本积极的,强调爱和生活的书,同时一定程度地揭示了人生活处境的无奈。

不推荐

一个ListView有关数据设置和刷新问题

问题描述

当数据变化是,没调notifyDataSetChanged方法刷新控件,滑动列表,就会报错如下

java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. Make sure your adapter calls notifyDataSetChanged() when its content changes. [in ListView(2131559716, class android.widget.ListView) with Adapter(class kr)]
at android.widget.ListView.layoutChildren(ListView.java:1562)
 at android.widget.AbsListView.onTouchMove(AbsListView.java:3919)
 at android.widget.AbsListView.onTouchEvent(AbsListView.java:3788)
 at android.view.View.dispatchTouchEvent(View.java:8444)
 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430)
 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2158)
 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2436)
 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2178)
 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2436)
 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2178)
 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2436)
 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2178)
 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2436)
 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2178)
 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2436)
 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2178)
 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2436)
 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2178)
 at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2386)
 at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1727)
 at android.app.Activity.dispatchTouchEvent(Activity.java:2764)
 at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2335)
 at android.view.View.dispatchPointerEvent(View.java:8655)
 at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4238)
 at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4094)
 at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3635)
 at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3694)
 at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3660)
 at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3773)
 at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3668)
 at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3830)
 at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3640)
 at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3694)
 at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3660)
 at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3668)
 at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3640)
 at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5940)
 at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5908)
 at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5872)
 at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6030)
 at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:211)
 at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
 at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:197)
 ....

问题代码

public class VideoBroadcastViewsHolder {
......
private ListView mMsgListView;
private List<VideoBroadcast> mMsgDatas;
private BroadcastMsgAdapter mBroadcastMsgAdapter;
...
...
private void updateMsgList(VideoBroadcast videoBroadcast) {
    if (TextUtils.isEmpty(videoBroadcast.getMsg())) {
        return;
    }
    if (mMsgDatas == null) {
        mMsgDatas = new ArrayList<>();
        mBroadcastMsgAdapter = new BroadcastMsgAdapter(mContext,mMsgDatas);
        if (mMsgListView != null) {
            mMsgListView.setAdapter(mBroadcastMsgAdapter);
        }
    }
    mMsgDatas.add(videoBroadcast);
    toRefreshListView(RefreshDelayedTime);
}
 private void toRefreshListView(long delayedTime) {
    if (mMsgListView != null) {
        if (mListRefreshRunnable != null) {
            mMsgListView.removeCallbacks(mListRefreshRunnable);
        }
        DebugLog.d("VideoBroadcastViewsHolder", "toRefreshListView isListViewTouching : " + isListViewTouching + " ,delayedTime :" + delayedTime);
        if (isListViewTouching) {
            return;
        }
        if (System.currentTimeMillis() - mLastListRefreshTime >= RefreshIntervalTime) {
            mMsgListView.post(new ListRefreshRunnable());
        } else {
            mListRefreshRunnable = new ListRefreshRunnable();
            mMsgListView.postDelayed(mListRefreshRunnable, delayedTime);
        }
    }

}
......
}

public class BroadcastMsgAdapter extends BaseAdapter {

// 上下文
private Context mContext;

private List<VideoBroadcast> mDatas;

public BroadcastMsgAdapter(Context context ,List<VideoBroadcast> datas) {
    mContext = context;
    mDatas = datas;
}
...
}

问题分析

当列表适配器直接用的是外面传递进来的列表时,外围列表的管理者对列表进行数据增减,使其数据发生了变化,但应某种原因或者采用的具体策略,没及时通知适配器,在这中间时段,如果用户滑动列表,系统就会报错。

个人建议

让适配器拥有自己的数据列表,这样就可避免类似问题。数据的使用者使者拥有和管理自己的数据,降低耦合性,遵循代码设计原则。

简单修改后,适配器代码如下:

public class BroadcastMsgAdapter extends BaseAdapter {

// 上下文
private Context mContext;

private List<VideoBroadcast> mDatas;

public BroadcastMsgAdapter(Context context) {
    mContext = context;
    mDatas = new ArrayList<>();
}

public void setDatas(List<VideoBroadcast> datas) {
    if (datas != null && datas.size() > 0) {
        mDatas.clear();
        mDatas.addAll(datas);
    }
    notifyDataSetChanged();
}
...
}
  • 适当调整使用的地方,问题就OK了。*

小问题,通常都不好定位,需要自己平时注意小细节,培养良好的编程习惯。写代码时,多遵循设计原则!

attr属性重复的问题

编译报错,Error:(2) Attribute “**” has already been defined ,例:

/Users/zhangdan/Documents/dev/HaiTao_Android/app/src/main/res/values/colors.xml
Error:(2) Attribute "icon" has already been defined
Error:(2) Attribute "title" has already been defined

编译系统告诉我们,属性”icon”被定义过;属性”title”被定义过,并告诉我们是在“../colors.xml” 文件中

解决办法

  1. 找到它 “**”(例子里是 “icon” ,”title”)

    • 通常建议在系统报错信息给出的文件里面,用find搜索一下。(通常找不到,我这次就没找到,编译系统也会忽悠人哦)
    • 直接找attrs.xml文件看是非有报错属性
    • App里资源文件很多,可以每个文件都找一篇,建议用全局搜索字符
  2. 修改它

    既然是已经被定义过了,重复了,那就改个别的名吧,并相应修改所有使用它的地方

更改前:

<declare-styleable name="PurchaseNoteView">
<attr name="icon" format="reference"/>
</declare-styleable>

更改后:

<declare-styleable name="PurchaseNoteView">
<attr name="purchaseIcon" format="reference"/>
</declare-styleable>

名称通常加个相关前缀就不大会重复了。改好名称后,记得把相关用到的地方都一并改过来,再编译就OK了


转载请注明出处:

http://andr112.github.io/2016/06/20/attr属性重复的问题/

个人博客搭建for Mac (Github+Hexo)

几年开发下,总觉得自己知识零零散散的,没有什么经验、学习研究、知识梳理概括等相关文字性的输出;很多遇到过解决掉的问题、学过的或者做过的,时间一久,自己都忘了;再则,工作中直来直去的交流,语言组织能力也是下降了不少。弄个博客写写,既可以把一些有用的东西分享给他人,也方便自己随时翻来看看。

为什么是Github+Hexo

GitHub是一个利用Git进行版本控制、专门用于存放软件代码与内容的共享虚拟主机服务。
Hexo是一个基于Node.js的静态博客程序,可以方便的生成静态网页托管在github上。
这里我们可以通俗简单地理解为GitHub是博客容器,Hexo是帮助我们制作博客的工具。

如何搭建

Homebrew安装

Homebrew是一款自由及开放源代码的软件包管理系统,用以简化Mac OS X系统上的软件安装过程。
终端运行 : ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”
,回车键。SO EASY!

  1. Honebrew官网
  2. 安装详细文档

利用Homebrew安装Node.js

终端运行: brew install node

利用Homebrew安装Hexo官网链接

终端运行: npm install hexo -g

安装成功后,创建博客所属的文件夹

终端运行: hexo init “YourDirName”
//执行init命令初始化hexo到你指定的目录

生成静态网页

终端运行: hexo generate
//自动根据当前目录下文件,生成静态网页, (hexo g也行)

将该静态网页运行在本地服务器

终端运行: hexo server
//运行本地服务 (hexo s也行)
在浏览器里面输入 http://localhost:4000
//就能看到有一篇Hello World博文在上面,是hexo安装后自动生成的。

以上,我们已经把Hexo帮助我们制作博客的工具环境搭建好,我们已经可以利用工具生产自己的本地静态(自己电脑上能看见,别人还访问不到)博文。

创建新博文

终端运行: hexo new “YourPostName”
//YourPostName为你创建的博文名称。
创建成功后,终端提示:INFO Created: ~/source/_posts/YourPostName.md的提示。
open ~/source/_posts/ 可以找到 YourPostName.md文件,这个文件就是我们博文的原始文件,好比画纸,我们在上面画什么我们的博文就展示什么。可以用Xcode打开和编辑该文件,或者用软件sublimetext。博客编写有一定的格式规则,如Markdown,学习参考链接
每次编辑完后,
终端运行: hexo generate
//生成静态网页
终端运行: hexo server
//运行本地服务
在浏览器里面输入 http://localhost:4000
//就能看到新编辑的博文

剩下就是如何把我们的博文放到我们的GIT容器里了,以便让其他人也可访问到我们的博客

首先,在我们电脑上装上GIT工具

利用Homebrew安装git

终端运行: brew install git
如果Mac上已经安装过git了,这一步略过。
我之前先装的Xcode再装的git,记得是下的安装包装的,所以我电脑上已有git工具,这里不需要再重新装过。

需要一个github账号,创建一个仓库New repository,名称为你github用户名.github.io

如果没有账号,那就注册一个,Git官网

其次,配置github账号仓库地址到我们的Hexo,或者进行GIT标准配置。

这里介绍直接仓库配置
打开 初始化hexo过的文件夹YourDirName下的_config.yml文件,文件最底部

deploy:
type:
改成
deploy:
type: git
repository: https://github.com/yourGithubName/yourGithubName.github.io.git
branch: master

博文部署到github

终端运行: hexo deploy

OK啦,统统搞定,浏览器输入yourGithubName.github.io就能看到你自己的blog了


以下内容不是必须,算是为博客锦上添花

  • 主题更改

    如果不喜欢默认的主题样式,可以进行个性化设置

Hexo官网提供了很多主题,供大家根据自己的喜好对主题进行修改。主题直接下载网址.

如何设置

在Hexo的初始化目录(“YourDirName”)下对喜欢的主题进行克隆,或者把克隆好的主题拷贝到该目录(“YourDirName”)的 themes 文件夹下.然后,找到并打开目录(“YourDirName”)下配置文件 _config.yml ,修改主题为你所选择的主题。具体操作:

git clone git@github.com:yunlzheng/hexo-themes.git themes/writing

#在./_config.yml,修改主题为writing
theme: writing

转载请注明出处:

http://andr112.github.io/2016/06/16/个人博客搭建for-Mac-Github-Hexo/
.
.
.


参考链接