分类目录归档:其他文章

iMobiTrax 3.8安装激活

iMobiTrax是一款Mobile Tracking Tool,用于追踪移动广告流量,常用于Mobile Media Buy领域。由于安装比较复杂,授权也比较昂贵,这里给出安装方法。破解方法参考自这篇文章:《iMobiTrax3.8 解除登陆验证的方法

  • 系统环境:CentOS 7
  • 软件环境:LNMP

安装基础组件

首先安装MySQL,由于CentOS 7中默认的MySQL源被移除,这里有两种方式解决,安装Mariadb替换MySQL,或者使用rpm包安装MySQL。这里使用后者

wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
rpm -ivh mysql-community-release-el7-5.noarch.rpm
yum update
yum install mysql-server
systemctl enable mysqld
systemctl start mysqld

此时的MySQL是未经初始化的,root处于无密码保护状态,匿名登录等也处于开放状态,所以需要配置,执行以下命令,按提示操作

mysql_secure_installation

重启mysqld

systemctl restart mysqld

然后安装nginx,这一步比较简单,直接yum安装即可

yum install nginx

接下来,安装php以及php扩展。这里安装的php版本为5.4(经测试,iMobiTrax不兼容php 7.0):

yum install php-fpm php-mcrypt php-curl php-cli php-mysql php-gd php-intl php-xsl php-mbstring

这里还有一个扩展需要手动安装:ioncube_reloader

首先,下载ioncube_loaders: 下载地址,下载完成后,得到一个.tar.gz的压缩包

ioncube_loaders_lin_x86-64.tar.gz

解压后,里面有很多的.so文件,其中以5.4为后缀的就是我们需要的php5.4插件

ioncube_loader_lin_5.4.so

接下来,将这个.so文件放入php的扩展库中:

cp ioncube_loader_lin_5.4.so /usr/lib64/php/modules/
chmod 755 /usr/lib64/php/modules/ioncube_loader_lin_5.4.so

然后再/etc/php.ini中添加这个插件路径

zend_extension=/usr/lib64/php/modules/ioncube_loader_lin_5.4.so

重启php-fpm

systemctl restart php-fpm

至此,基础组件安装完成。

配置

接下来进行软件和网站配置。首先修改/etc/php-fpm.d/www.conf。按照以下内容修改:

listen = /var/run/php-fpm/php-fpm.sock

listen.owner = nobody
listen.group = nobody

user = nginx
group = nginx

修改/etc/php.ini,按照以下内容修改

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Asia/Shanghai

修改session文件夹权限

chgrp ngxin /var/lib/php/session
chomd -R 733 /var/lib/php/session

下面,配置MySQL

修改/etc/my.conf文件,关闭Strict Mod。具体为将sql_mod修改为如下:

# Recommended in standard MySQL setup
sql_mod=''

然后,登录mysql,创建表

mysql -u root -p
> create database imobitrax;

最后,配置Nginx。(以下使用www.domain.com代替你的域名,111.222.111.222代替你服务器的IP)。

首先,下载iMobiTrax的安装包(下载地址),下载解压后,得到imobitrax_3.8_install文件夹,将其中的Upload文件夹复制并重命名为www.domain.com,放在/var/www/目录下。现在目录结构和内容如下:

[root@centos ~]# cd /var/www/www.domain.com/
[root@centos www.domain.com]# ls -la
total 276
drwxr-xr-x  7 root root  4096 Mar 14 17:05 .
drwxr-xr-x  6 root root  4096 Mar 14 17:05 ..
drwxr-xr-x 10 root root  4096 Mar 14 17:13 account
drwxr-xr-x  8 root root  4096 Mar 14 17:04 app
-rw-r--r--  1 root root 65956 Mar 14 17:04 click2.php
-rw-r--r--  1 root root 66029 Mar 14 17:04 click.php
-rw-r--r--  1 root root  9345 Mar 14 17:04 ctrack.php
-rw-r--r--  1 root root  2172 Mar 14 17:04 error.php
-rw-r--r--  1 root root  1150 Mar 14 17:04 favicon.ico
-rw-r--r--  1 root root  4368 Mar 14 17:04 fpx.php
-rw-r--r--  1 root root 39987 Mar 14 17:04 go.php
drwxr-xr-x  4 root root  4096 Mar 14 17:04 images
-rw-r--r--  1 root root  2172 Mar 14 17:04 index.php
-rw-r--r--  1 root root  4887 Mar 14 17:04 ipx.php
drwxr-xr-x  2 root root  4096 Mar 14 17:04 jump
-rw-r--r--  1 root root 13722 Mar 14 17:04 lp_track.php
-rw-r--r--  1 root root  4903 Mar 14 17:04 next.php
-rw-r--r--  1 root root  4952 Mar 14 17:04 track.php

修改./account/mt/mt_config.php

<?PHP
include ('mt_auth.php');
$database   = 'imobitrax'; // database name
$user_name  = 'root'; // database user name
$password   = 'MYSQL_PASSWORD'; // database password for defined user name
$server     = 'localhost'; // host server name. Default values are localhost or 127.0.0.1 Normally will not have to be changed...**CASE SENSITIVE
$port       = 3306; // port 3306 is default. Change only if you know what you are doing...
$ipOverride = '127.0.0.1'; // overrides the ip address for localhost. It is very rare that this will need to be changed. Do so only if told by support.

然后,编辑/etc/nginx/nginx.conf,注释掉其中的server字段

#    server {
#        listen       80 default_server;
#        listen       [::]:80 default_server;
....
#    }

在/etc/nginx/conf.d/中,添加自己的server配置。新建/etc/nginx/conf.d/domain.conf

server {
        listen 80;
        server_name www.domain.com;
        root /var/www/www.domain.com;

        index index.php index.html;

        location / {
               try_files $uri $uri/ =404;
        }

        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }
}

重启使以上配置生效

systemctl restart php-fpm
systemctl restart nginx
systemctl restart mysql

激活破解

在/var/www/www.domain.com/目录下,依次创建文件夹

mkdir -p /var/www/www.domain.com/~imobi/license

在这个文件夹中,新建api2.php,内容如下:

<?php
echo '{"info1":"%07%B5-%3C%D7%F5%87%A7","info2":"%07%B5-%3C%D7%F5%87%A7","iVersion":"3.7","iDate":"1411404810","dVersion":"1.4","dDate":"1352822617","info":"rc%A1%9F%3C%A7%F4%EC%F0%27%EB%B3%3A%83%F2%11"}';
?>

然后,在浏览器中访问

http://111.222.111.222/~imobi/license/api2.php

如果显示内容为

{"info1":"%07%B5-%3C%D7%F5%87%A7","info2":"%07%B5-%3C%D7%F5%87%A7","iVersion":"3.7","iDate":"1411404810","dVersion":"1.4","dDate":"1352822617","info":"rc%A1%9F%3C%A7%F4%EC%F0%27%EB%B3%3A%83%F2%11"}

则配置正确。

下面在iptables中加入转发规则,将激活请求的服务器修改为自身。首先清除之前的规则

iptables -F
iptables -t nat -F

然后加入新规则

iptables -t nat -AOUTPUT -d 50.28.102.240 -j DNAT --to 111.222.111.222

使用以下,命令查看规则

iptables -L -t nat

如果在Chain OUTPUT中只有以下规则,则配置正确

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
DNAT       all  --  anywhere             50.28.102.240        to:111.222.111.222

持久化规则

service iptables save

至此,激活准备完成。

安装

在完成了以上内容后,安装就十分简单了,直接访问以下地址,按说明完成即可

http://www.domain.com/account/install.php

常见错误

  • The form could not be submitted. Click here to try again

这个错误是由session引起的。请检查两个配置。1、nginx配置中的server_name字段使用的是带有www的域名还是不带www的域名。和网站访问的域名一致即可;2、php的session文件夹权限是否可写。

