[ /b/ /u/ /rf/ /dt/ /vg/ /r/ /cr/ /lor/ /mu/ /oe/ /s/ /w/ /hr/ ] [ /a/ /ma/ /sw/ /hau/ /azu/ ] [ /tv/ /cp/ /gf/ /bo/ /di/ /vn/ /ve/ /wh/ /fur/ /to/ /bg/ /wn/ /slow/ /mad/ ] [ /d/ /news/ ] [ Главная | Настройки | Закладки | Плеер ]

Ответ в тред 29820. [Назад]
 [ Скрыть форму ]
Имя
Не поднимать тред 
Тема
Сообщение
Капча Капча
Пароль
Файл
Вернуться к
  • Публикация сообщения означает согласие с условиями предоставления сервиса
  • В сообщениях можно использовать разметку wakabamark
  • На данной доске отображаются исходные имена файлов!
  • Разрешенные типы файлов: vector, code, image, video, music, flash, text, archive, pdf
  • Тред перестает подниматься после 500 сообщений.
  • Треды с числом ответов более 100 не могут быть удалены.
  • Старые треды перемещаются в архив после 40 страницы.

No.29820 Ответ
Файл: SQL.PNG
Png, 15.62 KB, 393×305 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
SQL.PNG
Что-то не нашёл треда, посвящённого SQL в общем, посему запилю новый.
Oracle, MySql, MSSql, PostreSql, Sqlite и прочие реляционные СУБД are welcome.
>> No.29821 Ответ
Как, блджад, запомнить разницу между inner\outer left\right join? Есть какая-нибудь мнемоника, что ли? У меня есть таблица, но она постоянно вылетает из гловы.
>> No.29828 Ответ
Файл: SpaceTimeScheme.png
Png, 18.90 KB, 696×533 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
SpaceTimeScheme.png
>>29820
Поиск в Google по запросу "sql joins" выдал вот что:
http://www.skillz.ru/dev/php/article-Obyasnenie_SQL_obedinenii_JOIN_IN[...].html
+ форумы: http://www.sql.ru и http://rsdn.ru/forum/db/
>> No.29829 Ответ
>>29828
Алсо, внутри "JOIN ON" может быть условие, то есть это не только правила соединения таблиц по двум ключам. В следующем примере:

   SELECT
   c.name AS city_name,
   SUM(s.value) AS sales_total
   FROM
   city c
   LEFT OUTER JOIN
   sales s
   ON
   (
   c.id = s.city_id
AND 
   s.day < DATE_SUB(NOW(), INTERVAL 1 MONTH)
   )
   GROUP BY
   c.id
   ORDER BY
   c.name

К таблице "c" мы желаем присоединить таблицу "s", выбрав из неё некоторые столбики, поэтому пишем "LEFT OUTER JOIN". Таблица "c" основная, таблица "s" вспомогательная (данных может и не быть, или они будут не все выбраны - тогда вместо них будет пустое поле: "NULL").

Если бы к таблице "s" присоединяли столбики из таблицы "c", написали бы "RIGHT OUTER JOIN".
>> No.29841 Ответ
>>29828 >>29829
Спасибо, няша, но это не то, что мне нужно. Хотя я уже и сам нашёл себе мнемонику, чтобы запомнить, который из них как работает.

Следующий вопрос: как лучше хранить хеш в БД — в виде строки или для хешей есть специальное представление? Не обязательно нативный тип. Может, какой пользовательский для пущей безопасности придумали или хеш вообще в БД уже никто не хранит.
>> No.29850 Ответ
>>29841
Ответ на твой вопрос включен в ответ на вопрос, что такое хэш.
>> No.29851 Ответ
>>29841
> Хотя я уже и сам нашёл себе мнемонику, чтобы запомнить, который из них как работает.
Поделись?
>> No.29853 Ответ
>>29850
Хеш — это последовательность бит. В БД есть и битовые массивы, и строки. Так что же мне выбрать?
>>29851
Outer join всегда собирает в выборку картежи из обоих таблиц, то есть, это декартово произведение.
Inner join, если в какой-то таблице не найдётся схожих значений, в зависимости от того, левый он или правый, добавит в выбор все картежи из левой или правой таблицы.
>> No.29854 Ответ
>>29853
А последовательность бит (фиксированной длины) — это число.
>> No.29857 Ответ
>>29854
Да, такой вариант тоже возможен. Ты где-нибудь хранишь в БД хеши в виде числа?
>> No.29858 Ответ
>>29857
Лолка, их все так хранят, если ты ещё не понял.
>> No.29860 Ответ
>>29853
> Inner join, если в какой-то таблице не найдётся схожих значений...
То он всё выбросит.

В примере выше, если мы к таблице "c" будем присоединять данные из таблицы "s" через "left join", то в случае, если данных не найдётся (из-за того, что их вовсе нет, или из-за того, что они не прошли через условие внутри "join-on" - это не важно), произойдёт следующее:
▪ "inner join" выбросит данные для таблицы "c", то есть, он всё выбросит,
▪ "outer join" оставит данные для таблицы "c" и напечатает рядом с ними пустое значение - "NULL".
>> No.29862 Ответ
>>29860
Описался. Не кортежи, а только имена аттрибутов, со значением NULL, всё верно ты говоришь.
>> No.29897 Ответ
> Как, блджад, запомнить разницу между inner\outer left\right join?
есть две связанные таблицы, условно левая, та которая в select from, и условно правая, та, которая join on
left join - делается выборка из левой таблицы
right join - делается выборка из правой таблицы
inner join - из обоих берутся только те строки, для которых есть соответствующие строки в другой таблице
outer join - берутся все строки по запросу, для тех строк которых нет в другой таблице подставляются null
Теперь все это смешиваем
left inner и right inner - соответссвенно одно и то же, поэтому их не разделяют
left outer - делается выборка из левой, справа строки из правой либо null
right outer - выборка из правой, слева строки из левой либо null
full outer - объединение left outer и right outer
>> No.29912 Ответ
Не могли бы вы подсказать, как с нуля научиться составлять процедурки в PL-SQL? Что читать, какие авторы-сайты-издательства предпочтительны? Не знаю даже синтаксиса толком, освоить по рабочей необходимости нужно срочно. Пространная теория не нужна, нужны неочевидные (и очевидные, чего уж) особенности работы в среде, синтаксис, желательно примеры.
>> No.29927 Ответ
>>29912
К твоей СУБД должна поставляться справка.
>> No.29936 Ответ
>>29927
Отличный ответ, просто превосходный.
Хорошо, мне нужна статья или глава из книги, где будет четко по делу о написании процедур, основах языка SQL-иньекций без растекания по теме проектирования, нормализации БД и прочей теории.
Я хочу БЫСТРО научиться писать и отлаживать ПРОЦЕДУРЫ. К сожалению, у меня нет никаких практических навыков, но есть еще вузовская фундаментальная база по теории.
Вы можете подсказать неоходимую литературу, или будем играть в филиал ЛОРа и RTFM?
>> No.29993 Ответ
>>29974
>>29939
>>29927
Спасибо за помощь, лиспач. Вы все няши, добра вам.
>> No.30221 Ответ
Я скачал с офф. сайта и поставил последний mysql на винду с парой каких-то дополнительных приблуд, установившихся вместе. Одновременно я читаю learning sql Алана Бьюли, второе издание 2008г. А.Б. велит запускать консоль и писать туда:
mysql -u root -p
А он мне:
"mysql" не является внутренней или внешней командой, исполняемой программой или пакетный файлом.
Что я делаю не так?
>> No.30222 Ответ
>>30221
ЗЫ, я никогда раньше не юзал консоль не понимаю пока, зачем она понадобилась, в винде то и впервые сталкиваюсь с СУБД и sql.
>> No.30224 Ответ
>>30222
Вот, пожалуйста: "кнопочки, формочки", а как нужно сделать что-то, не предусмотренное формошлёпом - всё, ступор и вопросы на Доброчане.

Эх, а ведь раньше с компьютерами так и раюотали: мигающий квадратный курсор, команда, Enter - результат. Еще команда, Enter - результат. Картины целые так, помню, рисовал... Эх...
>> No.30226 Ответ
>>30224
- Как сделать Х?
- Вот, пожалуйста: "не-Х", а как нужно сделать что-то, не предусмотренное не-Х - всё, ступор и вопросы на Доброчане. Эх, а ведь раньше с Y так и работали: Z, Q, R - результат. Еще Q, R - результат. U целые так, помню, V... Эх...
Так на любой вопрос можно отвечать. Я не могу знать всё сразу от рождения, как мне знать это, не спрашивая предварительно? Как твои картины могут вызвать интерес? Вообще людям, связанным с технологиями, ли предаваться ностальгии?
>> No.30228 Ответ
>>30221
Добавь каталог с бинарниками mysql в paТh же.
>>30224
Не ругайся, няша. Век консольных интерфейсов уже давно прошёл. Тебе пора принять графические интерфейсы.
>> No.30232 Ответ
>>30228
Графическим интерфейсам тоже недолго осталось. У них есть один фундаментальный недостаток, который не позволяет их использовать для чего-то больше, чем постинг фоточек в Instagram и вытягивание денег из быдла. Новое поколение интерфейсов - это всё та же консоль. С подсказками, всплывающей справкой и автодополнением.
>> No.30233 Ответ
>>30226
Для тебя (и для меня тоже, кстати), написали документацию.
>> No.30234 Ответ
>>30233
Документацию чего? Командной строки? myaql? Sql?
>> No.30235 Ответ
>>30234
mysql, фикс.
>> No.30237 Ответ
>>30235
Командной строки, MYSQL и SQL.
>> No.30238 Ответ
>>30232
Создай тред на /slow/ со своим пророчеством, выставь конкретный срок наступления такого будущего и количество свободно конвертируемых бутылок коньяка, которые ты мне проставишь, если не сбудется. Ну или я тебе, естественно. Или ты мечтатель простой.
Музыку интерфейса заказывает конечный пользователь, а ему твоя идеалистическая фантазия НИКОГДА не будет нужна при наличии альтернативы графического интерфейса и ЕГО логических продолжений. Текстовый диалог напрягает глаза и мозг сильней, чем пиктограммы, анимация и голосовое управление. Человек мыслит образами и ассоциациями, а не формальными высказываниями с всплывающей справкой.
Ты пишешь, что
> Графическим интерфейсам тоже недолго осталось. У них есть один фундаментальный недостаток, который не позволяет их использовать для чего-то больше
...но чего же, дорогой доброкодер? Что может предложить искушенному пользователю тумблера консоль такого, что не может сделать сообразно развитый интерфейс? Ты вообще представляешь, в чем истинное предназначение интерфейса? Не в широте возможностей, а в простоте и незаметности. Чтоб ты ни секунды не тратил на размышления о том, как сформулировать сложный запрос к системе, чтобы единственным языком программирования был натуральный язык программиста, а пользователь думал не о проблемах с поиском нужной информации или еще каких-то задачах поиска метода, а о непосредственной цели своего взаимодействия с машиной.
Извините, обмечтал весь тред.
>> No.30239 Ответ
>>30238
s/пользовател\S*/быдло
>> No.30240 Ответ
>>30239
Ты-то, конечно, пользователем себя не считаешь и это сообщение написал из под Рыси. Чтоб тебе, илитисту, было понятней пользователь==потребитель==заказчик==плательщик. А если ты своего клиента считаешь быдлом, то тебе никогда не сделать коммерчески успешного, конкурентного продукта.
>> No.30245 Ответ
>>30240
Из-под того, из-под чего я написал, меня не устраивает, как и всё то г весь тот го якобы софт, которым мне приходится дома пользоваться. Поэтому я ещё ни разу в жизни за него не платил. Нет, я готов платить за софт, но устраивающего меня на рынке попросту нет. Все пишут клиенты для Фейсбука с местом для рекламы и тоталвидеоконвертеры за 49,99$, вместо того чтобы двигать индустрию IT делать удобные своим собратьям вещи.
>> No.30257 Ответ
>>30245
Толствовато на самом деле.
>> No.30270 Ответ
>>30257
Беда в том, что это правда.
>> No.30274 Ответ
>>30228
Кто такой paTh? Вообще по чём учить sql и mysql? Вроде она запустилась, как ни странно значком из "все программы" в меню пуск. Почему у Бьюли такие причуды? Mysql на версию старее так не запускалась, только через командную строку? Оно только пароль просит от рута, как теперь заходить под другим пользователем? Это в установке настраивалось, но про настройку юзеров при установке у Бьюли нет ничего. Как теперь заходить под другим?
>> No.30275 Ответ
Файл: 1311168818_x_cb5484a1.jpg
Jpg, 31.46 KB, 302×302 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
1311168818_x_cb5484a1.jpg
>>30274
> Кто такой paTh?
Одна из системных настроек.
> Mysql на версию старее так не запускалась, только через командную строку?
Они все одинаковы. Это Unix'овая программа, и она работает с командной строки.
> Оно только пароль просит от рута, как теперь заходить под другим пользователем?
Вначале его надо создать, написав заклинание "CREATE USER", затем дать ему права на таблицы, написав заклинание "GRANT ... ON", вот как-то так: http://beginner-sql-tutorial.com/sql-grant-revoke-privileges-roles.htm

