我眼里的好项目

前面说到投资区块链的小伙伴见面了。
这样的见面其实挺好,从一个朋友那里看到过,说:最铁的关系,是一起赚过钱的关系。虽然自己不是特别赞同,但是感觉,这种关系,跟“一起扛过枪”的感觉应该类似。一拨想要了解一个东西,或者已经了解的,甚至精通的人呢,凑到一块,交流的氛围还是会很棒的。
我加入这样的圈子,说实话,最初肯定是冲着赚钱去的,开始的时候我怎么知道里面这么多弯弯绕,都是随着接触深入,了解深入,越来越了解原理,从而慢慢又了自己的见解。
小伙伴组织的第一批基金我没有参与,一个是当时手里没钱,另外一个是对这块了解还不够深入,甚至很多赚钱的传奇都还没有了解清楚,所以对这一块有没有如此赚钱的机会,对于这个初结识还没多久没有经过事件和时间验证的小伙伴,自己心理还是有些怀疑的。另外当时圈子里(小密圈)投资的火爆程度让自己很是怀疑,简直太疯狂,也许是因为大家都已经充满了信仰,或者子弹充足,可以肆无忌惮的投资,所以才这样疯狂。
多疯狂呢?就是一个项目,之前没有发出来任何消息让大家了解,从这个项目开始公布开始报名,到打币成功,中间只给你一天甚至半天都不到的时间。没有资料,没有白皮书,没有官网,没有代码仓库。只是知道做什么的(大致),团队可能是多么牛逼,有什么样的背景,或者有哪位大佬站台表示支持这个项目,或者已经投资了这个项目,其中尤其以徐小平,李笑来等投资大佬影响最大。
但是其实知道这些,等于对项目什么都不知道。因为自己没有去研究过这个项目,没有做过尽调,没有途径或者压根没有想要去确认这些机构,大佬是不是真正投资了这个项目。两眼一抹黑,然后就疯狂的报名打币,以防自己错过了什么项目。
当初在这样一个疯狂的环境和状态中,能最终忍下来没有去参与最初的几个项目,自己也是很不容易的,一边在焦虑着自己是不是错过了一次百倍币的机会,另外一边自己也在焦虑着万一这是个空气币怎么办,自己什么都没了解,这里提供的渠道也只是提供代投,最终赔了他们也负责不了什么的。虽然现在看来自己当时的决策还是挺英明的,但是再往前一个多月两个月,自己这样的犹豫就会错失大把大把的机会。
那么反过来说,到底什么样的项目才是好项目呢?
我自己也不知道,毕竟仍然是研究的不够深入的一个人。但是从传统项目的角度来考虑(个人感觉,既然是做项目的团队,一样也是做项目,只是做的东西不一样,因此这些考虑的方面应该不会差的太远),大致应该有这么几点:
1.项目逻辑
无论如何,项目是需要落地的,项目的逻辑最起码能说的通。不要说什么区块链是颠覆所有,区块链有其优势,同时也有其缺点,有很多传统的项目并不适合用区块链去做,老老实实的用传统的信息化手段去做就足够了,而且稳定可靠效率高,成本低。
这跟之前的互联网项目也一样。互联网创业刚火起来的时候,很多的人蜂拥进来要创业,自己在家愁眉苦脸思考出来一个场景,就觉得自己的模式已经思考好了,可以落地实施了。确实,最初这样项目也能拿到投资,但是最终,或者互联网创业风潮远未过去的时候,这样的项目就被证明是没有存活空间的于是等到把钱花光,入不敷出甚至没有收入,项目宣告破产。
之所以把项目放在第一个位置来说,是因为作为一个区块链的项目,基本上所有的东西都是透明的,而且是一个几乎全新的领域,谁说在这方面已经精通了,那几乎都是扯淡,所以作为一个用来满足人们、社会某一方面需求,解决某一方面问题的项目,逻辑必须是得能说得通的。
未完待续。

区块链学习(2)

前面说到开始投资了。

自己兑换usdt或者兑换btc,然后开始投资,这没什么问题,其实也是早就知道。但是,自己会有一种心理,就跟自己最初看某个商品什么价格一样。比如看房子,你可能从12、13年就看了,那时候是什么价,自己有一个判断,然后做了一个决策,那就是不买,觉得太贵了。无论是投资还是自住,自己都错过了一次上车的机会,这就如自己第一次看到数字币的时候一样,那时候会觉得,这不就是数字币,为什么这么贵,买了有价值吗。后面就是,房价涨涨涨涨涨,当你再去看同一个位置的同样条件的房子的时候,房价的增幅让你又重新刷新了三观。然后你会觉得,不行,我得买了。但是!但是,这个时候多数人不会觉得,当前什么价格就直接买了就好了,哪怕贷款,多数还想等等,等等,觉得这价格不合理啊,明明我那时候看的这么低,但是现在已经涨到这个价格了,我觉得我要是现在买了,那就相当于承认了之前的错误决策,承认了自己的错误。而绝大多数人是不愿意承认这个的。

