Интересная логическая ошибка

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

История:

Мы пишем много кода на Груви ( Groovy ) и как это бывает в любом языке по ходу написания допускаешь ошибки. На этот раз мы откопали ошибку в коде, которая была там походу долгое время, но не кто особо не обращал внимания, так как ошибка походу себя не проявляла да и была логическая, связанная с Груви. Для того что бы объяснить и показать что я имею ввиду, думаю приведу контраст между Груви и Жавой ( Java ).

Прелюдие:

Думаю все кто пишут на груви любят то что можно “изъясниться” кратко, в особенности по сравнению с жавой. Например посмотрим на класса “человек” написанный на жаве:

/** Java Code */
public class Person {
private String firstName;
private String lastName;

public String getFirstName() {
return firstName;
}

public void setFirstName(String firstName) {
this.firstName = firstName;
}

public String getLastName() {
return lastName;
}

public void setLastName(String lastName) {
this.lastName = lastName;
}

}

А теперь посмотрим на тот же класс написанный на друви:

/** Groovy Code */
class Person {
String firstName
String lastName
}

Думаю что не заметить разницы просто не возможно. Говорят что “краткость сестра таланта”, но в случае груви это приходит с определенной ценой.

Ошибка:

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

def list = [“Hello”, null, 2, false, “End”, “”, 0, “Me?”, true, 100]
def flist = []
def elist = []
list.each {
if(it) {
flist << it } else { elist << it } } println "flist:" flist.each { println "$it" } println "\nelist:" elist.each { println "$it" }

Логика данного кода такова:
У нас есть лист вещей, и мы его сортируем по критерии: “если вещь что-то из себя представляет, то есть не пуста то суем это в flist, если нет то в elist.

Вывод будет:

flist:
Hello
2
End
Me?
true
100

elist:
null
false

0

Что не верно, так как мы хотим получить все данные которые из себя что-то представляют. То есть “false” – это тоже даные как и ноль “0”, но вполне логично эти два значения попали в лист elist. В итоге тут логическая ошибка, так как false и 0 должны попасть в flist, а все происходит из-за динамичности и краткости груви. То есть груви на лету присваивает объекту определенный класс типо String или Integer и в соответствии с этим делает вывод при запросе в “if(it)”. То есть если у нас есть “Hello” то при эвалюации if(“Hello”) если значение “Hello” ( то есть String переменной ) не пустое ( “Hello” ) то мы получим ответ true, а если пустое ( “” ) то получим false. Но тот же самый код будет не верно определять если объект будет номером или буленом ( boolean ). То есть если мы спросим if(0) то тут же получим false, – а это противоположная реакция примеру с текстом. Но если мы спросим if(1) то получим true – то есть все что кроме 0 это правда ( true ), а если 0 то ответом будет не правда ( false ). Думаю не буду разбирать пример с буленом так как тут и так все понятно.

Починить этот баг очень просто, заменив всего одну линию:

if(it != null && it != “”)

Ответ на этот раз будет:

flist:
Hello
2
false
End
0
Me?
true
100

elist:
null

Если в этот пример хорошенько вдуматься то можно увидеть своего рода прикольную ошибку. Меня она лично порадовала, так как код будет работать правильно в большинстве случаев, но при этом код кривой. Жава а этот счет более адекватна, так как она не позволит сделать if(tmp) – так как она не динамична как груви, но и писать нужно будет больше кода. Вот пример примерно того же только на Жаве:

Vector list = new Vector();
Vector flist = new Vector();
Vector elist = new Vector();

list.add(“Hello”);
list.add(null);
list.add(2);
list.add(false);
list.add(“End”);
list.add(“”);
list.add(0);
list.add(“Me?”);
list.add(true);
list.add(100);

for (Iterator it = list.iterator(); it.hasNext();) {
Object o = it.next();
if(o instanceof java.lang.String) {
if(o != “”) flist.add(o);
else elist.add(o);
}
if(o instanceof java.lang.Integer) {
flist.add(o);
}
if(o == null) {
elist.add(o);
}
}
System.out.println(“flist:”);
for (Iterator it = flist.iterator(); it.hasNext();) {
System.out.println(it.next());
}
System.out.println(“\nelist:”);
for (Iterator it = elist.iterator(); it.hasNext();) {
System.out.println(it.next());
}

Кода больше, а по сути делает тоже самое. Хотя не совсем, этот код довольно лимитирован тем что может быть в листе, на данный момент только String, Integer и просто null. Но все же забавно!

Ладно у кого будут мысли пишите, а я спать.

TV подписка

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

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

