About neohope

一直在努力,还没想过要放弃...

第一次拆iPhone4(上)

我可怜的iPhone4,今年被摔了n回,先是震动键挂了,然后最近音量键彻底失灵,而home建也是难用的要死,整个手机,只有电源开关一个按键可以用了。

实在看不下去了,就自己买了两条排线进行更换:
1、home键排线
2、音量+震动排线
还有工具送^o^
周五下单,周六上午就到了,还是很快的吗。

吃了午饭,开工。
1、将后盖打开
2、取下电池
3、取下sim卡
可我没有工具啊,只好买了一盒针,好不容易搞开了~~
4、取下贴片,卸下尾排线,取下隐藏螺丝一颗
5、卸下蓝牙接头
6、取下屏蔽罩
最短的一颗螺丝拧不下来,只好用一个撬棒微微抬起,同时拧,终于搞定
7、取下后置摄像头
8、取下保修螺丝一颗
9、取下5根排线
10、取下主板
好难取啊,最后弄了好久才搞定(最后发现少取下了一颗十字支架,一头汗)
11、取下振铃总成
12、取下马达
13、取下固定螺丝10颗
14、取下液晶屏
没有吹风机伤不起啊,弄了好久
15、换home总线
妈的,工具里没镊子,找了个五金店,一口气买了三个
16、换震动+音量总线
妈的,没有操作说明了,优库上找了一个
真正悲剧开始了,取下来的时候,由于线路老化,总线直接断掉了
然后把耳机插孔先上好,然后震动键,弄了半个多小时,搞不定,太挫了
然后尝试音量键,弄了半个小时,搞定,累死了
休息下~~
然后再搞震动键,发现有个贴片掉了,想死的心都有啊~~
四个零件要从下向上拍好顺序,吐血啊~~
中途想到买胶水粘住,但考虑到502只有一次机会,买了固体胶,fuck,屁用没有~~
吃晚饭~~,休息下~~
休息后想,是不是我上的顺序不对啊~~
把耳机插孔卸下,然后上震动键,感觉简单多了,要是贴片不掉的话,也就是10分钟的事情~~
但,我仍然搞了半个小时,终于搞定~~,心想可以睡觉了啊
17、上液晶屏
18、上马达
19、上振铃总成
20、上主板,费了好大力气(没卸掉那颗支架螺丝,一头的汗啊~~,我是怎么上上去的啊)
21、上总线,妈的,有个总线看起来好短,心想是不是压倒液晶下面了~~,开始祈祷液晶不要挂了啊
22、马上卸下振铃总成,卸下马达,卸下液晶,发下触摸排线被压在了液晶屏下面~~,吐血
23、上液晶,上固定螺丝10颗
24、上马达
25、上振铃总成
26、上主板,这时候才发现那颗固定螺丝的问题,我人才啊
27、上总线,上保修螺丝
28、上后置摄像头
29、上屏蔽罩
30、上隐藏螺丝,上wifi天线
31、上尾插排线
32、上铁片
33、上sim卡
34、上电源
35、上后盖

开机~~
电话功能正常
wifi一直在搜索
液晶上留下了一块彩斑,还好不大

查询视图时不使用索引

今天发生了一件很诡异的事情,平台网关有一张对外提供的视图,用某字段进行查询时,效率奇低无比。

--view
select * from user1.view1 v1 where v1.mark='mark001';
--table
select * from user1.table1 t1 where t1.mark='mark001';

分析视图对应的表信息后发现,虽然对mark字段建立了索引,但查询语句中使用的mark字段值“mark001”,
所占比例竟然已经达到40%,应该是历史数据导致的。

然后将历史数据处理后,重建mark字段索引,诡异的事情发生了:
即使mark字段值“mark001”的比例小于0.1%,查询依然不走索引。

重建索引无效,就差重新建表了,压力山大啊。

最后,休息了一下,抱着试试看的态度,重新分析了表table1:

analyze table user1.table1 compute statistics for table for all indexes for all indexed columns;

