博客迁移日志

起因

几天前阿里云的云虚拟主机到期,而且提供的HTTPS之类的服务又贵的要死,手头又有一台性能不错的VPS闲置。就把博客迁移到了它上面。在迁移的同时通过Caddy加上了全站https。又看到了PHP 5即将停止安全更新的新闻,于是顺便将其更新到最新版本。唯一可惜的就是备案号不能用了,从此变成非法网站。

升级版本前务必做好兼容性检查和备份。

下面记录了我所参考的一些文章

配置新环境

How to Install WordPress with Caddy on CentOS 7

升级到PHP 7.2

//卸载旧版本php
sudo yum remove php php-fpm php-mysql php-curl php-gd php-mbstring php-mcrypt php-xml php-xmlrpc
//安装remi软件源,参见
// https://blog.remirepo.net/pages/English-FAQ
// https://wiki.centos.org/AdditionalResources/Repositories
sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
//安装新版本php
sudo yum --enablerepo=remi-php72 install php php-fpm php-mysql php-curl php-gd php-mbstring php-mcrypt php-xml php-xmlrpc -y

备份并迁移

这一步也很简单,参考官方教程: WordPress 博客搬家

域名解析以及其他

将域名指向新ip,启动caddy和php-fpm,配置自启动。

systemctl start php-fpm
systemctl enable php-fpm
systemcal start caddy
systemctl enable caddy

Hihgcharts中向series动态写入数据的两种方法

第一种:

            ...
            $('#highcharts').highcharts({
                ...
                series: create()
            });

            function create() {
                var series = [];
                for (var i = 0; i < retCode.length; i++) {
                    series.push({"name": name[i], "data": data[i], "color": color[i]});
                }
                return series;
            }

第二种:

            ...
            var chart = $('#highcharts').highcharts();
            for (var i = 0; i < retCode.length; i++) {
                chart.addSeries({
                    name: name[i],
                    data: data[i],
                    color: color[i],
                });
            }

PS:name[]为数据标签数组,data[][]为数据二维数组位置对应数据标签,color为自定义颜色数组。若取不到数据请先检查一下数据格式正不正确。

使用Apache POI HSSF来创建新的excel文件

大多数人都应该使用高级的API (包名: org.apache.poi.ss.usermodel) ,它的使用非常简单。

The high level API (package: org.apache.poi.ss.usermodel) is what most people should use. Usage is very simple.

工作簿(Workbook)是通过创建(org.apache.poi.ss.usermodel.Workbook)的一个实例来创建的,也可以直接了当地通过具体的类(org.apache.poi.hssf.usermodel.HSSFWorkbook或者org.apache.poi.xssf.usermodel.XSSFWorkbook)来创建,亦或通过使用非常方便的工厂类(org.apache.poi.ss.usermodel.WorkbookFactory)来创建。

Workbooks are created by creating an instance of org.apache.poi.ss.usermodel.Workbook. Either create a concrete class directly (org.apache.poi.hssf.usermodel.HSSFWorkbook or org.apache.poi.xssf.usermodel.XSSFWorkbook), or use the handy factory class org.apache.poi.ss.usermodel.WorkbookFactory.

表单(Sheet)可以通过调用一个已经存在的工作簿(Workbook)实例的createSheet()方法来创建,通过这个方法创建的表单(Sheet)会自动地按顺序添加到这个工作簿(Workbook)里,表单(Sheet)本身并不具有名称(在表单底部的标签上显示的);你可以通过调用Workbook.setSheetName(sheetindex,”SheetName”,encoding)来设置一个表单(Sheet)的名称。

/格式:Workbook.setSheetName(表单序号,”表单名称”,编码格式)/

对于HSSF,表单(Sheet)的名称可能是8bit格式(HSSFWorkbook.ENCODING_COMPRESSED_UNICODE)或者Unicode格式(HSSFWorkbook.ENCODING_UTF_16)的。HSSF的默认编码格式是每个字符8个bit。对于XSSF,表单(Sheet)的名称默认作为Unicode编码格式处理。

Sheets are created by calling createSheet() from an existing instance of Workbook, the created sheet is automatically added in sequence to the workbook. Sheets do not in themselves have a sheet name (the tab at the bottom); you set the name associated with a sheet by calling Workbook.setSheetName(sheetindex,”SheetName”,encoding). For HSSF, the name may be in 8bit format (HSSFWorkbook.ENCODING_COMPRESSED_UNICODE) or Unicode (HSSFWorkbook.ENCODING_UTF_16). Default encoding for HSSF is 8bit per char. For XSSF, the name is automatically handled as unicode.

(Rows)是通过调用一个已经存在的表单(Sheet)实例的createRow(rowNumber)方法来创建的。只有拥有单元格(cell)的行能被添加到表单(Sheet)里。你可以通过调用一个行(Rows)对象的setRowHeight(height)方法来设置行高。行高必须以缇(twips)或者二十分之一pt为单位。如果你愿意,我们也提供一个以pt为单位设置行高的函数。

/关于单位”point”:1/20th means “one twentieth”, i.e, 5%. So 1/20th point is 1/1440th inch. At 72 pixels-per-inch that means that 20 of those units equal one pixel./

