Archive for the ‘Code杂谈’ category

使用NSIS工具制作安装包

November 21st, 2016

发布自己编写的程序是一件令人兴奋的事,在windows平台有InstallSheild和NSIS工具。

下面我使用NSIS来打包我的程序,对于打包不熟悉的人,该工具提供了向导方式,我们可以一步一步打包自己的程序。NSIS 大体布局如下:

  • 预设参数(包括外部压缩器选择、编译选项、宏定义以及文件包含等)
  • 普通安装设置
  • 自定义函数
  • 安装程序区域内容
  • 安装程序回调函数及其相关函数定义
  • 卸载程序区域内容
  • 卸载程序回调函数及其相关函数定义

如果对打包程序要求不太高的话,我们的工作主要集中安装程序区域内容和卸载程序区域内容,其他部分我们均可以使用向导默认生成,【1】中讲的比较细致,我们可以按照教程一步一步操作。在要选择要打包的文件时,直接把要打包的目录内容全部添加进来,注意两处*.*,以及勾选“包含子目录”,不要勾选”单独添加每个文件“,编译的时候会把所有的文件打包进来的。

281552003955288

我之前就是没有加*.*导致只加了工作目录下的文件,而那些子目录完全没有打包进去。之后就是设置一些快捷方式什么的,在结束向导的时候,我们需要勾选”保存脚本“,以及”转换文件路径到相对路径“,这样可以方便下次打包使用。

281552197992145

以上是通过图形化方式打包生成脚本,最后按Ctrl+F9编译成安装包。而通过编辑脚本的方式就是改脚本代码啦,虽然这种方式比较晦涩,但是可以更清楚展示软件包安装过程。【2】是一个实例脚本,我们只需要关注这两条语法:

; 循环包含目录下全部内容
File /r "F:\12\1\*.*"
; 只包含一个文件
File "F:\12\gf.gif"

Delete "$TEMP\magiclime.exe"
RmDir /r "SMPROGRAMSNSIS"

加入/r 就是循环加入,而不加/r 就是只添加该文件。RmDir主要是删除该子文件夹下的所有文件和子文件夹,而Delete是删除该文件  ,/r就是循环删除。

 

参考:

【1】http://www.cnblogs.com/modou/p/3573772.html

【2】示例脚本

新的篇章开始了

July 15th, 2016

        距离我上一篇文章已经过去了好几个月,这几个月家里面发生了一些变故,导致我心情比较低落。正好又赶上了我硕士毕业,种种原因导致我几个月没有更新blog。每次打开看到时间停滞在5月17日,就觉得这几个月有些荒废了,所以我要开始慢慢更新blog了。

       虽然我硕士做的东西跟我现在工作做的风马牛不相及,但是我仍然会关注操作系统学界和虚拟化学界的动态,关注开源社区的发展状况。

        以后我会在blog中慢慢开始写一些和Java相关的知识总结,我知道用baidu搜出来的Java基本可以满足我的需求,但是很多blog都有很严重的抄袭问题,很多内容没有自己的理解。我连续打开好几个blog,内容竟然写的一模一样,而我打开Stackoverflow发现有些答案正是我所需要的,我会结合自身遇到的问题,将解决方案和背后的原因总结出来,一方面是为了巩固自己所学的,另一方面也是为了强迫自己继续保持硕士期间的良好作风。

 

PS:虽然人在工作后就会有变懒的取向,但是我知道一个人只有在保持高度的自制力和行动力基础上,才会有更大的提升!克服懒惰,拥抱变化,拒绝做温水中的青蛙!

SSH 使用 — 如何从外网连接内网计算机

June 11th, 2016

SSH是我们经常使用的工具,但是因为现在组网方式非常复杂,导致跨越NAT非常难因应对,同一局域网下的SSH使用,我这里就不再赘述。我们来聊聊如何从外网连接内网的ssh-server。

首先我们可以选择偷懒的方式,设置主机别名,这样就不用每次都输入ssh user@remote -p port 了,我们可以在~/.ssh/config 里面追加以下内容:

