Ⅰ 編譯移植busybox出錯,arm-linux-gcc版本4.3.3 busybox版本1.16.0 錯誤代碼如下:
找不到鏈接庫,不這些都是數學庫,加參數 -lm 應該就能解決。
但編譯過程這個東西應該是自己加。
busybox 一般都是靜態的,編譯靜態程序,很多時候需要他以來的函數庫也是靜態的。你這個問題應該是編譯環境不匹配。你編譯了 uclibc 並且正確安裝了沒?
不滾磨和過話說,不過是個編游凳譯,人家本來就支持 arm ,「移植」這兩個字大盯應該是不需要用了。
Ⅱ 如何使Linux系統上的程序開機後自動運行
閱讀之前建議先看一下附圖。本文中假設inittab中設置的init tree為:/etc/rc.d/rc0.d /etc/rc.d/rc1.d /etc/rc.d/rc2.d /etc/rc.d/rc3.d /etc/rc.d/rc4.d /etc/rc.d/rc5.d /etc/rc.d/rc6.d /etc/rc.d/init.d1. 關於Linux的段穗啟動init是所有進程之父 init讀取/etc/inittab,執行rc.sysinit腳本 (注意文件名是不一定的,有些unix甚至會將語句直接寫在inittab中) rc.sysinit腳本作了很多工作: init $PATH config network start swap function set hostname check root file system, repair if needed check root space ....rc.sysinit根據inittab執行rc?.d腳本 Linux是多用戶系統,getty是多用戶與單用戶的分水嶺 在getty之前運行的是系統腳本2. 關於rc.d所有啟動腳本放置在 /etc/rc.d/init.d下 rc? number決定執行的順序3. 啟動腳本示例這是一個用來啟動httpd的 /etc/rc.d/init.d/握悄卜apache 腳本: 代碼: #!/bin/bash source /etc/sysconfig/rc source $rc_functions case "" in start) echo "Starting Apache daemon..." /usr/local/apache2/bin/apachectl -k start evaluate_retval ;; stop) echo "Stopping Apache daemon..." /usr/local/apache2/bin/apachectl -k stop evaluate_retval ;; restart) echo "Restarting Apache daemon..." /usr/local/apache2/bin/apachectl -k restart evaluate_retval ;; status) statusproc /usr/local/apache2/bin/httpd ;; *) echo "Usage: " exit 1 ;;esac可以看出他接受start,stop,restart,status參運缺數
Ⅲ 簡單計算器編程
嘿嘿,C++實現姿沒個Console環境中的計算器很簡單,鑒於你沒給懸賞分,我也懶得打字了,從別處粘貼過來的代碼,非常簡單,你可以參考一下。
// Ex6_09Extended.cpp
// A program to implement a calculator accepting parentheses
#include <iostream> // For stream input/output
#include <cstdlib> // For the exit() function
#include <cctype> // For the isdigit() function
#include <跡團納cstring> // For the strcpy() function
using std::cin;
using std::cout;
using std::endl;
void eatspaces(char* str); // Function to eliminate blanks
double expr(char* str); // Function evaluating an expression
double term(char* str, int& index); // Function analyzing a term
double number(char* str, int& index); // Function to recognize a number
char* extract(char* str, int& index); // Function to extract a substring
const int MAX = 80; //或豎 Maximum expression length,
// including '\0'
int main()
{
char buffer[MAX] = {0}; // Input area for expression to be evaluated
cout << endl
<< "Welcome to your friendly calculator."
<< endl
<< "Enter an expression, or an empty line to quit."
<< endl;
for(;;)
{
cin.getline(buffer, sizeof buffer); // Read an input line
eatspaces(buffer); // Remove blanks from input
if(!buffer[0]) // Empty line ends calculator
return 0;
cout << "\t= " << expr(buffer) // Output value of expression
<< endl << endl;
}
}
// Function to eliminate spaces from a string
void eatspaces(char* str)
{
int i = 0; // 'Copy to' index to string
int j = 0; // 'Copy from' index to string
while((*(str + i) = *(str + j++)) != '\0') // Loop while character
// copied is not \0
if(*(str + i) != ' ') // Increment i as long as
i++; // character is not a space
return;
}
// Function to evaluate an arithmetic expression
double expr(char* str)
{
double value = 0.0; // Store result here
int index = 0; // Keeps track of current character position
value = term(str, index); // Get first term
for(;;) // Indefinite loop, all exits inside
{
switch(*(str + index++)) // Choose action based on current character
{
case '\0': // We're at the end of the string
return value; // so return what we have got
case '+': // + found so add in the
value += term(str, index); // next term
break;
case '-': // - found so subtract
value -= term(str, index); // the next term
break;
default: // If we reach here the string
cout << endl // is junk
<< "Arrrgh!*#!! There's an error"
<< endl;
exit(1);
}
}
}
// Function to get the value of a term
double term(char* str, int& index)
{
double value = 0.0; // Somewhere to accumulate
// the result
value = number(str, index); // Get the first number in the term
// Loop as long as we have a good operator
while((*(str + index) == '*') || (*(str + index) == '/'))
{
if(*(str + index) == '*') // If it's multiply,
value *= number(str, ++index); // multiply by next number
if(*(str + index) == '/') // If it's divide,
value /= number(str, ++index); // divide by next number
}
return value; // We've finished, so return what
// we've got
}
// Function to recognize a number in a string
double number(char* str, int& index)
{
double value = 0.0; // Store the resulting value
if(*(str + index) == '(') // Start of parentheses
{
char* psubstr = 0; // Pointer for substring
psubstr = extract(str, ++index); // Extract substring in brackets
value = expr(psubstr); // Get the value of the substring
delete[]psubstr; // Clean up the free store
return value; // Return substring value
}
while(isdigit(*(str + index))) // Loop accumulating leading digits
value = 10*value + (*(str + index++) - '0');
// Not a digit when we get to here
if(*(str + index) != '.') // so check for decimal point
return value; // and if not, return value
double factor = 1.0; // Factor for decimal places
while(isdigit(*(str + (++index)))) // Loop as long as we have digits
{
factor *= 0.1; // Decrease factor by factor of 10
value = value + (*(str + index) - '0')*factor; // Add decimal place
}
return value; // On loop exit we are done
}
// Function to extract a substring between parentheses
// (requires cstring)
char* extract(char* str, int& index)
{
char buffer[MAX]; // Temporary space for substring
char* pstr = 0; // Pointer to new string for return
int numL = 0; // Count of left parentheses found
int bufindex = index; // Save starting value for index
do
{
buffer[index - bufindex] = *(str + index);
switch(buffer[index - bufindex])
{
case ')':
if(numL == 0)
{
size_t size = index - bufindex;
buffer[index - bufindex] = '\0'; // Replace ')' with '\0'
++index;
pstr = new char[index - bufindex];
if(!pstr)
{
cout << "Memory allocation failed,"
<< " program terminated.";
exit(1);
}
strcpy_s(pstr, index-bufindex, buffer); // Copy substring to new memory
return pstr; // Return substring in new memory
}
else
numL--; // Rece count of '(' to be matched
break;
case '(':
numL++; // Increase count of '(' to be
// matched
break;
}
} while(*(str + index++) != '\0'); // Loop - don't overrun end of string
cout << "Ran off the end of the expression, must be bad input."
<< endl;
exit(1);
return pstr;
}
上面的代碼來自《Lvor Horton's Begining Visual C++ 2008》一書,非常適合C++初學者。用上面代碼實現的計算器可以進行諸如(1+3)*6/2之類的加減乘除和帶括弧的表達式運算。
此外,在Linux系統的Shell環境中,有個bc計算器程序,功能更強一些,有興趣的話可以找來源代碼看看。
Ⅳ linux shell 關聯數組的一個小問題
shell 並不漏悄支持關聯數組。
只有awk才支持關聯數組凱州。
shell只支持index數字類型的數組,凡是不是數字的,都會當做0,或者-1,也就是最後的那返孫渣個元素。
詳細參見bash的man手冊。
Arrays
Bash provides one-dimensional array variables. Any variable may be used as an array; the declare builtin
will explicitly declare an array. There is no maximum limit on the size of an array, nor any requirement
that members be indexed or assigned contiguously. Arrays are indexed using integers and are zero-based.
An array is created automatically if any variable is assigned to using the syntax name[subscript]=value.
The subscript is treated as an arithmetic expression that must evaluate to a number greater than or equal
to zero. To explicitly declare an array, use declare -a name (see SHELL BUILTIN COMMANDS below).
declare -a name[subscript] is also accepted; the subscript is ignored. Attributes may be specified for
an array variable using the declare and readonly builtins. Each attribute applies to all members of an
array.
Arrays are assigned to using compound assignments of the form name=(value1 ... valuen), where each value
is of the form [subscript]=string. Only string is required. If the optional brackets and subscript are
supplied, that index is assigned to; otherwise the index of the element assigned is the last index
assigned to by the statement plus one. Indexing starts at zero. This syntax is also accepted by the
declare builtin. Indivial array elements may be assigned to using the name[subscript]=value syntax
introced above.
Any element of an array may be referenced using ${name[subscript]}. The braces are required to avoid
conflicts with pathname expansion. If subscript is @ or *, the word expands to all members of name.
These subscripts differ only when the word appears within double quotes. If the word is double-quoted,
${name[*]} expands to a single word with the value of each array member separated by the first character
of the IFS special variable, and ${name[@]} expands each element of name to a separate word. When there
are no array members, ${name[@]} expands to nothing. If the double-quoted expansion occurs within a
word, the expansion of the first parameter is joined with the beginning part of the original word, and
the expansion of the last parameter is joined with the last part of the original word. This is analogous
to the expansion of the special parameters * and @ (see Special Parameters above). ${#name[subscript]}
expands to the length of ${name[subscript]}. If subscript is * or @, the expansion is the number of ele-
ments in the array. Referencing an array variable without a subscript is equivalent to referencing ele-
ment zero.
The unset builtin is used to destroy arrays. unset name[subscript] destroys the array element at index
subscript. Care must be taken to avoid unwanted side effects caused by filename generation. unset name,
where name is an array, or unset name[subscript], where subscript is * or @, removes the entire array.
The declare, local, and readonly builtins each accept a -a option to specify an array. The read builtin
accepts a -a option to assign a list of words read from the standard input to an array. The set and
declare builtins display array values in a way that allows them to be reused as assignments.
Ⅳ 成為Linux高手要看那些書籍,有什麼先後順序
你要往linux發展是具體要想學什麼的呢,開發?系統?資料庫?
如果是想往伺服器方面發展的話就看各種服務的書(先知道都有哪些服務,是用來做什麼的,然後知道它的原理,最後再學習具體搭建與實現,面試的時候最多問的就是原理了),如果是要搞開發的話看嵌入式的書(主要是內核方面,嵌入式最好是培訓),嵌入式我不熟,如果想搞伺服器的話我可以推薦幾本書。
當然了,最開始肯定是看鳥哥了,沒的選擇,容易看懂,然後看這本---[Linux伺服器配置全程實錄],大部分的linux服務都涉及到了,再之後,你可能要單獨去找shell的書,推薦《shell範例精解》《abs》《Shell腳本專家》《linux命令行, shell寶典》,當然《精通正則表達式》這本書可不能少,grep、sed、awk都需要用到正則,學完shell之後試著自己寫些小腳本,不用多,10幾20行的寫寫,試著理解/etc/init.d目錄下的服務啟動時的啟動流程,學完這些後面的書就不多了,學著用些書本上沒有的工具,比如nagions\cacti\nagix等等開源軟體環境的搭建,這些東西涉及到前面的東西,再之後就是集群和存儲了,我培訓考試考兩個ha(高可用)和lb(負載均衡)我只搭了一個出來,呵呵,基本上集群和存儲都是虛擬環境下試驗的。還要特別說明的是,學完單個服務並不表示就結束了,而是另一個開始,幾個小的綜合環境,比如:PXE,LDAP,你可以試試看,最後,當然還有VPN、VOIP這些東西了,我想說的是,如果你精通了我所說的所有東西,先不管你目前工資多少,起碼精通完之後,再有一兩年相關工作經驗,工資基本上就到萬了
Ⅵ 《自然》評選改變科學的10個計算機代碼項目
從Fortran到arXiv.org,這些計算機編碼和平台讓生物學、氣候科學和物理學等學科的發展達到了真正「日新月異」的速度。
2019年,事件視界望遠鏡團隊讓世界首次看到了黑洞的樣子。不過,研究人員公布的這張發光環形物體的圖像並不是傳統的圖片,而是經過計算獲得的。利用位於美國、墨西哥、智利、西班牙和南極地區的射電望遠鏡所得到的數據,研究人員進行了數學轉換,最終合成了這張標志性的圖片。研究團隊還發布了實現這一壯舉所用的編程代碼,並撰文記錄這一發現,其他研究者也可以在此基礎上進一步加以分析。
這種模式正變得越來越普遍。從天文學到動物學,在現代每一項重大科學發現的背後,都有計算機的參與。美國斯坦福大學的計算生物學家邁克爾·萊維特因「為復雜化學系統創造了多尺度模型」與另兩位研究者分享了2013年諾貝爾化學獎,他指出,今天的筆記本電腦內存和時鍾速度是他在1967年開始獲獎工作時實驗室製造的計算機的1萬倍。「我們今天確實擁有相當可觀的計算能力,」他說,「問題在於,我們仍然需要思考。」
如果沒有能夠解決研究問題的軟體,以及知道如何編寫並使用軟體的研究人員,一台計算機無論再強大,也是毫無用處的。如今的科學研究從根本上已經與計算機軟體聯系在一起,後者已經滲透到研究工作的各個方面。近日,《自然》(Nature)雜志將目光投向了幕後,著眼於過去幾十年來改變科學研究的關鍵計算機代碼,並列出了其中10個關鍵的計算機項目。
這台CDC 3600型計算機於1963年交付給位於科羅拉多州博爾德的國家大氣研究中心,研究者在Fortran編譯器的幫助對其進行了編程
語言先驅:Fortran編譯器(1957年)
最初的現代計算機並不容易操作。當時的編程實際上是手工將電線連接成一排排電路來實現的。後來出現了機器語言和匯編語言,允許用戶用代碼為計算機編程,但這兩種語言都需要對計算機的架構有深入的了解,使得許多科學家難以掌握。
20世紀50年代,隨著符號語言的發展,特別是由約翰·巴克斯及其團隊在加州聖何塞的IBM開發的「公式翻譯」語言Fortran,這種情況發生了變化。利用Fortran,用戶可以用人類可讀的指令來編程,例如x = 3 + 5。然後由編譯器將這些指令轉換成快速、高效的機器代碼。
不過,這一過程仍然很不容易。早期的程序員使用打孔卡來輸入代碼,而復雜的模擬可能需要數萬張打孔卡。盡管如此,新澤西州普林斯頓大學的氣候學家真鍋淑郎(Syukuro Manabe)還是指出,Fortran讓非計算機科學家也能編程,「這是我們第一次能夠自己給計算機編程」。他和同事們利用這種語言開發的氣候模型是最早取得成功的模型之一。
Fortran發展至今已經到了第八個十年,它仍然廣泛應用於氣候建模、流體動力學、計算化學等學科,這些學科都涉及到復雜線性代數並需要強大的計算機來快速處理數字。Fortran生成的代碼速度很快,而且仍然有很多程序員知道如何編寫。古早的Fortran代碼庫仍然活躍在世界各地的實驗室和超級計算機上。「以前的程序員知道他們在做什麼,」美國海軍研究院的應用數學家和氣候模型師弗蘭克·吉拉爾多說,「他們非常注重內存,因為他們擁有的內存非常少。」
信號處理器:快速傅立葉變換(1965)
當射電天文學家掃描天空時,他們捕捉到的是隨時間變化的復雜信號雜音。為了理解這些無線電波的本質,他們需要看到這些信號作為頻率的函數時是什麼樣的。一種名為「傅里葉變換」的數學過程可以幫到研究人員,但它的效率很低,對於一個大小為N的數據集需要N^2次計算。
1965年,美國數學家詹姆斯·庫利和約翰·杜基想出了一種加速該過程的方法。快速傅里葉變換(FFT)通過遞歸(一種通過重復將問題分解為同類的子問題而解決問題的編程方法)將計算傅里葉變換的問題簡化為N log2(N)步。隨著N的增加,速度也會提高。對於1000個點,速度提升大約是100倍;100萬個點則是5萬倍。
這個「發現」實際上是一個再發現,因為德國數學家高斯在1805年就對此進行了研究,但他從未發表過。而詹姆斯·庫利和約翰·杜基做到了,他們開啟了傅里葉變換在數字信號處理、圖像分析、結構生物學等領域的應用,成為應用數學和工程領域的重大事件之一。FFT在代碼中的應用已有很多次,近年一個流行的方案是FFTW,被認為是世界上最快的FFT。
保羅·亞當斯是加州勞倫斯伯克利國家實驗室分子生物物理學和綜合生物成像部門的主任,他回憶稱,當他在1995年改進細菌蛋白質凝膠的結構時,即使使用FFT和超級計算機,也需要「很多個小時,甚至數天」的計算。「如果在沒有FFT的情況下嘗試做這些,我不知道在現實中應該如何做到,」他說,「那可能要花很長時間。」
分子編目:生物資料庫(1965年)
資料庫是當今科學研究中不可或缺的組成部分,以至於人們很容易忘記它們也是由軟體驅動的。過去的幾十年中,資料庫資源的規模急劇膨脹,影響了許多領域,但或許沒有哪個領域的變化會比生物學領域更引人注目。
蛋白質資料庫Protein Data Bank擁有超過17萬個分子結構的檔案,包括這種細菌的「表達子」(expressome),其功能是結合RNA和蛋白質合成的過程。
今天,科學家所用的龐大基因組和蛋白質資料庫源於美國物理化學家瑪格麗特·戴霍夫的工作,她也是生物信息學領域的先驅。20世紀60年代初,當生物學家們致力於梳理蛋白質的氨基酸序列時,戴霍夫開始整理這些信息,以尋找不同物種之間進化關系的線索。她與三位合著者於1965年發表了《蛋白質序列和結構圖譜》,描述了當時已知的65種蛋白質的序列、結構和相似性。 歷史 學家布魯諾·斯特拉瑟在2010年寫道,這是第一個「與特定研究問題無關」的數據集,它將數據編碼在打孔卡中,這使得擴展資料庫和搜索成為可能。
其他「計算機化」的生物資料庫緊隨其後。蛋白質資料庫Protein Data Bank於1971年投入使用,如今詳細記錄了超過17萬個大分子結構。加州大學聖地亞哥分校的進化生物學家拉塞爾·杜利特爾在1981年創建了另一個名為Newat的蛋白質資料庫。1982年,美國國立衛生研究院(NIH)與多個機構合作,成立了GenBank資料庫,這是一個開放獲取的DNA序列資料庫。
這些資料庫資源在1983年7月證明了其存在價值。當時,由倫敦帝國癌症研究基金會蛋白質生物化學家邁克爾·沃特菲爾德領導的團隊,與杜利特爾的團隊各自獨立報道了一個特殊的人類生長因子序列與一種導致猴子出現癌症的病毒蛋白質之間的相似性。觀察結果顯示了一種病毒誘發腫瘤機制——通過模仿一種生長因子,病毒會誘導細胞不受控制地生長。美國國家生物技術信息中心(NCBI)前主任詹姆斯·奧斯特爾說:「這一結果讓一些對計算機和統計學不感興趣的生物學家頭腦里靈光一閃:我們可以通過比較序列來了解有關癌症的一些情況。」
奧斯特爾還表示,這一發現標志著「客觀生物學的到來」。除了設計實驗來驗證特定的假設,研究人員還可以挖掘公共數據集,尋找那些實際收集數據的人可能從未想到的聯系。當不同的數據集連接在一起時,這種力量就會急劇增長。例如,NCBI的程序員在1991年通過Entrez實現了這一點;Entrez是一個可以讓研究人員在DNA、蛋白質和文獻之間自由檢索和比對的工具。
預測領先者:大氣環流模式(1969年)
在第二次世界大戰結束時,計算機先驅約翰·馮·諾伊曼開始將幾年前用於計算彈道軌跡和武器設計的計算機轉向天氣預測問題。真鍋淑郎解釋道,在那之前,「天氣預報只是經驗性的」,即利用經驗和直覺來預測接下來會發生什麼。相比之下,馮·諾伊曼的團隊「試圖基於物理定律進行數值天氣預測」。
新澤西州普林斯頓的美國國家海洋和大氣管理局(NOAA)地球物理流體動力學實驗室的建模系統部門負責人Venkatramani Balaji表示,幾十年來,人們已經熟知這些方程式。但早期的氣象學家無法實際解決這些問題。要做到這一點,需要輸入當前的條件,計算它們在短時間內會如何變化,並不斷重復。這個過程非常耗時,以至於在天氣狀況實際出現之前還無法完成數學運算。1922年,數學家劉易斯·弗萊·理查森花了幾個月時間計算德國慕尼黑的6小時預報。根據一段 歷史 記載,他的結果是「極不準確的」,包括「在任何已知的陸地條件下都不可能發生的」預測。計算機使這個問題變得很容易解決。
20世紀40年代末,馮·諾伊曼在普林斯頓高等研究院建立了天氣預報團隊。1955年,第二個團隊——地球物理流體動力學實驗室——開始進行他所謂的「無限預測」,也就是氣候建模。
真鍋淑郎於1958年加入氣候建模團隊,開始研究大氣模型;他的同事柯克·布萊恩將這一模型應用在海洋研究中。1969年,他們成功將二者結合起來,創造了《自然》雜志在2006年所說的科學計算「里程碑」。
今天的模型可以將地球表面劃分為一個個25公里 25公里的正方形,並將大氣層劃分為數十層。相比之下,真鍋淑郎和布萊恩的海洋-大氣聯合模型劃分的面積為500平方公里,將大氣分為9個層次,只覆蓋了地球的六分之一。盡管如此,Venkatramani Balaji表示,「這個模型做得很好」,使研究團隊第一次能夠通過計算機預測二氧化碳含量上升的影響。
數字運算機:BLAS(1979年)
科學計算通常涉及到使用向量和矩陣進行相對簡單的數學運算,但這樣的向量和矩陣實在太多了。但在20世紀70年代,還沒有一套普遍認可的計算工具來執行這些運算。因此,從事科學工作的程序員會將時間花在設計高效的代碼來進行基本的數學運算,而不是專注於科學問題。
加州勞倫斯利弗莫爾國家實驗室的Cray-1超級計算機。在BLAS編程工具於1979年問世之前,並沒有線性代數標准可供研究人員在Cray-1超級計算機等機器上工作
編程世界需要一個標准。1979年,這樣的標准出現了:基本線性代數程序集(Basic Linear Algebra Subprograms,簡稱BLAS)。這是一個應用程序介面(API)標准,用以規范發布基礎線性代數操作的數值庫,如矢量或矩陣乘法。該標准一直發展到1990年,為向量數學和後來矩陣數學定義了數十個基本常式。
美國田納西大學計算機科學家、BLAS開發團隊成員傑克·唐加拉表示,事實上,BLAS把矩陣和向量數學簡化成了和加法和減法一樣基本的計算單元。
美國德克薩斯大學奧斯汀分校的計算機科學家Robert van de Geijn指出,BLAS「可能是為科學計算定義的最重要的介面」。除了為常用函數提供標准化的名稱之外,研究人員還可以確保基於BLAS的代碼在任何計算機上以相同方式工作。該標准還使計算機製造商能夠優化BLAS的安裝啟用,以實現在其硬體上的快速操作。
40多年來,BLAS代表了科學計算堆棧的核心,也就是使科學軟體運轉的代碼。美國喬治·華盛頓大學的機械和航空航天工程師洛雷娜·巴爾巴稱其為「五層代碼中的機械」。而傑克·唐加拉說:「它為我們的計算提供了基礎結構。」
顯微鏡必備:NIH Image(1987年)
20世紀80年代初,程序員韋恩·拉斯班德在馬里蘭州貝塞斯達的美國國立衛生研究院的腦成像實驗室工作。該實驗室擁有一台掃描儀,可以對X光片進行數字化處理,但無法在電腦上顯示或分析。為此,拉斯班德寫了一個程序。
這個程序是專門為一台價值15萬美元的PDP-11小型計算機設計的,這是一台安裝在架子上的計算機,顯然不適合個人使用。然後,在1987年,蘋果公司發布了Macintosh II,這是一個更友好、更實惠的選擇。拉斯班德說:「在我看來,這顯然是一種更好的實驗室圖像分析系統。」他將軟體轉移到新的平台上,並重新命名,建立了一個圖像分析生態系統。
NIH Image及其後續版本使研究人員能在任何計算機上查看和量化幾乎任何圖像。該軟體系列包括ImageJ,一個拉斯班德為Windows和Linux用戶編寫的基於Java的版本;以及Fiji,這是ImageJ的分發版,由德國德累斯頓的馬克斯普朗克分子細胞生物學和遺傳學研究所的Pavel Tomancak團隊開發,其中包括關鍵的插件。「ImageJ無疑是我們所擁有的最基礎的工具,」布洛德研究所(由麻省理工學院和哈佛大學聯合創立)成像平台的計算生物學家貝絲·契米妮說,「我從來沒有和一個使用過顯微鏡,但沒有使用過ImageJ或Fiji的生物學家說過話。」
拉斯班德表示,部分原因可能是這些工具是免費的。但威斯康星大學麥迪遜分校的生物醫學工程師Kevin Eliceiri指出,另一個原因是用戶可以很容易地根據自己的需求定製工具。自拉斯班德退休後,Kevin Eliceiri的團隊一直領導著ImageJ的開發。ImageJ提供了一個看似簡單、極簡主義的用戶界面,自20世紀90年代以來基本上沒有改變。然而,由於其內置的宏記錄器(允許用戶通過記錄滑鼠點擊和菜單選擇的序列來保存工作流)、廣泛的文件格式兼容性和靈活的插件架構,該工具具有無限的可擴展性。該團隊的編程主管柯蒂斯·魯登表示,有「數以百計的人」為ImageJ貢獻了插件。這些新添加的功能極大擴展了研究人員的工具集,例如在視頻中跟蹤對象或自動識別細胞的功能。
Kevin Eliceiri說:「這個程序的目的不是做到一切或終結一切,而是服務於用戶的目標。不像Photoshop和其他程序,ImageJ可以成為你想要的任何東西。」
序列搜索器:BLAST (1990年)
可能沒有什麼能比把軟體名稱變成動詞更能說明文化的相關性了。提到搜索,你會想到谷歌;而提到遺傳學,研究者會立刻想到BLAST。
通過諸如替代、刪除、缺失和重排等方式,生物將進化中的改變蝕刻在分子序列中。尋找序列之間的相似性——特別是蛋白質之間的相似性——可以讓研究人員發現進化關系,並深入了解基因功能。在迅速膨脹的分子信息資料庫中,想要快速而准確地做到這一點並不容易。
瑪格麗特·戴霍夫在1978年提供了關鍵的進展。她設計了一種「點接受突變」矩陣,使研究人員不僅可以根據兩種蛋白質序列的相似程度,還可以根據進化距離來為評估它們的親緣關系。
1985年,弗吉尼亞大學的威廉·皮爾森和NCBI的大衛·利普曼引入了FASTP,這是一種結合了戴霍夫矩陣和快速搜索能力的演算法。
數年後,利普曼與NCBI的沃倫·吉什和斯蒂芬·阿特舒爾,賓夕法尼亞州立大學的韋伯·米勒,以及亞利桑那大學的吉恩·邁爾斯一起開發了一種更強大的改進技術:BLAST(Basic Local Alignment Search Tool)。BLAST發布於1990年,將處理快速增長的資料庫所需的搜索速度,與提取進化上更為遙遠的匹配結果的能力結合起來。與此同時,該工具還可以計算出這些匹配發生的概率。
阿特舒爾表示,計算結果出來得非常快,「你可以輸入搜索內容,喝一口咖啡,搜索就完成了。」但更重要的是,BLAST很容易使用。在一個通過郵寄更新資料庫的時代,沃倫·吉什建立了一個電子郵件系統,後來又建立了一個基於網路的架構,允許用戶在NCBI計算機上遠程運行搜索,從而確保搜索結果始終是最新的。
哈佛大學的計算生物學家肖恩·艾迪表示,BLAST系統為當時處於萌芽階段的基因組生物學領域提供了一個變革性的工具,即一種根據相關基因找出未知基因可能功能的方法。對於各地的測序實驗室,它還提供了一個新穎的動詞。「它是眾多由名詞變成動詞的例子之一,」艾迪說,「你會說,你正准備BLAST一下你的序列。」
預印本平台:arXiv.org (1991年)
20世紀80年代末,高能物理學家經常將他們已投稿的論文手稿副本郵寄給同行,徵求他們的意見——但只發給少數人。物理學家保羅·金斯帕格在2017年寫道:「處於食物鏈較低位置的人依賴於一線研究者的成果,而非精英機構中有抱負的研究人員則往往身處特權圈以外。」
1991年,當時在新墨西哥州洛斯阿拉莫斯國家實驗室工作的金斯帕格編寫了一個電子郵件自動應答程序,希望建立一個公平的競爭環境。訂閱者每天都會收到預印本列表,每一篇都與文章標識符相關聯。只需通過一封電子郵件,世界各地的用戶就可以從實驗室的計算機系統中提交或檢索論文,並獲得新論文的列表,或按作者或標題進行搜索。
金斯帕格的計劃是將論文保留三個月,並將內容限制在高能物理學界。但一位同事說服他無限期地保留這些文章。他說:「就在那一刻,它從布告欄變成了檔案館。」於是,論文開始從比各個領域如潮水般涌來。1993年,金斯伯格將這個系統遷移到互聯網上,並在1998年將其命名為arXiv.org,沿用至今。
arXiv成立已近30年,擁有約180萬份預印本,全部免費提供,而且每月有超過1.5萬份論文提交,下載量達3000萬次。十年前,《自然-光子學》(Nature Photonics)的編輯在評論arXiv創立20周年時寫道:「不難看出為什麼arXiv的服務會如此受歡迎,這個系統讓研究人員能快速而方便地插上旗幟,顯示他們所做的工作,同時避免投稿傳統同行評議期刊時的麻煩和時間成本。」
arXiv網站的成功也促進了生物學、醫學、 社會 學和其他學科同類預印本網站的繁榮。在如今已出版的數萬份關於新冠病毒的預印本中就可以看到這種影響。「很高興看到30年前在粒子物理學界之外被認為是異端的方法,現在被普遍認為是平淡無奇和自然而然的,」金斯伯格說,「從這個意義上說,它就像一個成功的研究項目。」
數據瀏覽器:IPython Notebook (2011年)
2001年,費爾南多·佩雷斯還是一位希望「尋找拖延症」的研究生,當時他決定採用Python的一個核心組件。
Python是一種解釋型語言,這意味著程序是逐行執行的。程序員可以使用一種稱為「讀取-評估-列印循環」(read–evaluate–print loop,簡稱REPL)的計算調用和響應工具,在其中輸入代碼,然後由解釋器執行代碼。REPL允許快速 探索 和迭代,但佩雷斯指出,Python的REPL並不是為科學目的而構建的。例如,它不允許用戶方便地預載入代碼模塊,也不允許打開數據可視化。因此,佩雷斯自己編寫了另一個版本。
結果就是IPython的誕生,這是一個「互動式」Python解釋器,由佩雷斯在2001年12月推出,共有259行代碼。十年後,佩雷斯與物理學家布萊恩·格蘭傑和數學家埃文·帕特森合作,將該工具遷移到web瀏覽器上,推出了IPython Notebook,開啟了一場數據科學革命。
與其他計算型Notebook一樣,IPython Notebook將代碼、結果、圖形和文本合並在一個文檔中。但與其他類似項目不同的是,IPython Notebook是開源的,邀請了大量開發者社區的參與其中。而且它支持Python,一種很受科學家歡迎的語言。2014年,IPython演變為Jupyter,支持大約100種語言,允許用戶在遠程超級計算機上 探索 數據,就像在自己的筆記本電腦上一樣輕松。
《自然》雜志在2018年寫道:「對於數據科學家,Jupyter實際上已經成為一個標准。」當時,在GitHub代碼共享平台上有250萬個Jupyter Notebook;如今,這一數字已經發展到1000萬個,在2016年引力波的發現,以及2019年的黑洞成像工作中,它們都發揮了重要的作用。佩雷斯說:「我們對這些項目做出了很小的貢獻,這是非常值得的。」
快速學習器:AlexNet(2012年)
人工智慧有兩種類型。一種是使用編碼規則,另一種則通過模擬大腦的神經結構來讓計算機「學習」。加拿大多倫多大學的計算機科學家傑弗里•辛頓表示,幾十年來,人工智慧研究人員一直認為後者是「一派胡言」。但在2012年,他的研究生亞力克斯·克里澤夫斯基和伊爾亞·蘇茨克維證明了事實並非如此。
在一年一度的ImageNet比賽中,研究人員被要求在一個包含100萬張日常物體圖像的資料庫中訓練人工智慧,然後在一個單獨圖像集上測試生成的演算法。辛頓表示,當時最好的演算法錯誤分類了大約四分之一的圖像。克里澤夫斯基和蘇茨克維的AlexNet是一種基於神經網路的「深度學習」演算法,它將錯誤率降低到了16%。辛頓說:「我們基本上把錯誤率減半了,或者說幾乎減半了。」
辛頓還指出,該團隊在2012年的成功反映了足夠大的訓練數據集與出色的編程,以及新出現的圖形處理單元的強大能力的結合。圖形處理單元是最初設計用來加速計算機視頻性能的處理器。「突然之間,我們可以將(演算法)運行速度提高30倍,」他說,「或者說,學習多達30倍的數據。」
真正的演算法突破實際上發生在三年前,當時辛頓的實驗室創建了一個神經網路,可以比經過幾十年改進的傳統人工智慧更准確地識別語音。「只是稍微好一點,」辛頓說,「但這已經預示了某些東西。」
這些成功預示著深度學習在實驗室研究、臨床醫學和其他領域的崛起。通過人工智慧的深度學習,手機能夠理解語音查詢,圖像分析工具能夠很容易地在顯微照片中識別出細胞;這就是為什麼AlexNet會成為眾多從根本上改變科學,也改變世界的工具之一。(任天)
Ⅶ 關於linux里運行mathematica的.nb文件
輸入1+1,然後按shift+enter,或前陵者數字鍵並晌盤的回車鍵,或者選定單元然右擊選「慧蔽戚evaluate cell」,這三種方法都能運行該單元內的代碼
Ⅷ 在Linux環境下模擬實現簡單命令解釋器
我記得以前有一個網站,可以在線模擬,不管什麼命令都可以執行,包括rm -rf /
只是不記得那個網站了。