Rows are created by calling createRow(rowNumber) from an existing instance of Sheet. Only rows that have cell values should be added to the sheet. To set the row’s height, you just call setRowHeight(height) on the row object. The height must be given in twips, or 1/20th of a point. If you prefer, there is also a setRowHeightInPoints method.

单元格(cell)是通过调用一个已经存在的行(Rows)实例的createCell(column, type)方法来创建的。只有非空的单元格(cell)能被添加到行(Rows)里。单元格(cell)应该依照它们的值是数字值还是文本值来设置为Cell.CELL_TYPE_NUMERIC类型或者Cell.CELL_TYPE_STRING类型。单元格(cell)必须设置一个值。你可以通过调用setCellValue方法来设置这个值,参数为String类型或者double类型。单个单元格(cell)没有宽度;比必须通过Sheet对象调用setColumnWidth(colindex, width)方法(宽度单位是256分之1个字符)来设置。(在GUI中你也不能对单个basis这么干。)

Cells are created by calling createCell(column, type) from an existing Row. Only cells that have values should be added to the row. Cells should have their cell type set to either Cell.CELL_TYPE_NUMERIC or Cell.CELL_TYPE_STRING depending on whether they contain a numeric or textual value. Cells must also have a value set. Set the value by calling setCellValue with either a String or double as a parameter. Individual cells do not have a width; you must call setColumnWidth(colindex, width) (use units of 1/256th of a character) on the Sheet object. (You can’t do it on an individual basis in the GUI either).

单元格(cell)是通过CellStyle对象来风格化的,CellStyle对象包含一个Font对象的引用。它们都是通过调用一个工作簿(Workbook)对象的createCellStyle()createFont()方法来创建。一旦你创建了它们,你必须给它们设置参数(包括颜色,边框等)。给一个CellStyle设置Font可以通过调用setFont(fontobj)方法来实现。

Cells are styled with CellStyle objects which in turn contain a reference to an Font object. These are created via the Workbook object by calling createCellStyle() and createFont(). Once you create the object you must set its parameters (colors, borders, etc). To set a font for an CellStyle call setFont(fontobj).

一旦你创建了你的工作簿(Workbook),你可以通过调用write(outputStream)方法来输出你的工作簿(Workbook)实例到输出流里(例如:一个FileOutputStream或者ServletOutputStream)。你必须自己关闭输出流,HSSF不会帮你关了它。

Once you have generated your workbook, you can write it out by calling write(outputStream) from your instance of Workbook, passing it an OutputStream (for instance, a FileOutputStream or ServletOutputStream). You must close the OutputStream yourself. HSSF does not close it for you.

翻译自:https://poi.apache.org/spreadsheet/how-to.html

7月26日

前几天工作时随手搜索了一点资料,

Baidu,整整五页广告。

挂VPN,换Google。

Google,官网在第一页第一条,第二条是下载地址。

这还是个搜索引擎么?

————————————Update—2015/7/26———————————

首先声明一下:我家水表在外面,今天没有快递,不需要上门服务,电费水费已交。

答主不才,只知道有3把梯子可以通向外面的世界。
其一,改Hosts,免费但不稳定,而且没被封的ip地址越来越少了,不推荐。
其二,使用代理的Google搜索网站。只能使用Google的搜索服务,局限性较大,临时使用还行。
最后,VPN,稳定但需要付费。
如果是IT行业从业人员,建议购买海外服务器自行组建,推荐4美刀一年的搬瓦工,教程自行搜索,不赘述了。(已没有4美刀的套餐出售。)
如果不是,建议购买现成的服务,可在知乎搜索一下子前辈们推荐的提供商,几十到几百一年的都有。
据说口碑比较好的有:
性价比极高的VPN服务-VPN Tech Runo
土行孙

祝诸君早日脱离百度。

利益相关:大部分百度服务的理性黑。

这段代码是单身的

它今天只能自己和自己玩

public class Main
{
	public static void main(String[] args)
	{
		char q = 34;      // Quotation mark character
		String[] l = {    // Array of source code
			&quot;public class Quine&quot;,
			&quot;{&quot;,
			&quot;  public static void main(String[] args)&quot;,
			&quot;  {&quot;,
			&quot;    char q = 34;      // Quotation mark character&quot;,
			&quot;    String[] l = {    // Array of source code&quot;,
			&quot;    &quot;,
			&quot;    };&quot;,
			&quot;    for(int i = 0; i &lt; 6; i++)           // Print opening code&quot;,
			&quot;        System.out.println(l[i]);&quot;,
			&quot;    for(int i = 0; i &lt; l.length; i++)    // Print string array&quot;,
			&quot;        System.out.println(l[6] + l[6] + q + l[i] + q + ',');&quot;,
			&quot;    for(int i = 7; i &lt; l.length; i++)    // Print this code&quot;,
			&quot;        System.out.println(l[i]);&quot;,
			&quot;  }&quot;,
			&quot;}&quot;,
		};
		for (int i = 0; i &lt; 6; i++)           // Print opening code
			System.out.println(l[i]);
		for (int i = 0; i &lt; l.length; i++)    // Print string array
			System.out.println(l[6] +l[6]+ q + l[i] + q + ',');
		for (int i = 7; i &lt; l.length; i++)    // Pirint this code
			System.out.println(l[i]);
	}
}