Скрепы-скрепы...
sp_r00t
На последнем родительском собрании учительница раздала бланки заявлений, в которых нужно было указать специализацию в предмете "Основы религиозных культур и светской этики". Я уж было возрадовался зело! Спустя столько лет ломания копий я наконец-то увижу воочию те самые ОПК, за которые было пролито столько виртуальной крови в этих ваших интернетах.
Но увы...
Учительница, начав объяснять что к чему находилась в явном смущении. Даже название предмета она произнесла скороговоркой и аббревиатурой - ОРКСЭ. Прежде чем расшифровать она рассказала поучительную историю, как в телефонном разговоре она пыталась успокоить некую мамочку, что никакой РЕЛИГИИ тут не будет. Выбора естественно никакого не было - строго светская этика. А когда один из пап попросил дать ему бланк "заявления по религии" (он пришёл после того, как их раздали) учительница снова с жаром стала говорить, что ни о какой религии речи нет.
Наша учительница конечно не отъявленная "аметистка". Просто, видимо, наученная горьким опытом реакций неадекватных родителей на "религиозную пропаганду" в школах.
Я всё понимаю. Десятилетия антирелигиозного шабаша в России сменились десятилетиями шабаша религиозного, когда десятки сект создавали устойчивую идиосинкразию к любой религии вообще. Но... Куда ты катишься, Русь Святая, если педагоги боятся не только о Православии в школьной программе упомянуть, но и даже вслух произносить название предмета, в которое входит слово "религия" избегают?
Русь Святая, храни Веру Православную! В ней же тебе утверждение(с)

В нужном направлении
sp_r00t
Какая замечательная новость. Вдвойне приятно узнать об этом их уст политических оппонентов)))
Верной дорогой идём однако!

lex под виндой
sp_r00t
Понадобилось мне тут воспользоваться утилитой lex под виндой. Скачал я её отсюда (рекомендую, кстати), установил и решил опробовать на простейшем учебном примере.
Но сразу конечно не выгорело.
Компоновщик сразу потерял функцию main. В gcc за это отвечает ключ -ll, подключающий библиотеку libl, а линкер от МС конечно такого позволить себе не мог. Библиотеку для винды я не нашёл, зато в сгенерированном исходнике нашёл ту самую main)))
  1. #if YY_MAIN
  2. int main()
  3. {
  4. yylex();
  5. return 0;
  6. }
  7. #endif


Что, ж, добавим в файл нужный макрос
  1. #define YY_MAIN 1
  2.  

Единица взята конечно же от балды
Линкер это, однако, не угомонило. Теперь неразрезолвленным был символ yywrap.
Но после пяти минут гугления выяснилось, что это решается добавлением в lex-файл строчки

%option noyywrap

Теперь всё собиралось. Но каждый раз править сгенерированный файл не хотелось, поэтому я накидал маленький батник (заметим, что утилиту cat я брал по той же ссылке).
  1. @flex %1
  2. @echo #define YY_MAIN 1 > %2.c
  3. @cat lex.yy.c >> %2.c
  4. @cl %2.c
  5. @del lex.yy.c *.obj
  6.  

Батник вызывается с двумя аргументами - lex-файлом и именем итогового файла.

K.I.S.S.
sp_r00t
Копался недавно в файле evil.info пакета evil для Emacs. И наткнулся на знакомую мне переменную.
Цитирую:
-- Variable: evil-want-C-u-scroll
If 't', then 'C-u' scrolls the buffer. If 'nil' (the default),
then 'C-u' begins a numeric prefix argument.

Сразу вспомнил свою заметку по этому поводу.
Подумалось - почему не быть проще и не выставить ту самую переменную в t?
Сказано - сделано. В файле init.el у меня есть секция для evil'а. Туда и пишем:
;; Это было до изменений
(require 'evil)
(evil-mode 1)
;; Инициализируем
(setq evil-want-C-u-scroll t)
 


Результат - нулевой!)))
Быстренько пытаюсь выставить эту переменную через set variable. Ноль эмоций!
"Мистика" подумалось мне. И так раз пять. Потом пришла в голову мысль о том, что эта переменная поди используется только однажды - на момент привязки к клавишам. А потом меняй её или не меняй - рояли не играет. Отсюда идея, поставить её инициализацию ДО подгрузки модуля. Сказано - сделано.
(setq evil-want-C-u-scroll t)
(require 'evil)
(evil-mode 1)
 
 

Работает!
Будь проще....(с)))))
Tags: ,