我也一样,看数字币的时候也一样。早就看过,还好,最早看的时候已经特别久了,所以没造成什么影响。但是在知道最近的大行情,以及下了决定要开始投资的时候,自己也不停的看过盘面,在这过程中,一些想要买的币就不停的在涨涨涨涨。最关键的是,比特币也不停的在涨。那时候自己对usdt了解还不深,最开始就觉得,如果法币兑换数字币,那肯定还是老牌数字币比特币最靠谱啊。

未完待续。。。

去兑换币的时候,选择比特币,原因当时应该有两个,一个是对usdt不熟悉,对法币交易市场也不熟悉,总觉得usdt对美元是1:1,我用超过这个价格的钱买usdt好亏啊,总觉得应该有路子去原价买入usdt,但是自己又没有途径;另外一个,就是上面说的,我最开始看的时候,usdt并没有那么高的价格。但是比特币这个价格,我算不过来啊~ 哈哈 所以最后决定了用法币交易比特币。但是后来交易完成之后,仔细一算,其实比特币也有相当高的溢价,当时买的时候应该是10个点多了,也算是相当高。当然后面还见过更高的,这都后话了。

这样,我在知道比特币,数字货币,好几年之后,才终于有了第一次数字货币交易。因为加入了这个哥们的小密圈,跟着看好像是有一些参加ico的机会的,而这些机会基本都是用以太坊(eth)来进行计算的,所以买了比特币之后,就交易成了以太坊。

在做这笔交易之初,我的心里真正的想法是人为我亏了的。因为上来一交易就有10%的溢价,这时候从账面上看总价已经亏了10%了,心里还没从那种反应过来。这种心理也是我后来发现,并且决定要逐渐改善的。这种心理会让自己的判断出现偏差,并且只注重眼前短期的利益。当然后面很快就已经在账面上把这些钱赚回来了。

这时候从小密圈里认识了相当一波做数字货币投资,研究,交易,甚至开发的人。很幸运,很幸福,能遇到这么一波人。暂时还说不准志同道合什么的,但是同样是一群时刻关注着最新动态,最新技术,最新事物的人,碰到一起,总是轻松愉快充满激情的。

区块链学习

OK then。

先写下自己的经历。

很久之前,久到大概五六年前,我就接触比特币了。那时候还算保持着对新事物的关注。然而当时毕竟也是没有什么积蓄(现在看来,那时候多少钱都算是啊),所以一心想着自己挖矿好了,比较极客,投入也比较少(这点再次证明,有时候一个人的本钱是对一个人的思维方式有很大影响的)。研究一段时间之后,发现没有自己数字的主力语言的,于是。。。。就放一边了。

差不多一个多月之前,从朋友圈发现了一个身边的(算是)玩币的人,当时已经赚的盆满钵满了,然后做了个小基金,然后又赚了很多了于是又准备直接搞私募(貌似之前主要发家的路子也是私募)。我看小密圈价格还可以(当时很便宜,相对而言,后来涨价了十倍不止),另外自己对这样的机会还是想要了解一下里面究竟是什么样的。

随后,就了解到,他是17年上半年接触到数字币,机缘巧合。然后他们几个朋友组织的小基金(这里不得不再提一下,他本人也是很有投资头脑的,个人的资金比较少的时候,就可以联络几个关系比较好的人报团组织出比较大的资金来进行投资,这样可投资的项目和空间立刻大了很多。这是我这样的技术人没能想到的)。当时有一个天上掉下来的机会,这个圈里的朋友介绍私募itc,他们圈里的人看了看并不觉得怎么好,所以决定不投,但是那个朋友自己投了一笔。后来的结果很明显,朋友没投太多,但是也财务自由了基本上。于是他自己如醍醐灌顶,开始大力介入数字币、区块链。六七八九月,二级市场btc和私募让自己赚的盆满钵满。

他个人秉承价值投资,在真正投资一个币之前,要好好做研究,首先要研究透比特币,区块链是什么东西,底层的原理和逻辑是什么,其他的币是怎么回事,有没有落地的项目,团队成员如何,背景资历怎么样,是否活跃,开源项目提交代码是否频繁,提交的内容是什么,有没有弄虚作假,项目是否真的有意义,如果是,那么就通过私募拿到额度或者。这样看下来其实是一个正常的投资理念,我也很认可。于是决定,如果他真正看好并推荐的项目,我就仔细信任的去投私募和二级市场,自己看到什么也跟他交流一下,听取一下意见什么的。同时自己也要开始研究区块链,让自己真正了解这是个什么东西,为什么这个东西出来之后,这么多人感兴趣,这么多人去投资,去研究,去推广。