查询终于走索引了,速度立刻上去了。

这才记起来,前几天,按某人的建议,把oracle的统计信息关掉了。。。
自己挖坑把自己埋了。。。
四个小时啊。。。
我的考评还没来得及写,还有十几封邮件要写,悲剧啊~~
我恨某潘~~

JAVA常用缩写

今天整理的一份文档,希望对大家有所帮助

AAA: Authentication, Authorization, Accounting

AWT: Abstract Window Toolkit (AWT VS. Swing VS. SWT)

AOP: ASPect Oriented Programming

BMP: Bean-Managed Persistent

CMP: Container-Managed Persistent

CORBA: Common Object Request Broker Architecture

DI: Dependency Injection

DTD: Document Type Definition

EJB: Enterprise Java Beans(Session Beans, Entity Beans, Message-driven Beans)

IDL: Interface Definition Language

IIOP: Internet Inter-ORB Protocol

IOC: Inversion Of Control

I18N: InternationalizationN

L10N: LocalizatioN

J2EE: Java2 Enterprise Edition(EJB, JTA, JDBC, JCA, JMX, JNDI, JMS, JavaMail, Servlet, JSP)

J2ME: Java2 Micro Edition

J2SE: Java2 Standard Edition

JAF: Java Action FrameWork

JCA: Java Cryptography Architecture

JCP: Java Community Process

JDBC: Java Data Base Connectivity

JDK: Java Development Kit

JDO: Java Data Object

JFC: Java Foundation Classes

JMS: Java Message Service

JNDI: Java Naming And Directory Interface

JNI: Java Native Interface

JPA: Java Persistence API

JRE: Java Runtime Environment

JSDK: Java Software Development Kit

JSF: Java Server Faces

JSP: Java Server Pages

JTA: Java Transaction API

JTS: Java Transaction Service

JVM: Java Virtual Machine(JRE VS. JNode VS. SableVM)

MVC: Model, View, Controller

OMG: Object Menagement Group

OCP: Open Closed Principle (Software entities should be open for extension, but closed for modification.)

OR Mapping: Object Relation Mapping

PI: Processing Instruction

PO: Persisent Object

POJO: Plain Ordinary Java Object

RADIUS: Remote Authentication Dial In User Service

RMI: Remote Method Invocation

RTTI: RunTime Type Identification

SOA: Service-Oriented Architecture

SPI: Service Provider Interface

WFC: Windows Foundation Classes for Java

WORA: Write Once, Run Anywhere

JNI简单例子2

最近又用jni写了一个编码工具,从中抽出了最简单的代码,如下:

1、Compress4j.java

package com.neohope.test.compress.jni;

/**
 *
 * @author Hansen
 */
public class Compress4j {
    private native int encodeR(String inFilePath,String outFilePaht);
    private native int decodeR(String inFilePath,String outFilePaht);
    
    static{
        try{
            System.loadLibrary("compress4j");
        }catch(UnsatisfiedLinkError e){
            //nothing to do
            System.out.println("Error: Couldn't load compress4j");
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }
    
    public String encode(String inFilePath,String outFilePath)
    {
        encodeR(inFilePath, outFilePath);
        return "xxxxx";
    }
    
    public String decode(String inFilePath,String outFilePath)
    {
        decodeR(inFilePath, outFilePath);
        return "xxxxx";
    }
}

2、找到生成的classes文件夹,运行命令行:

javah -classpath . -jni com.neohope.test.compress.jni.Compress4j 

3、生成的.h文件如下

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_neohoe_test_compress_jni_Compress4j */

#ifndef _Included_com_neohoe_test_compress_jni_Compress4j
#define _Included_com_neohoe_test_compress_jni_Compress4j
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_neohoe_test_compress_jni_Compress4j
 * Method:    encodeR
 * Signature: (Ljava/lang/String;Ljava/lang/String;)I
 */
JNIEXPORT jint JNICALL Java_com_neohoe_test_compress_jni_Compress4j_encodeR
  (JNIEnv *, jobject, jstring, jstring);

/*
 * Class:     com_neohoe_test_compress_jni_Compress4j
 * Method:    decodeR
 * Signature: (Ljava/lang/String;Ljava/lang/String;)I
 */
JNIEXPORT jint JNICALL Java_com_neohoe_test_compress_jni_Compress4j_decodeR
  (JNIEnv *, jobject, jstring, jstring);

#ifdef __cplusplus
}
#endif
#endif