ГОТОВИМ ПРИНЦА ИЗ ТОГО, ЧТО ЕСТЬ В ХОЛОДИЛЬНИКЕ.
sp_r00t
Оригинал взят у pesen_net в ГОТОВИМ ПРИНЦА ИЗ ТОГО, ЧТО ЕСТЬ В ХОЛОДИЛЬНИКЕ.


Идеальный мужчина обычно состоит в браке с некрасивой подругой. И это лишь часть вселенской несправедливости. Вторая неприятность - чем больше вложено труда, тем вернее он сбежит.

В детстве женщины верят в принцев «под ключ», которые первыми олезут целоваться. В реальной жизни надо приходится лепить Франкенштейна из полуфабрикатов, валяющихся по углам на чужих свадьбах. Зато какой простор для творчества!

Не то чтобы все мужчины были плохи. Просто женщинам не жаль сил на их перевоспитание. На свете всё можно улучшить. Поменять в Версале занавески, осветлить Биг-Бен, перестелить кафель на Сан-Марко - вот лишь три известных мне проекта. Только эгоистка будет переделывать себя в мире, полном несовершенства.

Мужчина не любит перемен. Его устраивает и он сам, и жена, навек двадцатилетняя. Что в ней улучшать? Две ноги, две сиськи, это ли не формула совершенства?

На свой счёт мужчина заблуждается.Розги и электрошок из кого угодно сделают яркую индивидуальность. И пока ЮНЕСКО не охраняет нас от брака, мы делаемся всё лучше и лучше.

Женские журналы объясняют: борщ, скалка, истерики и дозированный секс выведут из любого педагогического тупика.
Ибо сказано:
Если муж рычит на маму, создайте ему рефлекс. Пусть мама приносит пиво. К третьему её визиту питомец будет тереться о ноги и поскуливать.

Если прячет по углам зарплату, аккуратно соберите оставленные кучки. Вместо них разложите иронические записки. Идею щедрости закрепите тапочкой по ушам. Обыски и шмон не прекращать. Покажите, что система сильнее.

Если смотрит на чужие зады, не надо сразу стерилизовать. Толстый, не игривый муж - моральная обуза. Попробуйте лошадиные шоры. Или шокер. Названия устройств почти одинаковые, значит и эффект будет сходным.

Молодые мужья ещё спорят, подбирают аргументы. Не понимают, что в диалоге побеждают быстрая речь и своевременные слёзы.
Например, считают мужья, шпица должен выгуливать тот, кто его приволок. Сказать такое вслух может только негодяй. Ему тут же припоминают жёванную мимозу на 8-е марта, отвергнутых ради него лётчика, моряка, трёх банкиров и молодость, проведённую на кухне. Муж хватает шпица и бежит гулять. И больше никогда не диспутирует.

Один хитрый полковник, 27 лет в браке, чтобы не проигрывать в спорах, выработал мигрень. Лишь завидев пылесос, он падает на диван. Страшная боль пронзает его военный лоб. Терапевт подтвердил болезнь. Выписал справку за тысячу пятьсот двадцать три рубля. Сумма не ровная, чтобы не выглядела взяткой. В справке обозначено: тишина, вино и чтение книг допустимы, пылесос и швабра запрещены. Лишь на время ужина полковник всплывает из мира страданий к семье и детям.
Это не простой путь. Для мигрени нужен художественный вкус, а лучше театральное училище. Ну и расходы на терапевта учтите.

Другой способ называется итальянская забастовка. Все указания надо выполнять быстро и бестолково. Мясорубку сломать, посуду уронить, вместо сметаны купить потолочные белила. Скотч-терьера при мытье утопить.
Имитировать бытовой идиотизм унизительно, придётся услышать обидные слова. Вас даже могут отхлестать мокрой тряпкой за чужие лужи. Но кормить не перестанут. И однажды оставят в покое - в холодной, совершенно отдельной постели.

Лично я изобрёл метод грубой лести. Выслушав долгую нотацию, говорю потрясённо:
- Какая же ты красивая!
Дальше важно не снижать градус. Скромность и чувство меры отбросить и даже выкорчевать.
Как же я счастлив, говорю, что ты выбрала меня! (Речь идёт о развешивании картин). До сих пор не верю, что дышу с тобой одним дымом от сгоревшей курицы. Спасибо небесам и бардовскому фестивалю, где мы повстречались впервые. Я хочу исполнить все твои фантазии, но сначала позволь налюбоваться тобой в этом боковом ракурсе, лёжа с дивана.

