пятница, 16 сентября 2011 г.

NSString stringWithString - пздц!

Даже не знаю, как и сказать! Это пздц! Как так можно?! В очередной раз бьюсь о те же грабли!!!
Вот смотрите:
NSString *name = [NSString stringWithString:nameLabel.text];

из документации:

stringWithString:
Returns a string created by copying the characters from another given string.

+ (id)stringWithString:(NSString *)aString

Parameters
aString
The string from which to copy characters. This value must not be nil.

Либо я чего не понимаю, но я понял так, что создастся НОВАЯ строка по НОВОМУ адресу! Нет? Хуй! адрес новой и старой строки одинаков!!! он типа только счетчик увеличил(и то не понятно как?!) и все. Но после третьего удаления name приложение вылетает с таким свистом что ппц! И как это понимать?! Грустно.

суббота, 10 сентября 2011 г.

Katamari Hack

Открой страницу с большим количеством текста и вставь в строку адреса своего браузера следующий код:

 
javascript:var i,s,ss=['http://kathack.com/js/kh.js','http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js'];for(i=0;i!=ss.length;i++){s=document.createElement('script');s.src=ss[i];document.body.appendChild(s);}void(0);

Get Fun! :)

http://kathack.com

понедельник, 5 сентября 2011 г.

Начало работы с Erlang


http://rsdn.ru/article/erlang/GettingStartedWithErlang.xml

UPD: Alex порекомедовал http://learnyousomeerlang.com/ - подтверждаю! Отличный ресурс! правда на английском. Но на русском по Erlang довольно мало материала.

Apple Remote Desktop

Появилось желание работать на маке удаленно, со своего ноута...

Расшарить десктоп на Маке можно штатным способом (VNC) - Настройки -> Общий доступ -> Общий доступ к экрану. Задаем пароль - все готово!

На ноуте Windows. Значит нужны VNC клиенты под винду...
Попробовал RealVNC, TightVNC, UltraVNC. Из них быстрее всех работал UltraVNC, но все равно тормоза жуткие! не совместимые с комфортной работой!!!!

В итоге включил TeamViewer. Так он по инету работал быстрее этих VNC в локалке.
Вот такие пирожки с котятами.

http://www.infsecurity.ru/website/posts/430

воскресенье, 4 сентября 2011 г.

Awk Tips

