понеділок, 2 листопада 2009 р.

Посилення перевірки прав у старій «Корпорація 2»

Перевірка прав за прямою адресою

Ми провели низку робіт із посилення безпеки «Корпорація 2». Доопрацювання стосувалося доступу до інформації: користувач без відповідних прав не мав отримувати її навіть тоді, коли знав пряме посилання на вміст.

Посилання не замінює дозволу

Знання адреси ресурсу саме по собі не надає прав на його перегляд. Авторизацію потрібно перевіряти для кожного запиту до конкретного ресурсу — незалежно від того, чи користувач перейшов через меню, чи відкрив прямий URL. Такий принцип описано в рекомендаціях OWASP з авторизації.

У початковому повідомленні не наведено реалізації та результатів тестування, тому за ним неможливо оцінити повноту перевірок у тій версії.

Підготовка релізу «Корпорація 2»: плани на початок 2010 року

Підготовка формального релізу

«Корпорація 2» вже працювала на багатьох десятках сайтів, але формального релізу системи ми тоді ще не випустили. Попередньо орієнтувалися на початок 2010 року.

Мережа сайтів і демонстраційні проєкти

До цього часу планували створити мережу наших сайтів і перевести всі сайти на «Корпорація 2» з компонентів 1 на компоненти 2. Також хотіли підготувати низку демонстраційних сайтів, на яких користувачі могли б ознайомитися із системою.

Додатковий сервер на іншому майданчику

Для сервісу «Корпорація 2» передбачали ще один сервер, розміщений на іншому майданчику. У плані зазначали формат 4U, 24 швидкі диски, великий обсяг оперативної пам’яті та два швидкі багатоядерні процесори.

Компонент «Слайдшоу» у старій «Корпорація 2»

Керування фотографіями на сайті

Ми випустили для «Корпорація 2» новий компонент «Слайдшоу», який давав змогу показувати фотографії безпосередньо на сайті. Адміністратори могли самостійно змінювати зображення, додавати нові та видаляти непотрібні.

Слайдшоу та фотогалерея

Компонент міг працювати в режимі слайдшоу або перемикатися в режим фотогалереї. Під час додавання фотографії автоматично масштабувалися.

Компонент «Хмара тегів» у старій «Корпорація 2»

Швидке додавання хмари тегів

Ми створили для «Корпорація 2» новий компонент «Хмара тегів». Він давав змогу швидко додавати на сайт такий блок.

Приклад оформлення

Як візуальний орієнтир ми навели хмару тегів на сайті «Спортлайф». У повідомленні була зазначена адреса http://sportlife.net.ua; вона стосувалася вигляду сайта на час написання допису.

Зрозумілі URL у «Корпорація 2 CMS»

Зрозумілі адреси динамічних сторінок

У старій «Корпорація 2» реалізували механізм зрозумілих URL: адреси динамічно сформованих сторінок стали виглядати як звичайні шляхи сайту.

Зручність адрес і пошукова індексація

Прості описові адреси можуть бути зручнішими для людей і допомагати розумінню структури. Проте такий вигляд сам по собі не гарантує індексації або кращої позиції. Див. рекомендації Google щодо структури URL. Конкретних правил маршрутизації в початковій нотатці не наведено.

Сторінка 404 у «Корпорація 2»: карта сайту замість стандартного повідомлення

Карта сайту на сторінці помилки

У тодішньому доопрацюванні «Корпорація 2» для відсутніх сторінок замість стандартного повідомлення Apache або nginx показували карту сайту. Вона мала допомогти відвідувачеві знайти потрібний матеріал.

Статус відповіді HTTP 404

В оригіналі також зазначено повернення статусу HTTP 404. Корисний вміст сторінки помилки й правильний статус — окремі вимоги: сам показ карти сайту ще не підтверджує, що сервер повернув саме 404. Конкретної конфігурації в цій нотатці немає.

Модуль самооновлення «Корпорація 2»: завантажувач і журнал змін

Спільний завантажувач системи та модуля

У «Корпорація 2» з’явився вбудований модуль самооновлення: оновлюватися могли і сама система, і модуль, який відповідав за її оновлення. Обидві частини були побудовані на тому самому завантажувачі. Фактично модуль оновлення теж був програмою «Корпорація 2».

Обмін через HTTP і порт 80

За первісним описом, оновлення передавалися через HTTP на порті 80. Для такого обміну відповідне мережеве з’єднання має бути дозволене: використання порту 80 саме по собі не обходить блокування мережі.

Звичайний HTTP не забезпечує захисту передавання, властивого HTTPS. У нотатці не описано перевірки цілісності чи автентичності пакета, тому за цим описом неможливо оцінити, як завантажувач перевіряв отримане оновлення.

Історія змін на вебсторінці

Історію змін програми також почали виводити у вигляді вебсторінки. У повідомленні наведено її відносний шлях:

/grid/92dbac969b63515a213d0580345af5c5/igroupid/{CEE14ACB-D8CD-4D65-9DC7-6132127F5E87}/index.html

Фонове отримання RSS-новин у «Корпорація 2»

Фонове завантаження RSS

У тодішній версії «Корпорація 2» отримання RSS-новин було перенесено у фоновий режим. Завантаження сторінки більше не мало чекати завершення звернення до джерела.

Робота за недоступності джерела

Також змінили обробку недоступного джерела: замість помилки на сторінці система продовжувала роботу. Це повідомлення про конкретне доопрацювання; воно не означає відсутності збоїв або гарантованого отримання кожної новини.

База «Корпорація 2» обсягом 46 ГБ: досвід і плани масштабування

Реальний проєкт із базою 46 ГБ

База даних одного з наших реальних проєктів «Корпорація 2» на PostgreSQL досягла 46 ГБ. За моїми спостереженнями, робота при цьому відбувалася без помітного уповільнення.

Для великих проєктів ми вже розробили й використовували спеціальні механізми роботи з великим обсягом даних. Крім того, мали запас методів масштабування системи та прискорення сервера баз даних. Цей досвід давав нам упевненість у подальшому нарощуванні обсягів.

Методологія для більших баз

На той час ми також розробили методологію роботи з багатотерабайтними базами й поступово впроваджували її в сервісі «Корпорація 2». Водночас наведений тут фактичний обсяг становив 46 ГБ: результатів випробувань на кількох терабайтах у повідомленні немає.

Наш попередній досвід із Firebird

У 2007 році, коли ми тестували програмні рішення на Firebird, робота з гігабайтними базами здавалася нам повільною. У тестовому режимі наші бази сягали приблизно 10 ГБ, а в реальній експлуатації становили близько 1 ГБ. Тоді ми пов’язували труднощі з браком доступних нам механізмів роботи з великими даними, які використовували в PostgreSQL.

Ці спостереження стосуються наших проєктів і конфігурацій того періоду. Без версій СУБД, схем, планів запитів і показників навантаження вони не встановлюють загальної межі обсягу Firebird та не гарантують швидкодії PostgreSQL на довільному обсязі.

Історична схема визначення прав у «Корпорація 2»

Під час роботи над «Корпорація 2» ми прийшли до схеми визначення прав, яка розрізняла дві ситуації: записів прав немає взагалі або права вже задані.

Якщо записів прав немає

  • Суперадміністратор отримував повний доступ до всіх сайтів.
  • Адміністратор — доступ до сайтів, перелічених у налаштуваннях користувача.
  • Інші користувачі — лише перегляд.

Якщо правила задані

Суперадміністратор зберігав повний доступ, а адміністратор міг змінювати те, що дозволено правилами. Поведінку інших ролей у цій ситуації джерело не деталізує.

Користувацькі параметри PostgreSQL у старій «Корпорація 2»

Для передавання контексту користувача стара «Корпорація 2» використовувала параметри з префіксом usrvar. У тодішній конфігурації вказували:

custom_variable_classes = 'usrvar'

Первісний перелік назв (значення у джерелі записано неповно):

usrvar.myuserid=';
usrvar.myusername=';
usrvar.myroleid=';
usrvar.myrolename=';
usrvar.magid=';

Вони відповідали ID та імені користувача, ID та назві ролі й ID магазину. Це не готові коректні присвоєння: у фрагменті бракує завершення значень і лапок.

Приклади викликів системи:

select set_var('myusername', 'rudjuk');
select get_var('myusername');

Реалізації set_var/get_var тут немає; не слід вважати їх стандартними вбудованими функціями PostgreSQL. Йдеться про контекст усередині бази, а не обов’язково змінні середовища процесу ОС.

Параметр custom_variable_classes вилучено в PostgreSQL 9.2 — див. офіційні примітки до випуску. Цей старий рядок не потрібно переносити в сучасний postgresql.conf.

План переведення сайтів «Корпорація 2» на PostgreSQL

Ми почали переводити всі сайти, які працювали на «Корпорація 2», на базу даних PostgreSQL. Розраховували підвищити пропускну здатність сайтів і масштабованість системи загалом. Нижче наведено заплановану черговість робіт.

Перша черга: проєкти на компонентах 2

  • «Енергія С.В.О.»;
  • «Аквалюкс», «Класик-люкс»;
  • Citygroup;
  • SendAll;
  • VOtpuske;
  • Інспекція Держтехнагляду.

Перехід із компонентів 1 на компоненти 2

  • «Алерта»;
  • «Імідж»;
  • «Імрад»;
  • «Куліса»;
  • Lightnight;
  • Makeit;
  • Richire.

Перенесення інших реалізацій

Casadaconfraria планували перевести зі статичного подання в динамічне, а corp2.net — із Bitrix на «Корпорація 2».

План переведення сайтів «Корпорація 2» на PostgreSQL

Ми почали переводити всі сайти, які працювали на «Корпорація 2», на базу даних PostgreSQL. Розраховували підвищити пропускну здатність сайтів і масштабованість системи загалом. Нижче наведено заплановану черговість робіт.

Перша черга: проєкти на компонентах 2

  • «Енергія С.В.О.»;
  • «Аквалюкс», «Класик-люкс»;
  • Citygroup;
  • SendAll;
  • VOtpuske;
  • Інспекція Держтехнагляду.

Перехід із компонентів 1 на компоненти 2

  • «Алерта»;
  • «Імідж»;
  • «Імрад»;
  • «Куліса»;
  • Lightnight;
  • Makeit;
  • Richire.

Перенесення інших реалізацій

Casadaconfraria планували перевести зі статичного подання в динамічне, а corp2.net — із Bitrix на «Корпорація 2».

Перенесення SQL між MySQL і PostgreSQL у «Корпорація 2»

Під час переходу «Корпорація 2» на PostgreSQL ми прагнули зберегти роботу також із MySQL та Firebird. Це вимагало перевірки SQL окремо для кожної СУБД.

Початковий запит із нотатки:

select MK.KARTA_ID, MK.P_BALANS, MK.P_VLASN, MK.P_ZALOG, MK.P_UGON,

MK.MARKA_ID MARKA_ID,MK.VID_ID, MK.ZAV_NOMER ZAV_NOMER, MK.DVIG_NOMER DVIG_NOMER, MK.NSHAS, MK.YEAR_PROD, MK.SER_SVID SER_SVID, MK.DATA_SVID, MK.SER_ZNAK, MK.DATE_NUM, MK.KOD_F, MK.KOD_USER, MK.OLD_ID, MK.DATA_EDIT, MK.DATE_INSERT, MK.DATE_DELETE, MK.IS_DELETED, MK.DATE_COMPILE, MK.DATE_UPDATE, MK.ID_REGION_KOD ID_REGION_KOD, MK.ID_RAJON ID_RAJON, MK.ID_VID, MK.ID_KOD_F, MK.NAME_ORG NAME_ORG, MK.NAME_VID NAME_VID, MK.UPPER_ZAV_NOMER, MK.UPPER_DVIG_NOMER, MK.UPPER_NSHAS, MK.UPPER_SER_SVID, MK.UPPER_SER_ZNAK, MK.DATA_SPISAN, MK.ADDR_ORG, MK.P_REG, MK.DATA_FIRST_REG, MK.D_OLDSVID, MK.N_OLDSVID, MK.YEAR_SVID, MK.YEAR_NUM, MK.YEAR_SPISAN, MK.YEAR_FIRST_REG,MK.YEAR_

