存档

安装 pywin32 的坑

2017/09/27 9,420

坑1 :

在 Pypi 上有 pywin32 的页面 ,然后无法使用 pip 命令来安装它,只有到 Sourceforge 下载源码或安装程序

坑2:

如果你下载了源码,可以使用:

setup.py install

来自动编译安装。很不幸,我的windows上编译环境比较复杂( 有 vs2013/2015/2017)。 setup.py 在编译时抛出了各种环境错误。好在我有 mingw,使用命令:

setup.py build --compiler mingw32

用 mingw 来进行编译,然后被抛出错误:

win32/src/PyACL.cpp:1090:7: warning: unused variable 'pacl' [-Wunused-variable]
ACL *pacl=This->GetACL();

那么下载安装包直接进行安装吧  🙁

坑3:

我使用的是win10 64位操作系统,使用 python2.7 环境。于是下载了 pywin32-221.win-amd64-py2.7.exe 。点击安装,下一步:

仔细检查,环境变量是没有问题的。再手动选择python安装路径(只能粘贴,不可以键盘输入),还是有错误…… 查注册表,发现注册表里有一些缺失。添加注册表:

[HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.7]

[HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.7\Help]

[HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.7\Help\Main Python Documentation]
@="E:\\program\\Python27\\Doc\\python2713.chm"

[HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.7\InstallPath]
@="E:\\program\\Python27\\"
"ExecutablePath"="E:\\program\\Python27\\"

[HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.7\InstallPath\InstallGroup]
@="Python 2.7"

[HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.7\Modules]

[HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.7\PythonPath]
@="E:\\program\\Python27\\Lib;E:\\program\\Python27\\DLLs;E:\\program\\Python27\\Lib\\lib-tk"

OK ,安装成功!😏

坑4:

在 python 中运行一下:

>>>import win32clipboard

出现错误:ImportError: DLL load failed: %1 不是有效的 Win32 应用程序。

摔……😡

再次检查,发现这台电脑是安装的python 是32位 版本的。再次安装 pywin32 的32位版本,这次运行成功……

🤣

如何在 VSCode 中调试 Electron

2017/09/19 7,492

1 步骤

  • 将 vscode 切换到 debug 视图 ( Ctrl+Shift+D ) 
  • 打开 launch.json .在 configurations 节点下添加以下对象并保存
{
    "type": "node",
    "request": "launch",
    "name": "Electron Main",
    "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron",
    "program": "${workspaceRoot}/main.js",
    "protocol": "legacy"
}
  • 在 main.js 中添加一个断点
  • 在 vscode 中点击 “开始调试”  ,命中断点,即可开始调试。

2 变量

在 launch.json 中有一些预定义的变量:

  • ${workspaceRoot} VSCode 打开的文件夹目录路径
  • ${workspaceRootFolderName} 根路径文件夹名称
  • ${file} 当前打开的文件
  • ${relativeFile} 当前打开文件相对于 workspaceRoot 的相对路径
  • ${fileBasename} 当前打开文件的文件名
  • ${fileBasenameNoExtension} 不带扩展名的文件名
  • ${fileExtname} 当前打开文件的扩展名
  • ${fileDirname} 当前打开文件的文件夹名称
  • ${cwd} 运行任务的工作路径
  • ${lineNumber} 当前文件的选择行

除了这些预定义的变量,还可以使用

  • ${env:Name} 来使用环境变量,如 ${env:PATH}
  • ${config:Name} 来使用 VSCode 的设置,如 ${config:editor.fontSize}
  • ${command:CommandID} 来执行命令行,如 ${command:explorer.newFolder} (windows)

3 不同操作系统的配置

launch.js 还支持对不同的操作系统作特殊配置,如:

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug Main Process",
      "type": "node",
      "request": "launch",
      "cwd": "${workspaceRoot}",
      "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron",
      "windows": {
        "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron.cmd"
      },
      "args" : ["."]
    }
  ]
}

对于 runtimeExecutable 节点, windows 操作系统使用 electron.cmd 文件,而其它操作系统使用 electron 操作系统分别定义为: windows , linux , osx 三种。

必应 bing.com 背景图下载

2017/04/06 7,146

必应有一个 API 可以获取背景图的信息:

http://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1

其中,idx 为向后的天数,idx<=10.  n 为获取信息的条数,n<10.

返回json格式的数据:

