drools 编程例子

关于 Drools 更多的介绍 可以参考之前的文章

这篇文章主要讲解如何在项目中执行 DRL 文件并取得结果。

ERROR

如果遇到这样的错误,大部分情况下是 drl 规则文件所在的文件夹,没有被项目识别为 resources 文件夹,在 IntelliJ IDE 中可以使用设置为资源文件夹来解决。

Exception in thread "main" java.lang.RuntimeException: Unable to get LastModified for ClasspathResource
    at org.drools.core.io.impl.ClassPathResource.getLastModified(ClassPathResource.java:212)
    at org.drools.core.io.impl.ClassPathResource.getInputStream(ClassPathResource.java:149)
    at org.drools.compiler.compiler.DrlParser.parse(DrlParser.java:154)
    at org.drools.compiler.compiler.DrlParser.parse(DrlParser.java:144)
    at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.drlToPackageDescr(KnowledgeBuilderImpl.java:541)
    at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.addPackageFromDrl(KnowledgeBuilderImpl.java:529)
    at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.addKnowledgeResource(KnowledgeBuilderImpl.java:753)
    at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:2296)
    at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:2285)
    at com.neo.drools.banking.RuleRunner.runRules(RuleRunner.java:32)
    at com.neo.drools.banking.BankingExample1.main(BankingExample1.java:10)
Caused by: java.io.FileNotFoundException: 'Example1.drl' cannot be opened because it does not exist
    at org.drools.core.io.impl.ClassPathResource.getURL(ClassPathResource.java:173)
    at org.drools.core.io.impl.ClassPathResource.getLastModified(ClassPathResource.java:185)
    ... 10 more

2019-04-26 drools , drl , jboss , java , rule-engine

The Silver Searcher: ag 使用

Once I wrote a post about ack-grep, and Franklin Yu left a comment about the silver searcher. He said this tool is much faster than the ack-grep. So this post is about The Silver Searcher. As always, I will introduce what is the Silver Searcher, how to install and use it.

Follow the link, we can see that author claim that this tool started off as a clone of ack, but then diverged slightly. And in most case, this tool is 5-10x faster then ack.

ag 是一个全文检索工具,非常适合查询大量文本文件,或者源代码的场景。

Installation

Find the download link at official site.

apt-get install silversearcher-ag

Usage

ag [file-type] [options] PATTERN [PATH]

As the man describe, recursively search for PATTERN in PATH.

Usage

Most options are similar to grep, like -i, -v, -B, -A etc

查询路径下的内容 Find text under a path

most use case will be find a keyword from a bunch of files. 最常用的一个方式便是在目录中搜索关键词,ag 能够非常快速的搜索文件内容,所以非常适合查询日志,或者代码等文本文件。

ag keyword /path/to/

Count the matches of keywords

ag -c keyword /path/

自定义查询深度

Default depth is 25, if you want unlimited, you should use -1

ag --depth NUM keyword .

查找包含关键字的文件名

If you forget the filename, but only remeber only few letters, you can use -g to print only filenames.

-g 选项表示查询文件名,而不会去查询文件内容。比如说想要查询目录下文件名中包含 Pattern 的文件名,那么可以使用:

ag -g PATTERN .

results will be only filenames. 这样结果就只会打印出符合的文件名。

打印出包含关键字的文件名

上面 -g 选项只会去查询文件名,那么如果想要查找内容中包含某个关键字的文件名,可以使用 -l 选项:

ag -l 'pattern' /path/to

使用 -L 会显示没有匹配的文件名

在特定的文件中查询

ag 提供了 -G 选项,可以用来缩小查询的范围,-G PATTERN 可以指定 Pattern,那么 ag 只会在 -G 指定的文件中查询,比如只查询 .+\.java.java 结尾的文件。

ag -G ".+\.java" "string to search" /path/to

For more details, you can check man ag

Drawback

用了一段时间,唯一发现的缺点就是想要搜索中文内容时,发现ag并不能很好的处理。

reference


