MySQL的JDBC驱动保存数据出现 java.lang.AbstractMethodError: Method .. is abstract的问题解决方法

软件使用JDBC连接数据库,因为使用MySQL数据库,于是将机器上以前安装其他软件备份的Mysql驱动拷贝了过去,没有想到在软件中保存数据时出现

Exception in thread “main” java.lang.AbstractMethodError: Method com/mysql/jdbc/PreparedStatement.setCharacterStream(ILjava/io/InputStream;J)V is abstract
at com.mysql.jdbc.PreparedStatement.setBlob(PreparedStatement.java)

错误,折腾了软件的各项配置好久,一保存数据就出错。到软件官网上看了下也没有人提到这个问题,应该是我这边自己的问题。想着到MySQL官网上看看有无新版本的JDBC驱动程序,发现果然有,
下载后替换原有驱动,重新运行软件,可以正常保存。以后安装软件还是先检查一下是否有依赖的新版本,防止不必要的麻烦。

不是总是安装新的依赖包就是好的,有些软件安装了最新的依赖包,反而不能正常运行,如果软件有说明适配的依赖软件版本,最好还是按照软件说明中明确说明的依赖版本来,减少不必要的麻烦。

Popularity: 1% [?]

Random Posts

Tomcat配置SSL支持出现java.lang.IllegalArgumentException: None of the [protocols] specified are supported by the SSL engine : [[TLS]] 问题解决

一个Java的应用要配置TLS支持,按照软件的安装说明,给Tomcat的Server.xml中添加


重新启动Tomcat后,提示如下严重出错信息

严重 [main] org.apache.coyote.AbstractProtocol.init Failed to initialize end point associated with ProtocolHandler ["https-jsse-nio2-9443"]
 java.lang.IllegalArgumentException: None of the [protocols] specified are supported by the SSL engine : [[TLS]]
        at org.apache.tomcat.util.net 

.SSLUtilBase.getEnabled(SSLUtilBase.java:90)

经过一番网上搜索和尝试,发现添加如下几行内容到端口8443的配置中,重启Tomcat后问题解决

 SSLProtocol="TLSv1+TLSv1.1+TLSv1.2"
 ciphers="TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"
 SSLCipherSuite="ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4"

Popularity: 1% [?]

Random Posts

树莓派登陆密码忘记的处理方法

买来玩的树莓派长时间没有登陆,忘记登陆密码了,网上找了一些重置密码的方法多是是使用命令行要外接显示器的方式,对我ssh登陆的不适用。
想来因为树莓派是linux系统,直接修改shadow文件将pi账号的密码修改为一个已经知道的密码,再登陆后修改一下就好。
首先拆卸下树莓派上的SD卡,使用USB连接器接到电脑上,直接接的windows系统,看不到shadow文件,于是安装一个linux虚拟机,在虚拟机中挂载。
首先在Linux虚拟机中用root账号创建一个临时测试账号,对账号设置一下密码

  1. useradd test
  2. passwd test
  3. cat /etc/shadow

提示密码输入的时候输入 test 作为密码,可以看到如下一行

test:$6$AVQjiImu$S.cv1b2ZgI32ddDye6ehRYPCI/hpfPDofuZXUQHTXpBgUA3kFVLUYsOPXybaAX7EwZfrvkT0Udcw36Ye.6P140:17429:0:99999:7:::

test后面两个冒号之间的字符串,就是密码test对应的值
拷贝出来,修改树莓派中shadow的pi那行的值,得到

pi:$6$AVQjiImu$S.cv1b2ZgI32ddDye6ehRYPCI/hpfPDofuZXUQHTXpBgUA3kFVLUYsOPXybaAX7EwZfrvkT0Udcw36Ye.6P140:17429:0:99999:7:::

保存,将SD卡弹出插回到树莓派中,开机重连,使用密码 test 做为登陆密码,顺利进入。

Popularity: 1% [?]

Random Posts

cygwin下strptime函数找不到的解决方法

一段代码使用到了 strptime 这个函数,之前在cygwin下gcc 4.9.3 可以编译通过,重装cygwin后,新的gcc 6.3.0 编译不通过,strptime是不可识别的,
在cygwin的include目录下执行

 find . -name "*.h" |xargs grep strptime

发现定义在 /usr/include/time.h 中,需要先定义 __XSI_VISIBLE 才会有,查看了一下__XSI_VISBLE定义出现的地方
在Make文件中添加 -D_XOPEN_SOURCE=700 重新编译,问题解决

Popularity: 1% [?]

Random Posts

关于PKCS5Padding与PKCS7Padding对齐方式的区别

