早 發(fā)自 凹非寺
量子位 報(bào)道 | 公眾號(hào) QbitAI
萬(wàn)萬(wàn)沒(méi)想到,如此普通的復(fù)選框,竟也能玩出這種高度!
例如點(diǎn)一下復(fù)選框,屏幕就像被投入石子的水面泛出波紋:
設(shè)定好初始狀態(tài),就可以開(kāi)始展示《生命游戲》的演化過(guò)程;
控制上下左右,還能還原經(jīng)典游戲《貪吃蛇》;
這就是一位做前端開(kāi)發(fā)的小哥Bryan,近期在自己的網(wǎng)站上發(fā)布的有關(guān)checkbox (復(fù)選框)的新玩法。
這個(gè)項(xiàng)目在Hacker News上引來(lái)了大量網(wǎng)友評(píng)論。
高贊評(píng)論已經(jīng)給小朋友安排得明明白白了~
而面對(duì)一些諸如“為什么要用復(fù)選框,普通像素就可以達(dá)到這種效果”的質(zhì)疑,也有人為Bryan說(shuō)話:
回到這件事本身,其實(shí)在去年早些時(shí)候,他就建了一個(gè)名為Checkboxland的JavaScript庫(kù)。
它可以將任何內(nèi)容呈現(xiàn)為HTML復(fù)選框。
講真,剛才展示的復(fù)選框效果,只能說(shuō)是“開(kāi)胃菜”。
不僅僅是簡(jiǎn)單的動(dòng)畫(huà),日常拍下的照片,記錄的生活vlog,一樣可以成為“復(fù)選框”的素材。
小哥本人也一度以為靈感耗盡,但在參閱了一篇關(guān)于將圖像轉(zhuǎn)化為ASCII的文章之后,Bryan將耐克和蘋(píng)果的logo轉(zhuǎn)化了出來(lái)(不建議轉(zhuǎn)化迪士尼的logo)。
小哥本人也是老二次元了,《Bad Apple》也是信手拈來(lái):
隨后,自嘲“the CheckBox guy”的小哥賦予了復(fù)選框更多的可能,他又拓展了Checkboxland API,用來(lái)加載任何視頻并生成復(fù)選框版本。
下面這個(gè)看起來(lái)就像進(jìn)入了《星際穿越》的五維立方體。
而此刻你如果打開(kāi)攝像頭,Bryan還可以帶領(lǐng)你半只腳踏進(jìn)《黑客帝國(guó)》~
趕快學(xué)起來(lái),說(shuō)不定還能用來(lái)畫(huà)心形圖,成為你的表白神器(不是)!
看似炫酷的效果實(shí)際制作過(guò)程只需分為兩大步,手把手教你!
1.做出原本的圖像。
2.將圖像轉(zhuǎn)化為ASCII文本輸出。
以水波為例,首先要生成這樣動(dòng)態(tài)的水波。
想要生成它,需要以中心為原點(diǎn),在xy平面上建立正弦函數(shù)。
z軸垂直屏幕向外,把z軸的數(shù)值轉(zhuǎn)化為灰度,白色為波峰,黑色為波谷。
然后在圖形計(jì)算器desmos上讓水波動(dòng)起來(lái),這樣第一步就完成了。
第二步,將第一步的成果轉(zhuǎn)化為ASCII碼輸出。
這一步的轉(zhuǎn)化主要涉及到將彩色對(duì)應(yīng)灰度。
采用這個(gè)公式,即使是彩色的圖片,也只不過(guò)是五彩斑斕的灰罷了~
GrayScale = 0.21 R + 0.72 G + 0.07 B
提取原圖的RGB色彩,輸出為灰度:
const toGrayScale = (r, g, b) => 0.21 * r + 0.72 * g + 0.07 * b;
const convertToGrayScales = (context, width, height) => {
const imageData = context.getImageData(0, 0, width, height);
const grayScales = [];
for (let i = 0 ; i < imageData.data.length ; i += 4) {
const r = imageData.data[i];
const g = imageData.data[i + 1];
const b = imageData.data[i + 2];
const grayScale = toGrayScale(r, g, b);
imageData.data[i] = imageData.data[i + 1] = imageData.data[i + 2] = grayScale;
grayScales.push(grayScale);
}
context.putImageData(imageData, 0, 0);
return grayScales;
};
然后為每個(gè)像素賦灰度值:
const grayRamp = '$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~<>i!lI;:,"^`\'. ';
const rampLength = grayRamp.length;
const getCharacterForGrayScale = grayScale => grayRamp[Math.ceil((rampLength - 1) * grayScale / 255)];const asciiImage = document.querySelector('pre#ascii');
const drawAscii = (grayScales) => {
const ascii = grayScales.reduce((asciiImage, grayScale) => {
return asciiImage + getCharacterForGrayScale(grayScale);
}, '');
asciiImage.textContent = ascii;
};
最后調(diào)整一下圖片大小就大功告成了~更多詳細(xì)內(nèi)容見(jiàn)文后鏈接~
在最近的更新中,Bryan稱(chēng),他創(chuàng)造新天地的事情將暫時(shí)告一段落。
但是他不僅留下了復(fù)選框新玩法原理的詳細(xì)介紹,還有自制的豐富的demos。這些足以讓你探索創(chuàng)造。
簡(jiǎn)單的動(dòng)畫(huà),貪吃蛇,通過(guò)攝像頭實(shí)時(shí)生成復(fù)選框版圖像(demos中的webcam)…
點(diǎn)擊即可試玩,以貪吃蛇和webcam為例:
點(diǎn)擊snake,鍵盤(pán)上下左右即可控制貪吃蛇:
點(diǎn)擊webcam,打開(kāi)前置攝像頭,可以看到自己的實(shí)時(shí)動(dòng)態(tài):
根據(jù)網(wǎng)友的反饋,似乎在安卓系統(tǒng)中打開(kāi)會(huì)白屏,但是在Mac Safari, iPhone Safari, 桌面Chrome上都可以使用。
感興趣的小伙伴,快來(lái)試試吧~
參考鏈接:
[1]https://www.bryanbraun.com/2021/09/21/i-keep-making-things-out-of-checkboxes/
[2]https://news.ycombinator.com/item?id=28826018
[3]https://www.jonathan-petitcolas.com/2017/12/28/converting-image-to-ascii-art.html
[4]https://www.bryanbraun.com/checkboxland/#demos
[5]https://github.com/bryanbraun/checkboxland
— 完 —
量子位 QbitAI · 頭條號(hào)簽約
關(guān)注我們,第一時(shí)間獲知前沿科技動(dòng)態(tài)
ss實(shí)現(xiàn)簡(jiǎn)單實(shí)用的復(fù)選框,常用于自定義復(fù)選框的頁(yè)面當(dāng)中!實(shí)現(xiàn)效果如下:
代碼如下:
html布局:
css樣式:
6年的時(shí)候花了一些時(shí)間整理了一些關(guān)于jvm的介紹文章,到現(xiàn)在回顧起來(lái)還是一些還沒(méi)有補(bǔ)充全面,其中就包括如何利用工具來(lái)監(jiān)控調(diào)優(yōu)前后的性能變化。工具做為圖形化界面來(lái)展示更能直觀的發(fā)現(xiàn)問(wèn)題,另一方面一些耗費(fèi)性能的分析(dump文件分析)一般也不會(huì)在生產(chǎn)直接分析,往往dump下來(lái)的文件達(dá)1G左右,人工分析效率較低,因此利用工具來(lái)分析jvm相關(guān)問(wèn)題,長(zhǎng)長(zhǎng)可以到達(dá)事半功倍的效果來(lái)。
jvm監(jiān)控分析工具一般分為兩類(lèi),一種是jdk自帶的工具,一種是第三方的分析工具。jdk自帶工具一般在jdk bin目錄下面,以exe的形式直接點(diǎn)擊就可以使用,其中包含分析工具已經(jīng)很強(qiáng)大,幾乎涉及了方方面面,但是我們最常使用的只有兩款:jconsole.exe和jvisualvm.exe;第三方的分析工具有很多,各自的側(cè)重點(diǎn)不同,比較有代表性的:MAT(Memory Analyzer Tool)、GChisto等。
對(duì)于大型 JAVA 應(yīng)用程序來(lái)說(shuō),再精細(xì)的測(cè)試也難以堵住所有的漏洞,即便我們?cè)跍y(cè)試階段進(jìn)行了大量卓有成效的工作,很多問(wèn)題還是會(huì)在生產(chǎn)環(huán)境下暴露出來(lái),并且很難在測(cè)試環(huán)境中進(jìn)行重現(xiàn)。JVM 能夠記錄下問(wèn)題發(fā)生時(shí)系統(tǒng)的部分運(yùn)行狀態(tài),并將其存儲(chǔ)在堆轉(zhuǎn)儲(chǔ) (Heap Dump) 文件中,從而為我們分析和診斷問(wèn)題提供了重要的依據(jù)。其中VisualVM和MAT是dump文件的分析利器。
Jconsole(Java Monitoring and Management Console)是從java5開(kāi)始,在JDK中自帶的java監(jiān)控和管理控制臺(tái),用于對(duì)JVM中內(nèi)存,線程和類(lèi)等的監(jiān)控,是一個(gè)基于JMX(java management extensions)的GUI性能監(jiān)測(cè)工具。jconsole使用jvm的擴(kuò)展機(jī)制獲取并展示虛擬機(jī)中運(yùn)行的應(yīng)用程序的性能和資源消耗等信息。
直接在jdk/bin目錄下點(diǎn)擊jconsole.exe即可啟動(dòng),界面如下:
在彈出的框中可以選擇本機(jī)的監(jiān)控本機(jī)的java應(yīng)用,也可以選擇遠(yuǎn)程的java服務(wù)來(lái)監(jiān)控,如果監(jiān)控遠(yuǎn)程服務(wù)需要在tomcat啟動(dòng)腳本中添加如下代碼:
-Dcom.sun.management.jmxremote.port=6969
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
連接進(jìn)去之后,就可以看到j(luò)console概覽圖和主要的功能:概述、內(nèi)存、線程、類(lèi)、VM、MBeans
簡(jiǎn)介
VisualVM 是一個(gè)工具,它提供了一個(gè)可視界面,用于查看 Java 虛擬機(jī) (Java Virtual Machine, JVM) 上運(yùn)行的基于 Java 技術(shù)的應(yīng)用程序(Java 應(yīng)用程序)的詳細(xì)信息。VisualVM 對(duì) Java Development Kit (JDK) 工具所檢索的 JVM 軟件相關(guān)數(shù)據(jù)進(jìn)行組織,并通過(guò)一種使您可以快速查看有關(guān)多個(gè) Java 應(yīng)用程序的數(shù)據(jù)的方式提供該信息。您可以查看本地應(yīng)用程序以及遠(yuǎn)程主機(jī)上運(yùn)行的應(yīng)用程序的相關(guān)數(shù)據(jù)。此外,還可以捕獲有關(guān) JVM 軟件實(shí)例的數(shù)據(jù),并將該數(shù)據(jù)保存到本地系統(tǒng),以供后期查看或與其他用戶(hù)共享。
VisualVM 是javajdk自帶的最牛逼的調(diào)優(yōu)工具了吧,也是我平時(shí)使用最多調(diào)優(yōu)工具,幾乎涉及了jvm調(diào)優(yōu)的方方面面。同樣是在jdk/bin目錄下面雙擊jvisualvm.exe既可使用,啟動(dòng)起來(lái)后和jconsole 一樣同樣可以選擇本地和遠(yuǎn)程,如果需要監(jiān)控遠(yuǎn)程同樣需要配置相關(guān)參數(shù),主界面如下;
VisualVM可以根據(jù)需要安裝不同的插件,每個(gè)插件的關(guān)注點(diǎn)都不同,有的主要監(jiān)控GC,有的主要監(jiān)控內(nèi)存,有的監(jiān)控線程等。
如何安裝:
1、從主菜單中選擇“工具”>“插件”。
2、在“可用插件”標(biāo)簽中,選中該插件的“安裝”復(fù)選框。單擊“安裝”。
3、逐步完成插件安裝程序。
我這里以 Eclipse(pid 22296)為例,雙擊后直接展開(kāi),主界面展示了系統(tǒng)和jvm兩大塊內(nèi)容,點(diǎn)擊右下方j(luò)vm參數(shù)和系統(tǒng)屬性可以參考詳細(xì)的參數(shù)信息.
因?yàn)閂isualVM的插件太多,我這里主要介紹三個(gè)我主要使用幾個(gè):監(jiān)控、線程、Visual GC
監(jiān)控的主頁(yè)其實(shí)也就是,cpu、內(nèi)存、類(lèi)、線程的圖表
線程和jconsole功能沒(méi)有太大的區(qū)別
Visual GC 是常常使用的一個(gè)功能,可以明顯的看到年輕代、老年代的內(nèi)存變化,以及gc頻率、gc的時(shí)間等。
以上的功能其實(shí)jconsole幾乎也有,VisualVM更全面更直觀一些,另外VisualVM非常多的其它功能,可以分析dump的內(nèi)存快照,dump出來(lái)的線程快照并且進(jìn)行分析等,還有其它很多的插件大家可以去探索
MAT是什么?
MAT(Memory Analyzer Tool),一個(gè)基于Eclipse的內(nèi)存分析工具,是一個(gè)快速、功能豐富的Java heap分析工具,它可以幫助我們查找內(nèi)存泄漏和減少內(nèi)存消耗。使用內(nèi)存分析工具從眾多的對(duì)象中進(jìn)行分析,快速的計(jì)算出在內(nèi)存中對(duì)象的占用大小,看看是誰(shuí)阻止了垃圾收集器的回收工作,并可以通過(guò)報(bào)表直觀的查看到可能造成這種結(jié)果的對(duì)象。
通常內(nèi)存泄露分析被認(rèn)為是一件很有難度的工作,一般由團(tuán)隊(duì)中的資深人士進(jìn)行。不過(guò)要介紹的 MAT(Eclipse Memory Analyzer)被認(rèn)為是一個(gè)“傻瓜式“的堆轉(zhuǎn)儲(chǔ)文件分析工具,你只需要輕輕點(diǎn)擊一下鼠標(biāo)就可以生成一個(gè)專(zhuān)業(yè)的分析報(bào)告。和其他內(nèi)存泄露分析工具相比,MAT 的使用非常容易,基本可以實(shí)現(xiàn)一鍵到位,即使是新手也能夠很快上手使用。
MAT以eclipse 插件的形式來(lái)安裝,具體的安裝過(guò)程就不在描述了,可以利用visualvm或者是 jmap命令生產(chǎn)堆文件,導(dǎo)入eclipse mat中生成分析報(bào)告:
生產(chǎn)這會(huì)報(bào)表的同時(shí)也會(huì)在dump文件的同級(jí)目錄下生成三份(dump_Top_Consumers.zip、dump_Leak_Suspects.zip、dump_Top_Components.zip)分析結(jié)果的html文件,方便發(fā)送給相關(guān)同事來(lái)查看。
需要關(guān)注的是下面的Actions、Reports、Step by Step區(qū)域:
以上只是一個(gè)初級(jí)的介紹,mat還有更強(qiáng)大的使用,比如對(duì)比堆內(nèi)存,在生產(chǎn)環(huán)境中往往為了定位問(wèn)題,每隔幾分鐘dump出一下內(nèi)存快照,隨后在對(duì)比不同時(shí)間的堆內(nèi)存的變化來(lái)發(fā)現(xiàn)問(wèn)題。
GChisto是一款專(zhuān)業(yè)分析gc日志的工具,可以通過(guò)gc日志來(lái)分析:Minor GC、full gc的時(shí)間、頻率等等,通過(guò)列表、報(bào)表、圖表等不同的形式來(lái)反應(yīng)gc的情況。雖然界面略顯粗糙,但是功能還是不錯(cuò)的。
配置好本地的jdk環(huán)境之后,雙擊GChisto.jar,在彈出的輸入框中點(diǎn)擊 add 選擇gc.log日志
不過(guò)這款工具已經(jīng)不再維護(hù),不能識(shí)別最新jdk的日志文件。
GCViewer也是一款分析小工具,用于可視化查看由Sun / Oracle, IBM, HP 和 BEA Java 虛擬機(jī)產(chǎn)生的垃圾收集器的日志,gcviewer個(gè)人感覺(jué)顯示 的界面比較亂沒(méi)有GChisto更專(zhuān)業(yè)一些。
這是一個(gè)web工具,在線使用非常方便.
地址: http://gceasy.io
進(jìn)入官網(wǎng),講打包好的zip或者gz為后綴的壓縮包上傳,過(guò)一會(huì)就會(huì)拿到分析結(jié)果。
推薦使用此工具進(jìn)行g(shù)c分析。
前期jvm系類(lèi)文章回顧:
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。