{
    "images": [
        {
            "startdate": "20170405",
            "fullstartdate": "201704051600",
            "enddate": "20170406",
            "url": "/az/hprichbg/rb/FreshSalt_ZH-CN12818759319_1920x1080.jpg",
            "urlbase": "/az/hprichbg/rb/FreshSalt_ZH-CN12818759319",
            "copyright": "淡水和盐水在埃斯塔蒂特附近的三河河口交汇,西班牙 (© Yann Arthus-Bertrand/Getty Images)",
            "copyrightlink": "http://www.bing.com/search?q=L'Estartit&form=hpcapt&mkt=zh-cn",
            "quiz": "/search?q=Bing+homepage+quiz&filters=WQOskey:%22HPQuiz_20170405_FreshSalt%22&FORM=HPQUIZ",
            "wp": true,
            "hsh": "800425f6986718006147107f1e622f39",
            "drk": 1,
            "top": 1,
            "bot": 1,
            "hs": []
        }
    ],
    "tooltips": {
        "loading": "正在加载...",
        "previous": "上一个图像",
        "next": "下一个图像",
        "walle": "此图片不能下载用作壁纸。",
        "walls": "下载今日美图。仅限用作桌面壁纸。"
    }
}

有这些信息,就可以每天抓取bing的背景图了

继续阅读

VIM 使用技巧 : 分屏

2017/04/03 6,876

1 分屏启动VIM

  • 使用参数 O 垂直分屏:
vim -O<n> file1 file2 ...
  • 使用参数 o 水平分屏:
vim -o<n> file1 file2 ...

<n> 为数据,表示分成几屏

继续阅读

javascript 实现文本到 emoji 的转换

2017/03/15 7,281

实际上这就是一个将文字转换为对应的图像并在前端显示出来的过程

目前所有的 emoji 与文件的对应关系定义如下:

var emoji={"[大笑]":{file:"emoji_0.png"},
"[可爱]":{file:"emoji_01.png"},
"[色]":{file:"emoji_02.png"},
"[嘘]":{file:"emoji_03.png"},
"[亲]":{file:"emoji_04.png"},
"[呆]":{file:"emoji_05.png"},
"[口水]":{file:"emoji_06.png"},
"[汗]":{file:"emoji_145.png"},
"[呲牙]":{file:"emoji_07.png"},
"[鬼脸]":{file:"emoji_08.png"},
"[害羞]":{file:"emoji_09.png"},
"[偷笑]":{file:"emoji_10.png"},
"[调皮]":{file:"emoji_11.png"},
"[可怜]":{file:"emoji_12.png"},
"[敲]":{file:"emoji_13.png"},
"[惊讶]":{file:"emoji_14.png"},
"[流感]":{file:"emoji_15.png"},
"[委屈]":{file:"emoji_16.png"},
"[流泪]":{file:"emoji_17.png"},
"[嚎哭]":{file:"emoji_18.png"},
"[惊恐]":{file:"emoji_19.png"},
"[怒]":{file:"emoji_20.png"},
"[酷]":{file:"emoji_21.png"},
"[不说]":{file:"emoji_22.png"},
"[鄙视]":{file:"emoji_23.png"},
"[阿弥陀佛]":{file:"emoji_24.png"},
"[奸笑]":{file:"emoji_25.png"},
"[睡着]":{file:"emoji_26.png"},
"[口罩]":{file:"emoji_27.png"},
"[努力]":{file:"emoji_28.png"},
"[抠鼻孔]":{file:"emoji_29.png"},
"[疑问]":{file:"emoji_30.png"},
"[怒骂]":{file:"emoji_31.png"},
"[晕]":{file:"emoji_32.png"},
"[呕吐]":{file:"emoji_33.png"},
"[拜一拜]":{file:"emoji_160.png"},
"[惊喜]":{file:"emoji_161.png"},
"[流汗]":{file:"emoji_162.png"},
"[卖萌]":{file:"emoji_163.png"},
"[默契眨眼]":{file:"emoji_164.png"},
"[烧香拜佛]":{file:"emoji_165.png"},
"[晚安]":{file:"emoji_166.png"},
"[强]":{file:"emoji_34.png"},
"[弱]":{file:"emoji_35.png"},
"[OK]":{file:"emoji_36.png"},
"[拳头]":{file:"emoji_37.png"},
"[胜利]":{file:"emoji_38.png"},
"[鼓掌]":{file:"emoji_39.png"},
"[握手]":{file:"emoji_200.png"},
"[发怒]":{file:"emoji_40.png"},
"[骷髅]":{file:"emoji_41.png"},
"[便便]":{file:"emoji_42.png"},
"[火]":{file:"emoji_43.png"},
"[溜]":{file:"emoji_44.png"},
"[爱心]":{file:"emoji_45.png"},
"[心碎]":{file:"emoji_46.png"},
"[钟情]":{file:"emoji_47.png"},
"[唇]":{file:"emoji_48.png"},
"[戒指]":{file:"emoji_49.png"},
"[钻石]":{file:"emoji_50.png"},
"[太阳]":{file:"emoji_51.png"},
"[有时晴]":{file:"emoji_52.png"},
"[多云]":{file:"emoji_53.png"},
"[雷]":{file:"emoji_54.png"},
"[雨]":{file:"emoji_55.png"},
"[雪花]":{file:"emoji_56.png"},
"[爱人]":{file:"emoji_57.png"},
"[帽子]":{file:"emoji_58.png"},
"[皇冠]":{file:"emoji_59.png"},
"[篮球]":{file:"emoji_60.png"},
"[足球]":{file:"emoji_61.png"},
"[垒球]":{file:"emoji_62.png"},
"[网球]":{file:"emoji_63.png"},
"[台球]":{file:"emoji_64.png"},
"[咖啡]":{file:"emoji_65.png"},
"[啤酒]":{file:"emoji_66.png"},
"[干杯]":{file:"emoji_67.png"},
"[柠檬汁]":{file:"emoji_68.png"},
"[餐具]":{file:"emoji_69.png"},
"[汉堡]":{file:"emoji_70.png"},
"[鸡腿]":{file:"emoji_71.png"},
"[面条]":{file:"emoji_72.png"},
"[冰淇淋]":{file:"emoji_73.png"},
"[沙冰]":{file:"emoji_74.png"},
"[生日蛋糕]":{file:"emoji_75.png"},
"[蛋糕]":{file:"emoji_76.png"},
"[糖果]":{file:"emoji_77.png"},
"[葡萄]":{file:"emoji_78.png"},
"[西瓜]":{file:"emoji_79.png"},
"[光碟]":{file:"emoji_80.png"},
"[手机]":{file:"emoji_81.png"},
"[电话]":{file:"emoji_82.png"},
"[电视]":{file:"emoji_83.png"},
"[声音开启]":{file:"emoji_84.png"},
"[声音关闭]":{file:"emoji_85.png"},
"[铃铛]":{file:"emoji_86.png"},
"[锁头]":{file:"emoji_87.png"},
"[放大镜]":{file:"emoji_88.png"},
"[灯泡]":{file:"emoji_89.png"},
"[锤头]":{file:"emoji_90.png"},
"[烟]":{file:"emoji_91.png"},
"[炸弹]":{file:"emoji_92.png"},
"[枪]":{file:"emoji_93.png"},
"[刀]":{file:"emoji_94.png"},
"[药]":{file:"emoji_95.png"},
"[打针]":{file:"emoji_96.png"},
"[钱袋]":{file:"emoji_97.png"},
"[钞票]":{file:"emoji_98.png"},
"[银行卡]":{file:"emoji_99.png"},
"[手柄]":{file:"emoji_100.png"},
"[麻将]":{file:"emoji_101.png"},
"[调色板]":{file:"emoji_102.png"},
"[电影]":{file:"emoji_103.png"},
"[麦克风]":{file:"emoji_104.png"},
"[耳机]":{file:"emoji_105.png"},
"[音乐]":{file:"emoji_106.png"},
"[吉他]":{file:"emoji_107.png"},
"[火箭]":{file:"emoji_108.png"},
"[飞机]":{file:"emoji_109.png"},
"[火车]":{file:"emoji_110.png"},
"[公交]":{file:"emoji_111.png"},
"[轿车]":{file:"emoji_112.png"},
"[出租车]":{file:"emoji_113.png"},
"[警车]":{file:"emoji_114.png"},
"[自行车]":{file:"emoji_115.png"}};

