Minecraft Linux版中文输入解决办法


只能算个workaround,不是正经的mod或者patch。。。
只是在窗口下方加了个高20px的TextField,没有对MC的内部做修改
问题原因:

  1. ibus 如果系统装有ibus的话,ibus无论是在输入法开启还是关闭状态都会拦截所有输入,所以ibus运行时mc完全接收不到按键信号,于是网上很多解决linux下mc按键问题都是先kill掉ibus-daemon,运行mc,mc退出后再重启ibus
  2. lwjgl 解决掉ibus之后,紧接着另一个问题出现了,mc的所有输入信号全都是通过lwjgl库来处理,而lwjgl貌似还不支持中文

解决方法:换掉ibus,使用java自己的文本输入框
步骤:

  1. 卸载ibus,安装fcitx,fedora系统的话可以直接使用yum安装,个人认为fcitx比ibus好用多了
  2. 按mc版本下载对应补丁
    版本 下载地址
    1.2.5 [wpdm_file id=4]
    1.3.2 [wpdm_file id=5]
  3. 安装。和正常的mod安装方法相同,把压缩包中文件拖进minecraft.jar中的对应位置即可

副作用。。。。:MinecraftSP启动器无法使用,需要直接命令行启动minecraft.jar

cd ~/.minecraft/bin;java -Xms1024m -Xmx2048m -cp jinput.jar:lwjgl.jar:lwjgl_util.jar:minecraft.jar -Djava.library.path="./natives" net.minecraft.client.Minecraft YOUR_ID

记得把YOUR_ID改成自己的名字

另附添加了jvm调优参数的脚本

[yinseny@localhost bin]$ cat /usr/bin/minecraft 
#!/bin/bash
cd /home/yinseny/.minecraft/bin
java -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSIncrementalPacing -XX:+UseFastAccessorMethods -XX:+AggressiveOpts  -XX:+DisableExplicitGC -XX:+UseAdaptiveGCBoundary -XX:MaxGCPauseMillis=500 -XX:SurvivorRatio=16 -XX:UseSSE=3 -XX:ParallelGCThreads=2 -Xms1024m -Xmx2048m -cp jinput.jar:lwjgl.jar:lwjgl_util.jar:minecraft.jar -Djava.library.path="./natives" net.minecraft.client.Minecraft yinseny >> /dev/null

效果截图:

源码(1.3.2):
修改后的main函数

	public static void main(String[] par0ArrayOfStr) {
		......
		final Frame var12 = new Frame();//需要把frame设置成final
		var12.setTitle("Minecraft");
		var12.setBackground(Color.BLACK);
		JPanel var11 = new JPanel();
		var12.setLayout(new BorderLayout());
		var11.setPreferredSize(new Dimension(854, 480));
		var12.add(var11, "Center");
		var12.pack();
		var12.setLocationRelativeTo((Component) null);
		var12.setVisible(true);
		var12.addWindowListener(new GameWindowListener());
		MinecraftFakeLauncher var9 = new MinecraftFakeLauncher(var1);
		MinecraftApplet var13 = new MinecraftApplet();
		var13.setStub(var9);
		var9.setLayout(new BorderLayout());
		var9.add(var13, "Center");
		var9.validate();
		var12.removeAll();
		var12.setLayout(new BorderLayout());
		var12.add(var9, "Center");
		var12.validate();
		var13.init();
		var13.start();
		Runtime.getRuntime().addShutdownHook(new ThreadShutdown());

		//以下为添加的代码
		final java.awt.TextField chatline = new java.awt.TextField();
		var12.add(chatline, BorderLayout.PAGE_END);
		chatline.setPreferredSize(new Dimension(854, 20));
		chatline.addKeyListener(new java.awt.event.KeyListener() {
			@Override
			public void keyPressed(java.awt.event.KeyEvent arg0) {
				if (arg0.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) {
					String tmp = chatline.getText();
					if (tmp != null && !tmp.isEmpty()) {
						theMinecraft.getSendQueue().addToSendQueue(
								new Packet3Chat(tmp));
						chatline.setText("");
					}
				} else if (arg0.getKeyCode() == java.awt.event.KeyEvent.VK_ESCAPE) {
					chatline.setText("");
				}
			}
			@Override
			public void keyTyped(java.awt.event.KeyEvent e) {}
			@Override
			public void keyReleased(java.awt.event.KeyEvent e) {}
		});
		var12.pack();
		var12.validate();
		// 结束
	}

Wine QQ 2012 点击密码框崩溃的解决办法

出错原因:user32编译时使用O2等级优化
解决方法:修改user32的Makefile优化等级并重新编译
步骤:

  1. 直接安装二进制包的需要先下载wine-1.4源代码(下载地址)并解压
  2. 打开wine-1.4/dlls/user32/Makefile,将
    CFLAGS          = -g -O2

    修改为

    CFLAGS          = -g -O0
  3. 保存后重新编译当前文件夹:
    cd wine-1.4/dlls/user32/
    make
    

    从源码安装wine的可以直接

    sudo make install
    

    安装二进制包的需要手动将新的user32.dll.so覆盖掉原来的,存放位置一般在/usr/local/lib/wine或/usr/lib/wine下

顺便附上编译好的user32:[wpdm_file id=3]

花密 Gnome Shell 扩展【2012/11/01更新】

自从CSDN被拖库之后就正式改用花密,所有网络应用的密码全部更换,但是因为一直系统都是fedora,没有桌面版,有时一些桌面客户端登录需要密码时还得打开浏览器才行,网上搜了一下发现linux平台只有一个cli版生成器,不是很方便,再加上最近终于下决心升到gnome3,于是攒出了个gnome shell的扩展

功能完全正常,自动生成密码,窗口隐藏后数据立刻清空,另外多语言支持中文和英文,唯一的遗憾就是记忆密码栏没办法实现星号

gnome-shell 版本>=3.2

需要gpaste实现复制功能

yum install gpaste

效果图:

 

———————————————————
Update:
-20121101
更新兼容至Gnome3.5
更改init/enable/disable方法

下载地址:[wpdm_file id=6]

 

基于pygtk的Linux原生豆瓣电台客户端

由于对客户端有强迫症,想听豆瓣电台又不想用网页版,网上搜了一下linux的又只有播放器插件(banshee , exaile),都不很满意

一气之下自己捣鼓一个吧,正好练练手

学习了一下pygtk,用着太爽了,尤其是配合glade做GUI

效果图:

 

由于只是娱乐用,所以不会对源码有什么维护…

需要gstreamer-plugins-ugly gstreamer-python pygtk2-libglade(必须是2)

yum install gstreamer-plugins-ugly gstreamer-python pygtk2-libglade

与豆瓣电台交互部分使用的libdoubanfm.py

 

源码下载: {filelink=1}

图片分块python脚本【2011/12/22更新】

前段时间看到有QQ群把图片拆成3×3的9份图片,上传到群相册之后显示成一个大图,蛮好玩,也弄了一个,上传到动漫社的群里了

效果图:

 

不过手动分还是好麻烦啊,于是随手用python写了个小脚本,就当练手了,顺便熟悉了一下pil,确实挺好用

————————————————————————————————-

2011/12/22更新:把图片之间的间隙也算了进来,显示效果更好了
新效果图:

 

import sys
import Image

if len(sys.argv) < 4:  
    print u'Usage: %s filename horizonpiece verticalpiecen' % sys.argv[0]
    exit()

fname=((9,8,7),(6,5,4),(3,2,1))

im = Image.open(sys.argv[1])
size = im.size
piece = (int(sys.argv[2]), int(sys.argv[3]))
print 'piece', piece
padding = (size[0]*5/136,size[1]*8/184)
print 'padding', padding
piecesize = ((size[0]-2*padding[0])/piece[0], (size[1]-2*padding[1])/piece[1])
print 'size of every piece', piecesize

for x in range(1, piece[0]+1):
    for y in range(1, piece[1]+1):
        #(left, upper, right, lower)
        box = (piecesize[0]*(x-1)+(x-1)*padding[0], piecesize[1]*(y-1)+(y-1)*padding[1], piecesize[0]*x+(x-1)*padding[0], piecesize[1]*y+(y-1)*padding[1])
        print 'crop image', box
        p = im.crop(box)
        p.save(str(fname[y-1][x-1])+'.jpg')
print 'finished!'

PHP通过curl登录人人并发布状态…


$username=$_POST["username"];

$password=$_POST["password"];

$message=$_POST["message"];

if($message!=""){

	updateRenren($message,$username,$password,0);

	echo $message;

}

function updateRenren($status,$renren_username,$renren_password,$tried_times){
	if($tried_times>=3){
		return false;
	}

	$cookie_jar=tempnam('./tmp','renren');
	$ch=&getCurl($cookie_jar,"POST","http://passport.renren.com/PLogin.do");
	curl_setopt($ch,CURLOPT_POSTFIELDS,'email='.urlencode($renren_username).'&password='.urlencode($renren_password).'&autoLogin=true&origURL=http%3A%2F%2Fwww.renren.com%2FHome.do&domain=renren.com');
	$str=&sendAndResult($ch);
	$pattern="/get_check:'([^']+)'/";
	preg_match($pattern,$str,$matches);
	$get_check=$matches[1];
	$ch=&getCurl($cookie_jar,"POST","http://status.renren.com/doing/update.do");	curl_setopt($ch,CURLOPT_POSTFIELDS,'c='.urlencode($status).'&raw='.urlencode($status).'&isAtHome=1&publisher_form_ticket='.$get_check.'&requestToken='.$get_check);
	curl_setopt($ch,CURLOPT_REFERER,'http://status.renren.com/ajaxproxy.htm');
	$ret=&sendAndResult($ch);
	if(strpos($ret,"{"allMsg":")===0){
		echo "[Renren] succeedn";
	}else{
		echo "[Renren] failedn";
		updateRenren($status,$renren_username,$renren_password,$tried_times+1);
	}
}