И тогда уже можно соединяться с базой данных, задавая его имя и пароль.
> но про настройку юзеров при установке у Бьюли нет ничего
Так это ж книга не про установку и настройку MySQL, она про язык запросов SQL.
Админские книги здесь: http://progbook.ru/bd/mysql/
>> No.30277 Ответ
>>30274
Алсо, есть окошечные клиенты для MySQL, один из них - dbForge.
Поиск картинок Google по словам "mysql client" выдал ещё несколько.
>> No.30291 Ответ
Файл: beau.png
Png, 41.76 KB, 670×325 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
beau.png
>>30275
> Одна из системных настроек.
"Переменная среды"? Если да, то какая, пользовательская или системная?
> Они все одинаковы. Это Unix'овая программа, и она работает с командной строки.
Бьюли предлагал брутально запускать командную строку винды с кнопки "выполнить"->cmd, а потом уже писать прямо туда. Я просто запустил mysql из меню пуск. Понятное дело, что это консольное приложение, но виндовая командная строка нафига понадобилась?
> Вначале его надо создать, написав заклинание "CREATE USER", затем дать ему права на таблицы, написав заклинание "GRANT ... ON", вот как-то так:
А Бьюли пишет сразу "GRANT ... ON", а создаёт только базу данных. Вроде пользователь тут сразу создаётся, так?
> И тогда уже можно соединяться с базой данных, задавая его имя и пароль.
Как?
>> No.30295 Ответ
>>30291
Блин, у меня бешенство. Какая книга по sql самая нормальная? Вот по с++ есть Страуструп, по С# и .net есть Рихтер, по осям есть Таненбаум, а что по sql? Не "самое простое", "за 5 дней", "понятным языком" и т.п., а нормальная книга для профессионалов! Документация только для конкретики подходит и если знаешь примерно, в чём вопрос. А цель стоит - получить серьёзную квалификацию.
>> No.30296 Ответ
>>30295
> А цель стоит - получить серьёзную квалификацию.
Читай сам стандарт ANSI SQL.
>> No.30300 Ответ
Файл: images.jpg
Jpg, 5.81 KB, 259×194 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
images.jpg
>>30291
> Вроде пользователь тут сразу создаётся, так?
Да нет, ты что! Подумай сам, за что админы баз данных получают свою зарплату. Разве может всё быть так просто? Сначала базу данных надо создать, затем пользователя к ней, затем дать ему права (на всё - три недели), затем расписаться в платёжной ведомости, и только тогда...
>> No.30301 Ответ
>>30300
Что тогда значит добавка
identified by 'xyz'
в команде grant, как её пишет Бьюли? По идее это пароль. Чтобы дать права, нужен пароль самого пользователя, которому даёшь права?
>> No.30302 Ответ
>>30301
> Чтобы дать права, нужен пароль самого пользователя, которому даёшь права?
Google grant identified by с тобой тоже не согласен. Все с тобой не согласны сегодня. День такой...
>> No.30305 Ответ
>>30291
Итак действительно надо было добавить каталог с бинарниками в системную настройку path. Хорошо, что я понял, системная настройка - это переменная среды, а каталог с бинарниками - это папка bin.
>> No.30311 Ответ
Файл: iis.jpg
Jpg, 85.93 KB, 1013×560 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
iis.jpg
>>30238
Думать о простоте интерфейса хорошо, когда ты делаешь постилку фоточек в твиттор(нулевая интеллектуальная активность для совершения действия <=> интерфейс с 2 кнопками). Но суровая реальность разобьет все твои мечты, когда "широта возможностей" приложения станет такова, что интерфейс в 3 кнопки просто перестанет укладываться. И нет, выкинуть даже 10% возможностей будет нельзя просто потому, что это сделает его бесполезным для пользоватей.
>> No.30318 Ответ
>>30311
> интерфейс в 3 кнопки просто перестанет укладываться
Надо делать кнопки высших порядков. Функториальные, аппликативные и монадические. Кнопки-цвета, кнопки-примеси.
Чтобы одни и те же две кнопки можно было нажать целым спектром способов.
>> No.30321 Ответ
>>30311
Вот этому добра и чаю.
>>30318
А ты аццкий сотона.
>> No.30325 Ответ
Странно читать от, казалось бы, умных людей(по крайней мере я верил, что тут таких немало) слово "кнопка". Особенно в упоминании будущего интерфейсов. Сначала голосовой поиск в гугле, потом кинект, потом очки гугл. И вы что, всё ещё думаете, что будущее интерфейсов за мышкой и кнопками?
По-моему, это направления самое реальное и самое вожделенное в будущем развитии интерфейсов. Критика будет? И, да, консолеёбы нинужны, увы.
>> No.30326 Ответ
>>30325
Покажи мне интирпрайз с голосовым интерфейсом. Или научный софт, ага.
Соснольки и быдлофоны это совсем не тоже самое, что корпоративный софт для управления большими и сложными БД.
>> No.30327 Ответ
Файл: affe500.jpg
Jpg, 25.04 KB, 420×315 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
affe500.jpg
>>30325
Ты съехал с обсуждения объективной реальности в киберпанк.
Если смотреть в очень далёкое будущее - то всё правильно. Но на сегодняшний день голосовые интерфейсы еще не пригодны для чего-либо кроме "как бля проехать в макдак на набережной бля". И гуглоочки, которых у тебя нет, тоже.
А из того, что сегодня действительно работает(кнопочки и сосноль), именно консольное управление по своей интуитивности наиболее близко к интерфейсам будущего. Да, команды нужно вводить руками. Да, излишняя строгость синтаксиса оставляет желать лучшего. Да, нет коррекции ошибок. Но по сравнению с пикрелейтедом это совершенно другой уровень экспрессивности.
>> No.30328 Ответ
>>30327
Хорошо, объясню. Самый главный недостаток "кнопок и полей ввода" - их некомпозабельность. Я не могу, например, выделить в проводнике ряд файлов и сформировать из них список в HTML-формате; или в редакторе изображений сделать из фотки мозаику с помощью "PuzzleMaker 6.0 Ultra $19.95". Точно так же я не могу запрограммировать кликами сграбливание композиций с аудио-CD и последующее вырезание голоса из них; или создание чёрно-белых вариантов из изображений в моей галерее на сайте; и другое - всё это только вручную. Авто-кликалки не предлагать, они костыль и изврат.
>> No.30329 Ответ
>>30326
Так я и не говорил за сервера/сайентс, десктопам — десктопов, серверам — серверное, это во-первых. Во-вторых, я же фантазировал на счёт будущего, конекретно, насчёт того, к чему сейчас стремятся, так что показывать что-то, существующее сейчас, нет смысла.
>>30327
Хехе. В моём киберпанк мирке все уже давно обмениваются информацией с помощью wireless адаптеров, встроенных в тело, вообще без каких-либо вербальных символов.
> именно консольное управление по своей интуитивности наиболее близко к интерфейсам будущего
Давай ты скажешь, где будет такое управление использоваться — на серверах, где GUI в приницпе не нужен или на десктопах? Кстати, хоть один интерфейс, который сейчас уже поддерживает полуконсольное, полукликабельное управление существует хотя бы в виде прототипа?
>>30328
Я не могу запрограммировать нейросеть для распознавания моего лица средствами кнопочного гуя, не могу инвертировать цвета на скриншоте плейлиста медиаплеера и сделать crop первых трёх композиций с конца, начинающихся на слово in, и другое — всё это только вручную. Авто-кликалки не предлагать, они костыль и изврат.
>> No.30330 Ответ
>>30328
Только если интерфейс делали под сперму или какие-то местные дельфиёбы.
В любой нормальной программе гуй и логика разнесены и ты можешь вызывать все внутренние АПИ и без гуя, через нужные тебе скрипты экспорта данных.
>> No.30331 Ответ
>>30330
Тащемта, по-хорошему надо гуй вообще автоматом генерировать. Садить человека за комп, запускать генератор, и считывать хорошесть гуя датчиками с писечки, например.
>> No.30332 Ответ
>>30330
Слава Богу, что до людей постепенно доходит, что только на гуях далеко не уедешь.
>> No.30334 Ответ
>>30332
> до людей постепенно доходит
Я не знаю, до кого там "доходит", MVC паттерн еще лет 20 назад придумали.
>> No.30335 Ответ
>>30334
Я говорю про вид и принципы эксплуатации программ, а не про их внутреннее устройство.
>> No.30338 Ответ
Файл: VIO.png
Png, 0.33 KB, 423×278 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
VIO.png
Нарисовала вам интерфейс.
>> No.30348 Ответ
>>30338
Годный интерфейс, одобряю.

Простая консоль не намного лучше гуя, к сожалению. Но со всякими полезными фичами, вроде автодополнения везде, где только можно, различных контекстных подсказок, списков наиболее часто посещаемых папок и используемых команд, истории, нормальной документации и удобного встроенного скриптового языка она превращается в нечто уберудобное. Но про мышку забывать не стоит, некоторые действия, вроде выделения текста, удобнее делать именно ей. А интерфейс какого-нибудь FAR'а мне кажется почти идеальным. Хочешь - мышью пользуйся, хочешь - хоткеями, а ещё и консоль всегда под рукой. Про двухпанельный режим молчу, он специфичен для файл-менеджеров.

Кстати, сейчас множество игр делают кроссплатформенными настолько, что они работают и на компах, и на всяких андроидах. Можно их использовать для сравнения удобства сенсорного экрана и мыши с клавиатурой. Мне определённо удобнее пользоваться традиционными методами ввода.
>> No.30356 Ответ
Файл: Clipboard_20130323.png
Png, 16.90 KB, 659×703 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
Clipboard_20130323.png
>>30338
Тред не читай, интерфейс нарисовай!
>> No.30363 Ответ
>>30356
Ради этой функции поставил и слегка выучил емакс.
>> No.30376 Ответ
>>30334
Тысячи строк безупречного кода этому господину!

Киберпанки, представьте себе тачпад с градацией нажатий слоев так в 8 (хватит и двух, но чтоб прожатие второго слоя ощущалось как нажатие клавиши примерно). Возюканье по нему несколькими пальцами отображает на экране НЕСКОЛЬКО курсоров, взаимодействие происходит при "глубоком" нажатии, возюканье только перемещает курсор.
Такая хрень уводит нас от негодных для реального пользования из-за закрытия обзора тачскринов и позволяет пилить восьмеркообразный интерфейс с экранной клавиатурой и без этих ваших мышей. Прототип есть, но у него убогая разрешающая способность, а ощущения как от гелевого коврика под пальцами, плюс невозможность слепого набора, нивелируемая видимой на экране клавиатурой. Как по мне, так вполне годная замена существующим устройствам ввода, даром что гуй под нее нужен ебически продуманный. Опять же, наработки по гую есть на мобильных платформах.

Кукаретикам с голосовым вводом напомню о помехах, шумоизоляции и возможности работы в коллективе, а также невозможности общения во время работы с машиной по голосовому каналу. Это не основной интерфейс, но может быть приятным дополнением к основному.
>> No.30377 Ответ
>>30376
Любители механических клавиатур будут недовольны. Или ты надеешься, что получится сделать стопицот видов таких тачпадов, имитирующих поведение различной механики?

А про закрытие обзора с тобой соглашусь, и добавлю, что палец ещё и достаточно толстый, чтобы делать затруднительными точные нажатия. Но пока тачскрины не выбрались за пределы телефонов и планшетиков, переживать особых поводов нет. Блджад, где няшные смартфоны с физической qwerty-клавиатурой, коих было дохрена ещё пару лет назад?
>> No.30380 Ответ
>>30377
> Любители механических клавиатур будут недовольны
Любители itemname будут недовольны вытеснением ее с рынка более современным itemname_new, ты хотел сказать. Никакой имитации именно механики, я говорил о глубине хода, соответствующей слим-клаве и более мягком, но все же сопротивлении и возврате в исходную плоскость.
> Блджад, где няшные смартфоны с физической qwerty-клавиатурой, коих было дохрена ещё пару лет назад?
Лео, залогиньтесь. Увы, но они исчезли уже даже не пару, а пол десятка лет тому. И среди них было мало моделей, в которых по кнопкам можно было попадать мужским пальцем, а не кончиком ногтя.
Мне самому механика приятней тачскрина, но телефон предпочитаю использовать только для звонков-смс, максимум - быстрый поиск и изредка вбить адрес нужного сайта. Поэтому мой выбор - гуглофон с цифровой клавиатурой, за предложение модели буду благодарен.

А еще мы скатили нужный тред в обсуждение не по теме, в лучших традициях.
>> No.30381 Ответ
>>30380
> они исчезли уже даже не пару, а пол десятка лет тому
Во-первых, blackberry.
Во-торых, всякие рандомные телефоны типа http://market.yandex.ru/guru.xml?CMD=-RR=9,0,0,0-PF=2142542726~EQ~sel~[...]91491
>> No.30384 Ответ
>>30380
> Любители itemname будут недовольны вытеснением ее с рынка более современным itemname_new, ты хотел сказать
Любители механических клавиатур любят их именно за механику. С их точки зрения твоё itemname_new - шаг назад. Нельзя вот так взять и сравнить две разные вещи, даже если они имеют схожую функциональность.
> Лео
Кто такой, чем знаменит?
>> No.30385 Ответ
>>30384
Вообще-то если две вещи имею схожую функциональность то их можно сравнивать. Например, арбуз и дыню можно сравнивать с точки зрения вкуса.
>> No.30386 Ответ
>>30384
> шаг назад
Я застал времена, когда мышь считались бесполезной игрулькой, для которой еще драйвер приходилось держать ЗДОРОВЕННЫЙ. А еще помню, как проходили дум, отодвинув мышку подальше, даже если она была.
И ведь тоже несравнима с клаватурой, а куда теперь без нее?
И я забыл оговорить, что речь идет об интерфейсе не стандартном, а удобном для БОЛЬШИНСТВА пользователей, как сейчас де-юре не является стандартом мышь с 2+ кнопками и колесом.
> Кто такой, чем знаменит?
В контексте данной темы - большой любитель qwerty-смартов и пеарщек их в своем бложике, большой любитель ЗАЛОГИНИВАТЬСЯ, а вообще - ruwiki://Леонид_Каганов
>> No.30387 Ответ
>>30386
> И ведь тоже несравнима с клаватурой, а куда теперь без нее?
Хоткеи во все поля. Когда работаю с кодом, мышь как раз отодвигаю, чтобы не мешалась.
> И я забыл оговорить, что речь идет об интерфейсе не стандартном, а удобном для БОЛЬШИНСТВА пользователей
Окей, против большинства не попрёшь, хоть мне и не нравятся тенденции развития интерфейсов.
>> No.30388 Ответ
>>30385
По вкусу можно, по форме, по размерам, но сказать, что что-то лучше вообще, нельзя. С этим навороченным тачпадом так же. Он круче клавиатуры и мыши тем, что объединяет их, но хуже клавиатуры по ощущениям, точности нажатий ололо, оцениваем несуществующее. Поэтому его нельзя рассматривать как новый, лучший способ ввода. Альтернатива, не более, как и арбуз с дыней.
>> No.30389 Ответ
>>29820
Привет тебе, доброкодер. Есть один мужской половой орган, решившийся поучаствовать в проекте. Этот огран - я. Дали мне пароль к svn-репозиторию, скачал я последнюю версию его содержимого(фотокарточку прилагаю), методом "палец в небо" выбрал я Aptana Sudio в качестве IDE, дальше-то что делать?
>> No.30390 Ответ
Файл: Снимок.PNG
Png, 49.36 KB, 788×458 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
Снимок.PNG
>> No.30395 Ответ
>>30390
Для проэкта где-то есть список текущих задач(тасков). Найди его, выбери задачу, и вперед печатать код.

С дивана.
>> No.30397 Ответ
Кукаретик с голосовым вводом reporting in. Напоминаю, что когда-то и тачпад, и управление движением конечностей без физического контакта с девайсом были фантастикой, а потом появились первые прототипы, у которых так же было много проблем. Но ничего, выбрались, даже массовыми некоторые из них стали.
>> No.30404 Ответ
>>30387
А я мышой навигацию осуществляю. Но когда именно ПИШУ - разумеется ее не трогаю.

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

>>30388
точность за счет того что видишь, куда нажимаешь. Выше мышиной, по идее. Девайс прототип щупал лично, пруфов ближайшее время не будет.
Витая пара лучше вообще коаксиала, например. IBM PC лучше Энигмы. Новое лучше старого, с той оговоркой, что это не новый выебон какого-нибудь одного производителя, а общая тенденция.

