×

软件

VMware复制虚拟系统文件到外部报错“无法打开本地文件进行写入”

mtsym mtsym 发表于2019-05-04 浏览9547 评论0

今天在使用VMware从2003复制一个文件夹到外部的时候一直不成功,报错“无法打开本地文件进行写入,撤销复制”,重启了也不管用,我就很纳闷,测试了一下,单个文件是可以复制出来的,多测试了几个文件也是可以的,里面有几个文件是以“#%”特殊字符开头的,看样子这些文件的名字是触发了VMware的bug,我用的是VMware Pro 15.1,之前搞活动买的,没有测试其他版本。

话说VWware搞活动的时候真的便宜,以前我在Mac下买了VMware fusion 8用了好多年,之前在Mac下也买

安卓视频简单加密软件

软件

安卓视频简单加密软件

mtsym mtsym 发表于2019-05-04 浏览4103 评论0

大家有时候可能会往手机里放一些个人隐私小视频,但是如果不进行任何处理,视频及文件一类管理软件会把视频截帧图展示出来,很容易被人发现,可能会很尴尬,所以需要把视频加密才行。
安卓下的视频精灵就添加了这么一个简单视频加密的功能,采取对视频部分数据随机抽取加密,以阻止预览视频一类软件暴露视频文件信息。

点击首页视频加密,进入后点击选择文件或文件夹进行加密处理,加密后的文件扩展名为wvod,可在软件里面直接观看或者还原
注意:由于视频加密存在风险,因此重要视频加密前请进行有必要的备份处理

软件

Linux/Mac下是否有Everything替代软件

mtsym 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 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 mtsym 发表于2019-05-04 浏览4842 评论0

有时候在UI上一些逻辑处理时会进行滚动状态监听,比如在使用ViewPager和RecyclerView的时候,但是有时候你可能发现某些状态并不会回调,例如SCROLL_STATE_IDLE,可能就出现bug了,为了避免这个问题,有几种办法

  1. 准确度要求不高,简单的情形下可以用timer
  2. 自己计算滚动状态然后进行处理,例如观察view的可见区域

技术坑

Android RecyclerView使用notifyItemRangeInserted的如何防止跳动

mtsym mtsym 发表于2019-05-04 浏览11602 评论0

Android在处理RecyclerView时候,如果使用notifyItemRangeInserted插入数据后可能界面发生跳动,解决这个问题只需要两步

  1. 把焦点优先获取权交给RecyclerView,并请求焦点,这样容器先hold住了焦点,便不会乱飞了
  2. 数据更新完成后,进行焦点恢复,将焦点优先权交给子元素,然后指定特定的view请求焦点

这个方案能解决大部分焦点乱跳问题,包括快速滚动的

代码大致如下


public void holdFocus(<!--autointro-->

技术坑

zblog远程发布文章API改进实现兼容wordpress xmlrpc

mtsym 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'] . '