ARTS打卡第七周

Algorithm:Leetcode 19. Remove Nth Node From End of List

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?

解法一:双指针

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        if(n <=0)
            return head;
        
        ListNode dummyHead = new ListNode(-1);
        dummyHead.next = head;
        
        ListNode p = dummyHead;
        ListNode q = dummyHead;
        
        int i=0;
        for(; i<n && p!=null; i++) {
            p = p.next;
        }
        
        if(i < n) {
            // n is larger than list.size
            return head;
        }
        
        // move to the end
        while(p.next != null) {
            p = p.next;
            q = q.next;
        }
        
        // q.next is the nth from the end
        q.next = q.next.next;
        
        return dummyHead.next;
    }
}    

解法二:先遍历一次计算链表长度,从而计算出倒数第n个元素是整数第几个

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        int size=0;
        ListNode p = head;
        while(p != null) {
            p = p.next;
            size++;
        }
        
        if(n <=0 || n > size)
            return head;
        
        ListNode dummyHead = new ListNode(-1);
        dummyHead.next = head;
        p = dummyHead;
        int m = size - n;
        while(m > 0) {
            p = p.next;
            m--;
        }
        
        p.next = p.next.next;
        
        return dummyHead.next;
    }
}

Review: The Huawei Sanction Might Just Pop the Tech Bubble

https://onezero.medium.com/the-huawei-sanction-might-just-pop-the-tech-bubble-f7e800e3174

随着美国对华为的制裁,Google、Intel、ARM等公司相继对华为“发难”,目前对华为来说是万分艰难的时刻。无论华为的结局如何,都将对全球科技和经济造成不利影响。如果华为因此而倒下,将会捅破科技泡沫。

华为是全球前十的最有价值的科技公司之一,其智能手机业务正逐渐抢占苹果公司的市场份额,但手机并不是华为唯一的主业,它也是通信基础设施建设的巨头。

The offensive potential of 5G was so great that if Australia were on the receiving end of cyber attacks on 5G infrastructure, the country could be seriously exposed
5G的攻击潜力是如此之大,以至于如果澳大利亚成为5G基础设施网络攻击的接受方,该国可能会受到严重的暴露

华为在5G上的领先,使得澳大利亚的一家谍报机构大为震惊,后者将其的调查结果出售给了美国。可事实上,并没有任何证据表明华为从事间谍工作,华为的领导人也深知从事这种工作对公司的危害。

从斯诺登事件,我们知道,美国国家安全局(NSA)对思科(Cisco)生成的路由器安装了“后门”,用于从事间谍工作。NSA的权利之大,几乎要不受控制了。

禁令将会使得华为丧失竞争力,所有的合作伙伴都担心被波及。谷歌收回对华为的Android授权,这件事对华为的影响看起来还不是很大。因为华为手机大部分的市场在中国,而在中国,谷歌服务本身就是不可用的,因此华为有自己的替代服务。但随着其他公司也逐渐停止和华为合作,华为将面临各种层面的挑战。

没有ARM,华为将失去有竞争力的手机芯片;没有高通,华为将不能用上最好的调制解调器(modems);没有Intel,华为将没有笔记本电脑……
The list goes on, and dismantling a single Huawei smartphone reveals how intimately tied together we all are as a result of globalization — it takes components sourced from many companies based in different countries to create a functional handset, with no single entity able to pull it off alone.
这样的例子不胜枚举,拆下一部华为智能手机就可以看出,由于全球化,我们所有人是多么紧密地联系在一起——要制造出一款功能齐全的手机,需要从许多总部位于不同国家的公司采购零部件,而没有任何一家实体能够独自完成这一任务。

几乎所有的美国科技企业(苹果、英特尔、高通……),都依赖于中国提供巨大的生产规模。
It would take years for U.S. companies to learn how to pull off building with the precision and scale of the Chinese, and they’d essentially be starting from scratch
美国企业基本上要从零开始,花费数年时间学会像中国人一样精确和大规模地建设。

由于智能手机和笔记本电脑的销量持续下滑,互联网科技企业都在寻求新的增长点,但至今情况还不太明朗,而贸易战无疑会使情况更加恶化。在情况变得更坏之前,中美达成一致,那是最好不过,但我们也不能盲目乐观。华为对于中国来说,是一家“大到不能倒”的企业,毫不怀疑中国会尽力帮助这家企业渡过难关,但是这样做代价是巨大的,到底会拖垮别的哪家企业就不得而知了。