>>30397
Привет тебе из маршрутки с шансоном/офиса на сорок человек/ночного клуба/совещания/пробки/домашнего компа, за которым ты решил параллельно послушать музыку/скайпоконфы. Как твои дела? Нормально голосовой ввод работает? Что? Не слышу, что ты сказал? А теперь перечисли, в какой среде нормально работает твой голосовой ввод? А как у него по скорости по сравнению с консолью? А если гуй позову? А? Што? Ты опять выходишь на связь?
>> No.30406 Ответ
>>30404
Я говорил про точность нажатий клавиш таки. У механики офигенная обратная связь, у нынешних тачскринов она околонулевая. А с мышью ты погорячился. Я вижу курсор, и вижу, куда нажимаю. Причём с точностью до одного пикселя. Куда уж точнее?
>> No.30411 Ответ
>>30406
Ну, я не буду спорить о необходимости точности до пикселя, особенно на ХД-разрешениях.
Я настаиваю, что обратная связь механики идет за счет слепого набора, которым владеют, как правило, только люди, которые набирают буквы много и часто. Сейчас все довольны тачем на мобильных устройствах именно потому, что им не нужно ни набирать на них код\текст, ни работать с графикой попиксельно. И как замену тачу я такой вариант вижу оптимальным.
Куда точнее? Я бы спросил, зачем точнее? Попадать по кнопкам гуя точности много не надо.
Не спорю, что для набора текста лучше клавиатуры может быть только клавиатура+автодополнение, подогнанные под себя, даром что сам так работаю.
>> No.30413 Ответ
>>30404
Ты специально такой невнимательный или стараешься не въехать в смысл? Или это троллинг? Да нет, вроде бы на троллинг не похоже. Тачскрин когда-то тоже был говном, которым можно было пользоваться при определённых условиях, но потом технологию усовершенствовали и теперь ты можешь нажимать хоть пальцем, хоть ногтем, хоть апельсином, хоть жопой. Допустим, у меня есть теория о том, что голос каждого человека абсолютно уникален по одной очень неизвестной характеристике. Фильтровать шумы я уже научился. Да и каждая команда запрограммирована будет на определённую фразу. И вот когда я смогу доказать теорию уникальности и реализовать девайс, уникально идентифицирующий владельца по голосу, мы с тобой ещё поговорим, любитель потыкать в экранчик.
>> No.30416 Ответ
>>30404
Кстати, прототип умного дома с голосовым управлением уже есть у одного мужика из России. Вот только забыл, из какого города, как-нибудь погуглю. Он, чтобы увеличить степень распознования, добавил анализ мимики. На мобильничках такое тоже можно было бы сделать, да вот они слабы для запуска нейросетей.
>> No.30417 Ответ
>>30416
> да вот они слабы для запуска нейросетей.
ORLY? Сейчас средний мобильник мощнее моего старого комп, на котором я в MATLAB буквы распознавал. Хотя, если ты имеешь в виду NOKLЫ, то да, они могут и не потянуть.
>> No.30419 Ответ
>>30413
Ну ладно. Допустим, получилось сделать распознавалку, корректно определяющую, что сказал человек, в 99.9999% случаев. Но давай подумаем, как её можно будет использовать.

Ввод текста? Нет, многие люди вводят его на клавиатуре быстрее, чем могут говорить. Прибавляем сюда спецсимволы, которые тоже нужно вводить, и получаем, что почти для всех это будет неудобно из-за скорости. А если учесть необходимость ввода паролей, то без тыкания в экранчик не обойтись. Инб4: скоро ещё и пароли будут не нужны. Нынешние разработки, стремящиеся к подобному, либо требуют ввода хотя бы одного пароля, либо рассчитаны на повышение безопасности при использовании вместе с традиционными методами защиты. Так что нескоро.

Навигация? Мышью она производится быстрее. Навести курсор на значок очень просто, а даблклик вообще мгновенен. Правда, это после некоторой практики. А если пытаться убрать значки с экрана, то на сцену выходят хоткеи. Запоминаются во время использования достаточно просто.

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

Не думаю, что голосовое управление лучше. Я считаю, что единственное, что у него есть - простота для новичка и удобство в отдельных ситуациях. Тыкать в экран проще, чем разбираться, как курсор реагирует на движения мыши. А говорить в микрофон ещё проще. Но за это платим эффективностью, и если голосовое управление будет повсеместно внедрено, то это случится не из-за преимущества последнего перед клавиатурами, а из-за расширения аудитории устройств с ним.
>> No.30424 Ответ
>>30419
> многие люди вводят его на клавиатуре быстрее, чем могут говорить.
Нет.
>> No.30426 Ответ
>>30424
Возьми да замерь. Я печатаю примерно в четыре раза быстрее, чем говорю, например.
>> No.30427 Ответ
>>30426
Замерил. Получилось примерно в 1,1 раз медленнее.

А у тебя дефект речи или сильное заикание. Сходи к врачу.
>> No.30429 Ответ
>>30413
Ты специально такой невнимательный или стараешься не въехать в смысл? Или это троллинг? Да нет, вроде бы на троллинг не похоже. Голосовой ввод когда-то тоже был говном, которым можно было пользоваться при определённых условиях, но потом технологию усовершенствовали и теперь ты можешь говорить хоть пальцем, хоть пиздой, хоть ртом, хоть жопой. Допустим, у меня есть теория о том, что палец каждого человека абсолютно уникален по одной очень неизвестной характеристике. Фильтровать шумы я уже научился. Да и каждая команда запрограммирована будет на определенный палец. И вот когда я смогу доказать теорию уникальности и реализовать девайс, уникально идентифицирующий владельца по пальцу, мы с тобой ещё поговорим, любитель поговорить в микофончик.
>> No.30430 Ответ
>>30416
> у одного мужика
wrong. Либо не у одного, либо это сосед моей двоюродной сестры. Мимика - штука рефлекторная, для ее осознанного контроля требуется сосредоточение, которое напряжно поддерживать при продолжительной работе за компом. Да и мышцы банально устанут.
>>30419
this
>>30424
Извини, няша, но ты не прав. Хрен со скоростью, но как ты например заменишь второе слово от края строки на полстраницы выше на синоним, используя голосовой ввод? как будешь осуществлять навигацию по сложным меню? Проговаривая каждый пункт? Так я и мышью, и клавиатурой справлюсь быстрей.
Эффективность такого интерфейса ниже, плюс, как я уже писал, невозможность работы с разделением голосового потока, например скайп заблокирует тебе вообще все взаимодействие с машиной , разве что жопой говорить научишься, так же как человек, говорящий рядом с тобой, музыка и еще много всего.
>> No.30450 Ответ
>>30430
Да, было бы глупо утверждать, что голосовое управление заменит большинство уже существующих. Рассматриваю только как фичу. Но вот голосовое управление + управление конечностями + виртуальная клавиатура в воздухе — это уже вытеснит любой планшет с 10+ уровнями нажатия и прочим. Хотя, возможно, это одно и то же получится. Интерфейс-то визуально не поменяется, даже если набор текста будет без физического соприкосновения.
>> No.30462 Ответ
>>30450
Согласен со всем, кроме
> Интерфейс-то визуально не поменяется
Сам подумай, интерфейс зависит именно от метода ввода. После появления той же мыши интерфейс кардинально изменился, да и вообще в той же восьмерке интерфейс СЛЕГКА изменился, не замечал?
Фантазировать на тему интерфейсов будущего можно долго, только толку нет. ИЗвините, но я не верю, что кто-то из вас будет причастен к их созданию. Не потому что вы плохие, а потому что вероятность этого исчезающе мала.
>> No.30475 Ответ
>>30462
Но ведь только слегка. Такие изменения случаются достаточно часто совершенно не по причине изобретения нового средства управления. Просто кто-то внезапно пониманиет, что вот так будет удобно. В восьмёрке, как раз таки, обратная ситуация — они наконец-то поняли, что созданный ими UI неудобен и расходует место впустую. Даже не знаю, что могло бы координально поменяться.
>> No.30476 Ответ
>>30475
кардинально
Пофиксил, не обессудь.

А так согласен с твоим мнением.
>>30462-кун
>> No.30477 Ответ
>>30476
Да ну? И как, лучше стало? Я просто блеванул и удалил это говно, после того как пять минут искал кнопку ребута компа, в конечном итоге по старинке ребутнув хоткеем.
>> No.30519 Ответ
Файл: 13553798379491.jpg
Jpg, 12.10 KB, 142×290 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
13553798379491.jpg
Раз уж нить о БеДешечках, расскажите мне вот чего, братишки.
На чём правильнее писать морды к БД? Разум подсказывает, что сисярп, хотелка хочет крестокутэ, реалии подталкивают к жаве. Дух задротства тянет к си-гтк Конечно, хочется быстро и расширяемо.
Как организовывать взаимодействие клиента с БД? Время говорит, что через библиотеку тупыми запросами только шифрование включи, мудила, опыт подсказывает, что за вечер на http(s)/xml, не исключаю, что есть рациональные способы (через свою реализацию сервера, ага).
Какую БД выбрать? В юношестве угорал по MySQL, знаком с Postgres и MSSQL, сейчас плотно сижу на SQLite (офигенная же!); да вообще разбираться не проблема.
С парадигмами гуишного программирования знаком обзорно, по ходу предполагается разобраться. (Задачи без фиксированных сроков, ибо для друзяшек)
Браузерные не предлагать, всё, что можно сделать под браузер, уже впендюривается на джанге.
>> No.30522 Ответ
>>30519
Самое удобное решение - это делфи. К сожалению, он умер, так что селяви.
Потом идет C#, правда для нормальных гуевин на winforms нужен devexpress, а у wpf достаточно высокий порог входа. Если есть возможно уломать заказчика на приобретение MSSQL - бери ее, очень удобная субд (агенты, xml и hierarchyid, выполнение кода на C# в субд, быстрые агрегаторы). По сути ее возможности почти безграничны, можно делать как угодно. Если же для заказчика это слишком дорого, тогда смотри в сторону Postgres, но предварительно проверь качество поддержки ОРМ-фреймворкам, который ты намерен использовать. Под дотнетами их достаточно много, я рекомендую Linq2Sql - он хоть и не развивается, но простой как пробка и не осложняет жизнь. Так же хороший Telerik OpenAccess, но он уже объемный и может потребоваться время на изучение. В местах сильного проседания перфоманса, где кэш не спасает, имеет смысл смотреть в сторону BLToolkit (у меня в проектах живут Linq2Sql и BLT). При наличии Linq в базу руками лазить смысла нет.
> подсказывает, что за вечер на http(s)/xml, не исключаю
Этого не понял. Какую архитектуру ты собрался использовать? Если ты про трёхуровневую, то клиент-серверное взаимодействие делается на WCF с полпинка.
> Задачи без фиксированных сроков, ибо для друзяшек
В такой ситуации СУБД практически безразлична, хотя для себя, если планируемый размер не переваливает за 10Гб, я выбираю MSSQL Express. В принципе в зависимости от того, надо ли куда деплоить или нет, возможны варианты. Я иногда бываю, если выберешь дотнеты, то можешь задавать свои вопросы. Я отвечу, если только местный мод-жмот меня не побанит.
>> No.30525 Ответ
>>30522 ох, ты разразился. Нет, у меня нет таких объёмов, не биллинги-мониторинги, просто crm-образные и прочие базы учёта всякой рабочей дребедени. С простыми прекрасно справляется браузер, django и SQLite, а те, что хочется реализовать, никак не лезут в браузер - интерфейсный обвес нужен. И вряд ли там будет гигабайт данных на самой большой. Просто хочется раз накатать да изредка допиливать.
> про трёхуровневую
подобных штук не писал, имел в виду отдачу из БД клиенту через веб-сервер по xml (это ведь лучше, чем прямое подключение к базе). Как вообще правильно - не знаю. MSSQL мне, в общем, нравится, но привязка к одной ОС несколько напрягает.
Вообще, я гуманитарий и вечный скиталец по провайдерам как сисадмин, реальный опыт, из "нормального", есть только в сишке. Но сишка тут придаст пикантности и прочих острых.
За советы спасибо, сейчас буду устанавливать все виндоусы.
>> No.30528 Ответ
>>30525
Если просто
> crm-образные и прочие базы учёта всякой рабочей дребедени
То для них и ExtJS хватит.
>> No.30537 Ответ
>>30522
Поясни-ка за Delphi.
>> No.30550 Ответ
>>30537
А чего там пояснять? Ты можешь на делфи, не написав ни строчки кода, сделать блокнот, а на винформах будет долго и болезненно осваивать косяки стандартных контролов. В делфи есть проблемы, но все делалось легко от входа. Даже в институте, когда на ОМД нам давали лабы по моделированию на делфи, то все делали, даже не приходя в сознание. А когда на 3 курсе на шарпе людей просили сделать грид + несколько полей для ввода, то уже начиналось разделение на "илита программирования" и тех кто ни в зуб ногой. Осло, когда MS решил делать XAML, могли бы хоть изучить формат dfm, который удобный и простой, что любой вася мог руками довести форму до нужного состояния, в каждой конторе по кодогенератору. Ну и на моей первой работе, было четко видно по проектам, сколько сил уходит на интерфейсы на плюсах, сколько на делфи, сколько на сишарп. Можешь также посмотреть на ПО ruwiki://Delphi_(язык_программирования)#.D0.98.D0.B7.D0.B2.D0.B5.D1.81[...]elphi дельфевое. Что касается именно морд для БД, то дефолтные средства превосходили сишарповые на порядок. Потом-то уже привыкаешь к любому тулкиту, будь то winforms или qt, но через страдание. А там сразу дело шло, только синтаксис паскалевский коробил, но это мелочи.
>> No.30557 Ответ
Файл: kote-negodue.jpg
Jpg, 46.77 KB, 604×402 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
kote-negodue.jpg
>>30550
Мне горько и больно смотреть на то, как умирает наша профессия.
>> No.30560 Ответ
Файл: 1249672693374.jpg
Jpg, 495.18 KB, 1600×1200 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
1249672693374.jpg
>>30557
Она, не умирает, а эволюционирует.
>> No.30563 Ответ
>>30560
> эволюционирует.
Деградирует
>> No.30674 Ответ
Чем отличаются SQL-99 от SQL-2011? Если учит по Граберу, описывающему SQL-99, то долго осваивать фичи и тонкости современного SQL?
>> No.30676 Ответ
>>30674
Имхо лучше сразу изучать конкретный прикладной sql типа mysql, postgresql, m$sql, sqlite. Или ты свой sql-2011-совместимый сервер писать собрался?
>> No.30677 Ответ
>>30522
> xml
Уебанский, неудобный, кондовый формат сериализации данных.
>> No.30678 Ответ
>>30676
Но надо сначала sql, а потом сам сервак учить, так?
>> No.30679 Ответ
>>30678
Ведь чтобы кодить на С++ учат С++, а потом уже вижуал-с++ и вижуал-студию учат. Но при этом надо знать именно С++11.
>> No.30680 Ответ
>>30677
Нет. Это вообще не формат для сериализации данных. Это язык разметки.
>> No.30682 Ответ
>>30680
Ну ладно, язык разметки, используемый в качестве формата сериализации данных. Но прилагательные те же.
>> No.30703 Ответ
>>30680
Зачем нужен xml, если есть лисповая гомоикона?
мимопроходил
>> No.30704 Ответ
>>30703
XML энтерпрайзен и мейнстримен.
>> No.30706 Ответ
>>30678
Не совсем.
В настоящий момент СУБД не реализуют не только SQL-99, но и часть возможностей SQL-92. И имеют некоторые свои несовместимые со стандартом фичи. Так что лучше сразу разбираться с диалектом. Потом уже почитать стандарты на досуге.
>> No.30707 Ответ
>>30704
Согласен, бро, XML в интырпрайзе просто вымораживает. Из-за него у нас простой отчёт об аудите базы данных формируется 7 секунд, а XML по нему для передачи по сети - 3 минуты.
>> No.30708 Ответ
>>30706
А что, старые стандарты не вложены в новые?
>> No.30709 Ответ
>>30707
Альтернатив нет.
>> No.30710 Ответ
>>30709
Толсто, бро. JSON, YAML, binary, наконец.
>> No.30718 Ответ
>>30710
Они не гарантируют целостность, там нет замыкающихся тегов.
>> No.30719 Ответ
>>30718
Лол. Добавь избыточности (CRC) в документ, будет тебе и проверка целостности.
Иксэмэли же не узнают, если что-то поломалось между тегами, ведь так?
>> No.30720 Ответ
>>30719
Да, ты прав.
>> No.30727 Ответ
>>30718
c:бурление важнее
>> No.30736 Ответ
Вложен. Когда противопоставлют стандарты SQL подразумеваются вощможности, которых не было в предыдущем стандарте.
>> No.30747 Ответ
Файл: 13000966246951.png
Png, 56.11 KB, 1319×656 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
13000966246951.png
Котоны, котоны, а ничего, если я тут спрошу?
Я тут хочу взять ерланговскую мнезию и запилить табличку игровых итемов. Вот только итемы бывают разные, потому у них есть куча свойств, которыми итем может обладать, а может не обладать.
Вот например {item, id, properties}:
{item, holy_shit, [{holy, 9000}, {weapon}, {food}]}
{item, bucket, [{headgear}, {footgear}, {container, 50}]}
Я, конечно, могу просто взять и впихнуть это в таблицу так, как я записал. В смысле, списком свойств. Но как правильнее? Лучше ли сделать таблицы holy, weapon, container, в которых будут айди итема?
>> No.30748 Ответ
Есть тут одна база. Единственная таблица в ней выглядит примерно так:
`sqlite> .schema dictionary
CREATE TABLE dictionary (key VARCHAR,
value VARCHAR);
CREATE INDEX ki ON dictionary(key);
sqlite> `
База живет на клиенте. Может стоит выбрать другую СУБД?
>> No.30749 Ответ
>>30747
> Лучше ли сделать таблицы на каждый чих.
Явное плождение сущностей.
> Но как правильнее?
Не уверен как правильнее, но я бы сделал 3 таблицы: Итемов, свойств и соответствия итемам свойств.
Хотя это все конечно можно ужать до одной таблицы, но тогда будет избыточность строк при наличия у одного итема более одного свойства.
>> No.30751 Ответ
Файл: 13000947602795.png
Png, 42.52 KB, 1319×656 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
13000947602795.png
>>30749
> 3 таблицы: Итемов, свойств и соответствия итемам свойств.
Количество атрибутов свойств же не будет совпадать. Вот даже в примере не совпадает.
> будет избыточность строк при наличия у одного итема более одного свойства.
Так я же в erlang:mnesia делаю. Я не делаю под кажндое свойство по атрибуту, я делаю один атрибут "свойства", куда сохраняю список неопределённой длины.
>> No.30752 Ответ
>>30751
Я переведу
У тебя есть таблица итемов, в котором устанавливается отношение hasmorethen_one отношение к свойствам из таблицы свойств через таблицу отношений. На пальцах:
Есть две таблицы (items, properties), и есть 3-я, в которой строчки имеют вид itemkey, propertykey, value
>> No.30754 Ответ
>>30751
Хм, а впрочем.
{item, id, name}
{svoystvo, id, property-list}
{sviaz, itemid, svoystvoid}
>> No.30755 Ответ
>>30754
> property-list
attribute-list, наверное.
>> No.30756 Ответ
>>30752
{item, id, string-name}
{svoystvo, id}
{sviaz, item-id, svoystvo-id, value}
Где value - что-то, что может принимать разные значения?
>> No.30757 Ответ
Файл: 128557643714[1].jpg
Jpg, 163.81 KB, 674×600 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
128557643714[1].jpg
Короче, я запутался.
>> No.30765 Ответ
Файл: Schema.jpg
Jpg, 49.58 KB, 1055×162 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
Schema.jpg
>>30757
А если так?
мимопроходил
>> No.30768 Ответ
Файл: 00032.png
Png, 132.68 KB, 828×576 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
00032.png
>>30765
Вот это же >>30756
Но вообще, я дошел до варианта
{player, id, name}
{player_item, player_id, property_id, count}
{item, id, name}
{item_property, item_id, property_id, count}
{property, id, name, value}
Тут плюс в том, что с одинаковыми проперти к итемам можно просто давать количественные всязи.