2019-04-25 ack-grep , search , grep , ag

Maven 多仓库和镜像配置

之前看 Maven 书的时候对于 Maven 本地配置没有好好研究。这下闲下来从 GitHub 上拉了一个项目来,发现使用单一的 mirror 仓库无法找到一些 jboss 的依赖,所以想起来研究一下 Maven 多仓库和镜像相关的配置。

都知道在 $HOME/.m2/settings.xml 中配置了 Maven 在本地的全局配置,可能对于某些公司内网,已经配置了公司或者内部私有的镜像。但是如果遇到镜像的中央仓库部分依赖不存在的情况,其实就需要依赖外部的仓库。

使用单一仓库

可能对于大部分的公司来说,强制使用了内网提供的单一仓库,force maven 使用单一仓库,mirror 所有请求到单一仓库。这个时候就要求这个单一仓库需要包含所有需要的 artifacts,或者需要设置代理去请求其他仓库,否则 maven 可能找不到某些构建。要做到单一仓库,设置 mirrorOf*.

maven 2.0.5+ 以上版本支持:

<settings>
  ...
  <mirrors>
    <mirror>
      <id>internal-repository</id>
      <name>Maven Repository Manager running on repo.mycompany.com</name>
      <url>http://repo.mycompany.com/proxy</url>
      <mirrorOf>*</mirrorOf>
    </mirror>
  </mirrors>
  ...
</settings>

记住这里的 mirrorOf 中配置的星号 ,表示匹配所有的 artifacts,也就是 everything 使用这里的代理地址。这里的 mirrorOf 如果配置了具体的名字,指的是 repository 的名字,继续往下看。

multiple repository config

设置多仓库有两种方法,第一种直接在项目层级 POM 中定义:

<project>
...
  <repositories>
    <repository>
      <id>my-repo1</id>
      <name>your custom repo</name>
      <url>https://maven.aliyun.com/repository/public</url>
    </repository>
    <repository>
      <id>my-repo2</id>
      <name>your custom repo</name>
      <url>https://maven.aliyun.com/repository/public</url>
    </repository>
  </repositories>
...
</project>

这里的 id 就是 mirrorOf 要使用的 ID。

第二种方法是在 ~/.m2/settings.xml 文件中全局修改。

<settings>
 ...
 <profiles>
   ...
   <profile>
     <id>myprofile</id>
     <repositories>
       <repository>
         <id>my-repo2</id>
         <name>your custom repo</name>
         <url>https://maven.aliyun.com/repository/public</url>
       </repository>
       ...
     </repositories>
   </profile>
   ...
 </profiles>

 <activeProfiles>
   <activeProfile>myprofile</activeProfile>
 </activeProfiles>
 ...
</settings>

别忘了激活 profile,或者也可以使用 mvn 参数来指定:

mvn -Pmyprofile ...

这里提供一下 jboss 官方的配置

<profiles>
    <profile>
      <id>jboss</id>
      <repositories>
        <repository>
          <id>jboss-public-repository-group</id>
          <name>JBoss Public Maven Repository Group</name>
          <url>https://repository.jboss.org/nexus/content/groups/public-jboss/</url>
          <layout>default</layout>
          <releases>
            <enabled>true</enabled>
            <updatePolicy>never</updatePolicy>
          </releases>
          <snapshots>
            <enabled>true</enabled>
            <updatePolicy>never</updatePolicy>
          </snapshots>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <id>jboss-public-repository-group</id>
          <name>JBoss Public Maven Repository Group</name>
          <url>https://repository.jboss.org/nexus/content/groups/public-jboss/</url>
          <layout>default</layout>
          <releases>
            <enabled>true</enabled>
            <updatePolicy>never</updatePolicy>
          </releases>
          <snapshots>
            <enabled>true</enabled>
            <updatePolicy>never</updatePolicy>
          </snapshots>
        </pluginRepository>
      </pluginRepositories>
    </profile>
</profiles>

官方文档

设置镜像

