最近miui有个坑爹的设计, 就是使用adb从电脑端安装应用的时候会弹出一个提示,
询问是否同意安装, 之所以坑爹是最近的版本把关闭这个功能的选项取消了,
导致每次调试应用都要手动点击同意安装, 解决方法:

需要的东西

root
任何可以管理手机根目录下文件的文件管理器, 比如RE文件管理器

位置以及修改

用RE管理器进入以下目录:

1
/data/data/com.miui.securitycenter/shared_prefs

用RE管理器的编辑模式(默认是查看模式)打开这个文件:

1
remote_provider_preferences.xml

找到下面这句:

1
2
3
4
<boolean name="perm_adb_install_notify" value="true" />
# 将其中的"true"修改为"false"
# 修改后为:
<boolean name="perm_adb_install_notify" value="false" />
阅读全文 »

插件简介

javacomplete2

syntastic

问题

问题1

当使用javacomplete2(以下简称jc2)补全非项目java文件时,
也就是说编辑的文件不是eclipse,gradle,maven等管理的项目中的文件,
这时如果是单个文件还没有什么问题,但如果是两个或两个以上,
相互关联的文件(如:A文件中new到了B文件中定义的类),jc2就会力不从心,
因为jc2不知道所有源文件的位置,以及CLASSPATH应该如何设置,
如果是项目文件jc2可以利用项目的配置文件来处理上述问题.

问题2

这个问题已经在最新版本中解决了!

阅读全文 »

下载

首先感谢开发者:
https://github.com/drcoms/drcom-generic
这个项目基于python实现了d,p,x版drcom认证,请到上述链接查看相关信息,
项目的wiki简单介绍了各版本的使用方法.

首先下载上面的drcom-generic,我将其下载到了家目录~/下,完整目录:~/drcom-generic

取得必要信息

下面启动到windows,或者找一个有windows系统的电脑,因为需要知道官方的drcom客户端是连接的哪个服务器,
以及其他信息,用来配置drcom-generic

在windows下安装上一个软件: wireshark
这个软件很好找,就不说怎么安装了,安装好之后,如果你现在使用drcom上网的,
那么就退出drcom客户端,也就是注销登录(这一步是必须的)

然后打开wireshark, 软件会列出有所有的网络适配器,我用的是无线网,适配器名称时:”无线网络连接”,
只有已连接网络的适配器会有数据波动,如图所示:
list

双击已连接网络的适配器,本例中是第二项”无线网络连接”,然后wireshark就开始记录这个适配器的数据了,

现在打开drcom客户端,输入账户密码点击登录,如图所示:
drcom

等登录成功后,点击drcom客户端里的注销,注销之后点击wireshark软件里的”停止”按钮,如图:
stop

阅读全文 »

继续学习c语言中…

引入话题

请注意文章标题: 在函数中修改指针的值, 而不是修改指针指向的值
修改指针指向的值很容易理解, 在函数参数中声明一个指针类型,
然后调用方法的时候把需要修改的值的指针传递过去就行了, 大体如下:

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
void test(int *a) {
*a = *a + 1; //使用取值运算符让指针a指向的值+1
printf("a: %d", *a);
}
int main(void) {
int a = 0;
test(&a);
return 0;
}

运行结果为:

1
a: 1

但本文所要说的是如何修改指针的值, 看下面的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
void test(int *a) {
a = a + 1; //让指针a的值+1
if (a != NULL) {
printf("test: a不为空\n");
}
}
int main(void) {
int *a = NULL;
if (a == NULL) {
printf("main: a为空\n");
}
test(a);
if (a == NULL) {
printf("main: a为空\n");
}
return 0;
}

运行结果为:

1
2
3
main: a为空
test: a不为空
main: a为空
阅读全文 »

google-chrome最近更新后flash不能正常运行了, 好象是不再包含flash player了,
在看视频或者需要用到flash player的时候就会提示:
adobe flash player 不是最新版本

解决方法也简单, 只是需要梯(fan)子(qiang), 如何找梯子本文就不提及了.
有了梯子之后, 设置好代理启动chrome, 在地址栏输入: chrome://components/, 回车,
然后找到flash player那一项, 点击更新就行了.

下面详细说说linux下和windows下怎么设置代理:

linux下在终端中设置好代理变量, 然后接着在同一个终端下以命令的方式启动chrome就行了,下面是具体命令:

1
2
3
export http_proxy=127.0.0.1:8787
export https_proxy=127.0.0.1:8787
google-chrome

