读书:十年,一直在路上

1.开篇

一开始是抱着随便看看的心态,开始读.可是作者又怎会真的让大家随便读呢.于是,像一个泥潭一样,越来越陷入到故事中.去思索那些在故事中的人,想他们的走过的路,喝过的水,看过的星空……这些的这些都很美好,至少在书里是这样的.即便充满伤痛,也看起来那般美好.我说不出来这是怎样的一种体会,很难.其实只有很简单的12个故事,每个都不一样,却都充斥着一种东西,让人说不清,也许是力量,也可能是鼓励,或者是生活……不知道,到底是什么.或许不揭开,更美好呢.

2.前行

我没有用计算器去算过十年有多少天,多少小时,多少分钟.但我知道,十年,可以让一个人飞黄腾达,也同样可以让一个人跌落谷底.这些都太过平常了,任何一个奔三的人,谁没有一个十年的故事呢.只是内容不同罢了.在书里的故事里的那些人,此刻正像幻灯片一样浮现在我脑海中,豆儿、阿明、老兵、毛毛、成子、二宝、椰子姑娘、杂草敏、还有《对不起》那个故事里的姑娘,每次看到《对不起》,总是觉得好惋惜和痛恨,痛恨世人的无情,惋惜那姑娘的遭遇。要是不是丽江,可能那条狗的命运会改变,要是那次同学聚会哥哥没有去,或许那依然是一个幸福的姑娘……书里的人,太多太多,发生的事情太多。到此时,才发现那些故事的疼,一点一点渗入心脾,隐隐作痛。希望故事里的那些人,守着自己的幸福。

对了,还有昌宝,那条哈士奇,其实我也没明白,它是怎么皈依的?在之前我并不知道,但是现在我知道了。嗯。

在看这本书之前,我在韩寒的一个One上看过两遍《对不起》,一次是在手机上,另外一次是在电脑上。同一天。另外一篇文章好像是《乖,摸摸头》,写杂草敏的那个,看过一次,印象深刻。之后听说出书了,不过现在才看完,有些遗憾。

每一个有故事的人,总有些不为人知,许是心酸,许是幸福。

乖摸摸头
image-2281
乖摸摸头

3.转身

看完了多少还是有些受感染,在某个时刻,真的差点冲动背起行囊出发.

无论是拉萨还是丽江,都是不错的选择.我只是在想,若现在不去,以后还能找到书中的那个丽江,那个拉萨吗?

十年,完全不是几万字,几十万字可以描写。他在写十年的路,我们在看,是的,只是个观众。

有时候我想,这十年最美好的是什么呢?幸福?微笑?不,我觉得是那些人,那些在生命中短暂停留的人。

假如问我,最喜欢哪一个故事,我也许会反问:你最爱自己的哪一根手指?

无量天尊,哈利路亚,阿弥陀佛么么哒。

乖,摸摸头。

PS:大冰在新浪微博也叫大冰。地址

Java:连接MongoDB的一些示例

是这样的

首先,这篇主要面向有一些MongoDB经验的.
本来打算在很久之前就整理一下Java连接MongoDB的内容,但是一拖再拖只好现在写了,希望还不算太迟.由于安装实在太过于简单了,所以这里直接讲怎么连接.

1.连接到MongoDB

连接前首先要导入以下两个包,可以在这里找到(点我,点我,快点我啊):

  • bson文件夹下面的:bson-*.jar [*=版本]
  • mongo-java-driver文件夹下面的:mongo-java-driver-*.jar[*=版本]

两个的版本最好是一样的,避免出现问题.

在这里使用的bson和mongo-java-driver版本均是:3.0.1

下面是连接的源码[一定要先启动MongoDB服务器,否则报错!]:


