The translation is temporarily closed for contributions due to maintenance, please come back later.

Translation

(itstool) path: sect1/para
English
The typical <trademark class="registered">UNIX</trademark> user then essentially assembles his own applications by writing a shell script which combines the various existing programs by piping the output of one program to the input of another.
Context English Persian State
201 STD BSD { int ftruncate(int fd, int pad, off_t length); } 201 STD BSD { int ftruncate(int fd, int pad, off_t length); }
Please note that this one contains a <varname>int pad</varname> again. لطفاً توجه داشته باشید که این مورد دوباره شامل یک <varname>int pad</varname> است.
ftuc ftuc
We now know everything we need to write <application>ftuc</application>. We start by adding some new lines in <filename>system.inc</filename>. First, we define some constants and structures, somewhere at or near the beginning of the file: ما هر آنچه که برای نوشتن <application>ftuc</application> نیاز است را می‌دانیم. با اضافه کردن چندین خط جدید به <filename>system.inc</filename> آغاز می‌کنیم. ابتدا، چندین مقدار ثابت و ساختار را در جایی از ابتدای پرونده یا نزدیک آن تعریف می‌کنیم:
;;;;;;; open flags
%define O_RDONLY 0
%define O_WRONLY 1
%define O_RDWR 2

;;;;;;; mmap flags
%define PROT_NONE 0
%define PROT_READ 1
%define PROT_WRITE 2
%define PROT_EXEC 4
;;
%define MAP_SHARED 0001h
%define MAP_PRIVATE 0002h

;;;;;;; stat structure
struc stat
st_dev resd 1 ; = 0
st_ino resd 1 ; = 4
st_mode resw 1 ; = 8, size is 16 bits
st_nlink resw 1 ; = 10, ditto
st_uid resd 1 ; = 12
st_gid resd 1 ; = 16
st_rdev resd 1 ; = 20
st_atime resd 1 ; = 24
st_atimensec resd 1 ; = 28
st_mtime resd 1 ; = 32
st_mtimensec resd 1 ; = 36
st_ctime resd 1 ; = 40
st_ctimensec resd 1 ; = 44
st_size resd 2 ; = 48, size is 64 bits
st_blocks resd 2 ; = 56, ditto
st_blksize resd 1 ; = 64
st_flags resd 1 ; = 68
st_gen resd 1 ; = 72
st_lspare resd 1 ; = 76
st_qspare resd 4 ; = 80
endstruc
;;;;;;; open flags
%define O_RDONLY 0
%define O_WRONLY 1
%define O_RDWR 2

;;;;;;; mmap flags
%define PROT_NONE 0
%define PROT_READ 1
%define PROT_WRITE 2
%define PROT_EXEC 4
;;
%define MAP_SHARED 0001h
%define MAP_PRIVATE 0002h

;;;;;;; stat structure
struc stat
st_dev resd 1 ; = 0
st_ino resd 1 ; = 4
st_mode resw 1 ; = 8, size is 16 bits
st_nlink resw 1 ; = 10, ditto
st_uid resd 1 ; = 12
st_gid resd 1 ; = 16
st_rdev resd 1 ; = 20
st_atime resd 1 ; = 24
st_atimensec resd 1 ; = 28
st_mtime resd 1 ; = 32
st_mtimensec resd 1 ; = 36
st_ctime resd 1 ; = 40
st_ctimensec resd 1 ; = 44
st_size resd 2 ; = 48, size is 64 bits
st_blocks resd 2 ; = 56, ditto
st_blksize resd 1 ; = 64
st_flags resd 1 ; = 68
st_gen resd 1 ; = 72
st_lspare resd 1 ; = 76
st_qspare resd 4 ; = 80
endstruc
We define the new syscalls: فراخوان‌های سامانهٔ جدید را تعریف می‌کنیم:
%define SYS_mmap 197
%define SYS_munmap 73
%define SYS_fstat 189
%define SYS_ftruncate 201
%define SYS_mmap 197
%define SYS_munmap 73
%define SYS_fstat 189
%define SYS_ftruncate 201
We add the macros for their use: ماکروها را برای استفادهٔ آنها اضافه می‌کنیم:
%macro sys.mmap 0
system SYS_mmap
%endmacro

%macro sys.munmap 0
system SYS_munmap
%endmacro

