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

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

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

科技資訊

科技學院

科技百科

科技書籍

網(wǎng)站大全

軟件大全

官網(wǎng)掛了,很多人可能看不到,我拷出來了升級腳本 (注意:優(yōu)先在面板首頁直接點更新,失敗的情況下,才使用此命令,且不能在面板自帶的 SSH 終端執(zhí)行): curl https://download.bt.cn/install/update_panel.sh |bash離線升級步驟: 1 、下載離線升級包: http://download.bt.cn/install/update/LinuxPanel-7.4.3.zip 2 、將升級包上傳到服務器中的 /root 目錄 3 、解壓文件:unzip LinuxPanel-7.4.3.zip 4 、切換到升級包目錄:cd panel 5 、執(zhí)行升級腳本:bash update.sh 6 、刪除升級包:cd .. && rm -f LinuxPanel-7.4.3.zip && rm -rf panel
前沿探索
2020-08-27 16:56:34
我又來問問題啦,這回還是喜聞樂見的 C++問題,同樣一份代碼 MSCVC 19.24 ,clang 10 均可編譯通過,g++-10 不可編譯通過,這是什么原因呢,注意,須加入?yún)?shù)要求 compiler 支持 C++17 (-std=c++17), 可在線編譯版本代碼鏈接 https://godbolt.org/z/eWhsne ,源碼如下, 其中開頭部分的 type_traits 應該是沒問題的,主要問題集中在 gcc 對 fold expression 的處理上,這份代碼是對 std::variant 部分簡單不完全實現(xiàn) #include #include #include #include #include template class IfThenElseT { public: using Type = TrueType; }; template class IfThenElseT { public: using Type = FalseType; }; template using IfThenElse = typename IfThenElseT::Type; template class Typelist { }; template class FrontT; template class FrontT> { public: using Type = Head; }; template using Front = typename FrontT::Type; template class PopFrontT; template class PopFrontT> { public: using Type = Typelist; }; template using PopFront = typename PopFrontT::Type; template class IsEmpty { public: static constexpr bool value = false; }; template <> class IsEmpty> { public: static constexpr bool value = true; }; template ::value> struct FindIndexOf { }; template struct FindIndexOf : public IfThenElse, T>, std::integral_constant, FindIndexOf, T, N + 1>> { }; template struct FindIndexOf { }; 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; template class VariantStorage { private: using LargestT = LargestType>; alignas(Types...) unsigned char buffer[sizeof(LargestT)]; unsigned char discriminator = 0; public: unsigned char getDiscriminator() { return discriminator; } void setDiscriminator(unsigned char d) { discriminator = d; } void *getRawBuffer() { return buffer; } void const *getRawBuffer() const { return buffer; } template T *getBufferAs() { return std::launder(reinterpret_cast(buffer)); } template T const *getBufferAs() const { return std::launder(reinterpret_cast(buffer)); } }; template class Variant; template class VariantChoice { private: using Derived = Variant; Derived &getDerived() { return *static_cast(this); } Derived const &getDerived() const { return *static_cast(this); } protected: constexpr static unsigned Discriminator = FindIndexOf, T>::value + 1; public: VariantChoice() = default; VariantChoice(T const &value); VariantChoice(T &&value); bool destroy(); Derived &operator=(T const &value); Derived &operator=(T &&value); }; template VariantChoice::VariantChoice(T const &value) { new (getDerived().getRawBuffer()) T(value); getDerived().setDiscriminator(Discriminator); } template VariantChoice::VariantChoice(T &&value) { new (getDerived().getRawBuffer()) T(std::move(value)); getDerived().setDiscriminator(Discriminator); } template bool VariantChoice::destroy() { if (getDerived().getDiscriminator() == Discriminator) { getDerived().template getBufferAs()->~T(); return true; } return false; } template auto VariantChoice::operator=(T const &value) -> Derived & { if (getDerived().getDiscriminator() == Discriminator) { *getDerived().template getBufferAs() = value; } else { getDerived().destroy(); new (getDerived().getRawBuffer()) T(value); getDerived().setDiscriminator(Discriminator); } return getDerived(); } template auto VariantChoice::operator=(T &&value) -> Derived & { if (getDerived().getDiscriminator() == Discriminator) { *getDerived().template getBufferAs() = std::move(value); } else { getDerived().destroy(); new (getDerived().getRawBuffer()) T(std::move(value)); getDerived().setDiscriminator(Discriminator); } return getDerived(); } class ComputedResultType; class EmptyVariant : public std::exception { }; template class Variant : private VariantStorage, private VariantChoice... { template friend class VariantChoice; public: using VariantChoice::VariantChoice...; //g++報錯 using VariantChoice::operator=...; //g++報錯 template bool is() const; template T &get() &; template T &&get() &&; template T const &get() const &; // template // VisitResult template bool Variant::is() const { return this->getDiscriminator() == VariantChoice::Discriminator; //g++報錯 } template template T &Variant::get() & { if (empty()) { throw EmptyVariant(); } assert(is()); return *this->template getBufferAs(); } template template T &&Variant::get() && { if (empty()) { throw EmptyVariant(); } assert(is()); return *this->template getBufferAs(); } template template T const &Variant::get() const & { if (empty()) { throw EmptyVariant(); } assert(is()); return *this->template getBufferAs(); } template void Variant::destroy() { // bool results[] = {VariantChoice::destroy()...}; (VariantChoice::destroy(), ...); //g++報錯 this->setDiscriminator(0); } int main() { Variant v{17}; return 0; }
前沿探索
2020-08-27 16:56:18
1 命令行
不知道大家在日常操作 redis 時用什么可視化工具呢?
以前總覺得沒有什么太好的可視化工具,于是問了一個業(yè)內(nèi)朋友。對方回:你還用可視化工具?直接命令行呀,redis 提供了這么多命令,操作起來行云流水。用可視化工具覺得很 low 。
命令行的鄙視用工具的,用高端工具的鄙視低端工具的,鄙視鏈一直存在。雖然用命令行自己也可以,但是總感覺效率上不如用工具,在視覺上不那么直觀。尤其是看 json 的時候,在命令行就很不友好。
大佬朋友說:誰說命令行就不能格式化 json 了?可以利用 iredis,用 | 將 redis 通過 pipe 用 shell 的其他工具,比如 jq/fx/rg/sort/uniq/cut/sed/awk 等處理。還能自動補全,高亮顯示,功能很多
好吧 ,確實牛逼。附上這個工具的官網(wǎng)地址,喜歡用命令行的朋友可以去試一試,絕對能讓喜歡命令行的你爽的飛起來。 https://iredis.io/
但是我相信大多數(shù)開發(fā)者還是習慣用可視化工具。我自己也用過不少 redis 的可視化工具。今天就細數(shù)下市面上流行的各個可視化的工具的優(yōu)劣勢。幫助你找到最好的 redis 可視化工具。提升 debug 效率。
如果你想直接看最終總結(jié),可以直接拉到文章的末尾。

2 可視化工具分類
按照 redis 可視化工具的部署來分,可以分成 3 大類 桌面客戶端版 web 版 IDE 工具的 plugin
桌面版這次評測的軟件如下: redis desktop manager medis AnotherRedisDesktopManager fastoredis redis-plus red
Web 版本評測的軟件如下: redis-insight
IDE 插件版本,這里只評測 IntelliJ IDEA 的插件,eclipse 的就不作介紹了 Iedis2

