葡京在线开户君也许连无绝理解Kindle

文/直树桑  

OkHttp系列文章如下

You know nothing about Kindle

  • OkHttp3源码分析[综述]
  • OkHttp3源码分析[复用连接池]
  • OkHttp3源码分析[缓存策略]
  • OkHttp3源码分析[DiskLruCache]
  • OkHttp3源码分析[职责队列]


=====

1. 概述

HTTP中的keepalive连接当网络性优化中,对于延迟降低和速提升的出不行主要之来意。

常见咱们开展http连接时,首先进行tcp握手,然后传输数据,最后放

图源: Nginx closed

这种艺术确实简单,但是当错综复杂的大网内容中即不够用了,创建socket需要开展3不良握手,而自由socket需要2次握手(或者是4不善)。重复的总是和自由tcp连接就如每次只挤1mm的牙膏就一路上牙膏盖子接着再打开就挤一样。而每次连续大概是TTL一不成的流年(也便是ping一次于),在TLS环境下消耗的岁月便又多矣。很扎眼,当访问复杂网络时,延时(而无是带宽)将化好主要之元素。

理所当然,上面的题材早已经解决了,在http中出平等栽名叫keepalive connections的机制,它好在传输数据后仍保持连续,当客户端需要重新获取数据时,直接行使刚刚空下来的连续而未待再握手

图源: Nginx keep_alive

每当现代浏览器被,一般以开6~8只keepalive connections的socket连接,并维持得之链路生命,当不欲经常重关闭;而当服务器受到,一般是由软件根据负荷情况(比如FD最要命价值、Socket内存、超时时间、栈内存、栈数量等)决定是否再接再厉关闭。

Okhttp支持5单连作KeepAlive,默认链路生命啊5分钟(链路空闲后,保持现有的年月)

自keepalive也有弱点,在增进了单个客户端性能的又,复用却遮了另客户端的链路速度,具体来说如下

  1. 因TCP的死机制,当总水管大小固定时,如果是大气悠然之keepalive connections(我们好称作僵尸连接或者泄漏连接),其它客户端们的正规连接速度也会见受震慑,这吗是营业商为何限制P2P一连数的道理
  2. 服务器/防火墙上有出现限制,比如apache服务器对每个请求都起线程,导致只支持150独冒出连接(数据来自nginx官网),不过者瓶颈随着高并发server软硬件的前进(golang/分布式/IO多路复用)将会见越来越少
  3. 大气底DDOS产生的僵尸连接可能给用来恶意抨击服务器,耗尽资源

好了,以上大了,本文主要是写客户端的,服务端不再介绍。

下文假设服务器是由此专业的运维配置好的,它默认开启了keep-alive,并无主动关闭连接

“写在前方”

昨天在温馨正打的众生号拾书小记(ID:shishuxiaoji)发了第一首推文,也就算是即时篇《你也许连无顶了解Kindle》,结果刷爆了朋友围,一龙多的年华便直达100000+的翻阅,收到不少网友的感谢信息,很开心好写的物能被热爱阅读的意中人带正面的影响。

除此以外,在编写推文过程遭到深刻体会到了编辑器带来的赘,相比微信公众平台,简书显得融洽很多,重点在于迅猛与针对文的小心。那么,开始看正文吧☟

点Kindle也发生接近两年时了,从点它的首先上从,出门就基本没有掉过它。在本人眼里,它是朋友、是教员、是诤友,我异常享受这种感觉。我特别已经想冲当前Kindle普及文章于少的范围,去写一篇脉络相对较清楚的关于如何适度使用Kindle进行中阅读之文章。如你所表现,这篇稿子是聚众Kindle的广泛、入门、进阶的综合分享,算是补单身汪们的一个情人节福利吧,以下是内容脑图:

2. 连接池的施用及分析

先是先说生源码中要的对象:

  • Call: 对http的求封装,属于程序员能够接触的上层高级代码
  • Connection:
    对jdk的socket物理连接的包,它里面有List<WeakReference<StreamAllocation>>的引用
  • StreamAllocation: 表示Connection深受上层高级代码的援次数
  • ConnectionPool:
    Socket连接池,对连日缓存进行回收和治本,与CommonPool有像样的规划
  • Deque:
    Deque也不怕是双端队列,双端队列同时有行和库房性质,经常于缓存中让运用,这个是java基础

