OMV5+J3455踩的那些坑

前段时间服役了几年的Asustor 202TE NAS网络突然变成100mb了,传个文件慢如蜗牛,尤其是很多小文件的时候,比如照片之类的。

原本考虑再入个成品NAS的,毕竟用202TE这几年感觉不错,固件什么一直有更新,也很稳定。受CHH和张大妈毒害,慢慢觉得docker也可以搞起来。要上docker的话还是x86的NAS最好,但是x86的成品nas有很贵,转头开始研究自组NAS。

需求其实很简单:

  • 文件服务器,不考虑RAID,2~4盘位
  • x86,支持docker
  • 将来可以上2.5gbe或者更快的网络

自组NAS的话就是配一台小电脑,选择其实很多很多,从几百块的到几千块的都可以有,还好干瘪的钱包没让我丧失了理智。最终决定上蜗牛星际C款成品,J1900+4GB ram,看中的是机箱自带low profile的pice槽,以后可以上2.5gbe的网卡。

淘宝下单+海运前后等了大概3个星期,到货了发现没法开机。。店家说是可能是运输的时候那个电阻之类撞坏了,让我寄回去他给修一下。寄回去邮费估计我可以买个新的了,软磨硬泡之下店家答应给退一半,最后300块买了个空机箱+4GB ram+16gb msata,真的是亏到姥姥家了。

NAS还是要的啊。考虑到家里还有几条闲置的DDR3 ram, 就上了J3455, 不然J4105/J4125可能是更好的选择。

系统选择了OpenMediaVault 5. 考虑过黑群晖,但是看论坛说黑群晖丢数据的话整个硬盘的数据就都没了,怕怕。OMV的话还可以把硬盘挂到别的电脑上读一下。

硬件和OMV的安装过程到处都是,就不重复了,主要记录一下问题。

问题 1 – 安装完OMV没法不用安装U盘开机

这是最大的坑,OMV安装结束的时候(如下图)会提示你可以拔掉安装U盘了,这个时候一定不要拔 !!!
请参考Loonlog或者张大妈的教程,保留一下以免找不到了:
重启后进入系统命令行,”sudo update-grub”, 然后再拔掉安装盘,重启。

借用一下张大妈的图

问题2 – 开机提示 “[Hardware Error]: TSC 0 ADDR”

这个问题暂时无解,也不影响使用,忽略它就好了。

问题3 – 系统升级后无法开机

如果你跟我一样,见不得有升级提示,请一定要在OMV-Extra,Kernel里Hold Current Kernel !!
不要问我怎么知道的,问就是不小心升级了kernel结果开不了机最后又重装了一遍

问题4 – 挂载的硬盘分不清

创建文件系统的时候最好加上label,后面没法改。
尤其是你有好几块一样大小的硬盘的时候,不然真心分不出来谁是谁。

问题5 – 重启后Portainer里的container丢失

请仔细回想一下创建container的时候有没有选”Auto remove” 🙂

end~

MikroTik Hex S RB760iGS 开箱