近日使用C++写一DES加密算法和对方java写的接口做加解密的通信处理,碰到加密后的数据对方界面不了的问题,发现两边对齐方式不一致,对方使用PKCS5对齐,我这边使用了PKCS7做数据对齐。修改为PKCS5方式对齐后问题解决。
借此重新温习了一下两个对齐方式的处理过程。
以8个字节为一组,如果数据不足8位,则以8位做对齐,末尾填充缺少的字节数量。
比如有数据 FF FF,
缺少6个字节,则需要补充6个字节的06,达到8位长度
补充对齐后 FF FF 06 06 06 06 06 06

PKCS5 对齐 和 PKCS7 对齐的区别在于
PKCS7 末尾的值区间为 1,2,3,4,5,6,7 也就是最多补充7个字节
PKCS5 末尾的值区间为 1,2,3,4,5,6,7,8 也就是最多补充8个字节,
也就是PKCS5在数据长度刚好能为8整除时,后面继续补充8个字节的08,而此时PKCS7是不做字节补充的
想比较PKCS7而言PKCS5能更好的还原实际加密数据的长度,
比如有8字节长度数据 FF FF FF FF 04 04 04 04,
在PKCS7时是不做字节补充的,当解密完成后就不知道是否需要移除尾部的4个字节的04
而PKCS5时,则需要再补充8个字节的08,得到 FF FF FF FF 04 04 04 04 08 08 08 08 08 08 08 08 解密后可以正确还原得到 FF FF FF FF 04 04 04 04

Popularity: 1% [?]

Random Posts

VS2015下CUDA代码编译异常的一点小问题解决方法

安装了 VS2015后,下载了CUDA 8.0安装,试了一个.cu文件编译正常通过,
继续安装了一个Intel parallel_studio_xe_2016, 然后使用 Intel 的C++编译器进行编译,结果nvcc编译.cu文件时候报错,一些c++库的头文件解析不通过,
网上搜索了一下,没有找到解决方法。

自己对比了一下使用VS 的C++编译器和 Intel 的C++编译器时,在控制台输出的nvcc命令,发现 –cl-version 参数值不同

使用VS2015的C++编译器时,出现的参数是 –cl-version 2015
而使用Intel的C++编译器时,出现的参数是 –cl-version 2010

进一步查找CUDA的自定义编译配置,在 Program Files(x86)\MSBuild\Microsoft.Cpp\v4.0\v140\BuildCustomizations\ 目录下的 CUDA 8.0.props 中对编译器做了检查,

...
<CudaClVerson Condition="'$(PlatformToolset)' == 'v140'">2015</CudaClVersion>
<CudaClVersion Condition="'$(CudaClVersion)' == ''">2010</CudaClVersion>
...

CUDA的自定义编译配置中没有对Intel C++编译器做判断处理,自己修改下面那个为空时默认为2010的行,
将2010修改为2015,保存后重新编译,两个编译器都可以编译通过,问题解决。

Popularity: 1% [?]

Random Posts

在CentOS 6 下安装TensorFlow

在CentOS下安装TensorFlow的一些步骤
首先按照TensorFlow官方安装教程,选择了anaconda 环境, 下载安装了 anaconda3 环境后(为python3.6),
在里面按照官方步骤使用pip方式安装tensorflow包, 安装后在python中 import tensorflow as tf 出错,提示缺少LIBC_2.17之类的符号,这是由于CentOS自带版本比较低的缘故,需要源码编译方式进行安装。
安装TensorFlow需要使用支持c++11版本的编译器,CentOS 6自带的g++ 4.4.7不支持,首先需要安装一个版本的g++, 我选择了安装4.9.4版本
步骤1. 安装gcc 4.9.4

tar -xjvf  gcc-4.9.4.tar.bz2
cd gcc-4.9.4
./contrib/download_prerequisites
./configure --prefix=/opt/gcc/4.9.4  --languages=c,c++ --disable-multilib
make
make install

安装好后,设置环境变量,在 ~/.bashrc 中添加如下内容

export CXX=/opt/gcc/4.9.4/bin/c++
export CC=/opt/gcc/4.9.4/bin/gcc
export LDFLAGS="-L/opt/gcc/4.9.4/lib -L/opt/gcc/4.9.4/lib64"
export CXXFLAGS="-L/opt/gcc/4.9.4/lib -L/opt/gcc/4.9.4/lib64"
export C_INCLUDE_PATH=/opt/gcc/4.9.4/include
export CXX_INCLUDE_PATH=$C_INCLUDE_PATH
export LD_RUN_PATH=/opt/gcc/4.9.4/lib/:/opt/gcc/4.9.4/lib64/
export LD_LIBRARY_PATH=/opt/gcc/4.9.4/lib/:/opt/gcc/4.9.4/lib64/