设置镜像的作用是为了加快依赖包的下载速度,理论上来说如果一个仓库 B 可以提供仓库 A 所有的内容,那么可以认为 B 是 A 的一个镜像,比如说 阿里提供了很多仓库的镜像 使用这些镜像可以提高下载速度。

<mirror>
      <!-- 唯一标识一个 mirror -->
      <id>mirror</id>
	  <!-- 代表一个镜像的替代位置,例如 central 就表示代替官方的中央库 -->
      <mirrorOf>external:*,!repo</mirrorOf>
      <name>nexus repository</name>
      <url>https://maven.aliyun.com/repository/public</url>
</mirror>

配置说明:

  • id: 镜像的唯一标识
  • mirrorOf: 指定镜像规则,什么情况下从镜像仓库拉取,官方文档
    • *: 匹配所有,所有内容都从镜像拉取
    • external:*: 除了本地缓存的所有从镜像仓库拉取
    • repo,repo1: repo 或者 repo1 ,这里的 repo 指的仓库 ID
    • *,!repo1: 除了 repo1 的所有仓库
  • name: 名称描述
  • url: 地址

使用场景

Maven 设置中的 mirrorrepository 概念比较容易混淆,一般来说 repository 用来配置远程仓库的地址,mirror 则是作为中央仓库的镜像配置。

所以,当我的需求是,比如在内部远程仓库无法找到依赖时,从外部仓库中下载。那么我要做的就是配置多个 repository,那么当 maven 寻找依赖时就会按照配置的 repository 从上往下依次尝试下载。

<settings>
	<mirrors>
	</mirrors>
	<profiles>
		<profile>
			<id>aliyun</id>
			<repositories>
				<repository>
					<id>aliyun</id>
					<url>https://maven.aliyun.com/repository/public</url>
					<releases><enabled>true</enabled></releases>
					<snapshots><enabled>true</enabled></snapshots>
				</repository>
			</repositories>
			<pluginRepositories>
				<pluginRepository>
					<id>aliyun</id>
					<url>https://maven.aliyun.com/repository/public</url>
					<releases><enabled>true</enabled></releases>
					<snapshots><enabled>true</enabled></snapshots>
				</pluginRepository>
			</pluginRepositories>
		</profile>
		<profile>
			<id>nexus-163</id>
			<repositories>
				<repository>
					<id>nexus-163</id>
					<name>Nexus 163</name>
					<url>http://mirrors.163.com/maven/repository/maven-public/</url>
					<layout>default</layout>
					<snapshots>
						<enabled>false</enabled>
					</snapshots>
					<releases>
						<enabled>true</enabled>
					</releases>
				</repository>
			</repositories>
			<pluginRepositories>
				<pluginRepository>
					<id>nexus-163</id>
					<name>Nexus 163</name>
					<url>http://mirrors.163.com/maven/repository/maven-public/</url>
					<snapshots>
						<enabled>false</enabled>
					</snapshots>
					<releases>
						<enabled>true</enabled>
					</releases>
				</pluginRepository>
			</pluginRepositories>
		</profile>
		<profile>
		  <id>jboss</id>
		  <repositories>
			<repository>
			  <id>jboss-public-repository-group</id>
			  <name>JBoss Public Maven Repository Group</name>
			  <url>https://repository.jboss.org/nexus/content/groups/public-jboss/</url>
			  <layout>default</layout>
			  <releases>
				<enabled>true</enabled>
				<updatePolicy>never</updatePolicy>
			  </releases>
			  <snapshots>
				<enabled>true</enabled>
				<updatePolicy>never</updatePolicy>
			  </snapshots>
			</repository>
		  </repositories>
		  <pluginRepositories>
			<pluginRepository>
			  <id>jboss-public-repository-group</id>
			  <name>JBoss Public Maven Repository Group</name>
			  <url>https://repository.jboss.org/nexus/content/groups/public-jboss/</url>
			  <layout>default</layout>
			  <releases>
				<enabled>true</enabled>
				<updatePolicy>never</updatePolicy>
			  </releases>
			  <snapshots>
				<enabled>true</enabled>
				<updatePolicy>never</updatePolicy>
			  </snapshots>
			</pluginRepository>
		  </pluginRepositories>
		</profile>
	</profiles>
	<activeProfiles>
		<activeProfile>aliyun</activeProfile>
		<activeProfile>jboss</activeProfile>
	</activeProfiles>

	<servers>
		<server>
			<id>archiva.internal</id>
			<username>username</username>
			<password></password>
		</server>
		<server>
			<id>archiva.snapshots</id>
			<username>username</username>
			<password></password>
		</server>
	</servers>