Программа для подписки на скачивание сериалов через торренты уже тут и называется TVShows. На сколько я понимаю пока она только под одну платформу и это Мак. Но эта программа с открытым кодом, так что если кому приспичит то можно написать версии и под другие платформы. Сразу скажу что программа использует eztv.it как ресурс для поиска и скачивания торрентов. Сайтом можно пользоваться и отдельно, но TVShows делает весь процесс очень простым и до ужаса удобным. Все что нужно так это указать какое качество хочешь, какие сериалы нужны, с какого эпизода начать следить и в какую папку скидывать торренты. Дальше все происходит на полном автомате и можно даже забыть что программа вообще существует. Написана она довольно хорошо, так как раз указал что хочешь, она будет сама проверять если есть новые эпизоды и гонять её постоянно не надо, так как там стоит небольшой процесс, который тихо работает и без включенной самой программы.

Тут кто-то может сказать, СТОП! Это не ново и было все это давно и все такое, мол вот посмотри… бла-бла-бла. Да это не ново, RSS были уже давно и можно было написать скрипт или уже скачать готовый который бы делали все тоже самое. Местами такие вещи уже давно существовали в разных torrent клиентах. Тогда в чем фокус? А дело все в том что нужно было что-то писать ручками или скриптовать или делать какие-то дополнительные тело движения, которые я лично не хотел делать и мне всегда казалось что все это можно сделать на много проще и красивей. И вот именно это TVShows и делать. Там не нужно писать какие-то конфигурации или скрипты или делать лишние телодвижения. Все просто, нажал сюда, туда, выбрал сериалы и все готово. В этом и состоит основное преимущество программы.

Думаю нужно отдать должное авторам и поблагодарить за такую хорошую софтину. Благодаря ей больше не прийдется сидеть и ручками проверять, выбирать и скачивать сериалы которые хочешь смотреть, все просто: нашел, подписался и больше об этом не думаешь.

Чирз!

Оптимизация и паковка CSS & JS

Сегодня весь день провел копая код сайта. На этой неделя я нашел довольно базовый, но при этом прикольный планировщик проектов, называется он Collabtive. В принципе под нужды он подходит и внутри бегает все просто. Работает это дело на PHP и поскольку с этим я знаком то работа прошла плавно.

Зачем?

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

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

Что делать?

Сделать тут в принципе можно пару вещей, которые я и воплотил в жизнь:

– Посмотреть на код приложения и убедиться что оптимизации там нет или она не полная. То есть если все и так оптимизированно, сжато и вообще дальше уже некуда, то и сделать тут уже ничего нельзя.

– Далее обратить внимание на то что грузиться ( CSS и JavaScript ):

– В этом вам поможет пара хороших плагинов для Firefox: FireBug и Web Developer. Хочу отметить что Web Developer местами выдает не правильную информацию, но это можно легко компенсировать FireBug-ом.

Ну а дальше идет две линии обороны:

– Первое это почистить сами CSS и JavaScript. Конечно самое лучшее это пройти глазами и ручками подправить код там где нужно, но у кого есть время что бы просматривать сотни, а то и тысячи линий кода? Итого мы используем два сайта, которые вам вычистят код: CSS compressor для CSS и YUI Compressor для CSS и JavaScript. Эти два сайта помогли мне срезать от 5 до 40 процентов веса всех CSS и JavaScript-ов.

– Вторая линия обороны это gZip. Это дело компрессирует любой текст и отправляет к пользователю уже довольно упакованную версию уже и так очищенных CSS и JavaScript-ов. Поскольку программа работает на PHP и сервер поддерживает gZip то все что остается это в CSS файл добавить ниже описанный под, назвать это “название.php” и вставить это в header файл ( вот: <link rel=”stylesheet” type=”text/css” href=”templates/frost/css/style_form.php”/> ).

<?php
ob_start(“ob_gzhandler”);
header(“Content-type: text/css; charset: UTF-8”);
header(“Cache-Control: must-revalidate”);
$offset = 60 * 60 ;
$ExpStr = “Expires:” .
gmdate(“D, d M Y H:i:s”,time() + $offset) . “GMT”;
header($ExpStr);
?>

Точно такое же можно сделать и для JavaScript лишь меняя одну строку:

header(“Content-type: text/javascript; charset=utf-8”);

И это работает?

Без сомнений это работает. Как я уже сказал ранее, в Web Developer плагине есть недочеты и некоторые скриптовые файлы там не учлись, но даже при этом результаты хорошие. Вот пример данных FireBug-а после того как я уже оптимизировал часть сайта. А следующий скриншот это после того как я все доделал.

В итоге я добился с 327KB на 139KB, что не может не впечатлять. Вечером я тестировал сайт у знакомого и в итоге у меня получалось что каждая страница грузилась в районе 3-5 секунд без кэша, а с кешем это превращалось в 1-3 секунды. Результаты поразительные с учетом того что раньше сайт грузился по 12-15 секунд и страницы бегали куда менее живее даже с кэшем.