如果还是无法确认,请查看以下两个日志

/var/log/php-fpm/error.log
/var/log/nginx/error.log
  • This domain(www.xxx.com) is not licensed to run iMobiTrax

这个错误表示激活失败。首先访问如下链接,看看是否正确显示

http://服务器IP地址/~imobi/license/api2.php

如果不正确显示,请检查nginx配置。可以参考上文中的配置;如果正确显示,那一定是iptables的转发规则出错了,依次执行以下即可:

iptables -F
iptables -t nat -F
iptables -t nat -AOUTPUT -d 50.28.102.240 -j DNAT --to 服务器IP地址

Windows 10启用内置Linux Bash

Windows10内置的是一个Beta的Ubuntu 14.04 LTS,用户可以从控制面板的程序的启用组件来启用他,然后进Bash命令行体验。

步骤一,开启开发人员模式

打开“设置”

选择“更新和安全”

开启“开发人员模式”

步骤二,启用Linux Bash功能

搜索进入“程序和功能”面板:

选择“左侧的启用或关闭Windows功能”选项

选中以下选项,并确定

完成后,重启电脑。

步骤三,下载Bash

打开Powershell或者cmd,执行bash命令,系统会提示下载

VMware虚拟机安装macOS

前期准备

首先自然需要VMware软件,这里用的是最新的VMware 12。然后还需要准备镜像和补丁。这里提供我的网盘分享链接:

  1. macOS最新版的cdr镜像:macOS 10.12 Sierra
  2. 最新版的Unlocker补丁:unlocker 2.0.8

由于默认的VMware不支持macOS的安装,所以需要额外的安装一个unlocker补丁来解锁这一限制。

安装补丁

要安装unlocker补丁,首先得确保VMware的服务不在运行,所以先在任务管理器中结束掉VMware的相关进程。

然后解压unlocker208.zip压缩包,右键管理员模式运行其中的win-install.cmd。执行完成后cmd窗口将自动关闭。

2.08的unlocker里本身不包含了darwin.iso补丁,在进行打补丁的时候会自动从网络下载最新的darwin.iso并复制到vmware的安装目录,请在此步保持网络畅通。如果下载失败,也可以手动下载:darwin.iso

创建虚拟机

安装完补丁后,启动VMware,创建新的虚拟机,

这里使用之前下载的cdr镜像

操作系统选择macOS 10.12。接下来就是正常的虚拟机安装步骤。配置完成后,不要开启虚拟机,先去修改一个文件,否则将无法顺利安装。

修改虚拟机所在目录下的.vmx文件,加入以下一行:

smc.version = 0

安装macOS

完成以上步骤后,启动虚拟机,开始macOS的安装

熟悉的苹果启动页面

接下来需要使用安装工具中的磁盘工具对之前创建虚拟机时分配的磁盘进行格式化

选择之前创建的磁盘,可以通过大小来找到。我之前创建的时256G的虚拟磁盘,然后点击抹掉。其实就是按照macOS所需要的格式进行格式化:

抹掉后,就可以看见这个磁盘了,选择这个磁盘继续安装。直到安装完成。

安装VMware Tools

安装完成后,虚拟机的分辨率就正常了。大功告成。

Linode新开Tokyo 2区域

之前的日本区域主机由于国内直连速度快,很快就售罄,甚至Linode开启了购买限制,新注册的账号已经无法看到Tokyo区了。直到2016年12月,Linode如约开放了Tokyo2区。不过trace后发现,此次开放的Tokyo2区域使用的是NTT服务商,据传NTT对电信不友好,丢包率较高,网络不稳定。

既然有了,那还是测试一下吧。最近刚用了BBR优化shadowsocks,那就用shadowsocks来试试。我在Tokyo和Fremont分别开了一台机器,环境都是Ubuntu16.04。也都更换内核,启用BBR并安装shadowsocks。接下来访问Youtube观看720p视频。