</settings>

mirror 与 repository 不同的是,假如配置同一个 repository 多个 mirror 时,相互之间是备份关系,只有当仓库连不上时才会切换到另一个,而如果能连上但是找不到依赖时是不会尝试下一个 mirror 地址的。

reference


2019-04-23 maven , repository , build-tools , java

Asciidoctor Maven Plugin 使用

Asciidoctor Maven Plugin 这一款 maven 插件可以使用 Asciidoctor 将 AsciiDoc 文档转变成可读文档。

Setup

<plugins>
    <plugin>
        <groupId>org.asciidoctor</groupId>
        <artifactId>asciidoctor-maven-plugin</artifactId>
        <version>1.5.6</version>
        ...
    </plugin>
</plugins>

and

<plugin>
    ...
    <executions>
        <execution>
            <id>output-html</id>
            <phase>generate-resources</phase>
            <goals>
                <goal>process-asciidoc</goal>
            </goals>
        </execution>
    </executions>
</plugin>

reference


2019-04-23 maven , asciidoctor , maven-plugin

威联通折腾篇十二:verysync 微力同步

很早之前有一款文件同步工具叫做 BtSync,后来改名字叫做 Resilio Sync,但是因为他太强大可以用来干很多坏事,比如曝光政府秘密文件啦,传播盗版啦,所以早早的就封了。墙内几乎是变的不可用了,所以后来有人(不太清楚是谁)搞了这个微力同步,可以支持多平台同步文件,速度快,点对点传输,并且支持的平台非常多,桌面版,移动端自不必说,NAS,路由器甚至也可以安装。

所以今天就把威联通装上了这个微力同步,因为不太确定其安全问题,所以目前只用来同步一些别人分享的公开文件。个人也建议先观察观察,再考虑是否用来同步私人文件。

这里提供两个 KEY

这是微信猪之芥末共享的 50 G 图书

B2QZAM7HGAP75K7UC265OHJ7K3WNHUN2MV4CGRGFPGFO7PC2Z26ZT6D2AF

这是高岩老师的共享

B25OMSTPXPNOAX62RAYKADUPGSJXQYONWAEBGROTVR7HSHFISGYQ6DTTAW

其他有任何好的同步 KEY,记得告诉我呀,https://t.me/einverne

reference

  • https://mp.weixin.qq.com/s/cYc_U6ZlA5vLghAsp5CBGw

2019-04-20 qnap , qnap-tutorial , linux , qpkg , file , sync , verysync

网站推荐之 usesthis.com

在一篇效率工具的文章中偶然获知此网站,就像其网站写的标语那样:

A collection of nerdy interviews asking people from all walks of life what they use to get the job done.

这个网站的唯一作用就是采访很多不同工作的人,看看他们在日常生活中使用的不同工具。

在这个网站上可以看到不同种类的人,screen writer, designer, engineer, web developer etc,也可以看到他们使用的工具从 windows ,linux,到 macOS,各种硬件设备,软件工具也都大不相同。每个人的使用习惯也都各不相同。

看到这些不同工作的人使用不同的工具来在保存灵感,提高效率,而我们竟然还在用微信来聊工作,用 Excel 来安排时间,有的时候想想也是很可怜了。

虽然有的时候好的工具并不能够带来一定的效率提升,但是如果有一个合适自己的使用的工具就能够提升生活的幸福感。