Itogo:

Итого могу сказать только одно: оптимизируйте и будет вам счастье.

P.S: Пока сидел и делал тесты, я думал а почему разработчики софта сразу все не оптимизировали? Я пришел только к одному выводу, что бы код работал +/- везде, его не оптимизируют, так как что если на сервере нету gZip? А что если чищенный скрипт не будет правильно читаться? И так далее… Я конечно не знаю, но это объяснение самое логичное на данный момент. Если у кого будут мысли то пишите.

Hackintosh в новый год.

Сегодня мне в руки попала интересная машина: Gateway NV53 и после недолгого поиска в интернете я решил что можно попробовать на неё поставить снежного леопарда ( Mac os 10.6 ).

В интернете есть довольно хорошие инструкции о как и что и куда… Но все же hack job это hack job. Сперва я скачал не тот EmpireEFI 4 AMD, но это я как-то быстро понял и нашел вроде как нужный. Потом долго ставил систему. Но и это было все ничего… полная не маза была в том что некоторые важные вещи работали криво или не работали вообще. Нет конечно Mac OS X работала и грузилась и все такое. Так же я уверен что если бы я поковырял это дело чуть по дольше то заставил бы систему работать +/- хорошо, но к сожалению от дров ( drivers ) никуда не убежать!

Фишка в том что после некоторых патчей отвалилась клава ( лаптоповская ) и мышка/track pad. Хотя в теории этого не должно было произойти! Так же по какой-то странной причине сетевая карта так и не заработала, не говоря уже о синим зубе ( bluetooth ), но даже с этими успехами, безпроводка ( WiFi ) работала довольно хорошо и стабильно. Но не этим мы живем! Видео карта даже с +/- криво-прямыми дровами все равно работала хреново… хотя там был заумный хак! А именно нужно было открыть “Photo Booth” и тогда видео ( с youtube ) гонялось без лагов и тормозов – странно, но вот так вот и работает! Аудио карта заработала после установки дров, но при этом не было микрофона… и самое не красивое заключалось в том что иконка звука в верхней панели тоже не работала… то есть она там, но звук не делает тише/громче… при этом через “панель настроек” звук можно регулировать – отлично! Так же звук не регулировался через “налаптопные” кнопки, которые я не уверен если должны работать или нет, но это ещё один минус. После всего этого я решил забить на всю идею! Да и чуть не забыл, хоть я ставил систему на лаптоп и строго следовал инструкциям, но все равно система говорила что у меня нету батареи! Сперва была иконка и она сообщала что “нету в вас батареи”, а потом иконка вообще пропала, видимо подумала что не стоит мозолить глаза раз батареи и так нету.

Конечно можно возиться и все такое, но ребята на форуме говорят что пока нету прямых ( правильных ) дров, то не звук, не видео как и все остальное правильно ( на все 100 ) работать не будет. И на сколько я понял писать все это дело никто не собирается. Но это не конец хакентошу, так как всегда можно купить правильное железо, которое совместимо с OS X дравами и все же это становиться накладно, хотя местами цена оправдывает мучения. Под этим я конечно же имею ввиду когда ребята собирают супер мощные десктоп машины, где цена на оригинал от Аппла будет в 3-5 раз выше и соответственно когда переводишь это на реальные деньги то альтернатива по цене в $2000 ( покупая все по деталям ) будет ну на очень много дешевле чем оригинал. Думаю тогда это того стоит! Хотя все же остаются проблемы с апдейтами ( оффициальные ставить нельзя ) и лично у меня была бы дрож при любой установке софта. Но каждому свое!

Для себя я решил что лучше все же или ставить винду или линукс или покупать оригинальный мак. Скажу только одно, если с хакентошом столько нужно возиться, то это не как не лучше линукса где нужно все настраивать до опупения, но потом все работает до конца света или той же винды, где настраиваться особо ничего не нужно, но постоянно нужно за всем следить, а то не дай Б-г что-то залезет или какая нить программа настроит то что не нужно. Вся маза мака именно в том что все красиво работает и все что пользователю нужно знать, так это как нажимать update и радоваться жизни. Конечно рано или поздно это может измениться, но пока что в этом и есть весь цимис, будь ты программистом/техником или домохозяйкой.

Чирз!

P.S: Кому интересно вот пара фоток:

P.P.S: Возможно моя критика Линуксы и Видны не оправдана, но таков мой опыт…

iPhone 3GS + 06.15.00 = GPS проблема