Вроде понятно. Теперь хардмод: у итемов бывают сокеты, в которые вставляются другие итемы(пока-что забываем про ограничения; любой другой итем). Из сокета юзер может вынимать и вставлять по своему усмотрению.
>> No.30771 Ответ
>>30768
> Теперь хардмод
Диблоклооон.
Адвокат.жпг
> {property, id, name, value}
value - лишнее, у тебя количество этого свойства указано в предыдущей таблице.
>> No.30773 Ответ
Файл: Schema.jpg
Jpg, 93.12 KB, 988×353 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
Schema.jpg
>>30768
Как-то так.
>> No.30775 Ответ
>>30773
> > у итемов бывают сокеты
Вангую у одного итема может быть несколько сокетов. И я не совсем понял нафига там Socket (int).
>> No.30776 Ответ
>>30768
где хардмод то? создаем итемам проперти - количество сокетов (можно добавить избыточность - количество свободных сокетов). Создаем отношение "вставлен" для двух итемов
>> No.30782 Ответ
Файл: Macros (827).jpg
Jpg, 45.52 KB, 573×382 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
Macros (827).jpg
>>30771
> value - лишнее, у тебя количество этого свойства указано в предыдущей таблице.
Качественные показатели-то не указаны. {property, 1, x, 10}, {property, 2, x, 20}, {property, 3, socket, [{max_size 30}, {min_size, 20}, {init, <some-item-id-or-null>}]}, {item-property, <какой-то-итем-id>, 3, 4(четыре сокета)}. Поскольку у меня БД динамически типизированная, то мне вообще хорошо будет в этом плане.
> Диблоклооон.
Сокеты не как в диабле. Любой итем сокетит любой, если подходят сокеты и разьемы. Лезвие и рукоятка, например.
>>30773
>>30776
А это похоже. Только не для итемов нужно было лепить эту табличку, а для player-item (так как итем - это что-то вроде набора возможных итемов, а у игрока конкретные итемы).
Socket(int) - это я так понимаю он угадал наперед, что мне нужно будет различать сокет1 и сокет2. Няшно, но, похоже, лучше сделать {soketed, with_player_item_id, in_player_item_id, property_id}, чтобы различать сокеты разных размеров.
И Slot у итема, судя по всему, что-то вроде информации, где находится итем(head, body, inventory).
>> No.30786 Ответ
Файл: Schema.jpg
Jpg, 184.80 KB, 1323×603 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
Schema.jpg
>>30782
Замучался каждый раз схему с нуля создавать, схоронил себе.

Видимо не совсем очевидно что у меня и зачем, поэтому пояснилово:
  • Player - игрок, с двумя контейнерами, под куклу и инвентарь.
  • Container - хранилище предметов, имеет емкость и связку с типами предметов, которые может хранить. Я бы объявил соглашение, что контейнер без связей с типами айтемов может хранить что угодно.
  • ContainerSupprortedTypes - табличка для хранения инфы о том, какой конт какие типы айтемов может хранить. Опционально - сколько он может хранить айтемов такого типа.
  • ItemTypes - тип предмета. Ну там, оружие/броня/бутылка. Думаю все равно он тебе понадобится.
  • ItemClass - класс предмета. Например "ржавый кинжал". Подразумевается что все ржавые кинжалы по свойствам одинаковы. Класс предмета знает, к какому типу сокетов он относится.
  • Items - экземпляр класса предметов. Знает конт, в котором лежит, если конечно лежит в контейнере, а не в сокете или на земле.
  • Sockets - табличка для сокетов айтема. Знает какого он типа, и какой айтем в нем лежит, если лежит.
  • SocketTypes - справочник возможных типов сокетов (ну там кргулый, треугольный например.)
  • ItemProperty - все так же справочник возможных свойств предмета.
  • ItemsProperties - табличка для хранения свойств предметов. Связи через тип и класс предмета определяют, какими свойствами предмет вообще обладает (и например начальными значениями). Связка через конкретный предмет определяет конкретное значения свойства для предмета.
При такой схеме очень желательно сделать валидацию своей логики в виде триггеров или хранимок на вставку/получение данных.

Вроде ничего не забыл.
>> No.30812 Ответ
>>30786
> Player - игрок, с двумя контейнерами, под куклу и инвентарь.
Бритвой тебя бы за такое. Вот тут как раз можно исползовать солбцы "кукла" и "инвентарь"
>> No.30813 Ответ
>>30812
Эм, а я дощечки использовал?
>> No.30814 Ответ
>>30813
оу, сори, я был слишком ночной
>> No.31767 Ответ
Файл: texas_12_by_dudewithad700-d4zsum0.jpg
Jpg, 199.22 KB, 1073×744 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
texas_12_by_dudewithad700-d4zsum0.jpg
Анон, помоги с SQL'ем.
Есть две таблицы.
TOPIC:
♦idtopic - id игры
♦OtherDataT
и
ANSWER:
♦idtopic
♦idanswer
♦OtherDataA
Мне нужно сгенерировать SQL запрос, что бы вывелось кол-во ответов в каждом топике.
Пробовал вот так:
SELECT topic.*, COUNT(topic.idtopic) FROM answer, topic WHERE answer.idtopic = topic.idtopic GROUP BY topic.idtopic
Но мне выводится только те ,в которых есть ответы. Как вывести вместе с ними и те в которых ответов нет?
>> No.31768 Ответ
>>31767
Сделай "JOIN ON" вместо "WHERE".
>> No.31769 Ответ
Файл: 514586.jpg
Jpg, 256.31 KB, 670×527 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
514586.jpg
>>31768
SELECT topic.*, COUNT(topic.idtopic) FROM topic LEFT JOIN answer ON answer.idtopic = topic.idtopic GROUP BY topic.idtopic
Сделал вот так, правда значения почему-то начинаются не с нуля. ЧЯДНТ? Спасибо.
>> No.31781 Ответ
>>31769
Надо добавить "ORDER BY ... ASC"
>> No.31794 Ответ
Файл: abstracted_by_chizulindson-d5npi3f.jpg
Jpg, 55.34 KB, 600×543 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
abstracted_by_chizulindson-d5npi3f.jpg
>>31781
SELECT topic.*, COUNT(topic.idtopic) FROM topic LEFT JOIN topic ON topic.idtopic = topic.idtopic GROUP BY topic.idtopic ORDER BY COUNT(topic.idtopic) ASC
У тех топиков в которых нет сообщений, почему-то показывает еденицу.
>> No.31795 Ответ
>>31794
> SELECT topic.*, COUNT(topic.idtopic) FROM topic LEFT JOIN topic ON topic.idtopic = topic.idtopic GROUP BY topic.idtopic ORDER BY COUNT(topic.idtopic) ASC
Ехал топик через топик
>> No.31798 Ответ
>>31794
SELECT topic.*, COUNT(answer.idtopic) AS answer_total
FROM topic
LEFT JOIN answer
ON topic.idtopic = answer.idtopic -- или наоборот?.. я ХЗ...
GROUP BY topic.idtopic
ORDER BY answer_total ASC
>> No.31799 Ответ
>>31798
Алсо, если захочешь добавить проверки на "answer.OtherDataA" - заталкивай их внутрь "JOIN-ON", как обычно с условием "WHERE", чтобы без них данные отбрасывались, то есть:

SELECT
...
FROM t1
LEFT JOIN t2
ON t1.id = t2.externalt1id
AND t2.datetime >= DATE_SUB( NOW(), INTERVAL 1 MONTH )
AND ...
...

Алсо, выдачу от запроса с группировкой можно пропустить через условие "HAVING", вот так:

HAVING answer_total > 10

но в данном случае это уж точно не нужно.
>> No.31800 Ответ
Файл: tumblr_ma5x6dbsCj...
Jpg, 95.03 KB, 500×609
edit Find source with google Find source with iqdb
tumblr_ma5x6dbsCj1qzoaqio1_500.jpg
Файл: 514577.jpg
Jpg, 294.93 KB, 670×446
edit Find source with google Find source with iqdb
514577.jpg

>>31799
Спасибо, анон, ты мне очень помог. Наверное, мне стоит потратить пару дней и поучить SQL нормально в спешке пилю бета-версию одной социалки не имея никаких знаний за душой.
>> No.31801 Ответ
>>31799
И ещё: сбивает с толку то, как в таблицах названы ключи. Обычно делается не так:
1) Первичные ключи называются просто "id", и соответственно, в таблицах должны быть "topic.id" и "answer.id"
2) Вторичные ключи (они ссылаются на первичные) называются через подчёркивание, то есть "answer.topic_id"

Теперь очень легко написать "JOIN", и не перепутаешь, когда "LEFT JOIN", а когда "RIGHT JOIN": если первичный ключ слева, то "LEFT", если справа - то "RIGHT".

Представь, что в левой руке держишь разъём для флешки, а в правой - флешку. Затем представь, что в левой руке "topic.id", а в правой - "answer.topic_id". Вот это задание, как и что и к чему присоединять, и надо написать на SQL.
>> No.31802 Ответ
>>31800
> в спешке пилю бета-версию одной социалки не имея никаких знаний за душой
Ах, ах, когда-то в 1993 году я вот так же пилил АРМ для таможенного терминала, тоже не имея ничего кроме учебника по MS Access 2.0

"Счастливое было время".
>> No.32937 Ответ
Дочитываю книжку грабера по sql. 2000-го года. У него нет никаких отклонений в сторону конкретных реализаций, а описываются стандарты sql92 и sql99, но в большей степени только то, что получило широкую поддержу. Что почитать для быстрого перехода на mysql? Применять буду для php для сайтов. Есть какая-нибудь книга а ля "переходи на mysql"?
>> No.32938 Ответ
>>29897
Кого мы смешиваем? Left, right и full - это три разновидности outer. К inner это не относится. Если написано left, right или full, то подразумевается outer, просто опущено для краткости, а если ничего не написано, то inner. Что по-твоему делают left и right inner? Это ж бессмыслица.
>> No.32986 Ответ
Какое ударение в слове курсор, имея в виду курсор в БД?
>> No.33029 Ответ
Файл: 03.jpg
Jpg, 173.52 KB, 1024×640
edit Find source with google Find source with iqdb
03.jpg
Файл: 02.jpg
Jpg, 58.67 KB, 1024×640
edit Find source with google Find source with iqdb
02.jpg
Файл: 01.jpg
Jpg, 69.48 KB, 1024×640
edit Find source with google Find source with iqdb
01.jpg

>>32937
> Применять буду для php для сайтов.
>> No.33030 Ответ
>>32986
КурсОр.