function &getCurl($jar,$method,$url){
	$ch=curl_init();
	curl_setopt($ch,CURLOPT_COOKIEJAR,$jar);
	curl_setopt($ch,CURLOPT_COOKIEFILE,$jar);
	curl_setopt($ch,CURLOPT_URL,$url);
	curl_setopt($ch,CURLOPT_FOLLOWLOCATION,TRUE);
	curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
	curl_setopt($ch, CURLOPT_USERAGENT,"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8");
	//curl_setopt($ch,CURLOPT_VERBOSE,true);
	if($method=="POST"){
	curl_setopt($ch,CURLOPT_POST,TRUE);
	}else{
	curl_setopt($ch,CURLOPT_POST,FALSE);
	}
	return $ch;
}


function &sendAndResult(&$ch){
	$str=curl_exec($ch);
	curl_close($ch);
	unset($ch);
	return $str;
}

Linux下自动更新chromium

为了提高下载速度,下载压缩包时没有用wget,用的是axel,可以分段下载的下载利器,速度是wget的N倍。
可以直接apt-get install axel
或者去http://axel.alioth.debian.org/下载
或者把脚本里的axel去掉,换回wget…

#!/bin/bash
CHROME_DIR="/home/yins"
CHROME_TEMP="/home/yins/.chromium_update"

clean(){
	echo "update error!"
	rm LATEST
	rm chrome-linux.zip*
	exit
}

trap clean TERM
trap clean INT

cd "${CHROME_TEMP}"
if [ -a LATEST ];then
	old=`cat LATEST`
	rm LATEST
	echo "remove the latest file LATEST..."
else
	old=0
fi
if [ -a chrome-linux.zip ];then
	rm chrome-linux.zip
	echo "remove the latest file chrome-linux.zip..."
fi
if [ -a SUCCESS ];then
	rm SUCCESS
fi
echo "getting the LATEST..."
wget http://build.chromium.org/buildbot/snapshots/chromium-rel-linux-64/LATEST -O LATEST
last=`cat LATEST`
if [ ${last} -gt ${old} ] || [ ${last} -eq ${old} ] && [ ! -a SUCCESS ];then
	url="http://build.chromium.org/buildbot/snapshots/chromium-rel-linux-64/${last}/chrome-linux.zip"
	zenity --question --timeout 30 --title='new update' --text="latest : ${last}!! current: ${old} ,30 seconds to choose..."
	if [ $? -eq 0 ];then
		axel -a -n 10 "${url}"
		zenity --question --timeout 30 --title='file downloaded' --text="unzip now ? 30 seconds to choose..."
		if [ $? -eq 0 ];then
			unzip -o chrome-linux.zip -d "${CHROME_DIR}"
			touch SUCCESS
		fi
	else
		rm LATEST
	fi
else
	echo "no update,current: ${old} ..."
fi
echo "========OK========="

再配上计划任务:
先是

$crontab –e

第一次运行crontab的话需要先选择默认编辑器

内容:

#m h dom mon dow command
*/15 * * * * xxx
#每15分钟执行一次xxx命令

3款免费php在线代理源码分享

找到三款比较主流易用的免费web代理程序:GlypePhpproxyZelune。非常适合挂在自己的站里应急或者向无法翻墙的朋友展示一些被屏蔽的内容(话说以前一直用挂在GAE上的mirrorrr 打开网页,然后再用短网址缩短,然后在人人上分享…只是为了防止被河蟹…)

    • Glype
      Glype功能强大,界面美观。 Glype的安装很简单,下载源码包后,解压把其中的upload文件夹上传到空间目录下,即可使用。如: http://domain.com/upload/ 。你可以把upload改个名字或者直接把里面的文件全都传到空间根目录下。此外,如果你需要管理和配置Glype,你应当把extra目录下的”admin.php”上传到刚才的源码目录下。然后访问: http://domain.com/upload/admin.php
      它有以下特点:
      • 即插即用 – 不需要安装,上传到空间即可直接使用 

        管理员管理面板 易于管理和配置

        服务器端缓存 提高访问速度并且减少空间流量

        javascript支持 减少原始网页的失真度

        简单的主题系统 个性化你的网站

        访问控制 允许你为站点设置白名单/黑名单

        禁止特定IP 可以禁止单个IP或者IP断,防止站点被滥用

        独特的URL 提供了更好的保密性,一旦会话中止,所以存在历史记录中的URL都失效

        插件支持 使你可以对一些网站进行优化,比如YouTube

        虚拟浏览器 可以使你自定义user-agent,甚至可以让你的连接进入另一个代理服务器

    • Phpproxy
      这个代理程序一定程度模仿了 cgiproxy ,他是利用perl编写的,而这个 是用php编写的,故名之为 phpproxy
      功能列表:
      • 1.支持图象显示。 

        2.可以向服务器get,post数据,可以传递cookie。 现在支持上传文件。

        3.支持http,https协议,但 https 需要 php 安装 openssl 模块。

        4.支持代理服务器设置。

        5.支持下载zip,tar.gz等。

        6.自动修改script,style中的url,open,action等url值。

        7.可以 disabled javascript,也可以阻止特定网址的弹出窗口。

        8.支持多语言设置。

        9.增加了配置文件,更易于设置各项功能,可以开放phpproxy,也可仅指向某个网页。

    • Zelune
      亮点没发现有啥…