ARTS打卡第七周

美国对华为的制裁可能引发科技行业动荡,华为作为全球科技巨头,其在5G领域的领先地位受到威胁。文章探讨了制裁对华为及全球科技供应链的影响,包括智能手机、通信设备等多个方面。

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讲一起看。

### ARTS打卡 Java 学习或项目进展 #### 一、Algorithm 算法练习 在算法方面,最近研究了回文验证问题中的双指针方法。通过实现 `validPalindrome` 函数来判断给定字符串是否可以通过删除最多一个字符形成回文串[^2]。 ```cpp class Solution { public: bool validPalindrome(string s) { int i = 0; int j = s.size() - 1; int diffCount = 0; while (i < j) { if (s[i] == s[j]) { ++i; --j; } else { if (diffCount > 0) return false; // 尝试移除左边或右边的一个字符并继续比较剩余部分 string sub1 = s.substr(i + 1, j - i); string sub2 = s.substr(i, j - i); return is_palindrome(sub1) || is_palindrome(sub2); } } return true; // 辅助函数用于检测子串是否为回文 auto is_palindrome = [](const std::string& str){ int l = 0, r = str.length() - 1; while(l<r && str[l]==str[r]){ ++l;--r; } return l>=r; }; } }; ``` 此版本改进了原始逻辑,在遇到不匹配的情况时不再直接修改原字符串而是创建两个新的子串分别测试其合法性,从而提高了代码可读性和效率。 #### Review 技术文章阅读心得 关于数据库操作的学习笔记中提到 MySQL 支持四种不同的事务隔离级别:未提交读(Read Uncommitted),已提交读(Read Committed),可重复读(Repeatable Read),序列化(Serializable)[^1]。每种级别的特性决定了并发环境下数据的一致性程度以及性能表现之间的权衡关系。 另外还探讨了两种常见的锁机制——悲观锁(Pessimistic Locking) 和乐观锁(Optimistic Locking) 的原理及其适用场景: - **悲观锁** 假设冲突不可避免,因此总是先锁定资源再执行更新动作; - **乐观锁** 则认为大多数情况下不会发生竞争,仅当实际发生写入时才检查是否有其他更改影响到目标对象。 这两种策略各有优劣,具体选择取决于应用的具体需求和环境特点。 #### Tip 技巧总结 对于上述提及的内容,建议开发者们理解各自系统的默认配置,并根据业务逻辑调整合适的参数设置;同时也要熟悉如何利用编程语言提供的工具去处理并发控制问题,比如 Java 中可以借助框架如 Spring 提供的支持简化分布式事务管理过程。 #### Share 经验交流 分享过程中发现很多同学对多线程下的共享变量可见性和原子性的概念存在误解。实际上,Java 内存模型规定了 volatile 关键字能保证变量的即时可见性但不具备原子性保障,而 synchronized 或者 ReentrantLock 可以提供更强大的同步功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值