Fork me on GitHub
一共有 32 篇文章,分页:1 / 7

唠叨

最近发现两个神器,不得不唠叨一下:

第一个是ES7的async/await,异步编程的正确姿势,写起Nodejs程序来如丝般顺滑,再见了,callback;

第二个是微软出的Visual Studio Code,全平台支持,各种扩展,自带git管理,带调试,一条龙服务,这就是我梦想中的编辑器啊,一直以来我都是在EditPlus上自己配扩展工具,看来我也要对EditPlus说再见了。

swfdump——从内存中提取swf的工具

刚刚整理代码时发现以前写的从进程的内存镜像中提取swf文件的工具,现在分享出来,希望能帮到有需要的朋友。 这个小工具是命令行使用,没有界面,可以很方便的从指定进程中(比如浏览器,swf播放器等等),按swf的文件头标识来提取解压后的swf文件.

在swf运行过程中,不论zlib压缩(cws)还是lzma压缩(zws)的swf文件,在内存中都会被解压成fws的格式,所以除非你的as3代码经过混淆或者使用内存欺骗的技巧,否则一般加密方式对于这种内存提取swf的方案都是徒劳,轻松可以获取as3代码和图片资源。

工具名称:swfdump
工具功能:从任意进程中读取swf
使用说明:swfdump.exe 进程名
示例:swfdump.exe chrome.exe
作者:yoyo(http://yoyo.play175.com)

下载地址:swfdump.zip (47KB)

(注意:本程序并没有病毒或其他破坏性的代码,但因为没有程序签名,chrome浏览器中下载时会提示:不是常见的下载类型,可能存在危险。如不放心,请勿使用)

从进程里面提取出swf之后该干嘛?当然是提取里面的素材嘛,所以您可以试试我写的另一款小工具,可以从swf中提取图片:swfread.

给nodejs的console.log增加时间戳

把下面的代码加到程序开始处。


(function() {//add timestamp to console.log
    var date = new Date();
    function now () {
        date.setTime(Date.now());
        var m = date.getMonth() + 1;var d = date.getDate();var hour = date.getHours();var minutes = date.getMinutes();
        var seconds = date.getSeconds();var milliseconds = date.getMilliseconds();
        return '[' + ((m < 10) ? '0' + m: m) + '-' + ((d < 10) ? '0' + d: d) +
               ' ' + ((hour < 10) ? '0' + hour: hour) + ':' + ((minutes < 10) ? '0' + minutes: minutes) +
               ':' + ((seconds < 10) ? '0' + seconds: seconds) + '.' + ('00' + milliseconds).slice(-3) + '] ';
    }
    var log = console.log;
    console.log = function () {
        var prefix = '';//cluster.isWorker ? '[WORKER '+cluster.worker.id + '] ' : '[MASTER]';
        if(typeof(arguments[0]) == 'string') {
            var first_parameter = arguments[0];//for this:console.log("%s","str");
            var other_parameters = Array.prototype.slice.call(arguments, 1);
            log.apply(console, [prefix + now() + first_parameter].concat(other_parameters));
        } else {
            var args = Array.prototype.slice.call(arguments);
            log.apply(console, [prefix + now()].concat(args));
        }
    }
})();

MySQL数据库性能优化

  • 在设计阶段需要考虑的设计原则是尽量减少耦合,sql语句尽量不要连接多个表来查询,如果不变化的数据,可以冗余存储到各自的表里,用空间换时间。

  • 建表时一律使用innodb数据引擎

  • 所有涉及到查询条件的字段都应该加上索引

  • 能用 redis 的就用 redis ,榨干 redis 的每一滴

  • 上线之后出现数据库性能问题,首先最重要的当然是优化SQL语句了,可以在线开启慢查询,把慢查询记录到mysql database的slow_log表里(参考下面的配置),一一分析哪些SQL语句比较耗时。

  • 使用 主从同步 来实现读写分离,推荐使用奇虎360开源的 Atlas 中间件 (https://github.com/Qihoo360/Atlas/) ,它可以把 insert、update 等语句发往主库,把 select 语句发往从库,避免在程序里做主从切换

  • 调试mysql配置,可以使用脚本:MySQLTuner,它能告诉你哪些配置需要优化。

wget http://mysqltuner.pl/ -O mysqltuner.pl

perl mysqltuner.pl

给一份大内存服务器(12G内存以上)的mysql配置文件参考,需要注意的一点是随着数据量的增长,下面的配置文件不是一成不变的,需要根据数据量做相应调整,服务器硬件也要跟上,该加内存的就得加内存:


[mysqld]

server-id=11
binlog_cache_size = 16M

#慢日志设置
slow_query_log = 1
long_query_time = 5     #查询时间超过多少秒算慢日志,视情况调整
log_output=TABLE       #把慢日志放到mysql数据库的slowlog表
log-slow-queries = ON
log_queries_not_using_indexes = OFF       #不记录无索引的查询,视情况开启

#innodb设置,具体意义请Google
innodb_flush_log_at_trx_commit = 2   
innodb_file_per_table = ON #是否一个表一个数据文件
innodb_buffer_pool_size = 8G  #根据数据总量和物理内存来衡量,越大越好,最好不要超过物理内存的80%
innodb_log_buffer_size = 8M
innodb_buffer_pool_instances = 8   #和innodb_buffer_pool_size相关,8G就8个,10G就10个,以此类推
innodb_log_file_size = 1G           #(innodb_log_files_in_group  * innodb_log_file_size ) 设置成innodb_buffer_pool_size的1/4最佳
innodb_log_files_in_group = 2

#查询缓存设定,视情况而定,如果数据读取很多,更新极少,可开启,否则请关闭
query_cache_type = 1
query_cache_size = 32M

#其他设置
tmp_table_size = 1024M
max_heap_table_size = 32M
thread_cache_size = 64
lower_case_table_names = 1
max_allowed_packet = 10M

#默认utf-8编码
character-set-server = utf8
collation-server = utf8_general_ci
init_connect = 'SET collation_connection = utf8_general_ci'
init_connect = 'SET NAMES utf8'

nrf51822的程序烧录

nrf51822的蓝牙协议栈称之为softdevice,是一段80k的二进制,需要使用nrfgo studio来烧录到地址为0x00的区段,而程序是烧录到0x14000的地址。如果你不需要使用蓝牙协议栈,只是普通的单片机程序的话,程序烧录到地址为0x00即可(需要先使用nrfgo studio把把整个flash擦除掉,即Erase All)

阅读全文 »»