這是為類的方法寫的裝飾器函數(shù) function autoSave (_target: BookmarkModel, _name: string, descriptor: PropertyDescriptor): PropertyDescriptor { const value = descriptor.value descriptor.value = function (...args: never): boolean { const ret = value.apply(this, args) if (ret === true) { this.save() } return ret } return descriptor }
代碼強行執(zhí)行是完全 OK 的,但是 this.save()這行報個錯:
類型“PropertyDescriptor”上不存在屬性“save”。
this.save()實際就是執(zhí)行類實例上的 save 方法完全沒問題,但現(xiàn)在這樣我就很懵,怎么解決
segmentfault - typescript 里怎么合并枚舉 enum 國內(nèi)有這個問題, 但目前沒有答案, stackoverflow 搜關鍵字沒搜到想要的... enum Vertical { Up = "up", Down = "down" } enum Horizon { Left = "left", Right = "right" } // 如果 enum 的值是默認的從零自增的數(shù)字 // 那合并確實會出錯, Vertical.Up = 0 = Horizon.Left // 可是這兒是字符, 且我手動管理不讓其沖突, ts 也不允許嗎? const Dir = Vertical | Horizon
最近在看 nestjs,js 寫多了之后代碼風格野慣了,再看 ts 好難受。為什么 ts 現(xiàn)在依然還有那么多追捧的
—— 大道至簡, 返璞歸真.
前言
在發(fā)表這篇博文的前夕, 還有一些小伙伴在提問一些以下相關的問題: 性能怎么樣? 是否容易上手? 開發(fā)目標在哪? 如何反饋問題? 對比行業(yè)內(nèi)的 lua 開源項目有何優(yōu)勢?
等等, 以上問題會在本文中一一介紹.
CF 的起因
首先來聊聊情懷這個東西! 相信每一個行業(yè)內(nèi)的從業(yè)者都或多或少有過一個夢, 這個夢叫做: "我到時候要開發(fā)一個 XXX"!其實作者當初也是一樣.
每當半夜(凌晨)在加班、看文檔、調(diào)試的時候, 總會搜索到一些幾年前或十幾年前的框架或入門 demo。例如: tinyhttp , 鏈接的源碼是一些同學 fork 的鏡像站。
每次看到這些內(nèi)容或多或少都會激起心中那一絲絲快熄滅的熱情, 也許這就是最后對技術的渴望?
就是在動手創(chuàng)建項目之前還反復問過自己是否要做? 能堅持下去么?也許被噴都是一種奢望?
在心里一一回答了這些問題后, 在 2018 年末創(chuàng)建了 本項目 .
說句實話! 一個網(wǎng)絡開發(fā)框架最難的不是實現(xiàn)某個功能, 而是從零開始一步一步添磚加瓦的造輪子!
作為一個網(wǎng)絡開發(fā)框架, 最重要的兩個功能肯定是需要的! 定時器庫、事件驅(qū)動庫. 如何抉擇?選項有 2 個: libev / libuv . libev 成熟穩(wěn)定、輕量級、unix like 支持、容易嵌入; libuv 比 libev 更加優(yōu)秀,增加了許多功能(線程池、信號、同步、鎖等等),封裝更加完善, 并且增加了 windows 支持;
從 cf 框架開發(fā)之初選型來看, libuv 絕對是目前最優(yōu)解. 但是作者偏偏選擇了 libev. 也從此開始, 艱辛的底層開發(fā)之路就此展開.
首先, 作者不讓使用者 C/C++進行實際業(yè)務開發(fā)! 這樣做會讓使用者有較高的開發(fā)成本與學習成本, 而選擇一門較好的腳本語言就顯得尤為重要.
作者對 Lua 還算是稍微熟悉一點, 所以就選了 Lua 作為業(yè)務腳本語言。至于 Lua 語言的優(yōu)勢這里就不說了, 網(wǎng)上大把文章夸它的.
現(xiàn)在既然腳本語言已經(jīng)選定, 那么就開始寫代碼吧! Let's Lua.
CF 的編寫之路
1. 網(wǎng)絡層
首先, 我們來看一段 C 封裝給 Lua 調(diào)用的 API 代碼: LUAMOD_API int luaopen_tcp(lua_State *L){ luaL_checkversion(L); /* 添加 SSL 支持 */ SSL_library_init(); SSL_load_error_strings(); // CRYPTO_set_mem_functions(xmalloc, xrealloc, xfree); // OpenSSL_add_ssl_algorithms(); /* 添加 SSL 支持 */ luaL_newmetatable(L, "__TCP__"); lua_pushstring (L, "__index"); lua_pushvalue(L, -2); lua_rawset(L, -3); lua_pushliteral(L, "__mode"); lua_pushliteral(L, "kv"); lua_rawset(L, -3); luaL_Reg tcp_libs[] = { {"read", tcp_read}, {"write", tcp_write}, {"ssl_read", tcp_sslread}, {"ssl_write", tcp_sslwrite}, {"stop", tcp_stop}, {"start", tcp_start}, {"close", tcp_close}, {"listen", tcp_listen}, {"connect", tcp_connect}, {"ssl_connect", tcp_sslconnect}, {"new", tcp_new}, {"new_ssl", ssl_new}, {"free_ssl", ssl_free}, {"new_server_fd", new_server_fd}, {"new_client_fd", new_client_fd}, {NULL, NULL} }; luaL_setfuncs(L, tcp_libs, 0); luaL_newlib(L, tcp_libs); return 1; }
以上是 TCP 實現(xiàn)的 C 代碼的片段, 有興趣閱讀源碼的小伙伴請點擊 這里 ;
眾所周知 Lua 沒有原生的 Socket. 那么就需要框架編寫者自己抽象底層邏輯重新實現(xiàn)一套 API.
簡單的封裝 Lua C 庫誰都會, 而且也算不上是什么難事. 但是我們的目的是將底層同步阻塞 Socket hook 為非阻塞, 這時候難點就來了!
大家都知道 libev 是基于 react 模型的事件驅(qū)動網(wǎng)絡庫, 所有注冊事件后的業(yè)務邏輯都是以回調(diào)的形式觸發(fā). 那不就變成 node-lua 代碼了嗎?(笑)
這時候, 作者想了個點子來解決這個問題! 執(zhí)行流程如下: 每次需要做一些同步操作的時候, 就調(diào)用 C API 注冊回調(diào)事件. 為當前注冊的所有事件創(chuàng)建一個 Lua 協(xié)程保存上下文并讓出當前協(xié)程執(zhí)行權. 等到注冊事件被觸發(fā)后, 調(diào)用 C API 恢復協(xié)程繼續(xù)執(zhí)行.
簡單來說就是將 C 層次的異步回調(diào)邏輯封裝為 Lua 層的同步非阻塞, 保證不因為 IO 問題阻塞線程.
下面提供一段 socket 同步非阻塞的偽代碼, 經(jīng)供參考: function TCP:recv(bytes) local current_co = co_self() self.read_co = read_ev(function() -- do action -- stop timer_ev -- wakeup(current_co) 恢復執(zhí)行權 end) self.timer_co = self.timer_ev(function() -- do action -- stop read_ev -- wakeup(current_co) 恢復執(zhí)行權 end) tcp_start(io, EV_READ, self.read_co) timer_start(timer, 3 秒超時, self.timer_co) return co_yield() -- 讓出執(zhí)行權 end
一個 Lua 版的 Socket EV_READ 偽代碼大致的處理流程如上, 想看實際處理邏輯請看 這里 。
同理, Socket write/connect/listen 等等 API 直接照抄就行(UDP 也大同小異). (其實這里有個小插曲就是 SSL SOCKET 的坑, 但是由于篇幅問題就不說了.)
細心的小伙伴可能發(fā)現(xiàn)代碼同時注冊了 Socket 與 Timer 事件, Socket 非阻塞操作不能解決 read 與 connect 超時的問題. 所以 cf 框架干脆就封裝徹底一點.
至此, Socket 算是已經(jīng)算是基本 hook 與封裝完成了. 接下來就可以開始寫應用層協(xié)議了.
2. 應用層協(xié)議
現(xiàn)在 Socket 終于能正常使用了, 那么面臨的新問題就又來了。
libev 沒有自帶異步 dns
dns 都還需要使用者自己封裝, 這個坑真是填的無比難受! 好在網(wǎng)絡上有前輩實現(xiàn)了 Lua 版的異步 dns, 作者稍微看明白之后就借用了過來封裝內(nèi)部使用.
這樣 cf 也算是有了深度定制的 異步 dns 庫了吧!(雖然并不完善, 但是足夠使用)
一個網(wǎng)絡庫是否流行, 基本上就得看生態(tài). 那么協(xié)議層的輪子又得造起來: httpd 與 httpc mail mysql redis mqtt websocket
其中一些協(xié)議為各位前輩那邊借過來適配后定制的, 簡單的協(xié)議則是直接花 1-2 小時直接手寫出來的。
3. 封裝與易用性
為了不讓 API 那么封閉與提升 cf 的可用性, 作者決定將 mysql 與 redis 進行初步封裝.
封裝包括大家常用的功能, 連接池、面向?qū)ο蟛僮鳌o需手動管理 session 生命周期等等. 簡化編程思想包袱來提升開發(fā)效率.
至于內(nèi)部 Socket 更是讓框架來解決釋放問題確保文件描述數(shù)量限制的情況下也是可以正常使用. (其實是不喜歡依賴 gc 被動 close fd 與 free 內(nèi)存)
CF 是啥?
如果你耐心看完了第一部分介紹, 那么你就應該對 cf 有了一個大概的了解.
cf 全稱為: CoreFramework, 是一個基于 libev 的 Lua 網(wǎng)絡開發(fā)框架. 在其內(nèi)部實現(xiàn)了多種網(wǎng)絡協(xié)議與第三方庫用來幫助使用者進行項目原型的快速開發(fā).
cf 在 httpd 使用上尊崇前、后端分離的解決方案, 僅實現(xiàn)了基本的 view 路由并且不支持 rest 風格的 API 路由. 雖然這樣可能會引來宇多人的詬病.
cf 的 httpd 內(nèi)嵌 websocket 支持, 方便使用者在復用端口的同時也可以享受長連接編寫的樂趣.
更多的介紹, 請大家項目地址的 Wiki
CF 能做什么? 基于容器技術的微服務場景(swarm/kubernetes); —— 推薦 游戲服務器的前端代理層; —— 推薦 內(nèi)存 /CPU 資源較為緊缺的云服務器; —— 推薦 對性能要求較高的無狀態(tài)集群; —— 推薦 海量長連接(websocket)Agent 集群; —— 推薦
CF 使用到的技術棧?
傳輸層: TCP/UDP
會話層: SSL Client 支持
協(xié)議層: dns/webocket/http/mqtt/redis/mysql/smtp
工具庫: Timer/TASK
第三方庫: Libev、openssl/libressl、lua-5.3、jemalloc/tcmalloc(可選)
CF 如何安裝?
cf 目前支持絕大部分 Unix like 操作系統(tǒng), 作者是在 Mac 上進行開發(fā), 所以 Mac 支持是必須的.
cf 測試的 Linux 為 Centos, 所以基本上基于 Linux 內(nèi)核的操作系統(tǒng)編譯后的運行也沒什么問題(export 增加 /usr/local/lib)
同時,作者還貼心的為大家做了一個簡單 Dockerfile. 文件在項目根目錄下, 大家下載直接使用即可。
當然, 如果你不想制作 Dockerfile,也可以使用 Docker 命令直接拉去作者制作好放在 docker hub 的鏡像. candymi/cfweb
使用詳情與使用方法請參考 Docker 安裝 和 編譯安裝
CF 如何運行呢?
測試運行
bash#: ./cfadmin
后臺運行
bash#: ./cfadmin
退出
killall cfadmin
ctrl + c
文檔在哪?
作者為大家貼心的寫了一篇詳細到不能再詳細的 文檔 , 以此來獲取大家的點贊與關注.
作者還為喜歡閱讀源碼的同學準備了充足的中文注釋與英文注釋, 結(jié)合起來方便大家快速了解 CF 工作方式(中 /英注釋結(jié)合易于理解一些專屬詞匯).
回答之前的問題:
Q. 性能怎么樣? A. 性能還不錯, 但是具體數(shù)值請自行測試.
Q. 是否容易上手? A. 學習 lua 一小時入門 -> cf 一小時入門
Q. 開這個項目的初衷是什么? A. 其實在前面已經(jīng)回答過了.
Q. 開發(fā)目標在哪? A. Wiki 里有 TODO 項
Q. 如何反饋問題? A. Wiki 里有 Q & A 項
Q. 對比行業(yè)內(nèi)的 lua 開源項目有何優(yōu)勢? A. CF 對比其它 lua 開發(fā)項目更深入改變用戶使用習慣! 簡化框架上手難度, 將框架都黑盒子透明化. 無需學習復雜的設計模式與理念.
Q. CF 的開發(fā)理念是什么? A. CF 項目的目標不是競爭, 而是明白明白簡單為美. 當你習慣了它, 也許你就會上癮.
使用示例 容器部署 Dockerfile 快速構(gòu)建開發(fā)環(huán)境 cf k8s 中的應用示例 cf web 的初始化與使用 cf web Websocket 應用指南 cf web 中間件開發(fā)指南
精彩截圖
希望
也許你正在使用其它開發(fā)框架, 但是這不妨礙你對 cf 的督促.
也許你正在試用它, 這不妨礙你與作者溝通你的想法.
也許你正在吐槽它的缺點,請來 issue 盡情吐槽.
文檔與地址
項目文檔
項目地址
通過 nginx_lua 寫了一些接口用來返回 json
發(fā)現(xiàn)有時候接口訪問失敗 有一定幾率 500
lua 里有 mysql 操作 并且 content_by_lua_file a.lua
這個 a.lua 開頭有 dofile()
dofile 的 lua 文件里申明了一些全局變量
怎么解這個坑?
大概流程是這樣
web 應用層,
md5(IP.文件路徑.其他固定信息如 UA 啥的) 存進 redis ,并作為 url 中的 hash 。
nginx 里, ngx.md5(IP.文件路徑.其他固定信息如 UA 啥的)對比連接中的 hash 并讀取 redis 查到時間戳。
判斷時間戳是否失效。
現(xiàn)在想吧 UID 也放進去,不知道有什么好方法能做到避免偽造和驗證用戶是否登錄。只有給 nginx+lua 寫 cookie+session 來驗證嗎?
nginx.lua 上面不方便讀 MySQL 數(shù)據(jù)庫的~~.
謝謝諸位,
在網(wǎng)上就找到了一篇 https://blog.csdn.net/miapecloud/article/details/97106811
但是在機器在重啟之后就變了,想問下還有其他方法可以實現(xiàn)這個嗎?
目前想到可能實現(xiàn)的方案有在啟動的時候先過去宿主機的唯一標識,然后再傳遞到 docker 里面使用。
還有更加優(yōu)雅的方案嗎?
當虛擬機剛啟動的時候,可以看到 docker0 的網(wǎng)卡信息如下: docker0: flags=4099 mtu 1500 inet 172.17.0.1 netmask 255.255.255.0 broadcast 172.17.0.255 ether 02:42:95:d9:47:e8 txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
然后將虛擬機掛起后,網(wǎng)卡信息舊缺少了 ipv4 的信息: docker0: flags=4099 mtu 1500 ether 02:42:95:d9:47:e8 txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
已經(jīng)嘗試過修改 /etc/sysctl.conf ,添加 net.ipv4.ip_forward=1 ,和 修改 NetManager 的配置 。可是都不行,可能是系統(tǒng)版本不對。 請問有老哥知道怎么解決這個問題嗎?
系統(tǒng)是 ubuntu20.04 ,docker 版本是 19.03.12
如題,最近剛?cè)腴T docker,發(fā)現(xiàn)好像不能在容器內(nèi)復制粘貼(用慣了 ctrl+insert 的我不知所措),上網(wǎng)搜了一下,都在講 vim 怎么使用復制粘貼,感覺不太相干,有沒有人可以解答一下呢?~喵喵喵
Docker-Env-Server
這是一個基于 Docker 的一鍵環(huán)境配置,同時把 Docker 內(nèi)的命令映射到操作系統(tǒng)中,和本機安裝的操作保持一致,只要 Docker-Compose 起來以后,就可以當做是在本機安裝的一樣了,操作方便很多。
Git 項目地址: Docker-Env-Service
講一下起因 “潔癖”,不想在本機裝太多東西,升級啥的容易亂掉。 幫同事配置時,發(fā)現(xiàn)其對環(huán)境不熟,看不同的教程,同時裝了多個版本,找到在用那個太費事了
當然,這些并不是我解決的,是 Docker 解決了,我只是做了一些微小的工作。
這個想法有了很久了,一開始就想整理成項目發(fā)出來可一直覺得做的不好,就自己湊合用了,
昨天看了《 個人項目還差一點就全部完成了,然而這一個多月一點沒動... 》、《 聊聊“個人項目越往后越拖延”這個現(xiàn)象和我的“藥” 》
特別是第二貼,我認為這個藥有用,于是這兩天就整理了一下代碼,重新建了個倉庫,希望大家可以指導一二。
這兩種設置都能實現(xiàn)轉(zhuǎn)發(fā)用戶請求的功能,并且瀏覽器地址隱藏轉(zhuǎn)發(fā)的實際地址
我很奇怪這種轉(zhuǎn)發(fā)是不是會消耗 nginx 本身服務器的流量,比如用戶請求到了 nginx 服務器,nginx 服務器自己去拉去轉(zhuǎn)發(fā)地址的內(nèi)容,然后響應給用戶?
最近學著架了個網(wǎng)站,不太熟悉 nginx 語法,想請教下各位,如果要除開某個頁面做重定向應該怎么寫?例如除了頁面“https://域名 a/abc”,把域名 a 下面所有鏈接都重定向到域名 b 。
代碼如下: template
class LargestTypeT; template class LargestTypeT { private: using First = Front; using Rest = typename LargestTypeT>::Type; public: using Type = IfThenElse<(sizeof(First) >= sizeof(Rest)), First, Rest>; }; template <> class LargestTypeT> { public: using Type = char; }; template using LargestType = typename LargestTypeT::Type;
在類 LargestTypeT 中 Type 的聲明順序是晚于 First 和 Rest 的,但是 Rest 可以成功成為 LargestTypeT>::Type 的別名呢(盡管 Type 在 Rest 之后聲明)。我也嘗試調(diào)換 private 和 public 的順序(先聲明 Type, 再聲明 First,Rest)這樣的話編譯器就會報錯( First and Rest are not declared )。我很好奇為什么 Type 類型可以先使用后聲明呢,是不是跟模板展開有關?
我想用 thread 并發(fā)處理 for 循環(huán),但總是 join 放在循環(huán)外就會出錯,是 lambda 的問題嗎? vector threads; for (int k = 1; k < d; k++) { thread t1([&](){ A_result[k] = Linear_Transform_Plain(A_result[0], params); }); thread t2([&](){ B_result[k] = Linear_Transform_Plain(B_result[0], params); }); threads.push_back(t1); threads.push_back(t2); // join 在里面就不會出錯 // t1.join(); // t2.join(); } for(auto i = threads.begin(); i != threads.end(); i++){ i->join(); }
報錯: terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc Aborted (core dumped)
嘗試過換用 thread threads[14] 然后索引賦值的方法,報錯: terminate called recursively Aborted (core dumped)
然后不用 lambda 就可以運行,但獲取不到返回值了 thread threads[14]; for (int k = 1; k < d; k++) { threads[k-1] = thread(Linear_Transform_Plain, A_result[0], params); threads[k-1+7] = thread(Linear_Transform_Plain, B_result[0], params); } for (int k = 1; k < d; k++) { threads[k-1].join(); threads[k-1+7].join(); }
網(wǎng)上找了大多是基礎用法和線程池,并不能達到我想要的全核心并發(fā)處理。
這里先感謝各位了!
當我嘗試在我的 64 位 Windows 10 計算機上使用 TDM64-GCC 9.2.0 編譯一個僅包含單行代碼 int main() {} 的 C++程序時,它工作得很好。但是在一個 32 位 Windows XP 系統(tǒng)上,它產(chǎn)生了如下錯誤信息: C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/32/libstdc++.a: file not recognized: file format not recognized collect2.exe: error: ld returned 1 exit status
然而,當我使用先前版本的 TDM64-GCC (例如,4.9.2 )編譯相同的程序時,它在 32 位 Windows XP 系統(tǒng)和 64 位 Windows 10 操作系統(tǒng)上都工作得很好。
我應當做什么來使得 TDM64-GCC 9.2.0 編譯器在 32 位 Windows XP 系統(tǒng)上正確工作?
GitHub issue
collectionview 插入數(shù)據(jù)崩潰了,代碼如下
let selectIndex = self.photoData.seletedAssetArray.index(of: self.previewPhotoArray[currentIndex]) if selectIndex != nil{ self.rightButton.asyncSetImage(UIImage.zyCreateImageWithView(view: ZYPhotoNavigationViewController.zyGetSelectNuberView(index: "(selectIndex! + 1)")), for: .selected) } if selectIndex != nil{ if self.rightButton.isSelected == false { let indexPath = IndexPath.init(row: selectIndex!, section: 0) self.photoData.seletedAssetArray.remove(at: self.photoData.seletedAssetArray.index(of: self.previewPhotoArray[currentIndex])!) thumbnailCollectionView.deleteItems(at: [indexPath]) }else{ let indexPath = IndexPath.init(row: selectIndex!, section: 0) thumbnailCollectionView.numberOfItems(inSection: 0) thumbnailCollectionView.insertItems(at: [indexPath]) thumbnailCollectionView.reloadItems(at: [indexPath]) thumbnailCollectionViewCellToggeleSelect(indexPath: indexPath) } }
報錯信息: 'Invalid update: invalid number of items in section 0. The number of items contained in an existing section after the update (1) must be equal to the number of items contained in that section before the update (1), plus or minus the number of items inserted or deleted from that section (1 inserted, 0 deleted) and plus or minus the number of items moved into or out of that section (0 moved in, 0 moved out).'
網(wǎng)上查了一下, https://stackoverflow.com/questions/19199985/invalid-update-invalid-number-of-items-on-uicollectionview,用了第二個高票答案,但沒有用。 第一個高票答案沒看懂,大神指點一下,不知道有沒有其它方法
在一個面試被問到一個問題:在一個核心入口函數(shù)處統(tǒng)計每一個調(diào)用方的調(diào)用次數(shù),入口函數(shù)知道每一個調(diào)用方的函數(shù)名(NSString *),問題是要怎么統(tǒng)計。
我回答構(gòu)建一個 NSMutableDictionary的 static 對象應該就可以解決問題了,用 dispatch_once 保證初始化的線程安全。但是被追問這樣的話 NSMutableDictionary 的內(nèi)存會撐爆,調(diào)用量會非常大,怎么優(yōu)化?
我沒答上來,事后也沒想明白。內(nèi)存增大應該是 NSString 的原因,NSNumber 畢竟只是值的變化,能占多少內(nèi)存。NSMutableDictionary 確實會對 key 進行 copy,我在想什么量級的 NSString 會撐爆內(nèi)存。
有想法?
項目中需要增加一個"積分"表, 記錄用戶獲得的積分, 用來統(tǒng)計.讓一個同事來處理, 剛剛提交了代碼, 新增的表名和 model 的名字是"integral", 覺得這個名字有點奇怪, 當時沒反應過來, 以為是啥專業(yè)詞匯, 要處理其他事情,暫時沒管. 中午抽空查了下, 原來這個 integral 是"微積分" 中的積分.... 算了, 今后的新增表名和字段名還是我統(tǒng)一把把關吧, 否則水平不一樣起一些奇怪的名字, 日后都是麻煩.
在 MySQL :: MySQL 8.0 Reference Manual :: 15.15.2.1 Using InnoDB Transaction and Locking Information 中,里面展示了一個 data_locks 表的示例內(nèi)容。 | lock id | lock trx id | lock mode | lock type | lock schema | lock table | lock index | lock data | | -------- | ----------- | --------- | --------- | ----------- | ---------- | ---------- | --------- | | A3:1:3:2 | A3 | X | RECORD | test | t | PRIMARY | 0x0200 | | A4:1:3:2 | A4 | X | RECORD | test | t | PRIMARY | 0x0200 | | A5:1:3:2 | A5 | X | RECORD | test | t | PRIMARY | 0x0200 |
請問怎么將 0x0200 轉(zhuǎn)換為人類可理解的內(nèi)容呢?
在“數(shù)據(jù)庫系統(tǒng)概念 - 第 16 章 恢復系統(tǒng) - 16.6 非易失性存儲器數(shù)據(jù)丟失的故障”中,有這么一段話: 數(shù)據(jù)庫轉(zhuǎn)儲的一種方法要求在轉(zhuǎn)儲過程中不能有事務處于活躍狀態(tài),并且必須執(zhí)行一個類似于檢查點的過程: 1. 將當前位于主存的所有日志記錄輸出到穩(wěn)定存儲器中。 2. 將所有緩沖塊輸出到磁盤中。 3. 將數(shù)據(jù)庫的內(nèi)容拷貝到穩(wěn)定存儲器中。 4. 將日志記錄輸出到穩(wěn)定存儲器中。 第 1 、2 和 4 步對應于 16.3.6 節(jié)中檢查點的那三個步驟。 為從非易失性存儲器數(shù)據(jù)丟失中恢復,系統(tǒng)利用最近一次轉(zhuǎn)儲將數(shù)據(jù)庫復原到磁盤中。然后,根據(jù)日志,重做最近一次轉(zhuǎn)儲后所做的所有動作。注意,這里不必執(zhí)行任何 undo 操作。
在寫入最后一條日志記錄時,可能存在仍處于活躍狀態(tài)的事務,如果不執(zhí)行 undo 的話,數(shù)據(jù)庫的狀態(tài)就不是一致的,也無法保證事務的原子性。那么為什么不必執(zhí)行任何 undo 操作呢?
求助:一個公司考核的數(shù)據(jù)庫項目,里面包含多個多對多的關系,如一個工廠包含多個 KPI,一個 KPI 也對應多個工廠;一個過程分工包含多個二級流程,每個二級流程也對應多個過程分工;每個二級流程對應多個三級流程,每個三級流程也對應多個二級流程等等。這種考核系統(tǒng)的數(shù)據(jù)庫設計,是否將每個多對多的關系都增加一個中間表即可呢?還有什么更好的解決多對多關系的設計方法嗎?
謝謝!
經(jīng)常設計一些只有 2 3 個字段的小表,然后弄一堆外鍵和多對多的表,導致即便數(shù)據(jù)量不大也查詢比較慢。還有用一些反模式,比如一個短信發(fā)送表,把一次給一堆人發(fā)送的結(jié)果存成一條記錄,然后有個發(fā)給誰的字段存了好幾個人手機號,再用逗號分隔,導致查發(fā)給了誰只能模糊查詢,也是慢。甚至有一些報表需要使用正則查數(shù)據(jù)庫,要么就從數(shù)據(jù)庫都拿出然后在 Django 里做正則匹配。然而發(fā)現(xiàn)這些問題都是得過段時間重新審視表設計,或是遇到一些需求才能發(fā)現(xiàn)。怎么才能在最初設計的時候就能規(guī)避一些問題呢?
最近有個業(yè)務場景需要用到 postgres 數(shù)據(jù)庫,32 核 64G3T 磁盤這種規(guī)格的 看了下 X 里云,太貴了,又是想自己裝一個丟機房托管。 為了保證性能,硬盤得 SSD 吧 有沒有有搞過得大佬,主要是求款服務器配置
之前在 V2EX 上有一些朋友發(fā)展成為我們的客戶,但在后臺看到不聯(lián)系方式,有些一聯(lián)系方式還是空號。 因為有些業(yè)務需要變更,想聯(lián)系老客戶作出相應的變動。特來這里問問能不能找到。
我們是深圳市獲加科技有限公司,看到的應該知道是哪個渠道的合作商,我也不說太多相關,以防有廣告之嫌
如果你有賬號關系到這家公司的,請聯(lián)系我 V:chiholim 并說明在 V2EX 看到的。
謝謝
EC2 備份了鏡像后,恢復時不能還原到本機?必需用鏡像重新建立新 EC2 ? 那內(nèi)網(wǎng) IP 變了有沒辦法。。。
關于 setTimeout, setInterval, setImmediate 比較詳細,權威的講解。
結(jié)尾還有對計時器對象的 unref && ref 兩個方法的實例講解(說實話,我也是翻譯這篇文章才知道還有這兩個放方法!)
文章地址為: Node.js 中的計時器
上述文章均用 Breword 翻譯工具 進行快速翻譯。
想把 rtsp 的直播流轉(zhuǎn)成 一幀一幀的圖片
通過命令行可以實現(xiàn) ffmpeg -i "rtsp://admin: [email?protected] /main/Channels/" -y -f image2 img%03d.jpg
在 nodejs 中使用 fluent-ffmpeg 實現(xiàn)了 const ffmpeg = require('fluent-ffmpeg') const fs = require('fs') let ffmpegPath = 'ffmpeg/ffmpeg.exe' ffmpeg.setFfmpegPath(ffmpegPath) let url = 'rtsp://admin: [email?protected] /main/Channels/' // ffmpeg -i "rtsp://admin: [email?protected] /main/Channels/" -y -f image2 img%03d.jpg ffmpeg(url) .addInputOption('-rtsp_transport', 'tcp', '-buffer_size', '102400') // 這里可以添加一些 RTSP 優(yōu)化的參數(shù) // .outputOptions(['-vframes 1', '-fflags nobuffer', '-tune zerolatency']) // 每幀一張圖 .videoCodec('png') // 輸出 PNG 格式圖片 .on('error', function (err, stdout, stderr) { console.log('錯誤信息', err.message); }) .on('end', function () { console.log('結(jié)束' ,'Screenshots taken'); }) .on('codecData', function () { console.log('codecData 事件', 'Stream codecData.') }) .output('img%03d.jpg').format("image2").noAudio().run()
但是上面兩種方式都會直接生成圖片 有沒有辦法把圖片的 buffer 獲取到 不寫入文件中
最近在用 Electron 開發(fā)一個客戶端 需要集成監(jiān)控攝像頭
攝像頭是海康的網(wǎng)絡攝像頭 通過 RTSP 協(xié)議獲取到推流視頻
通過在 node 主進程創(chuàng)建一個服務 通過 websocket 接受 rtsp 連接
在通過 ffmpeg 轉(zhuǎn)碼通過 stream 推到渲染進程
渲染進程通過 flv.js 播放視頻
通過轉(zhuǎn)碼可以實現(xiàn) web 頁面播放 rtsp 的視頻流
但是會有 5~6 秒的延遲 體驗很不好
而且 客戶端集成 ffmpeg 體積太大了
想了解下 關于 rtsp 轉(zhuǎn)碼的方法還有那些 在 node 端可以實現(xiàn)的
主進程創(chuàng)建的 web 服務 import * as express from 'express' import * as expressWebSocket from 'express-ws' import ffmpeg from 'fluent-ffmpeg' import webSocketStream from 'websocket-stream/stream' const path = require('path') let ffmpegPath if (process.env.NODE_ENV === 'development') { ffmpegPath = path.join(__static, 'ffmpeg', 'bin', 'ffmpeg.exe') } else { ffmpegPath = path.join(process.cwd(), 'ffmpeg', 'bin', 'ffmpeg.exe') } ffmpeg.setFfmpegPath(ffmpegPath) // 啟動視頻轉(zhuǎn)碼服務服務 function videoServer () { let app = express() app.use(express.static(__dirname)) expressWebSocket(app, null, { perMessageDeflate: true }) app.ws('/rtsp/', rtspRequestHandle) app.listen(8888) console.log('express listened') } // RTSP 轉(zhuǎn)碼方法 function rtspRequestHandle (ws, req) { console.log('rtsp request handle') const stream = webSocketStream(ws, { binary: true, browserBufferTimeout: 1000000 }, { browserBufferTimeout: 1000000 }) let url = req.query.url console.log('rtsp url:', url) try { ffmpeg(url) .addInputOption('-rtsp_transport', 'tcp', '-buffer_size', '102400') // 這里可以添加一些 RTSP 優(yōu)化的參數(shù) .on('start', function () { console.log(url, 'Stream started.') }) .on('codecData', function () { console.log(url, 'Stream codecData.') }) .on('error', function (err) { console.log(url, 'An error occured: ', err.message) }) .on('end', function () { console.log(url, 'Stream end!') }) .outputFormat('flv').videoCodec('copy').noAudio().pipe(stream) } catch (error) { console.log(error) } } export default videoServer
渲染進程通過播放視頻
Redis 沒設置好被入侵修改了 crontab,現(xiàn)在有一個 khugepaged 的挖礦軟件,黑客在我電腦上寫入了 ssh key,我已經(jīng)把服務器關了,現(xiàn)在怎么處理,服務器上有我自己的 hexo 博客,有沒有大佬支支招
問下各位有沒有辦法能夠?qū)崿F(xiàn) linux 下 /etc/hosts 能夠引用別的文件,比如我有個主機 IP 映射的文本,需要映射到 /etc/hosts 下,不然每次去維護 /etc/hosts 很麻煩。因為每臺 host 不一樣的。
大佬們好,最近小弟面臨一些秋招上的問題。
先介紹一下,我個人的喜好方向是基礎架構(gòu),分布式存儲,寫基礎軟件 /分布式系統(tǒng)。沒做過其他方向,就只接觸過這些,也不太確定是不是接觸的太少了導致眼界有些窄。
是這樣的,我面了阿里云原生部門,現(xiàn)在目前是快到 HR 面了,好好面應該問題不大。內(nèi)推老哥幫了我很多忙,但是他們團隊的方向好像是 微服務治理 /服務發(fā)現(xiàn) /k8s,技術終面是 Etcd 作者 Li Xiang,Leader 之前做的方向( Etcd )我挺感興趣的,但現(xiàn)在他好像不怎么做存儲了。現(xiàn)在問題就在于我如果進去的話不知道是做什么方向,如果天天做 『運維 /服務架構(gòu)』 可能就沒有做存儲那么開心了,我是很想做分布式存儲的。當然我知道容器也有存儲機制,但是很難說一定能去做這個方向。
然后現(xiàn)在也有看其他機會。比如其他很多公司會有一個 title 部門叫分布式存儲,感覺會不會跟我的興趣更搭呢?主要是造一些 KV 輪子,存儲引擎等等。
現(xiàn)在就是很糾結(jié): 阿里云原生是個很牛的部門,方向發(fā)展肯定很好,也可以鉆研得很深(有很多分布式的知識也用得上)。不知道會不會因為自己一心想做存儲錯過?可能我做容器也很開心?可能我享受的只是寫基礎軟件 /分布式系統(tǒng)的感覺? 如果拿到分布式存儲和云原生的 offer,該怎么選擇呢?我個人的 preference 會不會有些幼稚呢?
云原生或者分布式存儲的大佬來解答一下我看似幼稚的問題。。給我一些方向選擇上的建議吧,跪謝了~
ELK 或者 EFK 太重了,我的需求太簡單,就是收集日志,能查看日志,不需要分析
所以有沒有一個更簡單純粹的工具搞定呢
使用 yarn 執(zhí)行的命令中,輸出結(jié)果總是帶有白色的背景色,換用 npm 后沒有。如何讓 yarn 避免出現(xiàn)這種白色的背景色?
系統(tǒng):Windows10 專業(yè)版
系統(tǒng)版本號:20H2
命令行使用的是以 gitbash 為內(nèi)核的 Windows Terminal 正式版。
> mysql -Au -h -p Server version: 5.6.48-log Source distribution mysql> 一個耗時的 sql # 然后就沒動靜了,也不報錯也不返回,阻塞著
開另一個連接上去查 SHOW FULL PROCESSLIST ,可以看到 sql 在執(zhí)行 Command-Query, Info-那個 sql
然后變到 Command-Sleep, Info-NULL
最后失去連接
之前服務器一直用的 centos6/7,第一次使用 ubuntu
我想找出 space.log 中所有包含某個字符串的行 space.log 只有幾百 kb [email?protected] :/data# grep 'Utils' space.log Binary file space.log matches [email?protected] :/data# grep -i 'Utils' space.log Binary file space.log matches [email?protected] :/data# grep -a 'Utils' space.log grep: memory exhausted
space.log 是 logback 生成的日志文件,剛剛生成的時候是可以 grep 搜索內(nèi)容的
但是我每天會定時清理日志文件,清理過后再 grep 就會提示 Binary file space.log matches
清理命令是:echo > space.log 或者 cat /dev/null > space.log 都會這樣
有什么能清理文件內(nèi)容,但是不改變文件格式的命令嗎?
寫過 N 份 Markdown 的你是不是也曾想過,為什么 Markdown 就不能給上個封面呢?
哪怕是一個白底黑字的白封皮也行~
直到有一天,在 OSChina 上看到一個份號稱是用 Markdown 寫的頁面……
這貨的上半身是長這樣滴:
──────────
而下半身也不懶,是長這樣滴:
點這里可以看到真身
AMAZING!!! Markdown 粉們馬上就 High 了,這皮是怎么畫上去的~
一番搜索后,貼出了答案~
原來就是就只要兩步,就兩步,不信出來走兩步~
① 碼出封面、封底的內(nèi)容;② 選擇 VLOOK 的主題。 。就這樣 O 了~
太快了太快了~那個誰,來,來個左手右手一個慢動作重播:REPLAY ?
① 碼出封面、封底的內(nèi)容
啟動 Typora ,創(chuàng)建一個新的 Markdown 文檔,在最開始和最后的位置,參考著碼出以下內(nèi)容: ###### 這里是上半身 這里是你原來的 Markdown 內(nèi)容 ###### 這里是下半身
② 選擇 VLOOK 的主題
在 這里下載 VLOOK 的最新版本,然后將其放到 Typora 的主題目錄下,重啟 Typora 。在菜單「主題 」下選擇任意一個 VLOOK 開頭的主題。
VLOOK 內(nèi)置了多套高顏值實用的主題,你可以一鍵輕松擁有全新的 Markdown ~
更多關于 VLOOK 的介紹和特性,可以去官方主頁了解: OSChina GitHub 也直接查看 VLOOK 快速參考手冊 >>> 、 腳本化圖表 for Markdown >>>
──────────
[下一篇] 敬請期待~
──────────
「 VLOOK ── 讓你的 Markdown 有了新看法 」
我會在后面陸續(xù)抽空為大家分享 VLOOK 的一些好玩的特性,要小期待一下喔~
本人是一名 CS 系的學生,平常喜歡用 Markdown 寫寫博客什么的。我最喜歡的編輯器是 Moeditor ,但很可惜它在 2016 年 8 月發(fā)布了 v0.2.0-beta 版本之后便停止了發(fā)布更新的版本。
我嘗試過使用其他 Markdown 編輯器例如 StackEdit,Typora,MacDown 等等,但一直沒有找到心目中類似于 Moeditor 這種風格的跨平臺編輯器。
同時我又希望新的編輯器可以模塊化,從而支持自定義 Markdown 擴展語法與自定義主題的功能,讓寫博客或文檔更順手。除此之外,我還希望新的編輯器可以簡化分享 Markdown 文件的難度而不是每次給別人拷貝 Markdown 文件的時候還要自己手動一張張地查找用到的圖片 assets 并整理到統(tǒng)一的一個地方。
本想著隨便湊活湊活就好了但隨著我購買了 Sony DPT-RP1 這種逆天的電子紙閱讀器以后,每次我使用其他編輯器將 Markdown 文件轉(zhuǎn)成 PDF 以供在電子紙上閱讀軟件文檔什么的時候,那些編輯器導出后的 PDF 會使很多文字或代碼高亮變得很難看清,綜合用戶體驗不是很好。
最終,本著自己動手豐衣足食的精神,我決定使用 Electron 自己編寫一個開源跨平臺的 Markdown 編輯器并命名為 SparkMEMO Editor 。
目前這個編輯器實現(xiàn)了以下功能: Github Flavored Markdown 代碼高亮 MathJAX 數(shù)學公式 Mermaid 圖表 調(diào)整顯示模式 [寫作, 閱讀, 標準] 導出 Markdown 文件至方便在電子墨水設備上閱讀的 PDF 文件
目前支持 Windows, MacOS 及 Linux 平臺。
當前 v0.1.0 這個版本并不是非常的完美、可能會有一些 bug 但已經(jīng)基本滿足了平常寫作的需求。 其他諸如自定義 Markdown 擴展語法、自定義主題、導出 Markdown 中所有圖片至圖床或文件夾的功能目前已在開發(fā)計劃之中。
如果你有希望 SparkMEMO Editor 實現(xiàn)某些功能的建議,歡迎在 Github 上提交 Issue 。
點擊前往 SparkMEMO Editor 的 Github >
有興趣的話也歡迎各位給個 Star :)
好多情況下都可以使用 final 修飾 但是修飾多了,好啰嗦,不美觀 什么情況下使用 final 修飾形參既實用又美觀
首先,我可能還是老規(guī)矩,要先解釋一波,雖然我知道不喜歡的人也不會喜歡看我解釋,但是我覺得還是有必要說一下的。
關于擴展性不夠強
我不知道這個擴展性具體是指啥,是指以下這種情況嗎? 我內(nèi)置 httpserver,但是你想用 tomcat 可以自己切換? 我內(nèi)置 durid,但是你想用 c3p0 可以自己切換?
如果你們指的是這種,那我可以很負責任地說,我從來沒往這方面考慮,所以也就不會去做大家嘴里的擴展性,我始終堅持一個場景只提供一種解決方案,就像 iphone 只提供 faceid,不提供屏下指紋一樣。
如果大家不認同這個理念,那我只能說我們的想法不同吧,可能聊不到一塊。
如果不是指上面這些,而是指支持 kafka,支持 activeMQ,支持 mongodb 等,這些完全沒問題啊,這些項目本來就是可以單獨使用的東西,又不是必須跟 spring 整合才能用,都可單獨使用了,你們還怕不能跟 Martian 框架一起用嗎? 無非現(xiàn)在就是缺少幾個針對他們的 starter+工具類嘛,導致整合會比較耗時,對不對? 但這是問題嗎?我覺得這不是問題,只要有興趣的人一起行動,各種 starter 肯定就滿天飛了。
所謂的 spring 生態(tài),其實就是這些開源項目開發(fā)了針對 spring 的 starter 和工具類嘛, 他們又不是軟件和系統(tǒng)的關系,一個軟件在 windows 上能跑,在 mac 上不能跑,這個別人拿生態(tài)來說事,我還能理解,但是 kafka 和 spring 是這種關系嗎?肯定不是啊。
接下來是意見征集
我經(jīng)常聽到有人說 這個框架功能少,不夠用,所以這個帖子我主要是想來聽一聽具體的一些干貨。
我承認 我是井底之蛙 ,見識不夠廣,所以我希望大家來指正我,拜托了,但同時我也請大家注意禮貌。
請說出 用這個框架無法滿足,或者很難滿足的場景,數(shù)量不限,越多越好,但必須是 web 開發(fā)這個方向的哦
然后我有幾個小小的請求,希望大家見諒 希望大家可以說出正經(jīng)的干貨,如果光是一個勁的說,辣雞,或者功能少,卻不說到底什么場景下不夠用,那我可能無法認同你們的吐槽,望見諒 我希望聽到的是業(yè)務場景,而不是技術需求,比如有人喜歡把頁面寫在 java 項目里用模板引擎,又或者有人喜歡 jsp,這種就不要說了,因為這是技術需求,不影響業(yè)務實現(xiàn),用前后端分離完全可以實現(xiàn)業(yè)務需求,所以這一類的東西不能算缺陷,只能說沒有滿足部分人的喜好吧
項目官網(wǎng): http://www.mars-framework.com
畢業(yè)在成都上了幾年班,后面回到老家三線城市國企工作。 母胎 solo,今年好不容易找了個女朋友,妹子性格不錯,挺恩愛的,見了家長準備談婚論嫁了,首付什么的也準備好了,在看房子,覺得也快 30 了,終于穩(wěn)了。
結(jié)果?公司居然要搬到省會去,真的醉了。 到省會也不說一定不好,工資個人成長啥的可能高點。 但我就一臭咸魚,混個溫飽就湊和了,省會房子又貴,又和老婆異地,說不定就吹了。 辭職換工作吧,三線 C++程序員坑就那么點,工資還要降,唉。 難受,真的難。