code just like a piece of shit.

友情链接

以下是内页友链:

音乐的符号

从 2015-03-10 起,外链数过多的博客将被移动到内页中

给BAE/SAE上的应用程序加速

先吐槽一句:BAE就是个渣!!!!!!!!!

下面还是以贴吧签到助手为例介绍一下BAE/SAE应用提速的技巧:

1.禁用内存缓存

对,你没有看错,的确是禁用内存缓存。因为内存缓存服务器与Web服务器不在同一台服务器上,有时候甚至比直接去MySQL数据库取还要慢,建议使用数据库来做缓存表

2.能用CDN就用吧

像jQuery,用各大网站提供的CDN速度都不错,比起放在BAE/SAE上要快很多。当然BAE是个特例,就算用他们的CDN依然慢的要死

3.合并请求

把CSS、JS都合并成一个文件,虽然看单个文件比较大,但是请求一个文件的时间要比两个文件的时间短很多

4.云 ≠ 高速

永远记住,SAE上的运算速度是VPS的1/10,BAE上的运算速度是VPS的1/1000000(BAE能用?)

[JavaScript] 搜索QQ群内妹纸

可以一键搜索Q群内女性成员

QQ截图20131106031926.png

由于搜索速度比较慢(需要逐一获取群内用户资料)
建议启动后切到后台去运行……

将下面的链接拖放到收藏夹即可用:

一键搜索妹纸

贴吧签到助手 视频安装教程 V2

如果视频看不了请点这里:
http://www.bilibili.tv/video/av821996/

[性能优化] MySQL ORDER BY RAND()的替代方案

这是开发签到助手时遇到的问题……

需求:从数据库取没有签到的TID

原来的代码:

SELECT tid FROM sign_log WHERE status IN (0, 1) AND date='{$date}' ORDER BY RAND() LIMIT 0,1

当 sign_log 这个表非常大的时候,会出现 filesort 罢工的现象

EXPLAIN 的提示:Using where; Using temporary; Using filesort

这是由于 MySQL 在执行过程中需要遍历数据库,然后给每行分配一个权重值(因为用的是RAND函数),之后再用 filesort 的方式排序临时表,最后输出。

只是取一个tid而已……有必要遍历整个表么?有没有替代的方案呢?

答案是肯定的。这个算法分为3步,将上面一个查询拆解为2个:

1.从数据库取出最大数据量:

SELECT COUNT(*) FROM `sign_log` WHERE status IN (0, 1) AND date='{$date}'

2.用 PHP 的 rand 函数计算出 offset 值

$offset = rand(1, $count) - 1;

3.直接从数据库取出这一行的tid:

SELECT tid FROM `sign_log` LIMIT {$offset},1

(再次运行时可以略过第一步)

测试结果(共13506行数据):

ORDER BY RAND():
Using where; Using temporary; Using filesort
运行时间:0.0050160884857178秒

优化后:
查询1:Using where
查询2:Using index(注:tid字段有索引)
总运行时间:0.0021970272064209秒

改进后不仅提升了运行速度,还解决了 filesort 数据量上限的问题

HP Envy4 BIOS 硬盘模式设置

写在前面:

千万别买 HP 的笔记本了……
真把自己当老大了?还锁 BIOS……
就那几个选项你也好意思叫做BIOS?

如何修改硬盘工作模式:

1.确保已经开启 UEFI 模式

2.准备一个 FAT32 格式的 U 盘

3.下载并解压 BOOTX64.zip,扔到 U 盘根目录和 /EFI/BOOT/ 下

4.重启电脑,按 F9 选 U 盘启动

5.键入命令:

setup_var 0x39 0x01

6.按 Ctrl Alt Del 键重启,工作模式切换完毕

附各模式和值的对照表:

command      offset    value
setup_var    0x39      0x00       (IDE兼容模式)
setup_var    0x39      0x01       (AHCI模式)
setup_var    0x39      0x02       (RAID模式)

BAE 贴吧签到助手 详细配置教程

1.打开BAE开发者中心,新建应用:http://developer.baidu.com/dev#/create

1.png

2.点击左侧“云环境”,填入域名

2.png

3.点击创建新版本

3.png

4.左侧找到“MySQL数据库”,新建一个,按默认设置即可

4.png

5.确定后,记下数据库名称(这里是WRclCoCBqnsrEQxNRjlW),忘了也没关系,等会可以回来看的

6.打开压缩包,解压system/config.cfg.php

6.png

7.按照提示编辑好信息

7.png

8.压缩回去

8.png

9.回到百度平台,点击左侧“版本管理”,“包上传更新”,上传编辑好的压缩包

9.png

10.点击上线按钮,再点击“查看”

11.点击左下角的注册按钮,注册一个号(不用邀请码的)

10.png

12.进入“设置”,修改设置并填入cookie(获取方法页面有介绍)

11.png

13.回到“我喜欢的吧”,刷新下列表

12.png

14.回BAE,找到左侧“Cron 定时任务”,添加以下计划任务

名称
URL执行次数
时间表
Signhttp://你的域名.duapp.com/cron.php0* * * * *

15.搞定,等第二天签到结果吧

[源码] Java简易计算器

这学期程序设计学的是Java,期末要求制作一个计算器:

QQ截图20130621125013.png