结果和预期一样,Fremont流畅观看,而Tokyo2卡的无法容忍。查看shadowsocks的日志如下:

Fremont:

Tokyo2:

可以注意到,Fremont的峰值已经超过4M/s,平均也应该有2M/s。对比峰值都不超过2M/s,看来Fremont的速度确实更佳。

2016年小结

2016年初,我在匆忙中写下了几行字,后来说的2015年小结也不了了之。大概还是因为懒吧。现在想想还是该写下些东西,即便只是朴素的文字,也算是给自己的2016画上一个句号吧。

MD

老实说,这一年过的并不轻松。年初公司遇上了美国版权管理收紧,由于美国婚纱协会的投诉,公司的网站受到了很大的打压。主要网站的域名直接在美国法院被判收回,导致流量暴跌。2015年同一时期,日订单达到200单以上,而到了2016年,这个数字已经趋向于0。即使之后在“金三银四”的销售旺季,为了保证流量,公司采用成本价销售的策略,订单依旧维持在日均20单以下。这让我看到了一个创业公司在遇到外界因素影响时所表现出的只能是如此的弱不禁风。

为了生存,老板开始采用各种手段救场。既有治标的提升流量,也有治本的解决版权问题。提升流量是短期方法,公司通过买搜索排名、增加卫星站点、流量站导入、社交网络宣传等各种方法尝试提高流量,但由于Google不断的对新网站的打压,网站流量始终在低位徘徊,转化率并未提高。而要解决的版权问题,势必需要投入大量资金自己拍图,在公司烧完了之前所积累的资本后,这条路也走不通了。老板尝试融资,但由于资本和公司发展目标的分歧,最终没能成功。即便如此,公司上下依旧还在为拯救外贸部而努力着,大概是因为年会上老板的打的一针鸡血和画的一块大饼吧。

现在回头看,当时公司所遇到的危机恐怕比开年邮件中提到的要严重的多。公司有外贸和知识两个部门,知识部门流量稳定,稳步发展,但这种发展速度是一个创业公司所不能接受的,创业公司面临的是生死问题,要么迅速成长蚂蚁变大象,要么只能变飞蛾在不知何处的火焰中烧成尘灰。所以,公司的希望必定是寄托在能够有跨跃式增长的外贸部门,然而,只怪这场版权危机来得太早,在公司刚积累到一点点资本准备转型的时候突然到来。如果晚一些,可能只需一年,公司稳步发展,2016年9月上市,融到资本,再将这些资本转化为版权,在2017年历经这种危机,应该就能游刃有余了。99%的创业公司都将面临死亡,这句话可怕却真实。

从15年6月到16年8月,MD给我的这一年还是收获良多的。大学的时候我就不是一个认真上课认真写代码的学生,大概我是喜欢自己折腾的那一类人吧。MD却也给了我这样的环境,没有太大的工作压力,能自己玩些想玩的东西。虽然都是些基本的东西,但他们还是构建起了我基础的技术栈。作为创业公司的开发人员,相比于其他创业公司,MD的工作确实不算辛苦。一周两天左右的加班相比于其他公司动不动的996来说实在轻松,虽然在最后的一个月里公司决定采用6天工作制,不过期限也仅是四周。MD的各位同事也十分和谐,毕竟都是年轻人,也没有层级观念基本算是一家人的感觉了。

上面都是些好话,那自然不好的话也要讲些。MD真的太过懒散了,就如张鹏在年终信里说的,像是国企员工在养老。知识部门业绩安稳,人员自然安逸,分配任务完成就好,今日任务做完自然可以休息,上上网聊聊天十分平常。设计拉长工作时间,效率很低,而且活儿推来推去。运营工作重复性太强,大量的时间被浪费在里面。想想也只有技术在认真干活,但是由于都是新手,大家在学习和试验上花的时间太多,原本应该不在工作时间做的事被放在了工作时间,那自然也是在人力上的一种浪费。不能说是这些导致了MD的一蹶不振,但至少这些问题所浪费的时间正是MD在危机来临前所仅有的准备时间。当然,作为我个人私心的角度,能在工作时间学习确实是好事,拿着工资上课MD予我良多。