更多的新内容就从那个网站获取吧。


2019-04-18 usesthis , software , hardware , skills , daily-life , workflow , work

PCloud 加密同步 --Dropbox 代替

Dropbox 学 Evernote 强行变更了用户条款,只允许免费用户只能够在三个设备同步文件 1。虽然在 2019 年 3 月以前 link 到账户的设备不受到任何影响,可以继续使用,但是如果一旦超过 3 台设备,在添加新设备时就不能添加。

所以就找到了这个 PCloud 的同步应用。他满足我之前对选择软件的所有要求

  • 跨平台,各个桌面版(Windows,macOS,Linux),Web 版,移动端 (iOS,Android)
  • 可分享
  • 支持多人协作

更甚至有一些功能超出了我的想象,比如:

  • 在桌面版中使用 virtual hard drive,可以从计算机本地任意一个文件夹同步文件,而不需要像 Dropbox 一样只能够存放到一个文件夹中
  • 使用加密技术,在客户端加密文件,即使上传同步,即使文件泄露别人也无法获取同步的真正文件 2
  • 使用 Upload links 可以从朋友那边接收文件,即使他们没有 pCloud 账户
  • 下载文件使用密码保护,当然这其实是比较基础的功能
  • 使用 Chrome Extention 直接添加文件到 PCloud

pCloud 的免费用户,初始有 4G 空间,可以通过邀请 解锁最多 10 G 空间。至于在速度上,因为我大部分时间都是同步很小的文件,对速度要求不是那么高,而追求的是同步的稳定性,在一台电脑上拉进文件夹的内容,等我到家打开电脑,能够稳定的同步过来就已经满足了我的绝大部分需求。pCloud 的服务器明显没有在中国,上传和下载的速度也不是非常理想,但还能接受。3

  1. https://help.dropbox.com/account/computer-limit 

  2. https://my.pcloud.com/#page=register&invite=VKXvZKvEM17 

  3. https://my.pcloud.com/#page=register&invite=VKXvZKvEM17 


2019-04-16 pcloud , dropbox

每天学习一个命令:sort 排序

sort 命令用来对文件行进行排序,常用的一些参数

  • -n 表示数字序号
  • -r 表示逆序
  • -k, 表示根据第几列
  • -t, 表示字段与字段之间的分隔符

使用

按第三列排序

sort -nk3 /path/to/file

解释:

  • -n 表示的是按照字母序排
  • -k3 表示第三列

按列优先级排序

比如有一行数据包含多列,需要按照第一列排序,然后按照第三列排序

1  a  2
3  b  5
1  c  4
2  d  2
3  e  1

期望的结果是按照第一列先排序,然后第三列排序

1  a  2
1  c  4
2  d  2
3  e  1
3  b  5

那么可以使用命令

sort -n -k1,1 -k3,3 /path/to/file

严格意义来说,-k3 表示的是从第三个字段开始到行尾。

使用自定义分隔符

sort -t: -nk3 /etc/passwd
sort -t' ' -k3,3 file

-t 后面接 : 表示以 : 来分割列,最常见的比如 /etc/passwd 文件,以 : 来区分一行中的各个列

合并两个文件并且移除重复行

一个典型的 sort 应用场景

sort file1 file2 | uniq

排序日志中耗时最大的行

假设有日志

2020-02-02 11:20:20 requestId method=someGet param=param cost=100
2020-02-02 11:20:21 requestId1 method=someGet param=param cost=101
2020-02-02 11:20:22 requestId2 method=someGet param=param cost=103

现在要过滤出其中耗时最大的行,可以使用

sort -r -nk4 -t= log.txt

解释:

  • -t= split lines by =,so the string to sort is column 4
  • -k4 sort column 4
  • -n numberic order
  • -r reverse order

From: https://stackoverflow.com/q/62493937/1820217


2019-04-10 linux , sort , command

MySQL 中索引相关 SQL 语句

索引是用来加快从数据库中查询数据的速度的。