重新开启一个终端窗口,下载源码安装 bazel

mkdir bazel
cd bazel
unzip ~/Downloads/bazel-0.4.5-dist.zip
./compile.sh

编译完成后得到一个 bazel执行文件,拷贝到/usr/local/bin 目录下,
对这个生成的bazel文件不能使用strip,否则后面使用时会出现zip资源释放出错的消息

下载安装tensorflow, 到github上下载1.1分支包

unzip tensorflow-r1.1.zip
cd tensorflow-r1.1
./configure
#按照提示做一些选择
bazel build -c opt //tensorflow/tools/pip_package:build_pip_package
#这一步在build过程中碰到执行protoc命令出错的问题,提示找不到LIBCXX之类的符号信息,设置的LD_LIBRARY_PATH值没有起作用
#解决方法,将~/.bashrc中LD_LIBRARY_PATH=/opt/gcc/4.9.4/lib/:/opt/gcc/4.9.4/lib64/路径添加到/etc/ld.so.conf中去就可以通过了
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

最后重新按照官方教程进入anaconda3环境

source activate tensorflow
pip install --ignore-installed --upgrade /tmp/tensorflow_pkg/tensorflow-1.1.0-cp36-cp36m-linux_x86_64.whl

进入python3做测试,在 import tensorflow as tf 时出错,
提示 anaconda3/lib/python3.6/site-packages/tensorflow/python/_pywrap_tensorflow_internal.so 缺少一个 CXXABI_1.3.7的错误,
ldd查看了一下,依赖的是libstdc++.so.6是指向anaconda3/lib/libstdc++.so.6.0.19,而不是编译的gcc-4.9.4目录下的libstdc++.so.6.0.20
重新建立anaconda3/lib目录下的符号连接指向/opt/gcc/4.9.4/lib64/libstdc++.so.6.0.20
(估计使用gcc-4.8.5编译tensorflow就不会有这个问题了,生成的库同是libstdc++.so.6.0.19)

再次进入python3做测试,通过没有问题,将~/.bashrc 和 /etc/ld.so.conf中的关于gcc 4.9.4路径设置的环境变量去掉,测试tensorflow还是正常

Popularity: 2% [?]

Random Posts

CentOS 6下Android SDK碰到提示”libc.so.6: version `GLIBC_2.14′ not found”的解决方法

在CentOS 6的机器上安装了Android的开发环境,碰到如下一些问题和解决方法
1. Android Studio 添加Android SDK时,提示缺少JDK 1.5、JDK 1.6 或 JDK 1.7, 但是机器上已经安装好JDK 1.6, JDK 1.7,还是提示同样的问题
解决方法,软件的提示信息Bug,其实是缺少 JDK 1.8(这个提示Bug应该会在后续版本被修订), 下载安装JDK 1.8,添加JDK 1.8后,再添加Android SDK,一切正常。

2. 新建一个简单Android项目,编译,提示”libc.so.6: version `GLIBC_2.14′ not found” 的错误信息
下载使用的是Android SDK Ver 25.2.5 Platform Tools Ver 25.0.3 Build Tools Ver 25.0.2
google搜索,确认是libc库的版本低的原因,CentOS 的libc版本文v2.14 要CentOS 7 才有支持 GLiBC_2.14,
解决方法要么重装系统使用CentOS 7, 要么逐个试验降低SDK版本,直到可以不要GLIBC_2.14的可用SDK版本。
既不想重装系统到CentOS7, 也不想逐个往下试验低版本SDK,
搜索网络后找到一个解决方法,也就是在其他目录编译安装一个并行的glibc 2.14版本,然后使用LD_LIBRARY_PATH临时指定到这个新安装的libc目录

  1. wget http://ftp.gnu.org/gnu/glibc/glibc-2.14.tar.gz
  2. tar zxvf glibc-2.14.tar.gz
  3. cd glibc-2.14
  4. mkdir build
  5. cd build
  6. ../configure –prefix=/opt/glibc-2.14
  7. make -j4
  8. sudo make install
  9. export LD_LIBRARY_PATH=/opt/glibc-2.14/lib