%macro sys.ftruncate 0
system SYS_ftruncate
%endmacro

%macro sys.fstat 0
system SYS_fstat
%endmacro
%macro sys.mmap 0
system SYS_mmap
%endmacro

%macro sys.munmap 0
system SYS_munmap
%endmacro

%macro sys.ftruncate 0
system SYS_ftruncate
%endmacro

%macro sys.fstat 0
system SYS_fstat
%endmacro
And here is our code: و این کد ما هست:
;;;;;;; Fast Text-to-Unix Conversion (ftuc.asm) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Started: 21-Dec-2000
;; Updated: 22-Dec-2000
;;
;; Copyright 2000 G. Adam Stanislav.
;; All rights reserved.
;;
;;;;;;; v.1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
%include 'system.inc'

section .data
db 'Copyright 2000 G. Adam Stanislav.', 0Ah
db 'All rights reserved.', 0Ah
usg db 'Usage: ftuc filename', 0Ah
usglen equ $-usg
co db "ftuc: Can't open file.", 0Ah
colen equ $-co
fae db 'ftuc: File access error.', 0Ah
faelen equ $-fae
ftl db 'ftuc: File too long, use regular tuc instead.', 0Ah
ftllen equ $-ftl
mae db 'ftuc: Memory allocation error.', 0Ah
maelen equ $-mae

section .text

align 4
memerr:
push dword maelen
push dword mae
jmp short error

align 4
toolong:
push dword ftllen
push dword ftl
jmp short error

align 4
facerr:
push dword faelen
push dword fae
jmp short error

align 4
cantopen:
push dword colen
push dword co
jmp short error

align 4
usage:
push dword usglen
push dword usg

error:
push dword stderr
sys.write

push dword 1
sys.exit

align 4
global _start
_start:
pop eax ; argc
pop eax ; program name
pop ecx ; file to convert
jecxz usage

pop eax
or eax, eax ; Too many arguments?
jne usage

; Open the file
push dword O_RDWR
push ecx
sys.open
jc cantopen

mov ebp, eax ; Save fd

sub esp, byte stat_size
mov ebx, esp

; Find file size
push ebx
push ebp ; fd
sys.fstat
jc facerr

mov edx, [ebx + st_size + 4]

; File is too long if EDX != 0 ...
or edx, edx
jne near toolong
mov ecx, [ebx + st_size]
; ... or if it is above 2 GB
or ecx, ecx
js near toolong

; Do nothing if the file is 0 bytes in size
jecxz .quit

; Map the entire file in memory
push edx
push edx ; starting at offset 0
push edx ; pad
push ebp ; fd
push dword MAP_SHARED
push dword PROT_READ | PROT_WRITE
push ecx ; entire file size
push edx ; let system decide on the address
sys.mmap
jc near memerr

mov edi, eax
mov esi, eax
push ecx ; for SYS_munmap
push edi

; Use EBX for state machine
mov ebx, ordinary
mov ah, 0Ah
cld

.loop:
lodsb
call ebx
loop .loop

cmp ebx, ordinary
je .filesize

; Output final lf
mov al, ah
stosb
inc edx

.filesize:
; truncate file to new size
push dword 0 ; high dword
push edx ; low dword
push eax ; pad
push ebp
sys.ftruncate

; close it (ebp still pushed)
sys.close

add esp, byte 16
sys.munmap

.quit:
push dword 0
sys.exit

align 4
ordinary:
cmp al, 0Dh
je .cr

cmp al, ah
je .lf

stosb
inc edx
ret

align 4
.cr:
mov ebx, cr
ret

align 4
.lf:
mov ebx, lf
ret

align 4
cr:
cmp al, 0Dh
je .cr

cmp al, ah
je .lf

xchg al, ah
stosb
inc edx

xchg al, ah
; fall through

.lf:
stosb
inc edx
mov ebx, ordinary
ret

align 4
.cr:
mov al, ah
stosb
inc edx
ret

align 4
lf:
cmp al, ah
je .lf

cmp al, 0Dh
je .cr

xchg al, ah
stosb
inc edx

xchg al, ah
stosb
inc edx
mov ebx, ordinary
ret

align 4
.cr:
mov ebx, ordinary
mov al, ah
; fall through