需要注意的是索引的使用会增加插入和更新的时间,因为在插入数据的同时也会更新索引。所以在创建索引时确保只在那些频繁作为查询条件的列中增加。

创建索引

创建索引时有几个需要注意的点:

  • 不要在频繁写,而读取频率较低的表上使用索引,和之前说的那样,索引提高了读速度,而损耗了写速度
  • 不要在 low cardinality 的列上使用索引,Cardinality 直接翻译是基数,可以理解成为这一列取值的散列程度,如果一个列包含的值只有少数几个,那么索引的效果也无法达到
  • 不要在固定大小的表上使用索引,小数量集的表增加索引并不会带来多大的性能提升,所以尤其需要注意的是那些可能随着时间数据量增长很快的表,比如 users

在建表时

CREATE INDEX idx_name ON table_name(column1, column2);

ALTER TABLE `table_name` ADD INDEX idx_name (`column1`);

创建唯一索引

ALTER TABLE `table_name` ADD UNIQUE uni_name (`column1`)

显示查看索引

查看表索引

SHOW INDEX FROM table_name;

在查询的结果中可以看到索引的名字,列名,散列程度(Cardinality),索引类型(BTREE) 等等。

查询 Schema 中所有的索引

SELECT DISTINCT
    TABLE_NAME,
    INDEX_NAME
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'your_schema';

删除索引

DROP INDEX idx_name ON table_name;

ALTER TABLE table_name DROP INDEX idx_name;

Single index vs Composite index

组合索引和单一索引一样,不过组合索引是需要组合多列。

假设有用户表 users

ID | first_name | last_name    | class      | position |
--------------------------------------------------------
 1 | Teemo      | Shroomer     | Specialist | Top      |
 2 | Cecil      | Heimerdinger | Specialist | Mid      |
 3 | Annie      | Hastur       | Mage       | Mid      |
 4 | Fiora      | Laurent      | Slayer     | Top      |
 5 | Garen      | Crownguard   | Fighter    | Top      |

然后在 classposition 列上创建组合索引

CREATE INDEX class_pos_index ON users (class, position);

然后数据库会创建一个组合索引的排序,类似:

class-position       Primary Key
--------------------------------
AssassinMid       -> 10
ControllerSupport -> 16
ControllerSupport -> 18
ControllerSupport -> 8
FigherTop         -> 7
FigherTop         -> 9
FighterJungle     -> 13
FighterJungle     -> 21
FighterJungle     -> 23

假设需要查询班级中的 Top,那么会提升速度:

SELECT * FROM users
WHERE
  class = 'Specialist'
AND
  position = 'Top';

因为按照了 class-position 来排序,所以查询速度得到了提升。数据库能够在 O(log_2(n)) 时间内查找到 Specialist-Top 而不需要读取全表。

需要注意的是即使查询条件只有 class 字段,组合索引依然能够提升速度,因为class 在组合索引的第一个位置。

但是单纯的查询 position

SELECT * FROM users WHERE position = 'Top';

则享受不到组合索引带来的好处。所以组合索引的列顺序非常关键。

创建组合索引的一些注意点:

  • 如果特定列固定的出现在查询条件中,那么对这些列创建组合索引比较好
  • 如果要创建 field1 上的索引,也要创建 (field1, field2) 上的索引,那么只创建一个组合索引 (field1, field2) 已经足够
  • 和 Single indexes 一样,组合索引的 Cardinality 一样重要。显然当两个 field 有高的 Cardinality,组合索引的 Cardinality 也会很高。但是某一些情况下低 Cardinality 的列也会有高的 Cardinality 组合索引

reference


2019-04-02 mysql , sql , index , query

再也不见 Google+

