您正在查看: 2013年

给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,直接取出缓存歌词


放首歌测试:

「シグナルグラフ」

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

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

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

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

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

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

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

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

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


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

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

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

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

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

踏み出していく

计算机二级的那些事

先晒成绩:

QQ截图20130525023603.png

首先要说下,我没有去考一级。因为一级的 Office 纯粹是常识题好吧……

然后刚好上个学期学了C语言,于是果断就报了二级的C语言…………

今年的题型还是很简单的,40道选择,3道程序题。

另外还要说的是,考试内容还有一本《二级公共基础知识》,纯粹坑爹,整本都是要背的概念神马的,不过我无视了……

考试的时候,大概前面10题都是基础知识题,纯脑补就好了,然后靠剩下的C语言题把分拉回来(因为公共基础知识只占10%的分)

选择题基本都是些问概念,问运行结果的

到了程序题,就是我好好发挥的地方了。

第一大题:程序填空题
很简单,就是在for循环之类的某段语句中挖个空,然后根据上下文填写就好(写好可以编译运行查看结果)

第二大题:程序修改题
题目要求是找到原程序错误之处,然后更正。
这里有个技巧:在每行错误内容前都有类似:

/* * * * * * * * * * * * * * found * * * * * * * * * * * * * */

这样的一行,只要在下一行找就好了(貌似是为改卷程序设计的?)

第三大题:程序设计题
一般就是留空一个函数,然后根据要求编写好函数就行,同样也是可以编译运行测试的

不得不吐槽下改卷速度,明明是机器改卷,愣是花了几个月的时间改,真心坑……

不过还好过了……写下来吐吐槽,供想考级的同学参考下

君と夏の終わり 将来の夢
(与你在夏末约定 将来的梦想)
大きな希望 忘れない
(远大的希望 别忘记)
10年後の8月
(十年后的八月)
また出会えるのを 信じて
(我相信我们还能再相遇)
最高の思い出を…
(最美好的回忆...)

出会いは ふっとした 瞬間 帰り道の交差点で
(相识 是在那麼不经意的瞬间 我在回家途中的十字路口)
声をかけてくれたね 「一緒に帰ろう」
(听见你的一声『一起回家吧』)
僕は 照れくさそうに カバンで顔を隠しながら
(我当时有点尴尬 还拿书包遮著脸)
本当は とても とても 嬉しかったよ
(其实我心里好高兴 真的好高兴)

あぁ 花火が夜空 きれいに咲いて ちょっとセツナク
(啊 烟火在夜空中灿烂盛开 几许伤感)
あぁ 風が時間とともに 流れる
(啊 风和时间一起流过)

嬉しくって 楽しくって 冒険も いろいろしたね
(很高兴 很愉快 也曾到处冒险)
二人の 秘密の 基地の中
(在我们的秘密基地中)

君と夏の終わり 将来の夢 大きな希望 忘れない
(与你在夏末约定 将来的梦想 远大的希望 别忘记)
10年後の8月 また出会えるのを 信じて
(我相信十年后的八月 我们还能再相遇)
君が最後まで 心から 「ありがとう」叫んでいたこと
(我知道一直到最后)
知っていたよ
(你仍在心底呼喊著『谢谢你』)
涙をこらえて 笑顔でさよなら せつないよね
(强忍著泪水笑著说再见 无限感叹涌现)
最高の思い出を…
(那一段最美好的回忆)

あぁ 夏休みも あと少しで 終わっちゃうから
(啊 暑假就快要过完了)
あぁ 太陽と月 仲良くして
(啊 太阳和月亮 关系也很好啊)

悲しくって 寂しくって 喧嘩も いろいろしたね
(想来令人悲伤 或许有些寂寥 我们也多有争吵)
二人の 秘密の 基地の中
(在我们的秘密基地中)

君が最後まで 心から 「ありがとう」叫んでいたこと
(我知道一直到最后)
知っていたよ
(你仍在心底呼喊著『谢谢你』)
涙をこらえて 笑顔でさよなら せつないよね
(强忍著泪水笑著说再见 无限感叹涌现)
最高の思い出を…
(那一段最美好的回忆)

突然の 転校で どうしようもなく
(你突然要转学 你我都无可奈何)
手紙 書くよ 電話もするよ 忘れないでね 僕のことを
(我会写信给你 也会打电话给你 请永远别忘记关于我的事)
いつまでも 二人の 基地の中
(那段在秘密基地中的日子)

君と夏の終わり ずっと話して
(与你在夏末 聊了那麼多)
夕日を見てから星を眺め
(看着黄昏 看着繁星点点)
君の頬を 流れた涙は ずっと忘れない
(流过你双颊的泪水 我永远不会忘记)
君が最後まで 大きく手を振ってくれたこと
(直到最后 你紧紧握住我的手)
きっと忘れない
(我永远不会忘记)
だから こうして 夢の中で ずっと永遠に…
(就这样 让我们永远在梦中相会吧)

君と夏の終わり 将来の夢 大きな希望 忘れない
(与你在夏末约定 将来的梦想 远大的希望 别忘记)
10年後の8月 また出会えるのを 信じて
(我相信十年后的八月 我们还能再相遇)
君が最後まで 心から 「ありがとう」叫んでいたこと
(我知道一直到最后)
知っていたよ
(你仍在心底呼喊著『谢谢你』)
涙をこらえて 笑顔でさよなら せつないよね
(强忍著泪水笑著说再见 无限感叹涌现)
最高の思い出を…
(那是最美好的回忆...)
最高の思い出を…
(那是最美好的回忆...)

  1. 1
  2. 2
  3. 3