当okhttp中,连接池对用户,甚至开发者都是透明底。它自动创建连接池,自动进行泄漏连接回收,自动帮助您管理线程池,提供了put/get/clear的接口,甚至里头调用都帮衬你勾勒好了。

以以前的内存泄露分析文章遇自我勾勒到,我们清楚当socket连接着,也就是Connection饱受,本质是包装好之流操作,除非手动close丢掉连接,基本未见面吃GC掉,非常容易引发内存泄露。所以当提到到连发socket编程时,我们虽会很忐忑,往往写出来的代码都是try/catch/finally的迷之缩进,却以针对如此的代码无可奈何。

在okhttp中,在高层代码的调用中,使用了近似于援计数的艺术跟Socket流的调用,这里的计数对象是StreamAllocation,它叫频繁实践aquirerelease操作(点击函数可以上github查看),这有限个函数其实是在转Connection中的List<WeakReference<StreamAllocation>>大小。List中Allocation的数据也就是是情理socket被引用的计数(Refference
Count),如果计数为0的言语,说明是连续没有让运用,是悠闲的,需要经过下文的算法实现回收;如果上层代码仍然引用,就非需关闭连接。

引用计数法:给目标吃补充加一个援计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的目标就是是匪可能再度于运。它不能够处理循环引用的题目。

“什么样的人数抱Kindle”

2.1. 实例化

每当源码中,我们先找ConnectionPool实例化的位置,它是直new出来的,而它的各种操作也于OkHttpClient的static区实现了Internal.instance接口作为ConnectionPool的包装。

关于为什么用这样多是一举的分包装,主要是为为外部包之成员访问非public方式,详见此注释

❶ 想专注阅读的口

世界上闹啊习惯的人数,就发生什么样的活。喜欢专注娱乐之人头出了Ipad,喜欢专注游戏的人发生矣Psp,而喜专注阅读的口便生了Kindle。Kindle作为专注阅读之未二利器,是时同类产品所不可比肩的。

2.2. 构造

  1. 连接池内部维护了一个叫作OkHttp ConnectionPoolThreadPool,专门用来淘汰末位的socket,当满足以下条件时,就会展开末位淘汰,非常像GC

    1. 并发socket空闲连接超过5个
    2. 某个socket的keepalive时间大于5分钟
    
  2. 保护在一个Deque<Connection>,提供get/put/remove等数据结构的功能

  3. 护在一个RouteDatabase,它因此来记录连接失败的Route的不法名单,当连接失败的早晚便会见拿黄的路线加进去(本文不讨论)

❷ 经常出差、旅行的食指

出差、旅行必备坐火车、灰机的观,这时候Kindle用处就杀了。
从南部以到北部,看了一如约50W字的修问题不特别。

2.3 put/get操作

以一连池中,提供如下的操作,这里可以当作是对deque的一个简练的包

//从连接池中获取
get
//放入连接池
put
//线程变成空闲,并调用清理线程池
connectionBecameIdle
//关闭所有连接
evictAll

乘上述操作让重复高级的目标调用,Connection中的StreamAllocation于持续的aquirerelease,也就是List<WeakReference<StreamAllocation>>的大小将时刻变化

❸ 有语言上诉求的食指

任是英语、日语、法语亦或文言文,在kindle里而都可查找到相应的指谱词典,
内置的不敷足错过相关网站下载,下文中见面有详细介绍。

2.4 Connection自动回收的贯彻

java内部发生破烂回收GC,okhttp有socket的回收;垃圾回收是冲目标的援树实现之,而okhttp是根据RealConnection的虚引用StreamAllocation引用计数是否为0实现之。我们事先看代码

cleanupRunnable:

当用户socket连接成,向连池中put新的socket时,回收函数会让主动调用,线程池就会见履cleanupRunnable,如下

//Socket清理的Runnable,每当put操作时,就会被主动调用
//注意put操作是在网络线程
//而Socket清理是在`OkHttp ConnectionPool`线程池中调用
while (true) {
  //执行清理并返回下场需要清理的时间
  long waitNanos = cleanup(System.nanoTime());
  if (waitNanos == -1) return;
  if (waitNanos > 0) {
    synchronized (ConnectionPool.this) {
      try {
        //在timeout内释放锁与时间片
        ConnectionPool.this.wait(TimeUnit.NANOSECONDS.toMillis(waitNanos));
      } catch (InterruptedException ignored) {
      }
    }
  }
}