命令解释, 前两行主要是指定代理地址和端口, 因为我是在本机运行的代理软件, 所以地址是127.0.0.1
而8787则是代理软件监听的端口, 第三行则是启动chrome

windows下就十分简单了, 启动代理软件, 一般代理软件都有系统代理的选项, 选择启动系统代理,
然后运行chrome就行了.

下面附上linux下的过程:
update-flash

首先,先说一个并不好用的方法,请看链接:使用xmodmap命令映射按键
之所以说这是一个不好用的方法是因为它在大多数桌面环境下没法实现开机自动映射,
只能进入系统后手动执行命令才能实现映射,而且即便手动执行映射命令生效了,
也会由于未知原因,过一段时间后失效,所以要想安稳的实现映射还是看下面的方法吧。

本方法基于X图形框架,也就是要实现按键映射必须启动X

请留意文章标题,说的是修饰键(modified key),也就是Ctrl,Alt,Shift,Esc,Super(windows)等键,
而是不键盘上的任意键,应该也可以实现任意键,但就需要深入学习X框架了,
推荐从这里入门: Arch WiKi: X KeyBoard extension

下面说简单的修饰键映射方法:
首先在X图形框架的配置文件夹/etc/X11/xorg.conf.d/下新建90-custom-kbd.conf文件,
然后将下面的代码粘贴到上面新建的文件中:

1
2
3
4
5
6
Section "InputClass"
Identifier "keyboard defaults"
MatchIsKeyboard "on"

Option "XKbOptions" "caps:escape"
EndSection

我们需要注意以及修改的地方只有“caps:escape”这个位置,
当前这段配置的作用是将caps(大写锁定)键映射到esc键,也就是说,
让大写锁定键的作用变成esc键,而不再是原有的大写锁定作用,同时esc键保留原有的作用。

看到这里你可能以为so easy,这样看来只需要修改成”ctrl:alt”就可以实现,让ctrl键变成alt键了。

然而,并不是。。
起初我也以为是这样,经过测试后无效,摸索了很久终于弄懂了,
原来”caps:escape”是一个已经定义好的选项,所以可以直接拿来用,而不是随便写的,
而”ctrl:alt”并不是以定义的选项所以无效。

那么怎么定义选项呢,抱歉,我也没学会,就像文章开头所说的这就需要深入学习X框架了,
庆幸的是,已经有了大量以定义的选项,我们可以找到自己需要的并拿来使用,

以定义的选项可以从系统的这个文件里找:

阅读全文 »

抽象类与接口简介

具体的就不说了,直说一下二者的重要的相同点和区别:

相同点:

  • 都是抽象的(不能正常实例化的)
  • 都可以有抽象方法
  • 都可以有成员变量

区别:

  • 抽象类除了不能正常实例化和可以含有抽象方法外其他特性与普通类相同
  • 抽象类既可以有抽象方法也可以有普通的方法,而接口只能包含抽象方法
  • 抽象类可以只声明成员变量而不初始化,接口必须在声明成员方法时初始化

不能实例化

以前我一直认为抽象类和接口是不能被初始化的, 意思就是不能使用new关键字来获取类的实例(接口也算是一个类),如:

1
TestInterface inter = new TestInterface();

当TestInterface是一个抽象类或者接口时,上述代码将会产生编译时错误.

阅读全文 »

今天突然发生了一件怪事,系统重启后没有了硬盘的uefi启动项, 吓了我一跳,我以为硬盘挂了,立即进livecd查看硬盘信息,好在一切正常.
我的电脑通常会自动添加应该第一分区(esp分区)里的一些启动项, 但这次重启几次之后依然不能自动添加,而我又是archlinux单系统,没得用easyuefi,
所以只能手动在linux下添加了,我没有在livecd中进行添加,而是进入硬盘中的archlinux后添加的.
有人会疑惑,没有启动项是怎么进入系统的??
详细的就不说了,本文主要说怎么添加uefi启动项,就只简单描述下如何在没有uefi启动项的情况下进入系统:
进入BIOS,启动uefi的shell模式,在shell模式中找到archlinux的efi引导文件,直接回车就行了

efibootmgr命令