在管理上,MD也存在问题。没有了层级关系,那就意味着老板说了算。创业公司的发展其实并不稳定,很多决策也并不能真正有效。这样的矛盾直接的展现便是需求的朝令夕改,设计时常抱怨UI老板不通过,增长流量的运营方案也是一改再改不断尝试,运营方案的改变作为直接的需求也被作用到了技术上,各种技术解决方式也是不断修改。这只能说明一个问题,决策者没有把握住正确的方向。由于决策人只有一个,一个人所能看到的远方比较有限,那他所给出的方案也必定有所局限。局限导致失败,过多的失败导致犹豫,犹豫引起变化,变化浪费时间,时间就是MD的命。这里还要吐槽一下,由于资金短缺,公司在年终奖上打了折扣。由于经营不佳,导致福利缩减本来无可厚非,但在这种关键时期,福利的缩减只能让员工信心受挫,如果员工觉得公司可能要不行了,都在为自己的前途着想,那公司运行效率必将大大受挫。另外,公司情况一出问题,削减的就是员工的福利,作为员工心里不悦。而之后不问意见就直接执行6日工作制的方式也同样导致员工情绪反弹。

虽然有这样那样的问题,但是总体而言,我对MD的印象还是积极的。舒适的工作环境,和谐的工作氛围,还算良心的福利待遇这些足以弥补公司在管理上的细小问题所给我带来的负面感受。所以,当我离职张鹏问我是否是因为6日工作导致时,我答了不是,我即是如此说,也是如此想的。离职的真正原因大概就是之上所说,看不到MD的未来吧。

最后,算是和MD的告别吧,感谢张鹏把我带进MD,也感谢华伟能带着我成长,还有龙途、猴子、王磊,和你们在一起工作很开心。

ZX

7月底离职后,在家休息了一整月。之后疯狂投简历面试,还算顺利的都拿到offer后选择来到了ZX。刚过试用期,来这边的时间也不长,除了感觉工作有点杂办事得看人脸色以外,并没有太多的不适。到了一个新的环境总会有新的朋友和新的工作,慢慢适应吧。

这边的工作名为质量控制,换句话说就是测试。但我实际的工作却偏向运维和项目管理。Docker、Puppet、Zabbix、LDAP、Jenkins、Jira、Confluence、Nexus、Tomcat、WAS以及许久没用的Java,这些里头许多是我接触过的,也有许多我从未听说的,总之慢慢学习吧。

租房

2016年最大的意外就是这件事吧,这算是我步入社会以来第一次遇到事儿了。当我第一年房屋到期后,选择了不续租。之后我们找到了爱屋吉屋中介为我们寻找房子,几天后,爱屋吉屋的工作人员和我们签下合同租下了一个大开间。然而协议一签,问题就来了。首先我们发现房子还在装修,并不能按期交付,接着发现房屋的出租方并非爱屋吉屋中介所说的房东,而是另一家中介公司。而这家公司在网上都是负面评价,也就是俗称的黑中介。

开始我们也不想把事情变得更加麻烦,想着能住就无所谓了,大不了就是押金赔了。但事情的发展并没有像我们想的一样发展,黑中介一直拖延交房,导致我们迟迟不能入住,多番沟通后,黑中介不耐烦了,直接要求撕毁原有的爱屋吉屋、我们、黑中介签署的三方合同,重新签署我们和黑中介之间的双方合同。但是这个合同是黑中介自行拟定的,自然充满了霸王条款。我们自然不签,于是,在6月29日,黑中介公司曲某将我和我女朋友困在他们公司,动作、言语威胁签署了这份双方合同。不过当时我们留了个心眼,以没带旧合同明天再拿过来为由没让他撕毁之前的三方合同。此时,是我们刚入住的第二天。

