亚洲色成人网站www永久,亚洲欧美人成视频一区在线,亚洲国产成人高清在线观看,亚洲精品久久久久久动漫,亚洲国产精品久久电影欧美

數(shù)據(jù)專欄

智能大數(shù)據(jù)搬運工,你想要的我們都有

科技資訊

科技學(xué)院

科技百科

科技書籍

網(wǎng)站大全

軟件大全

做 leetcode 的時候我發(fā)現(xiàn)
nums.sort! 明顯要比 nums = nums.sort 要慢 10ms
這是為什么呢? sort!的操作更多?雖然 sort!寫起來格外的方便,但是吃了很多時間的虧。
前沿探索
2020-08-20 22:52:35
如題,所用插件為 Microsoft.Office.Interop.Word;如果是刪除所有超鏈接比較好解決,可以直接使用 doc.Hyperlinks.get_Item(ref index).Delete(); 但是如果想刪除對應(yīng)文本的超鏈接該如何做呢?
前沿探索
2020-08-20 22:51:17
每天都會刷一下酷工作,都是 python,要不然就是 java 或其它我是一個搞 C#的,感覺沒有 java 這些好找工作,而且大廠極少招 C#, V2 工作用 C#的在這里應(yīng)該不多吧
前沿探索
2020-08-20 22:50:56
namespace PropertyExamples{ class Program { static void Main(string[] args) { try { Student stu1 = new Student(); stu1.SetAge(20); Student stu2 = new Student(); stu2.SetAge(20); Student stu3 = new Student(); stu3.SetAge(200); int avgAge = (stu1.GetAge() + stu2.GetAge() + stu3.GetAge() / 3); Console.WriteLine(avgAge); } catch (Exception wx) { Console.WriteLine(wx.Message); } } } class Student { private int age; public int GetAge() { return this.age; // 請看這里 } public void SetAge(int value) { if (value>=0 && value <= 120) { this.age = value; // 請看這里 } else { throw new Exception("Age value has error"); } } } }
前沿探索
2020-08-20 22:50:48
https://www.coderbusy.com/archives/286.html
展示了在使用 C# 調(diào)用 Golang 方法時的更多細(xì)節(jié),并避免了字符串傳參時的內(nèi)存泄漏問題。
前沿探索
2020-08-20 22:50:39
大概這幾點意思: 深表遺憾 Rust 沒涼 等我們發(fā)詳細(xì)聲明的
原文鏈接: https://twitter.com/rustlang/status/1294024734804508679?s=20
前沿探索
2020-08-20 22:49:44
h_t_t_p_s:// github.com/rust-lang/rust/issues/74739
一句話就是可變借用結(jié)構(gòu)體成員,后然后借引用賦值沒有起作用。
這種最最基本的操作都能拖過 test 作為穩(wěn)定版 release,嚴(yán)重打擊了我對 Rust 編譯器正確性信心。。。
前沿探索
2020-08-20 22:49:27
吐個槽:這是第 3 次學(xué)習(xí) Rust 。之前都是到了智能指針那里停住了,這次又是遇到智能指針有點暈乎乎的。是它設(shè)計得太反人類,還是我太蠢了?
放一段讓我今晚缺氧的代碼: pub fn peek_front(&self) -> Option> { self.head.as_ref().map(|node| { Ref::map(node.borrow(), |node| &node.elem) }) }
來自 Too Many Lists 。
前沿探索
2020-08-20 22:48:56
博客原文地址: Rust 寫一個斗獸棋游戲
項目地址: Github: https://github.com/netcan/AnimalChess Crate.io : https://crates.io/crates/animal_chess lib.rs : https://lib.rs/crates/animal_chess
好久沒更新 blog 了,主要技術(shù)文章都是在公司內(nèi)部寫,后面看看有沒有機會同步到 blog 上。
現(xiàn)在利用業(yè)余時間寫了棋類游戲,起初是因為部門最近舉行編程大賽,主題是寫一個中國象棋 AI,這期間偷偷參加了比賽,參考了國際、中國象棋的相關(guān)算法,最后利用 alpha beta 剪枝算法,取得了總決賽季軍名次,這個名次對我們來說還可以,因為八強中有七強是直接拿開源代碼稍微改改就比賽了的,我們?nèi)孔约簩?拿到這個名次還算可以。
還是要吐槽這次比賽的,畢竟海思部門是第一次舉辦軟件大賽,選了這種網(wǎng)上代碼一大堆的題目實在沒意思。還是無線的軟件大賽有意思,題目比較偏門,比如 18 年那次比賽是寫一個 RTS 對抗游戲的 ai,網(wǎng)上沒有現(xiàn)成的代碼可利用,全靠手寫,就這樣拿了冠軍。
編碼是我的愛好,業(yè)余時間想寫點什么來消遣一下,正好最近這個象棋游戲給了我啟發(fā),不如直接也從頭寫一個玩玩,既然寫就需要考慮用什么語言寫了, C/C++ 是我的強項,寫了對我來說沒任何編碼技巧上的提升,就用 Rust 來試試手,看看 編碼體驗 如何吧,于是有了下面的項目: https://github.com/netcan/ChineseChess
把 GUI 寫完后,發(fā)現(xiàn)在寫下去沒意思,因為在比賽的時候已經(jīng)用 C++ 把 AI 寫過一編,于是就先擱置了。
后來想起了小學(xué)愛玩的斗獸棋,心血來潮,規(guī)則比較簡單,分支因子也小,相對象棋來說簡單多了,然后就收集素材,很快把象棋的 GUI 改成了斗獸棋的,并添加了 AI 。雖然目前的 AI 比較弱智,但是我目前已經(jīng)很難贏了??。
模塊劃分
接下來講講實現(xiàn)部分。目前項目由四部分實現(xiàn): src ├── ai.rs # AI 實現(xiàn) ├── chess.rs # 棋子的定義 ├── game.rs # 核心框架、圖像渲染 └── main.rs # 程序主入口
首先需要 GUI 來交互,我考慮了 SDL 框架,因為上手簡單,很快仿著 rust-sdl2 例子寫了個 gui 出來: https://docs.rs/sdl2/0.34.0/sdl2/#getting-started 。
類型別名
和 C 的 typedef ,C++的 using 類似,Rust 也支持別名: pub type POS = u8; pub type MOVE = u16; pub type ScoreType = i32;
異常處理
來看看異常處理,Rust 有個語法糖 ? 可以很簡單的處理異常: fn main() -> Result<(), String> { let sdl_ctx = sdl2::init()?; let video_sys = sdl_ctx.video()?; let windows = video_sys.window("AnimalChess", WINDOW_WIDTH, WINDOW_HEIGHT) .position_centered() // .resizable() .allow_highdpi() .build().expect("could not initialize video subsystem"); let mut game = Game::new(windows, sdl_ctx.event_pump()?); game.run()?; Ok(()) }
其中 sdl2::init()? 表達了 init 可能失敗導(dǎo)致 panic ,我也不處理這個異常,直接通過 ? 扔出去。
結(jié)構(gòu)體定義
然后把 GUI 部分從 main 提取出來,封裝到 Game 類中: pub struct Game { pub chesses: [[ChessId; COL_NUM]; ROW_NUM], chesses_textures: Vec, pub role: Role, // 輪到誰下 board: Texture, canvas: WindowCanvas, event_pump: EventPump, selected_chess: Option, selected_frame: Texture, movable_pos: Vec, pub compture_turn: bool, pub compture_mv: Option, ctx: VecDeque, pub history_table: HisTblType, } if-let 表達式,結(jié)構(gòu)化綁定
其中棋子、棋盤的素材存到了 chesses_textures , board 成員中,并用 chesses 存放了棋盤內(nèi)容。 selected_chess 存的是當(dāng)前用戶點擊的棋子, movable_pos 存放的是當(dāng)前選中棋子可走的格子,當(dāng)用戶點擊棋盤的時候,可能是選中棋子,也可能是移動棋子,如下實現(xiàn): fn process_click(&mut self, pos: (i32, i32)) { if let Some(dst) = self.get_click_rect(pos) { if get_chess_role(self.chesses[dst.0][dst.1]) != self.role { // may be move if let Some(_) = self.movable_pos.iter().find(|&&mv| { return get_dst_pos(mv) == to_pos(&dst) }) { let src = self.selected_chess.unwrap(); self.move_chess(to_move(&(get_pos(src), dst))); } self.selected_chess = None; } else { // must be selected, because role is same as chess println!("selected_chess: {:?}", to_pos(&dst)); self.selected_chess = Some(to_pos(&dst)); } self.movable_pos.clear(); } }
這時候看到結(jié)構(gòu)綁定的好處了, get_click_rect 返回一個 Option<(usize, usize)> 值,將用戶的鼠標(biāo)位置轉(zhuǎn)換成棋盤的行列位置。通過 if let 語句來獲得 Some 里面的值并取出,接著進行判斷。若用戶沒有選中棋子,這可能是移動棋子,這時候通過查找 movable_pos 來判斷是否移動。
再來看一個例子: for event in self.event_pump.poll_iter() { match event { // ... Event::KeyDown { keycode: Some(keycode), .. } => { match keycode { Keycode::Escape => { break; } Keycode::U => { undo = true; } _ => {} } } Event::MouseButtonDown {x, y, ..} => { click_pos = (x, y); } _ => {} } }
結(jié)構(gòu)化綁定,可以分別取出結(jié)構(gòu)體 Event::KeyDown , Event::MouseButtonDown 對象里的成員變量: keycode , x, y 。
通過結(jié)構(gòu)化綁定,寫起來很爽。目前 C++ 17 也有了結(jié)構(gòu)化綁定,但是沒有 Rust 那么強大。對于 Option 這個表達可有的概念,C++17 也有了 std::optional 。
match 表達式
Rust 還有一個強大的語句,那就是 match ,前面例子已經(jīng)介紹過了,寫起來是這樣的。判斷棋子是否進入了對方的獸穴: pub fn check_in_den(&self, pos: POS) -> bool { let pos_ = get_pos(pos); match (get_chess_role(self.chesses[pos_.0][pos_.1]), pos) { (RED, BLACK_DEN) | (BLACK, RED_DEN) => return true, _ => { return false } } }
其中 (RED, BLACK_DEN) | (BLACK, RED_DEN) => return true 語義很清晰,如果紅色棋子進了黑色獸穴,或者黑色棋子進了紅色獸穴,則為真;其他情況為假。如果換成 if-else 語句,寫出來就很丑了。
還有 check_movable 里的判斷吃子代碼也很簡潔: match (src_chess_type, dst_chess_type) { (RAT, ELEPHANT) => ! Self::check_in_water(src), (ELEPHANT, RAT) => false, (s, d) => s <= d || self.check_in_traps(dst) } 老鼠若不在水里則能夠吃大象: (RAT, ELEPHANT) => ! Self::check_in_water(src) 大象在任何情況下都不能吃老鼠: (ELEPHANT, RAT) => false 其他場景按照大子吃小子規(guī)則,若對方在陷阱里,無視這個規(guī)則: (s, d) => s <= d || self.check_in_traps(dst)
再來看看一個例子,就是根據(jù) fen 串來初始化棋盤。fen 串是用字符串記錄了棋子在棋盤中的位置,例如初始化的 fen 串是這樣的: l5t/1d3c1/r1p1w1e/7/7/7/E1W1P1R/1C3D1/T5L ,小寫表示黑方,大寫表示紅方。一個字母表示一個棋子,如果沒有棋子,則用數(shù)字表示出相鄰連續(xù)的空位數(shù)。斗獸棋共有九行,每行都用一個字符串表示,行間使用正斜杠分割。
解析 fen 串的代碼是這樣的,很清爽: fn load_fen(&mut self, fen: &str) { let fen_u8 = fen.as_bytes(); let mut fen_idx = 0; let get_role = |c: u8| -> Role { if (c as char).is_lowercase() { BLACK } else { RED } }; let mut pos = 0usize; while fen_idx < fen_u8.len() { let mut chess_id = EMPTY; match fen_u8[fen_idx] { c @ b'e' | c @ b'E' => { chess_id = get_chess_id(get_role(c), ELEPHANT); } c @ b'l' | c @ b'L' => { chess_id = get_chess_id(get_role(c), LION); } c @ b't' | c @ b'T' => { chess_id = get_chess_id(get_role(c), TIGER); } c @ b'p' | c @ b'P' => { chess_id = get_chess_id(get_role(c), PANTHER); } c @ b'w' | c @ b'W' => { chess_id = get_chess_id(get_role(c), WOLF); } c @ b'd' | c @ b'D' => { chess_id = get_chess_id(get_role(c), DOG); } c @ b'c' | c @ b'C' => { chess_id = get_chess_id(get_role(c), CAT); } c @ b'r' | c @ b'R' => { chess_id = get_chess_id(get_role(c), RAT); } n @ b'1' ..= b'9' => { pos += (n - b'0') as usize; } b'/' => { } b' ' => { break; } _ => { unreachable!() } } if chess_id != EMPTY { self.chesses[pos / COL_NUM][pos % COL_NUM] = chess_id; pos += 1; } fen_idx += 1; } fen_idx += 1; // eat ' ' self.role = if fen_u8[fen_idx] == b'w' { RED } else { BLACK }; }
c @ b'e' | c @ b'E' => { chess_id = get_chess_id(get_role(c), ELEPHANT); } 這句表達了若為 e 或者 E ,則通過顏色來得到對應(yīng)的棋子 id ??上?Rust 目前還不支持這種寫法: c @ (b'e' | b'E') ,目前 or-patterns syntax is experimental,暫時這么寫了。
lambda 表達式 let get_role = |c: u8| -> Role { if (c as char).is_lowercase() { BLACK } else { RED } };
用 lambda 表達式封裝 get_role 來通過字符大小寫判斷紅黑色,避免重復(fù)代碼,因為這個函數(shù)只有內(nèi)部使用,沒必要封裝成一個單獨函數(shù)。
迭代器
Rust 的迭代器也很爽,目前 C++ 20 的 std::views 也簡化了這種操作,看看例子。
來看看基本走法的生成,也就是只能走十字,每次只能走一格,老鼠可以進河。 fn generate_basic_steps(&self, src: POS, to_water: bool) -> Vec { const DX: [i32; 4] = [1, 0, -1, 0]; const DY: [i32; 4] = [0, 1, 0, -1]; let src_ = get_pos(src); let (x, y) = (src_.0 as i32, src_.1 as i32); (0..4).into_iter().map(|idx| { to_move(&(get_pos(src), ((x + DX[idx]) as usize, (y + DY[idx]) as usize))) }).filter(|&mv| { let (_, dst) = get_move(mv); dst.0 < ROW_NUM && dst.1 < COL_NUM && self.check_movable(src, get_dst_pos(mv)) && (! Self::check_in_water(to_pos(&dst)) || to_water) }).collect() }
(0..4).into_iter() 生成 [0,4) 的 range,然后基于 range 做計算。
通過 idx 得到四個方向的坐標(biāo),生成(src, dst)移動向量。 .map(|idx| { to_move(&(get_pos(src), ((x + DX[idx]) as usize, (y + DY[idx]) as usize))) })
過濾四個方向,只有在范圍內(nèi)、可以吃掉對方、能過河的結(jié)果保留下來: .filter(|&mv| { let (_, dst) = get_move(mv); dst.0 < ROW_NUM && dst.1 < COL_NUM && self.check_movable(src, get_dst_pos(mv)) && (! Self::check_in_water(to_pos(&dst)) || to_water) })
接下來是獅子、老虎的走法生成: fn generate_tl_steps(&self, src: POS) -> Vec { let mut basic_steps = self.generate_basic_steps(src, false); let src_ = get_pos(src); if Self::check_at_bank(src) { // [2, 6] if (src_.0 + 2) % 4 == 0 { basic_steps.push(to_move(&(src_, ((src_.0 + 4) % 8, src_.1)))); } else { if src_.1 % 6 == 0 { basic_steps.push(to_move(&(src_, (src_.0, 3)))); } else { basic_steps.push(to_move(&(src_, (src_.0, 0)))); basic_steps.push(to_move(&(src_, (src_.0, 6)))); } } basic_steps = basic_steps.into_iter().filter(|&mv| { let (src, dst) = (get_src_pos(mv), get_dst_pos(mv)); self.check_movable(src, dst) && !self.check_rat(src, dst) }).collect() } basic_steps }
首先得到基本走法,然后生成跳河走法。最后的 filter 過濾無效的移動,例如獅子老虎跳河的時候中間不能有老鼠,對岸的棋子比自己小時。 basic_steps.into_iter().filter(|&mv| { let (src, dst) = (get_src_pos(mv), get_dst_pos(mv)); self.check_movable(src, dst) && !self.check_rat(src, dst) }).collect()
通過迭代器的 map 可以做類型轉(zhuǎn)換,從而傳參給指定類型的接口。例如 fn draw_frame(&mut self, tgt_pos: &Vec) 接口,需要的參數(shù)類型為 Vec ,可實際參數(shù)是 Vec ,通過如下轉(zhuǎn)換: fn process_selected_chess(&mut self) -> Result<(), String> { if let Some(pos) = self.selected_chess { self.draw_frame(&vec![pos])?; self.movable_pos = self.generate_steps(pos); self.draw_frame(&self.movable_pos.iter().map(|&mv| { get_dst_pos(mv) }).collect())?; } Ok(()) }
這個接口繪制選中的棋子、以及可移動的格子的框框, self.movable_pos.iter().map(|&mv| { get_dst_pos(mv) }).collect() 進行類型轉(zhuǎn)換,只保留 dst 的坐標(biāo)。
Borrow Checker
Rust 通過借用檢查來避免寫出不安全的代碼: 第一,任何借用必須位于比擁有者更小的作用域 第二,對于同一個資源( resource )的借用,即同一個作用域下,要么只有一個對資源 A 的可變引用( &mut T ),要么有 N 個不可變引用( &T ),但不能同時存在可變和不可變的引用
所以如下代碼: let mut undo = false; for event in self.event_pump.poll_iter() { match event { // ... Event::KeyDown { keycode: Some(keycode), .. } => { match keycode { Keycode::U => { undo = true; } _ => {} } } _ => {} } } if undo { self.undo_move(); if self.compture_turn { self.undo_move(); } }
不能直接寫成: for event in self.event_pump.poll_iter() { match event { // ... Event::KeyDown { keycode: Some(keycode), .. } => { match keycode { Keycode::U => { self.undo_move(); if self.compture_turn { self.undo_move(); } } _ => {} } } _ => {} } }
因為 self.event_pump.poll_iter() 拿到了 &mut self ,而 self.undo_move() 也拿到了 &mut self ,這在 Rust 是絕對不允許的。 error[E0499]: cannot borrow `*self` as mutable more than once at a time --> src/game.rs:440:33 | 433 | for event in self.event_pump.poll_iter() { | --------------------------- | | | first mutable borrow occurs here | first borrow later used here ... 440 | self.undo_move(); | ^^^^ second mutable borrow occurs here error[E0499]: cannot borrow `*self` as mutable more than once at a time --> src/game.rs:441:57 | 433 | for event in self.event_pump.poll_iter() { | --------------------------- | | | first mutable borrow occurs here | first borrow later used here ... 441 | if self.compture_turn { self.undo_move(); } | ^^^^ second mutable borrow occurs here
吐槽
開發(fā)過程還是很爽的,但是也有一些小問題,記錄在這。
cargo publish 發(fā)布包的時候,沒考慮 assets 的情況,所以 cargo install 后圖片資源沒法定位,目前沒什么好的方案,所以最好通過下載源代碼 cargo run 的形式來運行。
相對 C++來說標(biāo)準(zhǔn)庫不夠完善,很多基本接口都沒有,例如 std::collections::LinkedList 連排序接口都沒有,導(dǎo)致只能使用 Vec 這種簡單的數(shù)據(jù)類型。估計是鼓勵用第三方庫吧,畢竟 Rust 對依賴處理的很好。
標(biāo)準(zhǔn)庫里的容器沒有統(tǒng)一的 Trait ,導(dǎo)致寫不出泛型參數(shù),比如 C++會通過 begin()/end() 接口來統(tǒng)一類型,C++ 20 有 Concepts 來約束類型,而 Rust 的鏈表迭代器 Trait 都是鏈表自有的。
C++代碼是這樣: template void process(T& container) { for (auto iter = container.begin(); iter != container.end(); iter += 1) { // ... } }
Rust 寫不出來: fn process(container: &T) where T: ?? { for data in container { } }
關(guān)于內(nèi)存安全性,例如開發(fā)過程中數(shù)組越界訪問了,會導(dǎo)致 panic 然后掛掉,這應(yīng)該是最好結(jié)果。如果是 C 語言的話,數(shù)組越界訪問是不會直接掛掉,這就留下了隱患讓別有用心的人利用了。
后續(xù)
接下來要做的是繼續(xù)優(yōu)化 AI,可以考慮將 AI 模塊分離出來,抽象 Trait 接口,實現(xiàn)類似于 C++的 pImpl 模式,也就是策略模式吧。也不知道好不好做,畢竟這兩個模塊存在相互依賴的關(guān)系。
總的來說用 Rust 寫起來很舒服,結(jié)合了很多語言的優(yōu)點,從而有足夠的表達力,期待今后發(fā)展會越來越好吧。
通過這個項目也認(rèn)識到了封裝的重要性,哪怕再小的數(shù)據(jù)結(jié)構(gòu),封裝也有利于維護與演進。例如最初的坐標(biāo)是 (usize, usize) ,移動向量是 ((usize, usize), (usize, usize)) ,通過類型別名 POS 和 MOVE ,后來分別壓縮成 u8 和 u16 ,重構(gòu)后也沒出現(xiàn)過問題。
前沿探索
2020-08-20 22:48:50
https://github.com/sssooonnnggg/rslua 包含 lexer 、parser 、ast walker 。 可以用它來實現(xiàn)一些語法分析或語言轉(zhuǎn)譯功能,比如 lua to javascript,lua to typescript 等等。 寫這個項目主要用來一方面加深對 lua 源碼的理解,一方面也熟悉一下 rust 的開發(fā)流程??傮w來說,用 rust 寫代碼感覺還是比 c/c++爽一點的。
前沿探索
2020-08-20 22:48:38
比如一個 trait A,我有 A1,A2,A3 三個結(jié)構(gòu)體實現(xiàn)了 A 。然后我用一個 Vec 將 A1,A2,A3 的實例都存進去,這種情況下 Vec 里面的類型只能是 Box。然后我從 Vec 中將 A1 的實例取出來,這個時候其類型為 Box,如何判斷它就是 A1 呢?
前沿探索
2020-08-20 22:48:29
毫無引戰(zhàn)疑問,紐村最近 lockdown,于是趁機把 rust 語言編程過了一遍?,F(xiàn)在徹底抑郁了,功能很強大,但語言搞得這么難,會利于推廣嗎? 函數(shù)頭部,泛型加上生命周期加上箭頭返回值后,函數(shù)頭部甚至比函數(shù)體本身都長,易讀性太差了。一邊寫一邊查看編譯器提示,妥妥的面向編譯器編程。
真心希望開發(fā)組,可以精簡一些功能,跟 py 與 Go 好好學(xué)習(xí)學(xué)習(xí),畢竟時代不同了
前沿探索
2020-08-20 22:47:19
Rust Search Extension 是一款可以在地址欄快速搜索 Rust 文檔、crates、內(nèi)置屬性和錯誤碼等的瀏覽器插件,支持 Chrome 和 Firefox,希望能給每一個 Rust 開發(fā)者帶來便利和效率提升。
之前的文章 介紹了 0.7 版的功能,這篇文章我講介紹一下 Rust Search Extension 這一版的新功能: 支持實時搜索 top 20K 的官方 crates 支持實時搜索 Rust 官方書籍的章節(jié) Docs.rs 加強,展示每一個 crate 的 Feature flags 新的命令系統(tǒng) 支持對結(jié)果進行翻頁 支持使用 Cmd/Alt + Enter 在新標(biāo)簽頁打開搜索結(jié)果
支持實時搜索 top 20K 的官方 crates
之前的版本只支持 top 10K 的 crate,但是感覺還是不夠,所以這個版本將 crates 的索引升級到了 top 20K,應(yīng)該能滿足大家的絕大部分需求(畢竟排名靠后的 crate 大家應(yīng)該也很少會搜)。 另外之前支持在關(guān)鍵字前面拼接 ! (英文嘆號)即可只搜索 crates,有一點點不太方便的是這個結(jié)果默認(rèn)是跳轉(zhuǎn)到 crates.io ,但是我們一般更經(jīng)常想跳到 docs.rs ,所以現(xiàn)在只需要在關(guān)鍵字前面添加兩個 ! 即可!
拼接兩個嘆號,回車即可跳轉(zhuǎn) docs.rs 文檔頁面
支持實時搜索 Rust 官方書籍的章節(jié)
Rust 官方提供了很多書籍,同一個知識點或概念,在不同的書都會有提到,有時候想針對某一個概念去了解各個書是怎樣講解的,但是搜索起來非常不方便。所以這個版本我把 Rust 官方常用的書章節(jié)都索引下來了,在關(guān)鍵字前面拼接 % 即可搜索!
比如我現(xiàn)在搜索 error,看不同的書是怎樣講解 Rust 的錯誤處理的,是不是很方便! Docs.rs 加強,展示每一個 crate 的 Feature flags
Docs.rs 我們在瀏覽某個 crate 的文檔時,經(jīng)常需要了解那個 crate 有哪些 feature 開關(guān),好的 crate 會把這些 feature 在文檔首頁列出來(比如 tokio, async_std),但是大多數(shù) crate 并沒有這么好的文檔, docs.rs 目前不支持顯示這些 Feature flags,所以這個版本我就開發(fā)了這樣的一個功能。
新的命令系統(tǒng)
Rust Search Extension 已經(jīng)把地址欄變成了一個新的交互界面,通過拼接不同的符號,發(fā)揮不同的功能!但因為有好多其他小功能不適合專門提供一個前綴符號,所以我把這些功能匯總成了命令系統(tǒng),也非常簡單方便。 這個版本主要提供了五個命令,每個命令都是以 : (英文冒號)開頭,這些命令包括: :help - 顯示插件的幫助信息 :yet - 顯示 Rust 社區(qū)所有的 Are We Yet 網(wǎng)站 :book - 顯示 Rust 官方所有的書籍 :stable - 顯示 Rust 穩(wěn)定版未來一年的發(fā)布時間 :history - 顯示你本地的搜索記錄
Rust 社區(qū)維護的各種 Are we yet 網(wǎng)站
沒錯,2020 年的最后一天會發(fā)布 1.49!
Rust 官方大概提供了 20 本書!
輕松翻頁
有時候搜索出來的結(jié)果有很多條,但是瀏覽器 API 的限制,默認(rèn)只允許展示 8 條( Firefox 只有 6 條),所以這個版本增加了翻頁功能。只需要在關(guān)鍵字后面追加或刪除-(英文減號)即可往后翻或往前翻。
支持使用 Cmd/Alt + Enter 在新標(biāo)簽頁打開搜索結(jié)果
選中搜索結(jié)果之后,默認(rèn)是在當(dāng)前標(biāo)簽頁打開的,如果你想在新標(biāo)簽頁打開,只需要使用快捷鍵 Cmd/Alt + Enter 即可!
官網(wǎng)
https://rust-search-extension.now.sh 官網(wǎng)上詳細(xì)列舉了各個功能,并配備了 GIF 圖片示例。
Github
rust-search-extension 在 Github 開源( https://github.com/Folyd/rust-search-extension ),歡迎大家提 issue 或 PR !
下載地址 Chrome Web Store Firefox
前沿探索
2020-08-20 22:46:53
看了 kotlin 的協(xié)程實現(xiàn),感覺就是線程調(diào)度庫,換句話說就是偽協(xié)程,那和 Rxjava 這種東西的區(qū)別在哪呢?是切換效率更高,寫起來更簡潔嗎?還是就因為是官方欽定的
前沿探索
2020-08-20 22:46:01
身為一個用 kotlin 寫后端跟爬蟲的 Java 開發(fā),前段時間寫了個簡單的庫,擴展了一下 Iterable 添加了一個 mapMultithreading()方法,相當(dāng)于一個多線程版本的 map 方法。 雖然就一個類,24 行代碼,大家樂呵樂呵。
GitHub: https://github.com/KingFalse/harrier
Maven 倉庫: https://search.maven.org/artifact/me.kagura/harrier/1.3/jar
前沿探索
2020-08-20 22:45:50
現(xiàn)在 Kotlin Coroutine 庫已經(jīng)穩(wěn)定版本,已經(jīng)出現(xiàn)了很多采用 Coroutine 來重構(gòu)過去的 RxJava 等異步庫的實踐,比如 Retrofit 請求使用 Deferred 返回 這些 Coroutine 實踐是對異步代碼的一個調(diào)用模型的改善,callback-> stream -> sequential 的變化。對代碼可讀性進行了改善。
而 協(xié)程 這個概念還有另一個意圖,就是減少線程切換開支,在同一個線程里進行 IO 操作,比如 Python Async 用于爬蟲的并發(fā) Http 請求方面,在同時發(fā)起巨大數(shù)量的 Http 請求時,可以創(chuàng)建的協(xié)程數(shù)量遠遠高于線程,在同樣數(shù)量的并發(fā)情況下,降低內(nèi)存的用量和線程的切換開銷(實際并沒有提高速度,IO 速度才是瓶頸), Python 協(xié)程這一特點,得益于“異步 io ”: asyncio,如果使用 requests.get() 這種阻塞請求,是達不到效果的。
回到 Kotlin 的協(xié)程,它加入了多線程切換,也就是調(diào)度器會把協(xié)程分發(fā)到不同的線程去跑,這個特性非常好,使用協(xié)程也利用了多線程。但問題是,Kotlin 現(xiàn)在沒有 “ asyncio ” 這樣的機制,也就是說,我沒辦法在一個線程內(nèi)發(fā)起 n 個協(xié)程進行并發(fā) n 個請求,若然,并發(fā)其實也是多線程的,也會占很大的線程資源。
所以我的問題是 Kotlin Coroutine 偏向于解決異步編碼模型,而不是異步 io 資源的利用效率;而 Python asynio 則偏向于解決異步 io 資源的利用效率( GIL 的存在)?(或許我應(yīng)該對比 JavaScript? :D)
前沿探索
2020-08-20 22:45:20
發(fā)在 Stackoverflow 上了: stackoverflow.com/questions/54043705/kotlin-always-tells-me-kotlinreflectionnotsupportederror
求幫忙 QwQ 非常感謝(
前沿探索
2020-08-20 22:44:45
[亞洲創(chuàng)新集團]致力于成為全球最大的移動社交娛樂平臺,我們擁有中國的技術(shù)團隊,輸出全球性的產(chǎn)品;包括來自于谷歌,騰訊,Zynga,百度,阿里巴巴等經(jīng)驗豐富的管理團隊,2017 年集團收入突破 10 億元。目前在全球 12 個地區(qū)設(shè)立分支機構(gòu),超 500 人的國際化專業(yè)團隊正在本土耕耘,包括北京,臺北,香港,首爾,東京,洛杉磯,胡志明,開羅,卡薩布蘭卡,吉隆坡,雅加達和曼谷等。 產(chǎn)品包括:Uplive:中國之外最大的國際直播社交平臺 超級星飯團:No.1 追星平臺 GIFTO: 世界上第一個大規(guī)模應(yīng)用級區(qū)塊鏈項目 游戲:高轉(zhuǎn)化率的 H5 游戲
[招聘] 高級 Android 工程師 職位描述: 負(fù)責(zé) Android 產(chǎn)品的詳細(xì)設(shè)計,構(gòu)架設(shè)計以及開發(fā)工作 根據(jù)項目任務(wù)計劃按時完成軟件編碼和單元測試工作 按照開發(fā)流程編寫相應(yīng)模塊的設(shè)計文檔 解決研發(fā)過程中的關(guān)鍵問題和技術(shù)難題 協(xié)助 leader 保證研發(fā)工作的質(zhì)量和進度 任職資格: 本科或以上學(xué)歷,計算機軟件、通訊、數(shù)學(xué)相關(guān)專業(yè)優(yōu)先 5 年工作經(jīng)驗以上,之前的職位從事過移動端架構(gòu)師 精通 Android 應(yīng)用軟件的編程架構(gòu);熟練使用 Android Studio 等 Android 軟件開發(fā)工具 精通 Android 各類 UI 組件、圖像動畫、網(wǎng)絡(luò)、文件系統(tǒng)等模塊的使用和開發(fā) 思路清晰,思維敏捷,快速的學(xué)習(xí)能力,良好的英文資料閱讀能力;能獨立開展各項工作,并承受工作壓力 有熱情,有良好的計劃、溝通、組織協(xié)調(diào)能力、語言表達能力; 較強的邏輯分析能力和應(yīng)變能力;良好的團隊合作精神 有 Scrum 敏捷開發(fā)經(jīng)驗優(yōu)先
哈哈哈,俺們家現(xiàn)在旗艦產(chǎn)品是海外直播哦,還有最新的區(qū)塊鏈產(chǎn)品和技術(shù)氛圍~ 團隊 leader 人技術(shù)強悍,人 nice,不啰嗦的護犢子~ 福利超贊,新人餐,每個月團建,每周茶話會,每日水果酸奶, 每周各種健身福利,從周一嗨到周四~
投遞郵箱: [email?protected]
郵件主題:應(yīng)聘崗位+姓名+來自 V2EX,例如"應(yīng)聘 android 工程師 + 姓名+ 來自 v2ex"
北京地址:朝陽區(qū)工體北路 4 號機電院 10 號樓 2 層(科技寺 loft 店) [三里屯北京美女聚集地] 地鐵:10 號線 團結(jié)湖站 D 口出
全職薪資:20k - 40k 官網(wǎng): http://www.asiainnovations.com 更多職位 pc 端: https://app.mokahr.com/apply/asiainnovations 移動端職位鏈接: https://app.mokahr.com/m/apply/asiainnovations
前沿探索
2020-08-20 22:44:14
Kotlin 已經(jīng)作為 Android 開發(fā)官網(wǎng)推薦語言,Kotlin 語言簡潔,高效,很值得學(xué)習(xí)。通過本文您將能夠掌握 Kotlin 基礎(chǔ)知識,以及開發(fā)常用到的知識點,能夠讓你快人一步。
kotlin 快速入門教程
本場 Chat 主要內(nèi)容如下: Kotlin 的歷史及趨勢 Kotlin 基礎(chǔ)類型 Kotlin 類及多態(tài)介紹 Kotlin 高級用法 使用 Kotlin 進行 Android 開發(fā)介紹 總結(jié)
kotlin 快速入門教程
前沿探索
2020-08-20 22:43:58
最近寫了一篇比較符合大眾開發(fā)者口味的文章,討論如何升級 .NET 里的 IEnumerable 來實現(xiàn)更高效的、進行枚舉的泛型方法。
緣起這篇 StackOverflow 問題 ,博客文章是 這里 。
文章介紹了背景知識——C# 的顯式接口實現(xiàn)、 foreach 的 duck typing 、泛型約束,引出一個自然的問題(也就是 StackOverflow 上的):在知道 IEnumerable 更具體的靜態(tài)類型 TEnumerable 的約束泛型方法里 foreach 可以利用到 TEnumerable 里面的枚舉器嗎?
答案是不行,因為泛型方法不是 C++ 模板,它總是選擇 IEnumerable 的枚舉器,即使 TEnumerable 隱藏了 IEnumerable 且有另一個可見的枚舉方法。 泛型方法的實例化 != 把類型代入后復(fù)制方法體得到的非泛型方法。
解法也很簡單,只要告訴編譯器這個 TEnumerable 返回的枚舉器的具體類型就可以了。文章提出了把 IEnumerable 以一種向后兼容的方式升級 的方法,類似于從 IEnumerable 升級到 IEnumerable
前沿探索
2020-08-20 22:43:14
利用兩個線程同時播放兩個音頻文件,一個輸出左聲道,一個輸出右聲道。deviceBuf.secondBuf = new Microsoft.DirectX.DirectSound.SecondaryBuffer(musicPath, deviceBuf.device); Microsoft.DirectX.DirectSound.BufferDescription buffDes = new Microsoft.DirectX.DirectSound.BufferDescription(); buffDes.GlobalFocus = true;//設(shè)置緩沖區(qū)全局獲取焦點 buffDes.ControlVolume = true;//指明緩沖區(qū)可以控制聲音 buffDes.ControlPan = true;//指明緩沖區(qū)可以控制聲道平衡 deviceBuf.secondBuf = new Microsoft.DirectX.DirectSound.SecondaryBuffer(musicPath, buffDes ,deviceBuf.device); //創(chuàng)建輔助緩沖區(qū) deviceBuf.secondBuf.Pan = Convert.ToInt32(Microsoft.DirectX.DirectSound.Pan.Left); 但是會有混音的情況。有大佬知道什么情況么?
前沿探索
2020-08-20 22:43:06
順便,C# void List.Add() 怎么搞成鏈?zhǔn)秸{(diào)用?若要自己寫擴展方法有什么好的實踐?
前沿探索
2020-08-20 22:42:55
有 java 基礎(chǔ),了解 web 。
想學(xué)習(xí) c#做一些桌面程序的小工具,請大伙推薦一下,謝謝
前沿探索
2020-08-20 22:42:48
如題 初學(xué) c#語言,想用 C#語言實現(xiàn)一個泛型類型單鏈表 有如下代碼:
class LinkedList { public Node Head; public Anytype getFirst () { return this.Head?.Data; }
}
在 getFirst 方法中,我使用了?.操作符,出現(xiàn)了如下錯誤: "運算符“?”無法應(yīng)用于“Anytype”類型的操作數(shù)", 我找不到為什么這里不能使用這個操作符的原因,是因為 Node 是泛型類型的原因嗎? 煩請前輩解答。
前沿探索
2020-08-20 22:42:38
本科 18 年畢業(yè)后,入職一家所謂有嵌入式崗位的公司。誰知沒有研發(fā),純電池測試+售后調(diào)試。工作接近兩年,單片機并沒有用到,自己接觸了點。C#做過二次開發(fā),找到位置增加分析報文代碼并顯示。對電池的軟硬件表面原理和功能挺了解??墒菍懘a念念不忘,一直徘徊,想轉(zhuǎn) c#,也沒經(jīng)驗。學(xué)過幾門語言,停留在簡單操作數(shù)據(jù)庫水平。郁悶?zāi)亍?/div>
前沿探索
2020-08-20 22:42:22
從微軟的文檔 更新統(tǒng)計信息 看到了個 數(shù)據(jù)庫腳本
然后想看下啥效果,在本地電腦上跑了個預(yù)估執(zhí)行(純手賤)。結(jié)果電腦無響應(yīng),強制重啟。。。
想問下各位大佬,預(yù)估執(zhí)行這個腳本有影響嗎?我看事件日志好像導(dǎo)入了幾個 dll ( xpsqlbot.dll 、xpstar.dll 啥的)
前沿探索
2020-08-20 22:41:59
新手 最近學(xué)了下.netcore 想用 blazor 做個解析 plist 文件的網(wǎng)站練手,遇見了一個小問題,代碼如下圖 下面是報錯 下面是子組件 實在不知怎么做了 求指教!謝謝大家
前沿探索
2020-08-20 22:41:53
大多 ini 文件的操作類,都是要求 ini 文件必須單行,不允許換行和多行值。
python 中有 configobj 庫,操作 ini 文件,允許換行多行,而且添加刪除節(jié)點和配置項之后,原來各個配置項和節(jié)點的位置保持不變。
不知道 c#有沒有這樣現(xiàn)成的操作類,請推薦!謝謝!
前沿探索
2020-08-20 22:41:44
因為工作原因,經(jīng)常會去互站這些源碼網(wǎng)站看看,現(xiàn)在又有哪些奇葩的軟件需求,研究過這些需求,我會第一時間去 github 去搜一下,看是否已經(jīng)有人實現(xiàn)并且開源了,結(jié)果互站上哪些大大的需求 github 都能找到對應(yīng)的開源項目。很多項目質(zhì)量還很高,可以直接拿來用或者在開源的基礎(chǔ)上定制開發(fā)也很方便。做為技術(shù)人員其實除了工作,業(yè)余時間完全可以做點別的項目,如果不小心有了一些用戶,有正經(jīng)的現(xiàn)金流是不是也很香。如果自己不知道做什么,不要緊,完全可以去互站這些網(wǎng)站看看,上面有各種各樣的需求,很多需求你可能以前從來不了解,沒接觸過,你也可以加上客戶,聊一下,去套辭,說不定從此就打開了新世界的大門。
前沿探索
2020-08-20 22:41:30
練習(xí)排序的的時候 看到了個彪悍的排序 復(fù)制試了下
我忍不住笑了
原文在這里 https://www.shizuri.net/programming/SleepSort-C.html
前沿探索
2020-08-20 22:41:07
比如 python 中,list1 = ['abc', 'blas', 'dsl'],
要將每個元素的第一個字符變成大寫 list2 = ['Abc', 'Blas', 'Dsl'],
只需要如下操作即可:
list2 = [x[0].upper() + x[1:] for x in list1]
請問 c#里是否也有類似簡潔明了的語法來實現(xiàn)?多謝!
前沿探索
2020-08-20 22:40:59
對于 vscode 的親兒子 ts 只要 /**注釋*/ let a=1
然后在鼠標(biāo)移動到任何使用 a 變量的地方,都能提示這個變量是什么 那么 lua 有相關(guān)插件或者設(shè)置嗎? 嘗試了 -- 和 --[[]] 都沒用類似 ts 的效果 不知道有沒有大牛研究過這個問題 或者推薦一款能顯示注釋的 ide
前沿探索
2020-08-20 22:40:19
本人是做 web 后端開發(fā)的,主要語言是 php,前段時間玩過一下 openresty,感覺配合 lua 可以做不少功能,自己實現(xiàn)過軟防火墻(配合 redis)和實時統(tǒng)計設(shè)備在線狀態(tài)(配合 redis),在 redis 里面使用 lua 還可以保證操作的原子性,想深入學(xué)習(xí)下 lua,大家覺得 lua 的前景如何,值得深入學(xué)習(xí)嗎?
前沿探索
2020-08-20 22:39:53
背景 出于各種業(yè)務(wù) /硬件 /軟件博弈, 最終不得不面對... 局網(wǎng)中一臺 Linux mini 主機 接入多路 web cam. 由 FFmpeg 采集視頻為幀圖片編號輸出到硬盤 -f image2 frames/%05d.jpg 類似參數(shù)控制輸出 另外主機用 Electron 開發(fā)控制客戶端 需要拿到實時圖像, 以便形成監(jiān)察視頻, 要求盡可能延時小 頁面刷新 15fps 以上即可 但是, 從 Linux 到控制端, 延時得盡可能小
分析 從硬件到展示延時盡可能小 就不能走標(biāo)準(zhǔn)流媒體協(xié)議了 無論什么協(xié)議都得先視頻->流化->廣播->接收->解碼(專用)->展示 特別是有的適用許可證約束只能走外網(wǎng)免費服務(wù), 延時隨便就超過 10 秒... 注意到有很多視頻廣播技術(shù)其實是 偽視頻 : 服務(wù)端持續(xù)更新約定圖片 客戶端反復(fù)通過 HTTP 拿到包含新內(nèi)容圖片 在 HMTL 頁面反復(fù)加載 形成原始意義實時電影 問題在: FFmpeg 是按序列號約定自動變化圖片名輸出到指定目錄 遠程 JS 想拿到最新一幀圖片 首先要知道最新圖片名, 才能發(fā)起請求
設(shè)想 功能服務(wù) 用 Python 可以快速完成一個 API 服務(wù) 提供接口, 比如: /frame/last 反饋最新一幀圖片名 然后從 Nginx 發(fā)布靜態(tài)目錄下載 但是, 這樣消耗兩次 HTTP 請求時間 ngx_lua 應(yīng)用 用 OpenResty 加載一 lua 功能腳本 提供接口, 比如: /frame/last 反饋最新一幀圖片內(nèi)容 將兩次請求變成一次 但是, 這要求 lua 進行實時同步文件操作 不知是否合理 以及具體系統(tǒng)損耗如何
討論
或是有其它更加優(yōu)雅方案?
感謝大家任何建議.
前沿探索
2020-08-20 22:39:31
我登錄后臺頁面的時候報錯:
POST http://10.0.0.1/cgi-bin/luci/;stok=/login?form=login
出錯: /usr/lib/lua/luci/dispatcher.lua:473: Failed to execute call dispatcher target for entry '/login'. The called action terminated with an exception: /usr/lib/lua/luci/sauth.lua:106: Session data invalid! stack traceback: [C]: in function 'assert' /usr/lib/lua/luci/dispatcher.lua:473: in function 'dispatch' /usr/lib/lua/luci/dispatcher.lua:200: in function
TP-Link 型號:TL-ER3220G
前沿探索
2020-08-20 22:39:25
基于 lua coroutine 系統(tǒng)性地講述協(xié)程在表達邏輯方面的能力https://zhuanlan.zhihu.com/p/47211041
前沿探索
2020-08-20 22:39:14
聽說過 openresty,最近想學(xué)下, 所以想用 lua 來做一些腳本之類的,不是 lua 的標(biāo)準(zhǔn)庫好像太弱了呀,相比 python
前沿探索
2020-08-20 22:39:07
最近接觸了下 openresty(lua),想弄點自己的功能,但遇到小問題:
local myPosition = string.find(myStr, myValue) --查找字符所在位置 string.sub(myStr, myPosition) --取出找到的字符以及之后的字符串
PS : myValue 可能是任何字符串(有可能是字母數(shù)特殊符號和中文的混合字符串), string.find 這函數(shù)沒法直接查找,得要各種轉(zhuǎn)義,非常蛋疼。
想問一下還能有什么 lua 能高效的實現(xiàn) php strstr() 功能的方法?
前沿探索
2020-08-20 22:38:49
目前是 unity 游戲開發(fā),現(xiàn)在項目要做熱更新,基本就是用 C# + Lua ,用 lua 做熱更新。但是在開發(fā)過程中并沒有發(fā)現(xiàn)特別好的 lua 的 IDE 。目前用過 VS2015 有關(guān)于 lua 的插件,但是代碼提示、錯誤監(jiān)測以及調(diào)試都不給力。然后也用過 Sublime Text 3 也是一樣的問題。
請問各位 V 友有沒有好的 Lua 的 IDE 推薦,能夠有代碼提示和像 VS 一樣的錯誤監(jiān)測(比如拼錯了變量能夠紅色的下劃線提示),斷點調(diào)試有更好,沒有也不強求。
前沿探索
2020-08-20 22:38:37
或許是因為 Lua 真的太簡潔了,所以很多在其他語言里作為標(biāo)準(zhǔn)庫一部分的功能,在 Lua 里都需要自己寫。比如: 將一個字符串用空格切割成 table 檢查一個元素是否存在于 table 中 ……
所以我比較好奇的是,目前是否有什么比較好的 Lua 庫,可以引入之后用來解決這些最常見的問題?
前沿探索
2020-08-20 22:38:22