使用正则表达式替换成文件,代码如下:

function buildEmoji(text) {
    var re =  /\[([^\]\[]*)\]/g;
    var matches = text.match(re) || [];
    for (var j = 0, len = matches.length; j < len; ++j) {
        if(emoji[matches[j]]){
            text = text.replace(matches[j], '<img class="emoji" src="../static/modules/message/images/emoji/' + emoji[matches[j]].file + '" />');
        }
    }
    return text;
}

 

并定义出相应的 style 即可。

用到的 emoji 图片与 js 文件可以在这里下载

 

centOS 配置使用 openvpn

2017/03/14 7,051

1 install

yum install openvpn

2 config

在 /etc/openvpn 下建立目录,如 config/,用于存放配置文件,将服务器生成的证书、配置文件等放入其中。

3 run

openvpn --cd /etc/openvpn/config --config  client_a.open
  • –cd  配置文件所在的目录,openvpn命令会先进入到此目录
  • –config  配置文件名称

Python 操作 Execel

2016/12/08 6,620

NDK 无法 Debug的一个问题

2016/06/15 6,619

在使用 Android NDK 进行 native 代码调试时,尽管 Android.mk/Application.mk 与Gradle 中都指定了Debug编译,但 C 代码的断点一直无法命中。 排查后,使用 greadelf(Mac)/readelf(Unix) –header x.so 查看编译出来的 so ,发现其中没有debug信息,那么一定是 ndk-build 的过程中出现了问题。无意中发现ndk-build 编译完成以后,又调用了 strip ,这一步将 so 中的一些无用的符号移除了,当然也包括debug信息。

在 Android.mk 中将 strip 这一步做个处理,使其在debug时不执行:

ifeq ($(APP_OPTIM),debug)
    cmd-strip :=
endif