>>32987
Доброчан же. Не надо обманывать.
>> No.33039 Ответ
>>33029
R u OK? ЧЯДНТ?
>> No.33045 Ответ
>>32986
Курсóр. Причём не имеет значения, курсор БД ли это или какой другой курсор.
>>33030
Виноват, товарищ граммар-фюрер, ступил.
>> No.33053 Ответ
Файл: 12675604596181.gif
Gif, 21.08 KB, 500×500 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
12675604596181.gif
>> No.33064 Ответ
Файл: aragaki-ayase_00307495.jpg
Jpg, 145.49 KB, 1920×1080 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
aragaki-ayase_00307495.jpg
>>33053
Я думаю потом найти что-нибудь интереснее, но я хочу заработать немного в как можно более короткие сроки. Мне нужна какая-нибудь подработка для студентов. В конце концов - это лучше чем официант или курьер.
>> No.33065 Ответ
>>33064
Курьером лучше.
>> No.33069 Ответ
>>33065
Чем это?
>> No.33072 Ответ
>>33069
Чем пхп-обезьяной.
>> No.33159 Ответ
Отчаянная попытка настроить JDBC на ubuntu. Расскажите кто-нибудь про это, пожалуйста, лучше поподробнее, вероятно, мешает отсутствие понимания.
>> No.33248 Ответ
>>33159
Ты СУБД-то поставил?
>> No.33256 Ответ
>>33053
Анон, меня начало мутить от этого php. Думаю, может лучше взять ryby или python? На что больше вакансий и что лучше? Есть варик студенту без опыта заняться ruby на полставки или фрилансом?
>> No.33257 Ответ
>>33256
Варик это warcraft чтоли?
>> No.33258 Ответ
>>33256
Или варикозное расширение вен?
>> No.33259 Ответ
>>33258
>>33257
Я так и думал, что зря я так написал. Варик - это вариант, граммар-кэп с нами.
>> No.33260 Ответ
>>33248
Естественно. Поставил СУБД, поставил (вроде как) коннектор (libmysql-java), прописал classpath в /etc/environment, однако
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
не видит драйвер. Что я делаю нет так?
>> No.33269 Ответ
Пишу имиджборду, используя отдельную таблицу для файлов. Как лучше всего извлекать из базы данные для, например, отображения списка тредов на борде и их последних постов?
Пока что делаю select получения всех оп-постов на борде, потом select для списка файлов каждого оп-поста, потом для каждого оп-поста select, чтобы получить последние посты, и наконец для каждого из этих постов по select'у для извлечения файлов. Если переписать на псевдокоде, получится вроде
threads = selectAllThreads
for t in threads:
    threadFiles = selectFiles t
    lastPosts = selectLastPosts t
    for p in lastPosts:
        lastPostFiles = selectFiles p
        ...
Это, наверно, слишком не эффективно и следует переписать в один большой запрос, пошаманив с join. Я прав или оставить все как есть?
P.S. В SQL совсем ничего не понимаю и не умею, да.
>> No.33271 Ответ
>>33256
Лучше в команде всё-таки.
>> No.33275 Ответ
>>33269
Тебя окама бритвой в детстве порезал или ты переутрировал с псевдокодом? Напиши модели для треда, поста, файла, помести логику туда
>> No.33277 Ответ
>>33269
Алсо, ты все правильно делаешь, потому что рано или поздно перейдешь на дрянь, которая называется AJAX. Разве что файлы можно приджойнить к постам, но лучше сделать отдельный контролер для их закачки по id
>> No.33280 Ответ
Файл: 250 добра.jpg
Jpg, 180.89 KB, 880×400 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
250 добра.jpg
>>33275
>>33277
> Тебя окама бритвой в детстве порезал или ты переутрировал с псевдокодом?
Я даже не знаю, лол. Вот как оно выглядит на самом деле: https://github.com/ahushh/Monaba/blob/master/Handler/Board.hs#L46
> Напиши модели для треда, поста, файла, помести логику туда
Это я в общем-то понимаю, но не уверен, что в моем случае стоит писать обертки над обертками и класть их в файл с названием Model для большего соответствия MVC.
>> No.33281 Ответ
>>33280
Вау, а у тебя все там уже серьезно.
По поводу MVC: вот представь, что в один из дней ты захочешь запустить AJAX или вывесить JSON API. Чем чище MVC, тем меньше логики тебе придется выносить/дублировать. Твой фреймворк я правда в первый раз вижу, мб он заточен под другую архитектуру.
>> No.37457 Ответ
Файл: PzOfg.jpg
Jpg, 516.12 KB, 1722×1212
edit Find source with google Find source with iqdb
PzOfg.jpg
Файл: IMG_20140127_0815...
Jpg, 1038.01 KB, 2592×1944
edit Find source with google Find source with iqdb
IMG_20140127_081557.jpg

Не знаю, в тот ли тред пишу, но всё же. Анон, я прошу твоей помощи.
Пикрелейтед - задание, которое надо завтра сдавать. Я пытался сделать его на питоне в связке с sqlite, но у меня нихуя не получается. Не выходит банально вбить данные в таблицу.
Вот мои потуги: http://pastebin.com/kETcnfcB
Скажи мне, что я делаю не так, и как сделать правильно? И да, я не сильно знаком с sqlite, ибо до этого она мне не нужна была.
Мне не обязательно делать это на питоне с sqlite, можно хоть в Access'е, но я его непонимат совсем.
Держи няшку авансом.

к: депрессия умной
>> No.37458 Ответ
>>37457
Скопипасть задание куда-нибудь, не вижу нихрена.
>> No.37461 Ответ
>>37458
Компания выписывает счета своим клиентам в последний день каждого месяца. Если счет оказывается оплаченным до 10 числа следующего месяца, заказчик получает скидку в размере 1% от суммы счета, но не более двух долларов. В случае внесения платежа с 10 по 20 числа следующего месяца, с клиента взымается полная сумма счета. При оплате после 20 числа следующего месяца с клиента взымается пеня в размере 1% от суммы счета, но не больше 1 доллара. Напишите программу, которая начисляет сумму необходимой платы на печатную разницу между фактически оплаченной суммой и суммой счета.
Входные данные имеют следующую структуру:
Номер заказчика --- 6 цифр
Дата выписки счета --- (день, месяц, год)
Дата фактического расчета --- (день, месяц, год)
Сумма по счету --- 99999.99
Оплаченная сумма --- 99999.99
>> No.37463 Ответ
>>37457

days_diff = (ts_paid - ts_billed) / (3600 * 24);  #timestamps
fee = sum_billed / 100;

if (days_diff < 10)
	billed -= (fee < 2) ? fee : 2;
elseif (days_difff > 20)
	billed += (fee < 1) ? fee : 1;

diff = paid - billed
>> No.37464 Ответ
Это псевдокод, если что. И я не понял, к чем тут БД вообще, тащемта.
>> No.37465 Ответ
Файл: 7f545bb92a8147abf023ee7f99462a70.jpg
Jpg, 1058.56 KB, 779×1087 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
7f545bb92a8147abf023ee7f99462a70.jpg
>>37464
Ну, наверное потому, что надо работать с базой клиентов. Спасибо.
Правда всё еще проблема с тем, чтобы внести это всё в БД, ибо мне выдаёт что-то вроде parameters are of unsupported type, и я хз как с этим бороться.
>> No.37466 Ответ
>>37465
А, ну надо
dates = [(dtj(date(2013, 12, 31)), dtj(date(2014, 1, 4)))]
Но лучше таки использовать таймштампы, лол.
>> No.37467 Ответ
>>37466
Я просто не умею в таймштампы, по погуглю, спасибо.
>> No.37469 Ответ
А тебе обязательно трахацца с этим последним днем, когда выписывают счет? Этот объект статичный же.

Я бы сделал примерно так:

import datetime
now_date = datetime.date.today()

if now_date.day <= 10:
sum = sum - 2
elif now_date.day >= 10 and <= 20:
sum = sum
Ну как-то так. Мельком слыхал что в питоне с sqlite какой-то геморрой с датами, так надо изъёбываться.
>> No.37641 Ответ
>>29820
При попытке аутентефикации в БД возникает следующая ошибка: неверные данные о БД и/или пользователе! Error[08001][IBM][Cli Driver] sql1336N не был найден удаленный хост... Зависимости ODBC прописаны, файл host такой же, как и на машине, где аутентефикация проходит успешно. В чем может быть причина подобной ошибки?
>> No.37642 Ответ
Файл: tachikoma.jpg
Jpg, 45.18 KB, 440×346 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
tachikoma.jpg
Суп, котанчики.
Есть один проект на Oracle + Doctrine2. Мне дико вломы мудохаться с установкой oracle на девелоперской машине, можно ли Postgres вместо этого проприетарного говна использовать, достаточно ли оно совместимо?
>> No.37666 Ответ
Файл: 1267806663915.jpg
Jpg, 200.24 KB, 467×700 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
1267806663915.jpg
>>37641
Хи-хи, нужно было сделать уточнения в файлике host
>> No.38565 Ответ
Привет анон. Есть такая проблема, суть - есть сайт, который работает с MySQL. На этом сайте есть авторизация, список пользователей и паролей хранится в базе. Загвоздка в том, что я не знаю паролей пользователей и, следовательно, не могу зайти на сайт. Создаю нового пользователя с пустым паролем, всё равно никакого результата. Сразу говорю, сайт и прочее делал не я, поэтому и обращаюсь к тебе. Если нужна какая-то информация (исходники страничек с авторизацией) могу предоставить.
>> No.38570 Ответ
>>38565
Пароли хэшированы, если это не совсем школьная поделка.
Надо смотреть файл, где происходит логин, там будет метод этого хеширования.
>> No.38576 Ответ
>>38570
Дак в том то и дело, что я подобного не нашел. Где-то вычитал, что хешируется средствами MySQL, может ли быть такое?
>> No.38577 Ответ
>>38570
Дак в том то и дело, что я подобного не нашел. Где-то вычитал, что хешируется средствами MySQL, может ли быть такое?
>> No.38579 Ответ
>>38577
Да, может быть прямо в запросе обернуто в md5.
Показывай пример пароля и файл с логином, штоле.
>> No.38807 Ответ
Хочу запилить себе скрипт для сталкинга профилей тентаклика.
И вот что бы такое использовать для данных, чтобы ещё была некая версионность, т.е. досыпать свежак и иметь историю изменений.
Реляционная база как-то ниочинь сюда вписывается, как по мне. Есть может что из носкулоты?
>> No.38808 Ответ
>>38807
Добавь поле created_at типа datetime и будет тебе щастье.
>> No.38809 Ответ
>>38808
Это очень много всего. Альбомы, фоточки в них, всяке там посты на стеночках и прочая хуита. Всё парсить и повторять у себя? Слишком уж накладно. И просто схоронять целые снапы при каждом минимальном изменении тоже коряво.
В этом и вопрос.
>> No.38810 Ответ
>>37642
> достаточно ли оно совместимо
Совместимо на уровне SQL синтаксиса почти, есть ньюансы, но не на уровне прикладных библиотек для использования в приложениях.
>> No.38813 Ответ
>>38809
Общепринятого решения данной задачи нет. Велосипедить придется по-страшному.
>> No.39613 Ответ
Посоветуйте самую новую и глубокую книгу о СУБД обзорно и не только реляционных. Можно(нужно) на инглише.
>> No.39626 Ответ
>>39613
Алан Бьюли, "Изучаем SQL".
И вообще www.sql.ru -> раздел "проектирование баз данных".

И очень важный ориентир, смотри чтобы в книге не было эротично-завлекающих картинок с новой, только что вышедшей ОС от серьёзного, проверенного производителя (с хорошей репутацией и большими перспективами роста), эту литературу - сразу фтопку.

Увидишь на собеседованиях задротов, спрашивающих отличия MyISAM от InnoBiBi, пок пок пок кококо пок пок пок кококо КОНСОЛЬ КОНПЕЛЯЦИЯ КОНФИГГИ!!!ы - вежливо прощайся и уходи с собеседования, ловить в таких местах нечего, лучше на завод, там хоть на людей посмотришь, а не на
>> No.39627 Ответ
>>39626
Ты правда думаешь, что твой пост мне был чем-то полезен?
>> No.39633 Ответ
>>39626
> Два последние абзаца
Почему?
>> No.39637 Ответ
>>39633
Анон, молю, помоги составить запрос. На киберфоруме меня проигнорировали.
Суть такова: у меня есть следующие таблицы:
"преподаватели" (кодпреподавателя|кодкафедры|фамилия|имя|отчество),
"кафедры" (код_кафедры|название),
"предметы" (код_предмета|название),
"занятия" (кодзанятия|видзанятия),
"нагрузка" (коднагрузки|виднагрузки),
"результаты" (кодпреподавателя|кодпредмета|кодзанятия|коднагрузки|№_месяца|часы)

По заданию в конце каждого месяца преподаватель вводит данные в таблицу "результаты". По таблице "результаты" составляются отчёты, первый отчёт берёт преподавателей, и для каждого считает сумму часов по данному предмету, виду занятия и нагрузки. То есть получается следующее:
Петров Пётр Петрович | математика | лекции | основная | сумма всех часов
Петров Пётр Петрович | математика | контрольная | основная | сумма всех часов
Петров Пётр Петрович | математика |консультация | почасовая | сумма всех часов

Выложу сюда запрос, который сумел написать таки, он выводит информацию за определённый месяц и по определённому коду нагрузки.
SELECT
TEACHERS.FAM, TEACHERS.IMYA, TEACHERS.OTCH,
SUBJECTS.SUBJECTNAME, LESSONS.LESSONTYPE,
WEIGHT.W_TYPE, RESULTS.HOURS
FROM
TEACHERS, SUBJECTS, LESSONS,
WEIGHT, RESULTS
WHERE
(TEACHERS.TCODE = RESULTS.TCODE)
and (SUBJECTS.SCODE = RESULTS.SCODE)
and (LESSONS.LCODE = RESULTS.LCODE)
and (WEIGHT.WCODE = RESULTS.GCODE)
and (RESULTS.MONTH_NUMBER = 6 )
and (RESULTS.G_CODE = 2 );

Этот запрос по кодам из таблицы "результаты" возвращает мне нормальные имена и названия. Если анон сможет переделать его, чтоб он выполнял вышеописанное - благодарности моей не будет предела.
Надеюсь на вашу помощь.
>> No.39638 Ответ
>>39637
Просьба снимается, я вроде бы сделал что-то похожее на правду.
>> No.39643 Ответ
Файл: 3_circle_venn_diagram_l.png
Png, 148.10 KB, 678×635 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
3_circle_venn_diagram_l.png
>>39633
Потому, что SQL - это серьёзный бизнес. Должен быть.
А лезут в профессию всякие дети с хабрахабра, которым хватило бы и текстовых файлов + memcached.
>> No.39644 Ответ
Файл: left-join-2.png
Png, 3.65 KB, 854×291
edit Find source with google Find source with iqdb
left-join-2.png
Файл: left-join-1.png
Png, 4.82 KB, 859×290
edit Find source with google Find source with iqdb
left-join-1.png