3 redis desktop manager
這個工具應該是現(xiàn)在使用率最廣的可視化工具了。存在時間很久。經(jīng)過了數(shù)次迭代??缙脚_支持。以前是免費的,現(xiàn)在為收費工具。試用可以有半個月的時間。
鏈接為: https://redisdesktop.com/
評測:
之前用覺得功能還行,就是界面 UI 丑了點。最近下了最新版,感覺經(jīng)過了那么長時間迭代,界面看著也還湊合。該有的功能都有。界面看著比較簡潔,功能很全。
key 的顯示可以支持按冒號分割的鍵名空間,除了基本的五大數(shù)據(jù)類型之外,還支持 redis 5.0 新出的 Stream 數(shù)據(jù)類型。在 value 的顯示方面。支持多達 9 種的數(shù)據(jù)顯示方式。
命令行模式也同以前有了很大的進步,支持了命令自動提示。
從功能看上去中規(guī)中矩,使用起來便捷。最大的缺點就是不免費。個人使用的話,大概一年要 200 多 RMB 的價格。

4.medis
現(xiàn)階段我使用率最高的 redis 可視化工具。界面符合個人審美。布局簡潔。跨平臺支持,關(guān)鍵是免費。
鏈接為: http://getmedis.com/
評測:
顏值挺高,功能符合日常使用要求。對 key 有顏色鮮明的圖標標識。在 key 的搜索上挺方便的,可以模糊搜索出匹配的 key,漸進式的 scan,無明顯卡頓。在搜索的體驗上還是比較出色的。
缺點是不支持 key 的命名空間展示,不支持 redis 5.0 的 stream 數(shù)據(jù)類型,命令行比較單一,不支持自動匹配和提示。支持的 value 的展現(xiàn)方式也只有 3 種

5.AnotherRedisDesktopManager
一款比較穩(wěn)定簡潔的 redis UI 工具。
鏈接為: https://github.com/qishibo/AnotherRedisDesktopManager
評測:
很中規(guī)中矩的一款免費的 redis 可視化工具,基本的功能都有。有監(jiān)控統(tǒng)計,支持暗黑主題,還支持集群的添加。
缺點是沒什么亮點,UI 很簡單,不支持 stream 數(shù)據(jù)類型。命令行模式也比較單一。value 展示支持的類型也只有 3 種。

6.FastoRedis
FastoRedis 之前沒聽到過。然后去下了體驗了下。
使用這款工具首先得去官網(wǎng)注冊賬號。這款軟件是收費軟件,雖然跨平臺,但是試用只有一天的時間。
鏈接為: https://fastoredis.com/
評測:
畢竟是收費軟件,雖然界面一股濃濃的 windows 風格,乍看上去有點像 redis desktop manager,但是就功能而言。確實不錯,支持了集群模式和哨兵模式,key 的命名空間展示,redis 5.0 的 stream 數(shù)據(jù)類型也支持。
命令行模式支持自動提示補全
value 的顯示支持樹狀,表格狀等等顯示方式。 令我驚訝的是,值對象支持多達 17 種渲染方式,
總的來說,除了界面 UI 交互略生硬,還有是一款收費軟件之外,還是一款很不錯的 redis 可視化工具。

7.RedisPlus
一款開源的免費桌面客戶端軟件
鏈接: https://gitee.com/MaxBill/RedisPlus
評測:
沒什么亮點,也就基本功能。加分項可能也就是有一個監(jiān)控。其他的都很普通 。甚至于這款軟件連命令行模式都沒有。用的是 javafx 開發(fā),按道理說,應該是跨平臺的軟件 ,但是提供的下載地址,并沒有 mac 的直接安裝包。況且就算是跨平臺的吧。

8.Red
這是一款在蘋果 app store 下載的 redis 可視化工具,免費
鏈接: Mac 用戶可以去 app store 里面搜
評測:
只支持 Mac 端,顏值還是不錯的。功能中規(guī)中矩?;竟δ芏加?支持 key 命名空間的展示。

9.Redis Insight
這個軟件來頭挺大的,是 redis labs 出的一款監(jiān)控分析級別的 redis 可視化工具。這款軟件是 web 版的
那 redis labs 是啥公司,redis labs 創(chuàng)立于 2011 年,公司致力于為 Redis 、Memcached 等流行的 NoSQL 開源數(shù)據(jù)庫提供云托管服務。可以算是專門致力于 redis 云的一家專業(yè)公司。他們的提供的軟件中,除了可以連接企業(yè)私有的 redis 服務,也可以連接他們的 redis 云。
鏈接: https://redislabs.com/redisinsight/
評測:
雖然是 web 版本,但是這個軟件超越了我對 redis 可視化工具的認識,一看界面就覺得很專業(yè),不像是個人開發(fā)出來的開源產(chǎn)品。我發(fā)現(xiàn) key 的查詢和瀏覽只是這里的一個功能模塊而已
命令行方面:
除了有命令補全提示,右邊還有相關(guān)命令的文檔解釋。怎么樣,是不是超人性化呢?
同樣支持 redis 5.0 的 Stream 數(shù)據(jù)類型
下面的三個功能,是需要在 server 端安裝他們家的其他 redis 模塊的。分別是可查詢的圖表,redis 的時間序列展示和全文本查詢功能。
最牛逼的是,redisInsight 竟然還支持 rdb 的分析功能,之前分析 rdb 的存儲分布,有點經(jīng)驗的都會用 rdb-tools 去分析。而 redisInsight 竟然把這個都集成進去了。我之前用這個分析了公司生產(chǎn)環(huán)境的 rdb,找出了導致數(shù)據(jù)量增長過快的原因,簡直是一個神器。
這是我上次利用這個軟件分析 rdb 出來的結(jié)果。很明確的找到了哪個 key 占據(jù)內(nèi)存過大。
在分析功能中的 Profiler 能監(jiān)聽一段時間內(nèi)所有執(zhí)行的 redis 命令 ,Slowlog 能顯示出執(zhí)行比較慢的 redis 命令。
除此之外,這個軟件還能批量操作
RedisInsight 這個可視化工具對 redis 的覆蓋之全面令人咋舌。雖然他的查詢 key 的功能算不上優(yōu)秀,但是他的全面性和分析監(jiān)控方面,確實是其他 redis 可視化工具難以企及的,況且顏值還那么高,強烈推薦。

10.Iedis2
Iedis 是一款基于 IntelliJ IDEA 的插件,在 IDEA 的 plugin 市場里就可以搜到,但是為收費插件??稍囉?7 天
評測:
作為 IDEA 的插件,當然是跨平臺的,風格完全遵從于 IDEA,顏值有保障。從功能上來說,Iedis 也是不含糊?;静樵児δ芑旧咸舨怀雒?。加上 IDEA 的使用習慣,讓你用起來得心應手,不需要另外打開軟件。在代碼和插件窗口中切換也是能提高效率的
這個插件最大的特點就是能支持 lua 腳本的編寫和調(diào)試,這在其他軟件中是不曾看到的。以前在一個業(yè)務中大量用了 lua 進行 redis 操作,雖然嘗到了 redis lua 原子性和性能上的甜頭,但是在編寫調(diào)試的時候,那叫一個痛苦,因為不能在 debug 所以每次都需要返回一個值來檢查是哪里出了錯。看到這個工具,悔恨沒早點發(fā)現(xiàn)這個插件,付費也愿意
這個插件還能支持慢命令的查看
總的來說,Iedis 除了需要付費,其他的一切都看上去很美好。價格是。。。$139/年。還是美元,看到這個價格,是不是長嘆一口氣呢。

11.總結(jié)
對于前面介紹的 8 款 redis 可視化工具,我總結(jié)了一個表格,供大家參考和比較
相信看到這里,你心里一定有答案了。好的工具能讓你事半功倍,從而節(jié)約大量的時間和成本,希望大家在日常開發(fā)中,能挑選好的工具,以最快的效率解決最復雜的事情。
吐血整理,求關(guān)注。

