Write the Code. Change the World.

3月 15

登录dnspod
## 在用户管理-密钥管理-创建密钥
记录 ID 和 Token

##获取api的参数
login_token 是由ID和TOKEN组成中间用,分开

##获得 domain_id 
curl -k https://dnsapi.cn/Domain.List -d "login_token=ID,TOKEN"
查找域名的id

## 获得 record_id 
curl -k https://dnsapi.cn/Record.List -d "login_token=ID,TOKEN&domain_id=DOMAIN_ID"
查找域名记录的id

##测试ddns api,填入上面获得的参数
curl -X POST https://dnsapi.cn/Record.Ddns -d 'login_token=ID,TOKEN&domain_id=DOMAIN_ID&record_id=RECORD_ID&record_line=默认'
正常的话会返回成功

## 创建一个脚本,加入定时任务每分钟运行一次
vi /root/dnspod.sh

阅读全文 >>

2月 13

C:\dev\vue\alcarl\xxl-job\xxl-job-admin\target>java -jar xxl-job-admin-2.2.0-SNAPSHOT.jar
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:51)
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52)
Caused by: java.lang.IllegalArgumentException: Cannot instantiate interface org.springframework.context.ApplicationContextInitiali
zer : org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer
        at org.springframework.boot.SpringApplication.createSpringFactoriesInstances(SpringApplication.java:445)
        

阅读全文 >>

10月 30

有几个前提
添加到ie的可信站点区域
不能是基于session的cookie
注意url的路径,有些cookie下发是带路径的,获取时不带路径获取不到


#调用时要注意,url最后要有/  否则某些带路径的cookie获取不到
#获取cookie调用
httpOnlyCookie =GetCookieInternal(New Uri("http://192.168.0.1:10051/web/"), True)  