3、编写成的.cc文件如下

#include "com_neohoe_test_compress_jni_Compress4j.h"

JNIEXPORT jint JNICALL Java_com_neohoe_test_compress_jni_Compress4j_encodeR
  (JNIEnv *env, jobject, jstring inpathjs, jstring outpathjs)
{
    //first convert jstring to const char*
    const char* inpath = env->GetStringUTFChars( inpathjs, false);
    const char* outpath = env->GetStringUTFChars( outpathjs, false);

    //...

    return 0;
}

JNIEXPORT jint JNICALL Java_com_neohoe_test_compress_jni_Compress4j_decodeR
  (JNIEnv *env, jobject, jstring inpathjs, jstring outpathjs)
{
    //first convert jstring to const char*
    const char* inpath = env->GetStringUTFChars( inpathjs, false);
    const char* outpath = env->GetStringUTFChars( outpathjs, false);

    //...

    return 0;
}

4、在VS工程中,新增头文件目录
%JAVA_HOME%/include
%JAVA_HOME%/include/win32

5、编译为dll即可使用啦

6、关于mt和md的问题
编译为MT和MTd的话,用JNI是没有任何问题的
编译为MD的话,需要安装VC2010sp1可再发行包
编译为MDd的话,就比较麻烦了,手动复制依赖的dll后,我用c++调用dll可以成功,但用jni就一直提示:缺少依赖的dll

ipa包重签名

如果ipa打包时,签名文件不包括你的设备id,用itunes安装后是无法使用的,
这样,就要重新申请包含你设备id的证书,用下面的方法重签名:

1、把ipa和新证书放到同一目录下

2、新建文件resignipa.sh

IPA="xx.ipa"
IPAOUT="xxx.ipa"
PROVISION="xxxx.mobileprovision"
CERTIFICATE="xxxxx" # must be in keychain

# unzip the ipa
unzip -q "$IPA"