这段死循环实际上是一个死的清理任务,首先进行清理(clean),并回下次要清理的间隔时间,然后调用wait(timeout)拓展等待以释放锁和时间片,当等时及了后,再次展开清理,并回下次使理清的间隔时间…

Cleanup:

cleanup行使了类似于GC的标记-清除算法,也就算是首先标记出最不欢的连接(我们得称泄漏连接,或者空闲连接),接着进行割除,流程如下:

long cleanup(long now) {
  int inUseConnectionCount = 0;
  int idleConnectionCount = 0;
  RealConnection longestIdleConnection = null;
  long longestIdleDurationNs = Long.MIN_VALUE;

  //遍历`Deque`中所有的`RealConnection`,标记泄漏的连接
  synchronized (this) {
    for (RealConnection connection : connections) {
      // 查询此连接内部StreamAllocation的引用数量
      if (pruneAndGetAllocationCount(connection, now) > 0) {
        inUseConnectionCount++;
        continue;
      }

      idleConnectionCount++;

      //选择排序法,标记出空闲连接
      long idleDurationNs = now - connection.idleAtNanos;
      if (idleDurationNs > longestIdleDurationNs) {
        longestIdleDurationNs = idleDurationNs;
        longestIdleConnection = connection;
      }
    }

    if (longestIdleDurationNs >= this.keepAliveDurationNs
        || idleConnectionCount > this.maxIdleConnections) {
      //如果(`空闲socket连接超过5个`
      //且`keepalive时间大于5分钟`)
      //就将此泄漏连接从`Deque`中移除
      connections.remove(longestIdleConnection);
    } else if (idleConnectionCount > 0) {
      //返回此连接即将到期的时间,供下次清理
      //这里依据是在上文`connectionBecameIdle`中设定的计时
      return keepAliveDurationNs - longestIdleDurationNs;
    } else if (inUseConnectionCount > 0) {
      //全部都是活跃的连接,5分钟后再次清理
      return keepAliveDurationNs;
    } else {
      //没有任何连接,跳出循环
      cleanupRunning = false;
      return -1;
    }
  }

  //关闭连接,返回`0`,也就是立刻再次清理
  closeQuietly(longestIdleConnection.socket());
  return 0;
}

太长不思量看的话语,就是之类的流程:

  1. 遍历Deque遭受颇具的RealConnection,标记泄漏的总是
  2. 假使让标记的接连满足(空闲socket连接超过5个&&keepalive时间大于5分钟),就用之连续起Deque受移除,并关闭连接,返回0,也便是即将执行wait(0),提醒这还扫描
  3. 如果(目前还可以塞得下5个连接,但是有可能泄漏的连接(即空闲时间即将达到5分钟)),就回来此连续即将到之剩余时间,供下次清理
  4. 如果(全部都是活跃的连接),就回默认的keep-alive日子,也就是5分钟后再行实践清理
  5. 如果(没有任何连接),就返回-1,跳出清理的死循环

重复注意:这里的“并作”==(“空闲”+“活跃”)==5,而不是说并作连接就势必是活跃的连续

pruneAndGetAllocationCount:

怎么样标记并找到最好无欢的连天为,这里用了pruneAndGetAllocationCount的方法,它至关重要依据弱引用是否为null倘若判断这连续是否泄漏

//类似于引用计数法,如果引用全部为空,返回立刻清理
private int pruneAndGetAllocationCount(RealConnection connection, long now) {
  //虚引用列表
  List<Reference<StreamAllocation>> references = connection.allocations;
  //遍历弱引用列表
  for (int i = 0; i < references.size(); ) {
    Reference<StreamAllocation> reference = references.get(i);
    //如果正在被使用,跳过,接着循环
    //是否置空是在上文`connectionBecameIdle`的`release`控制的
    if (reference.get() != null) {
      //非常明显的引用计数
      i++;
      continue;
    }

    //否则移除引用
    references.remove(i);
    connection.noNewStreams = true;

    //如果所有分配的流均没了,标记为已经距离现在空闲了5分钟
    if (references.isEmpty()) {
      connection.idleAtNanos = now - keepAliveDurationNs;
      return 0;
    }
  }

  return references.size();
}
  1. 遍历RealConnection连日来着的StreamAllocationList,它保护着一个凋谢引用列表
  2. 查看此StreamAllocation是否也空(它是在线程池的put/remove手动控制的),如果也空,说明已经远非代码引用这目标了,需要以List中除去
  3. 遍历结束,如果List中保障的StreamAllocation删空了,就返回0,表示这连续已没代码引用了,是泄漏的连接;否则回非0的值,表示这还是让引述,是活跃的连年。