.lf:
stosb
inc edx
ret
;;;;;;; Fast Text-to-Unix Conversion (ftuc.asm) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Started: 21-Dec-2000
;; Updated: 22-Dec-2000
;;
;; Copyright 2000 G. Adam Stanislav.
;; All rights reserved.
;;
;;;;;;; v.1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
%include 'system.inc'

section .data
db 'Copyright 2000 G. Adam Stanislav.', 0Ah
db 'All rights reserved.', 0Ah
usg db 'Usage: ftuc filename', 0Ah
usglen equ $-usg
co db "ftuc: Can't open file.", 0Ah
colen equ $-co
fae db 'ftuc: File access error.', 0Ah
faelen equ $-fae
ftl db 'ftuc: File too long, use regular tuc instead.', 0Ah
ftllen equ $-ftl
mae db 'ftuc: Memory allocation error.', 0Ah
maelen equ $-mae

section .text

align 4
memerr:
push dword maelen
push dword mae
jmp short error

align 4
toolong:
push dword ftllen
push dword ftl
jmp short error

align 4
facerr:
push dword faelen
push dword fae
jmp short error

align 4
cantopen:
push dword colen
push dword co
jmp short error

align 4
usage:
push dword usglen
push dword usg

error:
push dword stderr
sys.write

push dword 1
sys.exit

align 4
global _start
_start:
pop eax ; argc
pop eax ; program name
pop ecx ; file to convert
jecxz usage

pop eax
or eax, eax ; Too many arguments?
jne usage

; Open the file
push dword O_RDWR
push ecx
sys.open
jc cantopen

mov ebp, eax ; Save fd

sub esp, byte stat_size
mov ebx, esp

; Find file size
push ebx
push ebp ; fd
sys.fstat
jc facerr

mov edx, [ebx + st_size + 4]

; File is too long if EDX != 0 ...
or edx, edx
jne near toolong
mov ecx, [ebx + st_size]
; ... or if it is above 2 GB
or ecx, ecx
js near toolong

; Do nothing if the file is 0 bytes in size
jecxz .quit

; Map the entire file in memory
push edx
push edx ; starting at offset 0
push edx ; pad
push ebp ; fd
push dword MAP_SHARED
push dword PROT_READ | PROT_WRITE
push ecx ; entire file size
push edx ; let system decide on the address
sys.mmap
jc near memerr

mov edi, eax
mov esi, eax
push ecx ; for SYS_munmap
push edi

; Use EBX for state machine
mov ebx, ordinary
mov ah, 0Ah
cld

.loop:
lodsb
call ebx
loop .loop

cmp ebx, ordinary
je .filesize

; Output final lf
mov al, ah
stosb
inc edx

.filesize:
; truncate file to new size
push dword 0 ; high dword
push edx ; low dword
push eax ; pad
push ebp
sys.ftruncate

; close it (ebp still pushed)
sys.close

add esp, byte 16
sys.munmap

.quit:
push dword 0
sys.exit

align 4
ordinary:
cmp al, 0Dh
je .cr

cmp al, ah
je .lf

stosb
inc edx
ret

align 4
.cr:
mov ebx, cr
ret

align 4
.lf:
mov ebx, lf
ret

align 4
cr:
cmp al, 0Dh
je .cr

cmp al, ah
je .lf

xchg al, ah
stosb
inc edx

xchg al, ah
; fall through

.lf:
stosb
inc edx
mov ebx, ordinary
ret

align 4
.cr:
mov al, ah
stosb
inc edx
ret

align 4
lf:
cmp al, ah
je .lf

cmp al, 0Dh
je .cr

xchg al, ah
stosb
inc edx

xchg al, ah
stosb
inc edx
mov ebx, ordinary
ret

align 4
.cr:
mov ebx, ordinary
mov al, ah
; fall through

