npm全局安装模块

第一次使用npm安装全局模块,本来以为会直接配置好环境变量的,但是npm有点不给力啊。

npm意为node package manager,用于管理nodejs的各种模块包,他的运行也依赖node,所以对系统底层的支持非常不好。
最简单的例子,就是安装过程中,如果没有使用sudo,显示的是node中的err,而不是终端中的提示。

npm安装模块

使用npm安装模块有两种方式

  1. npm install foo
    这种方式会把模块包下载到当前目录
  2. sudo npm install foo -g
    参数-g表示全局模块,安装在usr/local/lib/node-modules/下。

当使用node时,只会查看node_path和当前目录,所以如果没有配置环境,是没法使用全局安装的模块的。
这时,只要在/etc/profile.d下新建一个.sh文件,

1
export NODE_PATH=usr/local/lib/node-modules/

即可

分享到 评论

Notification Q&A

昨天(2014-11-23)第一次接触了安卓中的Notification,在实现Demo遇到了一些小问题。这里把其中一些记录下来,以供后人(我自己)参考

Q1:Notification为何物?

Notification,从字面意思而言,就是通知。通知会一直停留在通知栏中,并且按照优先级和时间排序。就比如别人在QQ中发给你一条消息,那么就会在通知栏中得到体现。
Notification还有一些额外功能,比如震动和提示音,或者持续提醒。

Q2:如何创建最基本的Notification?

如何发出Notification呢,首先构造一个Notification

1
2
3
Notification.Builder builder = new Notification.Builder(MyActivity.this);
builder.setSmallIcon(R.drawable.ic_launcher);
Notification notification = builder.build();

这里用Notification.Builer构造Notification,其中setSmallIcon是必要的,如果没有调用该函数,Notification不会出现。
构造完Notification后,使用NotificationManager激活Notification

1
2
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notification.notify("tag", id, notification);

相同的tag和相同的id,会使notification被替换,要注意

Q3:如何设置Notification的内容?

你可以在Notification中加入文字、替换图标,甚至是使用自定义的View。这里只讲标题和图标

  • setContentTitle()设置标题
  • setContentText()设置文字
  • setLargeIcon()会使小图标显示在右下角,并改变左边的大图标图标
  • setContentInfo在小图标旁边的文字
  • setNumber在小图标旁边的数字

使用这些方法,就能改变Notification的内容。

Q4:怎么让Notification“BIU”的一下跳出来?

这里提供一些方法,让你的Notification引人注目。

  • setTicker()激活时,会占满整个通知栏
  • setVibrate()激活时震动
  • setSound()激活时播放声音
  • setLight()激活时闪光
    后面三个方法可以用setDefaults()来简单实现

Q5:怎么让通知栏中的Notification一点就消失?

通常情况下,Notification需要NotificationManager的cancel()方法进行消除。
如果需要让他一点就消失,需要为Notification设置autoCancel。
autoCancel设置完之后,仍需要setContentIntent,autoCancel才会生效。

分享到 评论

模仿FAB制作悬浮按钮

Android 5.0新增了悬浮按钮(Floating Action Button)的特性,例如,在一个通讯录悬浮着一个“新增”按钮,表明新增联系人,非常醒目。这里,我们尝试模仿一个悬浮按钮。

一、布局

悬浮按钮,悬浮就是他的一大特色。为了实现悬浮,就要在布局上做文章。
布局父元素应该是RelativeLayout或AbsoluteLayout,后者过于落后,可以无视。
利用RelativeLayout将他固定到右下角即可。

二、外观

悬浮按钮的外观有两个要求:1、圆形,2、阴影。圆形可以用shape实现,但是阴影呢?
这里,我们使用新出的CardView,允许使用圆角,自带阴影,是不错的选择。

1
2
3
4
5
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="48dp"
android:layout_height="48dp"
app:cardCornerRadius="24dp"
app:cardPreventCornerOverlap="false"

这样大概就可以了。最后的preventCornerOverlap默认设置为true,设置为false可以将CardView内部撑满。

三、触摸反馈

既然是一个按钮,那么按下去时必须要有反馈。这里我们使用selector,为通常状态与按下状态分别分配一个按钮的背景。
一个状态设置android:state_pressed="true"属性,另一个则相反。
最后往内部加入几个图案,一个悬浮按钮就完成了。

分享到 评论

为Ubuntu安装jdk

电脑新装了Ubuntu,需要把以前的开发环境都换一遍。在安装AS的时候,遇到了需要jdk的问题

方案一:openjdk

openjdk是sun于07年发布的开源jdk,因为其开源,所以能在ubuntu社区中找到,安装方式也十分方便。

安装方式:

  1. 打开terminal
  2. 运行sudo apt-get install openjdk-8-jdk

没错,就是这么简单,只要一行命令。openjdk除了openjdk8外,还有6与7版本,以供选择。

但是他也有局限性,openjdk6是sun在07年发布的,但是java7于2011年发布时,sun已经被oracle所收购,java7的一部分为oracle编写的,那一部分代码没有开源,不能放入openjdk。也就是说,10年后openjdk的一部分是缺失的。
为了关键时刻不出岔子,还是装一个oracle-jdk比较稳妥。

方案二:oracle-jdk

  1. 去oracle官网下载jdk:地址
  2. 下载好压缩包,提取到任意位置。
  3. 在/etc/profile.d目录下加入新的脚本。该目录会在每次开机时自动执行目录下的所有脚本。
    脚本内容如下,后缀名.sh

    1
    2
    3
    4
    export JAVA_HOME=爱填啥填啥
    export JRE_HOME=$JAVA_HOME/jre
    export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
    export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
  4. 重启后执行命令
    java -version
    查看是否配置成功

分享到 评论

Java中static块的用法

平时使用static关键字时候,动机很单纯,这个类里需要一个全局常量。这个常量如果是基本类型还好,如果是某个类呢。这时,可以用static块对全局常量进行初始化

static块

static块内的代码,在类被第一次加载、并且所有static常量初始化完成后,被执行。
static块只在类被加载时执行一次,之后不会再被执行。
多个static块会按照顺序执行,互相之间并无冲突。

例子

类中有全局的ArrayList,里面存有3个Integer,分别是1、2、3。

1
2
3
4
5
6
7
public static final ArrayList<Integer> INTEGER_LIST;
static {
INTEGER_LIST = new ArrayList<Integer>();
INTEGER_LSIT.add(1);
INTEGER_LSIT.add(2);
INTEGER_LSIT.add(3);
}

这样就完成了对INTEGER_LIST的初始化。

分享到 评论

Java中正则表达式的搜索行为

正则表达式中有三个标志,可以指定搜索行为。这次来分别介绍一下

三种标志

  • 标志g
    global,全局标志,会匹配全文中所有符合的匹配
  • 标志i
    ignore case,无视大小写
  • 标志m
    multible,多行

使用方法

(?i)表示开始
(?-i)表示结束<可选>
例:(?i)book 可以匹配 BoOk

分享到 评论

Java中的几何库

最近因为手头的项目需要处理几何问题,自己写又太麻烦了,所以去找基于Java的几何库。大多数都是基于C++的,有点难找

java.awt.geom

  • 简介:这不是几何库,这是个几何图形库

Esri Geometry API

  • 地址:github
  • 简介:Esri是一家GIS服务提供商,该公司制作的api,主要解决地理信息的处理中,遇到的拓扑问题。
  • 功能:数据传输,多边体的二元操作
  • 结论:我的项目要处理的只跟简单几何图形有关,像是圆和三角形,但是这个api连直线都没有,只有多段线。所以果断弃用。

JTS Topology Suite

  • 地址:sourceforge
  • 简介:一个用于支持名为GEOS的开源GIS系统的几何库
  • 功能:建立几何模型,多边体的操作
  • 结论:该库为了支持GEOS,规模十分庞大,功能十分齐全。但是这也是个问题,我找了半天,都没找到怎么求两直线的交点,他实在是太大了。对于我这种小项目,还是不要用他的好。

javaGeom

  • 地址:sourceforge
  • 简介:一个简单的对2D/3D几何图形进行计算的几何库
  • 功能:处理2D/3D图形间的简单操作
  • 结论:很不错,对于我这种不用太高深功能的小项目,这些正好
分享到 评论

将菜单加入ActionBar

现在很多安卓应用在ActionBar最右侧都有个“溢出按钮”,非常方便。这次学习了如何将菜单项与菜单加入ActionBar。

加入菜单项

res/menu目录下,在*.xml文件中,可以给item标签添加android:showAsAction属性,值为ifRoom,菜单项就会加入ActionBar

加入子菜单

在已经添加android:showAsAction属性的item中,再添加一个menu子元素,即可实现在

分享到 评论

Windows在当前目录打开命令窗口

  1. 打开文件资源管理器,进入目录
  2. 在空白处shift + 右键,选择在此处打开命令窗口
分享到 评论

AndroidStudio常用快捷键

  • Ctrl + Q:查看文档
  • Ctrl + P:查看参数
  • Ctrl + O:重写超类函数(Override)
  • Ctrl + / :插入注释行
  • Ctrl + Shift + /:插入注释块
  • Ctrl + Space:代码完成
  • Alt + Insert:函数生成器
  • Ctrl + Alt + T:插入代码块
  • Ctrl + Alt + O:优化import
  • Ctrl + Alt + L:格式化代码
分享到 评论