花了一个晚上搞定,CalcWindow类负责界面绘制,Main类是主程序,关键代码如下:

package com.kookxiang.calc;
import javax.swing.JOptionPane;
public class Main {
    CalcWindow UI;
    double cur_num = 0;
    double prev_num = 0;
    boolean autoclean = false;
    boolean dotted = false;
    boolean last_equal = true;
    int mode = Mode.ADD;
    public void clear(){
        cur_num = prev_num = 0;
        autoclean = dotted = false;
        last_equal = true;
        mode = Mode.ADD;
        UI.numberBox.setText("0");
    }
    public void cal(){
        boolean _last_equal = last_equal;
        last_equal = true;
        String txt=UI.numberBox.getText();
        if(!_last_equal) eval();
        switch(mode){
            case Mode.ADD:          prev_num = prev_num + cur_num;  break;
            case Mode.MINUS:        prev_num = prev_num - cur_num;  break;
            case Mode.MUILTIPLY:    prev_num = prev_num * cur_num;  break;
            case Mode.DIVISION:     prev_num = prev_num / cur_num;  break;
        }
        txt = prev_num+"";
        UI.numberBox.setText(txt);
        http:// 消掉结尾的 *.0
        if(txt.endsWith(".0")) UI.numberBox.setText(txt.substring(0, txt.length()-2));
        autoclean = true;
        if(Double.isNaN(prev_num) || Double.isInfinite(prev_num)){
            clear();
            JOptionPane.showMessageDialog(null, "发生未知错误");
        }
    }
    public void eval(){
        if(!last_equal) cal();
        prev_num = cur_num;
        dotted = false;
        autoclean = true;
        cur_num = Double.parseDouble(UI.numberBox.getText());
    }
    public void onCreate(String[] flags){
        UI = new CalcWindow(this);
        clear();
    }
    public static void main(String[] args) {
        new Main().onCreate(args);
    }
    public void handleAction(String command) throws Exception {
        String txt=UI.numberBox.getText();
        if(txt.equals("0")) txt = "";
        switch(command){
            case "exit":    System.exit(0);     break;
            case "clear":   clear();    break;
            case "backspace":
                if(txt.isEmpty()) return;
                if(autoclean){
                    UI.numberBox.setText("");
                    autoclean = false;
                    return;
                }
                UI.numberBox.setText(txt.substring(0, txt.length()-1));
                break;
            case "dot":
                if(dotted) return;
                dotted = true;
                command = ".";
            case "1":   case "2":   case "3":   case "4":   case "5":   case "6":   case "7":   case "8":   case "9":   case "0":   case ".":
                UI.numberBox.setText(autoclean ? command : txt + command);
                autoclean = false;
                last_equal = false;
                break;
            case "dn":
                if(txt.isEmpty()) return;
                if(txt.substring(0, 1).equals("-")){
                    UI.numberBox.setText(txt.substring(1));
                }else{
                    UI.numberBox.setText("-"+txt);
                }
                break;
            case "add":         if(txt.isEmpty()) return; eval();   mode = Mode.ADD;        break;
            case "minus":       if(txt.isEmpty()) return; eval();   mode = Mode.MINUS;      break;
            case "multiply":    if(txt.isEmpty()) return; eval();   mode = Mode.MUILTIPLY;  break;
            case "division":    if(txt.isEmpty()) return; eval();   mode = Mode.DIVISION;   break;
            case "cal":         cal();  break;
            default:    throw new Exception("Unknown command");
        }
    }
}


完整源代码下载:Calculator.rar

KKLRC 歌词挂件正式加入缓存功能

终于加入缓存功能了

再也不用担心用了太多正则匹配影响效率了~


现在将歌词处理结果自动储存在cache文件夹

然后遇到kk_lrc标签时通过md5的方式得到缓存id,直接取出缓存歌词


放首歌测试:

「シグナルグラフ」

手が届きそう 目の前で笑う君
触れられそうな 距離にいても

強がってまた閉じ込めてしまうけど
心 零れそうな想いはもう見ないふり

涙でにじんだ 曇り空でも
もっと高い場所には眩しい空 広がる
「かわる合図」

高くその手掲げ行こう
怯えてた昨日から
手放したはずの未来へ
連れ出して

君と君の中に強く光るもの
気付いたから
今まっすぐ見つめて
君と一緒に踏み出していく

つかめそうな夢をひとつ転がし
頬杖 窓の外を見ていた

目が合う度 うまく言えない
だから笑顔 零れそうな想いをそっと伝えてよ

確かめ合うのは 弱いせいじゃない
もっと強く結び合う その心を教ぇて
「かわる合図」

加速していく足も 君と
追い風をつかむから
手放したはずの未来へ
もう一度


君がくれた強さ 胸に抱きしめて
いつの日にかきっと
誰かの軌道を照らし出すため
輝きたい

眩しい光が 背中を押すように 広がる

高くその手掲げ行こう
怯えてた昨日から
手放したはずの未来へ
連れ出して

君と君の中に強く光るもの
気付いたから
その手繋いで行こう

時がくればいつか変わる
なんてもう言わないよ
手放したはずの未来へ
もう一度
加速してく風にも
眼を閉じない 逸らさないように
まっすぐ見つめて
君と一緒に踏み出していく

踏み出していく

  1. 1
  2. ...
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. ...
  11. 11