2018-12-09-LeonLiu's ARTS

2018.12.09 ARTS

Algorithm: “Leetcode Algorithm: 001. Two Sum”

Review: “The Art of Defensive Programming”

Tips: “Learning to build distributed cluster construction “

Share: “Thinking about the Trade War with US”


Algorithm

Leetcode Algorithm: 1. Two Sum

Description:

Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the same element twice.

Example:

Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].

//C++ Source Code:  

    class Solution { 
     public:vector<int> 
        twoSum(vector<int>& nums, int target) {
           
        vector<int> result;
        unordered_map<int,int> Hashmap;
        
        int res=0;
            
        for(int i = 0;i< nums.size() ;i++)
        {
            res= -nums[i] + target;
            
            if(Hashmap.find(res) != Hashmap.end()) //found a new reult which did not contained ,put into the Hashmap. 
            {
                result.push_back(Hashmap[res]);
                result.push_back(i);
            }
            else if(Hashmap.find(nums[i]) == Hashmap.end()) 
            {
                Hashmap.insert({nums[i],i});
            }
        }
        
        return result;    
        
    }
};

算法核心:

  • 通过学习使用 unordered_map (Hash Map)
    • 将数组值作为Hash Map的Key;
    • 对应的下标作为Hash Map的Value。
  • 通过Hash Map来确保2个元素一组的结果的唯一性。

    扩展:

  • 其他数据结构的解决方法;
  • 扩展到 ‘K SUM’(K>=2)。

Review

“The Art of Defensive Programming”.
“防御性编程的艺术”:

  • 文章首先通过几个航天、医疗和军事领域极端的案例,来阐述软件漏洞的危害可以严重到引发重大财产损失和危机人类的生命。 强调了安全与可用的软件编程的重要性。
  • 进而引入防御性编程的概念,Wikipedia上关于防御式编程的定义,即 “防御性编程是一种防御性设计,旨在确保在不可预见的情况下软件的功能持续性。经常被实践在需要高可用性,安全性或保密性的地方。”
  • 最后给出了几条实现防御性编程的建议:
  1. 永远不要相信用户输入:(针对例外情况进行防御,而最好的防御是进攻。)
    • 使用Assert 进行例外处理;
    • 建立白名单而不是黑名单。
  2. 使用 Database Abstraction:
    • OWASP Top10 安全漏洞中,“注入”排在第一位;
    • 预防常见的使用非安全工具进行数据库查询的用户行为。
  3. 不要自己造轮子
    • 尽可能多的进行软件重用(虽然是老生常谈,但是凡事亲力亲为、敝帚自珍确实是很多开发者无法避免的通病);
    • 尽量使用已经被大量使用并验证过安全性可用的架构;确实没有可以重用的或者现有架构不能完全满足需求时在自己动手开发。

Tip

分布式hadoop集群搭建

最近在学习,仅仅收集了一些资料,有待持续实践更新

https://zhuanlan.zhihu.com/p/33116895
https://segmentfault.com/a/1190000012578739
https://blog.csdn.net/qq_16403141/article/details/78273261
https://blog.csdn.net/weixin_39778085/article/details/79286126

Share

2018.12.1华为CFO孟晚舟被加拿大暂时扣留

同日,华裔物理学家张首晟被爆在美跳楼自杀

以上是目前为止明确的事实,内外网上还有很多无法证实的流言。