上述实现之超负荷保守,实际上用filter就可大概实现,伪代码如下

return references.stream().filter(reference -> {
    return !reference.get() == null;
}).count();

❹ 经常因为公交、地铁的人口

就点于北上广深的情侣约体会会深一点,因为房租要不得不终止得多之你,在漫漫上班的长河简直难受,然而有矣Kindle,那简直biu一下即使到站了。笔者曾住在深圳宝安西乡,要错过南山科技园上班需大丰富之路途,经常就通过Kindle来计划时,基本几天不怕能看下一样本书,碎片化时间的施用简直不用太好。

总结

通过上面的辨析,我们得以总结,okhttp使用了看似于引用计数法与标记擦除法的夹使用,当连接空闲或者释放时,StreamAllocation的数码会慢慢变成0,从而被线程池监测到连回收,这样尽管好维持多只健康之keep-alive连接,Okhttp的不法科技就是这般实现之。

末尾推荐一仍《图解HTTP》,日本口形容的,看起格外科学。

再也引进阅读开源Redis客户端Jedis的源码,可以拘留下其的JedisFactory的实现。

假使你要又多高质量之稿子,不妨关注我要点赞吧!

❺ 电子书深度用户

稍微朋友一直是电子书的深浅用户,但是却想念维护眼睛,有措施为?有!Ink屏的Kindle帮你闹定一切。此处需要注意一下,像Kindle
fire之类产品是无Ink屏而是Ips屏的,购买时须注意。

Ref

  1. https://www.nginx.com/blog/http-keepalives-and-web-performance/

❻ 有长期看规划之人

产生雷同近似人,Ta们熟悉GTD之道,知道自己要什么,有在比明晰的统筹,在Ta们的头脑里,这同年如拘留之写都曾经排下了,缺的即是一个看器能把它们都作上。想如果既看钱而省空间,还爱整理汇总和总结,是否发生办法?答案:有,Kindle配合Kindle
Mate的铺垫了可搞定。

❼ 经常无聊而未知道开啊的食指

设您时常呆又无晓开呀,那么告诉您,kindle绝壁是公消灭时间之好工具,看看东野圭吾的小说、看看金田同底卡通,一上速即过去了,并且还能增进见识,何乐而休也也!

=

“关于书籍来源”

经筛选知乎、微信、微博、豆瓣、简书等平台的赛质量信息后,我将最好干的网站总结后分享出来让大家,继续于下看☟

亚马逊

官方网站,就甭说了,不短米的立将钱冲上,5G云储存于你日渐享受,买了底开而没有以云端上删除,都可以重新下载的,灵活度非常高,当然亚马逊也生经常开限免以及免费之图书,多多关注就哼,直送链接:http://www.amazon.cn

Readfar

读远是一律迟迟好有心情的网站,是一个喜爱《瓦尔登湖》的学习者给2013年支出出的,那时候他刚好于日亚请了单KPW,出于对那种生活之景仰,他控制好看看书,然后还要休满足于时电子书相关网站的成色,于是自己写了一个,这个行动力简直令人感动。

读远简单的主界面


直送链接:http://readcolor.com

Library genesis

Library
Genesis是一个所有100差不多万本图书为您轻易下载的网站(其中99%凡是科学著作且难以打至),它的数据库约来10TB之多,有矣此网站为主还为不用失去淘宝代购英文书籍了,这本《The
Big Book Of Vice》就是作者恰恰下载的,而图2为亚马逊对应之购买页。

作者恰恰下载的《The Big Book of Vice》,119.6MB

亚马逊进口书之《The Big Book of Vice》


直送链接:http://gen.lib.rus.ec

Gutenberg

维基古腾堡计划,这是一个开之资源共享计划,10万不必要册线上藏书可以下载。有人就一口气生了王尔德的狱中记、雷丁监狱的唱还有剧本无数。下图是笔者测试王尔德的抱,第一不成搜索会在左显示匹配作者,然后选择了作者还会见生出现实的归类选择,从查找到下载好惠及。

