Skip to content

Latest commit

 

History

History
193 lines (149 loc) · 9.51 KB

ARTS15-1013.md

File metadata and controls

193 lines (149 loc) · 9.51 KB

ARTS15-20181013

第十五周 ARTS。这周约了几个好久不见的“狱友”聚餐(因为我们同在的上家公司是做司法行业业务系统的,所以调侃称为“狱友”),聊了很多,让我感触最深刻的就是关于读书和学习的思维力和金字塔原理,怎么样高效的读书学习也是有套路可寻的,掌握一些模式可以更快的掌握书中的有效信息,本周的Share分享几本相关的书,与大家共勉。

Algorithm

package org.nocoder.leetcode.solution;

/**
 * Given a sorted array nums, remove the duplicates in-place such that each element
 *
 * appear only once and return the new length.
 *
 * Do not allocate extra space for another array, you must do this by modifying the
 *
 * input array in-place with O(1) extra memory.
 *
 * Example 1:
 *
 * Given nums = [1,1,2],
 *
 * Your function should return length = 2, with the first two elements of nums being 1 and 2 respectively.
 *
 * It doesn't matter what you leave beyond the returned length.
 * Example 2:
 *
 * Given nums = [0,0,1,1,1,2,2,3,3,4],
 *
 * Your function should return length = 5, with the first five elements of
 *
 * nums being modified to 0, 1, 2, 3, and 4 respectively.
 *
 * It doesn't matter what values are set beyond the returned length.
 * Clarification:
 *
 * Confused why the returned value is an integer but your answer is an array?
 *
 * Note that the input array is passed in by reference,
 *
 * which means modification to the input array will be known to the caller as well.
 *
 * Internally you can think of this:
 *
 * // nums is passed in by reference. (i.e., without making a copy)
 * int len = removeDuplicates(nums);
 *
 * // any modification to nums in your function would be known by the caller.
 * // using the length returned by your function, it prints the first len elements.
 * for (int i = 0; i < len; i++) {
 *     print(nums[i]);
 * }
 * @author jason
 * @date 2018/10/13.
 */
public class RemoveDuplicatesFromSortedArray {
    public int removeDuplicates(int[] nums) {
        if(nums == null || nums.length == 0){
            return 0;
        }
        int count = 1;

        for (int i = 1; i < nums.length; i++) {
            if (nums[i - 1] != nums[i]) {
                nums[count++] = nums[i];
            }
        }

        return count;
    }
}

Review

最近计划对系统内部、系统与系统间的接口调用进行解耦,春哥推荐使用kafka,之前我们都没有用过kafka,于是花了一个下午的时间来入门kafka,把官网的introduction啃了一遍,照着quickstart操作,体验了一把。

Kafka 中的几个基本概念:

  • Broker

    • 代理是负责维护发布数据的简单系统。 每个代理中的每个主题可以具有零个或多个分区。 假设,如果在一个主题和N个代理中有N个分区,每个代理将有一个分区。
  • Topic

    • 属于特定类别的消息流称为主题。 数据存储在主题中。

      主题被拆分成分区。 对于每个主题,Kafka保存一个分区的数据。 每个这样的分区包含不可变有序序列的消息。 分区被实现为具有相等大小的一组分段文件。

  • Partition

    • 主题可能有许多分区,因此它可以处理任意数量的数据。
  • Producer

    • 生产者是发送给一个或多个Kafka主题的消息的发布者。 生产者向代理发送数据。 每当生产者将消息发布给代理时,代理只需将消息附加到最后一个段文件。 实际上,该消息将被附加到分区。 生产者还可以向他们选择的分区发送消息。
  • Consumer

    • 消费者从代理处读取数据。 消费者订阅一个或多个主题,并通过从代理中提取数据来使用已发布的消息。
  • Leader

    • Leader是负责给定分区的所有读取和写入的节点。每个分区都有一个服务器充当Leader

使用kafka streams 进行消息的发布、处理、消费,比较神奇的流式操作使用起来很爽,不能打断点进行debug,但是可以通过peek()方法来查看运行时变量的值。