在windows下通常使用easyuefi软件来管理uefi启动项,linux下我还不知道有什么图形化的软件来管理uefi启动项,
只知道一个efibootmgr命令,在终端中进行操作,这个命令的参数选项有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
usage: efibootmgr [options]
-a | --active sets bootnum active
-A | --inactive sets bootnum inactive
-b | --bootnum XXXX modify BootXXXX (hex)
-B | --delete-bootnum delete bootnum (hex)
-c | --create create new variable bootnum and add to bootorder
-C | --create-only create new variable bootnum and do not add to bootorder
-D | --remove-dups remove duplicate values from BootOrder
-d | --disk disk (defaults to /dev/sda) containing loader
-e | --edd [1|3|-1] force EDD 1.0 or 3.0 creation variables, or guess
-E | --device num EDD 1.0 device number (defaults to 0x80)
-g | --gpt force disk with invalid PMBR to be treated as GPT
-i | --iface name create a netboot entry for the named interface
-l | --loader name (defaults to \EFI\redhat\grub.efi)
-L | --label label Boot manager display label (defaults to "Linux")
-m | --mirror-below-4G t|f mirror memory below 4GB
-M | --mirror-above-4G X percentage memory to mirror above 4GB
-n | --bootnext XXXX set BootNext to XXXX (hex)
-N | --delete-bootnext delete BootNext
-o | --bootorder XXXX,YYYY,ZZZZ,... explicitly set BootOrder (hex)
-O | --delete-bootorder delete BootOrder
-p | --part part (defaults to 1) containing loader
-q | --quiet be quiet
-t | --timeout seconds set boot manager timeout waiting for user input.
-T | --delete-timeout delete Timeout.
-u | --unicode | --UCS-2 pass extra args as UCS-2 (default is ASCII)
-v | --verbose print additional information
-V | --version return version and exit
-w | --write-signature write unique sig to MBR if needed
-@ | --append-binary-args file append extra args from file (use "-" for stdin)
-h | --help show help/usage

看起来复杂,其实只需要用到其中几个,下面说几个常用的:

  • 不加任何参数表示打印当前所有的启动项和启动顺序
  • -b 修改
  • -B 删除
  • -c 添加
  • -d 指定硬盘(默认是/dev/sda)[注意这里的根目录是相对于系统的根来说的]
  • -l 指定引导器(默认是\EFI\redhat\grub.efi)[注意这里的根目录是相对于你的esp分区来说的,而且用反斜杠\来表示目录级别]
  • -L 启动项的名字

使用示例

下面说两个简单的例子:
注意efibootmgr命令需要使用root权限!!

添加一个名叫Arch的启动项

背景描述:

阅读全文 »

只需要使用curl命令配合一些参数就可以测试了,看返回内容就知道能否抓取了

1
2
3
4
# 用PC的UA来抓取
curl -A "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" http://listenerri.com
# 用移动UA来抓取
curl -A "Mozilla/5.0 (Linux;u;Android 4.2.2;zh-cn;) AppleWebKit/534.46 (KHTML,like Gecko) Version/5.1 Mobile Safari/10600.6.3 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" http://listenerri.com

下面两张图是我测试正常的,第一张是上述命令返回的开始部分,第二张是上述命令返回的结束部分:
开始
结束

为什么屏幕旋转会带来问题

在屏幕旋转时,系统会销毁当前活动的activity,并在旋转后重新创建一个新的activity,
那么旋转前activity中的一些数据就会丢失.所以只要找到一个方法能实现旋转前保存某些数据,
并在新创建的activity中可以取出之前保存的数据,也就解决了这个问题.

然而保存数据并不是万能的,有些操作是不能中断的,比如播放音乐,这就要用到另一种方法.

两个不同的例子

场景一:答题

当用户正在回答一些题目,每回答完一道题就保存用户填写的信息到文件中并切换出下一道题的view,此时如果旋转了屏幕,
那么旋转后标志用户正在填写哪一道题的对象就会丢失,而不得不从第一题重来.
这种场景适合使用OnSaveInstanceState(Bundle savedInstanceState)方式来解决,使用方法很简单,
只需要在activity中重写上述方法即可:

1
2
3
4
5
6
7
8
9
10
11
@Override
public void OnSaveInstanceState(Bundle savedInstanceState){
//这一句应该保留,因为这个方法默认是有一些行为的
super.OnSaveInstanceState(savedInstanceState);

//下面是我们重写新增的需要保存的数据
//使用Bundle的savedInstanceState对象来存数数据
//比如上述场景需要保存一个标志题号的数据:"index"
savedInstanceState.putInt("index",5);
//也就是以键值对的形式保存int型数据`5`
}

之后在onCreate方法中取出这个保存的数据即可.

需要注意的是我们在Bundle中保存的只能是基本数据类型以及可以实现Serializable接口的对象,
也就是说如果需要保存一个类的对象时,需要让这个类实现Serializable接口.

场景二:播放音乐

阅读全文 »