12.關(guān)注作者
覺得有用的話,請關(guān)注下我的公眾號「元人部落」,作者堅持原創(chuàng)的內(nèi)容技術(shù)分享,也有開源作品,歡迎關(guān)注
開源倉庫為: https://gitee.com/bryan31
公眾號一般周更,每次會分享一些實用的技術(shù),陪你一起成長
關(guān)注后回復“資料”獲取 50G 的視頻資料,包括一套企業(yè)級微服務的視頻教學
前沿探索
2020-08-27 16:56:11
原來的 mongo 最大的一個庫是 400G,3 個分片,3 個副本,通過 mongodump 一個最大的庫需要 18 個小時, 現(xiàn)在的 mongo 4 個分配,5 個副本,導數(shù)據(jù)測試要 60 個小時,想問大佬,有什么能提速的辦法么? 現(xiàn)在的 mongo 數(shù)據(jù)可以全部不要的
前沿探索
2020-08-27 16:56:04
在查詢的時候,一個字段查詢多個方法 如: {title:[/深圳 /,/廣州 /]}
如何把深圳和廣州寫成變量傳過去?
前沿探索
2020-08-27 16:55:58
在 MySQL 時間“不正確”問題 - V2EX 中,通過在 connection URL string 中顯式地設置時區(qū)( serverTimezone=Asia/Shanghai )解決了問題。
但是我還是有很多疑問。為什么“在 connection URL string 中設置時區(qū)”會將所設置時區(qū)的時間存儲到 MySQL ?到底是哪里進行這樣的處理的?
以下是我查閱的一些資料: java - MySQL client vs server time zone - Stack Overflow java - MySQL JDBC Driver 5.1.33 - Time Zone Issue - Stack Overflow
前沿探索
2020-08-27 16:55:51
準備工作(數(shù)據(jù)庫) docker run --rm --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=test -e TZ='Asia/Shanghai' -p 3306:3306 -d mysql:8 docker exec -it some-mysql mysql -u root -pmy-secret-pw use test; create table t (dt datetime);
真實結(jié)果 & 期望結(jié)果
程序通過 MyBatis 執(zhí)行 insert into t (dt) values (#{now}) ,變量 now 是通過 Instant.now() 產(chǎn)生的,其值為 2020-08-22T11:48:22.150Z ,這是正確的。但是為什么數(shù)據(jù)庫存儲的是 2020-08-22 06:48:22 呢?不應該是 2020-08-22 19:48:22 嗎? 2020-08-22 06:48:22 是怎么來的?
前沿探索
2020-08-27 16:55:45
我的一臺機器上( 192.168.1.10 ,固定 IP ),原本設置了一個網(wǎng)橋 br0,兩張網(wǎng)卡(暫時標記為 eth1 和 eth2 )加入了這個網(wǎng)橋,然后還有一個 kvm 虛擬機在這個網(wǎng)橋上,虛擬機里裝的是軟路由系統(tǒng),接在網(wǎng)橋上的是 LAN 口,WAN 口是直通給虛擬機的一張網(wǎng)卡(暫時標記為 eth0 )。eth0 接在光貓上,eth1 接在路由器上( 192.168.1.100 ,AP,固定 ip ),eth2 直接連電腦( 192.168.1.x,dhcp )。
以前的情況: 虛擬機里的軟路由撥號 主機可以正常上網(wǎng) 接在 eth2 上的電腦可以正常上網(wǎng),可以正常連接主機,可以正常連接虛擬機 路由器下的無線設備( 192.168.1.x,dhcp )可以正常上網(wǎng)
我在主機上裝了 docker 之后,自動創(chuàng)建了 docker0 ( 172.17.0.0/16 ),之后的情況就是: 虛擬機里軟路由撥號正常 主機可以正常上網(wǎng)( ping 和 wget 都可以) 接在 eth2 上的電腦不能正常上網(wǎng),可以正常連接主機,不能連接虛擬機,可以連接 docker 映射出來的端口 接在路由器下的無線設備和電腦一樣 未測試 docker 能否正常連接外網(wǎng)
感覺像是主機里面網(wǎng)路哪里出問題了,從主機能連到虛擬機,從外面的網(wǎng)口(eth1)也可以連到主機,但是從外面的網(wǎng)口(eth1),不能連到虛擬機。
請教一下各位大神,我應該怎么操作,才能讓,在 docker 網(wǎng)絡正常的情況下,其他的網(wǎng)絡設備也正常。
前沿探索
2020-08-27 16:55:37
第一種是不持久化配置文件,如下所示,使用 redis-server --requirepass "123456" --appendonly yes 進行相關(guān)的配置并啟動。 docker run -d --name one-Redis \ -p 6379:6379 \ -v Redis_data:/data \ redis:4.0.9 \ redis-server --requirepass "123456" --appendonly yes
第二種是使用配置文件,自己在 /home/user/docker/redis/redis.conf 設置好相關(guān)的配置,通過 -v /home/user/docker/redis/redis.conf:/usr/local/etc/redis/redis.conf 將配置導入 container,然后通過 redis-server /usr/local/etc/redis/redis.conf 啟動。 docker run -d --name another-Redis \ -p 6379:6379 \ -v Redis_data:/data \ -v /home/user/docker/redis/redis.conf:/usr/local/etc/redis/redis.conf \ redis:4.0.9 \ redis-server /usr/local/etc/redis/redis.conf
我個人覺得,第一種做法移植性很好,無需自己維護 docker host 中的配置。我自己并沒有使用 docker 很久,所以想聽聽大家的意見。
還有一個問題,有沒有什么情況是只能使用第二種方式的呢?
前沿探索
2020-08-27 16:55:28
執(zhí)行 docker run --rm --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=test -e TZ='Asia/Shanghai' -p 3306:3306 -d mysql:8 之后再執(zhí)行 docker volume ls ,出現(xiàn)了如下的一個 volume 。為什么會出現(xiàn)這樣一個 volume 呢?明明 docker run 沒有創(chuàng)建 volume 呀。 local 888bc3f68ce91c4a790a59c6f389a743d38eeee87d11002e8ff98293cf48cd6c
docker run --rm -it -v 888bc3f68ce91c4a790a59c6f389a743d38eeee87d11002e8ff98293cf48cd6c:/tmp/myvolume busybox ls -l /tmp/myvolume 的輸出如下: total 186788 -rw-r----- 1 999 999 196608 Aug 23 15:17 #ib_16384_0.dblwr -rw-r----- 1 999 999 8585216 Aug 23 15:16 #ib_16384_1.dblwr drwxr-x--- 2 999 999 4096 Aug 23 15:16 #innodb_temp -rw-r----- 1 999 999 56 Aug 23 15:16 auto.cnf -rw-r----- 1 999 999 3104424 Aug 23 15:16 binlog.000001 -rw-r----- 1 999 999 156 Aug 23 15:16 binlog.000002 -rw-r----- 1 999 999 32 Aug 23 15:16 binlog.index -rw------- 1 999 999 1680 Aug 23 15:16 ca-key.pem -rw-r--r-- 1 999 999 1112 Aug 23 15:16 ca.pem -rw-r--r-- 1 999 999 1112 Aug 23 15:16 client-cert.pem -rw------- 1 999 999 1680 Aug 23 15:16 client-key.pem -rw-r----- 1 999 999 5419 Aug 23 15:16 ib_buffer_pool -rw-r----- 1 999 999 50331648 Aug 23 15:17 ib_logfile0 -rw-r----- 1 999 999 50331648 Aug 23 15:16 ib_logfile1 -rw-r----- 1 999 999 12582912 Aug 23 15:17 ibdata1 -rw-r----- 1 999 999 12582912 Aug 23 15:17 ibtmp1 drwxr-x--- 2 999 999 4096 Aug 23 15:16 mysql -rw-r----- 1 999 999 30408704 Aug 23 15:17 mysql.ibd drwxr-x--- 2 999 999 4096 Aug 23 15:16 performance_schema -rw------- 1 999 999 1680 Aug 23 15:16 private_key.pem -rw-r--r-- 1 999 999 452 Aug 23 15:16 public_key.pem -rw-r--r-- 1 999 999 1112 Aug 23 15:16 server-cert.pem -rw------- 1 999 999 1680 Aug 23 15:16 server-key.pem drwxr-x--- 2 999 999 4096 Aug 23 15:16 sys drwxr-x--- 2 999 999 4096 Aug 23 15:16 test -rw-r----- 1 999 999 10485760 Aug 23 15:17 undo_001 -rw-r----- 1 999 999 12582912 Aug 23 15:17 undo_002
前沿探索
2020-08-27 16:55:20
如題, 目前網(wǎng)上搜索找到了以下兩種方式返回靜態(tài)文件 server { location ~ ^/a { default_type text/html; return 200 'asdfasdfasdfasdf'; } location ~ ^/b { default_type application/json; add_header Content-Type 'text/html; charset=utf-8'; alias /tmp/b.json; } if ($var = true) { return 200 "asdf"; } }
那么有沒有辦法在 if 結(jié)構(gòu)中返回一個指定路徑的文件內(nèi)容呢, 而不是一個固定的字符串, 如下偽代碼 server { if ($var = true) { return 200 /path/to/file; } }
不一定必須 if 中實現(xiàn), 只要是在滿足變量$var=true 的情況下, 返回指定路徑靜態(tài)文件內(nèi)容即可
前沿探索
2020-08-27 16:55:11
需求: 使用 nginx 反代 wordpress,證書使用 Let's Encrypt,SSL 證書更新使用 acme.sh
問題: 使用 acme.sh 更新時,無法訪問到.well-known 目錄導致無法續(xù)期證書
試過指定以下配置,訪問不到 location /.well-known { root /path/to/web; } location /.well-known/ { root /path/to/web; } location ~/.well-known { root /path/to/web; }
現(xiàn)有配置: location / { proxy_pass http://wordpress; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-proto https; proxy_redirect off; }
前沿探索
2020-08-27 16:54:55
關(guān)于個人家用服務器選擇?頭大,完全不懂,求前輩指點。云服務器太貴,2 核 4G 就得好幾千一年。低配又是相當多的事情做不了,部署一個 blog 感覺就差不多了。我現(xiàn)在用樹莓派,但是不敢長期開機,怕等下燒壞。求教有啥高性價比的方案。
前沿探索
2020-08-27 16:54:49
這次百度云的活動一直到 9 月 9 日,且包含代理商伙伴及代理商合作的客戶,云服務器 1.2 折,AI 產(chǎn)品 7 折,媒體云 5.5 折起,看種哪款聯(lián)系我還能再打折。 活動地址: http://dwz.date/ceya 需要注意的是百度云賬號已之前沒有過消費,才能綁定我的代理賬戶,享受折上折。 V+Q:7-1234-2013
前沿探索
2020-08-27 16:54:43
Rust Enhanced 和 RustAutoComplete 插件都裝上了,自動補全插件工作正常。Build System 選擇 Rust Enhanced,構(gòu)建一個單 rs 文件,代碼就是輸出 Hello World 。 點 build,跟我說必須要是一個 Cargo 項目不能構(gòu)建一個單一的 rs 腳本。 好了又用終端 cargo new Hello_World --bin 了,再用 sublime 來 build,這次直接沒反應,控制臺一點輸出都沒有????
前沿探索
2020-08-27 16:54:33
眾所周知,逐浪 CMS 支持強大的字段定義功能,其中省市縣三級字段更是無比強大,可以自由的實現(xiàn)地區(qū)的定制,方便 web 和移動開發(fā)者們。 這里分享幾則技巧。
1.定義省市縣三級字段的顯示順序
只要點擊網(wǎng)站后臺快速幫助,就能進入維護工具,自由的定義省市,甚至增加或減少。 這個功能非常實用,因為日新月異的行政區(qū)劃是會不變更的,同時有時網(wǎng)站平臺需要開展靈活的電子商務,需要有個性化分區(qū),在此就可以自由定制了。

2.定義省市縣三級字段默認必須選擇
默認省市縣三級字段,是以北京為排第一的,你可以根據(jù)上面方法重調(diào)順序,那么有沒有辦法,讓默認是未選中狀態(tài),必須下拉才可以選擇呢? 可以的。 你只要編輯 \wwwroot\js\Controls\ZL_PCC.js 約第 11 行: this.option = option; //{ text: "請選擇", value: "" };//附加的選項 this.defProvince = "test", this.defCity = "", this.defCounty = "", this.stwon = ""; }
修改為: this.option = { text: "請選擇", value: "" };//附加的選項 this.defProvince = "", this.defCity = "", this.defCounty = "", this.stwon = ""; }
就能實現(xiàn)字段默認為空的狀態(tài)了,如下所示:
前沿探索
2020-08-27 16:54:28
將 restful api 視作一個資源,即 /api/book/foor===get, get 請求 /api/book/foor 整體視為一個資源
/api/book/foor===post, post 請求 /api/book/foor 整體視為另一個資源
資源和角色相映射,用戶再和角色對應。即角色擁有資源,用戶所屬對應角色,用戶才能訪問此 api.
上面這種方式咋樣? 自薦一個開箱即用的高效認證鑒權(quán)包,專注于 Restful Api 的動態(tài)保護 su.usthe.com
github: https://github.com/tomsun28/sureness com.usthe.sureness sureness-core 0.0.2.7
前沿探索
2020-08-27 16:54:19
首先,我是此文原作者,可能有同學看過這篇文章。在 V 站只是為了介紹 Forest 這個神器,幫助大家在工作中選擇 http 客戶端時多一個選擇。望大家積極討論。
1.背景
因為業(yè)務關(guān)系,要和許多不同第三方公司進行對接。這些服務商都提供基于 http 的 api 。但是每家公司提供 api 具體細節(jié)差別很大。有的基于 RESTFUL 規(guī)范,有的基于傳統(tǒng)的 http 規(guī)范;有的需要在 header 里放置簽名,有的需要 SSL 的雙向認證,有的只需要 SSL 的單向認證;有的以 JSON 方式進行序列化,有的以 XML 方式進行序列化。類似于這樣細節(jié)的差別太多了。
不同的公司 API 規(guī)范不一樣,這很正常。但是對于我來說,我如果想要代碼變得優(yōu)雅。我就必須解決一個痛點:
不同服務商 API 那么多的差異點,如何才能維護一套不涉及業(yè)務的公共 http 調(diào)用套件。最好通過配置或者簡單的參數(shù)就能區(qū)分開來。進行方便的調(diào)用?
我當然知道有很多優(yōu)秀的大名鼎鼎的 http 開源框架可以實現(xiàn)任何形式的 http 調(diào)用,在多年的開發(fā)經(jīng)驗中我都有使用過。比如 apache 的 httpClient 包,非常優(yōu)秀的 Okhttp , jersey client 。
這些 http 開源框架的接口使用相對來說,都不太一樣。不管選哪個,在我這個場景里來說,我都不希望在調(diào)用每個第三方的 http api 時寫上一堆 http 調(diào)用代碼。
所以,在這個場景里,我得對每種不同的 http api 進行封裝。這樣的代碼才能更加優(yōu)雅,業(yè)務代碼和 http 調(diào)用邏輯耦合度更低。
可惜,我比較懶。一來覺得封裝起來比較費時間,二來覺對封裝這種底層 http 調(diào)用來說,應該有更好的選擇。不想自己再去造輪子。
于是,我發(fā)現(xiàn)了一款優(yōu)秀的開源 http 框架,能屏蔽不同細節(jié) http api 所帶來的所有差異。能通過簡單的配置像調(diào)用 rpc 框架一樣的去完成極為復雜的 http 調(diào)用。
Forest https://gitee.com/dt_flys/forest
2.上手
Forest 支持了 Springboot 的自動裝配,所以只需要引入一個依賴就行 com.dtflys.forest spring-boot-starter-forest 1.4.0
定義自己的接口類 public interface MyClient { @Request(url = "http://baidu.com") String simpleRequest(); @Request( url = "http://ditu.amap.com/service/regeo", dataType = "json" ) Map getLocation(@DataParam("longitude") String longitude, @DataParam("latitude") String latitude); }
在啟動類里配置代理接口類的掃描包 @SpringBootApplication @ForestScan(basePackages = "com.example.demo.forest") public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
這時候,你就可以從 spring 容器中注入你的代理接口,像調(diào)用本地方法一樣去調(diào)用 http 的 api 了 @Autowired private MyClient myClient; @Override public void yourMethod throws Exception { Map result = myClient.getLocation("124.730329","31.463683"); System.out.println(JSON.toJSONString(result,true)); }
日志打印, Forest 打印了內(nèi)部所用的 http 框架,和實際請求 url 和返回。當然日志可以通過配置去控制開關(guān)。
3.特點
我覺得對于尤其是做對接第三方 api 的開發(fā)同學來說,這款開源框架能幫你提高很多效率。
Forest 底層封裝了 2 種不同的 http 框架: Apache httpClient 和 OKhttp 。所以這個開源框架并沒有對底層實現(xiàn)進行重復造輪子,而是在易用性上面下足了功夫。
我用 Forest 最終完成了和多個服務商 api 對接的項目,這些風格迥異的 API,我僅用了 1 個小時時間就把他們轉(zhuǎn)化為了本地方法。然后項目順利上線。
Forest 作為一款更加高層的 http 框架,其實你并不需要寫很多代碼,大多數(shù)時候,你僅通過一些配置就能完成 http 的本地化調(diào)用。而這個框架所能覆蓋的面,卻非常之廣,滿足你絕大多數(shù)的 http 調(diào)用請求。
Forest 有以下特點: 以 Httpclient 和 OkHttp 為后端框架 通過調(diào)用本地方法的方式去發(fā)送 Http 請求, 實現(xiàn)了業(yè)務邏輯與 Http 協(xié)議之間的解耦 相比 Feign 更輕量,不依賴 Spring Cloud 和任何注冊中心 支持所有請求方法: GET , HEAD , OPTIONS , TRACE , POST , DELETE , PUT , PATCH 支持靈活的模板表達式 支持過濾器來過濾傳入的數(shù)據(jù) 基于注解、配置化的方式定義 Http 請求 支持 Spring 和 Springboot 集成 實現(xiàn) JSON 和 XML 的序列化和反序列化 支持 JSON 轉(zhuǎn)換框架: Fastjson , Jackson , Gson 支持 JAXB 形式的 XML 轉(zhuǎn)換 支持 SSL 的單向和雙向加密 支持 http 連接池的設定 可以通過 OnSuccess 和 OnError 接口參數(shù)實現(xiàn)請求結(jié)果的回調(diào) 配置簡單,一般只需要 @Request 一個注解就能完成絕大多數(shù)請求的定義 支持異步請求調(diào)用
4.兩個很棒的功能
這里不對使用方式和配置方式一一描述,有興趣的可以去閱讀詳細文檔: https://dt_flys.gitee.io/forest
這里只想分析這個框架 2 個我認為比較好的功能
4.1 模板表達式和參數(shù)的映射綁定功能
模板表達式在使用的時候特別方便,舉個栗子 @Request( url = "${0}/send?un=${1}&pw=${2}&ph=${3}&ct=${4}", type = "get", dataType = "json" ) public Map send( String base, String userName, String password, String phone, String content );
上述是用序號下標進行取值,也可以通過名字進行取值: @Request( url = "${base}/send?un=${un}&pw=${pw}&ph=${3}&ct=${ct}", type = "get", dataType = "json" ) public Map send( @DataVariable("base") String base, @DataVariable("un") String userName, @DataVariable("pw") String password, @DataVariable("ph") String phone, @DataVariable("ct") String content );
甚至于可以這樣簡化寫: @Request( url = "${base}/send", type = "get", dataType = "json" ) public Map send( @DataVariable("base") String base, @DataParam("un") String userName, @DataParam("pw") String password, @DataParam("ph") String phone, @DataParam("ct") String content );
以上三種寫法是等價的
當然你也可以把參數(shù)綁定到 header 和 body 里去,你甚至于可以用一些表達式簡單的把對象序列化成 json 或者 xml: @Request( url = "${base}/pay", contentType = "application/json", type = "post", dataType = "json", headers = {"Authorization: ${1}"}, data = "${json($0)}" ) public PayResponse pay(PayRequest request, String auth);
當然數(shù)據(jù)綁定這塊詳情請參閱文檔
4.2 對 HTTPS 的支持
以前用其他 http 框架處理 https 的時候,總覺得特別麻煩,尤其是雙向證書。每次碰到問題也只能去 baidu 。然后根據(jù)別人的經(jīng)驗來修改自己的代碼。
Forest 對于這方面也想的很周到,底層完美封裝了對 https 單雙向證書的支持。也是只要通過簡單的配置就能迅速完成。舉個雙向證書栗子: @Request( url = "${base}/pay", contentType = "application/json", type = "post", dataType = "json", keyStore = "pay-keystore", data = "${json($0)}" ) public PayResponse pay(PayRequest request);
其中 pay-keystore 對應著 application.yml 里的 ssl-key-stores forest: ... ssl-key-stores: - id: pay-keystore file: test.keystore keystore-pass: 123456 cert-pass: 123456 protocols: SSLv3
這樣設置,就 ok 了,剩下的,就是本地代碼形式的調(diào)用了。
5.最后
Forest 有很多其他的功能設定,如果感興趣的同學還請仔細去閱讀文檔和示例。
但是我想說的是,相信看到這里,很多人一定會說,這不就是 Feign 嗎?
我在開發(fā) Spring Cloud 項目的時候,也用過一段時間 Feign ,個人感覺 Forest 的確在配置和用法上和 Feign 的設計很像,但 Feign 的角色更多是作為 Spring Cloud 生態(tài)里的一個成員。充當 RPC 通信的角色,其承擔的不僅是 http 通訊,還要對注冊中心下發(fā)的調(diào)用地址進行負載均衡。
而 Forest 這個開源項目其定位則是一個高階的 http 工具,主打友好和易用性。從使用角度出發(fā),個人感覺 Forest 配置性更加簡單直接。提供的很多功能也能解決很多人的痛點。
開源精神難能可貴,好的開源需要大家的添磚加瓦和支持。希望這篇文章能給大家在選擇 http 客戶端框架時帶來一個新的選擇: Forest
6.聯(lián)系作者
覺得有用的話,請關(guān)注下我的公眾號「元人部落」,作者堅持原創(chuàng)的內(nèi)容技術(shù)分享,也有開源作品,歡迎關(guān)注
開源倉庫為: https://gitee.com/bryan31
公眾號一般周更,每次會分享一些實用的技術(shù),陪你一起成長
關(guān)注后回復“資料”領(lǐng)取 50G 的視頻資料,包括一套企業(yè)級微服務的視頻教學
前沿探索
2020-08-27 16:54:11
前言
GitHub 應該是廣大開發(fā)者最常去的站點,這里面有大量的優(yōu)秀項目,是廣大開發(fā)者尋找資源,交友學習的好地方。尤其是前段時間 GitHub 公布了一項代碼存檔計劃——Arctic Code Vault,要把代碼埋入地下 250 米深的永久凍土層,可以將代碼保存一千年。此外,GitHub 還為開發(fā)者在配置文件中設計了紀念徽章。
想想自己的代碼可以作為人類的技術(shù)瑰寶被保存一千年,是不是有點自豪呢。
好了,言歸正傳。
雖然 GitHub 沒有被 Q,但是由于 CDN 服務器都在國外,所以國內(nèi)訪問 GitHub 的速度實在是慢的一匹,有時候經(jīng)常頁面刷不出,在我獲取知識的道路上增加了重重的阻礙。
所以,我肝了 3 小時,寫了一個在不用 T 子的情況下,加速 GitHub 訪問速度的小工具,最后會分享給大家。
同時,這篇文章也會分享其他加速 GitHub 訪問的方法。算是一個比較全的整理吧。
Let's get it!
自動生成最快訪問 host 的小工具
GitHub 在國內(nèi)訪問速度慢的原因其實有很多,但最主要的原因就是 GitHub 的分發(fā)加速網(wǎng)絡域名遭到 DNS 的污染。為了解決這個問題,網(wǎng)上有很多文章提供了一個解決方案,就是通過修改 Hosts 文件,繞過國內(nèi)的 DNS 解析,直接訪問 GitHub 的 CDN 節(jié)點,從而達到加速的目的。
但是我看大多數(shù)關(guān)于此方法的介紹,只提供 3 個 github 的相關(guān)域名,而且需要在 ipaddress.com 一個個去查,根據(jù)查到的 ip,再去自己 ping,肉眼選取最快的 ip,自行編輯成 IP+域名格式,貼到 hosts 文件里。
其實 GitHub 用到相關(guān)域名有很多,我整理了下,一共有十幾個 github.global.ssl.fastly.net github.com assets-cdn.github.com documentcloud.github.com gist.github.com help.github.com nodeload.github.com codeload.github.com raw.github.com status.github.com training.github.com avatars0.githubusercontent.com avatars1.githubusercontent.com avatars2.githubusercontent.com avatars3.githubusercontent.com
這要是一個個去查,一個個去選取,也是挺麻煩的。
為此我寫了一個工具,能自動的根據(jù)你當前 ip,去尋找這十幾個域名所對應最快的 CDN 節(jié)點,如果一個 ip 對應多個 CDN 節(jié)點,工具會自動幫你去 ping 10 次,取到平均值最小的 CDN 的 IP 地址。
你需要做的,只是把最終生成的結(jié)果貼到你的 hosts 文件中即可。
這個小工具,關(guān)注「元人部落」輸入 github 即可獲取到。
用法很簡單,只需要執(zhí)行以下命令即可運行 java -jar githubhost.jar
運行起來后,瀏覽器輸入 127.0.0.1:8880 即可自動進行根據(jù)你當前 Ip 進行分析:
分析大概需要十幾秒,進度條會自動刷新,等進度條滿了之后,即可看到生成內(nèi)容:
每個地區(qū)每個運營商可能運行出來的都不一樣,所以得出結(jié)果后,你就可以把這段內(nèi)容追加到你 hosts 文件中(如果不知道 hosts 存放位置,可以自行 baidu),然后根據(jù)提示讓 hosts 文件生效。
指定了 CDN 的訪問地址,可以讓你的 github 訪問至少無卡頓了。
碼云 GitHub 鏡像站
碼云提供了一個”碼云急速下載“站,每天從 github 上同步一些項目。 https://gitee.com/mirrors
個人感覺應該不是所有的 github 項目都會同步過來,看倉庫數(shù)量,有大概 15k 的項目
如果你想 clone 一些項目去研究,可以先在這里找找有沒有。碼云因為是國內(nèi)開源項目站點,git clone 速度自然不用擔心,但是很可惜的是
1.這個鏡像站點不是所有的 github 項目,不過大多數(shù)熱門項目都會有
2.issue 和 release 包也沒有,只有代碼
3.有一天的延遲。即你看到的是一天前的項目狀態(tài)
4.因為不是 github,所以你也沒法通過這個 push 到 github 上的項目
GitHub 鏡像站
這個鏡像站為: https://github.com.cnpmjs.org/
進入之后,完全和 github 沒有任何區(qū)別,訪問也很快。
尤其是 clone 代碼,那是飛快啊。。。
比如,你原先要 clone,這樣寫 git clone https://github.com/kubernetes/kubernetes.git
現(xiàn)在改成: git clone https://github.com.cnpmjs.org/kubernetes/kubernetes.git
試一下:
這個速度,應該無欲無求了吧。。。
不過這個方法可惜的是:
1.這個鏡像站很不穩(wěn)定,你時常會看到:
2.你每次 clone 還需要自己去修改 url,有點不方便
3.你依舊沒法 push
GitClone 站點
在尋找解決之道的途中,我又發(fā)現(xiàn)一個站點:gitclone https://gitclone.com/
這是一個 GitHub 的緩存加速節(jié)點,也大約緩存了 15k 個項目,但是 gitclone 單獨做了一個站點,里面可以進行搜索項目,甚至于還可以創(chuàng)建倉庫。
gitclone 的 clone 提供了多種方式來 clone
但是搜索到的項目,最終查看還是跳轉(zhuǎn)到 GitHub 相應的頁面。
所以其實和 gitee 鏡像站都差不多。換湯不換藥,問題和之前幾個鏡像站點差不多,不過你只是要 clone,還是不錯的選擇。
總結(jié)
其實在不用 T 子的情況下,方式無非就兩種: 修改 hosts,直接訪問最快的 CDN 節(jié)點,這種方式優(yōu)勢在于原汁原味。 通過鏡像去訪問和 clone,這種方式優(yōu)勢在于 clone 的速度。
個人推薦如果主要瀏覽為主,還是用上文推薦的工具去生成 hosts 進行配置,畢竟原汁原味,clone 大項目的話,可以考慮以上鏡像站點去加速下載。
關(guān)注作者
最后把這個開源工具分享給大家,關(guān)注「元人部落」公眾號,并回復 github 即可獲取到這個工具 jar 包。啟動后訪問 127.0.0.1:8880 端口即可自動生成。
一個堅持做原創(chuàng)的技術(shù)科技分享號,希望你能關(guān)注我,我每周會出一篇實用的原創(chuàng)技術(shù)文章,陪著你一起走,不再害怕。
前沿探索
2020-08-27 16:54:03
最近公司不知道為什么,突然要做一個什么邊緣計算,領(lǐng)導讓我們先自己找找資料,預演一下,頭疼
前沿探索
2020-08-27 16:53:57
用過不少 httpclient , 感覺大部分 client 細節(jié)非常多. 但其實對于后端來說,幾乎所有的都是非常簡單的 json 請求, 用起來頗有一種大炮打蚊子的感覺.
目前公司系統(tǒng)針對各自的請求對 apache httpclient 進行了非常簡單的封裝,但即便如此,也不具備通用性.想問下各位 V 友,你們是怎么選擇 httpclient 的 , 有沒有進行過二次封裝
1, java 9+ 自帶 httpclient(我比較喜歡這種鏈式調(diào)用的,但是 java8 沒有)
2, apache 原生 httpclient
3, 封裝過的 apache httpclient
4, OkHttp
5, Feign
6, RestTemplate
7, Retrofit
前沿探索
2020-08-27 16:53:53
JVM Specification memory model Program Counter (PC) Register JVM Stacks Native Method Stacks Heap Method Area Run-time Constant Pool
Java 8 HotSpot JVM memory model Java Heap Young Generation Eden Survivor Virtual Old Generation Metaspace Compressed Class Space CodeCache Native Memory
前沿探索
2020-08-27 16:53:41
看了 thenCompose 的源碼,感覺弄得挺復雜,到底該怎么理解它???感覺都不知道怎么應用 thenCompose其實和 thenCombine 也差不多嘛,也是依賴于兩個輸入。
前沿探索
2020-08-27 16:53:25
我本來以為要用 mq,后來發(fā)現(xiàn)數(shù)據(jù)庫修改一次,mongodb 中,修改好多次,好像不可取,但是又想不到其他的辦法,所以想問下各位 v 友們,大家是怎么解決這個問題的。
前沿探索
2020-08-27 16:53:19
select a.id, c.name as status ,d.name as type from a left join b c on a.status =c.id left join b d on a.type =d.id select a.id, (selct name from b where a.status = b.id) as status, (selct name from b where a.type = b.id) as type from a
a 表與 b 表關(guān)聯(lián),b 作為字典表,存著名稱等信息,a 只有 id 。
不討論這個表結(jié)構(gòu)改變等等(以及用了很久,數(shù)據(jù)很多,而且不是我能決定的),僅從 SQL 角度
1.兩種寫法我都覺得很丑陋,有沒有更好的
2.如果沒有的話,哪一種稍微好一點
前沿探索
2020-08-27 16:53:02
背景
之前一直以為 MySQL 的多表關(guān)聯(lián)查詢語句是首先對 FROM 語句的前兩張表執(zhí)行笛卡爾積,產(chǎn)生一張?zhí)摂M表,然后使用 ON 過濾和 OUTER JOIN 添加外部行,再使用過濾后的虛擬表跟第三張表進行笛卡爾乘積,重復執(zhí)行上述步驟。下面是從網(wǎng)上搜到一些比較熱門的 SQL 執(zhí)行順序的文章,大家應該很熟悉吧,尤其是下面那張魚骨圖。 摘自: 步步深入:MySQL 架構(gòu)總覽->查詢執(zhí)行流程->SQL 解析順序
摘自: Mysql - JOIN 詳解
問題描述
最近由于工作需要,對 SQL 查詢性能要求比較高,閱讀了《 高性能 MySQL (第 3 版) 》查詢優(yōu)化的相關(guān)章節(jié),在“6.4.3 查詢優(yōu)化處理”章節(jié)有這樣一句話: MySQL 對任何關(guān)聯(lián)都執(zhí)行嵌套循環(huán)關(guān)聯(lián)操作 ,即 MySQL 先在一個表中循環(huán)讀取單條數(shù)據(jù),然后再嵌套循環(huán)到下一個表中尋找匹配的行,依次下去,直到找到所有表中匹配的行為止。然后根據(jù)各個表匹配的行,返回查詢中需要的各個列。MySQL 會嘗試在最后一個關(guān)聯(lián)表中找到所有匹配的行,如果最后一個關(guān)聯(lián)表無法找到更多的行以后,MySQL 返回到上一層次關(guān)聯(lián)表,看是否能夠找到更多的匹配記錄,依次類推迭代執(zhí)行。
于是對之前的認識產(chǎn)生懷疑,如果所有關(guān)聯(lián)都是嵌套循環(huán)關(guān)聯(lián)查詢的話,只有當沒有任何過濾條件時兩張表才會產(chǎn)生笛卡爾乘積,而且這個笛卡爾乘積是一個結(jié)果,并不是關(guān)聯(lián)查詢的步驟,而且如果兩張幾十萬、上百萬的表進行笛卡爾乘積,這數(shù)據(jù)量有點巨大了。。。在 MySQL 的官方手冊 中也印證了嵌套循環(huán)操作:
在博客園找到 神奇的 SQL 之 聯(lián)表細節(jié) → MySQL JOIN 的執(zhí)行過程(一) 這篇博客對上述笛卡爾乘積也有同樣的疑問,而且給出了實際的案例分析,個人比較認同該博主的觀點。里面有這樣一個案例:
從這個案例可以看出當查詢優(yōu)化器使用 Index Nested-Loop 即索引嵌套循環(huán),WHERE 條件首先通過索引過濾驅(qū)動表的數(shù)據(jù)然后再關(guān)聯(lián)被驅(qū)動表,更加印證了 WHERE 不是在兩表生成笛卡爾乘積后才進行過濾的。如果從“嵌套循環(huán)關(guān)聯(lián)”的角度看,之前的關(guān)聯(lián)表先生成笛卡爾乘積再進行過濾的理論是站不住腳的。
那么問題就是 這種“笛卡爾乘積過濾”的理論有什么歷史原因嗎,為什么網(wǎng)上的文章大部分都是這種,還是我對“嵌套循環(huán)查詢”有誤解? 我相信有不少小伙伴跟我一樣的疑惑吧,還望 V 站大佬給指點迷津。
前沿探索
2020-08-27 16:52:55
https://www.w3school.com.cn/sql/sql_join_left.asp 想要 結(jié)果 Adams John 24562 Carter Thomas 77895 Bush George
前沿探索
2020-08-27 16:52:52
已經(jīng)很多次碰到這種情況了,一直得不到很好的解決方案,寫個帖子問問。
SELECT DISTINCT p.id , p.channel_id, o.channel_name, d.drug_manufacturer, p.patient_name, p.patient_gender, p.patient_age, p.patient_tel, p.diagnostic_name AS diagnosis, p.doctor_name, p.review_doctor_name AS pharmacist_name, p.pharmacist_name AS config_pharmacist_name, p.STATUS, p.review_time, p.rp_id, p.rp_url, p.refuce_reason, p.total_price, p.add_time FROM prescription_in_channel p, org_channel o, drug_in_channel d WHERE p.id = d.pre_id AND o.id = p.channel_id ORDER BY p.add_time DESC limit 1,10
上述語句中,沒加 order by 目前是 0.2s 左右的時間,加了之后,變?yōu)?1.5s 。后期業(yè)務數(shù)據(jù)會逐步變多,我想到時候肯定就特慢了。 不知道有沒有什么好的解決方案?
前沿探索
2020-08-27 16:52:43
版本變化
Hi,各位同學大家好! Dcat Admin 又發(fā)布新版本了,此次版本更新主要是 優(yōu)化界面 增加全組件異步渲染功能 還有一些細節(jié)上的優(yōu)化以及若干 Bug 修復
關(guān)于 2.0
2.0 會是一個更加輕量和簡潔的版本,在 2.0 版本中我們將會上線: 全新插件系統(tǒng),對普通用戶和開發(fā)者都更加友好(將會兼容 composer 安裝和在線安裝兩種方式) 開發(fā)全新主題,以及更友好的主題擴展機制 重構(gòu)內(nèi)部一些不合理的功能設計 提煉、簡化核心功能,把一些非必要的相對復雜的功能移至插件中心
關(guān)于進度
2.0 會在 1.0 的基本功能相對完善之后發(fā)布,目前仍在開發(fā)中,相信很快就能跟大家見面,感謝大家的關(guān)注!
下面簡單介紹一下此次更新的主要內(nèi)容
全新菜單樣式
新菜單樣式體驗請前往 演示站點 (點擊 網(wǎng)站設置 可以切換樣式),效果如下 界面的樣式效果一直都是 Dcat Admin 的重點優(yōu)化項目之一,后續(xù)也會根據(jù)用戶的反饋不斷改進和開發(fā)新的主題
全組件異步渲染支持
這個版本對異步加載功能進行了優(yōu)化,使其支持了 靜態(tài)資源按需加載 的特性。 目前內(nèi)置的 所有組件 都支持使用異步渲染功能,并且支持在頁面的 任意位置 上使用,詳細用法請參考文檔? 異步加載 。
定義渲染類 id; // 查詢數(shù)據(jù)邏輯 $data = [...]; // 這里可以返回內(nèi)置組件,也可以返回視圖文件或 HTML 字符串 return Bar::make($data); } }
使用 public function index(Content $content) { $modal = Modal::make() ->lg() ->delay(300) // loading 效果延遲時間設置長一些,否則圖表可能顯示不出來 ->title('異步加載 - 圖表') ->body(PostChart::make()) ->button(''); return $content->body($modal); }
效果
異步加載表單,創(chuàng)建表單類如下 success('保存成功'); } public function form() { $this->text('name')->required()->help('用戶昵稱'); $this->image('avatar')->autoUpload(); $this->password('old_password'); $this->password('password') ->minLength(5) ->maxLength(20); $this->password('password_confirmation') ->same('password'); } }
使用 public function index(Content $content) { $modal = Modal::make() ->lg() ->title('異步加載 - 表單') ->body(UserProfile::make()) ->button(''); return $content->body($modal); }
效果
表格選擇器
之前的版本中提供了 彈窗選擇器 功能,但部分同學反映這個功能體驗不是很好,所以這次版本增加了 表格選擇器(selectTable) 表單,用來替代 彈窗選擇器 功能 use App\Admin\Renderable
前沿探索
2020-08-27 16:52:30
用 floor 會出現(xiàn)這種問題,但是 round 就沒事
但是其他浮點數(shù)我也試了下 floor 正常
前沿探索
2020-08-27 16:52:23
我在服務器上直接安裝是服務商的 OPENCART,我需要純凈的。另外協(xié)助主題安裝。謝謝。付費
前沿探索
2020-08-27 16:52:07
很多平臺比如微信公眾號,為了驗證域名。 會需要將微信平臺的一個 [校驗文件] 放到域名下面。
比如:
a.example.com/asdf.txt 校驗輸出是不是: 這個文件里的內(nèi)容,內(nèi)容差不多是個 md5 值長度。
現(xiàn)在 a.example.com 我指向了 Ingress-controller 了。 直覺應該是可以配置 Ingress 可以做到。 但是不知道怎么寫。
前沿探索
2020-08-27 16:51:58
現(xiàn)在是通過每 5 分鐘輪詢一遍集群所有資源,然后和數(shù)據(jù)庫數(shù)據(jù)對比做增量修改的方式,但是實時性比較差。幾秒一輪詢平臺這邊性能不太夠。有沒有可以實時監(jiān)控到資源有變動可以通知的方法,比如某個 Deployment 在集群中被刪了,回調(diào)平臺的某個接口把數(shù)據(jù)庫中對應的資源也刪掉?
前沿探索
2020-08-27 16:51:47
1. 介紹
https://github.com/kubedoctor/kubedoctor
在前些日子的日常開發(fā)中,萌生了寫一個自定義腳本 Action 的 macOS kubernetes 客戶端想法。比如在對多集群時,通過鼠標右鍵操作預先定義的腳本,減少對資源重復動作的操作,提高一點效率,還不容易眼花。
目前只有自定義腳本 Action,和 YAML 預覽,編輯還不太成熟,對頻繁編輯需求可以自定義 Action 比如打開 vim 、VSCode 。
2. 特點: 面向資源腳本 Action 菜單; 原生語言編寫,占用內(nèi)存低。
3. 使用 創(chuàng)建 vim ~/.kube/kd.yml 配置文件 定義相關(guān) Action,例如下面的例子: version: 1 resourcesKind: # 模式,這個暫時未實現(xiàn),是根據(jù)過濾模式列出關(guān)心的資源 mode: "" list: ["pods", "deployments.app"] rightMenus: common: - name: "概述" script: "kubectl describe {{ data.kind }} {{ data.metadata.name }} -n {{ data.metadata.namespace }} --context {{ context }}" # action 支持復制到剪切板和直接運行 # clipboard: 復制到剪切板 # shell: 直接運行 action: clipboard - name: "編輯" script: "{{ kubectl }} get {{ data.kind }} {{ data.metadata.name }} -o yaml -n {{ data.metadata.namespace }} --context {{ context }} > ${TMPDIR}/{{ data.metadata.name }}.yaml && /usr/local/bin/code ${TMPDIR}/{{ data.metadata.name }}.yaml" action: shell - name: "刪除" script: "kubectl delete {{ data.kind }} {{ data.metadata.name }} -n {{ data.metadata.namespace }} --context {{ context }}" action: clipboard Kind: - name: pods group: - - name: "日志" script: "kubectl logs {{ data.metadata.name }} -n {{ data.metadata.namespace }} --context {{ context }} -f --tail 300" action: clipboard
4. 想發(fā):
發(fā)在 V2EX 論壇,如果大家喜歡,點個 Start 。 后續(xù)會加一些功能比如 Watch 資源刷新和 Helm Isito 相關(guān)的支持。
前沿探索
2020-08-27 16:51:36
需求:類似 LastPass 這種可以自動填充用戶名密碼,點擊提交
難點:很多現(xiàn)代化的頁面前端做了表單校驗,直接賦值 input 的 value 不能通過表單校驗
關(guān)鍵在于沒能觸發(fā)人家框架的 event listener
查資料咯,發(fā)現(xiàn)了這個解答 https://stackoverflow.com/a/35807417 就是觸發(fā) input 、keyup 、change 事件,但實際測試仍然不行,甚至我把在開發(fā)人員工具能看到的 event listner 全觸發(fā)了一邊都沒用 sad function fireChangeEvents(element){ var changeEvent = null; for(var i of ["keypress","focus", "input", "keydown", "keyup", "change", "blur", "click", "invalid", "mouseover", "popstate", "reset", "scroll", "selectionchange", "submit", "transitionend"]){ changeEvent = document.createEvent ("HTMLEvents"); changeEvent.initEvent (i, true, true); element.dispatchEvent (changeEvent); } } fireChangeEvents(document.querySelectorAll("input")[0])
然后接著找,發(fā)現(xiàn)一個能模擬用戶交互的 npm 包: https://github.com/testing-library/user-event
然后折騰了一下 browserify 打包成瀏覽器可以用的 js 文件,實際測試可行: userEvent.type(document.querySelectorAll("input")[0], USERNAME); userEvent.type(document.querySelectorAll("input")[1], PASSWORD);
問題是解決了,但覺得為了一個觸發(fā) event 引入一個 500KB 的 js 文件有點蠢( uglify 之后也有 300KB ),問問大佬們有沒有更好的方案,不需要引入這么重的 js 庫的
前沿探索
2020-08-27 16:51:32
現(xiàn)在有一個需求,要使用 websocket 傳輸數(shù)據(jù),時間大概幾秒鐘。
想在傳輸數(shù)據(jù)的時候,同時裝備下一份數(shù)據(jù)。準備的時候,也大概幾秒鐘。
所以,就在想,能否把這兩塊并行起來。
初步想法 /方法,就是用 Promise.all ,但貌似代碼不是很好寫。
因為 websocket 的調(diào)用,什么 onmessage 等等,不太好放入到 promise 里面去。
有沒有兄弟知道怎么做?或者有其它更好的方法?比如 multi-threads?
謝謝。
p.s. JavaScript/TypeScript 前端
前沿探索
2020-08-27 16:51:23
跪求大佬能給點思路,圖片轉(zhuǎn) base64 只會比原來大概大 1/3 呀,我的代碼如下 https://github.com/Stuk/jszip/issues/709 跪求大佬 感謝!
前沿探索
2020-08-27 16:51:13
/*兩個 VNode 節(jié)點相同則直接返回*/ if (oldVnode === vnode) { return }
沒記錯的話,oldVnode 和 vnode 都是對象,這樣的對比有什么意義呢,難道是判斷這兩個是同一個對象嗎?
實在是沒弄明白,求解答
前沿探索
2020-08-27 16:50:58
如果用到 dynamodb,s3,cognito, 又不想使用國內(nèi) aws,如何通過代理或中繼的方式提供訪問呢?
前沿探索
2020-08-27 16:50:33
第一次被 DDOS 后就套了 Cloudflare 換了服務器 IP,接著就開始被 CC,然后我花了半個月時間把網(wǎng)站變成了靜態(tài)站,接著再次被 DDOS,即使禁了服務器 IPv4 只在 cf AAAA 解析 IPv6 。確認服務器 IP 沒有泄露,請求好像都是 cf 的 IP 來的。
前沿探索
2020-08-27 16:50:13