# remove the signature
rm -rf Payload/*.app/_CodeSignature Payload/*.app/CodeResources

# replace the provision
cp "$PROVISION" Payload/*.app/embedded.mobileprovision

# sign with the new certificate
/usr/bin/codesign -f -s "$CERTIFICATE" --resource-rules Payload/*.app/ResourceRules.plist Payload/*.app

# zip it back up
zip -qr "$IPAOUT" Payload

3、启动命令行

chmod 777 resignipa.sh
./resignipa.sh

生成IPA包

生成ipa包有以下几种方式:
1、自己手工打包
a、找到xcode生成app包
b、新建文件夹Payload,并把app包放进去
c、(可选)准备一张jpeg格式的图(<500*500px),用来显示在iTunes中 d、(可选)命名这张图为iTunesArtwork(无扩展名),并把它放在和Payload同一级目录中 e、将Payload和iTunesArtwork压缩,后缀名改为ipa即可 2、利用itunes a、找到xcode生成app包 b、直接拖到itunes中 c、在itunes的app目录下找到对应ipa即可(无图片) 3、利用xcode a、生成Archive b、在organizer的Archive界面选择share

VirtualBox从U盘启动

默认情况下,Virtualbox从无法从U盘启动的。

但可以用变通的方法,将宿主机的U盘,模拟为一个虚拟盘,从虚拟盘进行启动。

1、首先产看本地硬盘信息
运行diskmgmt.msc
查看U盘是第几个驱动器,比如我的是第2个驱动器(编号从0开始,0,1,2这样)

2、将U盘模拟为一个虚拟盘

VBoxManage internalcommands createrawvmdk -filename D:\VirtualMashines\VirtualBox\WinXP\usbdisk.vmdk -rawdisk \\.\PhysicalDrive2

3、虚拟机中,添加该虚拟盘

4、启动,按F12,选择虚拟盘启动。

VirtualBox扩展及压缩虚拟磁盘

1、首先定位各虚拟磁盘的UUID

C:\ProgramerTools\Oracle\VirtualBox>VBoxManage.exe list hdds
UUID:           b806ffa9-ea8e-4059-9dd8-2d246e850ab6
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       D:\VirtualMashines\VirtualBox\WinXP\WinXP.vdi
Storage format: VDI
Capacity:       10240 MBytes

UUID:           945de0c8-f928-44ad-ae39-9a12a71568ef
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       D:\VirtualMashines\VirtualBox\Debian8\Debian8.vdi
Storage format: VDI
Capacity:       20480 MBytes

UUID:           e49d8a88-d68b-43b8-954e-2be419933e08
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       D:\VirtualMashines\VirtualBox\Docker\Debian8Docker\Debian8Docker
.vdi
Storage format: VDI
Capacity:       20480 MBytes

UUID:           eab29989-ce9c-4491-8dd0-2190ed3029d6
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       D:\VirtualMashines\VirtualBox\FreeBSD10\FreeBSD10.vdi
Storage format: VDI
Capacity:       20480 MBytes

UUID:           74bcd43e-a315-437e-9b4f-895051ff8433
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       D:\VirtualMashines\VirtualBox\FreeBSD10\FreeBSD10A01.vdi
Storage format: VDI
Capacity:       20480 MBytes

2、扩展WinXP虚拟磁盘
2.1我的xp虚拟机一共只有10G,我需要扩展到20G(要关虚拟机)

C:\ProgramerTools\Oracle\VirtualBox>VBoxManage modifyhd b806ffa9-ea8e-4059-9dd8-
2d246e850ab6 --resize 20480
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

2.2扩展后,开启虚拟机,自己到磁盘管理器中分配空间即可。

3、扩展Debian虚拟磁盘
3.1我的Debian8Docker虚拟机一共只有20G,我需要扩展到30G(要关虚拟机)

C:\ProgramerTools\Oracle\VirtualBox>VBoxManage modifyhd e49d8a88-d68b-43b8-954e-
2be419933e08 --resize 30720
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

3.2扩展后,开启虚拟机,使用gparted等工具分配空间即可。
需要提前unmount分区,如果是调整扩展分区,需要umount该扩展分区下的所有挂载点。

4、压缩WinXP虚拟磁盘
4.1需要到微软官网下载sdelete工具,然后在虚拟机中运行:

sdelete -z

4.2关闭虚拟机,运行:

VBoxManage modifyhd b806ffa9-ea8e-4059-9dd8-2d246e850ab6 --compact

5、压缩Debian虚拟磁盘:
5.1A在虚拟机中运行zerofree命令,需要将分区挂载为只读模式

apt-get install zerofree
cd /
umount /home
zerofree /dev/sda6

5.1B在虚拟机中运行dd命令,需要将分区挂载为读写模式

dd if=/dev/zero of=/bigemptyfile
rm bigemptyfile 

5.2关闭虚拟机,运行:

VBoxManage modifyhd 945de0c8-f928-44ad-ae39-9a12a71568ef --compact

6、压缩FreeBSD虚拟磁盘:
6.1A在虚拟机中运行dd命令,需要将分区挂载为读写模式

dd if=/dev/zero of=bigemptyfile bs=1m
rm bigemptyfile

6.1B在虚拟机中运行dd命令,需要将分区挂载为读写模式(适用于影片空闲空间较小)

cat /dev/zero > bigemptyfile;sync;sleep 1;sync;
rm -f bigemptyfile

6.2关闭虚拟机,运行:

VBoxManage modifyhd eab29989-ce9c-4491-8dd0-2190ed3029d6 --compact
VBoxManage modifyhd 74bcd43e-a315-437e-9b4f-895051ff8433 --compact