CodingTour
ARTS #203 | AI 线描上色真好玩

AI 线描上色真好玩~

Algorithm

本周选择的算法题是:Knight Probability in Chessboard

impl Solution {
    pub fn knight_probability(n: i32, k: i32, row: i32, column: i32) -> f64 {
        let mut dp = vec![vec![vec![0.0; n as usize]; n as usize]; k as usize + 1];
        let directions = vec![
            (1, 2),
            (1, -2),
            (-1, 2),
            (-1, -2),
            (2, 1),
            (2, -1),
            (-2, 1),
            (-2, -1),
        ];
        dp[0][row as usize][column as usize] = 1.0;
        for step in 1..=k as usize {
            for i in 0..n as usize {
                for j in 0..n as usize {
                    for direction in &directions {
                        let x = i as i32 + direction.0;
                        let y = j as i32 + direction.1;
                        if x >= 0 && x < n && y >= 0 && y < n {
                            dp[step][i][j] += dp[step - 1][x as usize][y as usize] / 8.0;
                        }
                    }
                }
            }
        }
        let mut res = 0.0;
        for i in 0..n as usize {
            for j in 0..n as usize {
                res += dp[k as usize][i][j];
            }
        }
        res
    }
}

Review

30 year old code killed! Microsoft rewrites Windows kernel with 180,000 lines of Rust

5 月份看到这篇文章时,感觉标题有点误导性,因为被 Rust 重写的部分虽然在广义上属于 Windows 内核,不过准确来讲是内核的依赖,而不是内核本身,因此虽然笔者对 Rust 多有关注,也对其未来充满期待,但客观来讲还需要在工具链和生态上通过几年时间的发展,才能更加成熟、被更多从业者接受。

不过这个月微软官方博客也发文介绍了 25905 这个预览版的情况:Announcing Windows 11 Insider Preview Build 25905,在这篇文章中,微软提到:

Rust in the Windows Kernel

Rust offers advantages in reliability and security over traditional programs written in C/C++. This preview shipped with an early implementation of critical kernel features in safe Rust. Specifically, win32kbase_rs.sys contains a new implementation of GDI region. While this is a small trial, we will continue to increase the usage of Rust in the kernel. Stay tuned!

[We are beginning to roll this out, so the experience isn’t available to all Insiders in the Canary Channel just yet as we plan to monitor feedback and see how it lands before pushing it out to everyone.]

希望 Rust 在安全性、并发性和高性能三方面上继续加油。

Tip

在 Rust 里,原生的 String 以及 CString 不是 FFI-safe 的类型,需要经过特殊转换。

String to CStr:

use std::ffi::CStr;
use std::ffi::CString;

fn main() {
   let s = "Hello World!".to_string();
   let c_string: CString = CString::new(s.as_str()).unwrap();
   let c_str: &CStr = c_string.as_c_str();
   println!("{:?}", c_str);
}

CStr to String:

use std::ffi::CStr;

fn main() {
   let c_str: &CStr = CStr::from_bytes_with_nul(b"Hello World!\0").unwrap();
   let s: String = c_str.to_string_lossy().into_owned();
   println!("{:?}", s);
}

Share

什么是重要不紧急

在时间管理上,我们一般会把事情按照四象限法则分为重要紧急的重要不紧急的不重要紧急的不重要不紧急的,而其中最重要的部分可能是 — 重要不紧急的

为什么说重要不紧急的是最重要的呢?我们可以简单分析下:

  • 重要且紧急的 — 简称救火。传统观念上认为要立刻处理,这没有错,但是如果这类事件太多,一定需要思考为什么会有那么多救火的事情,多数原因是没做好规划
  • 重要但不紧急 — 我称它为规划,单独说
  • 不重要但紧急的 — 一些琐事了,开个账号、开个权限啥的,可以委派其他人来做,体力活偏多,也不能完全抛开不做
  • 不重要也不紧急 — 这类事情无明显的目的,但为什么会出现在清单上?原因往往是因为这些事情可以取悦自己,能带来愉悦感

第一种,救火的事情,迫于外界压力自然会做;第三种,琐事,不用刻意关注,有人需要就做,没有就放一放也无所谓;第四种,无目的但喜欢做的事情自然会去做,而且完成事情本身可以帮助人增强信心,便于保持良好的状态,所以只要能做到心理无压力,做这类事件反而可以补充精力。唯有规划,它因为两个原因最容易被轻视:

  1. 表面不解决当下/外界的实际问题
  2. 无法规划规划本身

第1点,虽然表面不解决实际问题,但规划的好坏却直接影响了达成目标的效率,是否能减少(或者不增加)救火和琐事。第2点,规划是没办法拿时间去衡量的,如果要在规定的时间内拿出一个方案,大概率它不会是最佳方案,只能算是一个可行的方案,这类方案在落地过程中可能出现什么问题、产生什么影响、未来的演进方向没有任何预期,并且别忘了,技术领域一直在变化,如果不是长期关注某个领域,并有较高的技术敏感度,是没办法做到的。

现在你或许已经理解了为什么说重要不紧急的是最重要的部分:

  • 没人能告诉你要做什么、怎么做
  • 没有对时间、精力的预期分配

我们再强调一下:

  1. 优先规划未来:重要但不紧急的任务通常涉及规划、战略、长期目标等,这些事项可能没有明确的截止日期,但对于个人、团队或组织的未来发展至关重要。将时间和精力投入这些规划性的任务,有助于提前预防重要紧急任务的出现,减少救火的次数
  2. 避免常常处于紧急状态:如果我们只处理重要且紧急的任务,很容易陷入不断应对紧急情况的困境。而重要但不紧急的事务,如果及早关注和处理,有助于将更多的任务转化为不紧急状态,从而减轻压力,增加工作的自主性和灵活性
  3. 提高工作质量:重要但不紧急的任务通常需要更多的思考和准备,因此有足够的时间去处理这些任务,能够更全面、深入地解决问题,提高工作质量和效率
  4. 增强规划能力:处理重要但不紧急的任务需要对目标、资源和时间进行规划和管理。通过不断处理这类任务,我们可以增强自己的规划能力,从而更好地应对未来的挑战
  5. 保持长期发展:重要但不紧急的事项往往与个人或组织的长期发展密切相关。如果我们忽略这些长远目标,可能会陷入短视的操作,无法持续地取得进步

总结来说,重要但不紧急的事项是我们需要认真对待的重要一环,它们可以帮助我们规划未来、避免常常处于紧急状态、提高工作质量、增强规划能力以及保持长期发展。因此,在时间管理中,我们应该理智地分配时间和精力,合理安排这些重要但不紧急的任务,并在日常工作中予以重视。此外随着一个组织、团队不断变大,各种协作的工作会变多,需要在规划层面有横向的打通、协调,不仅要做到当下可用,还要对未来整体性、长期性、基本性问题设计整套行动的方案,最终形成长远的发展计划。