Tip

  • eureka ribbon 负载均衡遇到的坑

    • 服务下线时client会向eureka server 发送下线请求,服务端会把下线的客户端剔除,但是此时访问服务,依然会向已经下线的服务发送请求,抛出connect failed异常 ,原因是客户端有缓存,默认30s刷新一次,缓存刷新后,再次访问才会返回no instance异常信息。
    • 解决方案暂时没有确定:
      • 修改默认缓存的刷新时间(如果时间很短,频繁请求,担心eureka server 压力大扛不住)
      • 单独调用下线接口(尝试调用之后发现,30s后client会重新向eureka注册)
  • 复习 java 基础中的值传递

    • java 中的参数传递都是值传递包括基本类型和对象的引用,基本类型值和对象的引用存放在JVM内存的栈内存中,对象的实例本身是存放在堆内存中,栈内存中的引用指向堆内存中的对象实例。

    • 传递基本类型值

      public static void test(int i){
          i = 1;
      }
      
      public static void main(String[]  args){
          int i = 0;
          test(i);
          System.out.println(i); // 输出结果:0
      }
    • 传递对象的引用

      public static void test(User user){
          user.setName("jason");
      }
      
      public static void main(String[]  args){
          User user = new User("freda");
          test(user);
          System.out.println(user.getName()); // 输出结果:jason
      }
    • 上面两个例子应该比较直观了,java 的参数传递始终都是值传递,int 类型i始终不会被改变;User 类型的 user 是引用值,其指向的堆内存里的User实例是可以修改的。

Share

金字塔原理

《金字塔原理》是一本讲解写作逻辑与思维逻辑的读物,全书分为四个部分。

第一篇主要对金字塔原理的概念进行了解释,介绍了如何利用这一原理构建基本的金字塔结构。目的是使读者理解和运用简单文书的写作技巧。

第二篇介绍了如何深入细致地把握思维的环节,以保证使用的语句能够真实地反映希望表达的思想要点。书中列举了许多实例,突出了强迫自己进行“冷静思维”对明确表达思想的重要性。

第三篇主要针对的对象是需要写研究分析报告的人士,以及需要对复杂的问题进行分析、提出结论供决策使用的人士。这一篇介绍了如何在解决问题过程中的不同阶段使用多种框架来组织分析过程,使写作者的思维在实际上进行了预先组织,从而能够更方便地应用金字塔原理。

第四篇介绍了一些演示技巧,能够写作者在以幻灯片等书面形式演示具有金字塔结构的思想时,能让读者或观众感受到金字塔结构的存在。

附有三个附录。附录一涉及的是分析法和科学法在解决问题过程中的区别;附录二列举了序言部分的各种常用写作模式;附录三是全书要点的详细提纲,突出了《金字塔原理》的关键概念和关键思维技巧,以便读者快速查阅。

思维力:高效的系统思维

“真正有用”正是这本书不同于其它思维书籍之处!

你有没有遇到过以下窘境——分析时想不明白、表达时说不清楚、学习时学不快速?你想不想全面提升你的思维能力?你知道问题解决技巧和表达技巧有哪些吗?

此书中有你想知道的答案。

本书分为3个部分共10章,各章可自成体系地解决一个问题,同时整书又形成一套体系化的系统思维。

第一部分探秘了“框架”力量的根源。万事万物的本质其实是一个个的系统,而掌握了系统的“框架”也就把握了事物的本质。没有什么问题是不能利用框架解决的,如果一个不行,那就两个。

第二部分将运用“框架”解决问题分解为五个步骤——界定问题、构建框架、明晰关键、高效执行及检查调整,并精炼了相应的优秀思考方法和工具。此外,还传授了在有限时间、有限资源限制下高质量地解决问题的秘诀——“假设思考”。

第三部分传授如何运用“框架”有效表达。逐层递进地演示了自上而下表达的魅力,并用丰富的图表阐述了何为“形象化表达”。

对于想全面提升思维能力的读者,建议按照本书章节顺序阅读;对于迫切想寻求具体问题解决技巧或表达技巧的读者,也可以直接阅读相应章节。

如何阅读一本书

每本书的封面之下都有一套自己的骨架,作为一个分析阅读的读者,责任就是要找出这个骨架。一本书出现在面前时,肌肉包着骨头,衣服包裹着肌肉,可说是盛装而来。读者用不着揭开它的外衣或是撕去它的肌肉来得到在柔软表皮下的那套骨架,但是一定要用一双X光般的透视眼来看这本书,因为那是了解一本书、掌握其骨架的基础。

《如何阅读一本书》初版于1940年,1972年大幅增订改写为新版。不懂阅读的人,初探阅读的人,读这本书可以少走冤枉路。对阅读有所体会的人,读这本书可以有更深的印证和领悟。