//连接到mongodb.
MongoClient mongoClient = new MongoClient();
/*
可以上面那样连接,也可以像下面这样去连接[来自官方文档]:
MongoClient mongoClient1 = new MongoClient();
MongoClient mongoClient1 = new MongoClient("localhost");
MongoClient mongoClient2 = new MongoClient("localhost", 27017);
MongoClient mongoClient4 = new MongoClient(new ServerAddress("localhost"));
MongoClient mongoClient5 = new MongoClient(new ServerAddress("localhost"), new MongoClientOptions.Builder().build());

或者:
MongoClient mongoClient = new MongoClient(Arrays.asList(
new ServerAddress("localhost", 27017),
new ServerAddress("localhost", 27018),
new ServerAddress("localhost", 27019)));
*/
MongoDatabase db = mongoClient.getDatabase("test");
System.out.println(db);
// end.

运行结果如下:


May 14, 2015 9:08:03 PM com.mongodb.diagnostics.logging.JULLogger log
INFO: Cluster created with settings {hosts=[127.0.0.1:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500}
com.mongodb.MongoDatabaseImpl@35f983a6
Process finished with exit code 0

mongodb
image-2278

2.插入数据

插入数据的时候要用到上面的源码,并且要确认MongoDB真实可用[输入命令mongo试试即可].


//连接到mongodb.
MongoClient mongoClient = new MongoClient();
MongoDatabase db = mongoClient.getDatabase("test");
// end.
//--------------------------
//插入一个文档.
db.getCollection("restaurants").insertOne(new Document("address"
, new Document().append("street", "2 Avenue")
.append("street", "2 Avenue")
.append("zipcode", "10075")
.append("building", "1480")
.append("coord", asList(-73.9557413, 40.7720266)))
.append("borough", "Manhattan")
.append("cuisine", "Italian")
.append("grades", asList(
new Document().append("date", "2014-10-01T00:00:00")
.append("grade", "A")
.append("score", "11"),
new Document().append("date", LocalDateTime.now().toString())
.append("grade", "B")
))
.append("name", "test").append("restaurant_id", "41704620"));

insertOne(),运行成功之后是没有提示的!!

3.查询结果

查询有多种条件过滤,更多可以参考文档.


//连接到mongodb.
MongoClient mongoClient = new MongoClient();
MongoDatabase db = mongoClient.getDatabase("test");
// end.
//--------------------------
FindIterable iterable =db.getCollection("restaurants").find(eq("borough", "Manhattan"));
//下面是其他查询方式.[这些方式都可以用new Document替代,但是这样写更加简洁.]
/*
db.getCollection("restaurants").find(eq("borough", "Manhattan"));
db.getCollection("restaurants").find(eq("address.zipcode", "10075"));
db.getCollection("restaurants").find(gt("grades.score", 30));
db.getCollection("restaurants").find(lt("grades.score", 10));
db.getCollection("restaurants").find(and(eq("cuisine", "Italian"), eq("address.zipcode", "10075")));
db.getCollection("restaurants").find(or(eq("cuisine", "Italian"), eq("address.zipcode", "10075")));
db.getCollection("restaurants").find().sort(ascending("borough", "address.zipcode"));
*/
iterable.forEach(new Block() {
@Override
public void apply(final Document document) {
System.out.println(document);
}
});

下面是我的查询结果:


Document{{_id=5554bfa96204f509fa8578c3, address=Document{{street=2 Avenue, zipcode=10075, building=1480, coord=[-73.9557413, 40.7720266]}}, borough=Manhattan, cuisine=Italian, grades=[Document{{date=2014-10-01T00:00:00, grade=A, score=11}}, Document{{date=2015-05-14T23:30:49.132, grade=B}}], name=test, restaurant_id=41704620}}

4.更新数据

更新数据,源码如下:


//连接到mongodb.
MongoClient mongoClient = new MongoClient();
MongoDatabase db = mongoClient.getDatabase("test");
// end.
//--------------------------更新一条数据,返回更新条数
db.getCollection("restaurants").updateOne(
new Document("name","Juni"),
new Document("$set",new Document("cuisine",
"American (Bew)")).append(
"$currentDate",new Document
("lastModified",true)));
/*
更新多条数据,使用下面的代码[返回更新条数]:
db.getCollection("restaurants").updateMany(new Document("address.zipcode", "10016").append("cuisine", "Other"),
new Document("$set", new Document("cuisine", "Category To Be Determined"))
.append("$currentDate", new Document("lastModified", true)));
*/

除了上面更新,也可以使用替换(替换将覆盖原文档!!).

db.getCollection("restaurants").replaceOne(new Document("restaurant_id", "41704620"),
new Document("address",
new Document()
.append("street", "2 Avenue")
.append("zipcode", "10075")
.append("building", "1480")
.append("coord", asList(-73.9557413, 40.7720266)))
.append("name", "Vella 2"));

5.删除数据

!!!删除前,一定要做好备份!!

一共有三个删除方式:

  • 1.删除文档
  • 2.删除全部文档
  • 3.删除集合


//返回删除数
db.getCollection("restaurants").deleteMany(new Document("borough", "Manhattan"));
/*
删除全部文档[返回删除数]:
db.getCollection("restaurants").deleteMany(new Document());

删除一个集合:

db.getCollection("restaurants").drop();
*/

6.聚合查询

下面是一个例子,里面的[$group]、[$sum]均是MongoDB的关键字,可以查阅相应文档获取更多.


//实在不好意思,我也是写到这才发现toJson返回的数据是格式化过的..
AggregateIterable iterable = db.getCollection("restaurants").aggregate(asList(
new Document("$group", new Document("_id", "$borough").append("count", new Document("$sum", 1)))));
iterable.forEach(new Block(){
@Override
public void apply(final Document document) {
System.out.println(document.toJson());
}
});

7.索引

下面是两个创建索引的方式:


db.getCollection("restaurants").createIndex(new Document("cuisine", 1));//创建单个索引

//------------

db.getCollection("restaurants").createIndex(new Document("cuisine", 1).append("address.zipcode", 1));//创建多个索引

源码

上面所有示例的源码.


package com.mongodemos;

import com.mongodb.Block;
import com.mongodb.MongoClient;
import com.mongodb.client.AggregateIterable;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;

import java.time.LocalDateTime;

import static com.mongodb.client.model.Filters.eq;
import static java.util.Arrays.asList;

/**
* MongoDB -Java常用操作.
*
* @author puruidong
* @version 2015.05.15 00:45
*/
public class Main {
public static void main(String[] args) {
//连接到mongodb.
MongoClient mongoClient = new MongoClient();
MongoDatabase db = mongoClient.getDatabase("test");
// end.
//--------------------------
//看相应方法调取.
}

/**
* 聚合查询.
*
* @param db
*/
private static void aggFind(MongoDatabase db) {
AggregateIterable iterable = db.getCollection("restaurants").aggregate(asList(
new Document("$group", new Document("_id", "$borough").append("count", new Document("$sum", 1)))));
iterable.forEach(new Block() {
@Override
public void apply(final Document document) {
System.out.println(document.toJson());
}
});
}

/**
* 删除数据.!慎用!!
*
* @param db
* @return
*/
private static long deleteData(MongoDatabase db) {
//返回删除数
return db.getCollection("restaurants").deleteMany(new Document("borough", "Manhattan")).getDeletedCount();
/*
删除全部文档[返回删除数]:
db.getCollection("restaurants").deleteMany(new Document());

删除一个集合:

db.getCollection("restaurants").drop();
*/

}

/**
* 更新文档数据
*
* @param db
* @return
*/
private static long updateData(MongoDatabase db) {
return db.getCollection("restaurants").updateOne(
new Document("name", "Juni"),
new Document("$set", new Document("cuisine",
"American (Bew)")).append(
"$currentDate", new Document
("lastModified", true))).getModifiedCount();
/*
更新多条数据,使用下面的代码[返回更新条数]:

db.getCollection("restaurants").updateMany(new Document("address.zipcode", "10016").append("cuisine", "Other"),
new Document("$set", new Document("cuisine", "Category To Be Determined"))
.append("$currentDate", new Document("lastModified", true)));

替换使用下面的代码[替换会覆盖原有数据]:

db.getCollection("restaurants").replaceOne(
new Document("restaurant_id","41704620"),
new Document("address",new Document()
.append("street","2 Avenue")
.append("zipcode","1007")
.append("building","1480")
.append("coord",asList(-73.9557413,40.7720266))
.append("name","Vella 2"))
);

*/

}

/**
* 查询数据.
*
* @param db
*/
private static void findData(MongoDatabase db) {
FindIterable iterable = db.getCollection("restaurants").find(eq("borough", "Manhattan"));
//下面是其他查询方式.[这些方式都可以用new Document替代,但是这样写更加简洁.]
/*
db.getCollection("restaurants").find(eq("borough", "Manhattan"));
db.getCollection("restaurants").find(eq("address.zipcode", "10075"));
db.getCollection("restaurants").find(gt("grades.score", 30));
db.getCollection("restaurants").find(lt("grades.score", 10));
db.getCollection("restaurants").find(and(eq("cuisine", "Italian"), eq("address.zipcode", "10075")));
db.getCollection("restaurants").find(or(eq("cuisine", "Italian"), eq("address.zipcode", "10075")));
db.getCollection("restaurants").find().sort(ascending("borough", "address.zipcode"));
*/
iterable.forEach(new Block() {
@Override
public void apply(final Document document) {
System.out.println(document);
}
});
}

/**
* 通过db对象插入一个集合.
*
* @param db
*/
private static void insertData(MongoDatabase db) {
//插入一个文档.
db.getCollection("restaurants").insertOne(new Document("address"
, new Document().append("street", "2 Avenue")
.append("street", "2 Avenue")
.append("zipcode", "10075")
.append("building", "1480")
.append("coord", asList(-73.9557413, 40.7720266)))
.append("borough", "Manhattan")
.append("cuisine", "Italian")
.append("grades", asList(
new Document().append("date", "2014-10-01T00:00:00")
.append("grade", "A")
.append("score", "11"),
new Document().append("date", LocalDateTime.now().toString())
.append("grade", "B")
))
.append("name", "test").append("restaurant_id", "41704620"));

}
}

嗯,暂时就这些.如果有不明白的可以网上搜索一下MongoDB教程.

jQuery:文字滚动效果

是这样的

[源码来自网络,部分有修改]

友情链接太多了,展示的话太占地方了,所以也就只能想其它办法解决了……

于是,滚动信息的效果就出来了,具体效果可以查看本博边栏右侧下方的效果.(也可以看下面的图[gif,点击看动图]……)

jQuery文字滚动效果
image-2272

实现

实现效果很简单,最关键的就是css和jQuery的控制.参照下面的源码:







文字滚动


滚动示例

编号
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10




Java8:一行代码读写文件

方便

其实在Java1.7中就已经新增了java.nio包,但是用的太少了,直到今晚遇到一个读取文件的问题.才想起来,就找到了例子,下面的代码部分来自网络.

java
image-2269

较”复杂”版本


import java.io.*;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;

/**
* Created by puruidong on 2015/5/1.
*/

public class Entity {
public static void main(String[] args) throws IOException {
if (!Files.exists(Paths.get(".\\test.txt"))) Files.write(Paths.get(".\\test.txt"), new byte[0]);
if (!Files.exists(Paths.get(".\\newtest.txt"))) Files.write(Paths.get(".\\newtest.txt"), new byte[0]);
try (
FileInputStream fis = new FileInputStream(".\\test.txt");
FileOutputStream fos = new FileOutputStream(".\\newtest.txt");
) {
if (Files.readAllLines(Paths.get(".\\test.txt")).size() == 0) {
Files.write(Paths.get(".\\test.txt"), ("first write------" + System.currentTimeMillis()).getBytes());
}else{
//一行代码写入文件.
Files.write(Paths.get(".\\test.txt"), ("more write------" + System.currentTimeMillis()).getBytes());
}
int result = 0;
byte[] by = new byte[1024];
while ((result = fis.read(by)) != -1) {
fos.write((new String(by) + "---" + System.currentTimeMillis()).getBytes());
}
/*
* java 8 一行代码读取文件内容
*
1)文件可能很大,可能会超出内存空间,使用前要做评估。
2)要输出日志,记录为什么无法读取文件或者在阅读文件时遇到的任何错误。
3)在把字节转换成字符时,应该指定字符编码。
4)要处理文件不存在的情况。
还要注意,如果读入的文件的编码是ANSI编码,那么上面的例子在读取文件内容时会报java.nio.charset.MalformedInputException: Input length = 1错误。
*
*/
Files.readAllLines(Paths.get(".\\newtest.txt"), Charset.defaultCharset()).forEach(t -> System.out.println("newtest.txt:" + t));
}
}
}

更加”偷懒”的版本


import java.io.*;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;

/**
* Created by puruidong on 2015/5/1.
*/

public class Entity {
public static void main(String[] args) throws IOException {
//检查文件是否存在
if (!Files.exists(Paths.get(".\\test.txt"))) Files.write(Paths.get(".\\test.txt"), new byte[0]);
if (!Files.exists(Paths.get(".\\newtest.txt"))) Files.write(Paths.get(".\\newtest.txt"), new byte[0]);
//end.
if (Files.readAllLines(Paths.get(".\\test.txt")).size() == 0) {
Files.write(Paths.get(".\\test.txt"), ("first write------" + System.currentTimeMillis()).getBytes());
} else {
//一行代码写入文件.
Files.write(Paths.get(".\\test.txt"), ("more write------" + System.currentTimeMillis()).getBytes());
}
Files.write(Paths.get(".\\newtest.txt"), (Files.readAllLines(Paths.get(".\\test.txt"))));

/*
* java 8 一行代码读取文件内容
*
1)文件可能很大,可能会超出内存空间,使用前要做评估。
2)要输出日志,记录为什么无法读取文件或者在阅读文件时遇到的任何错误。
3)在把字节转换成字符时,应该指定字符编码。
4)要处理文件不存在的情况。
还要注意,如果读入的文件的编码是ANSI编码,那么上面的例子在读取文件内容时会报java.nio.charset.MalformedInputException: Input length = 1错误。
*
*/
Files.readAllLines(Paths.get(".\\newtest.txt"), Charset.defaultCharset()).forEach(t -> System.out.println("newtest.txt:" + t));
}
}

较为”舒适”的版本

下面这个是我自己觉得比较好的版本,虽然改进空间很大,但对于这个小程序来说,应该是足够了.


import java.io.*;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;

/**
* Created by puruidong on 2015/5/1.
*/

public class Entity {
public static void main(String[] args) throws IOException {
//检查文件是否存在
if (!Files.exists(Paths.get(".\\test.txt"))) write(".\\test.txt", new byte[0]);
if (!Files.exists(Paths.get(".\\newtest.txt"))) write(".\\newtest.txt", new byte[0]);
//end.
if (Files.readAllLines(Paths.get(".\\test.txt")).size() == 0) {
write(".\\test.txt", ("first write------" + System.currentTimeMillis()).getBytes());
} else {
//一行代码写入文件.
write(".\\test.txt", ("more write------" + System.currentTimeMillis()).getBytes());
}
write(".\\newtest.txt", (Files.readAllLines(Paths.get(".\\test.txt"))));
show(".\\newtest.txt");
}

//还有两个就懒得实现了,只是第二个参数不同

/**
* 一行代码写文件的封装.
*
* @param paths
* @param content
* @throws IOException
*/
private static void write(String paths, Iterable content) throws IOException {
Files.write(Paths.get(paths), content);
}

/**
* 一行代码写文件的封装
*
* @param paths
* @param content
* @throws IOException
*/
private static void write(String paths, byte[] content) throws IOException {
Files.write(Paths.get(paths), content);
}

/**
* 一行代码输出文件
*
* java 8 一行代码读取文件内容
*
1)文件可能很大,可能会超出内存空间,使用前要做评估。
2)要输出日志,记录为什么无法读取文件或者在阅读文件时遇到的任何错误。
3)在把字节转换成字符时,应该指定字符编码。
4)要处理文件不存在的情况。
还要注意,如果读入的文件的编码是ANSI编码,那么上面的例子在读取文件内容时会报java.nio.charset.MalformedInputException: Input length = 1错误。
*
* @param filepath
* @throws IOException
*/
private static void show(String filepath) throws IOException {
Files.readAllLines(Paths.get(filepath), Charset.defaultCharset()).forEach(t -> System.out.println(filepath + "------>#" + t));
}
}