.lf:
stosb
inc edx
ret
Do not use this program on files stored on a disk formatted by <acronym><trademark class="registered">MS-DOS</trademark></acronym> or <trademark class="registered">Windows</trademark>. There seems to be a subtle bug in the FreeBSD code when using <function role="syscall">mmap</function> on these drives mounted under FreeBSD: If the file is over a certain size, <function role="syscall">mmap</function> will just fill the memory with zeros, and then copy them to the file overwriting its contents. این برنامه را در پرونده‌های ذخیره شده بر روی دیسک فرمت شده توسط <acronym><trademark class="registered">MS-DOS</trademark></acronym> یا <trademark class="registered">Windows</trademark> استفاده نکنید. به نظر می‌رسد که هنگام استفاده از <function role="syscall">mmap</function> در این رانه‌هایی که تحت FreeBSD وصل شده‌اند اشکال نامحسوسی در کد FreeBSD وجود داشته باشد: اگر پرونده فراتر از اندازهٔ مشخصی باشد، <function role="syscall">mmap</function> تنها حافظه را با صفرها پر می‌کند، و سپس آنها رادر پرونده‌ کپی می‌کند و محتویاتش را بازنویسی می‌کند.
One-Pointed Mind ذهن تک هدفی
As a student of Zen, I like the idea of a one-pointed mind: Do one thing at a time, and do it well. به‌عنوان یک دانش‌آموز ذن، ایدهٔ ذهن تک هدفی را دوست دارم: یک کار را در لحظه انجام دهید، و آن را به‌خوبی انجام دهید.
This, indeed, is very much how <trademark class="registered">UNIX</trademark> works as well. While a typical <trademark class="registered">Windows</trademark> application is attempting to do everything imaginable (and is, therefore, riddled with bugs), a typical <trademark class="registered">UNIX</trademark> program does only one thing, and it does it well. این، در واقع بسیار شبیه به نحوهٔ کارکرد <trademark class="registered">UNIX</trademark> است. هنگامی‌که یک برنامهٔ عادی در <trademark class="registered">Windows</trademark> سعی دارد تا هر کار قابل تصوری را انجام دهد (و در نتیجه، مملو از اشکال است)، یک برنامهٔ عادی در <trademark class="registered">UNIX</trademark> تنها یک کار را انجام می‌دهد، و آن را به‌درستی انجام دهد.
The typical <trademark class="registered">UNIX</trademark> user then essentially assembles his own applications by writing a shell script which combines the various existing programs by piping the output of one program to the input of another. کاربر عادی <trademark class="registered">UNIX</trademark> سپس برنامه‌های خود را اساساً‌ با نوشتن اجرانامهٔ پوسته‌ای که برنامه‌های پیشین را با پایپ کردن خروجی برنامه‌ای به ورودی برنامه‌ای دیگر ترکیب می‌کند، همگذاری می‌کند.
When writing your own <trademark class="registered">UNIX</trademark> software, it is generally a good idea to see what parts of the problem you need to solve can be handled by existing programs, and only write your own programs for that part of the problem that you do not have an existing solution for. هنگام نگاشتن نرم‌افزار <trademark class="registered">UNIX</trademark> خود، به‌طور کلی بررسی برنامه‌های موجود به‌منظور حل کردن بخش‌هایی از مشکل شما، و نگاشتن برنامهٔ خود تنها برای همان بخش از مشکل که هیچ چاره‌ای برایش ندارید ایدهٔ خوبی‌ست.
CSV CSV
I will illustrate this principle with a specific real-life example I was faced with recently: من این اصل را با یک مثال واقعی که چندی پیش با آن برخورد کردم نشان می‌دهم:
I needed to extract the 11th field of each record from a database I downloaded from a web site. The database was a <acronym>CSV</acronym> file, i.e., a list of <emphasis>comma-separated values</emphasis>. That is quite a standard format for sharing data among people who may be using different database software. لازم بود یازدهمین رشته از هر ثبتی را از پایگاه داده‌ای که از یک وبسایت بارگیری کردم را استخراج کنم. پایگاه داده یک پروندهٔ <acronym>CSV</acronym> بود، برای مثال، فهرستی از <emphasis>مقادیر جدا شده توسط ویرگول</emphasis>. این قالب نسبتاً‌ استاندارد برای اشتراک‌گذاری داده‌ها بین کسانی است که ممکن است از نرم‌افزارهای پایگاه‌دادهٔ متفاوتی استفاده کنند.
The first line of the file contains the list of various fields separated by commas. The rest of the file contains the data listed line by line, with values separated by commas. اولین سطر از پرونده شامل فهرستی از رشته‌های گوناگون جدا شده توسط ویرگول است. باقی پرونده شامل داده‌ای است که به‌همراه مقادیر جدا شده‌ توسط ویرگول، سطر به سطر فهرست شده است.
I tried <application>awk</application>, using the comma as a separator. But because several lines contained a quoted comma, <application>awk</application> was extracting the wrong field from those lines. <application>awk</application> را با استفاده از ویرگول به‌عنوان جداکننده امتحان کردم. اما از آنجا که چندین سطر شامل ویروگول نقل قول شده بودند، <application>awk</application> در حال استخراج رشته‌های اشتباه از آن سطرها بود.
Therefore, I needed to write my own software to extract the 11th field from the <acronym>CSV</acronym> file. However, going with the <trademark class="registered">UNIX</trademark> spirit, I only needed to write a simple filter that would do the following: از این رو، باید نرم‌افزار خودم را برای استخراج رشتهٔ یازدهم از پروندهٔ <acronym>CSV</acronym> می‌نوشتم. گرچه، با توجه به روحیهٔ <trademark class="registered">UNIX</trademark>، تنها لازم بود تا فیلتر ساده‌ای بنویسم که مراحل زیر را انجام دهد:
Remove the first line from the file; سطر نخست را از پرونده حذف کنید؛
Change all unquoted commas to a different character; تمام ویرگول‌های نقل قول نشده را به یک نویسهٔ متفاوت تغییر دهید؛
Remove all quotation marks. تمام نشان‌های نقل قول را حذف کنید.
Strictly speaking, I could use <application>sed</application> to remove the first line from the file, but doing so in my own program was very easy, so I decided to do it and reduce the size of the pipeline. به‌طور دقیق بگویم، می‌توانستم از <application>sed</application> برای حذف سطر نخست از پرونده استفاده کنم، اما انجام آن در برنامهٔ خودم بسیار آسان‌تر بود، در نتیجه تصمیم گرفتم تا همین کار را انجام دهم و اندازهٔ pipeline را کاهش دهم.
At any rate, writing a program like this took me about 20 minutes. Writing a program that extracts the 11th field from the <acronym>CSV</acronym> file would take a lot longer, and I could not reuse it to extract some other field from some other database. به هر حال، نگاشتن برنامه‌ای چون این ۲۰ دقیقه از وقت من را گرفت. نگاشتن برنامه‌ای که یازدهمین رشته از پروندهٔ <acronym>CSV</acronym> را استخراج کند زمان بیشتری خواهد برد، و من نمی‌توانم از آن برای استخراج رشته‌‌ای دیگر از پایگاه داده‌ای دیگر استفادهٔ مجدد کنم.
This time I decided to let it do a little more work than a typical tutorial program would: این بار تصمیم گرفتم بگذارم کمی بیشتر از یک برنامهٔ آموزشی معمولی کار انجام دهد:
It parses its command line for options; خط فرمان خود را برای گزینه‌ها تجزیه می‌کند؛
It displays proper usage if it finds wrong arguments; در صورت پیدا کردن براهین غلط، کاربرد صحیح را نمایش می‌دهد؛

