пятница, 13 апреля 2012 г.

GRE/ipip туннель между Cisco и Linux Server

Имеем:
  • серевер с выделенным ip 22.22.22.22 и Cisco с внешним ip 11.11.11.11
  • На Cisco есть два сетевых интерфейса: один внешний с ip 11.11.11.11 и внутренний с ip 10.10.0.1

Хотим:

  • быстро и при помощи встроенных средств связать сервер в единую инфраструктуру с Cisco и ее подсетью (10.10.0.0/24)


суббота, 7 апреля 2012 г.

Fedora 16 и VirtualBox

Возможны два случая:

  1. Fedora 16 в качестве хостовой машины
  2. Fedora 16 в качестве виртуалки
В принципе, последовательность действий будет схожа.

Рассмотрим первый случай: Fedora 16 в качестве хостовой машины

Прежде всего нам надо скачать сам VirtualBox. Это можно сделать либо с официального сайта, либо при помощи yum, но при условии, что репозитории VirtualBox добавлены в конфиги yum'a.

Итак, скачаиваем дистрибутив отсюда: https://www.virtualbox.org/wiki/Linux_Downloads

Теперь надо настроить саму Fedora. Дело в том, что VirtualBox использует для поддержки виртуализации DKMS, а в федоре по-умолчанию эта система не поднята. Поэтому нужно ее завести. Эта штука позволяет создавать и динамически подключать модули ядра. Но чтобы все работало должным образом необходимо иметь kernel-devel и kernel-headers текущего ядра. И вот тут нюанс: в репозитории федоры лежат хедеры только самого последнего ядра! Поэтому мы просто вынуждены обновить ядро!
  1. sudo yum update
  2. sudo yum install kernel-headers kernel-devel gcc
  3. sudo yum install dkms
  4. После этого можно смело запускать установщик VirtualBox.
  5. Затем нужно добавить текущего пользователя(то есть себя) в группу vboxusers.
Вот и все. Теперь можно смело создавать виртуальные машины и устанавливать GuestAdditions.

Теперь рассмотрим второй случай:

Тут тоже не обойтись без DKMS, но теперь это необходимо для установки GuestAdditions.
Итак:

  1. sudo yum update
  2. sudo yum install kernel-headers kernel-devel gcc
  3. sudo yum install dkms
  4. Монтируем VBoxGuestAdditions.iso и переходим в него
  5. Запускаем VBoxLinuxAdditions: sudo ./VBoxLinuxAdditions.run
Если будет чего-то не хватать, то вам об этом сообщат. Но все должно быть тип-топ!

Удачи!

четверг, 5 апреля 2012 г.

Делаем поиск в UITableView с помощью UISearchBar

Для начала надо подготовить основной контроллер вьюхи для работы с UISearchBar:


@interface MyViewController : UITableViewController <UISearchDisplayDelegate, UISearchBarDelegate, UITableViewDelegate, UITableViewDataSource> {
    
    // For Search!
    NSArray *searchResults;
    IBOutlet UISearchDisplayController *searchController;
}


@property(nonatomic, copy) NSArray *searchResults;
@property(nonatomic, retain) IBOutlet UISearchDisplayController *searchController;

@end

Затем добавить во вьюху Search Display Controller и правильно соединить его с аутлетами! В качестве делегата естественно назначить FileOwner.

Удаление ячеек в UITableView


// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete)
    {
        
        // At first delete data
        // delete address from address list
        [userDataController removeAddress:indexPath.row];
        
        // Delete the row from the data source
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }   
    //else if (editingStyle == UITableViewCellEditingStyleInsert) {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
    //}   
}

UIAlertView с TextField как в AppStore


- (void)mySuperMethodWithAlert
{
 // ... bla bla bla

 // создаем и показывем UIAlertView
 //

 UIAlertView *alertView = [[UIAlertView alloc] initWithTitle: @"Who are you?"     
                                                        message:@"Give your full name" 
                                                       delegate:self  cancelButtonTitle:@"Cancel"   
                                              otherButtonTitles:@"OK", nil]; 
    // Adds a username Field
    //
    UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(12.0, 50.0, 260.0, 25.0)]; 
    textField.placeholder = @"Username";
    [textField setBackgroundColor:[UIColor whiteColor]]; 
    [alertView addSubview:textField];

    [alertView show];
    [alertView release];
    [textField release];

 // ... bla bla bla
}

// Обрабатываем нажатие кнопки
//
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    // the user clicked one of the OK/Cancel buttons
    if (buttonIndex == 0)
    {
        UITextField *field = (UITextField *)[[alertView subviews] lastObject];
        NSLog (@"%@", field.text);
    }
    else
    {
        //NSLog(@"cancel");
    }
}


суббота, 31 марта 2012 г.

Доступные шрифты в iphone sdk

Данный вопрос почему-то слабо освещен в документации Apple, но всегда есть выход.
Вот код, который напечатает в dbg-console все доступные шрифты:

    // List all fonts on iPhone
    NSArray *familyNames = [[NSArray alloc] initWithArray:[UIFont familyNames]];
    NSArray *fontNames;
    NSInteger indFamily, indFont;
    for (indFamily=0; indFamily<[familyNames count]; ++indFamily)
    {
        NSLog(@"Family name: %@", [familyNames objectAtIndex:indFamily]);
        fontNames = [[NSArray alloc] initWithArray:
                     [UIFont fontNamesForFamilyName:
                      [familyNames objectAtIndex:indFamily]]];
        for (indFont=0; indFont<[fontNames count]; ++indFont)
        {
            NSLog(@"    Font name: %@", [fontNames objectAtIndex:indFont]);
        }
        [fontNames release];
    }
    [familyNames release];

А вот вывод в XCode 4 IPhone SDK 5.0:

Редактируем шрифт, его цвет и прочие прибамбасы в TabBar

for (UIViewController *tab in rootController.viewControllers)
    {
      [tab.tabBarItem setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
        [UIColor blackColor], UITextAttributeTextColor,
         [NSValue valueWithUIOffset:UIOffsetMake(0,0)], UITextAttributeTextShadowOffset,
        [UIFont fontWithName:@"Noteworthy-Light" size:13.0], UITextAttributeFont, nil]
          forState:UIControlStateNormal];
     //
    [tab.tabBarItem setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
        [UIColor whiteColor], UITextAttributeTextColor, nil]
          forState:UIControlStateSelected];
    }

Еще раз о работе с памятью в Obj-C


Дело обстоит так:

когда создаешь получаешь объект статическим методом вроде stringWithString, то созданный объект попадает в autorelease pool и его счетчик ссылок обнуляется, когда уничтожается этот пул. Однако система может и сама заретайнить некоторые объекты из пула, когда ей не хватает памяти.

Общее правило таково:

Когда ты создаешь получаешь объект методами, в названии которых есть слова alloc, copy, new и retain, то ТЫ СТАНОВИШЬСЯ ВЛАДЕЛЬЦЕМ ОБЪЕКТА И ТЫ ОТВЕЧАЕШЬ ЗА НЕГО И СВОЕВРЕМЕННЫЙ release. Во всех других случаях, ты не являешься владельцем объекта и не вправе контролировать его retainCount - т.е. делать release.

Хочу заметить, что на один alloc, copy, retain должен приходиться один release! То есть не стоит делать несколько раз release, если retain ты сделал всего один раз. ;)

пятница, 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.