要词Wilde搜索并选择Oscar后底界面

下载《The Soul Of Man》并开拓的截图


直送链接:http://www.gutenberg.org

“一些入门玩法”

主导技巧

>>>>邮箱传书

这个技能是必不可少技能哈,你若生吗mobi、pdf格式的开纪念放在kindle上看的讲话,可以通过就致使来转化为kindle的格式azw3。具体方法如下图1,图2是本主进行测试时做的格式校验对比图,测试书籍为池建强先生的《Mactalk·人生第一编程》。

贪图1 邮箱传书流程图

图2 Convert转化前后的格式对比

>>>>磁盘传书

夫方式极其简单易行实用,为快速通道,没有通过云端。也就是说,资料传之后是匪会见现出云端5G里面的,这样的话就无便民误删后底二度下载了,建议慎用,具体操作如下:

磁盘传书流程图

>>>>公众号传书

信任大家还来听罢公众号可以传书吧,其实不管是亚马逊官网还是暗都是发连锁的群众号平台给予技术支持的,我当时边就每罗列几独依靠谱的,首先是亚马逊Kindle服务号,微信号:cn_kindle,这是Kindle的官微信之一,当您绑定了您的Kindle账号后,以后如遇到好章,然后顺手点击右侧上斗的点点点,你晤面发现可一直推送至Kindle里,相同的章程在象为可以兑现哈,具体而参照下图:

民众号传书简图

继还介绍两独非官网的群众号被大家,第一个是Kindle电子书库,微信号:Kindle10000;第二单凡是Kindle杂志公社,微信号:Mag10000。大家要关注后即便有针对性诺提示进行连续操作就得了,十分简单易行快速。

另技术

>>>>Kindle词典的下载

Kindlefere,这个网站内部有一个专程的kindle 字典的下载页面。同时对
kindle 字典怎么用?如何向 kindle 添加字典?kindle
字典安装步骤是哪些的?这好像问题,这个页面都做出了恰当的答案。另外Kindlefere还于不断的收集增加各种罕见的字典资源,如
Kindle 古汉语字典、kindle 程序字典以及各种小语种 Kindle
字典等等,直送地址:http://kindlefere.com/dict

>>>>公众号的结缘推送

该类网站道的施用玩法大抵一致,先是网站外报账号,然后绑定亚马逊推送的信箱,再次就是拿平台供的地点上加到亚马逊kindle页面的相信列表里,最后进行定时推送就得了。比较靠谱的网站本身引进两个:dogear和hikindle。笔者正在就此底凡dogear的推送服务,我顶欢喜看中文媒体了,里面干货多多:)当然这种订阅方式也异常轻阻碍长篇阅读的点子,大家看在用吧。

Dogear

汉语名狗耳朵,全文RSS和微信公众号推送服务,支持Kindle、多看与Nook等倒电子阅读设备,直送链接:http://dogear.cn/

Hikindle

专为亚马逊Kindle提供公众号订阅推送服务之,�内容精致排版非常赞赏,免费版虽支持多主流媒体,付费版又产生彩蛋资源哦,直送链接:http://www.hikindle.com/

>>>>配合大象为会打

相信大家还懂大象(Evernote)吧?作为信息整理的无敌工具,口碑一直格外好,即使近些年有了碰问题,也束手无策阻碍自己对其的欢喜。那么,用Kindle上看喜欢的内容,是否足以推送给大象也?
可以的啊。详细措施参考简书邱凯达的辨证:http://www.jianshu.com/p/237c61ad330a

=

“你无明了的Kindle神器”

格式神器Calibre

Calibre是同等磨蹭电子图书管理软件,其提供的“一站式”的电子书解决方案,可以着力满足读者对电子书需求,甚至足以应用她组织成属于自己的电子图书馆,它的效益尤为层出不穷,不仅可就此它们对书籍进行格式转换,归类整理电子书,还可以用文件图像资料、在线内容(RSS)加入并转移为电子书。更要的凡Calibre是免费的、开源之,拥有过平台的宏图,可当Linux,
OS X和Windows操作系统被运作。

Calibre主页面


直送链接:http://kindlefere.com/tools\#calibre


彩蛋:细心之朋友当还会意识,该页面下还有很多软件,就添一一列举了,总之,工具很多,适合不过根本。

