GithubHelp home page GithubHelp logo

mic101.github.io's People

Contributors

mic101 avatar

Stargazers

 avatar  avatar

Watchers

 avatar

mic101.github.io's Issues

[android studio]as基础

1、try catch异常
device | logcat来查看
04-03 03:07:46.811 2404-2404/com.wukongtv.wkremote.client W/System.err﹕ org.json.JSONException: No value for data 解析json的时候没有key为data的数据

[Fragment] 生命周期

程序运行
OnAttach
OnCreate
OnCreateView
OnActivityCreated
OnStart
OnResume
点击home:OnPause OnStop
再打开程序 OnStart OnResume
点击后退:
OnPause OnStop OnDestoryView OnDestory OnDetach

[android]apk安装过程

释放文件的相关目录:
/data/app :apk文件保存在这里
/data/dalvik-cache:保存dex文件 system@app@[email protected] data@app@[email protected]
/data/data: 保存apk的缓存文件
安装过程如下:
1、释放apk到/data/app下面。为什么要保留apk呢?
原因:安装过程并没有把资源文件, assets目录下文件拷贝出来,他们还在apk包里面呆着,所以,当应用要访问资源的时候,其实是从apk包里读取出来的。其过程是,首先加载apk里的resources.arsc(这个文件是存储资源Id与值的映射文件),根据资源id读取加载相应的资源。
2、从apk中释放classes.dex文件到 /data/dalvik-cache目录
dalvik虚拟机执行classes.dex
3、保存缓存数据到/data/data目录 以包名存放.用于存储程序的数据,例如cache, database等

/data/app需要系统权限system才能进入。但是下面的文件是可以读取的。
4、/data/app-lib/ jni文件保存之处
其中/data/data/xxx/lib下面是软链接到这里

[android]adb分析

代码位于:platform/system/core/下面
https://android.googlesource.com/platform/system/core/

adb实现原理有:
adb client 运行在pc上的程序
adb server 运行在pc上的服务程序
adbd daemon运行在手机上的服务程序
services:https://android.googlesource.com/platform/system/core/+/android-5.1.0_r5/adb/services.c

从4.2开始。adb增加了2个大改动:

1、增加了RSA指纹认证
2、adbd限制了连接数 只能有一个设备可以通过tcp连接

利用setprop service.adb.tcp.port 5555修改adb的端口号 不需要权限就可以修改

public static boolean isAdbdProcessRun(){
    ShellUtils.CommandResult process = ShellUtils.execCommand("ps | grep adbd", false);

    if((process.result == 0) && !TextUtils.isEmpty(process.successMsg)){
        Log.v("mic101",process.successMsg);
        int pos = process.successMsg.indexOf("/sbin/adbd");
        if(pos!=-1){
            return true;
        }
    }
    return false;
}

public static String getAdbdPort(){
    ShellUtils.CommandResult adbInfo = ShellUtils.execCommand("getprop service.adb.tcp.port", false);
    if((adbInfo.result == 0) && !TextUtils.isEmpty(adbInfo.successMsg)) {
        return new String(adbInfo.successMsg);
    }
    return null;
}

public static void rootOpenAdbd(){
ShellUtils.execCommand("stop adbd", true);
ShellUtils.execCommand("start adbd", true);
}

[jekyll]md博客系统搭建

1、centos安装
yum -y install ruby rubygems ruby-devel
2、更改为淘宝的source
gem sources -r http://ruby.taobao.org/
gem sources -a http://ruby.taobao.org/
gem sources -l
3、安装
gem install jekyll
4、jekyll build报错的话:Could not find a JavaScript runtime
sudo yum install nodejs解决

5、jekyll new doc_md
创建工程

6、工作原理:
_config.yml配置文件
创建软链接到md文件夹

[链接百度事件]大流量导致的服务崩溃带来的反思

1、php-fpm worker进程满载
2、redis无法连接 redis服务挂掉
原因:短连接导致TCP的TIME_WAIT耗尽,紧急修改linux内核参数
解决办法:
链家网运维团队立即在Redis的机器上
设置Linux核心参数:net.ipv4.tcp_tw_reuse = 1; net.ipv4.tcp_tw_recycle = 1; 使得redis服务快速恢复

查看服务器TIME_WAIT数量:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

[架构师成长之路总结]技术总结

主要考虑点:
1、技术方案调研和制定
2、开发节奏的把握
3、团队成员的培养和激励
4、与运营 商务的合作开展