实际的投资过程并不那么一帆风顺。初期的项目手里没有钱(现在还在想,如果我五六月没有买房子而是去屯了比特币,现在也好几套房子了 哈哈,然而现实从来没有如果),错过了两个项目。后来想到之前他使用的那种跟朋友一块做投资的方式,于是我也效仿一下,当然其实只是跟好朋友交流的时候,谈到自己想要投资,比较看好这块,朋友也是在我的描述之下,觉得也是不错,所以决定一起凑一点,然后去参与一些私募。

正如上面所说,现实并不是那么一帆风顺。

在mybatis中清空/全部删除表数据

有个定时任务一直以来直接跑的增量,基于跑了一段时间的定时任务的情况来看,发现有些情况没法通过增量来处理,比如被扫描表里有数据删除掉了;这种情况在我的定时任务里就没法定位出来对相应数据做处理。而在跑了定时任务之后如果再扫描结果表把已经被删除的数据筛选出来感觉是个很糙很糟糕的做法。

于是决定,在跑定时任务之前先清空整个结果表中的数据。思考之后有以下四种方式。

1、删除表重建表(drop table , create table )
虽然这种方式速度也很快,但是在业务工程里去做DDL操作感觉不太合适,而且操作相对复杂的多,放弃这种方案。

2、使用delete from table语句删除所有数据。
从逻辑上来说这个完全没有问题。但是delete语句虽然我们在执行的时候是清空所有数据,不需要加where条件,但是实际上数据库做的操作还是一条一条删除数据。在这个过程中数据库需要对每一次操作记录事务日志。数据量比较小的时候,这个操作也很快,当数据量比较大的时候,这个操作将会耗费比较长的时间。而且delete操作并不释放空间。

3、使用 delete table 语句删除所有数据。
这种方式也是删除表中所有数据,速度也快,唯一的一点,就是不释放空间。如果没有更好的方式,我将选择这种方式来实现我的设计。显然,有更好的方式。

4、使用truncate语法清空表。
查询过truncate语法和truncate与delete语法之间的区别就会知道,不同之处就在于,truncate会直接删掉相应的数据文件,这样不仅清空数据,而且释放了空间。另外就是,速度非常快。truncate的实现方式也是通过系统直接删除文件,这样的方式基本没有更快而且更节省时间的了。

经过思考,决定选择第四种。那么在mybatis中如何去执行truncate语句呢?查询资料,篇博客说使用@Select注解 ,然后执行的脚本字符串写truncate就可以,于是按照这个方式做。做完之后单元测试的时候发现,进入方法之后既没有执行结果,也没有执行错误的异常,很是尴尬啊。。。

后来想想,按说这里是一个对表(数据)的操作,按说不应该使用Select注解啊,这是个只读的。于是尝试,将注解改为使用@Update,果然成功!

因此得出结论:在mybatis中执行truncate语句需要按照如下方式:

@Update("TRUNCATE TABLE tmp_truncate_table")
void truncate();

ps.我这里使用的是mybatis的全局注解的方式,如果是使用配置文件,应该只需要在mapper文件中添加Update标签并将语句写到里面即可。

利用JAVA注解实现pv统计功能

利用JAVA注解实现pv统计功能用到的部分资料

 

http://www.tuicool.com/articles/JN73Ejb

http://www.jb51.net/article/67050.htm

mybatis表名含有参数

表较多需要分表,或者日志等需要按照模块分表的时候,为了统一接口经常需要将最后不同的部分作为参数传入到sql中进行查询,如

表名 t_log_user,t_log_item等,在拼接如下sql

select * from t_log_*

的时候,需要将 user,item等字符串作为参数传进去。开始使用的mybatisgenerator生成的那种方式,里面传递参数都用的#{module}的方式,但是在参数存在于表名的时候,如果是字符串,mybatis会给加上单引号,即最后拼接成的sql为 select * from t_log_’user’,执行必然报错。

查找了一下网上资料,参考《http://blog.sina.com.cn/s/blog_4822be6d0101g0da.html》,需要在sql mapper xml文件中的语句块里添加 statementType=”STATEMENT” , 并且参数声明必须使用 ${module}($)符号才行。

示例:

<sql id=”selectListByModule” resultMap=”tLog” parameterMap=”tLog” statementType=”STATEMENT” >
select * from t_log_${module} where 1=1
</sql>

当前浏览器里一直保持着的几个地址

部分看没看完的,部分还有用的。

