Да! Я имею в виду file_put_contents(), и я знаю что она не атомарна. Даже атомы не атомарны, не то что вызов file_put_contents или rename.
Если я делаю так: file_put_contents($this->filename, $this->toString()), то ни одно моё ошибочное действие в скрипте не сможет прервать процесс. Я уже защищён от промежуточных действий с моей стороны, где вероятность ошибки особенно велика.
Вероятность реального сбоя для вашего частного случая низка с обеими функциями. Мне кажется это тот случай, где преимущество скорее теоретическое, чем практическое. Отсюда и пример с кавычками — там тоже преимущество одного из вариантов налицо, но игра не стоит свеч.
Но, там где не получится использовать базу, всё равно буду использовать ваш подход, оно так спокойнее. Спасибо за статью, хорошо что подняли тему.
Вы это уже объясняли, все комменты я прочёл. Но в том то и дело что я сказал с оговоркой — атомарная на уровне интерпретатора. Понятно, что файл может быть записан наполовину, только ошибки в программе не могут к этому привести.
Для примера, строки в одинарных кавычках обрабатываются интерпретатором быстрее, чем в двойных. Вопрос в том, насколько ли быстрее, чтоб вообще уделять этому внимание. Здесь то же самое, ваш подход безопаснее, но настолько ли безопаснее, чтобы вообще говорить о нём?
Допустим, поменяли запись на переименование, но исправлена лишь очень малая часть потенциальных ошибок. Зато мы спокойны, всё сделали грамотно.
Просто вы так спокойно всё объясняете, хотел понять, может я чего-то не понял.
Ваш подход защищает от ошибок функции записи файла (атомарной для интерпретатора), заменой её на функцию переименования файла (атомарную для ОС).
Но так ли велика разница для 20 килобайтного файла конфига, который перезаписывается, ну, может 10 000 раз за время жизни проекта. Какова вероятность, что один подход сработает, и не сработает другой.
База данных даёт гораздо больше гарантий, если вам действительно нужны гарантии. SQLite весит килобайт под 300.
«Если мышка вам не очень нравится — считается себя счастливчиком. В Google Chrome огромное количество встроенных клавиатурных биндов (большинство из которых в точности повторяют....»
Звучит так, как будто приверженцев клавиатуры миновала кара небесная и они теперь счастливчики. Можно так:
Повезло и тем, кто не очень любит мышь, в Хроме уйма горячих клавиш, многие из них…
Вообще, основная проблема многих переводов — повсеместное использованием слов «вы», «ваш». Ну не принято так в русском. Режет слух. «переключает на номер таба, который вы выбрали». На номер нельзя переключить, можно только на сам таб, и не имеет значения, вы выбирали или кто-то другой, главное что всё-таки выбрали. Тогда «переключает на указанную вкладку».
А слова минималистический вообще нет. Как тут перевести не буду умничать, я не специалист. Но замечание выше сделали правильно, не стоило за это минусовать.
Удивительно быстрый Хром точно ли такой быстрый? У меня вот бывает, переключаешься на таб, и он его плааавно отрисовывает 5 секунд. И субъективно долго грузит страницы. В других браузерах всё в порядке, при том что табов открыто больше.
В консоли работает QuickLook и интерфейс с табами? Какие хорошие консольные файловые менеджеры есть для MacOS? Я бы даже обошёлся без поддержки русских имён файлов.
А то Мак лежит, пылится.
Для тех, кому не нужен полноценный файловый менеджер для работы с тысячами файлов на локальной и удалённых файловых системах — Finder отличная вещь, большего и не нужно.
Но вот полноценной замену Тотал Коммандеру для Мака нет. Наиболее близок ForkLift. Напишите, если кто-то знает лучше, потому что сейчас это pain in the ass.
Если для кого-то тема актуальна, не спешите.
С полгода назад я сменил пароль на 1.1.4, Ziphone. После чего Springboard начал циклично перезагружаться. В чём дело я не знал, сделал рестор, потерял все номера, фотки и SMS.
После рестора, конечно, опять поменял пароль. Необходимость повторного рестора убедила, что alpine достаточно хороший пароль.
Графика простая и схематичная, главное здесь - динамика игры.
Герою за определёное время нужно добраться до двери. Он способен прыгать на огромные расстояния и отталкиваться от стен, но дверь бывает так неудобно расположена, что непонятно как туда физически добраться. В ключевых точках заботливо расставлены мины. Самое классное - это убегать от роботов-собачек по узким коридорам или уворачиваться от самонаводящихся ракет.
Бросил играть из-за опасности разбить компьютер вдребезги или сорвать голос. Самое мясо начинается на любительских уровнях.
Они разделены на несколько типов. Головоломки, уровни на скорость, на ловкость, и такие, где нужно просто зажать стрелку вбок и наслаждаться результатом.
1. Правильно упакованный jQuery + gzip выливается в 12 кило на клиенте. Mootools и того меньше. Если же каждый плагин реализует кроссбраузерную работу с событиями, DOM, Ajax, то в сумме они могут весить гораздо больше, чем библиотека, в которой подобного дублирования кода нет.
2. Оптимизированные версии стандартных функций я добавляю как плагины во фреймворк, всё таки выигрыш по скорости в 5 раз - это не шутки.
3. Уровень кода в сторонних поделках очень низкий. Обычно я готов к тому, что придётся исправить 5-10 багов. Этот чёрт не так страшен, как его малюют.
Оптимальное решение для проекта любой сложности - использовать популярные библиотеки.
У них есть документация, они хорошо оптимизированы, протестированы. Новые люди знают как ими пользоваться. С выходом новой версии браузера добрые дяди без нас решают проблему совместимости.
// +60 баллов? Я в шоке. Я бы оштрафовал программера, которые начинает изобретать велосипед, причём далеко не самую удачную модель. Сейчас объясню почему.
Человек, которому поручат поддерживать такой код, очень обрадуется что ему кроме Prototype и jQuery теперь нужно постигать чьи-то недокументированные творения, которые чудесным образом перестанут работать со следующей версией IE.
Мой список полезных функций, которых почему-то нет во фреймворках:
isEmpty - возвращает true не только для undefined, false и 0, но также для [] и {}.
escapeHtml - преобразование html в entities, удивительно, но в явном виде есть не во всех фреймворках
toArray - преобразование объектов в массивы, полезно когда нужно сделать .pop() или узнать количество деток
date - форматирование дат, аналог функции date из PHP
Да, жалко, but this kostil works for me. Если воспринимать его как интерфейс, ориентированный на задачу. Например, табы в Skype видны только когда мне нужно поговорить, в остальное время они меня не беспокоят. То же самое с табами в браузере, там в основном собраны блоги. Как если бы панель задач я мог разбить на несколько кусочков и каждый привязать к собственному Space.
Кстати, как для экрана с разрешением меньше 3 мегапискелей, в Windows божественный таскбар по сравнению с.
Знакомый риторический приём. Если я недоволен общественным транспортом, качеством продуктов в супермаркете и или ценами на жильё, то это совсем не значит что тут же кинусь исправлять ситуацию.
А неуд неуду рознь, и у нас наверное разные ожидания. Здесь я говорю не о качестве самой вещи, а о качестве её презентации. Могу привести пример, кому бы я поставил зачёт. Это jQuery. Хоть и не фреймворк, но не так уж далеко от него.
Скажу другими словами. Если вы пишете "веб-фреймворк", то это не рассчитано на новичков, они не знают чем отличается разработка "с фреймворком" от "без фреймворка", может на словах и знают, но не на практике, они же новички. Таким образом из-за непонятных слов теряется часть аудитории. code-igniter.ru - это же красивый домен, думаю он обязывает.
Дальше я пишу на другую тему - информативность. Как ту же самую мысль можно высказать короче, не потеряв подробности.
Если вы в своё удовольствие переводите документацию для проекта, то наверное вам не безразлична его судьба. А главная страничка многое решает. Этого и касался мой пример с "быстрым и маленьким".
Теперь о манной каше. Недавно у нас на работе встал вопрос - продолжать писать на чистом PHP, или начать наконец-то пользоваться каким-то из модных фреймворков, возможно на другом языке. Причём люди, которым было поручено ознакамливаться - это не самые лучшие кадры, и английского не знают. Им нужно донести до начальства информацию, на основе которой будет принято решение. В идеальном мире это был бы список ссылок на главные страницы сайтов фреймворков. При том, что судьба CodeIgniter вам не безразлична, где бы вы посоветовали им искать эту информацию сегодня?
Ресурсы ограничены, нужно пересмотреть всё многообразие и выбрать пару фреймворков, которым потом устроить test drive. На этом этапе разжёваные концепции, за которые легко зацепиться - это главное. Сам я ставлю всем фреймворкам, включая Rails, оценку неуд.
Всё это мало касается руководства, поэтому не воспринимайте как критику вашей работы.
Вы же сделали прямой перевод? Я знаю что это нелегко. Но вот начинающий программист заходит на заглавную страничку, видит "исключительная производительность", "приложение фреймворк", "использует M-V-C", и уходит. Всё это для него пустой звук.
Страничка приятно сделана, но всё-таки это не для начинающих. И продвинутым программерам тоже нечего смотреть. Есть английская документация, которая, извините, читается нормально. Вы же не профессиональный переводчик? Калька с английского не бросается в глаза, но чувствуется.
Вот как можно передать смысл написанного на главной странице:
CodeIgniter - это простой, маленький и быстрый веб-фреймворк на PHP.
Он работает на самых простых конфигурациях и не требует громоздких дополнительных библиотек.
Останется много места для живой информации, а не десятка параграфов о том, что "сейчас всё будет".
Меня вот тоже Igniter не заинтересовал. Нужно поставить себя на место человека, выбирающего фреймворк. Дать ему информацию, необходимую для принятия решения. Привести список возможностей, сравнение с другими фреймворками, живые примеры. Никто не хочет тратить время и собирать всё по крупицам, а потом убедиться что ему это не подходит. Вот правильно сделал DHH со своим "блогом за 15 минут". Коротко, ясно и захватывающе. Это было чудесно.
Попалась строчка, которая действительно говорит что-то о фреймворке: $this->load->library('validation');
В целом у вас качественно сделано, я уверен что всё было не зря, в следующий раз надётся больше времени подумать о полной картине. Сайт надеюсь на CodeIgniter написан? :)
Если я делаю так: file_put_contents($this->filename, $this->toString()), то ни одно моё ошибочное действие в скрипте не сможет прервать процесс. Я уже защищён от промежуточных действий с моей стороны, где вероятность ошибки особенно велика.
Вероятность реального сбоя для вашего частного случая низка с обеими функциями. Мне кажется это тот случай, где преимущество скорее теоретическое, чем практическое. Отсюда и пример с кавычками — там тоже преимущество одного из вариантов налицо, но игра не стоит свеч.
Но, там где не получится использовать базу, всё равно буду использовать ваш подход, оно так спокойнее. Спасибо за статью, хорошо что подняли тему.
Для примера, строки в одинарных кавычках обрабатываются интерпретатором быстрее, чем в двойных. Вопрос в том, насколько ли быстрее, чтоб вообще уделять этому внимание. Здесь то же самое, ваш подход безопаснее, но настолько ли безопаснее, чтобы вообще говорить о нём?
Допустим, поменяли запись на переименование, но исправлена лишь очень малая часть потенциальных ошибок. Зато мы спокойны, всё сделали грамотно.
Просто вы так спокойно всё объясняете, хотел понять, может я чего-то не понял.
Но так ли велика разница для 20 килобайтного файла конфига, который перезаписывается, ну, может 10 000 раз за время жизни проекта. Какова вероятность, что один подход сработает, и не сработает другой.
База данных даёт гораздо больше гарантий, если вам действительно нужны гарантии. SQLite весит килобайт под 300.
«Если мышка вам не очень нравится — считается себя счастливчиком. В Google Chrome огромное количество встроенных клавиатурных биндов (большинство из которых в точности повторяют....»
Звучит так, как будто приверженцев клавиатуры миновала кара небесная и они теперь счастливчики. Можно так:
Повезло и тем, кто не очень любит мышь, в Хроме уйма горячих клавиш, многие из них…
Вообще, основная проблема многих переводов — повсеместное использованием слов «вы», «ваш». Ну не принято так в русском. Режет слух. «переключает на номер таба, который вы выбрали». На номер нельзя переключить, можно только на сам таб, и не имеет значения, вы выбирали или кто-то другой, главное что всё-таки выбрали. Тогда «переключает на указанную вкладку».
А слова минималистический вообще нет. Как тут перевести не буду умничать, я не специалист. Но замечание выше сделали правильно, не стоило за это минусовать.
А то Мак лежит, пылится.
Но вот полноценной замену Тотал Коммандеру для Мака нет. Наиболее близок ForkLift. Напишите, если кто-то знает лучше, потому что сейчас это pain in the ass.
С полгода назад я сменил пароль на 1.1.4, Ziphone. После чего Springboard начал циклично перезагружаться. В чём дело я не знал, сделал рестор, потерял все номера, фотки и SMS.
После рестора, конечно, опять поменял пароль. Необходимость повторного рестора убедила, что alpine достаточно хороший пароль.
Графика простая и схематичная, главное здесь - динамика игры.
Герою за определёное время нужно добраться до двери. Он способен прыгать на огромные расстояния и отталкиваться от стен, но дверь бывает так неудобно расположена, что непонятно как туда физически добраться. В ключевых точках заботливо расставлены мины. Самое классное - это убегать от роботов-собачек по узким коридорам или уворачиваться от самонаводящихся ракет.
Бросил играть из-за опасности разбить компьютер вдребезги или сорвать голос. Самое мясо начинается на любительских уровнях.
Они разделены на несколько типов. Головоломки, уровни на скорость, на ловкость, и такие, где нужно просто зажать стрелку вбок и наслаждаться результатом.
2. Оптимизированные версии стандартных функций я добавляю как плагины во фреймворк, всё таки выигрыш по скорости в 5 раз - это не шутки.
3. Уровень кода в сторонних поделках очень низкий. Обычно я готов к тому, что придётся исправить 5-10 багов. Этот чёрт не так страшен, как его малюют.
Оптимальное решение для проекта любой сложности - использовать популярные библиотеки.
У них есть документация, они хорошо оптимизированы, протестированы. Новые люди знают как ими пользоваться. С выходом новой версии браузера добрые дяди без нас решают проблему совместимости.
omg = {lol: {wut: 0}};
cloneObj(omg).lol.wut = 1;
alert(omg.lol.wut); // 1, omg lolwut?
Человек, которому поручат поддерживать такой код, очень обрадуется что ему кроме Prototype и jQuery теперь нужно постигать чьи-то недокументированные творения, которые чудесным образом перестанут работать со следующей версией IE.
Мой список полезных функций, которых почему-то нет во фреймворках:
isEmpty - возвращает true не только для undefined, false и 0, но также для [] и {}.
escapeHtml - преобразование html в entities, удивительно, но в явном виде есть не во всех фреймворках
toArray - преобразование объектов в массивы, полезно когда нужно сделать .pop() или узнать количество деток
date - форматирование дат, аналог функции date из PHP
Кстати, как для экрана с разрешением меньше 3 мегапискелей, в Windows божественный таскбар по сравнению с.
А неуд неуду рознь, и у нас наверное разные ожидания. Здесь я говорю не о качестве самой вещи, а о качестве её презентации. Могу привести пример, кому бы я поставил зачёт. Это jQuery. Хоть и не фреймворк, но не так уж далеко от него.
Дальше я пишу на другую тему - информативность. Как ту же самую мысль можно высказать короче, не потеряв подробности.
Если вы в своё удовольствие переводите документацию для проекта, то наверное вам не безразлична его судьба. А главная страничка многое решает. Этого и касался мой пример с "быстрым и маленьким".
Теперь о манной каше. Недавно у нас на работе встал вопрос - продолжать писать на чистом PHP, или начать наконец-то пользоваться каким-то из модных фреймворков, возможно на другом языке. Причём люди, которым было поручено ознакамливаться - это не самые лучшие кадры, и английского не знают. Им нужно донести до начальства информацию, на основе которой будет принято решение. В идеальном мире это был бы список ссылок на главные страницы сайтов фреймворков. При том, что судьба CodeIgniter вам не безразлична, где бы вы посоветовали им искать эту информацию сегодня?
Ресурсы ограничены, нужно пересмотреть всё многообразие и выбрать пару фреймворков, которым потом устроить test drive. На этом этапе разжёваные концепции, за которые легко зацепиться - это главное. Сам я ставлю всем фреймворкам, включая Rails, оценку неуд.
Всё это мало касается руководства, поэтому не воспринимайте как критику вашей работы.
Страничка приятно сделана, но всё-таки это не для начинающих. И продвинутым программерам тоже нечего смотреть. Есть английская документация, которая, извините, читается нормально. Вы же не профессиональный переводчик? Калька с английского не бросается в глаза, но чувствуется.
Вот как можно передать смысл написанного на главной странице:
CodeIgniter - это простой, маленький и быстрый веб-фреймворк на PHP.
Он работает на самых простых конфигурациях и не требует громоздких дополнительных библиотек.
Останется много места для живой информации, а не десятка параграфов о том, что "сейчас всё будет".
Меня вот тоже Igniter не заинтересовал. Нужно поставить себя на место человека, выбирающего фреймворк. Дать ему информацию, необходимую для принятия решения. Привести список возможностей, сравнение с другими фреймворками, живые примеры. Никто не хочет тратить время и собирать всё по крупицам, а потом убедиться что ему это не подходит. Вот правильно сделал DHH со своим "блогом за 15 минут". Коротко, ясно и захватывающе. Это было чудесно.
Попалась строчка, которая действительно говорит что-то о фреймворке: $this->load->library('validation');
В целом у вас качественно сделано, я уверен что всё было не зря, в следующий раз надётся больше времени подумать о полной картине. Сайт надеюсь на CodeIgniter написан? :)