通过目前可以获得的有限信息,尚无法形成明确判断,这里想评论的内容不涉及政治,不涉及爱国主义,甚至在事实相对明确之前不想过多讨论这个事件本身。 只是想思考一下在当前政治经济环境下,作为一介草民该如何自处,分享自己一点有感而发的思考,抛砖引玉。

  • 保持对社会经济环境的危机感
    • 理工科思维陷阱
      从高中分文理科开始,甚至更早的时候我就被潜移默化的灌输了重理轻文的想法,所谓“学好数理化走遍天下都不怕”。父亲从小教育我,一定要学理工或者医科,掌握一门吃饭的手艺,不管社会环境如何变化,都有你一口饭吃。不得不承认这种思想对我的影响一直持续很久,大学报考的专业,根据专业选择的职业,都顺理成章。但是随着年龄的增长,经历的丰富,越来越觉得,不能仅仅埋头于自己专业和工作的小天地,即使是理工男也需要经常抬起头来看看路,仰起脸来望望天。

    • 覆巢之下无完卵
      拜读了湖畔大学梁宁女士关于“点线面体”的论述,颇有感触。企业在国际政治环境的整体之中,仅仅是一个个依托于某政府或者经济体的点;强如华为,即使营收已突破千亿,也不可能有力量独自抵抗国家层面的降维打击。所谓覆巢之下无完卵,看似离我们很遥远的一次蝴蝶振翅,真的可能给我们的生活带来切实的影响,而且影响的速度恐怕会快得超出我们的想象;中兴在遭受美国制裁后的裁员就是最好的例子。

  • 保持对职业发展的危机感
    • 行业比职位重要
      “点线面体”也可以从职业发展的维度解读,我们作为个体,是一个个点;选择的团队组成一条条线,汇聚成某一产品或领域的基本面,进而组成了整个行业或产业的一个整体。如果你所在的行业整体蒸蒸日上,所在的公司有幸成为所谓“风口的空中飞猪”,你自然不会发展的太差。反之,单个点的能量有时候太过渺小。 能力素质以及工作的勤奋程度相差不大的两个人,因为所附着的行业整体的差异,随着时间的推移,很可能会在个人收入及职业发展空间等方面产生巨大差异。如果不能在更高层次上看清自己从事行业所处的位置和发展空间,我们很可能面临职业发展窘境。每次产业革命的牺牲者大都是固守往昔辉煌不能适应变革的人;丛林法则一直都存在,而且有愈演愈烈的趋势。

    • 职业技能提升与更新
      一方面,如果不是自己创业或者自由职业,作为普通打工者,我们是用自己的时间资源等价等量产生价值、换取收入;我们的时间资源有限,任何一项职业技能的培养需要投入大量的时间和精力,而如果想让自己有限的时间投入变得更有价值,需要提高单位时间产出率;即我们的职业技能越具有不可替代性、可以产生的价值越高,我们投入的时间回报率越高。
      另一方面,在经验积累和技能提升到一定程度,作为资深的职业人,如果仅仅持续的输出,而不考虑与时俱进的更新技能,一旦之前深耕细作的领域不在被需要,或者失去市场,将面临职业发展的困境。

  • 如何应对危机、规避风险
    • 甩掉懒肉的觉悟
      既然从社会经济环境到个人职业生涯都充满着不确定性,为了更好的识别风险以及控制风险,保持个人成长、不断提升认知水平和各方面综合能力变得尤为重要。
      在我看来,追求享受安逸是人的天性,如何做到逆人性的自律,是我们必须面对的一道坎。首先在思想上认识到保持个人成长的重要性和必要性,是迈出第一步的关键;其次,找到适合自己的节奏,进而养成一种生活习惯;同时,找到志同道合者组成的社群或平台,互相监督,彼此分享经验,获得认同感和成就感(比如左耳朵发起的ARTS社群就是极好的平台);最后,在实现了阶段性的小目标后,别忘记给自己奖励。
    • 合理分配资源——阿姆达尔法则(Amdahl’s law)
      一旦下定决心进行持续自我成长的投入,如何合理分配有限的资源(个人的时间、精力和资金等等),以达到综合能力提升的最大化是另一个问题。这里我们可以借鉴参考一个计算机领域的方法论:阿姆达尔法则。
      Amdahl's law

      Slatency is the theoretical speedup of the execution of the whole task;
      s is the speedup of the part of the task that benefits from improved system resources;
      p is the proportion of execution time that the part benefiting from improved resources originally occupied.

阿姆达尔法则考察的是系统整体性能的提升(加速度),公式右边s是某个方面性能的提升,p代表该方面性能提升占整体的比例。举例来说,目前算法知识的运用对你能力的提升或者找到理想中的工作影响比例较大,大概占比 p=50%;而你目前这方面能力确实欠缺是短板。那么你加大在这方面的投入,将算法运用能力提升1/4即s=1.25,带入后整体提升11%。反之,如果某个能力对于目前整体能力的重要性占比较低,在这方面的投入产出就很不划算。 当然,随着某方面能力的改进,和需求的改变,对于整体影响最大的方面也是动态变化的,因此需要我们根据能力提升效果和具体的情况随时调整自己的资源投入策略。

  • 结束语
    最后想说的是一些个人观点,华为是令我敬佩的企业,身边也有很多打过交道的正在和曾经在华为工作过的伙伴,给我的整体感觉无论是职业技能、还是职业操守水平都很高。
    虽然技术无国界,但技术从业者有国籍;虽然算法无价值观,但控制算法的人有价值倾向。作为中国人,作为中国的技术从业者,于公于私我都支持中国企业合法的经营;认同并钦佩中国劳动者勤奋低调,努力拼搏的工作作风。
    不论结果如何,尽人事听天命。


Written on December 9, 2018