Моя воспитательница всякий раз теряется. Хочет ругаться, но не выдерживает, краснеет, бежит к зеркалу. Вертится там и потом уже не помнит, во что хотела меня переделать.


Нет слов
sp_r00t
На днях довелось смотреть фильм на одном из моих любимых телеканалов - National Geographic Channel. Фильм был посвящён Питеру. Надо сказать, что исторические интерпретации авторов контента на этом канале иногда страдают некоторой поверхностностью (если можно так выразиться). Раньше я списывал это на научно-популярный (с акцентом на популярность) характер канала. Но услышанное мною в этот раз повергло меня в шок.
А сказано было примерно следующее (цитирую по памяти): "В октябре 1917 года большевики, во главе со Владимиром Лениным, предприняли штурм Зимнего дворца с целью свержения монархии. В результате штурма император Николай II с семьёй попал в плен к большевикам".
Моё уважение к каналу рухнуло. Блин, одно дело заявлять что-то типа "Гитлер хотел захватить мир" - это чисто оценочное суждение, а совсем другое - тупо перевирать факты глобального значения, которые ни у кого никогда не вызывали разночтений!
Но вот интересно - а мы ихнюю историю знаем столь же поверхностно, как они нашу?

По поводу
sp_r00t
предыдущей заметки.
Описанное пространство обладает просто фантасмагорическими свойствами.
Например, замыкание точки 0 равно всему пространству!
Фактически в нём не выполняется ни одна аксиома отделимости. Экстремально неделимое пространство, просто сингулярность какая-то))))
Если "выколоть" из пространства точку 0, то аксиома Т0 уже начнёт выполнятся. Но Т1 - по прежнему нет. Далее будем именно так представлять данное пространство.
Дополнительно возникает вопрос об τ0- и τ1-условиях.
Как мы видим из примера нашего пространства, множество вида (0,а) включено только в одно псевдовыпуклое множество - совпадающее со всем пространством. Формально это условие выполняется. Однако если так, то какой тогда вообще смысле в этих условиях если они выполняются, так сказать автоматически - для всего пространства?

Не компактно
sp_r00t
Уже довольно давно я ставил задачу доказать компактность геодезических отрезков в τ-пространствах. И вот в процессе поисков доказательства натолкнулся на следующее пространство. Это пространство состоит из вещественной полуоси [0, +∞) с топологией, в которой открытыми множествами являются отрезки [0, а) (вместе с пустым множеством и универсумом). Соответственно замкнутыми множествами являются множества вида [а,+∞). Γ-семейство этого пространства можно выбрать совпадающим с замкнутыми множествами. В этом случае геодезическим отрезком Γ(a, b) будет являться множество Γ(min(a, b), +∞), которое, соответственно, некомпактно.

Ядерная нестыковочка
sp_r00t
В процессе программирования модулей ядра Linux нередко приходится прибегать к помощи ассемблера. Традиционно разработчики ядра используют встроенный ассемблер GCC (который по сути является шлюзом в GAS), но у этого подхода есть куча недостатков, что вызывает желание использовать посторонний ассемблер и раздельную трансляцию. Кстати, знаменитый Свен Шрайбер в своей книги по ядру Винды пишет, что он на этом пути наловил столько BSOD'ов, что в итоге остановился на встроенном же ассемблере. А встроенный ассемблер в Visual C++ имхо намного лучше своего аналога в GCC. Да и раздельная трансляция (как и вообще написание модулей ядра) в Linuxe намного проще.
Но я сначала решил просто поэкспериментировать и написать простенькую функцию на асме и интегрировать её в код на Си.
Пишем функцию:
  1. madd:
  2. push ebp
  3. mov ebp, esp
  4. mov eax, [ebp+8]
  5. add eax, [ebp+12]
  6. pop ebp
  7. ret

Этот простенький "сумматор" вставляем в код нашего модуля:
  1. #include <linux/module.h>
  2. #include <linux/kernel.h>
  3. extern int madd(int, int);
  4. int init_module(void)
  5. {
  6. printk(KERN_ALERT "Summa 11 i 6 ravna %d\n", madd(11,6));
  7. return 0;
  8. }

После компиляции и загрузки модуля все срабатывает, но результат получается сильно не похожим на 17.
Дизассемблер выдаёт нечто совершенно невменяемое. А именно, вызов функции madd осуществляется вот так:
  1. mov eax, 6
  2. mov edx, 0Bh
  3. call madd