辛勤工作了几年的交换机(必联(BL-SG108M)突然挂掉了,一边惋惜也一边暗笑可以折腾了:P。
选了半天决定试试MikroTik家的产品,也就有着这次开箱的主角Hex S (RB760iGS )

开箱

简洁的盒子,弄弄的山寨风。。

主体+电源+一页说明书

背面:电源,SFP光接口,5个网线接口,接口1支持POE in,接口支持POE out。可惜家里还没有别的POE设备,没法测试

Continue reading

CentOS7 初始设置

虚拟机安装完成以后,看个人需求可能还要进行一些设置或者安装软件,这里总结一下一些比较常见的

系统更新

yum -y update && yum -y upgrade

系统设置

更改机器名:

hostnamectl set-hostname
hostnamectl set-hostname new_hostname

Continue reading

CentOS7 Minimal 虚拟机安装

自己折腾虚拟机一直以来都是用的Ubuntu, 小巧方便,用户群庞大,有什么问题也好解决。最近才看到有人推荐CentOS,还是RHEL系的。刚好这几天需要一个虚拟环境来学习storm、kafka,就决定用CentOS来搭建新环境, 趁机体验一下。搭建过程碰到些大大小小的问题,记录一下,以后少走弯路。

下载:

安装

VMPlayer相信大家都熟悉了,只单独提一下网络设置。一般大家都会选NAT模式或者Bridged模式吧

网络设置 – NAT

NAT设置最为简单,可以通过主机(host)连internet,可以用putty从主机登陆虚拟机,但是不能从其他局域网里的机器登陆。
vm_centos7_network

网络设置 – Bridged

Bridged模式下虚拟机会有自己的IP地址,不用共享主机的地址,局域网内都可以访问。需要注意的是,主机有多块网卡的话,一定要只选能联网的那一块,不然虚拟机无法连internet。
vm_centos7_networkbridge_selectcard
Continue reading

Wildcards in Java Generics

Generics is one of my favorite feature in Java – strong type check, no need to type cast, parameterized type in class/method implementation. Despite using it for several years, I realized that I still don’t fully understand wildcards.

Wildcards in Generics

Refer to Oracle Tutorial on wildcards

In generic code, the question mark (?), called the wildcard, represents an unknown type. The wildcard can be used in a variety of situations: as the type of a parameter, field, or local variable; sometimes as a return type (though it is better programming practice to be more specific). The wildcard is never used as a type argument for a generic method invocation, a generic class instance creation, or a supertype.

By above definition, List<?> wildList should be read as List of unknown types. Because the type is unknown to compiler, the compiler will not allow adding anything to the list other than null (instead of accepting everything !)

List vs List<Object> vs List<?>

Declared type List rawList = … List<Object> objList = … List<?> unknownList = …
Checked? No, raw type Yes, checked type <Object> Yes, checked but type is unknown
Assignment
rawList = new ArrayList();
rawList = new ArrayList<String>();
rawList = new ArrayList(); //ok
//complication error
rawList = new ArrayList<String>();
rawList = new ArrayList(); //ok
rawList = new ArrayList<String>();//ok
list.add() Anything, all lines below are ok

rawList.add("testStr");
rawList.add(1);
rawList.add(Integer.class);
rawList.add(null);

 

Anything, all lines below are ok

objList.add("testStr");
objList.add(1);
objList.add(Integer.class);
objList.add(null);
NULL only

//complication error
objList.add("testStr");
//complication error
objList.add(1);
//complication error
objList.add(Integer.class);
objList.add(null);//ok
list.get() Object Object Object

Upper and Lower Bounded Wildcards

Sample Classes


    private static class A{
    }
    private static class B extends A{
    }
    private static class C extends B{
    }
Upper Bounded Type Lower Bounded Type
Expression List<? extends B> extendBList=… List<? super B> superBList=…
Read as A List of unknown type, the type could be B or subclass of B. in this  example, a List<B> or List<C> A List of unknown type, the type could be B or superclass of B. in this  example, a List<A> or List<B> or List<Object>
Assignment
extendsBList = new ArrayList<A>();//compilation error
extendsBList = new ArrayList<B>();
extendsBList = new ArrayList<C>();
superBList = new ArrayList<A>();
superBList = new ArrayList<B>();
superBList = new ArrayList<C>();//compilation error
superBList = new ArrayList<Object>();
list.add() Because the complier does not know the list is a List<B> or List<C>, to be  safe, it only allow adding instances of class C, which is also a B instance.

//compilation for all below
extendsBList.add(new Object());
extendsBList.add(new A());
extendsBList.add(new B());
extendsBList.add(new C());
Because the complier does not know the list is a List<A> or List<B> or List<Object>, to be  safe, it only allow adding instances of class A.

superBList.add(new Object());//compilation error
superBList.add(new A());//compilation error
superBList.add(new B());//ok
superBList.add(new C());//ok
list.get() B

//ok
for(B b:extendsBList){
/do something
}
//compilation error
for(C c:extendsBList){
//do something
}
Object

//ok
for(Object obj:superBList){
    //do something
}
//compilation error
for(B b:superBList){
    //do something
}

which means:
List<? extends B> is read-only, and only as type B
List<? super B> is kind of write-only as whatever is reading from the list, can get a Object only and does not know the actual type

So, we can only copy data from a List<? extends B> to List<? super B>, but not the other way around
This is pretty much where PECS (Producer Extends, Consumer Super) comes from.

References:
Guidelines for Wildcard Use
Stackoverflow: Difference between <? super T> and <? extends T> in Java

Maven: Add local dependencies

From time to time, we need to work with legacy codes.
Recently I got a chance to look at some old modules. They were developed many years ago, Ant is used as build tool. Each of these modules has its lib folder, which has all the dependent jars. And some of the Ant build scripts have its own “typedef” task and the the typedef task class comes from the module itself. They are left behind comparing to other stuff I work on in term of SDLC stack. I decided to move those modules to Maven first.
To keep it simple, I decided to keep the jars as they are, give it a try with “system” scope. It turns out it works perfectly.

Add local jars as Maven dependencies

<dependency>
    <groupId>io.wwei.sample</groupId>
    <artifactId>stmp</artifactId>
    <version>1.0.0</version>
    <scope>system</scope>
    <systemPath>${basedir}/lib/stmp.jar</systemPath>
</dependency>

Execute Java Classes as part of “package” step

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.4.0</version>
    <executions>
        <execution>
            <id>exec1</id>
            <phase>package</phase>
            <goals>
                <goal>java</goal>
            </goals>
            <configuration>
                <mainClass>io.wwei.sample.PostCompile</mainClass>
                <additionalClasspathElements>
                    <additionalClasspathElement>{basedir}/target/classes</additionalClasspathElement>
                </additionalClasspathElements>
                <classpathScope>system</classpathScope>
                <commandlineArgs>local</commandlineArgs>
            </configuration>
        </execution>
    </executions>
</plugin>

Include local jars to final assembly

“dependencySets” does not include local jars, so we have to copy them explicitily as below

<fileSets>
    <fileSet>
        <directory>lib</directory>
        <outputDirectory>lib</outputDirectory>
        <includes>
            <include>**/*</include>
        </includes>
    </fileSet>
</fileSets>

Asus N66U简单开苞

从巴厘岛回来之后就一直忙着project, 没顾得上折腾..
9月头的时候家里的Singtel 10Mb ADSL突然巨慢无比, 10Mb的网络在SpeedTest居然只有20KB, 连网页也打不开, 更不要提下载和看视频了. Singtel的客服还是很不错的, 很快就有technician下来换了个新的MIO box – PACE A5520, 速度稍微好了点但远达不到10Mb, 还多了一个新问题 – 一开Xbox, 不管是网线还是插网线, 只要是联网, modem就挂了, 家里所有的设备就都上不了网了. 网上也没有看到类似的问题. 不爽.
和Singtel沟通了一下, 决定换到Fiber去, 一是心水Fiber很久了, 100mb的网络和10mb的ADSL一样钱, 速度要快好多,新加坡本地100mb, 国际路线15mb+. 二是根据Singtel Technician的说法, Pace A5520本来是给Fiber用的, 用在ADSL上固件可能不是很好.
安装还算顺利,前后大约三个星期.OpenNet负责TP, Singtel负责ONT (ZTE F620G) + Mio Box (还是A5520). Fibre果然不是吹的, 下个动画片电影立等可取..郁闷的是依然不兼容Xbox. 刚好吊起了我折腾的劲头.
第一计划是用原有的Linksys E3000替换A5520. 为了支持VLAN+priority, 编译了N个版本的tomato, 但是Mio TV和Mio voice设置死活都不对.
第二选择是替换ONT ZTE F620G. F620G本身有四个千兆LAN接口, 两个voice接口, 但不知道为什么Singtel本身只激活了一个LAN,其他的插上去一点反应都没有. 如果有方法可以激活的话, 就方便多了. 可以把E3000, TV和voice都接到F620G上. 在chinadsl上研究了很久, 没有几个用F620G的. 试了一下F420/F660的方法. 可以登陆上ONT, 但ONT用的squashfs重要的fodler都只有ro权限, busybox也没几个能用的command. 拿到了db_user_cfg.xml, 也因为没有文档, 不知道怎么改.
剩下最后的选择, ASUS的N56U/N66U/AC66U, 因为它们很贴心的支持一下ISP的特殊要求. 相比之下, Linksys和Netgear就太不上进了. 路由器发展了这么多年, 功能就没怎么变过, 一直围着NAS/Cloud funciton打转, 但是路由器直接接硬盘速度慢的要死, 就是个鸡肋. 还不如支持一下VLAN, 让User设置起IPTV, voip来容易些.
=============吐槽结束===========
简单开包一下, 详细评测见 smallnetbuilder, chiphell, hardwarezone
送的几件小东西, 还不如给点discount实惠..偶不是CS fans, 电脑一直裸奔, 杀毒软件也用不到, 耳机老婆看不上眼..

好大一个盒子~~HOHO~~
   

从左到右, 电源, 主角, 天线, 还有送的卡巴斯基

合体完毕, 暂时寄住在Q08上先
 
5Ghz速度测试

巴厘岛归来

不知不觉都注册结婚一周年. 结婚以来忙着买房换工作, 都一年了也没有出去来个蜜月旅行,也没有拍婚纱照, 亏欠老婆太多了 T_T, 还好老婆深明大义. 这次去Bali主要就是拍婚纱照.
机票去年就定了,  7天6夜, AirAsia促销的时候抢的, 两个人265SGD. 现在机票真是白菜价啊, 趁着没小孩这几年要带着我家大猫把东南亚都转一遍.
Bali岛的介绍/游记网上随处可见, 就不重复了. 切入正题

Pre-wedding Photography篇

影楼是我家大猫找的 – I DO I DO. 看网上的样片很不错. 好像是台湾人开的, 很多华人找他们拍. 我们去影棚试衣服,照片,最多也就半天的时间, 就碰到了三四对, 都是华人. 店里的工作人员/摄影师都很nice, 基本都会说中文, 交流起来很方便.

具体流程
1. 联系idoido,询问价格/时间. 他们家很火, 所以感兴趣的话最好早点定.
他们家有很多套餐, 我们选的只要soft copy, 他们制作相册要两个月..
2. 确定套餐和时间之后, 付一半定金. 他们有新加坡POSB的账户, 国内的应该也有
3. 拍照的前一天去试衣服, 选景点.
idoido会提供西装婚纱,还有白色的皮鞋. 要是选黑色西装的话要自带黑皮鞋. 也可以带自己的衣服
拍摄是一整天, 可以有两到三个景点. 最出名的是蓝点, 有无边泳池(完全不能和MBS比)和一个小教堂. 不过我们对教堂不感兴趣, 所以选了一个长桥+沙滩+夕阳, 样张可以去idoido找.
4. 拍照当天早上要化妆, 所以早点去. 他们会提供午餐和水.
长桥就是红树林里的一条长长的木桥. 新加坡有很多地方有类似的木桥. 看样张的时候觉得长桥特美, 真正到了地方有点失望, 有些地方脏脏的, 水质也不是那么清澈. 还得说摄影师nb啊, 角度选得好, 在照片上完全看不出来, 还是很让人满意的.
我们选的沙滩在Nikko hotel, 酒店养了几只骆驼, 很萌, 所以我家大猫一眼就相中这地方了. 事实证明这也是最明智的选择. 沙滩很美, 大海很蓝, 骆驼君是亮点啊, 差点抢了我家大猫的风头. 要注意的是巴厘岛比新加坡还热, 小心在沙滩上中暑.
夕阳得等到5点半左右, 美不美就得看天意了. 建议穿idoido的衣服, 不然被浪打湿了还得自己洗..
5. 第二天就可以过去看照片了. 完美结束
Continue reading

开苞几个小东西

几天不败点小玩意就手痒 T_T
耳机真是个消耗品啊. Desire HD自带的耳机用了两次一个耳朵就没声音了. 之后一直在用老婆iphone的耳机, 时间久了耳机头边上的塑封部分都脱落了. 看了下Amazon的review, JVC HA-FX1X算是便宜又好用. 到手一试效果还真不错, 大红色, 造型也够酷, 就是线材塑料感强了点. 希望这个能用的久点

二号出场的是La Crosse BC-700. 一直在用罗技的MX600, 电老虎啊, 两节AA电池用不了一个月. 算了算还是用充电电池来的划算, 决定入手三洋eneloop. 偶然在CHH看到La Crosse的这款充电器, 看起来很nb的样子, 价格也还可以. 充电器到手了,电池却还在路上. 用两节energy的测试下吧

压轴的是罗技的MX950, 替换之前的电老虎. 到手了才发现这货只用一节电池就够了. 这下不用担心4节eneloop不够用了. 鼠标有点重, 很有手感. 造型嘛萝卜青菜各有所爱, 我觉得很帅, 但老婆觉得丑不拉几→_→