Блог

Приложения для андроида опасны

Когда я увидел новость о том, что тысячи приложений для андроида опасны, я сначала просто улыбнулся. Ну и что? Для этой платформы существует наверно миллионы приложений, она открыта и писать может кто угодно. Глупо представлять себе, что на этой платформе не будет мусора. И даже линуксовые корни не помогут, особенно против приложений, которые крадут информацию и прослушивают наши действия.

Но когда я начала читать новость полностью, я задумался (бывает такое иногда) над цифрами. Оказывается, анализировалось всего около 48 тысяч приложений. Просмотреть 50 тысяч программ и найти даже 1 вредоностных, это около 2 процентов и это наверно много.

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

Уровень вложенности скобочек

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

Вот я образно накидал фигню, которую я видел:

foreach (MyMegaObject o in objects)
{
  if (o != null) 
  {
    foreach (Object1 n in o.GetNames())
    {
      if (s != null)
      {
         if (s != " Something ")
         {
           Действия
         }
      }
    }
  }
}

Как узнать настройки Proxy

Мне понадобилось определить текущие настройки сети, и параметры прокси соединения, если они есть. Лезу в MSDN и вижу такой прекрасный пример:

// Create a new request to the mentioned URL.				
WebRequest myWebRequest=WebRequest.Create("http://www.contoso.com");

WebProxy myProxy=new WebProxy();
// Obtain the Proxy Prperty of the  Default browser.  
myProxy=(WebProxy)myWebRequest.Proxy;

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

Прятать подсвеченные строки

Вот интересно, нафига Microsoft придумала (а самое страшное - везде использует) такую фишку, как прятать выделение при потере фокуса. Вот например, если у тебя что-то выделено в компоненте ListView и ты переключаешся на другое окно, это выделение исчезает. Оно есть, но его не видно. Нахрена это, может мне кто-нибудь объяснить? Какую микстуру принимал тот проектировщик, который придумал этот бред?

Вот я сижу сейчас перед двумя мониторами и на одном мониторе у меня открыт документ Excel, в котором список из 20 учетных записей нашей базы, а на другом мониторе у меня SQL Management Studio. Я иду по списку и проверяю с помощью SQL базу, что там случилось с этими учетными записями, что они немного некорретно отображают баланс. Когда я проверял первые три записи, все было нормально, но когда ты спускашеся в середину, то при переходе взгляда с SQL Management Studio на Excel я должен каждый раз искать нужную мне строку глазами, потому что какой-то кретин придумал прятать выделение.

ASCII символ под номером 307

Сейчас занимаюсь тем, что пишу код загрузки файлов из банка. Они прислали спецификацию, в которой написано, что файл должен быть в ASCII формате и разделителем колонок должен быть символ под номером 307. Если мне не изменяет память (а в данном случае она не должна изменять мне), то ASCII файлы байтовые и каждый символ может измеряться от полного нуля до 255. Я долго ломал голову, что же тогда может быть за символ под номером 307. Я попробовал ввести с клавиатуры код символа, но как бы не крутил, у меня получалась число 3, но ведь при вводе с клавы я получаю Unicode символ.

Нашел в спецификации пример файла и увидел, что этот символ должен выглядеть как С, но с загогулиной внизу - Ç. Полез на сайт с таблицей ASCII символов и нашел его там, но оказалось, что у него код 199. Непонятки капитальные. Нашел другую таблицу, там та же самая песня. И только в третей таблице, которую я нашел, я понял, что имел ввиду банк - 307 - это код в 8-ми ричной системе исчисления. Впервые вижу, чтобы в официальных документах коды символы обозначали 8-миричной системой. В основном 10 или 16.

.NET на платформе Linux

На мой взгляд, одна из самых мощнейших технологий, .NET - это WPF. Это реальная весчь, которая должна была появиться раньше. Именно так должны строиться современные интерфейсы приложений. Реализация так же на высоком уровне и за эту технологию я готов пожать разработчикам и дружескую руку. Если WPF не плучит распространения и умрет вместе с Windows, то будет другая технология на этой же основе для других платформ. Интересно, а для Linux и андроида уже такое есть? Mono пока не поддерживает эту технологию, а о других я не слышал.

Если это мощная платформа, то какое же будущее ждет .NET и WPF в частности на других платформах. Да практически никакое. Вероятность того, что кто-то будет развивать их без Microsoft на данный момент стремится к нулю. Без WPF вся платформа .NET превращается всего лишь в очередную технологию, которая не на много лучше Java. Лично я не вижу смысла в ее поддержки на Linux или на MacOS. Без Microsoft или любого другого богатого и влиятельного покровителя все это дело загнеться и будет гнить, как сейчас это происходит с Java.

Явные транзакции при обновлении данных

Что-то я часто стал писать про SQL. Наверно потому, что очень много интересных вещей с ним замечаю. Недавно наткнулся на модуль на работе, где любая операция округлялась в явную транзакцию. Не понял, нафига это нужно, когда любая модификация данных итак автоматически запихивается в неявную транзакцию. От явности в банальных операциях UPDATE кажется толку нету. Даже если ты не написал begin transaction, операция все равно в случая ошибки откатывается полностью, а не с того места, где запрос закончил обновление.

Явные транзакции реально необходимы только там, где выполняется несколько операций изменения данных, и эти несколько операций должны быть единым целым. Второе условие очень важно и создавать лишние блокировки на сервере не стоит, потому что каждая транзакция не бесплатна для базы данных и кушает достаточно ресурсов, особенно на MS SQL Server. В этом отношении Oracle намного более щедрый к ресурсам, о чем я уже писал.

Написать простейшую игру

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

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

Блокировки чтения SQL запросом with nolock

Продолжаем тему SQL. Однажды с одним программистом зашел разговор о блокировках, и я вскользь сказал, что есть такие блокировки на чтение данных. Он не поверил, а я доказать наличие блокировок не смог. Почему я вспомнил? Да просто в последнее время что-то у нас на сайте участились блокировки. За последние два дня пришлось решать 5 подобных проблем и в одном случае снова пришлось объяснять человеку, который проверяет качество кода, когда можно использовать антиблок, а когда нельзя.

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

begin transaction
update tablename
set column1 = column1 * 10

Оптимизация SQL запросов - курсоры

Как же я ненавижу курсоры в SQL запросах. Меня просто колбасит, и конвульсит когда я вижу запросы, в которых для банального обновления данных используются курсоры. курсоры тормозят выполнения запросы и базы данных очень сильно ограничены в попытках оптимизировать их выполнения, поэтому к данному способу работы с данными нужно прибегать в самую последнюю очередь.

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

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне