All streams
Search
Write a publication
Pull to refresh
93
0
Григорий Борисович @naething

Пользователь

Send message
А что делать, если пассажиров несколько? Лепить все данные на одну страницу? А если кто-то покупает билеты на компанию из шести человек? Мне кажется, должно быть по одной странице с формой на каждого пассажира, а в конце сводка о всех введенных данных с возможностью вернуться на предыдущие страницы для их редактирования. На этой же странице должны быть кнопки «Купить билет сейчас» и «Забронировать билет». Еще неплохо было бы иметь возможность вернуться к странице выбора рейса без потери введенных данных о пассажирах. (Вдруг вы заполнили все данные, но вдруг поняли, что выбрали неправильный день).
Ага, зато надо «бегать» до кнопки Escape. По моему опыту, чаще оказывается проще стрелками перемещаться, не выходя из режима вставки, чем исполнять Esc, h/j/k/l, a/i.
Можно долго рассуждать про несовершенство школьной программы, фантазировать на тему индивидуального выбора предметов и так далее. По-моему, первоочередная проблема состоит в качестве учителей. Нужно поднять зарплаты учителям до достойного уровня и омолодить преподавательский состав. Нужно, чтобы учитель был мотивирован и не занимался экстремальным выживанием, иначе никакие революционные нововведения не помогут.
Вариант на C можно сделать в один проход, кстати.
uint32 hash_c(const char* str) {
uint32 h = 0;
while (*str)
h = 31*h + *str++;
return h;
}
Можно сделать примерно такой алгоритм. Задержку генерировать случайно, но при этом хранить в специальной переменной суммарную величину отставания/опережения. Как только эта величина выходит за допустимые рамки (30 секунд, например), каждый раз вычитать/прибавлять к случайной задержке один-два «тика», чтобы сместить случайные длительности в нужную сторону. Думаю, должно влезть в память без проблем.
Вот еще одно видео для вдохновения, 100% дерево: www.youtube.com/watch?v=fgbUV7xv_sk
Судя по отсутствию комментариев, никто не понял, о чем этот топик. Я тоже не понял. Стиль изложения скорее не академический, а «наукобразный». Или Вы под текстом в академическом стиле подразумеваете тот, который никто никогда не дочитает до конца? Лучше бы привели конкретный пример. Без него все это выглядит игрой слов и притянутой за уши математикой.

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

Для повторного использования разработанных модулей необходимо не только соблюдение принципов объектно-ориентированного программирования,

Как будто без объектно-ориентированного программирования невозможно повторное использование кода.
Прощу прощения, но из вашего вопроса было неясно, что нужен copyleft. Если нужен copyleft, но не знаю.
Смотря что подразумевается под «на основе». Если как в примере с одной строчкой, то вполне подойдут лицензии MIT:

Copyright © [year] by [copyright holders]

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the «Software»), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

[тут еще про No warranty и прочее]

Как видно, по сути единственное требование — включать исходный копирайт везде, где программа используется в том или ином виде.
> В этом-то всё и дело, в C++ typedef создаёт алиас для типа, и оба типа получаются взаимозаменяемы.

Да, само собой. Про «приводиться к Name и обратно» — это на случай, если typedef будет в будущем изменен на что-нибудь типа typedef MyString Name;.
Заминусовавшие, пожалуйста, прокомментируйте.

Вот довольно неплохая аргументация Торвальдса на эту тему: lkml.indiana.edu/hypermail/linux/kernel/0206.1/0402.html, хотя немного превязанная именно к ядру Linux.

Что вы выиграете, написав следующий код?
typedef string Name;
typedef string Surname;


Вы сможете использовать Name вместо string, когда будете использовать строку для хранения имени. Что же это даст? Если вы вдруг захотите использовать другой класс для хранения имени, то нужно будет лишь поменять typedef. Только это будет работать лишь в том случае, если новый класс будет на 100% совместим со string. Зачем такое вообще может понадобиться? Если вдруг и понадобится, всегда можно заменить тип на другой вручную — это не такая уж и большая работа.

Какой же ценой дается такое сомнительное удовольствие?
— Вы усложнили программу, добавив в пространство имен еще два новых имени для типа string. Как известно, не стоит плодить сущности без необходимости.
— Другому человеку (или вам через пару месяцев), читающему ваш код, придется лезть и смотреть, что же такое Name и Surname. Если бы он сразу видел string, ему сразу стало бы все понятно.
— Вы все равно будете работать с этим типом как со string. Так или иначе, когда вы будете работать с переменной, объявленной как Name, вам придется держать в голове то, что Name это string и работать соответствующим образом.
— Предположим, нужно вывести имя большими буквами. Пусть есть функция string capitalize(string s), которая меняет все маленькие буквы на заглавные и есть Name name;. У вас два варианта:
Name capitalized_name = capitalize(name);
или
string capitalized_name = capitalize(name);
Какой же из них выбрать? Если первый, то получится, что string должен приводится к Name и обратно. Если второй, то зачем же мы тогда объявляли Name, если используем string?

Таким образом, используя такой typedef, вы должны будете работать с Name так же, как со string. Для этого вам придется держать в голове дополнительную информацию.

Если же вы будете просто использовать string, вы сделаете программу гораздо более простой для понимания. Если вы видите string, то вам сразу все ясно. Используйте имена переменных для описания их предназначения, а не имена их типов.
Получился отличный пример злоупотребления typedef'ом. Никогда не стоит так делать, потому что это лишь усложняет программу и не приносит вообще никакой пользы. Вам теперь придется знать не только что такое Person, но и что такое Name и Surname.
Такой код может, кстати, и иметь смысл. Если функция NormalizeTrackType описана в этом же модуле и возвращает строковый литерал, то указатели будут совпадать.
Вы бы либо перевели тексты статей, либо ограничились ссылками на внешний ресурс, а то для большинства здесь присутствующих украинский язык неродной.
На всякий случай пример:
chmod -x+X+r-w,u+w -R dir

-x убирает право на исполнение у файлов,
+X при этом добавляет исполняемый бит на директории,
+r разрешает всем чтение,
-w запрещает всем запись,
u+w при этом разрешает запись владельцу

Ключ -R включает рекурсивный обход
Кстати, у chmod есть отличный ключ -R и модификатор X специально для директорий, так что весь тот велосипед зря написан.
Кавычки все-таки лучше оставить, а то мало ли что там в имени файла.
Ну из «недостижим, к нему можно лишь стремиться» еще нельзя заключить, что предела нет. Он может просто вне нужного нам множества лежать :)
Вроде бы не опенсорц, просто freeware.

Information

Rating
Does not participate
Location
Palo Alto, California, США
Date of birth
Registered
Activity