<SuppressUnmanagedCodeSecurity, SecurityCritical, DllImport("wininet.dll", EntryPoint:="InternetGetCookieExW", SetLastError:=True, CharSet:=CharSet.Unicode, ExactSpelling:=True)>
    Friend Shared Function InternetGetCookieEx(<[In]> Url As String, <[In]> cookieName As String, <Out> cookieData As StringBuilder, <[In], Out> ByRef pchCookieData As UInteger, flags 

阅读全文 >>

10月 08

去掉bom的perl脚本

#!/usr/bin/perl
@file=;
$file[0] =~ s/^\xEF\xBB\xBF//;
print(@file);

转换编码的iconv命令

下载地址
http://gnuwin32.sourceforge.net/packages/libiconv.htm
还需要这个,否则会报少dll文件
http://downloads.sourceforge.net/project/gnuwin32/make/3.81/make-3.81-dep.zip?r=http%3A%2F%2Fgnuwin32.sourceforge.net%2Fpackages%2Fmake.htm&ts=1295607625&use_mirror=surfnet
把make-3.81-dep.zip中bin目录里的libintl3.dll拷贝到iconv.exe所在目录下

#查看支持的编码
iconv -l
#转换编码
iconv -f utf-8 -t gbk utf8.csv.rbom gbk.csv

完整的命令

removebom.pl utf8bom.csv utf8.csv.rbom && iconv -f utf-8 -t gbk utf8.csv.rbom gbk.csv

阅读全文 >>

8月 05

一般操作excel 有两种方式,
一种是画好表格了,填固定的空,这种情况直接找到格子,填入就行了
另外一种是只画好表头了,但实际表内容的行数是不固定的,需要程序根据数据的实际行数来添加行。
这种加行在 XSSF模式下,直接写入单元格会报错。要先加行,再加单元格,再写入,才可以。

public class ExcelUtil {
    private XSSFWorkbook wb = null;

    public void OpenXLSXFile(String FilePath) throws IOException {
        InputStream ExcelFileToRead = new FileInputStream(FilePath);
        wb = new XSSFWorkbook(ExcelFileToRead);
    }

    public void CreateRow(String SheetName, int rownum) {
        Sheet 

阅读全文 >>

8月 05

1 问题

由于网络架构升级,原有http直接访问java 容器(jboss),变成https 访问haproxy 由haproxy 通过http再调用 java 容器。
实际测试发现一个问题,之前项目中使用response.sendRedirect("http://aaa.aaa/aaa");这种方式设置绝对路径跳转的,通过https代理到https访问后都无法访问了,因为jboss访问是http,因此应用拼接的绝对路径也是http的

2 分析

尝试解决,将绝对路径改为相对路径response.sendRedirect("/aaa"),发现没有效果,抓包看http应答的hearder location还是发送了绝对路径http://aaa.aaa/aaa。
搜索发现原因是由于旧版的http1.1协议不允许location头使用相对路径,因此容器在实现response.sendRedirect时自动做了补全绝对路径。
详见:
Can a redirect to relative path be sent from Java Servlet API?
https://stackoverflow.com/questions/30844807/can-a-redirect-to-relative-path-be-sent-from-java-servlet-api
原因是http1.1必须是一个完整的uri,但在rfc 7231更新时已经允许相对url了

An obsolete version of the HTTP 1.1 …

阅读全文 >>

7月 26

我要在腾讯云申请亚信的免费证书,把验证文件直接放到了jboss 的welcome-content目录,但是亚信验证时报应答没有Content type,搜了一下说welcome-content的静态资源是没有Content type的,要换一种方式,用应用发布的方式来发布静态资源就正常了。
如下

  1. 停止jboss服务

  2. 修改配置文件stanalone.xml,将 enable-welcome-root 改为 false

    <subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host" native="false">
      <configuration>
      <mime-mapping name="manifest" value="text/xml"/>
      </configuration>
    <connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http"/>
    <virtual-server name="default-host" enable-welcome-root="false">
    <alias name="localhost"/>
    </virtual-server>
    </subsystem>
  3. 在应用发布目录 创建一个 ROOT.war 文件夹
    然后照如下创建子目录和jboss-web.xml文件

               ROOT.war
               ROOT.war/WEB-INF
               ROOT.war/WEB-INF/jboss-web.xml

    编辑jboss-web.xml

阅读全文 >>

4月 21

开机自动登录

运行 Control UserPasswords2
用户账号-勾选“要使用本计算机,用户必须输入用户名和密码”,确定
然后在来一遍把刚才的勾去掉。会弹出输入密码的框,输入用户名密码即可。

开机自动运行程序

运行 shell:startup
会打开开始菜单-启动文件夹,把程序的快捷方式拖进去即可

定时自动重启

步骤1

新建一个 restart.bat 批处理文件
填入下面的命令
shutdown -r -f -t 20
保存

步骤2

打开控制面板 搜索 计划任务
创建基本任务
随便起个名字
选每天运行
设置每天执行的时间
任务操作选启动程序
点浏览-选刚新建的 restart.bat
下一步
完成
即可

参考

Windows系统通过计划任务设置定时重启
https://help.aliyun.com/knowledge_detail/40818.html

阅读全文 >>

4月 14

查看占内存最多的进程

ps auxw|head -1;ps auxw|sort -rn -k4|head -50

也可以top -c 然后按shift+m 看

修改宝塔自带的php-fpm配置

cd /www/server/php/56/etc/
cp php-fpm.conf php-fpm.conf.bk
vi php-fpm.conf
把这几个配置改小,主要是pm.max_children 最大进程数,不要太多,一个进程占50-60m内存
pm.max_children = 15
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10
保存退出

重启php-fpm

/etc/init.d/php-fpm-56 restart

好啦

参考

阅读全文 >>

3月 11

参考 sf的解答
https://stackoverflow.com/questions/1237286/how-can-i-compile-my-perl-script-so-it-can-be-executed-on-systems-without-perl-i

我是用的 Strawberry Perl
cpan -i PAR::Packer
就装好了

然后用pp编译即可
pp -o example.exe example.pl…

阅读全文 >>