架构搭建:
1、bugzilla系统 选择禅道
2、文档和博客系统 选择jekyll
3、后台数据管理系统
4、按域名划分业务 static img down 配合上cdn抗带宽
5、缓存和备份服务器 做容灾

几大组件:
缓存(cache)
数据库(mysql)
定时任务(cron)
页面抓取(fethurl)
存储(storage)服务

几大开源系统:
KAFKA分布式消息系统
消息队列
分布式消息中间件 MetaQ
360的Atlas

阿里云服务器选择:阿里云还是

【系统运维】request_terminate_timeout引起的资源问题,导致php-fpm进程无法结束,永久等待

问题描述:php-fpm进程创建100个,进程达最大数,无法处理php请求,502 Bad Gateway
原因:
代码中使用simplexml_load_file加载网络xml资源,由于xml所在服务器关闭,php-fpm配置参数request_terminate_timeout=0永久等待,最终导致nginx+php的webserver无法处理更多php请求,导致502 Bad Gateway.
定位方法:先回滚代码(未定位出来)。再封代码,找到最小问题集,最后定位问题。解决问题。
如何改进定位,提高定位问题速度:
1、top命令查看是可以发现php-fpm的进程调度过程
2、php-fpm start重启后,进程数很快被打满最大值100.正常情况是在最小与最大之间
类似问题:
1、file_get_contents函数也会导致无法超时。
2、memcache未命中导致频繁查询mysql。cpu 100%没有CPU资源
总结思考:
1、与数据库相比,网络接口数据更加不可信。可优先排查
2、php-fpm的慢日志要开启,有助于排查定位php脚本执行慢
3、对php工作的基本原理需要更加深入的了解
面试题目:
1、如何从网络上获取一个xml数据?
simplexml_load_file、file_get_contents、curl
说出几点利与弊

[服务端开发]内存问题

web语言(php)具有执行时间短 不会长时间运行。因为内存在请求结束,脚本运行完毕会得到释放。不需要过多的考虑内存问题。

但是如果脚本有执行耗时操作(如大量的foreach循环、连接mysql、读取文件),在并发量很大的情况下,会发生如下情况:
1、cpu 100%
2、内存消耗超过脚本最大内存限制 脚本申请内存失败 报错(默认php 128M内存)
3、mysql memcache等服务达最大连接数 拒绝服务
4、nginx php等进程数达最大限制数 拒绝服务(发生过php进程数达最大 拒绝服务)

php内存释放的三次机会:
1、脚本执行完毕
2、函数执行完毕 局部变量会得到释放
3、unset或null

php性能调优:
1、速度
2、内存 memory_get_usage查看php内存使用情况

[后端开发要求]后端系统开发注意事项

切忌过度设计和提前优化。
1、爬虫抓取脚本,一定要有完善的log记录。用于排查异常问题
2、后端关键接口的云报警监控一定要监控起来。包括dns解析 响应时间 body内容是否完善

[服务端]youku算法破解过程分析

优酷算法:

前提:
算法所在js: http://player.youku.com/embed/unifull/unifull_.js
几个关键函数: E F G pa
关键函数调用序列:
loadPlayerH5()
selectH5M3U8
k.init
k.start
k.request
k.getPlayListUrl
k.response--->http://v.youku.com/player/getPlayList/VideoIDS/XNzk3MTQxMzgw/Pf/4/ctype/12/ev/1
k.m3u8src
b.m3u8src_v2

1、获取算法关键key
http://v.youku.com/player/getPlayList/VideoIDS/XNzk3MTQxMzgw/Pf/4/ctype/12/ev/1
重点参数videoId ip ep会参与下面的运算
2、url格式
http://pl.youku.com/playlist/m3u8?vid=xxx&ctype=12&ev=1&type=flv/mp4&ep=?&token=?&oip=ip&sid
关键算法就是计算sid token ep

3、计算sid token k.init函数中
G函数就是为了算一个固定的字符串:

g = G(b.mk.a3 + "o0b" + d.userCache.a1, [19, 1, 4, 7, 30, 14, 28, 8, 24, 17, 6, 35, 34, 16, 9, 10, 13, 22, 32, 29, 31, 21, 18, 3, 2, 23, 25, 27, 11, 20, 5, 15, 12, 0, 33, 26]).toString()
//g计算完就是一个固定的字符串"becaf9be"
f= F(g, pa(a.ep)); //ep是第一步返回的ep
c=f
sid = c.split("")[0];
token = c.split("
")[1];

4、计算ep b.m3u8src_v2函数中
g=(G(b.mk.a4 + "poz" + d.userCache.a2, [19, 1, 4, 7, 30, 14, 28, 8, 24, 17, 6, 35, 34, 16, 9, 10, 13, 22, 32, 29, 31, 21, 18, 3, 2, 23, 25, 27, 11, 20, 5, 15, 12, 0, 33, 26]).toString()
//g计算完毕是一个固定的字符串"bf7e5f01"
f= F(g,sid + "" + vid + "" + token)//第1步的vid 32步计算的sid token
e = E(f)
f= encodeURIComponent(e) 对应php的urlencode
ep=f

5、E F pa函数
public static function E($a) 也就是php的base64encode
{
$str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
if (!$a)
{
return '';
}
$f = strlen($a);
$b = 0;
for ($c = ''; $b < $f;)
{
$e = self::charCodeAt($a, $b++) &255;
if ($b == $f)
{
$c .= self::charAt($str, $e >> 2);
$c .= self::charAt($str, ($e &3) << 4);
$c .= '==';
break;
}
$g = self::charCodeAt($a, $b++);
if ($b == $f)
{
$c .= self::charAt($str, $e >> 2);
$c .= self::charAt($str, ($e &3) << 4 | ($g &240) >> 4);
$c .= self::charAt($str, ($g &15) << 2);
$c .= '=';
break;
}
$h = self::charCodeAt($a, $b++);
$c .= self::charAt($str, $e >> 2);
$c .= self::charAt($str, ($e &3) << 4 | ($g &240) >> 4);
$c .= self::charAt($str, ($g &15) << 2 | ($h &192) >> 6);
$c .= self::charAt($str, $h &63);
}
return $c;
}

public static function F($a, $c)
{
for ($f = 0, $i, $e = '', $h = 0; 256 > $h; $h++)
{
$b[$h] = $h;
}
for ($h = 0; 256 > $h; $h++)
{
$f = (($f + $b[$h]) + self::charCodeAt($a, $h % strlen($a))) % 256;
$i = $b[$h];
$b[$h] = $b[$f];
$b[$f] = $i;
}
for ($q = ($f = ($h = 0)); $q < strlen($c); $q++)
{
$h = ($h + 1) % 256;
$f = ($f + $b[$h]) % 256;
$i = $b[$h];
$b[$h] = $b[$f];
$b[$f] = $i;
$e .= self::fromCharCode(self::charCodeAt($c, $q) ^ $b[($b[$h] + $b[$f]) % 256]);
}
return $e;
}

define('SZ', "-1,-1,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 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, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1")

function pa($a)
{
if (!$a) {
return '';
}
$h = explode(',', SZ);
$i = strlen($a);
$f = 0;
for ($e = ''; $f < $i;) {
do {
$c = $h[charCodeAt($a, $f++) & 255];
} while ($f < $i && -1 == $c);
if (-1 == $c) {
break;
}
do {
$b = $h[charCodeAt($a, $f++) & 255];
} while ($f < $i && -1 == $b);
if (-1 == $b) {
break;
}
$e .= fromCharCode($c << 2 | ($b & 48) >> 4);
do {
$c = charCodeAt($a, $f++) & 255;
if (61 == $c) {
return $e;
}
$c = $h[$c];
} while ($f < $i && -1 == $c);
if (-1 == $c) {
break;
}
$e .= fromCharCode(($b & 15) << 4 | ($c & 60) >> 2);
do {
$b = charCodeAt($a, $f++) & 255;
if (61 == $b) {
return $e;
}
$b = $h[$b];
} while ($f < i && -1 == $b);
if (-1 == $b) {
break;
}
$e .= fromCharCode(($c & 3) << 6 | $b);
}
return $e;
}

[android]android下载大文件 下载库

android下载大文件的需求:比如:
1、安卓市场推广的游戏APK 都是几百M的文件
2、视频类APP缓存视频 高清的影视资源也是几个G的文件

改造的volley rocket

[android]安卓自定义控件的2种方法

1、在View类中定义。通过构造函数中引入的AttributeSet 去查找XML布局的属性名称,然后找到它对应引用的资源ID去找值。

public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
int resourceId = 0;
int textId = attrs.getAttributeResourceValue(null, "Text",0);
int srcId = attrs.getAttributeResourceValue(null, "Src", 0);
mtext = context.getResources().getText(textId).toString();
msrc = srcId;
}

2、通过XML为View注册属性。与Android提供的标准属性写法一样。
attrs定义

[Activity]生命周期

打开程序:
OnCreate OnStart OnResume
点击后退:
OnPause OnStop OnDestory
点击home按键:
OnPause OnStop
点击home后再打开程序:
OnRestart OnStart OnResume

[net]运营商劫持导致的问题

1、网页html的js文件被替换 导致部分功能异常
2、下载链接被替换 下载的文件被替换为其他
3、网页被插入广告

防劫持办法:
1、加随机数是否有效
2、https

[android]root原理和授权管理

root过程就是向/system/bin目录下写入一个su文件。
App通过授权获取Root权限,不是App自身的权限提升了,而是通过具有ROOT权限的sh流来执行shell命令。

su执行的原理:

  1.   Su 被用户调用
    
  2.   Su 创建了一个socket监听
    
  3.   Su 向Superuser.apk发送了一个广播,说是有一个程序要请求root
    
  4.   Su 等待socket 数据接收。有超时处理。
    
  5.   Superuser.apk界面收到广播后,弹出一个对话框,询问用户
    
  6.   Superuser.apk 向传来的数据中的socket写回用户应答结果。
    
  7.   Su 根据socket得到的结果处理应该不应该继续执行
    
  8.   完成提权管理
    

如下问题就是因为超时导致的。
shell@android:/ $ su
[-] connect ui: Timer expired

因为超时的存在。会导致su执行命令的时候超时失败。

【URLEncode】url含有特殊字符时的编码处理

URL字符构成:
[0-9a-zA-Z]
特殊字符:$-_.+!*’(),
保留字符:&/:;=?@
为了让我们思路更清晰,我们再总结一下,哪些字符必须要编码:
ASCII表中没有对应可显示字符的,例如汉字
不安全字符,包括:#”%<>[]{}|^`~
不当做保留字符来使用的保留字符,即&/:;=?@

问题描述:URL中特殊字符的处理,遇到中文或者&?等特殊字符,要转化后处理。
原因:
1、参数含有中文的时候做 URLEncode
2、url做参数传递的时候,如果含有&符号,会导致参数丢失。如url=http://api.xxx.com?q=123&t=456&from=qq. &符号会导致 url参数取值错误。

[mac]安装Python-Mysql和SQLAlchemy

mac下打造python开发环境:
1、mac下安装软件
brew install

2、pip install安装python包

pip安装mysqldb:
1、安装mac-mysql 从mysql官网下载安装
2、pin install MySQL-python
3、解决mysql_config not found
$ sudo ln -s /usr/local/mysql/bin/* /usr/bin
4、解决Reason: image not found
$ sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
$ sudo ln -s /usr/local/mysql/lib /usr/local/mysql/lib/mysql

在python console下测试:import MySQLdb没有错误安装成功

3、安装SQLAlchemy
pip install SQLAlchemy

4、安装peewee

[服务端]工作总结和安排

爬虫抓取的编码问题
1、网页自身的编码
< meta http-equiv="Content-Type" content="text/html; charset=utf-8">
< meta http-equiv="Content-type" content="text/html; charset=GB2312">
2、代码文件的编码
utf-8
3、数据库的编码
utf-8
4、语言自身的编码(只要指的字符串)python用的unicode js用的utf-16
字符集与编码

字符集表示有多少字符。
编码:怎样来表示字符集。用多少个字节

几个常用字符集和编码

ASCII字符集 ASCII编码
汉字 GB2312 < GBK < GB18030
通用 Unicode UTF-8编码

编码

Base64 是一种编码可以做简单的加密用
urlencode

加密解密

md5
aes
xor

URL中的问题(做api接口开发注意事项)

1、http://api.xxx.com?url=http://www.yyy.com/?q=123&t=456&from=qq 数据不可信
2、http://api.wukongtv.com/setting/init?deviceid=355065055812634&phonetype=??&osver=4.3 数据不可信 把客户端弄崩溃
3、http://dev.com/test.php?aaaa=1111&aaaa#1231313 url校验
注意事项:参数做urlencode编码处理.

爬虫抓取及web api开发

1、在大量并发请求中进行网络请求 要避免,如果必须这么做也要有超时处理。会把服务器资源耗光
广场舞在接口中做抓取
融云web api二次开发
直播点播平台接口二次开发
2、memcache或redis缓存必须命中 否则在大规模并发下会把mysql的CPU耗光

[android]android基础知识

android app
1、安卓应用本质上是一个APK文件,APK文件格式是zip压缩包。可以解压反编译出来资源文件

2、一个最简单APP,默认启动几个线程。分别是做什么的

3、app的程序入口ActivityThread.main静态函数(static)
一个APP就有2个基本对象:
ActivityThread(final类)定义:public final class ActivityThread
ApplicationThread(继承binder,负责与ams通信)
UI线程:
ActivityThread thread = new ActivityThread();
thread.attach(false); 这里利用IActivityManager::attachApplication与Ams通信
looper() UI线程循环启动,等待消息处理
ams通过IPC回调IApplicationThread:: bindApplication函数返回到UI线程。
此时一个APP才正式的启动成功。
4、app程序的2个Framework层的入口
都是经过第2步之后,ActivityThread::handleMessage通过IPC调度程序开始。

IPC----》ApplicationThread::bindApplication---->sendMessage(H.BIND_APPLICATION, data)----->ActivityThread::handleMessage----->handleBindApplication----->Application::onCreate

Activity::onCreate
IPC----》ApplicationThread::scheduleLaunchActivity---->sendMessage(H.LAUNCH_ACTIVITY, data)---->handleLaunchActivity----->Activity::onCreate

5、Application::onCreate类的生命周期及作用

java.lang.Object
↳ android.content.Context
↳ android.content.ContextWrapper
↳ android.app.Application

Application的作用:全局类。在任何Activity和Service都可以通过getApplicationContext函数获取。

6、Activity初始化

java.lang.Object
↳ android.content.Context
↳ android.content.ContextWrapper
↳ android.view.ContextThemeWrapper
↳ android.app.Activity
7、Service

java.lang.Object
↳ android.content.Context
↳ android.content.ContextWrapper
↳ android.app.Service
8、Context

java.lang.Object
↳ android.content.Context

【系统运维】php PDO::query报non-object错误

问题描述:php代码使用PDO的时候,代码报non-object错误
原因:
1、连接mysql的时候账号、密码错误
2、多次使用PDO,没有释放对象

query('SELECT something'); /\* making something with $oPDOStatement, i.e. fetch() */ /\* and destroy poor, little object as we had used it */ $oPDOStatement = null; $oPDOStatement = $oPDO->query('SELECT something completly different'); /\* and everything works fine */ ?>

[http]get与post

1、get传输参数要UrlEncode来处理特殊字符

2、post的三种形式
一、Content-Type:application/json
$GLOBALS['HTTP_RAW_POST_DATA']
二、Content-type: application/x-www-form-urlencoded
$_POST['a']
三、Content-Type:multipart/form-data
PHP的全局变量$_FILES

[android]webview播放视频就崩溃android.permission.WAKE_LOCK

, 0, 0)
04-29 17:23:35.090 3116-3116/com.dabaijing.browser W/System.err﹕ java.lang.SecurityException: Neither user 10094 nor current process has android.permission.WAKE_LOCK.
04-29 17:23:35.090 3116-3116/com.dabaijing.browser W/System.err﹕ at android.os.Parcel.readException(Parcel.java:1465)
04-29 17:23:35.090 3116-3116/com.dabaijing.browser W/System.err﹕ at android.os.Parcel.readException(Parcel.java:1419)
04-29 17:23:35.090 3116-3116/com.dabaijing.browser W/System.err﹕ at android.os.IPowerManager$Stub$Proxy.acquireWakeLock(IPowerManager.java:311)
04-29 17:23:35.090 3116-3116/com.dabaijing.browser W/System.err﹕ at android.os.PowerManager$WakeLock.acquireLocked(PowerManager.java:730)
04-29 17:23:35.090 3116-3116/com.dabaijing.browser W/System.err﹕ at android.os.PowerManager$WakeLock.acquire(PowerManager.java:699)
04-29 17:23:35.090 3116-3116/com.dabaijing.browser W/System.err﹕ at android.media.MediaPlayer.stayAwake(MediaPlayer.java:1675)
04-29 17:23:35.090 3116-3116/com.dabaijing.browser W/System.err﹕ at android.media.MediaPlayer.start(MediaPlayer.java:1582)
04-29 17:23:35.090 3116-3116/com.dabaijing.browser W/System.err﹕ at com.android.org.chromium.media.MediaPlayerBridge.start(MediaPlayerBridge.java:95)
04-29 17:23:35.090 3116-3116/com.dabaijing.browser W/System.err﹕ at com.android.org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
04-29 17:23:35.090 3116-3116/com.dabaijing.browser W/System.err﹕ at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:27)
04-29 17:23:35.090 3116-3116/com.dabaijing.browser W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:102)
04-29 17:23:35.090 3116-3116/com.dabaijing.browser W/System.err﹕ at android.os.Looper.loop(Looper.java:153)
04-29 17:23:35.090 3116-3116/com.dabaijing.browser W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5032)
04-29 17:23:35.090 3116-3116/com.dabaijing.browser W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
04-29 17:23:35.090 3116-3116/com.dabaijing.browser W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:515)
04-29 17:23:35.090 3116-3116/com.dabaijing.browser W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:851)
04-29 17:23:35.090 3116-3116/com.dabaijing.browser W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:667)