在同一个终端下执行原本会出现 libc.so.6: version `GLIBC_2.14′ not found 提示的 aapt 命令,结果正常运行
至此,以为大功告成了,同一终端下,执行打开IDE的命令,结果没有界面出现

继续尝试解决方案,
将原本aapt改名aapt_, 新建一个同名的aapt,写入如下bash脚本

  1. #!/bin/sh
  2. export LD_LIBRARY_PATH=/opt/glibc-2.14/lib && "$0"_ $@

添加执行权限,在命令行下试了一下可以正常执行,将其他几个命令做同样处理
新建一个终端窗口,打开IDE,正常,新建一个Android项目,编译正常,
到此,大功告成,在没有更换操作系统和降低Android SDK版本的情况可以进行Android开发了

—-华丽分割线—–
“libc.so.6: version `GLIBC_2.14′ not found” 提示产生的原因:
使用了高版本的libc库编译,

  1. objdump -T aapt |grep GLIBC_2.14

可以看到只有一个 memcpy 函数使用到了 GLIBC_2.14,
查看了一个CentOS目录下的应用,可以看到memcpy使用的是 GLIBC_2.2.5
如果自己拥有源码,可以添加如下一行代码,指定memcpy使用 GLIBC_2.2.5,使高版本编译出来的程序可以不做任何处理运行在低版本libc的系统上

__asm__(".symver memcpy,memcpy@GLIBC_2.2.5");

Popularity: 2% [?]

Random Posts

编译tesseract-ocr碰到的问题以及解决方法

下载地址 https://github.com/tesseract-ocr/tesseract
首先下载了 tesseract-master 版本,
解压后运行 ./autogen.sh 提示 libtoolize: command not found

使用yum install libtool 安装缺少的命令,重新运行 ./autogen.sh, 成功生成 configure 文件,
运行 ./configure 提示需要C++11版本的编译器,不想升级系统自带的gcc版本
重新下载 https://github.com/tesseract-ocr/tesseract ,切换tag,选择 3.0.5分支,下载 tesseract-3.05.zip
unzip tesseract-3.05.zip 解压后,运行./autogen.sh生成configure文件

运行./configure 提示 leptonica not found
到 http://www.leptonica.org/download.html 下载安装包,目前最新版本为 leptonica-1.74.1.tar.gz
tar -xzvf leptonica-1.74.1.tar.gz
cd leptonica-1.74.1
./configure
./make
./make install

重新回到 tesseract-3.05目录下,
./configure
./make
./make install

安装完成
接着需要数据文件,到 https://github.com/tesseract-ocr/tessdata
按照提示,不下载master数据,切换到 tag/3.04.00 分支下下载数据文件,
下载完成后,将 eng开头的9个文件拷贝到 /usr/loca/share/tessdata目录下

Popularity: 2% [?]

Random Posts

使用CodeTyphon做FPC编译碰到的问题记录2

之前使用了CodeTyphon做FPC交叉编译,将Delphi写的部分命令行工具修改编译到Linux下运行,又碰到如下一些问题:
1. 重新安装后,不能Win64版本下编译生成x86_x64-linux的交叉编译相关包
解决方法:使用Win32版本编译生成x86_x64-linux交叉编译相关包

2. 代码文件中的中文字符,编译后运行显示乱码
原因,Delphi下写的代码是用GBK编码的,FPC高版本使用UTF8编码,格式转化失败
解决方法:在包含中文字符的代码文件最前面添加 {$codepage cp936} 指定源码文件的编码格式
编译再次碰到问题,提示cp936是不能识别 codepage
解决方法:检查CodeTyphon的fpcsrc目录下fpc编译器源码,
发现compiler/widestr.pas 文件中uses部分缺少cp936的引用,
修改该文件添加cp936的单元引用,
然后将 packages/rtl-unicode/src/inc/cp936.pas 文件拷贝一份到 rtl/charmaps目录下,
同时也修改rtl/charmaps/cpall.pas,添加cp936单元的引用
重新运行CodeTyphon安装程序,选择 4) Remove and Build FreePascal,
结束后,重新编译项目,再次在Linux下运行编译后的程序,中文可以正常显示了。
注: 修改后的文件,要添加/替换到 allzips/src/fpc_src.7z 中,否则重新编译时会自动被压缩包中解压出来的文件替换掉,导致修改失败

3.部分使用Hex格式传输的GBK中文字符,还原输出后显示为乱码
解决方法:对于还原回来的中文字符串,添加如下一个设置字符代码页的代码
SetCodePage(RawByteString(myStr), 936, false);
重新编译运行,问题解决。

4. 使用+号拼装中文字符串时,中文字符出现乱码,
解决方法,多写几个语句,拆分为单个+号连接
比如
Result := Result + ‘测试’ + sOther + ‘结束’;
修改为:
Result := Result + ‘测试’;
Result := Result + sOther;
Result := Result + ‘结束’;
问题解决。

Popularity: 2% [?]

Random Posts

Next Page →