Loading…

The typical <trademark class="registered">UNIX</trademark> user then essentially assembles his own applications by writing a shell script which combines the various existing programs by piping the output of one program to the input of another.
کاربر عادی <trademark class="registered">UNIX</trademark> سپس برنامه‌های خود را اساساً‌ با نوشتن اجرانامهٔ پوسته‌ای که برنامه‌های پیشین را با پایپ کردن خروجی برنامه‌ای به ورودی برنامه‌ای دیگری ترکیب می‌کند، همگذاری می‌کند.
4 months ago
The typical <trademark class="registered">UNIX</trademark> user then essentially assembles his own applications by writing a shell script which combines the various existing programs by piping the output of one program to the input of another.
کاربر عادی <trademark class="registered">UNIX</trademark> سپس برنامه‌های خود را اساساً‌ با نوشتن اجرانامهٔ پوسته‌ای که برنامه‌های پیشین را با پایپ کردن خروجی برنامه‌ای به ورودی دیگری ترکیب می‌کند، همگذاری می‌کند.
4 months ago
Browse all component changes

Glossary

English Persian
Script اجرانامه FreeBSD Doc (Archived)
Shell پوسته FreeBSD Doc (Archived)

Source information

Source string comment
(itstool) path: sect1/para
Source string location
book.translate.xml:12104
String age
8 months ago
Source string age
a year ago
Translation file
books/fa/developers-handbook.po, string 1905