软件
安卓视频简单加密软件
mtsym 发表于2019-05-04 浏览4103 评论0
大家有时候可能会往手机里放一些个人隐私小视频,但是如果不进行任何处理,视频及文件一类管理软件会把视频截帧图展示出来,很容易被人发现,可能会很尴尬,所以需要把视频加密才行。
安卓下的视频精灵就添加了这么一个简单视频加密的功能,采取对视频部分数据随机抽取加密,以阻止预览视频一类软件暴露视频文件信息。
点击首页视频加密,进入后点击选择文件或文件夹进行加密处理,加密后的文件扩展名为wvod,可在软件里面直接观看或者还原
注意:由于视频加密存在风险,因此重要视频加密前请进行有必要的备份处理
软件
Linux/Mac下是否有Everything替代软件
mtsym 发表于2019-05-04 浏览8583 评论0
Everything是windows下我最喜欢的软件,从它一出来我就开始用了,现在出现了一些同类型的软件,或者是集成了Everything SDK或者调用接口的软件,不过体验改善不大,Mac、Linux下是否有这样的软件呢?
Q:Everything有Mac/Linux版本吗
A:没有
Q:Mac/Linux下有Everything一样的软件吗
A:没有,因为Everything是基于NTFS文件系统的,除非使用新的文件系统支持类似的
技术坑
gogs迁移后git push时报错cannot run hooks/pre-receive
mtsym 发表于2019-05-04 浏览5289 评论0
之前我的git服务gogs是部署在家里的群晖NAS上的,由于有几台云主机闲着,于是我就把gogs迁移一份过去,相当于做个备份,gogs迁移过程很简单,直接把数据打包过去,然后在CentOS上下载最新的gogs进行配置然后就可以了,启动之后发现能pull代码,但是不能push,一直报错
error: cannot run hooks/pre-receive: No such file or directoryremote: hooks/pre-receive: line 2: /app<!--autointro-->技术坑
Android下ViewPager、RecyclerView滚动状态监听不调用问题
mtsym 发表于2019-05-04 浏览4842 评论0
有时候在UI上一些逻辑处理时会进行滚动状态监听,比如在使用ViewPager和RecyclerView的时候,但是有时候你可能发现某些状态并不会回调,例如SCROLL_STATE_IDLE,可能就出现bug了,为了避免这个问题,有几种办法
- 准确度要求不高,简单的情形下可以用timer
- 自己计算滚动状态然后进行处理,例如观察view的可见区域
技术坑
Android RecyclerView使用notifyItemRangeInserted的如何防止跳动
mtsym 发表于2019-05-04 浏览11602 评论0
Android在处理RecyclerView时候,如果使用notifyItemRangeInserted插入数据后可能界面发生跳动,解决这个问题只需要两步
- 把焦点优先获取权交给RecyclerView,并请求焦点,这样容器先hold住了焦点,便不会乱飞了
- 数据更新完成后,进行焦点恢复,将焦点优先权交给子元素,然后指定特定的view请求焦点
这个方案能解决大部分焦点乱跳问题,包括快速滚动的
代码大致如下
public void holdFocus(<!--autointro-->技术坑
zblog远程发布文章API改进实现兼容wordpress xmlrpc
mtsym 发表于2019-05-04 浏览7673 评论0
最近有个zblog自动发布文章需求,大致看了一下,发现并没有wordpress方便,特别是我还有对接python的要求,大概有几种办法
1. 直接读取/zb_users/c_option.php,暴力写入数据
2. 直接开发一个插件使用zblog内部代码接口
3. 使用zblog本身的xmlrpc第一种方案为了安全还得自己写鉴权,第二种方案通用性强但是需要对zblog比较了解,第三种方案最方便了,python可以直接使用xmlrpc库对接,由于我已经有wordpress自动发布的python脚本,我想复用这个,因此对zblog的xmlrpc进行改造。
兼容wordpress xmlrpc
找到zb_system/xml-rpc/index.php文件,先在入口判断出增加’mt.supportedMethods’支持,再增加’wp.newPost’支持
case 'mt.supportedMethods':
$strXML = '<methodResponse><params><param><value><array><data>$%#1#%$</data></array></value></param></params></methodResponse>';
$strAll = '<value><string>wp.newPost</string></value>';
echo str_replace("$%#1#%$", $strAll, $strXML);
break;
case 'wp.newPost':
$username = (string)$xml->params->param[1]->value->string;
$password = (string)$xml->params->param[2]->value->string;
xmlrpc_Verify($username, $password);
if ($zbp->CheckRights('ArticlePst')) {
xmlrpc_newPost_as_wp($xml->params->param[3]->value->struct->asXML());
} else {
xmlrpc_ShowError(6, __FILE__, __LINE__);
}
break;转化wordpress xmlrpc支持函数如下
```
function xmlrpc_newPost_as_wp($xmlstring)
{
global $zbp;
$xml = simplexml_load_string($xmlstring);
if ($xml) {
$post = array();
foreach ($xml->children() as $x) {
$a = (string)$x->name;
if ($a == 'terms_names') {
$struct = $x->value->struct;
foreach ($struct->children() as $y) {
$a = (string)$y->name;
$b = $y->value->children()->asXML();
$b = str_replace(array('<array>', '</array>', '<data>', '</data>', '<string>', '</string>', '<value>', '</value>', PHP_EOL), array(''), $b);
$post[$a] = $b;
}
} else {
$b = $x->value->children();
$b = str_replace(array('<array>', '</array>', '<data>', '</data>', '<string>', '</string>'), array(''), $b);
$post[$a] = $b;
}
}
$_POST['ID'] = 0;
$_POST['Title'] = $post['post_title'];
if (strcmp('publish', $post['post_status']) != 0) {
$_POST['Status'] = 0;
} else {
$_POST['Status'] = 1;
}
if (isset($post['mt_basename'])) {
$_POST['Alias'] = $post['mt_basename'];
}
if (isset($post['dateCreated'])) {
date_default_timezone_set('GMT');
$_POST['PostTime'] = strtotime($post['dateCreated']);
date_default_timezone_set($zbp->option['ZC_TIME_ZONE_NAME']);
$_POST['PostTime'] = date('c', $_POST['PostTime']);
}
if (isset($post['wp_author_id'])) {
$_POST['AuthorID'] = $post['wp_author_id'];
} else {
$_POST['AuthorID'] = $zbp->user->ID;
}
if (isset($post['post_tag'])) {
$_POST['Tag'] = $post['post_tag'];
}
if (isset($post['category'])) {
$post['category'] = str_replace('<value>', '', $post['category']);
$catename = trim(GetValueInArray(explode('</value>', $post['category']), 0));
$_POST['CateID'] = $zbp->GetCategoryByName($catename)->ID;
}
if (isset($post['mt_excerpt'])) {
$_POST['Intro'] = $post['mt_excerpt'];
}
if (isset($post['mt_text_more']) || isset($post['post_content'])) {
if (isset($post['mt_text_more'])) {
if ($post['mt_text_more'] != '') {
$_POST['Content'] = $post['post_content'] . '