Прошло пару дней, мой iPhone 3GS с 06.15.00 работает хорошо, но сегодня пока ехал в Торонто я решил попробовать GPS и тут меня накрыло… так как GPS не работал. Сперва я думал что я поставил что-то криво, но после того как я переставил прошивку, что тоже прошло не особо гладко ( айФон застрял в recovery ) я покопался на сайте dev team и нашел заметку #5 ( update 5 ) и там как раз говорилось о проблеме GPS. Потом я покопался в комментах и нашел одно объяснение. На сколько я понял все дело в том что в айПаде и айФоне стоят разные GPS чипы и как следствие baseband софт не правильно работает с адресацией. Вообщем я не вдавался в подробности, но факт остается фактом, GPS работает криво и по большому счету не работает. Некоторые говорят что у них все тип-топ, но в комментах полно людей которые ноют что GPS не работает вообще. Я один один из тех кто ноет.

На сколько я понимаю, на данный момент решения нету. Надеюсь что ребята скоро решат эту проблему, так как GPS все же для меня важна в особенности когда я не дома. Что же касается iPhone-а в целом, то я доволен, но ломанее baseband-а все же напрягает и местами хочется сказать “на не пошло бы все это на х**”. Я понял только одно в этом плане, если брать iPhone то покупать ТОЛЬКО FACTORY UNLOCKED, типо то что продается в Канаде если покупать в Apple магазине без контракта.

Хотя нужно отметить одно, пару лет назад я взломал iPhone для своей девушке и с тех пор ничего не трогал. И маза в том что все работает замечательно. Мораль раз настроил и не трогай. Вот я надеюсь что dev team отремонтирует GPS и после этого я трогать iPhone больше не буду! Хотя тут есть один смешной момент, так как iPhone больше начинает походить на компьютер чем на телефон, то скоро могут начать появляться злобные программы и возможно апдейтиться и ставить новые прошивки прийдется чаще, а значит для тех “нелегалов” которые хотят держать свой iPhone “открытым” все усложниться… Хотя кто знает, dev team вроде довольна хороша в пачинге дыр, так что возможно проблем и не будет.

Ладно мне пора идти встречаться с КБ.
Все чирз!

iPhone 3GS unlock – 05.14.02