>>39638
Теперь набей таблицы строчными буквами, а ключевые слова - капсом. И отступы не забудь.
Алсо, здесь была нужна конструкция "LEFT OUTER JOIN", т.к. преподаватель мог и не читать лекции в заданное время.
>> No.39645 Ответ
>>39643
Лезут - хуезут, дети - хуети. Есть вакансии и на них есть бирки с ценами. Какая ещё тут инфографика может быть, блядь? Мне задали на собеседовании именно этот вопрос между прочим и там была хорошая зарплата! За эти деньги я буду знать это.
> SQL - это серьёзный бизнес
> > и не только реляционных
Ты вообще читаешь, что написано в посте?
>> No.39658 Ответ
Файл: DeepInThought.jpg
Jpg, 68.53 KB, 800×600 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
DeepInThought.jpg
>>39645
> Лезут - хуезут, дети - хуети. Есть вакансии и на них есть бирки с ценами.
Во-во, такие, как ты. Сраная фирмешка ("ЛексПро" небось какое-нибудь) ищет гуру за копейки уже с 2009 года включительно, они ещё МЕНЯ ухитрились обосрать, да на них уже все давно крест поставили, они у всех нормальных людей уже в чёрном списке.

И тут прибегаеш ты и начинаеш ломиться в єту говноконтору - да ещё и баттхёрт, ITT, наблюдаю я.

Найди работу по знакомству, пора бы уже.
>> No.39661 Ответ
>>39658
Иди толстить куда-нибудь ещё.
>> No.39664 Ответ
>>39626
> И очень важный ориентир, смотри чтобы в книге не было эротично-завлекающих картинок с новой, только что вышедшей ОС от серьёзного, проверенного производителя (с хорошей репутацией и большими перспективами роста), эту литературу - сразу фтопку
Я так и не спросил. Где ты такие книги видел? О чём вообще речь? При чём тут ОС в конце концов. Я даже не знаю, что за ОС могли недавно выйти, о которых могли начать много писать, не говоря уже о их связях с субд...
>> No.39666 Ответ
>>39664
Он, наверное, клонит к тому, что изучать надо принципы, на крайняк - стандарты, но не конкретные продукты, которые сегодня
> с хорошей репутацией и большими перспективами роста
а завтра
> we're sorry to announce that the development of AcmeCorp Enterprise SQL Server has ended and no more releases are planned
>> No.39668 Ответ
>>39666
Такую книгу ещё найти надо, бля.
>> No.39726 Ответ
>>39643
Плохая диаграмма. Какой bash/perl у хипсторов? Теперь у нас сисадмины - хипсторы? я уж молчу о пхп.
>> No.42238 Ответ
Некробамп, но если кто поможет - буду оче благодарен.
Итак, есть у меня запрос, помогающий найти замноженные данные в таблице
SELECT t.num, COUNT(*) FROM table1 t WHERE t.num LIKE 'X' AND t.date>'DD.MM.YYYY'
GROUP BY t.num
HAVING COUNT(*)>1
Результат получается примерно такой
NUM COUNT
XXXXXXXX 2
XXXXXXXX 3
И так далее. Можно ли применить к данному запросу left join, чтобы я так же видел из связанных таблиц тип и дату выводимых данных в в столбце NUM? То есть, чтобы получалось примерно следующее:
NUM COUNT TYPE DATE
11111111 2 A DD.MM.YYYY
11111111 2 B DD.MM.YYYY
Заранее благодарен за совет/ответ.
>> No.42239 Ответ
>>42238
Так заджойни, а в чём проблема?
SELECT t.num, t2.type, COUNT(*) FROM table1 t LEFT JOIN table2 t2 on t1.num=t2.num ...
>> No.42240 Ответ
>>42239
А если тупо по num отсортировать? А вдруг быстрее будет.
>> No.42241 Ответ
>>42240
Не понял, что там сортировать и зачем.
>> No.42242 Ответ
>>42241
Если отсортировать по полю, то все строки, у которых оно равно, будут идти подряд рядом. А это то же самое. У меня есть подозрение, что такой джойн вылезет в квадратичную сложность, а сортировка могла бы дать n*log n. Надо проверять.
>> No.42243 Ответ
>>42242
Лол, что-то ты перемудриваешь.
> все строки, у которых оно равно, будут идти подряд рядом. А это то же самое.
То же самое с чем?
Вообще, не стоит пытаться делать работу СУБД самому, если тебя уже не прижимает по времени выполнения. Там есть оптимизатор и прочие ништяки, которые неплохо работают.
>> No.42244 Ответ
>>42243
> если тебя уже не прижимает по времени выполнения
Откуда ты знаешь, что оно не прижимает? А если прижимает? Если не прижимает, не стоит, а если прижимает, то стоит, все это понимают. Извини меня, переформулировка запросов и создание индексов - это самое первое. Обычно именно в СУБД оно и прижимает больше всего. Все индексы тоже за тебя оптимизатор создаст?
> Лол, что-то ты перемудриваешь.
Ну извини. Блин, бесит, я не предлагаю никому учить матан, но что такое n*log n уж могут все кодеры знать, я считаю.
> То же самое с чем?
С джойном. Схожий результат запроса.

Смотрите, щас он скажет, что "для моего говноблога нухй не нужны даже индексы". Или "и вообще мне хватило бы ёбаных файлов".
>> No.42245 Ответ
>>42244
Ну так сразу надо было спрашивать, как быстрее решить такую-то задачу - через джойн или через сортирование велосипедов.
А то я думал у тебя табличка в десять записей и ты не можешь сделать джойн. А потом сразу же хочешь эти десять записей выбрать с учетом последних достижений кибернетики.

Какие-то выпады с матанами и говноблогами, лол.
>> No.42246 Ответ
>>42245
Мы не знаем, сколько там записей у него. Может быть 10, а может и 100000. Я спросил про сортировку больше как теоретический отдельный вопрос.
>> No.42247 Ответ
>>42246
Я до сих пор не понял, что и зачем ты собрался сортировать и как оно сопоставимо с джойном. Напиши запрос, штоле.
>> No.42248 Ответ
>>42247
SELECT * -- Ну или что там за поля нужны
FROM table1
WHERE t.num LIKE 'X' AND t.date>'DD.MM.YYYY' -- Условие взятое из поста анона
ORDER BY num
Вот так. Все строки, у которых совпадает num, будут подряд идти. Эта мысль понятна?
>> No.42249 Ответ
>>42248
И что дальше?
>> No.42250 Ответ
>>42249
То же, что и джойном, но возможно это быстрее.
>> No.42251 Ответ
>>42250
Ты наркоман?
Группировка это сбор строк в группы по значению для передачи этих групп в агрегатные функции, в данном случае count.
Т.е. суть запроса в подсчете количества строк для каждого num. Джойн же тут используется чтобы заранее приляпать связанные поля другой таблицы для получения их в результатах.
>> No.42252 Ответ
>>42250
> То же, что и джойном
Но ты же и написал джойн... "where" как "left inner join" работает.
> но возможно это быстрее
Вряд ли, теперь надо пилить руками агрегирующую функцию вне СУБД...
>> No.42253 Ответ
>>42252
> Но ты же и написал джойн... "where" как "left inner join" работает.
Он написал сортировку, неизвестно зачем. Можно было селектить из двух таблиц с where, но это не лефт джойн, а иннер джойн.
>> No.42254 Ответ
>>42252
> Но ты же и написал джойн... "where" как "left inner join" работает.
Да это не то условие. Это условие у аноно было дополнительно. Просто отсеивание. По крайней мере, я так понял. Сама задача нахождения одинаковых у него решалась через group by, а ещё было это условие, которое просто отсеивает. Не знаю, зачем он его добавил.
> теперь надо пилить руками агрегирующую функцию вне СУБД...
А с джойном её разве не надо пилить? Или я что-то пропустил? Он же по одному запросу всё равно просто последовательность строк тебе сбросит и всё. Агрегирующая функция здесь будет окурратно за один проход по результирующей последовательности склеить/посчитать/что там надо одинаковые строки.
>> No.42256 Ответ
>>42254
Да, без "COUNT()" внутри запроса он в любом случае получит все строки, хоть с таким джойном, хоть с этаким, хоть с сортировкой, хоть без. Выкидывать агрегирующие ф-ции не надо, "быстрее" не получится, т.к. придётся тогда считать количество вне СУБД.

>>42238
Короче,
вначале сработают все условия внутри "WHERE", при этом данные из таблиц могут быть склеены,
затем условия внутри всех "INNER JOIN ON" и данные из таблиц будут склеены,
затем условия внутри оставшихся "JOIN ON" и данные из таблиц будут склеены с сохранением пустых полей (там, где данных не обнаружено, появятся "NULL"),
затем выполнится "GROUP BY" и агрегирующая функция, в данном случае "COUNT()",
затем поверх всего этого сработает условие "HAVING",
и затем будет выполнена сортировка из условия "ORDER BY" для оставшихся полей.

Есть ещё обработка скользящим окном, вместо "GROUP BY" написать "WINDOW OVER" или что-то ещё, уже и не помню, но в данном случае она не пригодится.
>> No.42257 Ответ
>>42254
Короче, вот моя мысль:

Есть два запроса:
SELECT * 
FROM  table1
ORDER BY name
И
SELECT * 
FROM  table1 a
JOIN table1 b ON a.name = b.name
И вроде на таблице с 1000 строк я наблюдаю, что первый намного быстрее.
>> No.42258 Ответ
>>42256
Или не совсем так? Все "JOIN" подряд один за другим, с появлением пустых полей или без них? Забыл...
>> No.42259 Ответ
>>42257
Джойнить надо по ключам: "a.ext_id = b.id"
И чтобы у этих полей были индексы.

А со строками будет медленно.
>> No.42260 Ответ
>>42256
> Выкидывать агрегирующие ф-ции не надо
Задача стоит, получить некие столбцы, значения которых у повторяющихся строк всё же разные. Поэтому и хочется убрать агрегацию на уровне СУБД, которая их тогда вообще не возвращает.
>> No.42261 Ответ
>>42257
>>42259
Да вы же поехавшие.
Анон считает количество строк каждого num и хотел добавить в результат значения для этих num из другой таблицы.
Какие сорты, пиздец.
>> No.42262 Ответ
>>42259
Задача стоит, найти строки, у которых одинаковые значения некоего столбца. Индекс по name создал.
>> No.42263 Ответ
>>42261
> из другой таблицы
Тьфу, блин. Вообще не понял задачу, значит. Я думал, надо разные значения этой таблицы внутри групп получить как-то.
анон, предлагавший сортить
>> No.42264 Ответ
>>42258
Да, точно,
1) вначале сработают все условия внутри "WHERE", при этом данные из таблиц могут быть склеены,
2) затем все условия внутри всех "JOIN ON", подряд, как они заданы, и данные из таблиц будут склеены, т.е. всё соберётся в одну таблицу, при этом, если задано "INNER JOIN ON", то при отсутствии данных строки исчезают, а если "OUTER" или просто "JOIN ON", то таблицы собираются в одну с сохранением пустых полей: там, где данных не обнаружено, появляются "NULL",
3) затем выполнится "GROUP BY" и агрегирующая функция, в данном случае "COUNT()", при этом строк станет меньше,
4) затем поверх всего этого сработает условие "HAVING" и часть строк будет отброшена,
5) затем будет выполнена сортировка из условия "ORDER BY" для оставшихся полей.

При этом,
1) Индексы ускорят выполнение, даже на первом шаге,
2) "LEFT/RIGHT JOIN" задаёт расположение первичного ключа: слева или справа,
3) Обработка скользящим окном: вместо "GROUP BY" задать "OVER (PARTITION BY)", для очень больших объёмов данных, порядка миллионов строк.
>> No.42265 Ответ
>>42263
А теперь перечитай всю эту наркоманию на сто постов со знанием этого.
>> No.42266 Ответ
>>42265
Да, да, обычный джойн должен всё сделать.
>> No.42267 Ответ
>>42262
SELECT 
    t.num      AS num,                         -- столбик из первой таблицы
    COUNT(t.*) AS count,                       -- агрегирующая функция, работает вместе с "GROUP BY"
    s.type     AS type,                        -- столбик из второй таблицы
    s.date     AS date                         -- столбик из второй таблицы
FROM 
    table1 t                                   -- table1 имеет первичный ключ "id"
LEFT OUTER JOIN
    table2 s                                   -- table2 имеет первичный ключ "id", а ещё
ON
    t.id = s.item_id                           -- там у каждой записи "item_id" и это жжж неспроста
AND
    t.num LIKE 'X'                             -- условие внутри джойна
AND 
    t.date > 'DD.MM.YYYY'                      -- условие внутри джойна
GROUP BY 
    t.id                                       -- я не знаю зойчем у вас поле "num" когда есть ключи
HAVING 
    count > 1                                  -- условие после группировки
ORDER BY 
    count ASC                                  -- отсортируем, чтобы быстрее найти
Затем пойти в цикле и если выбранное значение равно предыдущему — сообщим об етом:
prev_record = '';

foreach (records as record ) {
    if ( ... ) {
    } else {
    }

    prev_record = record
}
>> No.42268 Ответ
Файл: 640px-Facepalm_facepalm.png
Png, 20.25 KB, 640×461 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
640px-Facepalm_facepalm.png
>>42267
Группировать надо по num и джойнить тоже по num, читай >>42261 и оригинальный пост до просветления.
Вы все решили меня зотроллеть, ведь так?
>> No.42269 Ответ
>>42268
По стандартам 1992 года джойнить надо по ключам всё-таки. Может, в 1964 и джойнили по другим полям, но тогда ещё джойнов не было. Подробности: Андрей Орлов, «Записки автоматизатора», http://www.labirint.ru/fragment/175646/ — сцена с котлетами.
>> No.42270 Ответ
>>42269
До 92 делали where table1.field = table2.field, и ключи там не обязательны, очевидно.
Так что не вижу смысла в обязательности ключей. Хотя если есть ссылка на стандарат, то я б ознакомился.
>> No.42271 Ответ
>>42268
А зачем джойнить по num? В оригинальном посте написано "из связанных таблиц". Как вообще связаны эти таблицы? Разве они не связаны ключами? И вообще, кто так именует столбцы "num"? Что за num?
>> No.42272 Ответ
>>42271
Потому что раз мы группируем нумы, то они и важны и скорее всего имеют связь с чем-то вне, т.е. foreign key.
>> No.42273 Ответ
>>42272
В таком случае надо называть их по стандарту:
product.id
item.id
item.product_id
Чтобы затем написать:
FROM
    product
LEFT OUTER JOIN
    item
ON
    product.id = item.product_id
