A Coder

Coding My Dream!

0%

很久没有写博客了,看到上一篇文章已经过去了4年,这几年发生了很多的变化!

随着Docker的流行,CoreOS也开始风靡起来,阿里云提供CoreOS的镜像也有几个月的时间了,阿里云用的版本号是681.2.0而目前的最新版本都已经到1000.0.0了,落后的太多了,就想把系统升级到最新,也体验一下coreos最牛的特点--无痛升级。

好事总是多磨,在输入update_engine_client -update后,并没有像预期的那样哗啦啦升级成功,嗯,还是失败了,失败的原因,大家应该都知道--被墙了。

按照前辈的方式使用代理,但是手头上没有好用的翻墙代理,自己搭建折腾了半天搭好了,也没有更新成功……

对于不折腾会死的我并没有放弃,研究了一下升级更新日志 (可输入命令 journalctl -f -u update-engine 查看),了解了一下和网络相关的升级过程。
阅读全文 »

我是小狼狗?

看了下上一篇文章发布的时间距今已经过了大半年了,每年中间总是有那么些天(有点长)不想动弹,每次打开这个网站,想写点什么,却不知道要写什么,最后还是没有写成。

这半年多的时间,有一半的时间是很闲的,另一半的时间确实忙的不要不要的,这半年也是我比较动荡的半年,或许到目前为止还是动荡着的,但是人生经历又增加了许多。

前阵子,公司提议每个人起一个花名,以后工作上都用花名,我一下也没想好,就用了“木木”,也是用了好多年了。恰巧有个女同事取的是“默默”,本来没有什么,结果我们伟大的X总,momo mumu 傻傻分不清楚。正好有人叫我以前的雅号”BigJin”,呵,不错,那就叫我这个吧,这是以前一同事根据我的名字起的。

嗯好了,Bigjin就出来了,试试能不能注册下这个域名 Bigjin.com 一查不能注册……心凉了一大截,接着想看谁注册了,whois一看,已经进入删除期了,5天内删除! 啊这么有缘,是特地在等我么?关注了5天,在删除那天半夜设了个闹铃,人工抢注了!(也是蛮拼的啊)

注册了域名,就想着这个网站的主题已经很久没有变过了,是时候改变下了!我没有艺术天分,所以只能找找看有没有大神分享了,经过不懈努力,终于被我找到了心仪的主题Puma 感谢@Bigfa 呵呵 都是Big!上面的小狐狸也是从他那请来的。

应用上主题后,经过半天的修改调整,也就有了现在看到的!

嗯!大功告成?额还没,现在baidu都换上https了,很多博客也换上了https,我也不能落后啊,杜绝不良网络提供商插播个广告啥的…… 证书怎么搞…… 又不想花钱,找免费的。 以前用StartSSl,但是是英文的,而且比较麻烦,就想起了国内的沃通中文的而且申请方便 点这里 以前是需要人工审核的,现在只要注册了就自动签发了,超快。经过一方倒腾,终于在网址前加了一把小锁,虽然是免费的,阿里的CDN虽然支持https,但是证书和域名对不上,显示警告信息,为了绿色小锁,直接把CDN全去掉了…… 下个月3号 有一个开源的项目 https://letsencrypt.org 提供公测,到时候可以看看效果怎么样。

嗯好了,这就是我这些天动弹的,成果也就是你们现在看到的。等Bigjin.com备案下来,准备用Bigjin.com作为主域名。

感谢所有来过我博客踩踩的友人们!

#java 内存回收机制

##一、如何判断对象是否还在存活
###引用计数法:
主流的Java虚拟机没有使用这种方法管理内存, 因为它很难解决循环依赖
###可达性分析:
通过一系列的称为”GC Roots“的对象作为起始点, 从这些节点开始向下搜索, 搜索所走过的路径称为引用链, 当一个对象到GC Roots没有与任何引用链相连时, 则证明该对象是不可用的。

作为GC Roots的对象包括以下几种:虚拟机栈中引用的对象、 方法区中类静态属性引用的对象、方法区中常量引用的对象以及本地方法栈中JNI引用的对象。
阅读全文 »

这两个坐标系就不介绍了,直接上代码

public class Baidu {

    public static void main(String[] args) {
        Map<String, Double> location = convertMC2LL(13372307.47, 3514145.00);
        location = convertLL2MC(location.get("lng"),location.get("lat"));
    }