Сегодня ребята с Dev team опубликовала unlock для iPhone 3G и 3GS. Новость конечно замечательная, хотя я ожидал раньше и решение лучше. Инструкции по взлому лучше всего читать с официального сайта [ http://blog.iphone-dev.org/ ] так как я потратил 2 часа пытаясь взломать iPhone 3GS, что бы потом узнать с офф. сайта что в PwnageTool 4.1.3 есть баг… который легко чиниться… но так как другие сайты – копировальщики за обновлениями не следят то и получается что сидишь и думаешь: “почему не работает?”.

И все же PwnageTool 4.1.3 Unlock Edition работает… фишка в том что unlock осуществляется по другому. Сразу скажу что если у вас телефон на гарантии то этот метод не для вас, так как после него ремонтировать ваш дорогой iPhone Аппле уже не будет. Другими словами этот хак – это путевка в одну сторону… может не на всегда, но в этом hack-ом деле не кто гарантий не дает!

В чем не маза? Фишка в том что новой дыры последних baseband-ах ( модемном софте ) походу не нашли ( пока что ), зато нашли где Аппле лоханулся и решили это использовать. И так для тех у кого прошивка baseband-а 05.14.02 или какая нить другая которая не входит в список поддерживаемых Ultrasn0w то решение только одно ( на данный момент ). Скачиваются две прошивки: 4.2.1/4.1 для iPhone 3G или 4.1 для iPhone 3GS ( потом добавят 4.2.1 ) + прошивку для iPad 3.2.2 ( которую советуют быстро качать пока Аппле не закрыл ворота ). Далее качается “PwnageTool 4.1.3 Unlock Edition” и процесс взлома можно начать. Сперва готовим новую custom прошивку iOS, далее перепрошиваем iOS вместе с новым baseband, а потом ставим Ultrasn0w 1.2 из Cydia и все тип-топ ( подробней смотрим офф. инструкции – http://blog.iphone-dev.org/ ). Зачем 2-е прошивки? А потому что iPad имеет такой же baseband чип как и iPhone 3G/3GS только вот прошивка baseband-а имеет версию 06.15.00, а те кто знают мазу – пить нужно только на повышение… То есть прошить baseband можно только с более высокой версией, а понизить прошивку baseband-а пока что невозможно. А зачем это делать? Как сказал раньше пока не нашли дыры в новых прошивках baseband-а, но при этом Аппле когда выпустил софт под iPad вложил туда baseband софт со старой не патченой дырой – ой забыли! В итоге baseband софт версии 06.15.00 имеет дырку “AT+XAPP” – которая была уже давно окучена.

Итого разлочить iPhone 3G/3GS с последней baseband прошивкой можно, но ценой гарантии так как раз прошивку baseband-а поменял ( повысил ), то обратно не откатишься ( по крайней мере в этом уверяют хакеры с dev team ). Но для тех кому все равно на гарантию или её просто нету, то можете следовать инструкциям с офф. сайта и “освобождать” свой телефон. Так же стоит упомянуть что авторы предупреждают: если выйдет какая нить новая baseband прошивка начиная с номера 05.xx.xx то она в наш телефон не встанет ( помним правило о повышении ) + нельзя будет откатиться на начальную прошивку по той же самой причине. Другими словами вы застрянете с этой прошивкой и только сможете обновлять в случае когда dev team выпустит PwnageTool для новой iOS. Конечно есть исключение если новая версия iOS выйдет с baseband-ом номерами выше чем 06.05.хх.

Лично для себя я не вижу проблемы, так как обновлять baseband я не буду – мне нужен телефон который не локнутый! А лететь вперед за новыми версиями iOS меня тоже особо не привлекает, я могу подождать новой PwnageTool и обновить. Гарантия у меня на телефоне тоже вышла… так что viva la freedom!

Если есть вопросы пишите, постараюсь ответить…

Блокируемся

Предисловие:

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

Какие варианты?

Вариантов блокирования сайтов и сервисов масса. Если поискать в интернете то можно найти кучи программ которые обещают что заблокируют все и вся. Я не собираюсь тут обсуждать как они работают или делать какой либо обзор, так как есть довольно хороший альтернативный способ. А именно речь пойдет о двух вещах: Hosts file и DNS.

А как это работает?

По сути Hosts file и DNS похожи, так как делают одну и туже вещь только на разных уровнях. Но перед тем как перейти к том как этим все пользоваться “на благо народа”, нужно понять базовый принцип работы. И так начнем с того как же интернет работает.

Интернет работает на IP протоколе, то есть у каждой машины которая подсоединена к интернету есть IP адрес. Вот пример адрес: 173.194.32.104 и если вы напишите этот адрес в браузер то откроется сайт Гугл (google.com). Для аналогии можно интернет сравнить с телефонной сетью, набираете номер и получаете секс по телефону, заказ пиццы или что вы ещё хотите. Далее по аналогии, многие люди не запоминают номера телефонов, а запоминают названия компаний, сервисов и так далее. То есть вы можете представить себе ситуацию когда вам говорят: “… я тут заказал пиццу от 416-967-1111 и она классная…”, обычно говорят: “… я тут заказал пиццу от Pizza Pizza и она классная…”, а дальше если вы хотите с ними связаться и воспользоваться их сервисом, то вы открываете желтые страницы и смотрите номер телефона ассоциированный с Pizza Pizza. Конечно я перегнул с желтыми страницами, так как я не знаю кто ещё пользуется книжкой, обычно смотрят в интернете, но важен тот факт что для того что бы получить сервис нужно знать имя компании, потом посмотреть телефон (или адрес) в книге и позвонить (или приехать).

Интернет работает примерно так же. То есть вы вводите имя (доменное имя/domain name) в браузер, а далее происходит почти тоже самое что и в примере с телефоном. Другими словами браузер смотрит на имя и делает запрос в DNS (по аналогии в желтые страницы), получает номер, а дальше идет по нему и скачивает данные (страницу, файл и так далее).

Пример:

Компьютер —- запрос: google.com —-> DNS ( Domain Name System )
Компьютер <—- ответ: 173.194.32.104 —- DNS
Компьютер —- запрос: страница —-> 173.194.32.104
Компьютер <—- ответ: первая страница —- 173.194.32.104

Теперь рассмотрим разницу между Hosts фаил и DNS. Практическая разница состоит в том что Hosts файл расположен прямо у вас на компьютере ( в операционной системе ), а DNS находиться в интернете. И что более важно это факт того что перед тем как компьютер воспользуется сервисом DNS, он сперва проверит Hosts файл на наличии записи. Если запись существует в Hosts файле, то DNS сервисом пользовать не нужно, а если записи нет то компьютер делает запрос к DNS. Давайте посмотрим на пример Hosts файла:

##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
##

255.255.255.255 broadcasthost
::1 localhost
fe80::1%lo0 localhost
127.0.0.1 localhost

127.0.0.1 yandex.ru
127.0.0.1 www.yandex.ru

Из файла можно увидеть следующее: существует запись yandex.ru и IP адрес который ассоциирован с этим. То есть если я напишу в брузере “http://yandex.ru” то компьютер посмотрит в Hosts файл и увидит что запись существует и адрес является 127.0.0.1. После этого браузер попробует открыть страницу по адресу 127.0.0.1. Теперь можно спросить, а что 127.0.0.1 за адрес такой? Этот адрес является адресом местной машины, то есть адрес самой себя. Он не когда не меняется и используется для внутренних нужд системы. Другими словами у каждого компьютера есть 127.0.0.1 адрес и он по конвенции он указывает на этот же компьютер. Теперь можно спросить, а зачем мы “yandex.ru” указываем на собственную машину? Ну в данном случае это действительно не нужно, но представьте что вы хотите заблокировать yandex.ru, тогда все что нужно сделать это прописать “127.0.0.1 yandex.ru” в Hosts файле и каждый раз когда вы будите писать yandex.ru в браузер, он будет пытаться открыть страницу по местному адресу ( 127.0.0.1 ) где обычно ничего не находиться и в результате yandex.ru открываться не будет. Другими словами мы только что заблокировали yandex.ru не используя никаких навороченных программ.

Теперь стоит вернуться к DNS, зачем он нам нужен, если Hosts файл по идее делает такую же работу? Это правда, DNS нам был бы не нужен если бы в нашей сети было бы 100 сайтов ( серверов ), но в интернете миллионы сайтов и их количество продолжает расти каждый день. В итоге нам нужно что-то динамичное, то что может следить за новыми сайтами и содержать их адреса, в результате мы получили DNS – Domain Name System или система доменных имен. Этот сервис работает по примерно такому же принципу как и Hosts файл, то есть компьютер делает запрос DNS с именем google.com и получает в ответ 173.194.32.104. Как я и говорил ранее это похоже на желтые страницы, где вы ищите по названию и получаете телефон и адрес.

В итоге если мы хотим заблокировать какой нить сайт или ресурс то достаточно заблокировать ( или прописать ) их либо в Hosts файле либо в DNS сервисе, а можно и в обеих местах.

Где DNS и что с ним делать?

И так у нас теперь есть понятие о том как компьютер запрашивает сайты. Но перед тем как мы перейдем к тому что бы начать блокировать все и вся, нужно чуть поговорить о DNS. DNS как вы уже поняли, является сервисом который находиться где-то в интернете. Вопрос напрашивается сам по себе, а как мой компьютер знает “кому звонить” или как соединиться с DNS? Обычно DNS настройки идут вместе с TCP/IP настройками и типично определяются вашим интернет провайдером. То есть когда вы подсоединяете к сети, то ваш компьютер запрашивает сетевые настройки и тогда получает в ответ интернет адрес, DNS адреса и ещё пару-тройку вещей. Тогда следующий вопрос: а как я могу поменять DNS настройки? Сменить DNS легко, все что вас нужно это найти в интернете DNS сервис, например я пользуюсь openDNS ( http://www.opendns.com/ ) и проставить DNS адреса у себя в системе на те которые предоставлены openDNS-ом. Вот например: DNS адреса с http://opendns.com – 208.67.222.222 и 208.67.220.220. Прописываем эти адреса в системных настройка и усе готово.

Вот как это выглядит на маке:

А вот как это выглядит на Windows XP:

Подробные инструкции о том как настроить Windows XP можно найти тут, а если ссылка не работает то я сделал pdf, можете скачать и прочитать.

А вот как это выглядит на Linksys роутере:

Подробные инструкции для настройки DNS в роутерах можно найти тут, а если ссылка не работает то я сделал pdf, можете скачать и прочитать.

Hosts vs DNS:

Вопрос чем лучше пользоваться Hosts файлом или DNS? Все зависит от задачи, ограничений и личного выбора. Например если у вас дома дети и вы хотите ограничить доступ для всего дома, то конечно стоит воспользоваться DNS и проставить настройки в роутере, что бы любое устройство в доме будь то iPad, iPhone или ваш старый компьютер не давали возможности похода на facebook. Но если вы хотите просто отгородить свой личный компьютер от facebook-а то можно просто прописать его в Hosts файле. Теперь нужно упомянуть об одной проблеме/недостатке в Hosts файле, у Hosts файла нету так называемого символ-джокера. Что это значит? А то что каждый сайт который нужно прописать в Hosts файле нужно прописывать с поддоменами. Для простоты приведу пример, возьмем для примера yandex.ru:

Как и раньше мы прописываем в Hosts файле следующее:

127.0.0.1 yandex.ru

И это ограничит доступ на http://yandex.ru, но на yandex.ru можно будет зайти используя под-домен: http://www.yandex.ru и для того что бы заблокировать и этот адрес нужно прописать следующее:

127.0.0.1 www.yandex.ru

Тогда оба адреса будут заблокированы. Другими словами в Hosts файле нужно прописывать все конкретно и нельзя указать одной строкой блокировку всего что является частью yandex.ru. Хотя это и недостаток, но не очень большой и всегда можно соорудить свой список того что нужно блокировать, раз настроено и работает всегда.

Что касается DNS тут проблема другого рода, для начала надо найти DNS сервис который позволяет вводить ограничения. Например я нашел openDNS.com и на нем есть много разных настроек фильтра и блокирования сайтов/доменных имен, но бесплатная часть сервиса разрешает вам блокировать только 25 доменных имен, если нужно больше то прийдется платить. Есть так же русский вариант называется Rejector, но я им не пользовался и поэтому не могу ничего сказать о сервисе. Так же отмечу что можно сделать свой DNS сервис, настроить его как нужно, но это не простая работа и вдаваться в подробности я не буду.

Итого и тут и там есть свои недостатки, но можно комбинировать и то и другое и получить лучшее от обоих “миров”.

Hosts:

И так вы решили воспользоваться Hosts, все что для этого нужно это отыскать файл у себя в системе и написать туда что блокировать по выше приведенным примерам. Размещение Hosts файла в разных операционных системах хорошо описано в вики, или pdf. Для того что бы новые параметры вступили в работу нужно обновить кэш, перегрузите браузер и посмотрите работает ли оно. Если не помогло, то проверьте записи в Hosts файле и перегрузите всю машину (хуже не будет). В Mac OS X нужно сбросить кэш, в консоли терминала (terminal) напишите “dscacheutil -flushcache” или перегрузите компьютер.

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

DNS:

Что же касается DNS, то как я уже говорил ранее, есть сервис openDNS где вы можете зарегистрироваться и начать пользоваться их услугами. На сайте есть большое количество информации и настроек. Можно фильтровать/блокировать не только индивидуальные сайты, а так же целые группы. Например если вы хотите заблокировать сайты с оружием или социальными сетями, то ставите галочку и все готово. Так же openDNS предоставляет статистику интернет “походов”, что может оказаться полезным если вы следите за своими детьми. Бесплатный аккаунт предоставляет все выше описанные, но если нужно больше то вы всегда можете подписаться на платный сервис. Итого все сделано красиво, просто и работает замечательно.

Как все обойти?

Можно ли все эти блокировки обойти? Короткий ответ да, все можно обойти со временем и ресурсами. Длинный ответ, да можно, но не так просто как хотелось бы. Если вы все настроили и закрыли доступ для изменения системных настроек, то это будет сложно. Например что сделал я когда блокировал одну машину для родителей. После того как прописал Hosts файл и выставил настройки для OpenDNS, я закрыл доступ к настройкам системы на Windows 7. Потом закрыл доступ к BIOS что бы умный ребенок не могу загрузиться с Линук диска и не пошел в интернет. Так как для обхода DNS все что надо, так это прописать в настройках адреса другого DNS сервиса и вуаля, все ограничения OpenDNS больше не работают, так как компьютер не больше не пользуется OpenDNS сервисом. Так же если нету доступа к системным настройкам то нельзя изменить Hosts файл, но если загрузиться с Линукс диска ( то есть с другой системы ) то там Hosts файл не модифицирован и как следствие нету никаких ограничений. Но даже с учетом того что машина вся закрыта, всегда можно сменить жесткий диск и результат будет такой же. Итого способы обойти всю эту блокировку есть и все зависит от того на сколько человек хочет обойти все это. Да чуть не забыл, всегда можно для обхода этого всего использовать Web-proxy – это просто и работает на ура. Хотя всегда можно проставить блокировку проксей… все это напоминает в игру кошки-мышки и на самом деле это так и есть, одни пишут защиту, а другие её ломают и пока что не видно конца и края этому процессу.

Итого:

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

Ресурсы:

DNS сервисы:
openDNS
Rejector

Hosts файл:
Готовый лист паразитов и другой информации

Инструкции:
DNS настройки Windows XP
DNS настройки для роутеров

Вики:
Символ-джокер
Размещение Hosts файла

Забавный Баг

Сегодня весь вечер провел программирую WebObjects… Вроде сделал все что планировал… Потом решил сесть и посмотреть что-то для себя… скачал пару библиотек и решил замутить новый WebObjects ( а точнее Wonder ) проект. И тут опа… проект не создается… никаких ошибок… просто не создается новый проект и все! Сперва решил что проглюк с WOLips плагином… так что пришлось его удалить и поставить заного. Не помогло, потом решил переставить эклипс ( Eclipse )… переставил… тоже не помогло. Далее я в лучших традициях Mac os X решил сделать новый пользовательский ( user ) аккаунт и запустил эклипс… тоже не помогло… Ну не знаю что делать я решил пойти покопаться в логах… покопался и нашел кучу ошибок… потом погуголил… и оказалось все банально… оказываться что нельзя ставить пробелы в названиях любых директорий по пути к эклипсу… Я тут же переименовал свою эклипс директорию из “eclipse 3.4.2” в “eclipse_3.4.2” и все заработало!

Вот забавно… ну во-первых каждый компьюторщик знает что ставить пробелы в названию директорий – это плохая идея, но почему-то мне казалось что в наши годы и с нашими “крутыми” операционнками это пройденный этап, но оказывается что нет! Во-вторых у меня эклипс работал просто замечательно не первую неделю и таких проблем не когда не происходило… и тут просто из неоткуда такое… это местами вводит в “занос”.

Ладно пойду попытаюсь что нить ещё написать…
Чирз!

P.S: Вот ссылка на форум где нашел ответ на проблему, а если сайт не работает то вот PDF сайта.

WebObjects послесловие…

В прошлый раз когда писал о WebObjects и студии для разработки, написал много негатива… К сожалению баги все же там есть, но пожалуй стоит отметить что WebObjects с WONDER библиотекой – это все же немеренная маза.

Я сегодня я закончил третью часть проекта, в которой надо было сделать базу данных и подсоединить её к приложения… Все получилось и я впервые увидел реальную мощь WebObjects которая проявляется при работе с базами данных. Запись, чтение и все такое происходит просто магическим путем… Не нужно знать SQL вообще… я бы сказал что можно даже не когда не работать и даже не слышать о SQL языке и при этом спокойно работать с данными. WebObjects библиотеки просто шикарны… например нужно считать все записи с таблицы “Клиентов”… вот как это делается:

NSMutableArray clientList = (NSMutableArray) EOUtilities.objectsForEntityNamed(ec, “Client”);

и все готово… А вот если нужно считать всю клиентскую историю? То мы выбираем клиента уже из полученного листа ( clientList ), а дальше:

NSMutableArray events = (NSMutableArray) client.events();

Готово… Красота! Сегодня я даже подумал что возможно стоит начать делать небольшие уроки… Я хоть и не профессионал, но все же базы показать смогу…

Ладно пойду отваливаться.
Чирз!

Замороченный день с WebObjects

Сегодня был ещё один жаркий день… решил днем посидеть у реки… угу уже через минут 15 решил пойти домой. Ненавижу это жаркое солнце… у меня создается ощущение что кожа горит. А вот вечером на улице хорошо… темно, тихо и можно что-то поделать. Сегодня я как раз сел работать над проектом… часов 5 разбирался что и как делать… Это так забавно… Сперва мучился с настройками Class Path… я думал что после того как поставил WOLips, а так же дополнительные WONDER библиотеки все будет готово для беззаботной работы… но нет… надо было поставить ещё пару библиотек. Потом вроде всё заработало и EOModeler начал “разговаривать” с базой данных… ну думал все… готово… но нет! Мне надо было сделать “reverse engineering” то есть считать готовую базу данных и перевести её в EOModel… ну что может быть проще… отконфигурировал все и нажал кнопку “Reverse Engineer”… и… и… и ничего! Не работает… круто… долго копался в интернете… ну спустя часик или полтора… нашёл на форуме что в WOLips версии 3.4.5 под Eclipse-ом версии 3.4.2 есть какой-то баг… другими словами “reverse engineering” не работает там… Ой как замечательно когда пакет для разработок имеет такое прекрасные баги… Действительно… кому нужен пакет для разработки софта который хорошо и грамотно работает? Нет, у нас должен быть другой путь… сперва писать код, а потом разбираться в то ли это баки в коде то ли это баги пакета для разработок – замечательно! На форуме кто-то сказал что стоит поставить Эклипс ( Eclipse ) версии 3.5, на него натянуть WOLips, там сделать все что нужно с EOModel включая “reverse engineering”, а потом вернуться обратно в версию 3.4.2, так как вот 3.5 есть своя масса глюков… Отлично… значит нужно иметь два разных Эклипса что бы в одном писать то что не работает в другом и на оборот. Как же это здорово… вот это истинная работа программиста… не писать программы, а копаться в багах пакета для разработок…

На данный момент меня это начинает ужасно злить… и даже с тем что WebObjects с WONDER библиотеками это типо круто, но мне начинает казаться что будущего у этого нету! Да пусть Аппле отдал все свои великие разработки в области WebObjects в open source, но то что твориться сейчас с этим это просто ужас… Документации мало, примеров мало… и вообще нужно сидеть и разбираться ( извиняюсь за мой “Французский” ) с такой херней как не рабочим пакетом для разработок. Ладно у меня выбора все равно нету… сказали писать на этом, значит будем писать на этом.

А вообще, если за такими проектами как WOLips и WONDER project нету массовости то долеко это все не уйдет… Лучше взять другой язык и пакет для разработок в котором есть примеры и хорошая поддержка и писать на этом. Чирз!