天來給大家分享一個JavaScript黑客質感背景特效
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
</head>
<body>
<style type="text/CSS">
table{width: 600px;}
.matrix { font-family:Lucida Console, Courier, Monotype; font-size:10pt; text-align:center; width:10px; padding:0px; margin:0px;}
</style>
<script type="text/javascript" language="Javascript">
var rows=11; // must be an odd number
var speed=50; // lower is faster
var reveal=2; // between 0 and 2 only. The higher, the faster the Word appears
var effectalign="default" //enter "center" to center it.
var w3c=document.getElementById && !window.Opera;;
var ie45=document.all && !window.opera;
var ma_tab, matemp, ma_bod, ma_row, x, y, columns, ma_txt, ma_cho;
var m_coch=new Array();
var m_copo=new Array();
window.onload=function () {
if (!w3c && !ie45) return
var matrix=(w3c) ? document.getElementById("matrix") : document.all["matrix"];
ma_txt=(w3c) ? matrix.firstChild.nodeValue : matrix.innerHTML;
ma_txt=" " + ma_txt + " ";
columns=ma_txt.length;
if (w3c) {
while (matrix.childNodes.length) matrix.removeChild(matrix.childNodes[0]);
ma_tab=document.createElement("table");
ma_tab.setAttribute("border", 0);
ma_tab.setAttribute("align", effectalign);
ma_tab.style.backgroundColor="#000000";
ma_bod=document.createElement("tbody");
for (x=0; x < rows; x++) {
ma_row=document.createElement("tr");
for (y=0; y < columns; y++) {
matemp=document.createElement("td");
matemp.setAttribute("id", "Mx" + x + "y" + y);
matemp.className="matrix";
matemp.appendChild(document.createTextNode(String.fromCharCode(160)));
ma_row.appendChild(matemp);
}
ma_bod.appendChild(ma_row);
}
ma_tab.appendChild(ma_bod);
matrix.appendChild(ma_tab);
} else {
ma_tab='<ta' + 'ble align="' + effectalign + '" border="0" style="background-color:#000000">';
for (var x=0; x < rows; x++) {
ma_tab +='<t' + 'r>';
for (var y=0; y < columns; y++) {
ma_tab +='<t' + 'd class="matrix" id="Mx' + x + 'y' + y + '"> </' + 'td>';
}
ma_tab +='</' + 'tr>';
}
ma_tab +='</' + 'table>';
matrix.innerHTML=ma_tab;
}
ma_cho=ma_txt;
for (x=0; x < columns; x++) {
ma_cho +=String.fromCharCode(32 + Math.floor(Math.random() * 94));
m_copo[x]=0;
}
ma_bod=setInterval("mytricks()", speed);
}
function mytricks() {
x=0;
for (y=0; y < columns; y++) {
x=x + (m_copo[y]==100);
ma_row=m_copo[y] % 100;
if (ma_row && m_copo[y] < 100) {
if (ma_row < rows + 1) {
if (w3c) {
matemp=document.getElementById("Mx" + (ma_row - 1) + "y" + y);
matemp.firstChild.nodeValue=m_coch[y];
} else {
matemp=document.all["Mx" + (ma_row - 1) + "y" + y];
matemp.innerHTML=m_coch[y];
}
matemp.style.color="#33ff66";
matemp.style.fontWeight="bold";
}
if (ma_row > 1 && ma_row < rows + 2) {
matemp=(w3c) ? document.getElementById("Mx" + (ma_row - 2) + "y" + y) : document.all["Mx" + (
ma_row - 2) + "y" + y];
matemp.style.fontWeight="normal";
matemp.style.color="#00ff00";
}
if (ma_row > 2) {
matemp=(w3c) ? document.getElementById("Mx" + (ma_row - 3) + "y" + y) : document.all["Mx" + (
ma_row - 3) + "y" + y];
matemp.style.color="#009900";
}
if (ma_row < Math.floor(rows / 2) + 1) m_copo[y]++;
else if (ma_row==Math.floor(rows / 2) + 1 && m_coch[y]==ma_txt.charAt(y)) zoomer(y);
else if (ma_row < rows + 2) m_copo[y]++;
else if (m_copo[y] < 100) m_copo[y]=0;
} else if (Math.random() > 0.9 && m_copo[y] < 100) {
m_coch[y]=ma_cho.charAt(Math.floor(Math.random() * ma_cho.length));
m_copo[y]++;
}
}
if (x==columns) clearInterval(ma_bod);
}
function zoomer(ycol) {
var mtmp, mtem, ytmp;
if (m_copo[ycol]==Math.floor(rows / 2) + 1) {
for (ytmp=0; ytmp < rows; ytmp++) {
if (w3c) {
mtmp=document.getElementById("Mx" + ytmp + "y" + ycol);
mtmp.firstChild.nodeValue=m_coch[ycol];
} else {
mtmp=document.all["Mx" + ytmp + "y" + ycol];
mtmp.innerHTML=m_coch[ycol];
}
mtmp.style.color="#33ff66";
mtmp.style.fontWeight="bold";
}
if (Math.random() < reveal) {
mtmp=ma_cho.indexOf(ma_txt.charAt(ycol));
ma_cho=ma_cho.substring(0, mtmp) + ma_cho.substring(mtmp + 1, ma_cho.length);
}
if (Math.random() < reveal - 1) ma_cho=ma_cho.substring(0, ma_cho.length - 1);
m_copo[ycol] +=199;
setTimeout("zoomer(" + ycol + ")", speed);
} else if (m_copo[ycol] > 200) {
if (w3c) {
mtmp=document.getElementById("Mx" + (m_copo[ycol] - 201) + "y" + ycol);
mtem=document.getElementById("Mx" + (200 + rows - m_copo[ycol]--) + "y" + ycol);
} else {
mtmp=document.all["Mx" + (m_copo[ycol] - 201) + "y" + ycol];
mtem=document.all["Mx" + (200 + rows - m_copo[ycol]--) + "y" + ycol];
}
mtmp.style.fontWeight="normal";
mtem.style.fontWeight="normal";
setTimeout("zoomer(" + ycol + ")", speed);
} else if (m_copo[ycol]==200) m_copo[ycol]=100 + Math.floor(rows / 2);
if (m_copo[ycol] > 100 && m_copo[ycol] < 200) {
if (w3c) {
mtmp=document.getElementById("Mx" + (m_copo[ycol] - 101) + "y" + ycol);
mtmp.firstChild.nodeValue=String.fromCharCode(160);
mtem=document.getElementById("Mx" + (100 + rows - m_copo[ycol]--) + "y" + ycol);
mtem.firstChild.nodeValue=String.fromCharCode(160);
} else {
mtmp=document.all["Mx" + (m_copo[ycol] - 101) + "y" + ycol];
mtmp.innerHTML=String.fromCharCode(160);
mtem=document.all["Mx" + (100 + rows - m_copo[ycol]--) + "y" + ycol];
mtem.innerHTML=String.fromCharCode(160);
}
setTimeout("zoomer(" + ycol + ")", speed);
}
}
// -->
</script>
<div id="matrix">I love javascript</div>
</body>
</html>
今天的分享就到這里了,大家看完后學會了嗎?
如果覺得文章對您有用就加個關注啦~~
歡迎評論留言,提供建議和思路。
客帝國代碼雨
相信看過《黑客帝國》的同學,對上面的的這個圖片一定不陌生,這是一個非常經典的畫面。今天就給大家分享一下代碼滾動的實現方法。
第一步,新建一個html文件我們可以命名為code.html。
第二步,使用文本編輯工具notepad++打開code.html,復制下面的代碼到文件中并保存。
第三步,為了增加效果,我還需要準備一個背景音樂文件(黑客帝國.mp3)和code.html放在同一級目錄。
最后,使用瀏覽器打開code.html,見證奇跡的時刻開始了。
大家趕快動手試下吧!
<html>
<head>
<title>黑客帝國</title>
<canvas id="canvas" style="background:black" width="620" height="340"></canvas>
<embed src="黑客帝國.mp3" hidden="flase" autostart="true" loop="true">
<script type="text/javascript">
window.onload = function(){
//獲取圖形對象
var canvas = document.getElementById("canvas");
//獲取圖形的上下文
var context = canvas.getContext("2d");
//獲取瀏覽器屏幕的寬度和高度
var W = window.innerWidth;
var H = window.innerHeight;
//設置canvas的寬度和高度
canvas.width = W;
canvas.height = H;
//每個文字的字體大小
var fontSize = 15;
//計算列
var colunms = Math.floor(W /fontSize);
//記錄每列文字的y軸坐標
var drops = [];
//給每一個文字初始化一個起始點的位置
for(var i=0;i<colunms;i++){
drops.push(0);
}
//運動的文字
var str ="01abcdefghijklmnopqurstuvwxyz";
//4:fillText(str,x,y);原理就是去更改y的坐標位置
//繪畫的函數
function draw(){
//讓背景逐漸由透明到不透明
context.fillStyle = "rgba(0,0,0,0.05)";
context.fillRect(0,0,W,H);
//給字體設置樣式
//context.font = "700 "+fontSize+"px 微軟雅黑";
context.font = fontSize + 'px arial';
//給字體添加顏色
context.fillStyle ="green";//隨意更改字體顏色
//寫入圖形中
for(var i=0;i<colunms;i++){
var index = Math.floor(Math.random() * str.length);
var x = i*fontSize;
var y = drops[i] *fontSize;
context.fillText(str[index],x,y);
//如果要改變時間,肯定就是改變每次他的起點
if(y >= canvas.height && Math.random() > 0.92){
drops[i] = 0;
}
drops[i]++;
}
};
function randColor(){
var r = Math.floor(Math.random() * 256);
var g = Math.floor(Math.random() * 256);
var b = Math.floor(Math.random() * 256);
return "rgb("+r+","+g+","+b+")";
}
draw();
setInterval(draw,33);
};
</script>
<style type="text/css">
body{margin: 0; padding: 0; overflow: hidden;}
</style>
</head>
<body>
</body>
</html>
代碼源自網絡,僅供娛樂,如有侵權,請聯系刪除。
CSDN編者按】本文的作者是一名軟件開發工程師,在讀過《大教堂與市集》的作者、《新黑客詞典》的維護人、著名黑客ESR(Eric Steven Raymond)的博客文章《如何成為一名黑客》之后,對計算機程序產生濃厚興趣,并受此影響走向軟件開發的職業道路。來了解下他的故事和對于黑客的見解吧!
作者 | Zach Alberico
譯者 | 蘇本如,責編 | 夕顏
頭圖 | CSDN付費下載自視覺中國
出品 | CSDN(ID:CSDNnews)
以下為譯文:
為什么要寫這篇文章?
當我十三歲開始上高中的時候,我讀了ESR寫的這篇博客文章:如何成為一名黑客(http://www.catb.org/~esr/faqs/hacker-howto.html)。這篇文章讓我了解了程序員們一起在互聯網上構建東西的社區,這讓我很興奮。我試著開始著手安裝Fedora Core 4,最終安裝成功了Ubuntu 6.06,通過這一過程,我自己學到了很多關于故障排除的知識,并且努力嘗試著讓系統真正工作起來。這個過程對于培養幫助我獲得現在這份工作的技能至關重要。我讀了關于Python的書,寫了一些小程序,然后決定學習計算機科學,了解計算機是如何工作的。在我不確定自己將來想做什么的時候,這對我來說是一個相當有影響力的文章。
在布法羅郊區長大的我,在紐約可能感到相當孤獨。雖然我很幸運,我父親在大學里因為好玩而編寫了一個Apple II程序(所以我應該有一些編程背景/黑客精神),但他對更現代的軟件開發知之甚少。我喜歡電腦,也喜歡玩電腦,但我不知道什么是計算機可以做到的,甚至不知道在哪里可以了解更多計算機知識。當搜索空間如此之大,并且有許多未知的信息時,你甚至很難找到好的信息來源來學習。有能力選擇好的信息來源需要一些現有的知識,如果沒有經驗豐富的人的指導,這可能會很困難。我認為,現在互聯網更發達,情況可能會更好,但在某種程度上說,現在比過去可能更加困難,因為有更多的選擇需要篩選。
16年后,我想寫我自己的版本的《如何成為一名黑客》,來對ESR的原著進行補充,這一定是件很有趣的事。我想在這篇文章加入那些我在13歲時想讀到的一些東西,并且重點關注那些我覺得很有幫助的其他內容。現在很多關于編程及其相關主題的文章都在拼命鼓噪,試圖說服你采用特定的編程語言、框架、操作系統、或者特定的編程方法。本文在這些方面著墨不多,盡管我也提出了一些建議,但它們只是一些溫和的觀點。本文的主要目標是填補那些在ESR的原始文章未曾觸及而我非常想了解的空白(所以你應該先讀ESR的那篇文章)。
要學習的東西有很多
記得在剛開始的時候,我讀過一些文章和書,但對其中的很多行業術語不甚理解 - 這很正常。隨著你接觸到了更多的事情,并深入到每一件你不理解的事情中去,那些一開始看起來不可理解的事情會慢慢變得可以理解。保持繼續閱讀并且挺過這段艱難時期是很好的方法,當你不理解的時候就去查找,當你可以提問的時候就去問問題(ESR也有一篇關于如何問好問題的文章)。
每個人都會在某個時候第一次學到一些東西,然后這些東西就會慢慢地積累起來,直到你掌握了那些基本知識為止。我記得一開始我不懂任何細節(比如:我不知道如何在終端中輸入命令來運行它們,或者cd代表“change directory”)。你從接觸中獲得這些知識,你玩得越多,你接觸得就越多,你積累的知識和經驗也就越多。如果你有幸生活在一個地區有一群對軟件感興趣的人,你就能夠更快地學習。
不要害怕你不理解的事情
學習一些復雜的新事物開始時往往會感到困難 - 如果感覺很容易,那么它可能是你已經知道的東西,或者它可能不是真正考驗你的知識(閱讀如何解決一個物理問題并認為“它很合理”,比你自己用剛剛學會的工具解決一個問題要容易得多)。感覺吃力是個好現象 - 這意味著你真的在學習,集中精力一直堅持做下去,當你感覺變好的時候你的學習就會變得更容易。
我認為,一個新人在這方面甚至有一點優勢:當你積累了一點經驗后,只做你已經知道怎么做的事情,而不是學習新的東西,會讓你感覺容易和舒適。這會導致你陷入一個停滯期,在那里你只是重復做你已經知道怎么做的事情,就像一個人只能用吉他彈一首歌,并且他總是彈同一首歌一樣。對于一個新人來說,一切都很難,但這樣做不應該是一個新人真正的選擇。
第一次學習一些復雜的東西應該會感覺有點痛苦 - 你應該習慣這種感覺,因為這是件好事,意味著你在成長。不要因此覺得自己不夠聰明而被嚇跑了。因為有太多東西要學,有太多不同的途徑要走(僅就計算機科學來說,就有很多東西,像計算機圖形學、計算機安全、機器學習、算法、移動、網絡、基礎設施等等分支),所以有一個讓自己成長并走出舒適區去學習新事物的心態是至關重要的。
學習編程 - 邊做邊學
僅僅通過閱讀一本關于編程的書來學習編程,就像僅僅通過閱讀一本關于跳傘的書來學習跳傘一樣。你可能需要讀一本書(而且在開始的時候你需要用它作為一個起點),但是除非你同時也在寫一些小程序,否則你從中得到的有限。木匠通過建造東西來使技術變得更熟練,作家通過撰寫文章來使文筆變得更優美,而程序員則通過編寫代碼來提高編碼水平。這并不意味著你不應該讀書,也不意味著一本好書不能給你帶來價值。但是僅僅這樣做會很容易讓你陷入一個誤區:你只是在那里讀關于編程的書而不是自己做任何事情,會讓你覺得讀起來容易,做起來也容易。然而,當你真正開始編程的時候,你會發現憑空想象出來一些程序是很困難的。
我同意ESR的觀點,Python是一種很好的作為編程起點的語言,而且有一個很好的學習網站,名為苦學Python,專門針對初學者,并在教學過程中使用一些練習。
一開始,你會覺得語法很難理解,當你開始學習的時候,很多時間都花在了語法上。因為每種編程語言都有不同的語法,它們看起來非常不同。當你開始掌握語法后,你更多的精力就會放在關于如何解決問題和使用什么數據結構的通用知識上。最終,你對于使用常見的數據結構已經相當嫻熟,然后你的重點將會轉向更高層次的抽象和更通用的設計或基礎架構,這些設計或基礎架構使得軟件開發更易于在規模上管理或在將來更易于更改。
在掌握了一門編程語言的語法并且能夠編寫簡單的程序之后,學習數據結構是最重要的下一步。Cracking the Coding Interview這本書對一些核心的數據結構有很詳細的描述(并且還附帶有一些示例問題)。令人困惑的是,不同的語言在實現相同的數據結構時往往有不同的名稱(比如,Python稱哈希表(hash table)為‘字典( dictionary)’),但大多數語言都會實現一些核心數據結構,即使它們都有一個不同的名稱。
故障排除或調試也是一項核心編程技能 - 大多數編程時間實際上都是在調試,因此,如果你喜歡調試代碼,這可能是一個好現象。當你不得不到處搜索以試圖理解某件事情,或者當你正在閱讀的文檔不起作用,或者當你在環境中遇到一些意外錯誤時,不要氣餒 ,記住這是正常的,而且這也不是你能力低下的反映。
大多數軟件都不工作,而且經常有未記錄的error、bug和一些難以糾正的瑣碎問題。例如,Github上的大多數開源項目都有某種構建系統,用于處理將軟件配置為運行的問題。這將執行諸如拉入依賴項(需要與之配合工作的其他代碼)之類的操作,以及執行任何必要的命令來實際運行它。如果你要在Github上下載一個有趣的項目并嘗試運行它,你可能會在這個過程中遇到很多意外的錯誤,而這些錯誤通常沒有文檔記錄。
運行時遇到這些錯誤并且將問題解決是很正常的事情,經驗豐富的程序員也必須處理這些問題(如果幸運的話,我們以前也見過這種類型的問題)。我見過有人遇到這樣的錯誤,并且認為自己做錯了什么,但實際上錯不是你,而是編程就是這樣的過程。圍繞著構建系統并試圖使其更好,有很多相互競爭的工具甚至行業(這可能會使初學者更加困惑,因為沒有真正的標準化,并且配置軟件使之運行的正確方法也因為編程環境和語言的不同而各不相同)。
計算機實際上是如何工作的?
我記得那時我很沮喪,因為我很難找到關于計算機實際工作方式的信息。我能找到的關于計算機的一切都是用毫無用處的過于簡單的類比(比如,磁盤是“存放文件的柜子”),我找不到任何我可以閱讀并且幫助我真正理解計算機是如何工作的,并且如果把我轉移到過去,我就能真正解釋如何構建出一個計算機的東西。這些是比軟件更具體的電子或計算機工程,它們在幫助理解硬件方面仍然有很多價值(這很有趣!)。
我愿意推薦的最好的書是Charles Petzold撰寫的《Code》。它引導你從電子位開始,一直到布爾邏輯和電路設計的歷史,再到簡單電路的實際圖形,以及如何將位存儲在內存中。這是知識依照發現的歷史背景一步步地介紹給你,直到構建出一個真正的小CPU。Charles Petzold還學習了一些匯編和基本的計算機圖形學。他是一個邏輯非常清楚的作家和老師,所以這本書的細節具備令人驚訝的可讀性。
關于計算機的更多的歷史背景,我推薦Mitchell Waldrop的《夢幻機器》和Steven Levy的《黑客》。書中的敘述性的故事使學習和記憶更容易,我認為這些發現的背景有助于學習事物的實際工作方式。
軟件工具:代碼編輯器,編程環境
工具是有趣的,了解你的工具是件好事,但是你可以永遠定制一些東西,爭論一些無關緊要的小細節。當你剛開始的時候,定制工具是一個有趣的學習方式,但是我看到人們花了大量的時間在這個上面,與實際編寫解決問題的程序或者學習更多的通用編程技巧相比,它產生的價值相對較小(關于這點的一本很好的書是設計數據密集型應用程序)。過于專注于定制工具會束縛你前進的腳步。
不要太擔心Vim或Emacs之類的工具,也不要太擔心你正在使用何種操作系統 -你可以在任何地方學習這些核心技能(這是我與ESR原始文章的最大分歧)。也就是說,玩Linux對我來說是一個非常有價值的學習故障排除的方法 - 主要是因為我的Linux沒有很好地工作,我不得不花上幾個小時來嘗試讓無線互聯網正常工作,讓筆記本電腦成功掛起,甚至讓用戶界面出現(現在情況稍微好一點)。
我開始嘗試安裝Gentoo(實際上從未成功)。這種故障排除技巧對于我獲得現在的工作非常有幫助,所以如果你喜歡玩不同的操作系統,我肯定會鼓勵你,我只是不認為這是必要的。不過,在macOS或Linux上學習可能更容易,因為大多數現有的工具都是針對這些環境,而且大多數程序員都在使用這兩種工具中的一種。
值得一提的另外一個特定工具是版本控制,特別是git。花點時間熟悉其基本知識是值得的,但它可能是在你編程一段時間之后才需要關注的東西。
不要沒完沒了地研究
在開始一個項目之前,進行沒完沒了地“研究”會導致項目容易拖延 - 閱讀和探索可用的選項(研究)會很有趣,花一點時間做一點這樣的事情會很好,但你也可能永遠被困在這樣的事情中。當有疑問的時候,只需選擇一個已經開始了一段時間并且最受歡迎的項目。使用這個項目,如果它很受歡迎,它可能有一個像樣的社區,你可以向它學習,如果它存在一段時間,它可能會更穩定(或者至少它會更充實,不太可能被拋棄)。
計算機科學
我真的很喜歡學習計算機科學,并且認為這可能仍然是獲得最大機會的最佳途徑(尤其是如果你像我一樣住在郊區,周圍沒有很多軟件人員的話)。如果可能的話,我認為嘗試學習最好的計算機科學課程是很好的。網上也有很多好的課程,但是如果你的生活和我高中時一樣,在家里很難真正利用這些。
編程面試
如果說學習是獲得好成績的天然解決方案,那么做好一個酷項目編程就是在編程面試中表現出色的天然解決方案。要想在競爭激烈的公司的編程面試中處于有利地位,你需要對leetcode網站上和Cracking the Coding Interview這本書中提到的編程問題非常熟悉。編程面試需要大量的實踐,并且它是一個可以讓自身能力得以發展的獨特技能。
你可以獲得一個完整的計算機科學學位,但仍然不知道如何編程。你也可以獲得一個計算機科學學位,但仍然不能通過編程面試(這兩個可能是默認情況)。學會編程,學會在編程面試中做得更好,你需要自己集中精力在這些方面。計算機科學學位可能有助于一些方向和重點項目(Lambda School可能更適合培養編程人員,也許最終會更適合),但你必須自己掌握很多這方面的知識。
角色和職位
除了“軟件工程師”之外,還有很多不同的角色。SRE(網站可靠性工程師)關注代碼運行的基礎設施,并為其編寫軟件。內部工具和devops開發人員專注于自動化軟件構建和測試所需的所有工具(閱讀The Phoenix Project,了解一個有趣的故事來說明這一點)。除此之外,有些角色和用戶有密集的交互,如開發者支持工程師(developer support engineer)幫助用戶處理API、解決bug或配置問題)。還有些角色重點關注游戲引擎,有些角色重點關注虛擬現實或計算機圖形。有些角色則關注編寫新的計算機語言和新的編譯器。
在所有這些角色中,根據使用的產品和使用的為解決新問題而創建的新工具的不同,有更多的專業化。計算機安全也是一個有趣的領域,對此領域我所知不多,并且我認為ESR在他的文章中對此是持輕視態度的,但我認為它也是一個很難開始的地方,因為它需要對事物是如何工作的已知理解的基礎上才能知道事物是如何被打破的。我記得我很早就開始讀Hacking: The Art of Exploitation這本書,但當時我對這個領域還是一知半解。
當然,你也可以創辦自己的公司,建立自己的創始人角色。
還有很多東西要學(再來一次)
一輩子是很長的一段時間,而專業化并不是永遠的,所以要深入到不同的事物中去。你可以接觸很多新事物,一路玩得開心。
獎勵:社區
ESR在他的文章中談到加入一個本地Linux用戶組,但是至少對我來說,當我讀到他的文章的時候,這是不現實的,一方面是因為這個用戶組真的沒有那么多人,另一方面是因為我太小了不能開車,我自己也沒法那么容易地到達任何地方。有一些在線社區我覺得很有趣,如果換在那時我想我也會覺得很有趣。
Hacker News:Ycombinator的新聞網站(海灣地區的創業孵化器)。對它的評價有好有壞,但好處在于它確實很好,很多業內人士都在那里出現。Paul Graham和Jessica Livingston是Ycombinator的創始人,Paul寫了很多有趣的文章。
Twitter:很大程度上取決于你在關注誰,但如果你想的話,它可以成為一個好地方。很難知道你應該從誰開始關注,但你可以看看我從誰開始關注。
Less Wrong:不是注重編程的社區,但是理性社區和編程社區之間有相當多的重疊,我喜歡那里的很多文章,這肯定是我在發現如何成為黑客的同時,希望找到的東西。這里有一個我非常喜歡的例子:Disputing Definitions
歡迎聯系我
我有更多的文章和書,都鏈接在我自己網站的about網頁上。
我記得在我讀到他的文章時,ESR回復了我發給他的一封關于讓iPod在Fedora Core 4工作的郵件,我很確定Richard Stallman也回復了我當時發的一些郵件。我覺得那樣做對初學者來說很好。本著以他們為榜樣的精神,如果你愿意的話,請隨時向我提出任何具體的問題。
原文鏈接:
https://zalberico.com/essay/2020/04/19/how-to-become-a-hacker.html
本文為CSDN翻譯文章,轉載請注明出處。
?Facebook 公司:如何清除 960 萬句“臟話”?
?Linux 之父怒刪工程師提交的補丁,稱“太蠢了”網友:懟得好!
?張一鳴是如何練就字節跳動的
?性能超越最新序列推薦模型,華為諾亞方舟提出記憶增強的圖神經網絡
?DevOps 在移動應用程序開發中扮演什么角色?
?穩定幣經濟:十大穩定幣簡史
*請認真填寫需求信息,我們會在24小時內與您取得聯系。