    private static Double EARTHRADIUS = 6370996.81;
    private static Double[] MCBAND = {12890594.86, 8362377.87, 5591021d, 3481989.83, 1678043.12, 0d};
    private static Double[] LLBAND = {75d, 60d, 45d, 30d, 15d, 0d};
    private static Double[][] MC2LL = {{1.410526172116255e-8, 0.00000898305509648872, -1.9939833816331, 200.9824383106796, -187.2403703815547, 91.6087516669843, -23.38765649603339, 2.57121317296198, -0.03801003308653, 17337981.2}, {-7.435856389565537e-9, 0.000008983055097726239, -0.78625201886289, 96.32687599759846, -1.85204757529826, -59.36935905485877, 47.40033549296737, -16.50741931063887, 2.28786674699375, 10260144.86}, {-3.030883460898826e-8, 0.00000898305509983578, 0.30071316287616, 59.74293618442277, 7.357984074871, -25.38371002664745, 13.45380521110908, -3.29883767235584, 0.32710905363475, 6856817.37}, {-1.981981304930552e-8, 0.000008983055099779535, 0.03278182852591, 40.31678527705744, 0.65659298677277, -4.44255534477492, 0.85341911805263, 0.12923347998204, -0.04625736007561, 4482777.06}, {3.09191371068437e-9, 0.000008983055096812155, 0.00006995724062, 23.10934304144901, -0.00023663490511, -0.6321817810242, -0.00663494467273, 0.03430082397953, -0.00466043876332, 2555164.4}, {2.890871144776878e-9, 0.000008983055095805407, -3.068298e-8, 7.47137025468032, -0.00000353937994, -0.02145144861037, -0.00001234426596, 0.00010322952773, -0.00000323890364, 826088.5}};
    private static Double[][] LL2MC = {{-0.0015702102444, 111320.7020616939, 1704480524535203d, -10338987376042340d, 26112667856603880d, -35149669176653700d, 26595700718403920d, -10725012454188240d, 1800819912950474d, 82.5}, {0.0008277824516172526, 111320.7020463578, 647795574.6671607, -4082003173.641316, 10774905663.51142, -15171875531.51559, 12053065338.62167, -5124939663.577472, 913311935.9512032, 67.5}, {0.00337398766765, 111320.7020202162, 4481351.045890365, -23393751.19931662, 79682215.47186455, -115964993.2797253, 97236711.15602145, -43661946.33752821, 8477230.501135234, 52.5}, {0.00220636496208, 111320.7020209128, 51751.86112841131, 3796837.749470245, 992013.7397791013, -1221952.21711287, 1340652.697009075, -620943.6990984312, 144416.9293806241, 37.5}, {-0.0003441963504368392, 111320.7020576856, 278.2353980772752, 2485758.690035394, 6070.750963243378, 54821.18345352118, 9540.606633304236, -2710.55326746645, 1405.483844121726, 22.5}, {-0.0003218135878613132, 111320.7020701615, 0.00369383431289, 823725.6402795718, 0.46104986909093, 2351.343141331292, 1.58060784298199, 8.77738589078284, 0.37238884252424, 7.45}};

    /**
     * 墨卡托坐标转经纬度坐标
     * @param x
     * @param y
     * @return
     */
    public static Map<String, Double> convertMC2LL(Double x, Double y) {
        Double[] cF = null;
        x = Math.abs(x);
        y = Math.abs(y);

        for (int cE = 0; cE < MCBAND.length; cE++) {
            if (y >= MCBAND[cE]) {
                cF = MC2LL[cE];
                break;
            }
        }
        Map<String,Double> location = converter(x, y, cF);
        location.put("lng",location.get("x"));
        location.remove("x");
        location.put("lat",location.get("y"));
        location.remove("y");
        return location;
    }


    /**
     * 经纬度坐标转墨卡托坐标
     * @param lng
     * @param lat
     * @return
     */
    private static Map<String, Double> convertLL2MC(Double lng, Double lat) {
        Double[] cE = null;
        lng = getLoop(lng, -180, 180);
        lat = getRange(lat, -74, 74);
        for (int i = 0; i < LLBAND.length; i++) {
            if (lat >= LLBAND[i]) {
                cE = LL2MC[i];
                break;
            }
        }
        if (cE!=null) {
            for (int i = LLBAND.length - 1; i >= 0; i--) {
                if (lat <= -LLBAND[i]) {
                    cE = LL2MC[i];
                    break;
                }
            }
        }
        return converter(lng,lat, cE);
    }


    private static Map<String, Double> converter(Double x, Double y, Double[] cE) {
        Double xTemp = cE[0] + cE[1] * Math.abs(x);
        Double cC = Math.abs(y) / cE[9];
        Double yTemp = cE[2] + cE[3] * cC + cE[4] * cC * cC + cE[5] * cC * cC * cC + cE[6] * cC * cC * cC * cC + cE[7] * cC * cC * cC * cC * cC + cE[8] * cC * cC * cC * cC * cC * cC;
        xTemp *= (x < 0 ? -1 : 1);
        yTemp *= (y < 0 ? -1 : 1);
        Map<String, Double> location = new HashMap<String, Double>();
        location.put("x", xTemp);
        location.put("y", yTemp);
        return location;
    }