[centos]运维管理 定时任务管理

centos定时任务管理由两种方式
1、系统任务:/etc/cron.daily cron.monthly cron.weekly
1.1、centos5.x系统 通过crontab服务 (配置文件位于/etc/crontab)下面
内容类似下面:
59 23 * * * root run-parts /etc/cron.daily
其中run-parts是系统脚本/usr/bin/run-parts,用来一次运行整个目录的可执行程序。
1.2、centos6.x系统开始 不再通过crontab服务(配置文件位于/etc/anacrontab) 而是通过anacron服务来执行定时任务。anacron是用来解决crontab因为机器原因导致定时任务在规定时间内未得到执行的问题。anacron通过记录一个时间戳(/var/spool/anacron)来辅助执行定时任务 。

2、用户自定义的定时任务 依然由crontab来管理
通过crontab -e 来定制用户任务(/var/spool/cron 用户任务位于这个下面)

遇到问题:lograte切割日志文件的时候 无法精准的切割出来某一天的日志。
原因:centos6.5系统由于采用anacron来管理/etc/cron.daily服务,anacron的管理策略有延迟机制。
解决办法:
一、修改/etc/anacrontab配置为:
RANDOM_DELAY=0
START_HOURS_RANGE=0-0
1 0 cron.daily nice run-parts /etc/cron.daily
二、关闭anacron服务
yum remove cronie-anacron
yum install cronie-noanacron
三、不把定时任务写入系统daily中 手动执行定时任务