次日,为了我们的人生安全,我们搬离这套房子。几日后,我们同时向公司提出辞职,离开北京。

女友

某年夏天,那个阳光灿烂的午后,我们第一次相遇。从此便有了羁绊,直到十多年后,我们终于走到了一起。好假。

15年底,还是只是同学的女友来到了北京,在几个月的相处后终于成为了我的女友。虽然与她认识已有十几年,之前也是熟识,但也只是当个妹妹看待,大概是因为她个头比较娇小,性格也属于刁蛮一类,蛮能激起照顾的欲望的吧。

到了大学越聊才发觉越投机,直到毕业后她来了北京才终于有机会走近。大概是因为兴趣相投(也可能是因为我比较帅吧)然后就在一起了。没有正式的表白,也没有什么象征的礼物,现在想来是有点亏欠了。

在一起后才发现,她实在算不上是一个乖乖的女友。任性,容易生气,非常容易生气,一不小心就会生气,一生气还哄不好。抠门,抠门得要死,东西不让买,不便宜不买,买个几块钱的东西都要纠结半天。好懒,懒得死,天天在家睡觉,收拾个房子能拖好多天。黏,特别黏,一会儿没陪着就不肯不肯的,公司开会都得翘了赶回来。包袱重,不打扮好不出门,屋子有点光就会晒黑了。身子不好,一来亲戚就痛,风一吹就痛,睡觉没盖到被子也痛。玻璃心,看不得可怜的东西,在外面见到只流浪狗大概能哭出来。过节还要惊喜,逢着个生日啊节日啊就打着转的找礼物,藏得好好的都能给翻出来。馋,大概上辈子是个馋嘴猫吧,天天零食不断,晚上刷完牙一躺床上就开始饿,这算个什么设定啊。。。

 

 

 

 

 

 

 

 

可是,没办法,就是喜欢,唉。

为什么要序列化

什么是序列化

序列化就是一种处理对象流的机制。

所谓对象流也就是将对象的内容进行流化,流的概念这里不用多说(就是I/O),我们可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间 (注:要想将对象传输于网络必须进行流化)!在对对象流进行读写操作时会引发一些问题,而序列化机制正是用来解决这些问题的!

问题的引出

如上所述,读写对象会有什么问题呢?比如:我要将对象写入一个磁盘文件而后再将其读出来会有什么问题吗?别急,其中一个最大的问题就 是对象引用!举个例子来说:假如我有两个类,分别是A和B,B类中含有一个指向A类对象的引用,现在我们对两个类进行实例化{ A a = new A(); B b = new B(); },这时在内存中实际上分配了两个空间,一个存储对象a,一个存储对象b,接下来我们想将它们写入到磁盘的一个文件中去,就在写入文件时出现了问题!因为 对象b包含对对象a的引用,所以系统会自动的将a的数据复制一份到b中,这样的话当我们从文件中恢复对象时(也就是重新加载到内存中)时,内存分配了三个 空间,而对象a同时在内存中存在两份,想一想后果吧,如果我想修改对象a的数据的话,那不是还要搜索它的每一份拷贝来达到对象数据的一致性,这不是我们所希望的!

序列化机制的解决方案

  1. 保存到磁盘的所有对象都获得一个序列号(1, 2, 3等等)
  2. 当要保存一个对象时,先检查该对象是否被保存了。
  3. 如果以前保存过,只需写入”与已经保存的具有序列号x的对象相同”的标记,否则,保存该对象

序列化的实现

将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个 ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

在序列化的过程中,有些数据字段我们不想将其序列化,对于 此类字段我们只需要在定义时给它加上transient关键字即可,对于transient字段序列化机制会跳过不会将其写入文件,当然也不可被恢复。但 有时我们想将某一字段序列化,但它在SDK中的定义却是不可序列化的类型,这样的话我们也必须把他标注为transient,可是不能写入又怎么恢复呢? 好在序列化机制为包含这种特殊问题的类提供了如下的方法定义:

private void readObject(ObjectInputStream in) throws 
IOException, ClassNotFoundException;
private void writeObject(ObjectOutputStream out) throws 
IOException;

(注:这些方法定义时必须是私有的,因为不需要你显示调用,序列化机制会自动调用的)

使用以上方法我们可以手动对那些你又想序列化又不可以被序列化的数据字段进行写出和读入操作。

下面是一个典型的例子,java.awt.geom包中的Point2D.Double类就是不可序列化的,因为该类没有实现Serializable接口,在我的例子中将把它当作LabeledPoint类中的一个数据字段,并演示如何将其序列化

import java.io.*;
import java.awt.geom.*;
public class TransientTest
{
         public static void main(String[] args)
         {
                 LabeledPoint label = new LabeledPoint("Book", 5.00, 5.00);
                 try
                 {
                         System.out.println(label);// 写入前
                         ObjectOutputStream out = new ObjectOutputStream(new
                         FileOutputStream("Label.txt"));
                         out.writeObject(label);
                         out.close();
                         System.out.println(label);// 写入后
                         ObjectInputStream in = new ObjectInputStream(new
                         FileInputStream("Label.txt"));
                         LabeledPoint label1 = (LabeledPoint) in.readObject();
                         in.close();
                         System.out.println(label1);// 读出并加1.0后
                 }
                 catch (Exception e)
                 {
                         e.printStackTrace();
                 }
         }
}
class LabeledPoint implements Serializable
{
         public LabeledPoint(String str, double x, double y)
         {
                 label = str;
                 point = new Point2D.Double(x, y);
         }
         private void writeObject(ObjectOutputStream out) throws IOException
         {
                
                 out.defaultWriteObject();
                 out.writeDouble(point.getX());
                 out.writeDouble(point.getY());
         }
         private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
         {
                
                 in.defaultReadObject();
                 double x = in.readDouble() + 1.0;
                 double y = in.readDouble() + 1.0;
                 point = new Point2D.Double(x, y);
         }
         public String toString()
         {
                 return getClass().getName()+ "[label = " + label+ ", point.getX() = " + point.getX()+ ", point.getY() = " + point.getY()+ "]";
         }
         private String label;
         transient private Point2D.Double point;
}

总结

当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。

把对象转换为字节序列的过程称为对象的序列化。 把字节序列恢复为对象的过程称为对象的反序列化。 说的再直接点,序列化的目的就是为了跨进程传递格式化数据

参考

原文链接:为什么要序列化!什么时候序列化

.blog域名将于年底开启注册

20160514213755

根据WordPress官网在5月12日的新闻,WordPress.com公司所持有的.blog顶级域名将于年底开启注册(原文链接)。根据之前的消息,.blog域名由WordPress.com的母公司Automattic所拥有。

昨日宣布已获得 .blog 域名的审查和出售、注册的权利。一年前,此域名曾被拍卖给一个神秘买家。Automattic 的一位发言人表示旗下子公司联合一家收购域名的公司 Primer Nivel 达成合作,共同出资 190 万美元获得该域名的运营权。(VR报道 )

20160514213731

根据官网提供的时间表,.blog域名将于今年8月开启SUNRISE注册,即商标持有人注册。在此阶段,拥有商标(品牌)的企业将能够提前注册与自己品牌相关的域名。之后是10月份开启的LANDRUSH注册阶段,这个阶段的规则解释如下:

LANDRUSH阶段的域名,若只有一个合格的申请者申请,那么域名将分配给该申请者;若同一个域名多个合格的申请者,所有合格的申请者将安排网上拍卖,拍卖将采用英式的拍卖模式,并且具有合理的透明度。

最后是GENERAL AVAILABILITY阶段,这个阶段预计于11月开始,这个阶段开始后,普通用户也可以进行域名注册,即开放注册。