今天久违地登录上 Google+,终于在 2019 年 4 月 2 号,Google+ 就要全站关闭了,可是我依然还记得当年到处找邀请码,为 Google+ 的每一次新功能发布而欣喜若狂。然而我知道我自己也已经很久很久没有主动登录 G+ 了,原本每一次换系统,在手机首屏的 G+ 应用,也在得知 G+ 要关闭的当天就卸载,并且自此之后再没有发布任何更新,或许 Google+ 的死亡是一个漫长的过程,慢慢的,像癌症一样,步入死亡。我也不曾意识到,从某一个时刻开始就不曾频繁登录,但也渐渐的发现我关注的好友再也不来,就这样一个恶性循环之后,慢慢的就没有了平台的价值。

google plus shut down

Social

很多人说 Google+ 是 social,而对于我来说,Google+ 是一个信息发布渠道,是我订阅的信息来源。自 Google Reader 关闭之后,Google+ 是我的一个重要信息来源,虽然这里的人大部分都陌生人,但却因为一些纯粹的原因聚集到一起,我们讨论共同的话题,分享最新的科技资讯,可以说 Google+ 开启了我人生的新一面,伴随着我从学校,到毕业,到社会,让我从被动的汲取知识,到主动获取信息。Google 的使用非常亲民,能够对感兴趣的内容进行很多的讨论,不管是 Google 的产品还是最新的动态,或者是哪里的美景,用起来都非常舒服。

两篇怀念

mourn1

mourn2

功能

现在回过头来想当时 Google+ 发布的盛况,几乎每一个功能都能够独立作为一个产品,并且可以秒杀同类的产品。

好友关注

当时最引人瞩目的一个功能就是”圈子“,这个小小的功能,可以让用户单方面将一些人圈入圈子,而不想当时的 Facebook 一样需要对方同意为好友,也不像 Twitter 一直只能够单方面的关注而不能对关注的人分类。虽然推出轰轰烈烈,当却在后续的产品迭代中逐渐淡化了该功能,而如今站在 2019 年来看,这个功能被 Facebook 学习去了。

图片视频分享

比如图片分享,无损,原图,用户可以极好的控制照片分享的权限,公开,给自己的关注着,或者独立分享给一个圈子。这样的需求几乎满足了照片分享的方方面面,摄影师可以公开分享自己的高清原图,普通用户可以给自己的关注着发发自己的私人照片,也就是那个时候的”朋友圈“,而甚至家人的旅行照片,可以单独的分享给自己的家人圈子。我几乎找不到任何独立的代替品能够满足这些需求。更甚至你不需要为这些高清图片的存储付出任何代价,在 16MP 分辨率一下的图片完全不占用空间,而那时候的手机分辨率都还没有达到那么高。所以我也曾经关注过 Trey Ratcliff 这样的摄影师。

不知道多少人还记得 Google+ Photos 的在线编辑工具,记住这里是 Google+ Photos 而不是现在的 Google Photos,曾经的网页图片编辑工具是那么好用,就如一个在线的 Photoshop,这可是 Google+ 团队收购了专业滤镜团队 Nik Collection 之后发布的重要更新,可惜后来的更新中竟然失去了影踪。

视频聊天

说道视频聊天,很多人就会想起 Hangout,这个捆绑在 Google+ 中一同发布的聊天工具,不仅包含多人视频功能,也能够发送文字,表情,就是一个独立的 IM 服务,继承 Gtalk,能够在网页中,客户端,Gmail 等等端无痛接入,却在多年之后被 Facebook Message, Zoom 之类狠狠的甩在身后,无限唏嘘。

或许还有人曾记得 Hangout Air,在 Hangout 普通的多人视频聊天的功能上,能够实时直播自己的内容,公开的,向全世界的。这个功能甚至被 Obama 总统和教皇 Francis 使用过。但是这个功能只能在桌面端使用,当移动端视频直播的狂潮来过之后,Google 又错过了。1

评论

依稀记得 Google+ 强制安插到 YouTube, Blogger 等等平台中的情形,在 YouTube 中发布评论并分享,原本是一件很不错的,却因为 Google Push 太激进使得平台和用户都遭受了巨大损失。可惜。

Map