Получилось почти как в английском языке.
Зачем эти странные поля с артикулами товаров, Оккам бы не оценил.
>> No.42274 Ответ
>>42273
ПОТОМУШТО У НАС ТАКАЯ АРХИТЕКТУРА и всё работает вот уже двадцать лет.
Надо исходить из того, что известно.
>> No.42284 Ответ
>>42267
Уоу, вот это запрос.
На самом деле мне группировка не нужна, если будут данные из другой таблицы - мне главное найти повторяющиеся данные (через COUNT) и вытащить типы этих данных.
Скорость не особо нужна, обычно в БД не так много данных. Плюс, мне бы понять, как именно джойнить подобные запросы (именно через LEFT JOIN), желательно для новичка, каковым я и являюсь.
>> No.42286 Ответ
>>42271
Назвал num исключительно для примера. Связь с таблицей идет через другие данные, если перефразировать, что-то типа id_num
Если делать просто выборку типа данных по num, то выглядит примерно следующим образом:
select
t1.num,
t2.name
from table1
left join table2 t2 on t2.idn = t1.idn
>> No.42287 Ответ
>>42286
Ну вот так и делай, добавь свою группировку в конце этого.
Джойн сначала схлопывает таблицы вместе, а потом остальное отработает.
>> No.42782 Ответ
>>29820
Сап БДаны!
Есть проблема... БД PostgreSQL. Для бэкапа запускаю pg_dump из батника. Чтобы всё заверте~ приходится в этом же батнике в открытую прописывать пароль суперюзера.
Вопрос: А можно ли как-нибудь создать пользователя исключительно для дампа? Пользователь:
CREATE ROLE postbackup LOGIN
    ENCRYPTED PASSWORD 'md58924e1371a70b427c0c2f0ccc34b31b5'
    NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE REPLICATION;
с правом исключительно REPLICATION не прокатывает, возникает ошибка:
pg_dump: [archiver (db)] query failed: ERROR: permission denied for relation _yearoffset
pg_dump: [archiver (db)] query was: LOCK TABLE public._yearoffset IN ACCESS SHARE MODE
>> No.42783 Ответ
>>29821
> Как, блджад, запомнить разницу между inner\outer left\right join? Есть какая-нибудь мнемоника, что ли? У меня есть таблица, но она постоянно вылетает из гловы.
Разобрался уже, кстати? да, на дату поста посмотрел
>> No.42784 Ответ
Файл: SQL-Join-Venn-Diagrams.jpg
Jpg, 120.10 KB, 1536×864 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
SQL-Join-Venn-Diagrams.jpg
>>42783
Пикрелейтед
Пересечение - те, где есть и с той таблицы данные, и с той(пары строк из первой и второй таблиц). Левая половинка - где справа null(строки из первой табилцы без пары из второй), правая - где слева null(строки из второй таблицы без пары из первой).

Обрати только внимание, что у некоторых строк из одной таблицы может быть много строк из другой, так что строка может встречаться больше одного раза. Если нужно найти все строки первой таблицы, у которых существует хотя бы одна пара из второй, но без повторов, то нужно GROUP BY накладывать на id первой.

Ну и ещё учти, что это может быть одна и та же таблица дважды, не только две разные.
>> No.42785 Ответ
>>42784
А, и ещё. На самом деле LEFT, RIGHT и FULL - это разновидности OUTER(внешнее). Слово OUTER вроде можно ставить, но его пускают, как и слово INNER(внутреннее). По стандарту можно писать LEFT OUTER JOIN и INNER JOIN, но эти слова просто опустили как бесполезные. Все джойны LEFT, RIGHT и FULL считаются OUTER, а все джойны без указаний - INNER, так как иначе всё равно не может быть.
>> No.42786 Ответ
>>42785
>>42784
По-моему, все эти страсти с джойнами как раз из-за заумных объяснений. В 99% случаев достаточно знать inner join и left join.
inner используем, когда известно что есть совпадения для каждой строчки, или надо только с совпадающими.
left, когда похуй и надо просто прилепить некоторые поля, если для них есть совпадения.

right можно легко перепилить в left, а full вообще не нужен.
>> No.42787 Ответ
>>42786
Да что тут вообще сложного. Лефт и райт - это ОДНО И ТО ЖЕ, мать его, кого перепелить, только таблицы поменяны местами. Фул это просто лефт плюс райт. Перепилить, ёпта. По названиям всё по одним понятно. Райт и фул не во всех субд есть.
>> No.42790 Ответ
>>42784
>>42785
>>42786
>>42787
Блин, аноны. С чем-чем, с джойнами никогда проблем не было, кто может подсказать по Постгре? >>42782
>> No.42796 Ответ
>>42782
Имхо, вопрос "Можно ли создать в постресе роль на создание дампа" слишком специфичен, чтобы его на бордах спрашивать. С такими вопросами проще сразу идти на стековерфлоу(или на его же доску о бд в данном случае). Или внимательно и долго курить доку постгреса. На худой конец, если не знаешь инглиш, то русский стековерфлоу или тостер.
>> No.42823 Ответ
>>42796
> слишком специфичен, чтобы его на бордах спрашивать.
А вдруг на Доброченьке какой-нибудь гуру постгре подвис? Не попробуешь - не узнаешь.
>> No.42882 Ответ
Файл: logo_left.png
Png, 2.27 KB, 165×28 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
logo_left.png
Анон, помоги с MySQL.

Суть такова: Хочу засунуть в базу дробное число. Это число должно содержать ОДИН знак до точки и ЧЕТЫРЕ знака после точки и быть не меньше 0 и не больше 9.9999.

Выбираю тип - DECIMAL; Длина значения - 1,4
Выдаёт ошибку:
> #1427 - For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column 'Area').
То бишь цифра до точки не имеет права быть меньше цифры после точки.
По какому правилу это происходит, и что мне тогда писать в "длину значения" ?
>> No.42883 Ответ
>>42882
M это общая длина, а D - дробной части. Т.е. тебе надо 5,4.
>> No.42897 Ответ
Файл: 14317518541940.jpg
Jpg, 44.37 KB, 487×340 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
14317518541940.jpg
Бля, посоны посоветуйте что нибудь почитать. Надо короче научиться пользоваться Sqlite и заодно выучить sql и вкурить дзен реалиционых баз данных.
>> No.42900 Ответ
>>42897
Грабер или Дейт. В Sqlite так как-нибудь въедешь.
>> No.42904 Ответ
>>29829
Насколько я помню, синтаксис JOIN ON не является тру-каноничным по труъ стандарту SQL89
>> No.42905 Ответ
>>42904
А как же делать запросы с пустыми клетками в тех местах где данных не оказалось?
>> No.42906 Ответ
>> No.42908 Ответ
>>42904
Какой ещё каноничный синтаксис в SQL?
>> No.42909 Ответ
>>30747
Говорят, в таких случаях хорошо поможет NoSQL. Но можно попробовать прокрутить в контексте традиционной RDBMS. Тогда структура ДБ будет такой:
Таблица ITEMS:[ITEMS_PK, ITEM_SYMBOLIC (UNIQUE, но не ключ!), ITEM_PROPERTIES_FK (внешний ключ на таблицу ITEM_PROPERTIES)]
Таблица ITEM_PROPERTIES:[ITEM_PROPERTIES_RCRD_PK, HOLINESS_PROPERTY_FK, CONTAINER_PROPERTY_FK, IS_WEAPON, IS_HEADGEAR, IS_FOOTWEAR, IS_FOOD]
Таблица HOLINESS_PROPERTY:[HOLINESS_PROPERTY_ID, HOLINESS_AMOUNT]
Таблица CONTAINER_PROPERTY:[CONTAINER_PROPERTY_ID, CONTAINER_VALUE]
Тогда записи будут такими:
ITEMS:
{ITM001, 'holy_shit', PROP001}
{ITM002, 'bucket', PROP002}
ITEM_PROPERTIES:
{PROP001, HOLY001, null, true, false, false, true}
{PROP002, null, CONT001, false,true, true, false}
HOLINESS_PROPERTY:
{HOLY001, 9000}
CONTAINER_PROPERTY:
{CONT001, 50}
>> No.42928 Ответ
>>29820
О, этот тред как раз мне и нужен.
Есть немного говнокода на питоне:
try:
	cnxn = pyodbc.connect('DRIVER={Microsoft Access Driver (*.mdb)};DBQ='+dbPath)
	cursor = cnxn.cursor()
	try:
		with open(csvPath) as csvfile:
			reader = csv.DictReader(csvfile)
			for row in reader:
				cursor.execute("INSERT INTO DatosTecnica (IdTecnica,Nombre,TipoMuestra,ConstituyenteAsociado,Unidades,\
				RangoReferencia,FechaSesion,IdRegistroTecnica,ValorBlanco,FechaBlanco,NumCalibradores,ValorCalibrador,\
				FechaCalibrador,FactorCalibracion,Exportada,TecCalculada,BorderLine) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",
				(row['IdTecnica'],row['Nombre'],int(row['TipoMuestra']),row['ConstituyenteAsociado'],row['Unidades'],
				row['RangoReferencia'],'{ts\''+datetime.strptime(row['FechaSesion'],'%m/%d/%y %H:%M:%S').strftime('%Y-%m-%d %H:%M:%S')+'\'}',
				long(row['IdRegistroTecnica']),float(row['ValorBlanco']),'{ts\''+datetime.strptime(row['FechaBlanco'],'%m/%d/%y %H:%M:%S').strftime('%Y-%m-%d %H:%M:%S')+'\'}',
				long(row['NumCalibradores']),row['ValorCalibrador'],'{ts\''+datetime.strptime(row['FechaCalibrador'],'%m/%d/%y %H:%M:%S').strftime('%Y-%m-%d %H:%M:%S')+'\'}',
				row['FactorCalibracion'],int(row['Exportada']),int(row['TecCalculada']),row['BorderLine']))
	except (pyodbc.DataError,pyodbc.ProgrammingError) as e:
		print unicode(str(e.args[1]),encoding='cp1251');
except (pyodbc.Error) as e:
	print unicode(str(e.args[1]),encoding='cp1251');
cursor.close()
cnxn.commit()
cnxn.close()
Суть в том, что при запуске это говно госэ (odbc) сообщает мне о какой-то нереализованной возможности. Но что это за возможность и кто её не реализовал оно сообщить не потрудилось.
[HYC00] [Microsoft][Драйвер ODBC Microsoft Access]Дополнительная возможность не реализована  (106) (SQLBindParameter)
Как видно из кода он берёт из csv-шки строки и записывает их в бд Access (не спрашивайте зачем!). Хотя всё равно напишу - побилась БД с результатами за 4 года (было бы неприятно потерять), стандартными средствами от M$ не открывается и не восстанавливается, ошибка "Процесс остановлен ядром базы данных Jet т.к. другой пользователь пытается одновременно изменить те же данные", хотя другого пользователя в общем-то нет. В общем вытянул с этой поломанной БД данные с помощью mdb-dump из набора mdbtools, а он умеет только в csv. Теперь задача запихать две таблицы в чистую БД. Кроме odbc способов не знаю, питон потому что хочу. С датами по-разному пробовал, всё равно та же ошибка
>> No.42929 Ответ
>>42928
И вообще, ебал я этот ODBC с такими информативными ошибками.
HY000 	All bound columns are read-only. 	There must be an updatable column to use SQLSetPos or SQLBulkOperations to change or insert a row.
HY000 	An old netlib (%s) has been detected. Please delete it and restart the application. 	The netlib that was being loaded was out of date. The driver requires a newer netlib.

The problem could be a netlib in the current directory of the application, which is being loaded instead of the one in the system directory, or it could be that the netlib was not installed properly or is corrupted. If the netlib specified in the error text exists elsewhere than in the Windows system directory, delete it. If the netlib exists only in the system directory, install the client utilities on the client and restart the application.
HY000 	Attempt to bulk-copy a NULL value into a Server column which does not accept NULL values. 	The field contains a NULL value, but the column does not allow NULL values.
HY000 	Attempt to bulk-copy an oversized column to the SQL Server. 	The length supplied for a column is larger than the column definition in the table.
HY000 	Attempt to read unknown version of BCP format file. 	The header line in the bcp format file was not a recognized version.
HY000 	Bad bulk-copy direction. Must be either IN or OUT. 	The bcp_init call did not specify a valid direction for the eDirection parameter.
HY000 	Bad terminator. 	The terminator string supplied in bcp_bind is invalid.
HY000 	Bcp host-files must contain at least one column. 	No columns were selected to be loaded.
HY000 	Cannot generate SSPI context. 	The driver could not obtain an SSPI context required for integrated security. The native error will contain the Win32 error code.
HY000 	Cannot initialize SSPI package. 	The driver could not obtain an SSPI context required for integrated security. The native error will contain the Win32 error code.
HY000 	Communication module is not valid. Driver has not been correctly installed. 	The network library .dll is corrupted. Install the client utilities on the client and restart the application.
HY000 	Connection is busy with results for another hstmt. 	The SQL Server ODBC driver allows only one active hstmt. For more information, see Using Default Result Sets.
HY000 	Connection is not enabled for BCP. 	The application using the BCP API must set the SQLSetConnectAttr or SQL_SS_COPT_BCP attribute before connecting.
HY000 	Failure during closing of connection. 	The ConnectionClose function in the network library failed. This problem is typically caused by a network or SQL Server problem.
HY000 	For BCP, all variable-length data must have either a length-prefix or a terminator specified. 	bcp_bind was called with SQL_VARYLEN_DATA, but neither a prefix length nor a terminator was specified.
HY000 	Host-file columns may be skipped only when copying into the server. 	A bcp out format file specified that a column should be skipped. This is not allowed. Either create a view containing only the desired columns and bcp out from that view, or use the -Q flag to provide a SELECT statement selecting only the desired columns.
HY000 	Incorrect host-column number found in BCP format-file. 	The format file contains a column number greater than the number of columns in the table.
HY000 	I/O error while reading bcp data-file. 	 
HY000 	I/O error while reading BCP format file. 	 
HY000 	I/O error while writing bcp data-file. 	 
HY000 	I/O error while writing bcp error-file. 	 
HY000 	Invalid option. 	The eOption parameter to bcp_control was not valid.
HY000 	Non-default parameter not allowed after default parameter. 	Parameters to a stored procedure cannot have a non-default value after any preceding parameter has been specified with the default value.
HY000 	Not enough columns bound. 	For a bcp out, not all columns of the table were bound. Either create a view which contains only the desired columns and bcp out from that view or, use the -Q flag to provide a SELECT statement selecting only the desired columns.
HY000 	ODBC BCP/Driver version mismatch. 	The Sqlsrv32.dll and Odbcbcp.dll .dlls do not have identical versions. Install the client utilities on the client and restart the application.
HY000 	Protocol error in TDS stream. 	The TDS stream from the server is invalid. This problem is typically caused by a SQL Server problem. Check the SQL Server error log.
HY000 	Table contains less rows than first row count. 	A starting row number was supplied, but the table on the server did not contain that number of rows. No rows were copied to the host-file.
HY000 	Table contains less rows than last row count. 	An ending row number was supplied, but the table on the server did not contain that number of rows.
HY000 	Table has no text/image columns. 	bcp_moretext was called, but the table does not contain any text or image columns.
HY000 	TDS buffer length too large. 	The TDS stream from the server is invalid. This problem is typically caused by a SQL Server problem. Check the SQL Server error log.
HY000 	Text column data incomplete. 	The summation of the lengths supplied by bcp_moretext did not match the length supplied in bcp_bind or bcp_collen.
HY000 	The BCP host-file contains less rows than first row count. 	A starting row number was supplied, but the host-file did not contain that number of rows. No rows were loaded.
HY000 	The row length exceeds SQL Server's maximum allowable size. 	The summation of the data lengths for a row is larger than the maximum row size.
HY000 	The stored procedure required to complete this operation could not be found on the server (they were supplied with SQL Server). Please contact your system administrator. 	Install the ODBC catalog stored procedures by executing \Msqql\Install\Instcat.sql.
HY000 	Unable to load communication module. Driver has not been correctly installed. 	The network library .dll specified for the connection does not exist on this client. Install the client utilities on the client and restart the application.
HY000 	Unable to open BCP host data-file. 	The file name specified in the bcp_init call does not exist or is opened by another application.
HY000 	Unable to open BCP error-file. 	The error file name specified in the bcp_init call does not exist or is opened by another application.
HY000 	Unable to read driver version. 	The driver was unable to read the version block in its .DLL. Install the client utilities on the client and restart the application.
HY000 	Unexpected EOF encountered in BCP data-file. 	During a bcp in operation, end-of-file was detected on the data file while in the middle of processing the last row. This is typically caused by having a different number of columns, types, nullability, or sizes between the original table and the table being loaded.
HY000 	Unicode conversion failed. 	An error occurred during conversion to or from a Unicode string. The native error will contain the Win32 error code.
HY000 	Unicode conversion failed. The code page of the SQL server must be installed on the client system. 	The server code page must exist on the client for proper operation. Either clear the Auto Translate check box for the DSN or install the code page of the server on the client. The server code page can be determined by running EXEC sp_server_info 18.
HY000 	Unknown token received from SQL Server. 	The TDS stream from the server is invalid. This error is typically caused by a problem on the server. Check the SQL Server error log.
HY000 	Warning: Partial insert/update. The insert/update of a text or image column(s) did not succeed. 	A failure during insertion or update of a text, image, or ntext column occurred. That column will not contain the proper data. Roll back the transaction, if possible.
Какой осёл это придумал?
>> No.42930 Ответ
>>42928
Скорее всего какие-то форматопроблемы. Попробуй без плейсхолдеров, прогони через какой-то quote и вставляй сразу значения. Может взлетит, а может что-то поконкретнее скажет.
>> No.42931 Ответ
>>42928
>>42929
> использует напрямую то, что почти всегда используют даже не толкьто с одним, но и с несколькими слоями абстракции @ ошибки неинформативные
> Код со строками в мильён символов в длину. Попыток разделить куски кода, отвечающие за совершенно разные действия, нету.
> как обычно, вообще никак не отлаживает кроме как пялиться глазами на код
Ищи другую работу.
>> No.42932 Ответ
Нубский вопрос по MySQL+PHP.