Spring3 MVC Login Interceptor
http://my.oschina.net/uniquejava/blog/83657
MyBatis Generator 详解
http://blog.csdn.net/isea533/article/details/42102297
Mybatis generator使用(基于Maven)
http://maosheng.iteye.com/blog/1994220
图客圈创业记:不疯魔,不成活
http://yuedu.baidu.com/ebook/cf21e168a5e9856a5612606b?pn=1&click_type=10010002&rf=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3Dieg_3aPx6q7yhAz9Y0mOb5zLi_osB2ODaItC7gR5tCoxzIYH3ET6nZBBHCgw764xEsFRXmxnd-FUlJLraoo-H12AgOk7mqeuSwgpMn2lal-4PlsNoDvO7n09lPeW_UnRnok9Pgss0KRka79-K-_Jy8U1lfT3JGRSHHrFc6X-3V7gmYAPT4AhrIR8fO1ZwZNP-isUzPVxqlCtJWyUxbLJYItrdO9jLA4BmdjcSyWDuBXhQX4dfmP9Ln3jzgaz_Ug5GCpQdmuAxhd0MGaWQEh19K%26wd%3D%26eqid%3Dc157eb100000fee20000000255a5d7a4
maven+springMVC+mybatis+junit详细搭建过程
http://www.open-open.com/lib/view/open1392252233301.html

这里是游戏测试页面

这里就是为了测试游戏页面,并没有游戏。

from 大董

HTML表格table中单元格内容过多自动换行设置

让HTML表格table的相应单元格自动换行:
1、设置单元格宽度
2、给当天的表格设置样式style=”word-wrap: break-word;word-break:break-all;”

在spring中,代码里获取spring加载的properties文件中值的方法

平时用spring的时候,配置的值多数情况都是直接在配置文件中注入给管理的类了,比如数据库连接池,数据库,缓存等,不需要再在代码中获取值做相应的处理。今天遇到这种情况,需要在代码中判断某个值是否为空,如果不为空则解析其值并根据解析的值给HTTPclient加上代理,否则则不加。

首先是使用spring的placeholder加载所有的properties文件

然后是常见的第一种注入配置值的方法:

使用配置文件管理需要注入的实例,在初始化实例的时候,在配置文件中使用property参数注入相应的值,入
<bean id=”cacheManager” class=”cn.outofmemory.util.MemCacheManager” init-method=”init”>
<property name=”nodeList” value=”${memcache.nodelist}”/>
</bean>
这里的${memcache.nodelist}就是properties文件中key值为memcache.nodelist的配置值。
但是这样做会打乱原有的使用注解管理bean的布局,显得比较混乱,而且如果改动类还需要同时改动spring的配置文件。

第二种:
1、引入命名空间:
xmlns:util=”http://www.springframework.org/schema/util”
xsi:schemaLocation=”http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd”
内容中写入
<util:properties id=”propertiesReader” location=”classpath:test.properties” />
2、在类中需要注入的属性实现 setter 和 getter 方法。
3、在 setter 方法前(或者该属性声明位置),添加 @Value 注解
@Value(“#{propertiesReader[propertiesName]}”)
propertiesName 为 properties 文件中的键。这样,在容器启动过程中, Spring 将自动注入值。

第三种:
实现一个 PropertyPlaceholderConfigurer 扩展的类,在这个类中重写protected void processProperties方法,在方法体中,将传入的
Properties props的值全都重新复制一份给当前方法的静态变量,这样就可以直接使用该静态变量获取系统加载的参数了。示例如下:

private static Map<String, String> ctxPropertiesMap;
@Override
protected void processProperties(
ConfigurableListableBeanFactory beanFactoryToProcess,
Properties props) throws BeansException {

super.processProperties(beanFactoryToProcess, props);

ctxPropertiesMap = new HashMap<String, String>();

for (Object key : props.keySet()) {
String keyStr = key.toString();
String value = props.getProperty(keyStr);
ctxPropertiesMap.put(keyStr, value);
}

}
public static String getContextProperty(String name) {
return ctxPropertiesMap.get(name);
}
第四种:
很简单,只要是使用PropertyPlaceholderConfigurer来管理加载了所有的配置文件,那么我们在某个spring管理的实例里的属性上,
在某个set方法上可以用@Value(“${db.driverclass}”)来完成注入,也可以在成员变量上注入。
例子:
例子代码如:
@Service
public class DatabaseInfo {
@Value(“${db.driverclass}”)①
private String driverClass;
//也可以在这里注入
@Value(“${db.driverclass}”)②
private void setDriverClass(String dc) {
this.driverClass = dc;
}
}
参考文献
《http://blog.csdn.net/achilles12345/article/details/38614387》
《http://jackyrong.iteye.com/blog/1330946》