如果有一天在使用 Google Map 搜索一个地方的时候,发现朋友的一个好评餐厅,你是否会顺道去品尝一下,虽然 Google+ 曾经的产品中确实有点评的功能,却无奈无法继续推动。

Event

多少人还记得 Google+ 的 Event,当年和 Google Calendar 结合是多好的组织活动聚会的工具,多少次 Ingress 线下聚会通过 Event 来举办。可以对限定的圈子,或者全部关注着发布活动邀请,想要参加的人可以点击参加,那么活动的时间和地点会自动插入到参与者的 Google Calendar 中,又可惜了一个聚会神器。

想象一下没有广告的社交网络,想象一下每一个普通人都能平等交流的网站,想象一下通过同一个兴趣聚集到一起能够进行充分无障碍交流的地方,想象一下没有被算法过滤过的信息流,想象一下摄影师分享高清无损图片的社交网络,想象一下通过线上延伸到线下,真实的友谊的网络。曾经出现过,而如今却要惋惜他的消失。

期待

或许我们期待 Google+ 关闭之后,就像 Google Reader 关闭之后,源源不断的创新者涌现出来,InoReader 作为绝佳的代替品已经成为了我必备的应用,然而截至目前为止我依然还没有找到一个合适的 Google+ 代替品,FB 早已删除了所有资料,Twitter 始终无法习惯他的评论,而新出现的 Mastodon 倒是可以关注一下,分布式部署,各个节点之间也能够通信,夸张关注,甚至可以自定义 UI。而 Reddit 倒只像是论坛,Telegram 吧只是一个 IM,band.us 体验了一下觉得也不是个事。反正暂时先用回 豆瓣 好了,等找到合适的再说吧。

reference

  1. https://youtu.be/edk2ZcW2GnQ 


2019-03-30 google , google-plus , google-reader , social

电子书

最近文章

  • 读书是否是唯一重要的事? 不久之前和朋友约去了趟植物园,聊起读书是否是第一要务的时候产生了一些分歧,关于是否要去学习如何学习这一件事情产生了一些分歧。我站在的立场是读书是必须的,而我朋友则认为在有限的时间里面实践要优先于读书。而关于要不要学习如何学习这一件事情,他仍然坚持自己的实践而非去了解如何学习。
  • Android 上的 RIME 输入法 trime 同文输入法使用 早之前就已经在 Linux 和 macOS 上配置了 RIME 并且一直使用到现在,但是在主力的 Android 上从最早的触宝输入法,后来切换成 Gboard,日常使用倒是没什么大问题,就是有一些词总是需要翻页才能找到,这让我非常不爽,就想手机上能不能用 RIME,于是就有了这篇水文。
  • Obsidian 使用篇一:使用 markdown-clipper 全文保存网页 之前使用整理 Evernote 代替品 的时候就提出了我自己的一个需求,就是有一个完善的 Web Clip 系统,Evernote 和 WizNote 都做的比较不错。但 Obsidian 并没有提供类似的工具,不过幸好 Obsidian 使用 Markdown 来管理文档,这样的开放程度使得我可以寻找一个将网页变为 Markdown 的浏览器扩展就能做到。
  • 使用了半年 macOS 之后 我又回到了 Linux 的怀抱 我在使用了半年 macOS 之后,又回到了 Linux 的怀抱,虽然 macOS 有其自身的优势,我也不否认 macOS 系统上软件生态的友好,但我发现即使我将日常开发主力机器装回到 Linux,也没有丧失操作系统的便捷性和易用性。这或许和我下意识的只使用跨平台的软件有关,并且最长使用的软件几乎都是一套快捷键。
  • 重置 macOS S.M.C 和 NVRAM 今天用得好好的电脑突然三次黑屏,两次发生在早上刚刚使用的时候,一次发生在晚上回家之后。所以一怒之下就直接上官网联系了 Apple Support,但是也不知道是不是我直接登录的 .com 网站,在我提交了 Support 之后一分钟一个外国小哥打了电话过来,我一下子没反应过来,只能用着不那么熟练的英语开始了 macOS 修复之路。