А вот если я хочу чтобы одна колонка стала индексом для другой, это реально сделать ?

То есть вот таблица.
В ней допустим три колонки: ID, Name и Text.

И ты хочешь чтобы в PHP сценарии это выглядело допустим так:

mysql_query ....
$var = mysqlfetcharray ......

echo($var[Text][здесь содержимое поля Name]) --- и на выходе мы получаем содержимое поля Text, соответствующее содержимому поля Name.

MySQL так умеет ?
>> No.42933 Ответ
>>42932
mysql просто выдает значения, лол. А вот формирует структуры уже либа. Для пхп точно такое умеет PDO.
>> No.42937 Ответ
>>42932
Кури про PDO, различные ORM для php, фреймворки для php.
>> No.42940 Ответ
>>42931
Это не моя основная работа, просто захотелось помочь. Алсо я нигде не говорил что это великолепный код который не хочет работать из-за несовершенства мира. Я просто не люблю не информативные ошибки.
> @ ошибки неинформативные
Это ошибка ODBC, но он вместо более конкретного например "несоответствие типа" пишет какую-то хуиту (например тот же "Дополнительная возможность не реализована"), кроме того на один код ошибки у него с десяток вариантов проблемы. Разве это дело?
> использует напрямую то, что почти всегда используют даже не толкьто с одним, но и с несколькими слоями абстракции
Т.е. по-твоему нельзя делать запросы через odbc или что? Куда тут ещё абстракцию? И так я выполняю запросы в sql формате к файловой бд ms access через несколько промежуточных слоёв: python -> odbc -> драйвер ms access. Или ты знаешь ещё какой-то способ? Поделись.
> Код со строками в мильён символов в длину.
Не мильён, на мой экран влазит.
> Попыток разделить куски кода, отвечающие за совершенно разные действия, нету.
Нужно было чтоб работало, а на внешний вид кода вообще похуй - эта программа нужна на один раз.
Кстати самый большой кусок кода это sql запрос, куда его ещё разбивать?
> как обычно, вообще никак не отлаживает кроме как пялиться глазами на код
А каким образом отлаживать то, что связано с ODBC? Инфы толком нет. Поэтому вся отладка: пропробовал так - не работает, попробовал по-другому - не работает, попробовал по-третьему - заработало.

>>42930
> Скорее всего какие-то форматопроблемы.
Да, похоже на то. Кстати проблему решил. Когда оно выдало HY000 оказалось что была опечатка с лишней скобкой, а вот HYC00 из-за того, что оно не захотело принимать значения функции long, заменил long на int, заработало. Может плохо искал, но нигде не нашёл размер int в байтах для python
А изначально я копал немного не в том направлении, полагая что ему не нравится формат даты, а взлетело с изначальным вариантом: datetime.strptime(row['FechaBlanco'],'%m/%d/%y %H:%M:%S').
>> No.42952 Ответ
>>42940
> Может плохо искал, но нигде не нашёл размер int в байтах для python
Plain integers (also just called integers) are implemented using long in C, which gives them at least 32 bits of precision (sys.maxint is always set to the maximum plain integer value for the current platform, the minimum value is -sys.maxint - 1). Long integers have unlimited precision.

sys.maxint The largest positive integer supported by Python’s regular integer type. This is at least 2**31-1. The largest negative integer is -maxint-1 — the asymmetry results from the use of 2’s complement binary arithmetic.

То бишь как минимум 4 байта под int, но при этом оно может разрастись ещё больше, скажем на моей системе максимальное положительное значение для int (sys.maxint) не 2147483647 (4 байта), а 9223372036854775807 (8 байт). Enjoy your objects.
>> No.44149 Ответ
Файл: 9f5da61938b9e41ceb78814346e435b2.jpg
Jpg, 255.73 KB, 754×973 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
9f5da61938b9e41ceb78814346e435b2.jpg
Посоветуйте, с чего начать (в плане литературы), если в SQL полный ноль. С Ada/Pascal также не знаком.
>> No.44151 Ответ
>>44149
С Криса Дейта "Введение в системы баз данных" лучше всего. Если сильно хочется проще и быстрее, то книга Граббера, та, которая новее.
>> No.44311 Ответ
Вопрос по MySQL/

Вот данные в таблице: Колонка col1 содержит запаси "1", "3", NULL, "5".
Запрос такой:
SELECT ID FROM 'table' WHERE col1 != 5

То есть долны вылезти ID, соответствующие записям: "1", "3" и NULL.
А вылазит только то, что соответствует "1" и "3".
Он не хочет вытаскивать то, где записан NULL. Почему ?


captcha: победить штаб
>> No.44312 Ответ
>>44311
Потому что нуль это нуль, его нельзя сравнивать. Для этого есть конструкции IS NULL и IS NOT NULL.
>> No.44313 Ответ
>>44311
Этот вопрос требует внимательного понимания. Логика SQL всегда троичная. Логические операции =, <, > и прочие возвращают не TRUE и FALSE, а TRUE, FALSE и UNKNOWN. Любая из этих операций, если один из операндов - NULL, возвращает UNKNOWN. В предложении WHERE отсеиваются все, которые не TRUE, то есть и FALSE, и UNKNOWN. Как правило NULL всегда требует отдельных сравнений через специальные операторы IS NULL и IS NOT NULL. Например, x = NULL вообще всегда вернёт UNKNOWN вне зависимости от x, поэтому вместо этого пишут x IS NULL. Тебе для твоего случая надо написать явно col1 != 5 OR col1 IS NULL.
>> No.44314 Ответ
>>44312
Его можно сравнивать, ошибка при этом не бросается, просто будет UNKNOWN, который тоже не TRUE.
>> No.44315 Ответ
>>44314
Нельзя = не имеет смысла.
>> No.44316 Ответ
>>44315
Если ты напишешь col1 != 5 OR col1 IS NULL, то здесь всё ещё будет сравнение с NULL. На NULL, будет вычислено UNKNOWN OR TRUE, которые вычислится как TRUE. Ты такими объяснениями только всех запутаешь к херам.
>> No.44576 Ответ
Файл: faith.jpg
Jpg, 208.28 KB, 900×599 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
faith.jpg
Анон, помоги идентифицировать компонент для работы с БД.
Суть такова: есть приложение, которое подключается к оракловой БД. Исходников приложения нет, но доподлинно известно, что приложение написано на Delphi. К БД это приложение подключается при помощи строки подключения следующего формата: hostname:1521:sn=service.name. На обычную оракловую строку подключения (data source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hostname)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=service.name)))) эта строка не похожа, поэтому подключение наверняка идёт через какую-то стороннюю библиотеку. Внимание, вопрос: знаешь ли ты какую-то библиотеку для доступа к данным в Oracle, которая принимает на вход строку такого или похожего формата?
>> No.44577 Ответ
>>44314
> тоже не TRUE
Но и не FALSE.
>> No.44578 Ответ
>>44577
Ну что ты сказать то хотел? Не FALSE, да. Сравнивать можно. Я не запрещаю тебе. Реальные запросы выполняются с учётом UNKNOWN, UNKNOWN - это не экспешен и не обработка ошибок. TRUE OR UNKNOWN даёт обычное TRUE, иначе col1 != 5 OR col1 IS NULL не возвращало бы TRUE при col1 = NULL, а просто падало с ошибкой. Ты пытаешься намерить свой здравый смысл на язык, когда надо просто привыкнуть к тому, что есть.
>> No.45118 Ответ
Файл: chino1.png
Png, 255.88 KB, 700×905 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
chino1.png
Няши, а есть у кого материалы к оракловому курсу основ sql? Очень желательно с дампом учебной базы.
Я находил несколько месяцев назад на сайте оракла архив, но скачать он мне тогда не дал. А сейчас даже ссылку найти не могу
>> No.45119 Ответ
>>45118
Syntax error: Unexpected end of text, period sign expected.
>> No.45122 Ответ
>>45118
Нафига тебе дамп учебной базы? Создать пару таблиц и заполнить рандомными данными скриптиком можно и самому додуматься.
>> No.45125 Ответ
>>45122
Самому додуматься можно хоть до чего, в общем-то. Так сложилось, что мне нужны упражнения из того тренинга, а для них: готовая структура таблиц и данные в них. Да, можно и самостоятельно потратить на создание этого пару дней, но зачем изобретать давно изобретённый велосипед?
>> No.45126 Ответ
>>45125
> пару дней
30 минут
>> No.45127 Ответ
>>45125
Хотя, разве только если б там была куча хранимых процедур.
>> No.45269 Ответ
Хороший сайт: http://use-the-index-luke.com/
>> No.45292 Ответ
>>45269
>>45269
Вот вам для разогрева статья об эфективной пагинации: http://use-the-index-luke.com/sql/partial-results/fetch-next-page
TL;DR: избегайте LIMIT X, N и вместо этого используйте WHERE X > Y LIMIT N.
Вот статья по основам B-Tree и важности индексов: http://use-the-index-luke.com/sql/anatomy/the-tree
Может быть ничего нового для тех, кто серьезно изучал теорию баз данных (или поступил в ВУЗ, хз) но я если бы в свое время на сайт не наткнулся, то до сих пор остался бы в тени.
>> No.45359 Ответ
Файл: Безымянный.png
Png, 5.10 KB, 592×213 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
Безымянный.png
Вопрос по части PostgreSQL.
Имеется таблица readers с полями:
- index
- fio
- type
- grade
- speciality
- education

Необходимо ввести следующие запреты:
- если type = 1, то у записи нет поля speciality и education
- если type = 2, то у записи нет поля grade
- если type = 3, то у записи нет полей speciality, education и grade

Требуют это, как гарантию целостности данных, в моей дипломной.

Сказали, что для этого есть каталогизация или кластеризация, но что-то мне кажется, что я куда-то не туда гуглю:
http://www.postgresql.org/docs/9.2/static/sql-cluster.html
>> No.45360 Ответ
>>45359
> Вопрос
Как это сделать, разумеетя.
>> No.45388 Ответ
>>45359
Больше похоже на constraint типа check
>> No.45389 Ответ
>>45359
Т.е. в зависимости от поля type нужно нулами заполнять те или иные поля?
>> No.45445 Ответ
>>45388
Спасибо. Посмотрю.

>>45389
Сам не понял, если честно. Жду уточнений.
>> No.45448 Ответ
Как правильно получить значение конкретной ячейки в PostgreSQL?

Я, конечно, могу послать SELECT с указанием столбца и индекса и получить одноклеточную таблицу.

Но нельзя ли как-то запросить именно одно значение?
>> No.45449 Ответ
>>45448
Зачем? Это реализуется интерфейсом доступа.
А в рамках извращений можешь попробовать заалисить название колонки в пустое значение.
>> No.45455 Ответ
http://postgresql.ru.net/manual/sql-createdomain.html
Можно ли как-то более компактно обозначить список допустимых значений для столбца, чем нижеописанным способом?

CREATE DOMAIN tablename AS TEXT
CHECK(
VALUE ~ 'one'
OR VALUE ~ 'two'
OR VALUE ~ 'hau~au~'
);

Предполагается, что этот список будут периодически редактировать.
>> No.45456 Ответ
>>45455
Какбы есть enum http://postgresql.ru.net/manual/datatype-enum.html для фиксированного набора значений. Часто редактируемый список я бы запилил в отдельную таблицу, а в исходную пихал бы ключи из этой таблицы вместо значений.
>> No.45458 Ответ
>>45456
Спасибо. Подумаю над этим.
>> No.45459 Ответ
Файл: VFjAIehz55k.jpg
Jpg, 66.08 KB, 800×761 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
VFjAIehz55k.jpg
А можно ли в PostgreSQL сделать так, чтобы индекс таблицы заполнялся по умолчанию?
В духе: 1, 2, 3, 4...
Ничего не могу нагуглить.
>> No.45460 Ответ
>>45459
Sequence, google it.
>> No.45465 Ответ
>>45460
Спасибо.
Добра тебе.
>> No.45466 Ответ
>>45458
Почти всегда используют отдельную таблицы для значений.
>> No.45486 Ответ
Так что там на счет гуидов вместо Ид в мс скл? Какие подводные камни?
>> No.45487 Ответ
>> No.45489 Ответ
>>45486
Но зачем?
>> No.45509 Ответ
>>45489
Удобно синхронизировать базы всяких филиалов, например. Чтобы не делать композитные ключи в духе (филиал, айдишка).


Пароль:

[ /b/ /u/ /rf/ /dt/ /vg/ /r/ /cr/ /lor/ /mu/ /oe/ /s/ /w/ /hr/ ] [ /a/ /ma/ /sw/ /hau/ /azu/ ] [ /tv/ /cp/ /gf/ /bo/ /di/ /vn/ /ve/ /wh/ /fur/ /to/ /bg/ /wn/ /slow/ /mad/ ] [ /d/ /news/ ] [ Главная | Настройки | Закладки | Плеер ]