Вы же по-прежнему не продаёте Novec 1230 (Фторкетон ФК-5-1-12) в розницу
Возможно, по этой причине:
Пары вещества разлагаются в атмосфере под воздействием солнечного света, ультрафиолета или при нагревании с образованием токсичных веществ, в том числе фтороводорода (при взаимодействии с парами воды), трифторуксусной кислоты, угарного и углекислого газов. Поэтому компания 3M ограничивает применение вещества только профессиональной сферой. (Википедия)
Ну чтоб совсем быстро было, можно вообще не париться с фреймворками и обойтись даже без подключения дополнительных файлов. Т.е. и конфиг для доступа к БД, и подключение к ней, и выборка/запись данных и прочая логика, и HTML — в одном файле. Будет ОЧЕНЬ быстро :D Так делали 20-25 лет назад. А если серьезно, то например само подключение к БД займет намного больше времени (если оно используется, конечно).
P.S. Я хочу сказать, что это не тот случай, когда следует беспокоиться о производительности. Ну выиграете вы с eval несколько лишних микросекунд (если, конечно, выиграете), толку с этого?
P.P.S. Ведь view все равно подключать надо как отдельный файл, или вы это в контроллере хранить собираетесь? И параметры ему распаковать тоже надо.
Я что-то такое читал на osdev. Просто с long mode еще не разбирался, а с protected mode игрался еще в старших классах. Ну и я не супероперационку делаю, просто балуюсь :) Хотел вспомнить ассемблер — написал загрузик, вспомнил, ну и забил пока. Будет совсем нечего делать — попробую уже с grub поиграть.
P.S. Ну вот выше как раз ссылку на ту статью дали.
Ну это да, я вот тоже не так давно игрался, вспоминая былые времена :) Просто решил что нет смысла дальше возиться с защищенным режимом (который я кое-как помню еще) если сейчас используется long mode.
Заголовок спойлера
use16
org 0h
; ---------------------------------------------------------------------------------------
; Boot
;
; DL - Boot drive number
; ---------------------------------------------------------------------------------------
; Start
mov ax, 07C0h
mov ds, ax
; Initialize stack
mov ax, 9000h
cli
mov ss, ax
mov sp, 0FFF0h
sti
; Set destination segment to load kernel to
mov ax, 50h
mov es, ax
mov si, msg_boot_loading
call print_string
; Reset floppy drive
mov ah, 0
int 13h
jc .boot_error
; Load kernel into memory
mov ax, 0
mov bx, sectors_per_track
mov cx, heads_per_cylinder
call calc_chs
xor bx, bx ; es:bx -> buffer
mov al, 18 ; sectors count; read 18 sectors of loader
mov ah, 2
int 13h
jc .boot_error
; Set data segment
push es
pop ds
; Pass control to kernel
push ds
push word kernel_entry
retf
; Show error
.boot_error:
mov si, msg_fail
call print_string
.boot_finish:
hlt
jmp .boot_finish
;
; Print String
;
; DS:SI must point to zero-terminated string
;------------------
print_string:
pushf
push ax
push bx
push si
cld
mov ah, 0Eh
mov bh, 0
print_string.repeat:
lodsb
cmp al, 0
je print_string.finish
int 10h
jmp print_string.repeat
print_string.finish:
pop si
pop bx
pop ax
popf
ret
;
; Calculate CHS address by logical sector address
;
; AX - Logical sector number
; BX - Sectors per track
; CX - Heads per cylinder
; Returns (ready for Int13h:02h call):
; CL - Sector number
; CH - Track number
; DH - Head number
; -----------------
calc_chs:
pushf
push ax
push bx
xor dx, dx ; prepare dx:ax for operation
div bx ; divide by sectors per track
inc dl ; add 1 (obsolute sector formula)
mov bl, dl
xor dx, dx ; prepare dx:ax for operation
div cx ; mod by number of heads (Absolue head formula)
mov dh, dl ; everything else was already done from the first formula
mov ch, al ; not much else to
mov cl, bl
pop bx
pop ax
popf
ret
; Data
msg_boot_loading db 'Loading kernel... ', 0
msg_ok db 'Ok.', 0Dh, 0Ah, 0
msg_fail db 'Failed!', 0Dh, 0Ah, 0
sectors_per_track dw 18
heads_per_cylinder dw 2
times 510 - ($ - $$) db 0
dw 0xAA55
; ---------------------------------------------------------------------------------------
; Kernel (real mode)
; ---------------------------------------------------------------------------------------
; CS, DS, and ES now set to 0050h, SS to 9000h
kernel_entry:
mov si, msg_ok
call print_string
mov eax, 0FAFAFDFDh
shr eax, 16
cmp ax, 0FAFAh
jne .fail
mov si, msg_ok
call print_string
; push 0B800h
; pop es
; xor di, di
; mov word [es:di], 0730h
nop
nop
nop
nop
mov ax, an_address
.finish:
hlt
jmp .finish
.fail:
mov si, msg_fail
call print_string
jmp .finish
; ---------------------------------------------------------------------------------------
; Kernel (protected mode)
; ---------------------------------------------------------------------------------------
; Data
gdt:
; null descriptor
dd 0
dd 0
; code descriptor
gdt_code_limit_low dw 0FFFFh
gdt_code_base_low dw 0
gdt_code_base_middle db 0
gdt_code_access db 10011010b
gdt_code_granularity db 11001111b
gdt_code_base_high db 0
; data descriptor
gdt_data_limit_low dw 0FFFFh
gdt_data_base_low dw 0
gdt_data_base_middle db 0
gdt_data_access db 10010010b
gdt_data_granularity db 11001111b
gdt_data_base_high db 0
;
; Print Byte
;
; AL - byte to print
;------------------
print_byte:
pushf
push ax
push dx
mov dl, al
shr al, 4
add al, 48
cmp al, 58
jl print_byte.print
add al, 7
print_byte.print:
call print_char
mov al, dl
and al, 0Fh
add al, 48
cmp al, 58
jl print_byte.print2
add al, 7
print_byte.print2:
call print_char
pop dx
pop ax
popf
ret
;
; Print Char
;
; AL - char to print
;------------------
print_char:
pushf
push ax
push bx
xor bx, bx
mov ah, 0Eh
int 10h
pop bx
pop ax
popf
ret
;
; Print New Line Chars
;
;------------------
print_nl:
pushf
push ax
mov al, 0Dh
call print_char
mov al, 0Ah
call print_char
pop ax
popf
ret
;
; Print Word
;
; AX - word to print
;------------------
print_word:
push ax
mov al, ah
call print_byte
pop ax
call print_byte
ret
;
; Print Bytes
;
; DS:SI - pointer to data to print
; CX - number of bytes to print
;------------------
print_bytes:
pushf
push ax
push cx
push si
print_bytes.repeat:
mov al, [si]
call print_byte
dec cx ; !!
inc si
jcxz print_bytes.finish ; replace to loop???
mov al, 20h
call print_char
jmp print_bytes.repeat
print_bytes.finish:
pop si
pop cx
pop ax
popf
ret
;
; Print Number
;
; AX - number to print
; BL - number base (2, 8 or 10)
;------------------
print_num:
pushf
push ax
push bx
push cx
push dx
xor cx, cx
mov bh, 0
print_num.repeat:
xor dx, dx
div bx
push dx
inc cx
cmp ax, 0
jne print_num.repeat
print_num.output:
pop ax
add al, 48
call print_char
loop print_num.output
pop dx
pop cx
pop bx
pop ax
popf
ret
;
; Print Decimal Number
;
; AX - number to print
; -----------------
print_decimal:
push bx
mov bl, 10
call print_num
pop bx
ret
an_address:
;
;
;
;
; -----------------
Вообще скорее просто ассемблер хотел вспомнить от нечего делать.
В качестве загрузчика лучше уж тот же grub использовать. Зачем велосипедить? Впрочем я недавно сам всё это писал, чисто вспомнить детство, дошел до загрузки ядра и остановился на переходе в защищенный режим, именно потому что подумал, что нет смысла это всё писать, если можно использовать уже готовое решение, к тому же более универсальное.
Вот и я сначала пишу какую-то небольшую часть кода, прикидываю, что получается, и когда картина более-менее ясна, дальше уже продолжаю кодить одновременно с написанием тестов. Здесь тесты очень помогают не сломать что-то очередными изменениями.
Интересно, но не вычитано настолько, что с середины просто надоело. Обычно я через Ctrl+Enter отправляю сообщения о серьезных ошибках/опечатках, но в данном случае это было бы с моей стороны DoS-атакой :) Это что, публикация «для галочки»?
Т.е. автор накатал целую статью чтобы рассказать, как он намучился, не умея пользоваться программой. Я в свое время тоже с GnuPG работал, и да, там не все с ходу понятно. Но есть же наверняка для него графические оболочки или вот как выше написали плагины для почтовых клиентов.
P.S. Прошу прощения, не сразу увидел что это перевод. Отредактировано.
Так я и не спорю с тем, что облака — это хорошо :) Я еще в конце 90-х в старших классах подобную идею вынашивал. Просто сомневаюсь что например тем же банкам или АЭС следует экономить на собственной инфраструктуре и переезжать в облако. Ну и вычисления разного рода там можно проводить, и хранить не особо ценную информацию.
По моему скромному имху, в облаках стоит держать только некритичные данные и сервисы. Или вообще использовать облака только для быстрого развертывания, перенося понемногу потом на свои серверы как в старые добрые времена. Если уж конкретно вашу систему взломают, то ну не повезло / допустили дыру в безопасности, и это коснется только вас. Если взломают облако — пострадают все клиенты. Сколько уже было историй про утечки пользовательских данных хотя бы с тех же почтовых сервисов? Правда, это мнение просто человека который из-за косности и консервативности ко всему новому относится с подозрением, как к очередному хайпу :)
Вот не знал про эту killing feature гугла. А у меня аккаунт там как раз с точкой. Только что с другой почты отправил к себе на гугл, только в адресе на написал точку — и пришло! Удоды.
P.S. Хорошо что это у меня далеко не основной аккаунт, я им вообще почти не пользуюсь. Основной на другом сервисе, на который пока жалоб у меня не было (ну почти).
Вообще к «классическому» рынку это уже никак не относится. У Адама Смита он какой-то идеальный: да, есть конкуренция, но почему-то она есть всегда. В таком упрощенном понимании нет появления монополий. Допустим, какой-то производитель изобрел способ уменьшить издержки/модернизировать производство, и уже получил преимущество перед другими. У него нет стимула оставлять их на рынке, и их шанс выжить — тоже внедрить какое-то новшество. В какой-то момент это двигало научно-технический прогресс, но с появлением монополий государства начали понимать, что они уже тормозят развитие и начали принимать антимонопольные законы. Тут уже не идет о полностью свободном рынке. Я даже не говорю о протекционизме, когда одно государство начинает вводить пошлины, чтобы «своим» производителям было проще конкурировать с зарубежными. Ну и с развитием рынка появляются (вернее, расцветают) банки — производителям нет смысла держать крупные суммы в сейфе (капитал должен быть в обороте, иначе это не капитал а мертвая сумма денег). Это всё очень упрощенно, конечно.
P.S. В общем, чем дальше тем больше некогда свободный (ну почти, условно-свободный) рынок начинают регулировать «сверху».
Возможно, по этой причине:
P.S. Я хочу сказать, что это не тот случай, когда следует беспокоиться о производительности. Ну выиграете вы с eval несколько лишних микросекунд (если, конечно, выиграете), толку с этого?
P.P.S. Ведь view все равно подключать надо как отдельный файл, или вы это в контроллере хранить собираетесь? И параметры ему распаковать тоже надо.
Ну и использовать ob_* функции если надо вывод перехватить.
делать
Такой подход мало чем отличается от прочих шаблонизаторов.
P.S. Ну вот выше как раз ссылку на ту статью дали.
Вообще скорее просто ассемблер хотел вспомнить от нечего делать.
P.S. Прошу прощения, не сразу увидел что это перевод. Отредактировано.
P.S. Хорошо что это у меня далеко не основной аккаунт, я им вообще почти не пользуюсь. Основной на другом сервисе, на который пока жалоб у меня не было (ну почти).
P.S. В общем, чем дальше тем больше некогда свободный (ну почти, условно-свободный) рынок начинают регулировать «сверху».