Tip: MySQL事务隔离级别

  1. 读未提交:允许在一个事务中看到另一个事务未提交的修改,即会出现“脏读”,是最低的隔离水平。
  2. 读已提交:只能看到其他事务已经提交的修改,不会出现“脏读”。但不保证在一次事务中多次读会读到同样的值,即允许“不可重复读”和“幻读”存在。
  3. 可重复读(InnoDB默认):保证在一次事务中多次读同一份数据读到的值是一样的。是MySQL InnoDB引擎默认的隔离级别,和其他数据库实现不同的是,MySQL在“可重复读”级别不会出现“幻读”。
  4. 串行化:并发事务之间是串行化的,读取需要获取“共享锁”,更新需要获取“排他锁”。如果有 where 语句,还会获取“区间锁”。MySQL以GAP锁形式实现“区间锁”,“可重复读”级别默认也会使用“区间锁”。这是MySQL最高的隔离级别。

Share: iptables入门

在Linux中,真正的防火墙是 netfilter 框架,位于Linux内核空间;我们常见的iptables只是一个命令行工具,位于用户空间,可以通过它来和netfilter交互。

netfilter框架主要通过“表”和“链”来对数据包进行拦截、过滤和修改。“链”其实就是netfilter框架在几个关键节点提供的“钩子”(hooks),我们可以通过iptables命令行工具来往这些“链”上挂规则。netfilter的“链”按照数据包从流入到流出的方向来看,分别是 PREROUTING, FORWARDING, INPUT, OUTPUT, POSTROUTING。

PREROUTING链是数据包刚刚进来,还没决定是继续转发出去还是传给本地的应用程序,先处理一把;
FORWARDING就是在路由判断之后,发现不是给自己的,需要继续转发出去,此时对数据包先处理一把再转发出去;
INPUT是指数据包的目的地就是本机,在传给应用程序先,通过INPUT链处理一把;
OUTPUT是应用程序发出的数据包,先经过OUTPUT处理一把;
POSTROUTING就是数据包离开本机之前最后处理一把;

每一条“链”上都可以挂很多规则,没条规则对应一个动作,当满足规则时执行相应动作。只有一条链上所有的规则都匹配完之后,才会进入到下一条“链”。常见的匹配规则比如“源ip等于多少”、“目的ip等于多少”、“端口是多少”等等,对应的动作有如下几种:
ACCEPT:允许数据包通过
DROP:丢弃数据包,不给发送方任何回应,直到超时
REJECT:拒绝数据包通过,必要时会给发送方一个拒绝的回应
SNAT:源地址转换
MASQUERADE:特殊的SNAT,适用于动态的、会变的ip
DNAT:目的地址转换
REDIRECT:本地端口转发
LOG:只记录日志,不对数据包做任何处理,直接转发出去

每条“链”上都可以挂很多规则,规则多了就会比较乱,所以iptables设计了4种表来对这些规则分类管理,我们自定义的规则逃不出这4种类型。按照优先级排列分别是:
raw->mangle->nat->filter

当一条链上有多个表的规则时,按照上述的优先级来依次匹配。

这4种表的功能分别是
raw:关闭nat表启用的连接追踪机制
mangel:拆包、修改、重新封装
nat:对数据包做SNAT或者DNAT
filter:对数据包做过滤

并不是每一条“链”上都可以挂所有类型的规则,不同的关卡能做的事情还是有区别的。
PREROUTING链可以挂的表有:raw->mangle->nat
FORWARDING链可以挂的表有:mangle->filter
INPUT链可以挂的表有:mangle->filter
OUTPUT链可以挂的表有:raw->mangle->nat->filter
POSTROUTING链可以挂的表有:mangle->nat (是否有filter?)

日常使用时,我们往往是根据表来配规则,因为表描述的是功能,我们需要达到什么样的功能才配什么样的规则。比如我们想做nat,就需要知道可以在PREROUTING、OUTPUT和POSTROUTING链上配规则。因此,每个表可以用在什么链上,也是要熟悉的。

这篇文章的内容可以结合极客时间课程《趣谈网络协议》第26讲一起看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值