OLDSVID, MK.DATA_BALANS, MK.REGION_BALANS, MK.RAJON_BALANS, R.REGION_NAME, MO.KOD_EDRPO, MO.N_PASSP from MTP_KARTA MK



left join TBLREGIONS R

on MK.ID_REGION_KOD=R.ID_REGION_KOD

left join MTP_ORG MO

on (MK.ID_KOD_F=MO.ID_KOD_F)

and (MK.ID_REGION_KOD=MO.ID_REGION_KOD)

where (MK.MARKA_ID<>') and (MK.DATA_SPISAN is null)

and(MK.NAME_ORG like '%трактор%')

order by MARKA_ID





limit 0, 50



Данный запрос прекрасно работает в MySQL, но совершенно не работает в PostgreSQL.

Запропонований тоді варіант:

select MK.KARTA_ID, MK.P_BALANS, MK.P_VLASN, MK.P_ZALOG, MK.P_UGON,

MK.MARKA_ID as MARKA_ID,

MK.VID_ID,

MK.ZAV_NOMER as ZAV_NOMER,

MK.DVIG_NOMER as DVIG_NOMER, MK.NSHAS, MK.YEAR_PROD,

MK.SER_SVID as SER_SVID, MK.DATA_SVID, MK.SER_ZNAK, MK.DATE_NUM, MK.KOD_F, MK.KOD_USER, MK.OLD_ID, MK.DATA_EDIT, MK.DATE_INSERT, MK.DATE_DELETE, MK.IS_DELETED, MK.DATE_COMPILE,

MK.DATE_UPDATE, MK.ID_REGION_KOD as ID_REGION_KOD,

MK.ID_RAJON as ID_RAJON, MK.ID_VID, MK.ID_KOD_F,

MK.NAME_ORG as NAME_ORG,

MK.NAME_VID as NAME_VID, MK.UPPER_ZAV_NOMER,

MK.UPPER_DVIG_NOMER, MK.UPPER_NSHAS, MK.UPPER_SER_SVID, MK.UPPER_SER_ZNAK, MK.DATA_SPISAN, MK.ADDR_ORG, MK.P_REG, MK.DATA_FIRST_REG, MK.D_OLDSVID, MK.N_OLDSVID, MK.YEAR_SVID, MK.YEAR_NUM, MK.YEAR_SPISAN, MK.YEAR_FIRST_REG,MK.YEAR_OLDSVID, MK.DATA_BALANS, MK.REGION_BALANS, MK.RAJON_BALANS, R.REGION_NAME, MO.KOD_EDRPO, MO.N_PASSP



from MTP_KARTA MK



left join TBLREGIONS R

on MK.ID_REGION_KOD=R.ID_REGION_KOD

left join MTP_ORG MO

on (MK.ID_KOD_F=MO.ID_KOD_F)

and (MK.ID_REGION_KOD=MO.ID_REGION_KOD)

where (MK.MARKA_ID<>') and (MK.DATA_SPISAN is null)

and(MK.NAME_ORG like '%трактор%')

order by MARKA_ID



limit 50 offset 10

Обидва фрагменти збережено для аналізу, але в них є незавершений рядковий літерал у MK.MARKA_ID<>'. У першому також розірвано ім’я YEAR_OLDSVID. У такому вигляді це не перевірені робочі запити.

AS робить псевдонім явним, але для звичайного псевдоніма стовпця не завжди обов’язковий у PostgreSQL. Істотна відмінність прикладів — синтаксис пагінації: MySQL підтримує LIMIT offset, count і LIMIT count OFFSET offset, тоді як PostgreSQL використовує другий варіант. При цьому LIMIT 0, 50 та LIMIT 50 OFFSET 10 вибирають різні сторінки, а не однаковий результат.

Не слід автоматично вважати LIMIT універсальним синтаксисом для всіх SQL-серверів, зокрема Firebird. Для перенесення також перевіряють типи, регістр, порівняння тексту та стабільність ORDER BY.

Документація: PostgreSQL SELECT, MySQL SELECT. Конкретну схему таблиць і тестові дані в нотатці не наведено.

Поддержка языков в системе Корпорация

Поддержка языков в системе Корпорация реализуется в соответствии со стандартом ISO 639-1.
Вот таблица языков и их префиксов:



Выберите интересующий Вас раздел:



язык ↓ ISO 639-1 ↓ ISO 639-2 ↓ ISO 639-3 ↓ ГОСТ 7.75–97 ↓ цифровой код ↓
Абазинский — — abq аба 005
Абхазский ab abk abk абх 010
Авадхи — awa awa авд 012
Аварский av ava ava ава 014
Авестийский ae ave ave аве 016
Адангме — ada ada ада 018
Адыгейский — ady ady ады 020
Азербайджанский az aze aze азе 025
Аймара ay aym aym айм 026
Акан ak aka aka ака 027
Аккадский — akk akk акк 028
Албанский sq alb/sqi sqi алб 030
Алеутский — ale ale але 033
Алтайский — alt alt алт 035
Амхарский am amh amh амх 040
Английский en eng eng анг 045
Арабский ar ara ara ара 050
Аравакский — arw arw арв 051
Арамейский — arc arc аре 052
Арапахо — arp arp арп 053
Армянский hy/am arm/hye hye/axm/xcl/am арм 055
Ассамский as asm asm аса 060
Ассирийский — — aii асе 065
Афарский aa aar aar афа 068
Африкаанс af afr afr афр 070
Африхили — afh afh афх 073
Ахвахский — — akv ахв 074
Ачехский — ace ace аче 076
Ачоли — ach ach ачо 077
Балийский — ban ban бал 078
Баса — bas bas бас 084
Баскский eu baq/eus eus бак 085
Башкирский ba bak bak баш 086
Беджа — bej bej бед 087
Белорусский be bel bel бел 090
Бемба — bem bem бем 097
Бенгальский bn ben ben бен 100
Бикольский — bik bik бик 103
Бини — bin bin бин 104
Бирманский my bur/mya mya бир 105
Бислама bi bis bis бис 107
Болгарский bg bul bul бол 115
Брауи — bra bra бра 117
Бретонский br bre bre бре 120
Бугийский — bug bug буг 123
Бурятский — bua bua бур 125
Бходжпури — bho bho бхо 126
Ваи — vai vai ваи 127
Валлийский cy cym/wel cym вал 130
Варай — war war вар 131
Вашо — was was ваш 132
Венгерский hu hun hun вен 133
Венда ve ven ven вед 134
Вепсский — — vep веп 135
Воламо — wal wal воа 136
Волапюк vo vol vol вол 137
Волоф wo wol wol воф 138
Вьетнамский vi vie vie вье 140
Га — gaa gaa гаа 142
Гавайский — haw haw гав 143
Гагаузский — — gag гаг 145
Гайо — gay gay гай 146
Галисийский gl glg glg гал 147
Ганда lg lug lug ган 148
Гереро hz her her гер 149
Геэз — gez gez гез 151
Гилбертский — gil gil гил 152
Нидерландский (Голландский) nl dut/nld nld нид 495
Гонди — gon gon гон 153
Готский — got got гот 154
Гребо — grb grb грб 155
Греческий (новогреческий) el ell/gre ell гре 157
Грузинский ka geo/kat kat гру 158
Гуджарати gu guj guj гуд 165
Гаэльский gd gla gla гэл 170
Дакота — dak dak дак 173
Даргинский — — dag дат 175
Датский da dan dan дат 178
Делавэрский — del del дел 179
Дзонг-кэ dz dzo dzo дзо 183
Дивехи (Мальдивский) dv div div див 180
Динка — din din дин 181
Диула (Дьюла) — dyu dyu диу 182
Догри — doi doi дои 184
Древнегреческий — grc grc дрг 186
Древнеегипетский — egy egy дре 187
Дуала — dua dua дуа 190
Дунганский — — dng дун 191
Еврейско-арабский — jrb jrb еар 192
Еврейско-персидский — jpr jpr епе 193
Зенагский — zen zen зен 194
Зулу zu zul zul зул 195
Зуньи — zun zun зун 196
Ибанский — iba iba иба 197
Иврит he heb heb ивр 198
Игбо ig ibo ibo ибо 199
Идиш yi yid yid иди 202
Илоко — ilo ilo ило 203
Ингушский — inh inh инг 205
Индонезийский id ind ind инд 210
Интерлингва ia ina ina ина 215
Интерлингве ie ile ile ине 216
Инуктитут iu iku iku инк 217
Инупиак ik ipk ipk инп 218
Ирландский ga gle gle ирл 220
Исландский is ice/isl isl исл 225
Испанский es esl/spa spa исп 230
Итальянский it ita ita ита 235
Ительменский — — itl ите 240
Йоруба yo yor yor йор 245
Кабардино-черкесский — kbd kbd каа 250
Кабильский — kab kab каб 251
Кави — kaw kaw кат 252
Каддо — cad cad кад 254
Казахский kk kaz kaz каз 255
Каннада kn kan kan кан 265
Калмыцкий kl kal kal кал 260
Камба — kam kam кам 263
Канури kr kau kau кау 267
Караимский — — kdr каи 270
Каракалпакский — kaa kaa кал 275
Карачаево-балкарский — krc krc као 280
Карельский — krl krl кас 285
Кариб — car car кар 288
Каталанский ca cat cat кат 290
Качинский — kac kac кач 293
Кашмири ks kas kas каш 294
Кечуа qu que que кеч 300
Кикуйю ki kik kik кик 302
Киньяма kj kua kua кия 303
Киргизский — — kyr кир/кыр 305
Китайский zh chi/zho zho кит 315
Коми kv kom kom кои 320
Конго kg kon kon кон 326
Конкани — kok kok кок 327
Коптский — cop cop коп 328
Корейский ko kor kor коо 330
Корнский kw cor cor кор 332
Корсиканский co cos cos кос 334
Корякский — — kpy коя 335
Коса xh xho xho коа 340
Кпелле — kpe kpe кпе 341
Крик — mus mus крк 344
Крымско-татарский — crh crh кры 347
Кумыкский — kum kum кум 349
Курдский ku kur kur кур 350
Кусайе — — ksg кус 353
Кутенаи — kut kut кут 354
Кхаси — kha kha кха 357
Кхмерский km khm khm кхм 360
Ладино — lad lad лад 363
Лакский — — lbe лак 370
Ламба — lam lam лам 373
Лаосский lo lao lao лао 375
Латинский la lat lat лат 380
Латышский lv lav lav лаш 385
Лахнда — lah lah лах 387
Лезгинский — lez lez лез 390
Лингала ln lin lin лин 395
Литовский lt lit lit лит 400
Лози — loz loz лоз 402
Луба-катанга lu lub lub луб 404
Луисеньо — lui lui луи 406
Лунда — lun lun лун 407
Луо (Кения и Танзания) — luo luo луо 408
Люксембургский lb ltz ltz люк 409
Магахи — mag mag маг 410
Мадурский — mad mad мал 411
Майтхили — mai mai май 412
Макассарский — mak mak мак 414
Македонский — mac/mke mke маа 415
Малагасийский mg mlg mlg млг 418
Малайский ms may/msa msa маз 420
Малаялам — mal mal мал 425
Мальтийский mt mlt mlt млт 430
Мандинго — man man май 432
Манипури — mni mni мни 433
Маори mi mao/mri mri мао 437
Маратхи mr mar mar мар 440
Марвари — mwr mwr мвр 443
Марийский (черемисский) — chm chm мач 445
Маршалльский mh mah mah маш 446
Масаи — mas mas мас 447
Менде — men men мен 451
Микмак — mic mic мик 452
Минангкабау — min min мин 453
Моей[1] — mos mos мое 466
Мокшанский — mdf mdf мок 455
Молдавский mo mol mol мол 460
Монго — lol lol мог 462
Монгольский mn mon mon мои 463
Мохаук — moh moh мох 467
Навахо nv nav nav нав 470
Нанайский (гольдский) — — gld нан 471
Науру na nau nau нау 472
Ндебеле северный nd nde nde нде 473
Ндебеле южный nr nbl nbl нбл 474
Ндунга ng ndo ndo нду 475
Неварский — new new нев 478
Неидентифицированный — und und унд 480
Немецкий de deu/ger deu нем 481
Ненецкий (юрако-самоедский) — — yrk нен 482
Непальский ne nep nep неп 485
Нзима — nzi nzi нзи 487
Нивхский (гиляцкий) — — niv нив 490
Нидерландский средневековый — dum dum нис 496
Ниуэ — niu niu ниу 498
Ногайский — nog nog ног 505
Норвежский no nor nor нор 506
Ньоро — nyo nyo ньо 508
Ньямвези — nym nym ням 509
Ньянджа ny nya nya нян 510
Ньянколе — nyn nyn нья 512
Нюнорск (новонорвежский) nn nno nno нно 513
Оджибве oj oji oji одж 515
Окситанский oc oci oci оке 517
Оромо om orm orm орм 522
Оседжи — osa osa осе 523
Осетинский os oss oss ост 524
Палау — pau pau пал 526
Пали pi pli pli пли 527
Пампанга — pam pam пам 528
Пангасинан — pag pag паг 529
Пенджабский pa pan pan пан 530
Папьяменто — pap pap пап 533
Персидский язык fa fas/per fas пер 535
Пехлевийский — pal pal пех 537
Польский pl pol pol пол 540
Понапе — pon pon пон 542
Португальский pt por por пор 545
Пушту ps pus pus пуш 550
Пьемонтский roa pms
Раджастхани — raj raj рад 555
Разных семей языки — mul mul мул 556
Раротонга — rar rar рар 557
Ретороманский rm roh roh рет 560
Руанда rw kin kin кин 304
Румынский ro ron/rum ron рум 565
Рунди rn run run рун 567
Русский ru rus rus рус 570
Самаритянский арамейский — sam sam сам 577
Самоанский sm smo smo смо 578
Санго sg sag sag саг 579

Перенесення SQL між MySQL і PostgreSQL у «Корпорація 2»

Під час переходу «Корпорація 2» на PostgreSQL ми прагнули зберегти роботу також із MySQL та Firebird. Це вимагало перевірки SQL окремо для кожної СУБД.

Початковий запит із нотатки:

select MK.KARTA_ID, MK.P_BALANS, MK.P_VLASN, MK.P_ZALOG, MK.P_UGON,

MK.MARKA_ID MARKA_ID,MK.VID_ID, MK.ZAV_NOMER ZAV_NOMER, MK.DVIG_NOMER DVIG_NOMER, MK.NSHAS, MK.YEAR_PROD, MK.SER_SVID SER_SVID, MK.DATA_SVID, MK.SER_ZNAK, MK.DATE_NUM, MK.KOD_F, MK.KOD_USER, MK.OLD_ID, MK.DATA_EDIT, MK.DATE_INSERT, MK.DATE_DELETE, MK.IS_DELETED, MK.DATE_COMPILE, MK.DATE_UPDATE, MK.ID_REGION_KOD ID_REGION_KOD, MK.ID_RAJON ID_RAJON, MK.ID_VID, MK.ID_KOD_F, MK.NAME_ORG NAME_ORG, MK.NAME_VID NAME_VID, MK.UPPER_ZAV_NOMER, MK.UPPER_DVIG_NOMER, MK.UPPER_NSHAS, MK.UPPER_SER_SVID, MK.UPPER_SER_ZNAK, MK.DATA_SPISAN, MK.ADDR_ORG, MK.P_REG, MK.DATA_FIRST_REG, MK.D_OLDSVID, MK.N_OLDSVID, MK.YEAR_SVID, MK.YEAR_NUM, MK.YEAR_SPISAN, MK.YEAR_FIRST_REG,MK.YEAR_

OLDSVID, MK.DATA_BALANS, MK.REGION_BALANS, MK.RAJON_BALANS, R.REGION_NAME, MO.KOD_EDRPO, MO.N_PASSP from MTP_KARTA MK



left join TBLREGIONS R

on MK.ID_REGION_KOD=R.ID_REGION_KOD

left join MTP_ORG MO

on (MK.ID_KOD_F=MO.ID_KOD_F)

and (MK.ID_REGION_KOD=MO.ID_REGION_KOD)

where (MK.MARKA_ID<>') and (MK.DATA_SPISAN is null)

and(MK.NAME_ORG like '%трактор%')

order by MARKA_ID





limit 0, 50



Данный запрос прекрасно работает в MySQL, но совершенно не работает в PostgreSQL.

Запропонований тоді варіант:

select MK.KARTA_ID, MK.P_BALANS, MK.P_VLASN, MK.P_ZALOG, MK.P_UGON,

MK.MARKA_ID as MARKA_ID,

MK.VID_ID,

MK.ZAV_NOMER as ZAV_NOMER,

MK.DVIG_NOMER as DVIG_NOMER, MK.NSHAS, MK.YEAR_PROD,

MK.SER_SVID as SER_SVID, MK.DATA_SVID, MK.SER_ZNAK, MK.DATE_NUM, MK.KOD_F, MK.KOD_USER, MK.OLD_ID, MK.DATA_EDIT, MK.DATE_INSERT, MK.DATE_DELETE, MK.IS_DELETED, MK.DATE_COMPILE,

MK.DATE_UPDATE, MK.ID_REGION_KOD as ID_REGION_KOD,

MK.ID_RAJON as ID_RAJON, MK.ID_VID, MK.ID_KOD_F,

MK.NAME_ORG as NAME_ORG,

MK.NAME_VID as NAME_VID, MK.UPPER_ZAV_NOMER,

MK.UPPER_DVIG_NOMER, MK.UPPER_NSHAS, MK.UPPER_SER_SVID, MK.UPPER_SER_ZNAK, MK.DATA_SPISAN, MK.ADDR_ORG, MK.P_REG, MK.DATA_FIRST_REG, MK.D_OLDSVID, MK.N_OLDSVID, MK.YEAR_SVID, MK.YEAR_NUM, MK.YEAR_SPISAN, MK.YEAR_FIRST_REG,MK.YEAR_OLDSVID, MK.DATA_BALANS, MK.REGION_BALANS, MK.RAJON_BALANS, R.REGION_NAME, MO.KOD_EDRPO, MO.N_PASSP



from MTP_KARTA MK



left join TBLREGIONS R

on MK.ID_REGION_KOD=R.ID_REGION_KOD

left join MTP_ORG MO

on (MK.ID_KOD_F=MO.ID_KOD_F)

and (MK.ID_REGION_KOD=MO.ID_REGION_KOD)

where (MK.MARKA_ID<>') and (MK.DATA_SPISAN is null)

and(MK.NAME_ORG like '%трактор%')

order by MARKA_ID



limit 50 offset 10

Обидва фрагменти збережено для аналізу, але в них є незавершений рядковий літерал у MK.MARKA_ID<>'. У першому також розірвано ім’я YEAR_OLDSVID. У такому вигляді це не перевірені робочі запити.

AS робить псевдонім явним, але для звичайного псевдоніма стовпця не завжди обов’язковий у PostgreSQL. Істотна відмінність прикладів — синтаксис пагінації: MySQL підтримує LIMIT offset, count і LIMIT count OFFSET offset, тоді як PostgreSQL використовує другий варіант. При цьому LIMIT 0, 50 та LIMIT 50 OFFSET 10 вибирають різні сторінки, а не однаковий результат.

Не слід автоматично вважати LIMIT універсальним синтаксисом для всіх SQL-серверів, зокрема Firebird. Для перенесення також перевіряють типи, регістр, порівняння тексту та стабільність ORDER BY.

Документація: PostgreSQL SELECT, MySQL SELECT. Конкретну схему таблиць і тестові дані в нотатці не наведено.

Поддержка языков в системе Корпорация

Поддержка языков в системе Корпорация реализуется в соответствии со стандартом ISO 639-1.
Вот таблица языков и их префиксов:



Выберите интересующий Вас раздел:



язык ↓ ISO 639-1 ↓ ISO 639-2 ↓ ISO 639-3 ↓ ГОСТ 7.75–97 ↓ цифровой код ↓
Абазинский — — abq аба 005
Абхазский ab abk abk абх 010
Авадхи — awa awa авд 012
Аварский av ava ava ава 014
Авестийский ae ave ave аве 016
Адангме — ada ada ада 018
Адыгейский — ady ady ады 020
Азербайджанский az aze aze азе 025
Аймара ay aym aym айм 026
Акан ak aka aka ака 027
Аккадский — akk akk акк 028
Албанский sq alb/sqi sqi алб 030
Алеутский — ale ale але 033
Алтайский — alt alt алт 035
Амхарский am amh amh амх 040
Английский en eng eng анг 045
Арабский ar ara ara ара 050
Аравакский — arw arw арв 051
Арамейский — arc arc аре 052
Арапахо — arp arp арп 053
Армянский hy/am arm/hye hye/axm/xcl/am арм 055
Ассамский as asm asm аса 060
Ассирийский — — aii асе 065
Афарский aa aar aar афа 068
Африкаанс af afr afr афр 070
Африхили — afh afh афх 073
Ахвахский — — akv ахв 074
Ачехский — ace ace аче 076
Ачоли — ach ach ачо 077
Балийский — ban ban бал 078
Баса — bas bas бас 084
Баскский eu baq/eus eus бак 085
Башкирский ba bak bak баш 086
Беджа — bej bej бед 087
Белорусский be bel bel бел 090
Бемба — bem bem бем 097
Бенгальский bn ben ben бен 100
Бикольский — bik bik бик 103
Бини — bin bin бин 104
Бирманский my bur/mya mya бир 105
Бислама bi bis bis бис 107
Болгарский bg bul bul бол 115
Брауи — bra bra бра 117
Бретонский br bre bre бре 120
Бугийский — bug bug буг 123
Бурятский — bua bua бур 125
Бходжпури — bho bho бхо 126
Ваи — vai vai ваи 127
Валлийский cy cym/wel cym вал 130
Варай — war war вар 131
Вашо — was was ваш 132
Венгерский hu hun hun вен 133
Венда ve ven ven вед 134
Вепсский — — vep веп 135
Воламо — wal wal воа 136
Волапюк vo vol vol вол 137
Волоф wo wol wol воф 138
Вьетнамский vi vie vie вье 140
Га — gaa gaa гаа 142
Гавайский — haw haw гав 143
Гагаузский — — gag гаг 145
Гайо — gay gay гай 146
Галисийский gl glg glg гал 147
Ганда lg lug lug ган 148
Гереро hz her her гер 149
Геэз — gez gez гез 151
Гилбертский — gil gil гил 152
Нидерландский (Голландский) nl dut/nld nld нид 495
Гонди — gon gon гон 153
Готский — got got гот 154
Гребо — grb grb грб 155
Греческий (новогреческий) el ell/gre ell гре 157
Грузинский ka geo/kat kat гру 158
Гуджарати gu guj guj гуд 165
Гаэльский gd gla gla гэл 170
Дакота — dak dak дак 173
Даргинский — — dag дат 175
Датский da dan dan дат 178
Делавэрский — del del дел 179
Дзонг-кэ dz dzo dzo дзо 183
Дивехи (Мальдивский) dv div div див 180
Динка — din din дин 181
Диула (Дьюла) — dyu dyu диу 182
Догри — doi doi дои 184
Древнегреческий — grc grc дрг 186
Древнеегипетский — egy egy дре 187
Дуала — dua dua дуа 190
Дунганский — — dng дун 191
Еврейско-арабский — jrb jrb еар 192
Еврейско-персидский — jpr jpr епе 193
Зенагский — zen zen зен 194
Зулу zu zul zul зул 195
Зуньи — zun zun зун 196
Ибанский — iba iba иба 197
Иврит he heb heb ивр 198
Игбо ig ibo ibo ибо 199
Идиш yi yid yid иди 202
Илоко — ilo ilo ило 203
Ингушский — inh inh инг 205
Индонезийский id ind ind инд 210
Интерлингва ia ina ina ина 215
Интерлингве ie ile ile ине 216
Инуктитут iu iku iku инк 217
Инупиак ik ipk ipk инп 218
Ирландский ga gle gle ирл 220
Исландский is ice/isl isl исл 225
Испанский es esl/spa spa исп 230
Итальянский it ita ita ита 235
Ительменский — — itl ите 240
Йоруба yo yor yor йор 245
Кабардино-черкесский — kbd kbd каа 250
Кабильский — kab kab каб 251
Кави — kaw kaw кат 252
Каддо — cad cad кад 254
Казахский kk kaz kaz каз 255
Каннада kn kan kan кан 265
Калмыцкий kl kal kal кал 260
Камба — kam kam кам 263
Канури kr kau kau кау 267
Караимский — — kdr каи 270
Каракалпакский — kaa kaa кал 275
Карачаево-балкарский — krc krc као 280
Карельский — krl krl кас 285
Кариб — car car кар 288
Каталанский ca cat cat кат 290
Качинский — kac kac кач 293
Кашмири ks kas kas каш 294
Кечуа qu que que кеч 300
Кикуйю ki kik kik кик 302
Киньяма kj kua kua кия 303
Киргизский — — kyr кир/кыр 305
Китайский zh chi/zho zho кит 315
Коми kv kom kom кои 320
Конго kg kon kon кон 326
Конкани — kok kok кок 327
Коптский — cop cop коп 328
Корейский ko kor kor коо 330
Корнский kw cor cor кор 332
Корсиканский co cos cos кос 334
Корякский — — kpy коя 335
Коса xh xho xho коа 340
Кпелле — kpe kpe кпе 341
Крик — mus mus крк 344
Крымско-татарский — crh crh кры 347
Кумыкский — kum kum кум 349
Курдский ku kur kur кур 350
Кусайе — — ksg кус 353
Кутенаи — kut kut кут 354
Кхаси — kha kha кха 357
Кхмерский km khm khm кхм 360
Ладино — lad lad лад 363
Лакский — — lbe лак 370
Ламба — lam lam лам 373
Лаосский lo lao lao лао 375
Латинский la lat lat лат 380
Латышский lv lav lav лаш 385
Лахнда — lah lah лах 387
Лезгинский — lez lez лез 390
Лингала ln lin lin лин 395
Литовский lt lit lit лит 400
Лози — loz loz лоз 402
Луба-катанга lu lub lub луб 404
Луисеньо — lui lui луи 406
Лунда — lun lun лун 407
Луо (Кения и Танзания) — luo luo луо 408
Люксембургский lb ltz ltz люк 409
Магахи — mag mag маг 410
Мадурский — mad mad мал 411
Майтхили — mai mai май 412
Макассарский — mak mak мак 414
Македонский — mac/mke mke маа 415
Малагасийский mg mlg mlg млг 418
Малайский ms may/msa msa маз 420
Малаялам — mal mal мал 425
Мальтийский mt mlt mlt млт 430
Мандинго — man man май 432
Манипури — mni mni мни 433
Маори mi mao/mri mri мао 437
Маратхи mr mar mar мар 440
Марвари — mwr mwr мвр 443
Марийский (черемисский) — chm chm мач 445
Маршалльский mh mah mah маш 446
Масаи — mas mas мас 447
Менде — men men мен 451
Микмак — mic mic мик 452
Минангкабау — min min мин 453
Моей[1] — mos mos мое 466
Мокшанский — mdf mdf мок 455
Молдавский mo mol mol мол 460
Монго — lol lol мог 462
Монгольский mn mon mon мои 463
Мохаук — moh moh мох 467
Навахо nv nav nav нав 470
Нанайский (гольдский) — — gld нан 471
Науру na nau nau нау 472
Ндебеле северный nd nde nde нде 473
Ндебеле южный nr nbl nbl нбл 474
Ндунга ng ndo ndo нду 475
Неварский — new new нев 478
Неидентифицированный — und und унд 480
Немецкий de deu/ger deu нем 481
Ненецкий (юрако-самоедский) — — yrk нен 482
Непальский ne nep nep неп 485
Нзима — nzi nzi нзи 487
Нивхский (гиляцкий) — — niv нив 490
Нидерландский средневековый — dum dum нис 496
Ниуэ — niu niu ниу 498
Ногайский — nog nog ног 505
Норвежский no nor nor нор 506
Ньоро — nyo nyo ньо 508
Ньямвези — nym nym ням 509
Ньянджа ny nya nya нян 510
Ньянколе — nyn nyn нья 512
Нюнорск (новонорвежский) nn nno nno нно 513
Оджибве oj oji oji одж 515
Окситанский oc oci oci оке 517
Оромо om orm orm орм 522
Оседжи — osa osa осе 523
Осетинский os oss oss ост 524
Палау — pau pau пал 526
Пали pi pli pli пли 527
Пампанга — pam pam пам 528
Пангасинан — pag pag паг 529
Пенджабский pa pan pan пан 530
Папьяменто — pap pap пап 533
Персидский язык fa fas/per fas пер 535
Пехлевийский — pal pal пех 537
Польский pl pol pol пол 540
Понапе — pon pon пон 542
Португальский pt por por пор 545
Пушту ps pus pus пуш 550
Пьемонтский roa pms
Раджастхани — raj raj рад 555
Разных семей языки — mul mul мул 556
Раротонга — rar rar рар 557
Ретороманский rm roh roh рет 560
Руанда rw kin kin кин 304
Румынский ro ron/rum ron рум 565
Рунди rn run run рун 567
Русский ru rus rus рус 570
Самаритянский арамейский — sam sam сам 577
Самоанский sm smo smo смо 578
Санго sg sag sag саг 579

check_admin у старій CMS: перевірка доступу до редактора

Щоб простий перехід за URL редагування не відкривав редактор неадміністратору, у старій «Корпорація 2» використовували check_admin:

Підключення редактора після перевірки

if ($GLOBALS["c"]->check_admin()) {
    $_GET["edit"]=true;
    $GLOBALS["c"]->ins_comp('fckeditor');
}

Перевірка прав на кожну дію

У цьому прикладі підключення редактора залежить від результату перевірки. Проте сам фрагмент не доводить захищеності всього застосунку: дозвіл потрібно перевіряти і в обробнику збереження, і для конкретного ресурсу. Параметр edit або прихований інтерфейс не замінюють серверної авторизації.

Принцип перевірки прав для кожного запиту описано в OWASP Authorization Cheat Sheet. Реалізації check_admin у цій історичній нотатці немає.

«Корпорація 2»: початкове знайомство зі структурою коду

Каталоги проєктів на сервері

У серверній структурі «Корпорація 2», описаній у цій пам’ятці, всі проєкти знаходилися в /d2/c/. Каталог corp2 містив тестову версію, corp2_stable — останню стабільну, а projs — різні проєкти, створені за допомогою системи.

/d2/c/                         — корінь проєктів
/d2/c/corp2                    — тестова версія
/d2/c/corp2_stable             — стабільна версія
/d2/c/projs                    — прикладні проєкти
/d2/c/projs/desc               — опис проєктів
/d2/c/corp2/corp2/includes/main/desc
/d2/c/corp2/corp2/components/desc
/d2/c/corp2/corp2/includes/main/corp_runner.php
/d2/c/corp2/corp2/components/

З чого починати читання коду

У багатьох каталогах був файл desc з описом каталогу або компонента. Файл /d2/c/projs/desc пояснював призначення прикладних проєктів. У /d2/c/corp2/corp2/includes/main/desc були викладені основні принципи роботи системи, а /d2/c/corp2/corp2/components/desc містив перелік компонентів і короткий опис їхнього призначення.

Головним файлом, що завантажував усі компоненти, був /d2/c/corp2/corp2/includes/main/corp_runner.php.

Програмний клас і шаблони компонента

Стандартні компоненти розміщувалися в /d2/c/corp2/corp2/components/, кожен у власному каталозі. Компонент складався з двох основних частин:

  • main_class.php — програмна частина: клас, який виконував роботу компонента.
  • main.php — шаблон компонента, де переважно задавали властивості класу, оголошеного в main_class.php.

Шаблонів можна було створювати необмежену кількість. Додаткові шаблони розміщували в каталозі templates відповідного компонента.

Мовні файли

Переклади компонентів знаходилися в каталозі lang. Усередині їх групували за позначеннями мов, наприклад ua, ru та en.

check_admin у старій CMS: перевірка доступу до редактора

Щоб простий перехід за URL редагування не відкривав редактор неадміністратору, у старій «Корпорація 2» використовували check_admin:

Підключення редактора після перевірки

if ($GLOBALS["c"]->check_admin()) {
    $_GET["edit"]=true;
    $GLOBALS["c"]->ins_comp('fckeditor');
}

Перевірка прав на кожну дію

У цьому прикладі підключення редактора залежить від результату перевірки. Проте сам фрагмент не доводить захищеності всього застосунку: дозвіл потрібно перевіряти і в обробнику збереження, і для конкретного ресурсу. Параметр edit або прихований інтерфейс не замінюють серверної авторизації.

Принцип перевірки прав для кожного запиту описано в OWASP Authorization Cheat Sheet. Реалізації check_admin у цій історичній нотатці немає.

«Корпорація 2»: початкове знайомство зі структурою коду

Каталоги проєктів на сервері

У серверній структурі «Корпорація 2», описаній у цій пам’ятці, всі проєкти знаходилися в /d2/c/. Каталог corp2 містив тестову версію, corp2_stable — останню стабільну, а projs — різні проєкти, створені за допомогою системи.

/d2/c/                         — корінь проєктів
/d2/c/corp2                    — тестова версія
/d2/c/corp2_stable             — стабільна версія
/d2/c/projs                    — прикладні проєкти
/d2/c/projs/desc               — опис проєктів
/d2/c/corp2/corp2/includes/main/desc
/d2/c/corp2/corp2/components/desc
/d2/c/corp2/corp2/includes/main/corp_runner.php
/d2/c/corp2/corp2/components/

З чого починати читання коду

У багатьох каталогах був файл desc з описом каталогу або компонента. Файл /d2/c/projs/desc пояснював призначення прикладних проєктів. У /d2/c/corp2/corp2/includes/main/desc були викладені основні принципи роботи системи, а /d2/c/corp2/corp2/components/desc містив перелік компонентів і короткий опис їхнього призначення.

Головним файлом, що завантажував усі компоненти, був /d2/c/corp2/corp2/includes/main/corp_runner.php.

Програмний клас і шаблони компонента

Стандартні компоненти розміщувалися в /d2/c/corp2/corp2/components/, кожен у власному каталозі. Компонент складався з двох основних частин:

  • main_class.php — програмна частина: клас, який виконував роботу компонента.
  • main.php — шаблон компонента, де переважно задавали властивості класу, оголошеного в main_class.php.

Шаблонів можна було створювати необмежену кількість. Додаткові шаблони розміщували в каталозі templates відповідного компонента.

Мовні файли

Переклади компонентів знаходилися в каталозі lang. Усередині їх групували за позначеннями мов, наприклад ua, ru та en.

Мова сайту й адміністративної частини старої «Корпорація 2 CMS»

У тодішній версії «Корпорація 2 CMS» основні налаштування містилися у файлі config_main.php.

Приклад конфігурації

$this->site_name="Наш сайт";
$this->site_url="http://corp2.net/";
$this->lang_adm='ua';
$this->langs=array('ua');
$this->lang='ua';
?>

Мова сайту та адміністративного інтерфейсу

lang задає мову публічної частини за замовчуванням; langs — перелік доступних мов; lang_adm — мову адміністративного інтерфейсу за замовчуванням. Позначення ua збережено як внутрішній ідентифікатор цієї історичної системи. Це фрагмент її конфігурації, а не готовий файл для сучасної K2 ERP.

Проєкти «Корпорація 2»: сайти та система технічного нагляду

Ми завершили кілька нових робіт на системі «Корпорація 2»: перенесли сайти, створили інтернет-магазин і розвивали комплексне рішення для технічного нагляду. Нижче — опис цих проєктів на час публікації.

Sportlife

Історична адреса: http://sportlife.net.ua/. Сайт спортивних клубів перенесли з Joomla на систему «Корпорація 2». Замість інформації про один клуб він представляв мережу клубів.

У цьому проєкті авторизовані адміністратори отримали можливість редагувати матеріали безпосередньо в публічному інтерфейсі. За нашим досвідом, це спростило оновлення сайта: для редагування матеріалів уже не потрібно було переходити до окремої адміністративної частини. Також було додано хмару тегів і динамічні слайд-шоу, фотографії та інформацію в яких адміністратори могли самостійно поповнювати й видаляти.

Leg-Magic

Історична адреса: http://leg-magic.org.ua/. Статичний сайт перевели на «Корпорація 2», щоб адміністратори могли самостійно оновлювати його вміст.

«Елком-Сервіс»

Історична адреса: http://dohodtut.com/. Для компанії було створено невеликий інтернет-магазин.

Інспекція державного технічного нагляду

Історична адреса: http://idtn.corp2.net/. У первинному описі це комплексне рішення на базі «Корпорація 2», де вебсайт становив лише частину системи.

За тодішнім повідомленням команди, рішення поєднувало розмежування прав доступу, прикладну та вебсистему обліку сільськогосподарської техніки в Україні й розподілену базу даних із понад 500 вузлами. Ця кількість належить до історичного опису впровадження; вона не є підтвердженням нинішнього масштабу, повноти державного реєстру або поточної експлуатації.

Ubuntu 9.10 Karmic Koala: випуск 29 жовтня 2009 року

Вихід стабільної версії

29 жовтня 2009 року вийшла чергова версія Linux Ubuntu — 9.10, відома як Karmic Koala. Це був фінальний стабільний випуск. Тоді я радив завантажувати його й оновлювати систему, оскільки версія вже була готова до використання.

Завершення підтримки

Підтримка Ubuntu 9.10 завершилася 30 квітня 2011 року. Відтоді цей випуск не отримує підтримуваних оновлень безпеки. Дати випуску та завершення підтримки наведено в офіційному переліку випусків Ubuntu.

Кодеки в старій Ubuntu: архів команд і завершення роботи Medibuntu

У цій нотатці були зібрані способи встановлення мультимедійних пакетів у старій Ubuntu, зокрема компоненти покоління GStreamer 0.10 та репозиторій Medibuntu для Intrepid. Назви пакетів і команди збережено нижче для історичної довідки.

Пакети з початкового списку

aptitude install ubuntu-restricted-extras
sudo aptitude install gstreamer0.10-plugins-ugly gstreamer0.10-plugins-ugly-multiverse gstreamer0.10-plugins-bad gstreamer0.10-plugins-bad-multiverse gstreamer0.10-ffmpeg
sudo aptitude install totem-xine ffmpeg libxine-extracodecs

Для програвача SMPlayer у списку були окремі команди:

apt-get install smplayer
apt-get install smplayer-themes

Історичний блок Medibuntu

Репозиторій Medibuntu припинив роботу. Наведений блок не слід виконувати як сучасну інструкцію встановлення: адреса старого джерела та його пакети більше не є чинним способом налаштування Ubuntu.

wget http://www.medibuntu.org/sources.list.d/intrepid.list --output-document=/etc/apt/sources.list.d/medibuntu.list
sudo apt-get update
sudo apt-get install medibuntu-keyring
sudo apt-get update

Для 32-бітного середовища в оригіналі було вказано:

sudo apt-get install w32codecs libdvdcss2

Для 64-бітного:

sudo apt-get install w64codecs libdvdcss2

Також згадувався тодішній модуль MPlayer для Firefox:

sudo apt-get install mozilla-mplayer

Цей список не відображає сучасні пакети, браузерні механізми або ліцензійні умови. У початковій нотатці джерелом було http://bobrdobr.ru/rvo7. Завершення роботи репозиторію підтверджує сторінка Medibuntu в довідці Ubuntu.

Промислова розробка баз PostgreSQL: закладка на курс

Натрапив на цікавий курс із промислової розробки баз даних PostgreSQL і зберіг собі посилання на матеріал у Scribd.

Збережена адреса курсу

http://www.scribd.com/doc/4951644/PostgreSQL-9-10

У початковій нотатці не вказано автора, програму курсу або версію СУБД. Посилання збережено для історії; ці відомості не слід виводити лише з назви URL.

Додаткові 8 ГБ RAM для PostgreSQL: результат у нашому середовищі

Після додавання 8 ГБ оперативної пам’яті ми помітили поліпшення продуктивності сервера. У тодішньому навантаженні перестали спостерігати попередні тайм-аути й перерви в роботі з базою, зокрема під час виконання VACUUM FULL.

Чому VACUUM FULL усе одно потребує блокування

Це спостереження про конкретну конфігурацію без вимірювань до й після. Додавання пам’яті не скасовує блокувань: за документацією PostgreSQL, VACUUM FULL потребує ACCESS EXCLUSIVE для оброблюваної таблиці. Нотатка не гарантує безперервної роботи під час цієї операції.


Пам’ять PostgreSQL у Linux: розбір старих sysctl-налаштувань

Задача після збільшення пам’яті до 10 ГБ

Після збільшення RAM сервера до 10 ГБ я намагався розширити доступну PostgreSQL спільну пам’ять. У старому рішенні використовувалися такі команди й альтернативний запис у /etc/sysctl.conf:

Команди та параметри зі старого рішення

echo 8589934592 >/proc/sys/kernel/shmall
echo 8589934592 >/proc/sys/kernel/shmmax

kernel.shmall = 8589934592
kernel.shmmax = 8589934592
vm.swappiness=10

sudo /sbin/sysctl -p

Різні одиниці shmall і shmmax

Наведені значення не є універсальною рекомендацією. У Linux shmall вимірюється сторінками пам’яті, а shmmax задає межу розміру окремого сегмента в байтах. Однакові числа тут не означають однакові обсяги. Розмір сторінки можна перевірити через getconf PAGE_SIZE.

Що регулює swappiness

Також swappiness — не відсоток використання swap. Поточна документація ядра визначає його як відносну оцінку вартості вводу-виводу для swap і файлових сторінок у діапазоні 0–200; поведінку старого ядра слід звіряти з його версією.

Залежність від версії PostgreSQL

Ці sysctl не резервують автоматично «8 ГБ для PostgreSQL, решту для ОС». Налаштування залежать від версії PostgreSQL, способу виділення пам’яті та навантаження; сучасні версії зазвичай потребують лише невеликого сегмента System V.

Первинні джерела: параметри ядра, swappiness, ресурси ядра для PostgreSQL. Старі додаткові адреси: http://sysdba.org.ua/ustanovka/oracle/ustanovka-oracle-10g-redaktsii-express-i-enterprise-v-ubuntu-8.04.html і http://postgrestips.blogspot.com/.

Оновлення titan: пам’ять збільшено до 10 ГБ

Додаткові 8 ГБ оперативної пам’яті

На сервері titan додали 8 ГБ оперативної пам’яті. Після цього загальний обсяг RAM становив 10 ГБ.

Подальше розширення — вже на іншому сервері

Це було перше й останнє заплановане оновлення обладнання titan. Надалі ми збиралися придбати більший сервер формату 4–5U з великою кількістю швидких дисків і потужнішими процесорами. У цьому дописі про його придбання ще не йшлося.

noindex і title посилань: уточнення старої SEO-поради

Два прийоми зі старої SEO-нотатки

У старій нотатці пропонувалося обгортати лічильники й рекламу елементом noindex та додавати title до посилань. Історичні приклади:

<noindex>... текст счетчика</noindex>
<a href="http://leg-magic.org.ua/" target="_blank" title="Форум Leg Magic, все о питании и спорте!">Форум LEG MAGIC</a>

Що означає noindex для Google

Ці прийоми не слід вважати універсальним захистом позицій у пошуку. Нестандартна обгортка noindex не замінює документованих директив конкретного пошуковика. Для заборони індексації сторінки Google описує meta robots і X-Robots-Tag у офіційній інструкції.

Змістовний текст посилання та атрибут title

Атрибут title може додавати пояснення, але сам по собі не гарантує кращого ранжування. Насамперед робіть текст посилання змістовним і зрозумілим.

Кирилиця в pChart: перетворення Windows-1251 у UTF-8

Коли замість кирилиці з’являються неправильні символи

У моїй тодішній конфігурації pChart українські й російські підписи відображалися неправильно. Вхідний текст був у Windows-1251, а для виведення знадобився UTF-8. Допоміг виклик:

iconv('cp1251', 'utf-8', 'Мой текст')

Підпис серії в pChart

Приклад підпису серії з того проєкту:

$this->DataSet->SetSerieName(iconv('cp1251', 'utf-8', 'Мой текст'),"Serie1");

Перевірка початкового кодування

Такий виклик доречний лише тоді, коли початкові байти справді мають кодування CP1251. Якщо файл чи вхідний текст уже в UTF-8, повторне перетворення з неправильно зазначеного кодування пошкодить дані. Також перевіряйте результат перетворення й наявність потрібних символів у шрифті.

Сигнатуру старого API pChart збережено як історичний приклад. Про параметри перетворення див. офіційну довідку iconv.

Плани розширення titan і нового сервера для України

Розширення пам’яті сервера titan

Для наших проєктів на той час використовувався сервер titan. У плані розширення йшлося про додавання після 18 вересня чотирьох модулів оперативної пам’яті по 2 ГБ — разом 8 ГБ. Ми хотіли встановити найбільший обсяг, можливий без вилучення наявної пам’яті. У результаті сервер мав отримати 10 ГБ RAM.

Подальше посилення titan не планувалося: за тодішньою оцінкою, можливості розширення цього сервера були вичерпані.

Новий сервер для користувачів з України

До кінця року ми планували ввести в роботу потужніший сервер для українських користувачів. Його хотіли розмістити на іншому майданчику — у «Воля-Кабель».

Для нового сервера передбачали формат 5U. Мета полягала в тому, щоб у межах цього розміру отримати якомога більшу продуктивність і пропускну здатність: використати багатоядерні процесори, великий обсяг оперативної пам’яті та багато швидких містких дисків. Конкретних моделей і числових параметрів майбутньої конфігурації в плані не було.

Програмне середовище та призначення

Новий сервер мав працювати під Linux Ubuntu із сервером баз даних PostgreSQL та дворівневою системою вебсервера. MySQL, імовірно, встановлювати не збиралися, оскільки для наших проєктів тоді використовували лише PostgreSQL.

Сервер призначався для автоматизації великих підприємств і для роботи вебсторінок, створених на «Корпорація 2». У цьому повідомленні описано задум і заплановані роботи; результат їх виконання тут не зафіксований.

COUNT, LIMIT та OFFSET у PostgreSQL: причини повільної роботи

У тодішньому проєкті ми зіткнулися з повільним підрахунком рядків у великих таблицях PostgreSQL та затримками під час пагінації. На наших даних аналогічні запити в MySQL виконувалися швидше, але це спостереження не є універсальним порівнянням двох СУБД.

Підрахунок рядків

За документацією PostgreSQL, точний COUNT(*) для всієї таблиці потребує роботи, пропорційної її розміру: сервер має переглянути таблицю або індекс, що охоплює всі рядки. У нашому проєкті частково допомогли лічильники, які оновлювали тригери. Такий підхід додає власну логіку підтримання узгодженості й не є безкоштовним прискоренням будь-якого запиту.

Великий OFFSET

Рядки, пропущені через OFFSET, усе одно обчислюються сервером, тому великий зсув може бути неефективним. Ми розглядали вибірку за індексованим числовим полем, однак порядок у потрібному результаті може відрізнятися від порядку цього поля.

Для передбачуваних сторінок потрібен ORDER BY, який однозначно задає порядок. Перехід до вибірки від останнього ключа потребує відповідності умов фільтрації, сортування та індексу; сама наявність числового поля цього не забезпечує.

Історичний матеріал з оригіналу: обговорення OFFSET і LIMIT. Першоджерела: агрегатні функції та LIMIT і OFFSET у документації PostgreSQL.

Добірка порад щодо PostgreSQL

Закладка на добірку порад

Зберіг адресу добірки порад щодо PostgreSQL на OpenNET:

http://www.opennet.ru/tips/sml/32.shtml

Перевірка поради для своєї версії PostgreSQL

Перш ніж застосовувати конкретну пораду, звірте синтаксис і поведінку операції з документацією встановленої версії PostgreSQL. На початковій сторінці офіційної документації є розділи SQL, налаштування сервера та адміністрування, а також переходи до інших версій. Вони допоможуть перевірити умови застосування старого прикладу.

COUNT, LIMIT та OFFSET у PostgreSQL: досвід оптимізації

У нашому тодішньому проєкті підрахунок рядків великих таблиць через count(*) і сторінкова вибірка з великим OFFSET працювали повільніше, ніж очікувалося після попереднього досвіду з MySQL. Без версій, планів запитів і параметрів середовища це не є загальним порівнянням СУБД.

Підрахунок рядків і тригерні лічильники

Частково підрахунок ми прискорили окремими лічильниками, які підтримували тригери. Такий підхід потребує перевірки узгодженості, конкурентних змін і всіх шляхів модифікації даних.

Точний count(*) усієї таблиці в PostgreSQL потребує роботи, пропорційної її розміру: це пояснює довідка агрегатних функцій. Для OFFSET важливі план виконання та стабільний порядок: документація LIMIT/OFFSET застерігає від пагінації без визначеного ORDER BY.

Чому індексоване поле не розв’язувало всю проблему OFFSET

У старому тексті я розглядав індексоване числове поле як основу подальшої оптимізації, водночас помічаючи, що потрібний порядок може відрізнятися. Самого додавання поля недостатньо: оптимізацію слід перевіряти на реальному запиті та його плані.

Мене тоді особливо засмучувало, що після звичної швидкості схожих запитів у MySQL ці затримки доводилося розбирати окремо. Це було враження від нашого проєкту, а не висновок про швидкість усіх запитів у двох СУБД.

Історичне додаткове посилання: http://gray-hemp.blogspot.com/2008/09/offset-limit.html.

Порівняння даних таблиць у PostgreSQL за контрольною сумою

Для попереднього порівняння даних таблиць на різних серверах у старій нотатці запропоновано обчислити MD5 від двійкового подання масиву:

Запит для контрольної суми вибірки

select md5(array_send(array(select B from A order by 1))) as md5;

Приклад охоплює значення стовпця B таблиці A, а не всю базу даних. Для зіставлення потрібно виконувати однаково визначений запит на обох серверах і враховувати типи даних, порядок, NULL та узгоджений стан даних. Сумісність двійкового подання між різними типами або версіями не слід припускати автоматично.

Межі такого порівняння

Однакова контрольна сума є попереднім сигналом, а не безумовним доказом тотожності: колізії можливі. Для відповідальної перевірки потрібне безпосереднє зіставлення даних, а великі вибірки не варто без оцінки пам’яті збирати в один масив.

Опис md5(bytea): документація PostgreSQL. Цей прийом не порівнює схеми, індекси, права або інші об’єкти бази.

Перенесення сайту «Корпорація 2» на власну систему

У тодішньому оновленні ми повністю перенесли сайт про «Корпорація 2» на власну систему, замінивши попередню реалізацію на Bitrix.

Мої враження від роботи на власній основі

Працювати в «Корпорація 2» мені здалося простіше й значно швидше. За моєю оцінкою, робота на новій основі тривала один день, тоді як попередній варіант забирав від тижня до кількох тижнів. Це спостереження про конкретний проєкт, без зіставлення однакового обсягу робіт і незалежних вимірювань. Воно не доводить універсальної переваги платформи в усіх завданнях.

Нотатка фіксує етап розвитку власного сайту. Контакт щодо K2: WhatsApp +380679016322.

Припинення продажу старих версій програм: архівне оголошення

На час цього повідомлення ми припинили продаж програм, розроблених поза «Корпорація 2». Ми вважали ці версії застарілими й уже не підтримували їх.

Які версії зняли з продажу

  • продукти на базі «Корпорація 1»;
  • «Розрахунок і проєктування шаф»;
  • «Екзамен»;
  • AutoFill;
  • VDoc.

Коли планували повернути продукти в продаж

Відновлення продажу планувалося після створення відповідних версій на «Корпорація 2». Ми боролися за якість своїх послуг і не хотіли продавати застаріле програмне забезпечення, навіть якщо воно ще працювало.

Оголошення стосується старих версій і тодішнього етапу розвитку. Воно не означає автоматичного припинення сучасних однойменних продуктів або модулів. Поточні умови щодо K2: WhatsApp +380679016322.

Самый мощный сервер баз данных - Postgresql

Компания Yahoo утверждает, что ей удалось побить мировой рекорд, создав самую большую и нагруженную базу данных в мире!

Объём запущенной год назад базы данных достиг 2 петабайт. Система создана для аналитических целей, в ней хранится история поведения веб-пользователей (утверждается, что в месяц сохраняются данные о полумиллиарде пользователей). Помимо прочего, интернет-гигант заявляет, что это не только самая большая БД в мире, но ещё и самая нагруженная — в сутки в ней регистрируются данные о 24 млрд событиях.
Постгрес!
А теперь самое интересное. Управляет этим монстром модифицированный PostgreSQL. Это — результат покупки компании-стартапа Mahat Technologies, изначально работающей с самой развитой СУБД с открытым кодом PostgreSQL. Код «Постгреса» был модифицирован для работы с такими огромными объёмами информации (одно из самых крупных изменений: ориентация на по-колоночное хранение вместо традиционного построчного, что замедляет запись на диск, но обеспечивает лучшую скорость доступа к данным для аналитических целей). Положительный результат налицо: некоторые таблицы в базе содержат триллионы строк, которые не просто лежат мёртвым грузом на дисках, но могут быть запрошены и обработаны стандартным SQL, в стандартной ACID-совместимой среде.

Инженеры Yahoo ожидают рост до 5 петабайт к следующему году. И они готовы к такому росту. Для сравнения: редко встречаются БД уровня предприятия объёмом более десятков терабайт. Например, одна из самых больших публично известных БД в мире — база данных налоговой службы США «весит» всего лишь 150 терабайт. Компания EBay заявляет, что работает с системами, обрабатывающими 10 млрд строк в сутки, при этом суммарный объём данных в этих системах составляет 6 петабайт, а объём данных у самой большой из систем — около 1.4 петабайт.

Стоит понимать, что речь идёт именно о СУБД и БД построенных на них. Есть хранилища данных с ещё более впечатляющим объёмами, но при этом данные в них практически недоступны для анализа и обработки. К примеру, Всемирный центр данных о климате в Гамбурге обладает хранилищем в более чем 6 петабайт данных, сохранённых на магнитной ленте, при этом в «активном» состоянии находятся «лишь» 220 терабайт данных (которые обслуживаются СУБД под управлением Linux, см. PDF).

«PostgreSQL продолжает активно развиваться, подтверждая звание самой развитой СУБД из открытых, — комментирует представитель компании «Постгресмен» Николай Самохвалов. — В прошлом году инженеры Sun показали всему миру, что PostgreSQL не уступает в производительности Oracle. На недавно прошедшей в Канаде международной конференции PGCon2008 представители NASA рассказали о своём опыте использования PostgreSQL для работы с большими базами данных из области наблюдения за климатом. Опыт Yahoo — очередное яркое подтверждение зрелости PostgreSQL. И это очень приятная новость для всех нас, жаль лишь, что, насколько я знаю, Yahoo пока не планирует делиться своими наработками с сообществом.»

Новость взята из http://habrahabr.ru/blogs/postgresql/26289/

Припинення продажу старих версій програм: архівне оголошення

На час цього повідомлення ми припинили продаж програм, розроблених поза «Корпорація 2». Ми вважали ці версії застарілими й уже не підтримували їх.

Які версії зняли з продажу

  • продукти на базі «Корпорація 1»;
  • «Розрахунок і проєктування шаф»;
  • «Екзамен»;
  • AutoFill;
  • VDoc.

Коли планували повернути продукти в продаж

Відновлення продажу планувалося після створення відповідних версій на «Корпорація 2». Ми боролися за якість своїх послуг і не хотіли продавати застаріле програмне забезпечення, навіть якщо воно ще працювало.

Оголошення стосується старих версій і тодішнього етапу розвитку. Воно не означає автоматичного припинення сучасних однойменних продуктів або модулів. Поточні умови щодо K2: WhatsApp +380679016322.

Чому ми перейшли на розробку сайтів у «Корпорація 2»

На час цієї публікації ми вирішили розробляти нові сайти лише на базі сервісу «Корпорація 2» та в межах цього сервісу.

Єдина основа для розробки й супроводу

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

Умови перенесення раніше створених сайтів

Для сайтів, які ми раніше розробили на інших продуктах, тоді пропонували безплатне перенесення на сервіс «Корпорація 2». Умовою було збереження дизайну та принципів роботи сайту.

Описані умови стосувалися цього рішення на час публікації. Поточний обсяг робіт і умови перенесення потрібно погоджувати окремо. Звернення щодо K2: WhatsApp +380679016322.

Чому ми перейшли на розробку сайтів у «Корпорація 2»

На час цієї публікації ми вирішили розробляти нові сайти лише на базі сервісу «Корпорація 2» та в межах цього сервісу.

Єдина основа для розробки й супроводу

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

Умови перенесення раніше створених сайтів

Для сайтів, які ми раніше розробили на інших продуктах, тоді пропонували безплатне перенесення на сервіс «Корпорація 2». Умовою було збереження дизайну та принципів роботи сайту.

Описані умови стосувалися цього рішення на час публікації. Поточний обсяг робіт і умови перенесення потрібно погоджувати окремо. Звернення щодо K2: WhatsApp +380679016322.

Фіксація цін у USD замість євро: рішення 2009 року

У листопаді 2009 року, зважаючи на «економічну кризу», ми повідомили про перехід від фіксації цін у євро до фіксації в доларах США (USD).

Запитання щодо умов K2

Щоб уточнити умови для потрібного рішення K2, зверніться у WhatsApp: +380679016322.

«Корпорація 2.0.0.66»: архівний перелік змін і завдань

Архівна нотатка повідомляла про випуск «Корпорація 2.0.0.66». У ній поєднано опис змін і формулювання подальших завдань, тому не всі пункти можна вважати підтвердженими реалізованими функціями.

Загальносистемні зміни й завдання

  • Ведення історії версій системи.
  • Проєкт і підприємство за замовчуванням для користувача.
  • Перелік проєктів та компаній, доступних користувачеві.
  • Розмежування доступу в таблицях за проєктом.
  • Передбачення позначки видалення та ознаки активності запису в таблицях.
  • Розмежування прав програмістів в історії змін.
  • Робота з великими журналами й фільтрами для їхнього аналізу.

Вебчастина на PHP

  • Фотогалерея, відео- й медіапрогравач.
  • Прикріплення файла до будь-якого довідника та масове завантаження фотографій.
  • Стиснення фотографій відповідно до налаштувань.
  • Каскадне підключення конфігураційних файлів.
  • Журнал входів, реєстрацій і завершень сеансів.
  • Докладне журналювання, включно з SQL-запитами.
  • Вимірювання часу завантаження сторінок і виконання SQL із записом у журнал.
  • Оптимізація фотогалереї та перевірки адміністративних прав.
  • Доопрацювання статистики входів і докладності журналу.
  • Виправлення визначення IP-адреси, про яке прямо повідомлялося в оригіналі.

Перелік збережено для історії старого випуску. Він не підтверджує склад сучасної K2 ERP або реалізацію кожного тодішнього завдання. K2 ERP — інформаційна система, K2 Platform — платформа розробки. Контакт: WhatsApp +380679016322.

«Корпорація 2.0.0.66»: архівний перелік змін і завдань

Архівна нотатка повідомляла про випуск «Корпорація 2.0.0.66». У ній поєднано опис змін і формулювання подальших завдань, тому не всі пункти можна вважати підтвердженими реалізованими функціями.

Загальносистемні зміни й завдання

  • Ведення історії версій системи.
  • Проєкт і підприємство за замовчуванням для користувача.
  • Перелік проєктів та компаній, доступних користувачеві.
  • Розмежування доступу в таблицях за проєктом.
  • Передбачення позначки видалення та ознаки активності запису в таблицях.
  • Розмежування прав програмістів в історії змін.
  • Робота з великими журналами й фільтрами для їхнього аналізу.

Вебчастина на PHP

  • Фотогалерея, відео- й медіапрогравач.
  • Прикріплення файла до будь-якого довідника та масове завантаження фотографій.
  • Стиснення фотографій відповідно до налаштувань.
  • Каскадне підключення конфігураційних файлів.
  • Журнал входів, реєстрацій і завершень сеансів.
  • Докладне журналювання, включно з SQL-запитами.
  • Вимірювання часу завантаження сторінок і виконання SQL із записом у журнал.
  • Оптимізація фотогалереї та перевірки адміністративних прав.
  • Доопрацювання статистики входів і докладності журналу.
  • Виправлення визначення IP-адреси, про яке прямо повідомлялося в оригіналі.

Перелік збережено для історії старого випуску. Він не підтверджує склад сучасної K2 ERP або реалізацію кожного тодішнього завдання. K2 ERP — інформаційна система, K2 Platform — платформа розробки. Контакт: WhatsApp +380679016322.

Сервер rudjuk: оновлення до Ubuntu 9.04

Ми оновили програмне забезпечення на сервері rudjuk. Під час цих робіт сайти були недоступні приблизно годину.

Система й пакети після оновлення

Після завершення робіт на сервері було встановлено Ubuntu 9.04 та найновіші на той момент пакети програмного забезпечення.

Користувачі кількох сайтів: ідентичність і права доступу

У системі з кількома сайтами однаковий логін не завжди означає ту саму людину. Водночас один користувач може потребувати доступу до кількох сайтів. Тому модель облікових записів потрібно відокремлювати від моделі прав.

Чому спільного логіна недостатньо

У багатосайтовій або багатомагазинній системі спільна база облікових записів може створювати незручний сценарій: людина вже зареєстрована на одному сайті, але не має доступу до іншого, а нову реєстрацію заблоковано, бо такий логін уже існує. Саме цю проблему я розглядав у початковій нотатці.

Схема доступу в «Корпорація 2»

У тодішній «Корпорація 2» ми обрали таку схему:

  • Обліковий запис отримує окремий автоматично створений ідентифікатор.
  • Реєстрація прив’язує його до конкретного сайту.
  • Доступ цього запису до інших сайтів надає суперкористувач.
  • Самостійна реєстрація на іншому сайті створює інший запис, навіть якщо логін збігається.

Тоді я порівнював цей підхід із системами, названими в оригіналі «Битрикс» і «Юкос». Версій та конфігурацій не зазначив, тому це порівняння не описує всі їхні реалізації. Також твердження про гарантовану світову унікальність ідентифікаторів потребувало б опису алгоритму, якого в статті немає.

Це історичний опис архітектурного рішення, а не специфікація сучасного керування доступом K2 ERP. Контакт щодо K2: WhatsApp +380679016322.

Ubuntu 9.04: мої враження після оновлення

Після переходу на Ubuntu 9.04 завантаження оновлень у моєму середовищі тривало близько двох годин, а розпакування й завершення встановлення — ще приблизно годину. Під час завантаження можна було продовжувати роботу; на етапі заміни бібліотек я закрив програми.

Навіть під час установлення я міг виконувати деякі інші справи на комп’ютері. Це здалося мені зручнішим, ніж звичне мені перевстановлення Windows.

Швидкість запуску, оформлення й пакети

Помітного прискорення запуску системи не відчув — можливо, через кількість служб. Оформлення здалося кращим. У нотатці також відзначено OpenOffice.org 3, оновлення MySQL та Wine.

Wine та 3D-застосунки

У моїх тестах із Wine поліпшилася робота анімованих курсорів і деяких текстур у 3D-застосунках. Проте номера Wine та переліку тестів не збережено, тому це не підтверджує повної сумісності всіх Windows-програм.

Перевстановлення VMware Workstation

Окремо довелося перевстановити VMware Workstation. Наведені строки й оцінки стосуються цього особистого досвіду, а не порівняльного тесту операційних систем.

Acer Aspire One у дорозі: враження від нетбука 2009 року

У листопаді 2009 року я купив собі Acer Aspire One. Нетбук приємно здивував: отримав саме той компактний комп’ютер, якого хотів для відряджень і відпочинку, та навіть трохи більше.

Що сподобалося в моєму комплекті

Насамперед — дві батареї. За моїми спостереженнями, одна тримала приблизно 2 години, друга — близько 4,5 години. Жорсткий диск на 160 ГБ для тодішнього нетбука теж був зовсім непоганим. А найприємніше — ціна придбання близько 350 доларів США.

Разом із нетбуком були ліцензійні Windows і пакет, який я записав як «Work». Точної назви й редакції пакета я не уточнив. На жаль, окремих компакт-дисків із програмами не було, а основною операційною системою я хотів поставити Linux Ubuntu.

Швидкодія та підключення

У диспетчері завдань я побачив два графіки завантаження й спершу сприйняв їх як ознаку «подвійного» процесора. За відчуттями нетбук працював значно швидше за подібний MSI, з яким я його порівнював у повсякденній роботі.

Самі два графіки не доводять наявності двох фізичних ядер: логічних процесорів може бути більше, ніж ядер. Наприклад, Intel пояснює, що Hyper-Threading дає одному фізичному ядру два логічні контексти виконання. Точної модифікації свого Acer Aspire One я тоді не записав, тож визначити його процесор лише з цієї нотатки неможливо.

Без проблем підключилися бездротовий 3G-інтернет PeopleNet, мережа та зовнішні пристрої — зокрема жорсткий диск на 1 ТБ.

Малий розмір у дорозі — перевага

Дехто сварив нетбуки за малі розміри. Для мене саме це стало плюсом: у транспорті на такому комп’ютері працювати було зручніше, ніж із великим ноутбуком. А вага близько 1 кг робила його легким супутником, коли доводилося їхати далеко від дому.

Один суттєвий недолік усе ж знайшовся: глянцева поверхня легко бруднилася. Достатньо було одного дотику, щоб залишити відбиток пальця, який на ній чудово «красувався» :)

Загальне враження залишилося добрим. Нетбук працював швидко й тихо, мало нагрівався, був зручним у дорозі та добре доповнював мій настільний комп’ютер.

VMware Workstation 6.5.2 на Ubuntu 9.04: досвід оновлення

Після встановлення Ubuntu 9.04 я перевстановив VMware Workstation. Використовував пакет VMware-Workstation-6.5.2-156735.x86_64.bundle.

Клавіші курсора, Enter і повернення керування хосту

У цій конфігурації зникла проблема з клавішами керування курсором поза цифровим блоком і крайньою клавішею Enter: вони почали працювати в гостьовій системі. Для повернення керування клавіатурою й мишею хосту я натискав Ctrl+Alt.

Це результат конкретного оновлення старого середовища. Спосіб звільнення введення залежить від налаштувань клієнта; нотатка не є інструкцією для сучасних версій VMware або Ubuntu.

NetworkManager 0.7 в Ubuntu 8.10: статичні IP та мережеві профілі

В Ubuntu 8.10 використовувався NetworkManager 0.7. Попри скарги на його роботу, у моєму досвіді він був достатньо стабільним для версії 0.7 і помітно спрощував керування мережевими пристроями. Після оновлення системи, однак, могли співіснувати старі налаштування й нові профілі.

Конфлікт способів керування

У первинному тексті пропонувалося видалити файл /etc/network/interface. Стандартна назва файла ifupdown — /etc/network/interfaces, у множині. Видалення всього файла не слід вважати універсальним виправленням: воно може прибрати необхідні мережеві параметри.

Потрібно спершу визначити, хто керує кожним інтерфейсом, і зберегти чинні параметри. У документації NetworkManager зазначено: за використання плагіна ifupdown і managed=false інтерфейси з /etc/network/interfaces ігноруються NetworkManager. Це пояснює можливу причину поведінки, але не доводить її без перевірки конкретної системи.

Як я задавав статичні адреси у старому інтерфейсі

Параметри від DHCP-сервера тоді підхоплювалися автоматично. Для інтерфейсів зі статичними адресами я виконував таку послідовність в Ubuntu 8.10:

  1. Двічі клацав мережевий інтерфейс і прибирав прапорець «Системне налаштування».
  2. Переходив до «Параметрів IPv4» та вибирав метод «Вручну».
  3. Задавав IP-адресу комп’ютера, маску, шлюз і сервери DNS.
  4. Перейменовував з’єднання, наприклад з eth0 на my eth0, і натискав OK.
  5. Повторював це для всіх пристроїв, параметри яких не надходили через DHCP, закривав вікно NetworkManager і перезавантажував Ubuntu.

Що відбувалося після перезавантаження

Система знову знаходила пристрої та додавала автоматичні з’єднання, наприклад eth0. Мої профілі залишалися, але в описаній конфігурації автоматичні мали вищий пріоритет і могли перехоплювати налаштування.

У зайвих автоматичних з’єднаннях я прибирав лише прапорець «Системне налаштування». Потім через значок NetworkManager у треї вибирав підготовлені профілі або ще раз перезавантажував систему. Після цього застосовувалися задані мною параметри.

Назви пунктів і ця послідовність стосуються інтерфейсу Ubuntu 8.10. Механізм взаємодії з ifupdown описано в офіційній довідці NetworkManager.conf; для іншого випуску потрібно перевіряти його засоби конфігурації та спосіб керування кожним інтерфейсом.

Ліцензія Windows і перехід на Ubuntu: роздуми 2009 року

У цій нотатці 2009 року я розмірковував про перехід ноутбука з придбаної разом із ним Windows на Ubuntu 8.10. Потрібні мені можливості було зручніше реалізувати в Linux.

Я планував поступово перевести всі свої комп'ютери на Ubuntu, а Windows за потреби використовувати у віртуальній машині. Технічна можливість такого запуску не визначає ліцензійних прав: їх потрібно перевіряти за умовами конкретної ліцензії Windows.

Досвід переходу на іншу ОС

Перехід потребує звикання до іншої ОС та практичного досвіду. На той час я вже мав такий досвід і пропонував допомогу як додаткову послугу.

За що платити разом із ноутбуком

Звідси й риторичне запитання: навіщо було оплачувати Windows у складі ноутбука, якщо основною системою стане Linux? Тоді я оцінював цю складову ціни ноутбука приблизно в 100–150 доларів. Тому для наступної покупки розглядав ноутбук із Linux, щоб одразу отримати потрібну мені основну систему.

Підтримка Ubuntu 8.10

Ubuntu 8.10 давно не підтримується: офіційне оголошення Ubuntu визначало завершення підтримки на 30 квітня 2010 року. Для сучасної роботи слід обирати підтримуваний випуск.

Ліцензія Windows і перехід на Ubuntu: роздуми 2009 року

У цій нотатці 2009 року я розмірковував про перехід ноутбука з придбаної разом із ним Windows на Ubuntu 8.10. Потрібні мені можливості було зручніше реалізувати в Linux.

Я планував поступово перевести всі свої комп'ютери на Ubuntu, а Windows за потреби використовувати у віртуальній машині. Технічна можливість такого запуску не визначає ліцензійних прав: їх потрібно перевіряти за умовами конкретної ліцензії Windows.

Досвід переходу на іншу ОС

Перехід потребує звикання до іншої ОС та практичного досвіду. На той час я вже мав такий досвід і пропонував допомогу як додаткову послугу.

За що платити разом із ноутбуком

Звідси й риторичне запитання: навіщо було оплачувати Windows у складі ноутбука, якщо основною системою стане Linux? Тоді я оцінював цю складову ціни ноутбука приблизно в 100–150 доларів. Тому для наступної покупки розглядав ноутбук із Linux, щоб одразу отримати потрібну мені основну систему.

Підтримка Ubuntu 8.10

Ubuntu 8.10 давно не підтримується: офіційне оголошення Ubuntu визначало завершення підтримки на 30 квітня 2010 року. Для сучасної роботи слід обирати підтримуваний випуск.

Ціни на реєстрацію доменів і курс долара: спостереження 2009 року

У листопаді 2009 року ми спостерігали, як змінювалися ціни на реєстрацію доменів. Довгий час вони залишалися незмінними, хоча курс долара різко зростав. Згодом провайдери, за тарифами яких ми стежили, почали переглядати ціни: реєстрація доменів дорожчала.

Чи змінювати власні ціни

Ми теж розглядали можливість переглянути ціни найближчим часом. Але наші ціни вже були зафіксовані в доларах США, тож залишалося відкритим питання, чи потрібно змінювати саме доларову суму. Це був можливий крок, а не вже ухвалене підвищення.

Запитання щодо послуг K2: WhatsApp: +380679016322.

Установлення Ubuntu з USB-флешки на нетбуці

Для нетбука без оптичного привода завантажувальна USB-флешка була зручним способом установити Ubuntu. У початковій нотатці я посилався на матеріал для Ubuntu 8.10:

Інструкція, яку я зберіг для Ubuntu 8.10

http://rus-linux.net/lib.php?name=MyLDP/install/Ubuntu8.10-on-USB.html

Підготовка флешки для встановлення

Це історична інструкція. Для актуального образу системи користуйтеся офіційною сторінкою Ubuntu зі створення завантажувального USB та переходьте до її оновленого посібника. Перед записом правильно оберіть носій і збережіть потрібні файли: створення завантажувальної флешки може стерти її вміст.

MSI WindPC U90 B: характеристики, Linux і досвід 2009 року

У листопаді 2009 року я купив MSI WindPC U90 B і записав перші враження. Для мене його перевагою був місткий як для нетбука жорсткий диск на 120 ГБ. Компактність і маса близько 1 кг робили цей нетбук зручним для роботи поза домом. Ціна мого тодішнього придбання становила 325 умовних одиниць.

Характеристики мого MSI WindPC U90 B

  • Екран 8,9 дюйма, 1024 × 600.
  • Intel Atom N270, 1,6 ГГц.
  • Оперативна пам’ять 512 МБ, DDR2 667 МГц.
  • Жорсткий диск 120 ГБ.
  • Інтегроване відеоядро; чипсет i945GSE + ICH7M.
  • Wi-Fi та Bluetooth 2.0.
  • Три USB 2.0, VGA, RJ-45, входи й виходи для мікрофона та навушників, кардридер 4-в-1.
  • HD Audio, стереодинаміки, сенсорна панель.
  • Батарея Li-Ion, 3 комірки, 2200 мА·год; у переліку заявлено до 3 годин роботи.
  • Розміри 260 × 180 × 19–31,5 мм; маса близько 1 кг.

Роздільна здатність камери мого екземпляра залишилася неуточненою: я записав і 1,3 Мп, і 0,3 Мп. Офіційна сторінка MSI U90 також перелічує обидва варіанти камери. Тому одного лише позначення U90 недостатньо, щоб установити, яку саме камеру мав мій нетбук. Параметри накопичувача й ОС у моєму записі стосуються придбаного комплекту та можуть відрізнятися від іншої специфікації U90.

Встановлення системи

Вбудованого CD/DVD-привода не було, тому для встановлення програм потрібен був зовнішній привод, мережа або USB-носій. У комплекті була Linux SUSE 10. Вона мені сподобалася, зокрема великим набором пакетів, але повного дистрибутива на жорсткому диску не виявилося. Під час налаштування система могла запросити інсталяційні файли, тож їх доводилося передавати локальною мережею або читати із зовнішнього CD/DVD-привода.

Роздільна здатність екрана й модем

Спочатку налаштування пропонували роздільну здатність 800 × 600. Для роботи з панеллю 1024 × 600 довелося уточнити параметри дисплея. Також виникли труднощі з розпізнаванням тодішнього нового модема PeopleNet, тож я перейшов на Ubuntu 8.10, встановивши її з флешнакопичувача.

Враження від роботи

Загалом — непогана річ: легка й компактна. Я навіть жартував, що нетбук важить менше за мою барсетку :) Враження залишилися позитивними, хоча налаштувати його з ходу міг не кожен: знадобилися мінімальні знання встановлення Linux і трохи «шаманства», щоб отримати найкращий результат.

Установлення Ubuntu з USB-флешки на нетбуці

Для нетбука без оптичного привода завантажувальна USB-флешка була зручним способом установити Ubuntu. У початковій нотатці я посилався на матеріал для Ubuntu 8.10:

Інструкція, яку я зберіг для Ubuntu 8.10

http://rus-linux.net/lib.php?name=MyLDP/install/Ubuntu8.10-on-USB.html

Підготовка флешки для встановлення

Це історична інструкція. Для актуального образу системи користуйтеся офіційною сторінкою Ubuntu зі створення завантажувального USB та переходьте до її оновленого посібника. Перед записом правильно оберіть носій і збережіть потрібні файли: створення завантажувальної флешки може стерти її вміст.

Чому для прикладної частини «Корпорація 2» я розглядав Qt 4

Плануючи відкриття вихідного коду «Корпорація 2», я шукав інший засіб розробки прикладної частини. У тій оцінці Delphi не підійшов через вартість і складність мого середовища; Java, .NET і Mono також не відповідали тодішнім вимогам проєкту. Це історичний вибір, а не висновок про можливості сучасних версій цих технологій.

Які вимоги визначали вибір

У моєму тодішньому середовищі Delphi вимагав складного налаштування й перенесення між комп’ютерами, а потрібної роботи в різних операційних системах я з ним не отримував. Для Java важливою була ще й наявність відповідного середовища на комп’ютерах користувачів; частина наших задач, на мою думку, не вкладалася в цей підхід. .NET і Mono я розглядав, але після зважування переваг і недоліків не обрав.

Залишався C++, проте доступних мені матеріалів здавалося замало. Знайомство з Qt 4 змінило це враження.

Що мене зацікавило в Qt 4

Qt 4 зацікавив кросплатформністю, інструментами розробки, документацією та прикладами, а також можливістю залучати інші бібліотеки. Qt — фреймворк, а не мова C; його основний API реалізовано на C++. Це розрізнення пояснює документація Qt.

У своєму виборі я також відзначав безплатну IDE для різних платформ, поширення Qt у Linux і велику кількість практичних прикладів. Це були критерії мого вибору на той момент.

Збережені матеріали про Qt 4

  • http://www.qtsoftware.com/products — сторінка розробника Qt 4
  • http://www.qtsoftware.com/qt-in-use — приклади робіт
  • http://www.opennet.ru/docs/RUS/qt4_intro/ — матеріали з програмування
  • http://symmetrica.net/qt4/- — матеріали з програмування
  • http://sector.ynet.sk/qt4-tutorial/ — посібник для початківців
  • http://doc.trolltech.com/4.0/ — приклади та описи
  • http://www.google.com.ua/search?hl=ru&q=qt4&start=10&sa=N

Фраза про майбутнє відкриття коду була планом на момент публікації. Нотатка не підтверджує його виконання, актуального складу платформи чи чинних умов ліцензування Qt. Документацію сучасних версій розміщено на doc.qt.io. Щодо K2: WhatsApp +380679016322.

Автоматичні зворотні скісні риски в старому PHP: magic quotes

У старих конфігураціях PHP механізм magic quotes міг автоматично додавати зворотні скісні риски перед окремими символами. У застосунку, який сам обробляв вхідні дані, це могло спричиняти повторне екранування та помилки логіки.

Налаштування для старої «Корпорація 2»

Для тодішньої «Корпорація 2» пропонували вимикати його через .htaccess:

php_flag magic_quotes_gpc 0
php_flag magic_quotes_runtime 0

Версія PHP і спосіб запуску

Це історичні директиви, а не налаштування сучасного PHP. Magic quotes вилучено в PHP 5.4.0. До того ж php_flag у .htaccess належить до сценарію з PHP як модулем Apache; його не слід механічно переносити в інші режими запуску.

Старе додаткове посилання: http://www.shram.kiev.ua/hacker/php/kavichki.shtml. Джерела уточнень: PHP 5.4.0 та зміна конфігурації PHP. Для нового коду обробляйте дані відповідно до контексту використання, а не покладайтеся на автоматичне додавання рисок.

Автоматичні зворотні скісні риски в старому PHP: magic quotes

У старих конфігураціях PHP механізм magic quotes міг автоматично додавати зворотні скісні риски перед окремими символами. У застосунку, який сам обробляв вхідні дані, це могло спричиняти повторне екранування та помилки логіки.

Налаштування для старої «Корпорація 2»

Для тодішньої «Корпорація 2» пропонували вимикати його через .htaccess:

php_flag magic_quotes_gpc 0
php_flag magic_quotes_runtime 0

Версія PHP і спосіб запуску

Це історичні директиви, а не налаштування сучасного PHP. Magic quotes вилучено в PHP 5.4.0. До того ж php_flag у .htaccess належить до сценарію з PHP як модулем Apache; його не слід механічно переносити в інші режими запуску.

Старе додаткове посилання: http://www.shram.kiev.ua/hacker/php/kavichki.shtml. Джерела уточнень: PHP 5.4.0 та зміна конфігурації PHP. Для нового коду обробляйте дані відповідно до контексту використання, а не покладайтеся на автоматичне додавання рисок.

K2 відкрила курс з ERP: 61 урок, практика й сертифікат

Перший день у новій ERP часто починається з пошуку потрібної кнопки. Наступний виклик складніший: зрозуміти, що зміниться після натискання. ...