    private static Double getLoop(Double lng, Integer min, Integer max) {
        while (lng > max) {
            lng -= max - min;
        }
        while (lng < min) {
            lng += max - min;
        }
        return lng;
    }

    private static Double getRange(Double lat, Integer min, Integer max) {
        if (min != null) {
            lat = Math.max(lat, min);
        }
        if (max != null) {
            lat = Math.min(lat, max);
        }
        return lat;
    }
}

当初安装idea时mac上并没有按照java 1.6的版本,而是安装了1.8的版本,提示需要1.6的jre环境才能运行,按照网上的一个方法,修改Info.plist文件中的 JVMOptions.JVMVersion ,把默认的1.6改成了1.8,发现真的可以运行了,但是同时也踏入了另一个坑——运行时总是感觉有些卡顿,特别是滚动代码区域时。但是在使用phpstorm时却很流畅(安装phpstorm前我安装了mac官方的1.6jdk)。网上查了一些资料都没搞定。突然想起之前我改过Info.plist文件,于是就把JVMOptions.JVMVersion重新改回了1.6*,丫的,无比流畅啊-_-#

##选择合适的数据类型##
数据类型的选择,重点在于选择合适的

  1. 使用可以存下你的数据的最小的数据类型。
  2. 使用简单的数据类型。int要比varchar类型在mysql处理上简单
  3. 尽可能的对表加上not null 定义字段
  4. 尽量少用text类型,费用不可时最好考虑分表

使用int来存储日期时间,可以利用 from_unixtime(),unix_timestamp()两个函数进行转换

ip地址使用bigint来存储,利用 inet_aton(),inet_ntoa() 两个函数进行转换

  1. 使用char 类型至少需要15位的长度,但是使用bigint能节省存储空间,对于大数据量就能节省更多的空间,对io有好处
  2. ip地址比较时对整形进行比较比用字符串方便很多

##表的范式化和反范式
目前范式化一般时指第三设计范式:要求数据表中不存在非关键字段对人意候选关键字段的传递函数依赖。

对于不符合第三范式的表结构将存在数据冗余

反范式化:为了查询效率的考虑,把原本符合第三范式的表适当的增加冗余,以达到优化查询效率的目的,是一种以空间换取时间的操作。
提高sql效率 减少需要关联的表

##表的垂直拆分
垂直拆分:就是把原来一个有很多列的表拆分成多个表。
通常可以按以下原则进行:

  1. 把不常用的字段单独存放到一个表中
  2. 把大字段独立存放到一个表中 比如 text blob 等
  3. 把经常一起使用的字段放到一起
    可以减少io操作

##表的水平拆分##
表的水平拆分是为了解决单表数据量过大的问题,每个表的结构都是一样的。
根据某字段 对表数量取模, 比如用户id。
拆分方法:

  1. 对用户id进行hash运算,如果要拆分5个表则使用mod(用户id,5)
  2. 根据不同的mod把数据存到不同的表中

问题:

  1. 跨分区表进行数据查询
  2. 后台的数据统计及报表

以上是笔记:视频来源

在vargrant中使用puppet时出现一下错误信息:

default: warning: Could not retrieve fact fqdn

首先我们看下百度百科中fqdn的定义

FQDN:(Fully Qualified Domain Name)完全合格域名/全称域名,是指主机名加上全路径,全路径中列出了序列中所有域成员。

Vagrant定义虚拟机的hostname 默认使用的是box默认的名称,但是你可以使用 config.vm.hostname = 'study.v.loftor.com' 在vagrantfile中进行定义。

我们可以做一个测试:

touch test.pp
puppet apply test.pp

以上将出现警告信息

sudo hostname devbox.local
puppet apply test.pp

这样就没有警告信息

sudo hostname precise64
puppet apply test.pp

现在警告有出现了 :)

其实这样在puppet独立模式的开发环境中并不会出现什么问题,但是在puppet运行在c/s模式时,会出现机器不能接收到hostname而发生问题。

解决办法如下:

1. 在vagrantfile中设置`config.vm.hostname = 'debian.loftor.com'`
2. 在虚拟机中设置hostname为fqdn格式

今天在cron 定时任务中使用了sudo命令,接口一直提示一下错误。

sudo:抱歉,您必须拥有一个终端来执行 sudo

###解决办法:
打开/etc/sudoers文件,将以下内容注释即可

#
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear. 
#         You have to run "ssh -t hostname sudo <cmd>".
#
Defaults    requiretty

在运行vagrant provision时经常会出现default:stdin:is not a tty的错误信息,但是对于运行结果没有影响,每次看到这个信息有点郁闷。

解决办法也很简单,只要在配置文件中增加一下内容就可以了

config.ssh.shell = "bash -c 'BASH_ENV=/etc/profile exec bash'"