То есть вызов, вопреки ожиданиям, никак не соответствует си-соглашению, о чём вызываемая функция конечно не догадывается, возвращая в итоге "винигрет".
Скорее всего проблема в оптимизации, но как заставить GCC НЕ оптимизировать этот участок кода? Фактически мне удалось решить эту проблему, заменив объявление функции madd, незаконно приписав ей переменное число параметров.
  1. extern int madd(int, ...);

В итоге компилятор утихомирился и передал параметры как положено - через стек.
Но никто не гарантирует этого в общем случае, поэтому очень хотелось бы знать, как обязать GCC следовать строго соглашению cdecl.

Приручение PE
sp_r00t
Давно хотел собрать вручную PE-файл, да всё руки не доходили.
Когда же наконец я сподобился взяться за ассемблер, получился такой вот листинг (транслируется NASM'ом с опцией -fbin)
  1. bits 32
  2. %define IMAGE_BASE 400000h
  3. %define IDATA_RVA 3000h
  4. %define DATA_RVA 2000h
  5. %define FALIGN 200h
  6. %define OPTIONAL_HEADER_SIZE 0E0h
  7. %define CHARACTERISTICS 0001h | 0002h | 0008h | 0100h | 1000h
  8. %define PE32_MAGIC 010Bh
  9. %define CPU_TYPE 14Ch
  10. %define P_DWORD 4
  11. %define ENTRY_POINT 1000h
  12. %define NUMBER_DIRECTORY 10h
  13. %define GTVRS (kernel32import - IDATA + IDATA_RVA + IMAGE_BASE + P_DWORD)
  14. org IMAGE_BASE
  15. DOS_HEADER:
  16. db 4Dh, 5Ah, 6Ch, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0FFh, 0FFh, 0, 0, 0, 0, 0, 0, 11h, 0, 0, 0, 0h, 0, 0, 0, 0, 0, 0, 0
  17. stub:
  18. db 'Coded by sp_r00t. Hack ahead'
  19. new_PE:
  20. dd PE_HEADER-DOS_HEADER
  21. PE_HEADER:
  22. db 'PE', 0, 0 ; signature
  23. dw CPU_TYPE ; cpu type
  24. dw 3 ; Num of Objects
  25. dd 0 ; Time/Date Stamp
  26. dd 0 ; Pointer to COFF table
  27. dd 0 ; COFF table size
  28. dw OPTIONAL_HEADER_SIZE ; NT Header Size
  29. dw CHARACTERISTICS ; Flags (characteristics)
  30. dw PE32_MAGIC ; Magic
  31. dw 0 ; Major/minor linker
  32. dd END_TEXT - TEXT ; Size of Code
  33. dd END_DATA - DATA ; Size of Init Data
  34. dd 0 ; Size of UnInit Data
  35. dd ENTRY_POINT ; Entry point RVA
  36. dd ENTRY_POINT ; Base of Code
  37. dd 2000h ; Base of Data
  38. dd IMAGE_BASE ; Image Base
  39. dd 1000h ; Object align
  40. dd FALIGN ; File align
  41. dw 4 ; OS Major
  42. dw 0 ; OS Minor
  43. dd 0 ; user major/minor
  44. dw 4 ; SubSys Major
  45. dw 0 ; SubSys Minor
  46. dd 0 ; Reserved (win32 version)
  47. dd 4000h ; Image Size
  48. dd END_HEADERS - DOS_HEADER ; Header Size
  49. dd 0 ; File CheckSum
  50. dw 2 ; SubSystem
  51. dw 0 ; DLL Flags
  52. dd 100000h ; Stack Reserve Size
  53. dd 10000h ; Stack Commit Size
  54. dd 0 ; Heap Reserve Size
  55. dd 0 ; Heap Comit Size
  56. dd 0 ; Loader Flags
  57. dd NUMBER_DIRECTORY ; number directory entries
  58. directory:
  59. dd 0 ; Export Table RVA
  60. dd 0 ; Export Data Size
  61. dd IDATA_RVA ; Import Table RVA
  62. dd END_IDATA - IDATA ; Import Data Size
  63. times 20 dd 0 ; empty
  64. dd (IDATA_RVA + iat - IDATA) ; IAT RVA
  65. dd (iat_end - iat) ; IAT Data Size
  66. times 6 dd 0 ; empty
  67.  
  68. SECTION_TABLE:
  69. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  70. db '.text', 0,0,0
  71. dd WA_END_TEXT - TEXT ; Virtual Size
  72. dd ENTRY_POINT ; Section RVA
  73. dd END_TEXT - TEXT ; Physical Size
  74. dd TEXT - DOS_HEADER ; Physical Offset
  75. times 0Ch db 0
  76. dd 60000020h ; Object Flags
  77. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  78. db '.data', 0,0,0
  79. dd WA_END_DATA - DATA ; Virtual Size
  80. dd DATA_RVA ; Section RVA
  81. dd END_DATA - DATA ; Physical Size
  82. dd DATA - DOS_HEADER ; Physical Offset
  83. times 0Ch db 0
  84. dd 0C0000040h ; Object Flags
  85. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  86. db '.import', 0
  87. dd WA_END_IDATA - IDATA ; Virtual Size
  88. dd IDATA_RVA ; Section RVA
  89. dd END_IDATA - IDATA ; Physical Size
  90. dd IDATA - DOS_HEADER ; Physical Offset
  91. times 0Ch db 0
  92. dd 40000000h ; Object Flags
  93. align FALIGN, db 0
  94. END_HEADERS:
  95. TEXT:
  96. push 0
  97. mov eax, (IMAGE_BASE + DATA_RVA + (msg_1 - DATA))
  98. push eax
  99. call GetVersion
  100. test eax, eax
  101. jnz m
  102. mov eax, (IMAGE_BASE + DATA_RVA + (msg_3 - DATA))
  103. jmp m1
  104. m:
  105. mov eax, (IMAGE_BASE + DATA_RVA + (msg_2 - DATA))
  106. m1:
  107. push eax
  108. push 0
  109. call MessageBox
  110. push 0
  111. call ExitProcess
  112. ret
  113. GetVersion:
  114. jmp near [kernel32import - IDATA + IDATA_RVA + IMAGE_BASE + P_DWORD]
  115. MessageBox:
  116. jmp near [user32import - IDATA + IDATA_RVA + IMAGE_BASE]
  117. ExitProcess:
  118. jmp near [kernel32import - IDATA + IDATA_RVA + IMAGE_BASE]
  119. WA_END_TEXT:
  120. align FALIGN, db 0
  121. END_TEXT:
  122. DATA:
  123. msg_1 db 'Preved',0
  124. msg_2 db 'GetVersion run!',0
  125. msg_3 db 'Error',0
  126. WA_END_DATA:
  127. align 200h, db 0
  128. END_DATA:
  129. IDATA:
  130. import_table:
  131. ; kernel32.dll
  132. dd kernel32_import - IDATA + IDATA_RVA ; OriginalFirstThunk
  133. dd 0 ; TimeDateStamp
  134. dd 0 ; ForwarderChain
  135. dd kernel32 - IDATA + IDATA_RVA ; Name
  136. dd kernel32import - IDATA + IDATA_RVA ; FirstThunk
  137. ; user32.dll
  138. dd user32_import - IDATA + IDATA_RVA ; OriginalFirstThunk
  139. dd 0 ; TimeDateStamp
  140. dd 0 ; ForwarderChain
  141. dd user32 - IDATA + IDATA_RVA ; Name
  142. dd user32import - IDATA + IDATA_RVA ; FirstThunk
  143. times 5 dd 0
  144.  
  145. kernel32_import dd exitprocess - IDATA + IDATA_RVA, getversion - IDATA + IDATA_RVA, 0
  146. user32_import dd messagebox - IDATA + IDATA_RVA, 0
  147. iat:
  148. kernel32import dd exitprocess - IDATA + IDATA_RVA, getversion - IDATA + IDATA_RVA, 0
  149. user32import dd messagebox - IDATA + IDATA_RVA, 0
  150. iat_end:
  151. kernel32 db 'KERNEL32.DLL', 0
  152. user32 db 'USER32.DLL', 0
  153. exitprocess db 0B6h, 0, 'ExitProcess',0
  154. messagebox db 0DCh, 1, 'MessageBoxA',0
  155. getversion db 0A4h, 2, 'GetVersion',0
  156. WA_END_IDATA:
  157. align FALIGN, db 0
  158. END_IDATA:
  159.  

(На выкрутасы с GetVersion внимания не обращать - это было частью эксперимента, которую я просто не стал вырезать).
Получающийся экзешник забит нулями почти наполовину и виной тому выравнивание по границе 512 байт. Когда то давно я читал, что линкеры обходят это ограничение если им приказать собирать драйвер, но как это сделать вручную?

?

Log in

No account? Create an account