搜书神器jiumo

鸠摩是同样缓慢图书搜索引擎,绝对是一个搜书神器来的,它的觅范围令人发指,来源包括Yun.baidu,pan.baidu,disk,mush,wodemo,xiaoshuotxt,bank,feng,kindle114,cnepub,mydoo,kindle10000在外的诸多Kindle书籍的情提供平台。


直送链接:http://www.jiumodiary.com

鸠摩搜索主界面

标神器Kindle Mate

Kindle
Mate是运作于Windows计算机上管理Kindle设备内容的辅助工具。通过Kindle
Mate,您可以测算机侧同步、浏览管理Kindle设备上之情节,回顾阅读笔记或开展英语不行词本的构成学习。另外,Kindle
Mate还是慢免费软件,你不光可以永远免费应用,还没有任由其它功效跟时光的范围。当然如果您是OS
X系统也是能够解决的, 通过安装虚拟机以及安装一个windows系统就可以了。


直送链接:http://www.kmate.me/download

Kindle Mate主界面

现阶段Km最新版本为1.31,开发者Harvey正紧锣密鼓进行1.35本子的研发,大家静候佳音:)

“你或许会见有些有疑团”

什么挑选机型?

下图自官网,是时下较流行的几乎暂缓机型,可以说都适应各个消费端的人群了。
其实产生多情人咨询我打啊机型好?我建议还是加点预算买尽好之。那句古语说得好:单反穷三代表,kindle富一生。从更看来,kindle不达背光就与才反不上全都可一个理,在资产允许的前提下,绝对是能打多好就是买多好的。

亚马逊Kindle内页表格对比图

这边的价位只是亚马逊官方的,大家购买之时光了只是自动通过日亚、美亚购置,或者去X宝找代打,再要经咸鱼同城等等,二手物品交易的下要要小心一点。

是不是如刷机?

这边说的刷机,统一解释为刷多看。我们以做一样宗事之前,就当先行考虑做这东西是否对此好的必要性,考虑了了重复失开。作为一个既将固件降到5.4.3.2重复刷多看之人头,我怀念告知你,刷就游戏意儿真的没有多老必要!多扣系统除了可以支持Epub和优化排版外,其他特色对本人而言还是有硌鸡肋的,尤其是勿支持Azw3格式这点。最后,是否要刷机的问题而还足以接近比较到Iphone是否越狱的题目,总之没事儿做别作死就本着了:)

是不是如贴膜?

诸如此类耐操的东西而认同如果贴膜吗?告诉你,不粘也安然得生!贴了再度影响手感好呢?
相信广大口且未曾贴过,并且用了一样年差不多并未啥痕迹:)

是不是需要皮外套?

自我的Kpw3带了一个原生的效仿,带休眠的,自觉非常好用,也就了骨干的保护机身,单手可进展特技开合外套。X宝的淘气套质量良莠不齐,款式也五花八门,大家一齐可以依据自己之喜欢好去购买适合自己的,我便差点动手了一个神奈川冲浪里之外衣,最后还是忍住了。基于目前之外各种爆款的情景,我怀念做最特别的、小众的休眠套,于是通过几只月的努力我做出了几款款超过棒的休眠套,大家好在自的众生号拾书小记的后台回复休眠套来抱介绍文章。

=

“Kindle of my eyes”

长期以来,我直接致力为Kindle相关的技能研究,却也从不放弃对纸质书的追,于是自己创建的众生号拾书小记,可以搜微信号shishuxiaoji。里颇多关于Kindle技巧、Kindle故事、读书活动、书评、书单等等的内容,并且会持续保持更新,欢迎过来找我打和投稿。

群众号拾书小记后台

说词心里话,我是只特别欢喜纸质书的人口,也死享受用画记录整个的发,因此经常会面因此多种类型的笔来记录自己嗜的词。然而,随着时代的变型,我们用相当地去开片生成,随着电子书的普及,越来越多口关注及了Kindle以及有关延伸产品的付出及普及上,我杀崇拜这丛人数,也想他们能够带动在Kindle的饱满,直到将她们的产品就最好致。也意在以快的前,我得在大Donate上面献上同样画来份量的事物。

此文章为本创内容,如发生转载需求要务必以简信形式和直树桑商量相关合作事宜,谢谢:)