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

Translation

(itstool) path: sect2/para
English
We add the macros for their use:
Context English Persian State
Again, <filename>syscalls.master</filename> lists two versions of <function role="syscall">fstat</function>, a traditional one (syscall 62), and a <acronym><trademark class="registered">POSIX</trademark></acronym> one (syscall 189). Naturally, we will use the <acronym><trademark class="registered">POSIX</trademark></acronym> version: دوباره، <filename>syscalls.master</filename> دو نسخه از <function role="syscall">fstat</function> را فهرست می‌کند، یک نسخهٔ سنتی (syscall 62)، و یک نسخهٔ <acronym><trademark class="registered">POSIX</trademark></acronym> (syscall 189). به‌طور طبیعی، از نسخهٔ <acronym><trademark class="registered">POSIX</trademark></acronym> استفاده می‌کنیم:
189 STD POSIX { int fstat(int fd, struct stat *sb); } 189 STD POSIX { int fstat(int fd, struct stat *sb); }
This is a very straightforward call: We pass to it the address of a <varname remap="structname">stat</varname> structure and the descriptor of an open file. It will fill out the contents of the <varname remap="structname">stat</varname> structure. این یک فراخوان بسیار مستقیم است: ما آن را به نشانی یک ساختمان <varname remap="structname">stat</varname> و یک توصیف‌گر پروندهٔ باز منتقل می‌کنیم. محتوای ساختمان <varname remap="structname">stat</varname> را پر می‌کند.
I do, however, have to say that I tried to declare the <varname remap="structname">stat</varname> structure in the <varname>.bss</varname> section, and <function role="syscall">fstat</function> did not like it: It set the carry flag indicating an error. After I changed the code to allocate the structure on the stack, everything was working fine. من، هرچند، لازم است خاطر نشان کنم که سعی کرده‌ام ساختمان <varname remap="structname">stat</varname> را در قسمت <varname>.bss</varname> تعریف کنم، و <function role="syscall">fstat</function> آن را دوست نداشت: نشان رقم نقلی‌ای را تعیین می‌کند که نشان‌گر خطاست . پس از آنکه کد را برای تخصیص ساختمان در پشته تغییر دادم، همه چیز به‌درستی کار می‌کرد.
Changing the File Size تغییر اندازهٔ پرونده
Because our program may combine carriage return / line feed sequences into straight line feeds, our output may be smaller than our input. However, since we are placing our output into the same file we read the input from, we may have to change the size of the file. از آنجا که برنامهٔ ما ممکن است توالی سرسطر / نوسطر را درون نوسطرهای مستقیم ترکیب ‌کند، ممکن است خروجی ما کوچک‌تر از ورودی‌مان باشد. گرچه، از آنجا که خروجی خود را در همان پرونده‌ای که ورودی را از آن می‌خوانیم قرار می‌دهیم، ممکن است مجبور به تغییر اندازهٔ پرونده باشیم.
The <function role="syscall">ftruncate</function> system call allows us to do just that. Despite its somewhat misleading name, the <function role="syscall">ftruncate</function> system call can be used to both truncate the file (make it smaller) and to grow it. فراخوان سامانهٔ <function role="syscall">ftruncate</function> این امکان را به ما می‌دهد تا دقیقاً همین کار را انجام دهیم. با وجود اسم نسبتاً‌ گمراه‌کننده‌اش، فراخوان سامانهٔ <function role="syscall">ftruncate</function> را می‌توان هم برای کوتاه کردن (کوچک‌تر کردن آن) و هم بزرگ کردن آن به کار برد.
And yes, we will find two versions of <function role="syscall">ftruncate</function> in <filename>syscalls.master</filename>, an older one (130), and a newer one (201). We will use the newer one: و بله، ما دو نسخه از <function role="syscall">ftruncate</function> را در <filename>syscalls.master</filename> پیدا خواهیم کرد، یک نسخهٔ‌ قدیمی‌تر (130) و نسخه‌ای جدیدتر (201). ما از نسخهٔ جدیدتر استفاده خواهیم کرد:
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>، تنها لازم بود تا فیلتر ساده‌ای بنویسم که مراحل زیر را انجام دهد:

Loading…

We add the macros for their use:
ماکروها را برای استفادهٔ آنها اضافه می‌کنیم:
5 months ago
Browse all component changes

Glossary

English Persian
No related strings found in the glossary.

Source information

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