[android]普通APP设置默认输入法

1、方法一
调用堆栈
switchInputMethod("com.app.wkinput/.ime.InputService");
|--------InputMethodManager.setInputMethod (IBinder token, String id)
|------Settings.Secure.putString(this.getContentResolver(),Settings.Secure.DEFAULT_INPUT_METHOD,"com.app.wkinput/.ime.InputService");
非system/app下的系统应用由于权限问题都是调用失败的。
需要的系统权限:

2、方法二 android4.2新增加了一个settings命令
代码位于:platform/frameworks/base/cmds/settings
https://android.googlesource.com/platform/frameworks/base/+/android-4.2.1_r1/cmds/settings/src/com/android/commands/settings

android系统以上bin文件都位于:/system/bin 主要有am pm input ime settings等
使用方法:
adb shell settings put secure default_input_method com.sohu.inputmethod.sogouoem/.SogouIME

3、方法三 ime set命令 重启失效
ime set com.sohu.inputmethod.sogouoem/.SogouIME

内部实现:
IInputMethodManager mImm =
IInputMethodManager.Stub.asInterface(ServiceManager.getService("input_method"));
mImm.setInputMethod(null, id);

实施方案:

  • 开启adb
  • 4.2 采用 adb shell settings put secure com.app.wkinput/.ime.InputService
  • 非4.2 采用 adb shell ime set com.app.wkinput/.ime.InputService 重启失效 监听开机广播 再次设置一下
  • 未开启adb 但是root的盒子 ime set com.app.wkinput/.ime.InputService

输入法是以独立进程的形式存在:
当应用的EditText获取到了焦点,系统会调起默认输入法。输入法可以有权限发送标准键盘事件。
android:permission="android.permission.BIND_INPUT_METHOD"

【客户端开发】客户端程序员的内功修炼

1、时序问题
代码运行先后导致的时序问题,比如对象未初始化完成就去使用了。又比如菜单对象提前销毁了,后面又去使用

2、代码运行在那个线程
客户端代码运行环境复杂,多进程多线程异步回调。
要时刻搞清楚自己写的代码运行在什么样的线程,是否符合预期。

3、兼容问题
代码在低版本或更高版本的系统上是否能够运行正常。
一个原则就是:代码最小影响范围。某个功能不需要的代码,坚决不让执行。

4、性能问题
内存CPU的消耗上

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.