Host lab
   HostName xxx.xxx.xxx.xxx
   User user
   Port port

保存之后,即可用 ssh lab 登入,如果还配置了公钥登入,那就连密码都不用输入了。

================

两台主机之间传输数据可以使用scp命令,它与ssh -p port 很类似,稍微的差别在与指定端口时用的是大写的 -P 而不是小写的。有了这些基础知识,下面我们聊聊如何从外网连接内网的ssh-server。为了实现这个功能,我们必须拥有一台公网主机,现在国内的vps非常便宜,阿里云或者腾讯云都可以。

假设现在我有一台处在公网的机器 bridge,这台机器拥有公网IP 。你在实验室也有一台机子lab,这台机子只能在实验室内部访问,但他可以访问公网,你希望能在任何地方都能访问这台机器。那么使用 ssh -R 可以轻松地做到这个事情。

lab$ ssh -R 10022:localhost:22 bridge
bridge$ ssh user@localhost -p 10022
lab$

只要上面这个过程成功了,就说明在你执行 ssh -R 10022:localhost:22 bridge(ssh -R 远端:本地 bridge,如果远端不添加0.0.0.0 就意味着只能bridge自己访问这个lab,如果添加了0.0.0.0就意味着可以其他机器可以通过bridge访问到)之后,你成功地将本地上的 22 端口反向转发到了 bridge 的 10022 端口。只要保持这个 ssh 不断,任何一台机器都可以首先连接到 bridge,然后通过 ssh user@localhost -p 10022 连回到 lab。

不过上面这么做并不稳健,如果因为网络波动导致 ssh -R 那个连接断了,那么从 bridge 就完全失去了到 lab 的控制。万幸的是,有一个叫做 autossh 的软件,可以自动的检测断线,并在断线的时候重连。在 Ubuntu 上你可以使用 sudo apt-get install autossh 来安装。

lab$ autossh -NfR 10022:localhost:22 bridge

上面这句话里面 -N 表示非不执行命令,只做端口转发;-f 表示在后台运行,-R 10022:localhost:22 就是把本地的22端口转发到远程的10022端口。我们也可以设置为开机时运行:在 /etc/rc.local 里面 exit 0 这句话之前加上

su - user -c autossh -NfR 10022:localhost:22 bridge

其中 user 是用户名。需要注意的是,开机时运行 autossh 需要配置公钥登入。

临时创建网站供查看

比如我在本地跑了一个网站,我想临时把我的网站发给朋友看看。在本地运行 python -m SimpleHTTPServer 即可在本地的8000端口启动一个网站,你可以在浏览器中通过 http://localhost:8000/ 看到。下面我们想让远方的朋友看到这个网站。

local$ ssh -NR 0.0.0.0:18000:localhost:8000 bridge

远方的朋友即可通过 http://bridge:18000/ 看到了。注意到这里和上面的命令有一个小小的不同,就是多了 0.0.0.0,这告诉 ssh,要把18000端口绑定在远端的所有IP上。如果像之前那样省略的话,缺省值是只绑定在 localhost,也就是只有在 jumpbox 本机才可以访问,而其他人都不能访问。

临时代理创建

比方说在本地的127.0.0.1:1080运行了HTTP代理服务,现在我想让另一台机子 remote 也能够使用这个HTTP代理。

local$ ssh -NR 11080:localhost:1080 remote
local$ ssh remote
remote$ export http_proxy=http://127.0.0.1:11080/
remote$ export https_proxy=http://127.0.0.1:11080/
remote$ curl http://ifconfig.co

用作 SOCKS5 代理

要是想要在家访问公司内网的一些网站,但是公司又没有提供进入内网的VPN,那怎么办呢?通过 ssh -D 可以在本地建立起一个 SOCKS5 代理:local$ ssh -ND 1080 workplace

 

【1】 ssh manual

在pcDuino上通过Cylon控制硬件

May 17th, 2016

准备工作:

我们用的板子型号是pcDuino3B(http://www.linksprite.com/linksprite-pcduino3/)。默认系统是ubuntu 12.04。推荐从官网下载固件(http://www.linksprite.com/linksprite-pcduino3/)把pcDuino刷到buntu 14.04,因为nodejs发展迭代比较快,低版本的gcc,g++无法编译某些nodejs。

安装具体的构建工具:

1. armhf的源非常少,所以例如sohu,163很多arm设备的源根本不支持,推荐原装的源,可能网速慢些,但起码比较齐全。
2. apt-get install build-essential
3. apt-get install git
4. ubuntu 12.04 的软件仓库中版本比较老,从仓库直接安装nodejs和npm后,安装grunt会存在问题,所以推荐源码安装,或者直接官网armv7二进制版本安装。
5. wget https://nodejs.org/dist/v6.1.0/node-v6.1.0-linux-armv7l.tar.xz
6. 解压缩node-v6.1.0-linux-armv7l.tar.xz
7. cd node-v5.10.1-linux-armv7l
8. 将其复制到/usr/local下即可使用
9. 查看node 版本 :node -v
10. 查看npm版本:npm -v
11. 安装好npm后,设置国内npm源:npm config set registry https://registry.npm.taobao.org

在安装过程中,我遇到很多坑,比如安装node-inspector,最后返回 ELIFECYCLE,通过查找资料,我们可以使用–unsafe-perm,对于一些在armv7上没有编译的二进制包,我们可以使用–build-from-source,直接本地编译(尽量使用g++ 4.8之后的版本)。

开始写代码:

比如我们在一个文件中写入:

'use strict';

    console.log("hello test");
    var Cylon = require("cylon");

    Cylon.robot({
      connections: {
        pcduino: { adaptor: 'pcduino' }
      },

      devices: {
        led: { driver: 'led', pin: 10 }
      },

      work: function(my) {
       every((1).second(), my.led.toggle);
      }
    }).start();

然后通过node运行,查看安装效果:

QQ图片20160517214206

目前已有很多项目在使用这个serialport包进行串口处理:

  • Johnny-Five – Firmata based Arduino Framework.
  • Cylon.js – JavaScript Robotics, By Your Command.
  • node-l8smartlight (source) A node library to control the L8 Smartlight via Bluetooth or USB port
  • firmata Talk natively to Arduino using the firmata protocol.
  • tmpad source – a DIY midi pad using infrared, arduino, and nodejs. Video
  • duino – A higher level framework for working with Arduinos in node.js.
  • Arduino Drinking Game Extravaganza – AKA “The Russian” a hexidecimal drinking game for geeks by Uxebu presented at JSConf EU 2011.
  • Arduino controlling popcorn.js – Controlling a popcorn.js video with an Arduino kit.
  • Robotic JavaScript – The first live presentation of the node-serialport code set as presented at JSConf EU 2010.
  • devicestack – This module helps you to represent a device and its protocol.
  • reflecta A communication protocol that combines Arduino Libraries and NodeJS into an integrated system.
  • rc4pt-node – Control Popcorntime with an Infrared receiver and Arduino.

参考

http://www.linuxidc.com/Linux/2016-04/130093.htmnodejs

官方代码仓库:https://nodejs.org/download/release/latest/

配置淘宝npm源:http://www.cnblogs.com/trying/p/4064518.html

http://cnodejs.org/topic/4f9904f9407edba21468f31e

试玩Chromebook Piexl

April 12th, 2016

Chromebook piexl是Google在2013年新出的一款超极本,他的外形十分小巧,内置Chorme OS系统,用户的操作处于云端,但是基于国内大家都懂得的网络环境,这款笔记本犹如鸡肋。配置清单如下:

Model Pixel (Wi-Fi)[19] Pixel (LTE) [19] Pixel (2015) [20] Pixel (LS) [20]
Release date February 2013 April 2013[21] March 2015 March 2015
Release price US$1299 US$1449 US$999 US$1299
Size 297.7 × 224.6 × 16.2 mm 297.7 × 224.55 × 15.3 mm
Weight 1.52 kilograms (3.4 lb) 1.5 kilograms (3.3 lb)
Processor Intel Core i5-3427U (dual-core 1.8 GHz) (CPU)
Intel HD Graphics 4000 (integrated) (GPU)
Intel Core i5-5200U (dual-core 2.2 GHz) (CPU)
Intel HD Graphics 5500 (integrated) (GPU)
Intel Core i7-5500U (dual-core 2.4 GHz) (CPU)
Intel HD Graphics 5500 (integrated) (GPU)
Memory 4 GB DDR3 RAM 8 GB DDR3 RAM 16 GB DDR3 RAM
Storage 32 GB Solid state 64 GB Solid state 32 GB Solid state 64 GB Solid state
Screen 12.85 in (326 mm)
2,560 × 1,700 (239 ppi)
3:2 (1.5:1) aspect ratio
400 nit brightness
178° viewing angle
Multi-touch
Gorilla Glass
Webcam 720p HD, integrated
Keyboard Backlit
Touchpad Clickable, etched-glass
Audio 3.5-mm combo headphone/microphone jack
3 built-in microphones
Integrated DSP (for noise cancellation)
Stereo speakers
Ports 2 × USB 2.0
Mini DisplayPort
SD/MMC card reader
2 × USB 3.1 Type-C (5Gbit/s data, power in, video out)
2 × USB 3.0 Type-A
SD/MMC card reader
WiFi 802.11a/b/g/n
Dual-band (2.4/5 GHz)
2×2 MIMO
802.11a/b/g/n/ac
Dual-band (2.4/5 GHz)
2×2 MIMO
Bluetooth Bluetooth 3.0 Bluetooth 4.0
Wireless LTE modem
Battery 59 Wh (5 hours active use) 72 Wh[22] (12 hours for average user behaviour)[22]
Included extras 1 TB Google Drive storage for 3 years
12 sessions GoGo Internet
100 MB/month free fromVerizon (US) (LTE only)
1 TB Google Drive storage for 3 years12 sessions GoGo Internet

我拿到手的是WiFi版本,可以看出CPU和Memeory在当时都算是主流本,唯一的问题就是内置的SSD太小了,只有32GB,装Windows肯定是不够的,所以我只好装了Ubuntu 14.04 LTS。默认情况Chromebook处于用户模式下,用户无权对系统进行修改,所以我们要先切换到开发者模式下:

  1. 同时按住Esc,F3和电源键,系统会自动重启,进入开发者模式
  2. 重启后,屏幕会显示系统处于开发者模式,不用管。直接Ctrl+D

18od6wnzwo855jpg

3. 这时已经进入系统(需要搭梯子)

Chromebook安装ubuntu有两种工具1.Crouton  2.硬盘安装。我个人喜欢硬盘安装,可以十分有效率的控制硬件。具体Crouton安装,可以参考:http://lifehacker.com/how-to-install-linux-on-a-chromebook-and-unlock-its-ful-509039343

硬盘安装的方式可能需要修改一些配置,因为Chromebook的SeaBios绑定了引导系统,所以我们必须关闭bios的安全引导功能,然后才可以安装启动ubuntu。首先我们打开终端Ctrl+Alt+T ,然后shell,然后运行sudo bash,这时我们就对系统有完整的控制权。这时我们

$crossystem
$crossystem dev_boot_usb=1
$crossystem dev_boot_legacy=1

然后重启,插入Ubuntu 安装盘,这时会进入Seabios,无视之,按下Ctrl+L && Esc即可。下面安装就大同小异了,推荐安装新版本内核,因为Chrombook拥有触摸屏和触摸板,在旧版本内核下可能无法使用,安装linux 4.0后的版本就很好的驾驭了,来张安装完成图:

IMG_1696

Chromebook只适合上网办公轻应用,遇到播放flash视频时,散热量非常大可能比较影响体验。

参考:

https://gbatemp.net/threads/how-to-install-windows-8-on-your-google-chromebook-pixel.350111/