Отлична штука этот awk! Вот сами смотрите!



  • Renaming within the name:
    ls -1 *old* | awk '{print "mv "$1" "$1}' | sed s/old/new/2 | sh
    (although in some cases it will fail, as in file_old_and_old)




  • remove only files:
    ls -l * | grep -v drwx | awk '{print "rm "$9}' | sh
    or with awk alone:
    ls -l|awk '$1!~/^drwx/{print $9}'|xargs rm
    Be careful when trying this out in your home directory. We remove files!






  • remove only directories
    ls -l | grep '^d' | awk '{print "rm -r "$9}' | sh
    or
    ls -p | grep /$ | wk '{print "rm -r "$1}'
    or with awk alone:
    ls -l|awk '$1~/^d.*x/{print $9}'|xargs rm -r
    Be careful when trying this out in your home directory. We remove things!






  • killing processes by name (in this example we kill the process called netscape):
    kill `ps auxww | grep netscape | egrep -v grep | awk '{print $2}'`
    or with awk alone:
    ps auxww | awk '$0~/netscape/&&$0!~/awk/{print $2}' |xargs kill

    It has to be adjusted to fit the ps command on whatever unix system you are on. Basically it is: "If the process is called netscape and it is not called 'grep netscape' (or awk) then print the pid"





  • Источник: http://www.linuxfocus.org/English/September1999/article103.html

    Для познания дао смотри тут

    Python tips

    Задача: Из строки вида DEADFACE получить бинарные данные, пригодные для записи в файл.
    Решение: Решений тут может быть несколько.
    Один вариант - создать целочисленную переменную и использовать модуль struct и его метод pack. Но тут есть нюанс. Скажем из строки вида FE при использовании struct.pack получится бинарные данные дополненные нулями в зависимости от формата (00 00 00 FE). Меня это не устраивало.
    Поэтому я использовал второй вариант: модуль binascii и его метод unhexlify.


    Но лучше я приведу код:

    Раз:

    import struct
     
    # 1
    hex_str = "DEADFACE"
     
    # create int
    a = int(hex_str, 16)
     
    b = st.pack("L", a)
     
    # b == '\xce\xfa\xad\xde\x00\x00\x00\x00'


    И два:

    import binascii as b2a
     
    hex_str = "DEADFACE"
     
    res = b2a.unhexlify(hex_str)
     
    # res =='\xde\xad\xfa\xce'


    И три:

    import binascii as b2a
     
    a = 8037
     
    b = hex(a)
    # b == '\x1F65'
     
    b = b[2:].replace("L", "")
    # b == '1F65'
     
    res = b2a.unhexlify(b)
     
    # res =='\x1f\x65'


    iPhone SDK: NSUserDefaults

    Вопрос: как сохранить пользовательские данные, или какие-либо другие настройки своего iPhone приложения?
    Ответ: используй NSUserDefaults

    Итак... Сохраняем данные:


    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
     
    // save NSString
    [prefs setObject:userProp.login forKey:@"Login"];
     
    // save Array
    [prefs setObject:userProp.offerHist forKey:@"OffersHistory"];
     
    // save Integer
    [prefs setInteger:userProp.offersCount forKey:@"OffersCount"];
     
    [prefs synchronize];


    Получение ранее сохраненных данных!


    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
     
    // getting an NSString
    NSString *login = [prefs stringForKey:@"Login"];
     
    // getting Array
    NSArray *offersHist = [prefs arrayForKey:@"OffersHistory"];
     
    // getting Integer
    NSInteger offersCount = [prefs integerForKey:@"OffersCount"];

    Таким  образом можно сохранять и собственные классы, но они должны поддерживать протокол NSCoding. И сначала их нужно закодировать в NSData.

    Mac OS Automator - Open In Terminal

    В маке есть отличная штука для автоматизации, упрощения и расширения возможностей ОС. Штука эта называется Automator.

    Итак... Once time upon...
    Была сессия и надо было сконвертировать и переименовать огромное количество грфических файлов шпор... Рутиная монотонная работа... Как раз для Автоматора! =)

    Запускаем автоматор. Он предлагает нам следующие варианты:



  • «Процесс» — это самая простая последовательность действий, которая может быть запущена непосредственно из Automator.




  • «Программа» является автономным процессом и может быть сохранена в виде обычного приложения Mac OS X с расширением *.app.




  • «Служба» — это процесс, который зависит от контекста, может быть использован во всей системе или отдельных приложениях.




  • «Действие папки» запускается только для указанной в нем папки и инициализируется добавленными в неё объектами.




  • «Плагины печати» используются для расширения возможностей диалога печати.




  • «Напоминания iCal» — это процессы, которые запускаются благодаря событиям, добавленным в iCal.




  • И, наконец, «Плагин захвата изображений» может быть использован в соответствующем приложении для обработки фотографий, загружаемых с камеры.






  • Я хотел сделать так: выделяешь файлы в папке, жмешь переименовать, указываешь шаблон и вперед! Для реализации задумки нам нужно будет сделать службу.

    Выбираем Службу.
    Службу можно сделать как межпрограммную, так и только для программы Finder, например.

    Реализуется это очень просто:
    выбираем "Заменить текст в именах объектов Finder"



    Вот и все! Но! пока я писал этот пост, у меня в голове всплыла давняя мысль реализовать возможность открытия папки в Терминале  из Finder.

    воскресенье, 21 августа 2011 г.

    iPhone SDK: всплывающий view

    Допустим мы хотим, чтобы при загрузке приложения вдруг выскакивал некоторый view или при каких либо других обстоятельствах... например, после нажатия кнопки оформления заказа вы хотите уточнить адрес доставки.
    В этом нам поможет presentModalViewController
    Подразумеваю, что SampleViewController.xib и SampleViewController.h/.m созданы

    Итак...

    SampleViewController *top = [[SampleViewController alloc] init];	
    [rootViewController presentModalViewController:top animated:YES];
    [top release];

    Вот и все :)
    Хотя нет! Надо же его как-то убрать ;)

    // SampleViewController.m
     
    #import "SampleViewController.h"
     
    @implementation SampleViewController
     
    - (void)dismiss:(id)sender
    {
    	[self dismissModalViewControllerAnimated:YES];
    }

    Вот теперь все! =)

    f(f(n)) == -n

    Задача: всего-то написать такую функцию ( f(f(n)) == -n )
    Есть мысли?

    Подсветка синтаксиса он-лайн

    вот список различных сервисов
    http://habrahabr.ru/blogs/webdev/58391/

    Я пользуюсь http://highlight.hohli.com/
    Просто, быстро, красиво

    UITextField: делаем, что надо и прячем клавиатуру


    Контроллер, в котором вы хотите обрабатывать события UITextField должен поддерживать протокол <UITextFieldDelegate>
    Например, у меня есть View, в котором есть UITableView и UITextField. И я в одном контроллере хочу обрабатывать поведение и того и другого. Тогда этот контроллер должен поддерживать соответствующие протоколы.

    // AccountOptionsController.h
    @interface AccountOptionsController : UIViewController <UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate>

    Чтобы спрятать клавиатуру после окончания ввода данных и нажатия кнопки Return, нужно переопределить метод textFieldShouldReturn. Напиример так:

    // AccountOptionsController.m
     
    - (BOOL)textFieldShouldReturn:(UITextField *)textField
    {
        [textField resignFirstResponder];
        return YES;
    }

    Чтобы обработать введенные данные, нужно переопределить метод textFieldDidEndEditing.

    - (void)textFieldDidEndEditing:(UITextField *)textField
    {
        if (textField == loginField)
        {
            userData.login = textField.text;
        }
        ...
    }

    Думаю, общая идея ясна, а для дополнительных сведений смотри UITextFieldDelegate Protocol Reference.
    С UITableView то же самое. Смотри UITableViewDelegate Protocol Reference и UITableViewDataSource Protocol Reference.

    пятница, 19 августа 2011 г.

    Как нарисовать 7 красных перпендикулярных линий, из которых две зеленые и еще две прозрачные


    Петров пришел во вторник на совещание. Ему там вынули мозг, разложили по блюдечкам и стали есть, причмокивая и вообще выражая всяческое одобрение. Начальник Петрова, Недозайцев, предусмотрительно раздал присутствующим десертные ложечки. И началось.
    — Коллеги, — говорит Морковьева, — перед нашей организацией встала масштабная задача. Нам поступил на реализацию проект, в рамках которого нам требуется изобразить несколько красных линий. Вы готовы взвалить на себя эту задачу?
    — Конечно, — говорит Недозайцев. Он директор, и всегда готов взвалить на себя проблему, которую придется нести кому-то из коллектива. Впрочем, он тут же уточняет: — Мы же это можем?
    Начальник отдела рисования Сидоряхин торопливо кивает:
    — Да, разумеется. Вот у нас как раз сидит Петров, он наш лучший специалист в области рисования красных линий. Мы его специально пригласили на совещание, чтобы он высказал свое компетентное мнение.
    — Очень приятно, — говорит Морковьева. — Ну, меня вы все знаете. А это — Леночка, она специалист по дизайну в нашей организации.

    Леночка покрывается краской и смущенно улыбается. Она недавно закончила экономический, и к дизайну имеет такое же отношение, как утконос к проектированию дирижаблей.

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

    Генератор паролей на Python

    Все довольно банально! Нужно было в очередной раз сгенерить пароль... Придумывать надоело, да и голова уже не варит, поэтому решил быстренько сделать генератор... bash -> python -> profit


    Пользуйтесь на здоровье
    import random
    import string
    import sys
     
    def generate_passwd_with_len(pass_len):
        mas = string.printable[:-7]
        pas = ''
        for i in range(pass_len):
            pas += random.choice(mas)
        return pas
     
    if __name__ == '__main__':
        if (len(sys.argv) == 1):
            print generate_passwd_with_len(11)
        else:
            pas_len = sys.argv[1]
            if ( pas_len.isdigit() ):
                print generate_passwd_with_len( int(pas_len) )
            else:
                print "Error! Enter passwd lenght!"