• Какая есть must have книга по JavaScript?

    @frantic
    Нет денег на книгу, учите тут. Сама книга актуальна.
    Ответ написан
    Комментировать
  • JavaScript как первый язык Написание сайтов?

    @frantic
    Если вы в результате хотите научиться писать сайты и тем более зарабатывать на этом, то лучше начинать с элементарной верстки (HTML+CSS). А потом переходить к языкам программирования.

    Учить лучше PHP. PHP проще и быстрее выучить в объеме необходимом для создания элементарного сайта.
    Его чаще требуют работодатели.

    А потом уже открывайте для себя мир JS 8) Он вас изменит навсегда 8)
    Ответ написан
  • В каких случаях стоит переписывать сайт с нуля?

    @frantic
    1. 99.9% программистов жалуются на код, написанный его предшественниками.
    2. 99.9% программистов жалуются на код wordpress
    3. 99.9% программистов хотят все переписать по своему. И часто это самопис.

    Конечно я утрирую. Но суть в том, что программисту все равно на риски чужого или почти чужого проекта. Он думает о коде. Его красоте, эстетичности, удобстве и т.д. НЕ доверяйте программистам, особенно молодым.

    Взвести риски и траты. Послушайте аргументацию программиста. Вас должны интересовать конкретные проблемы. А не абстрактные заявления. В wordpress код сущий ад. Но в сети очень много сайтов на этом движке и с очень большой посещаемостью.

    К тому же самопис вам точно не нужен. Его сопровождать никто не будет, кроме автора. Если решитесь, то используйте популярный фреймворк. Symfony, Yii, Laravel. Под них вы всегда сможете найти специалиста.

    Если у вас нет проблем с производительностью, если вы не теряете прибыль, если не страдает скорость разработки, то точно думать о переписывании не стоит. Баги и недочеты есть в любом проекте и их нужно исправить.
    Ответ написан
    Комментировать
  • Где найти грамотный код для хеширования/проверки на, скажем, PHP?

    @frantic
    Можно и дать.

    Но полностью он не обезопасит вас от перебора. Лишь усложнить жизнь взломщику. Так как скорость хэширования будет дольше и в базе не будет одинаковых хэшей для одинаковых паролей. Что даст вам время на рекцию. Скажем залатать "дырку" и сбросить все пароли.

    Суть в том, что к проблеме безопасности надо подходить комплексно. И степень концентрации должна зависить от самого приложения. К примеру, можно требовать от пользователей использовать сложные пароли (как, например, в AppleId), просить менять их раз в месяц или в два. А можно позволить использовать пароли от 3 символов. Тут все должен определять разработчик исходя из логики и рисков.

    И вообще лучше не допускать утечек 8).

    Фильтруйте и экранируйте данные. Защищайте сервер. Используйте prepared statement и будет вам счастье.
    Ответ написан
    Комментировать
  • Как на PHP написать роутер с ЧПУ?

    @frantic
    В таком виде у вас самый простейший вариант распределения. Главным недостатком такого подхода является жесткая связь между uri и названием классов и методов. Порой это очень не удобно.

    Лучше используйте внешние библиотеки. Вместе с composer.
    Роутеров сейчас навалом, например, Pux.
    Или напишите свой.
    Ответ написан
    Комментировать
  • OAuth VK и passportjs

    @frantic
    Вы не понимаете суть OAuth2 авторизации. Вам необходимо , чтобы ваше приложение было доступно извне. Так как на него будут приходить запросы от социальной сети. Контакт не знает где находится http://localhost:300...

    Тут подробнее про OAuth2
    www.itlessons.info/php/auth-with-oauth2-in-vk-mail...
    Ответ написан
  • Как воспроизвести звук в приложении на JavaScript?

    @frantic
    Возможно эта библиотека поможет buzz.jaysalvat.com.
    Ответ написан
    Комментировать
  • Как реализовать простой чат для игры?

    @frantic
    На node.js + socket.io реализовать простой чат дело 2-х дней. Причем больше всего времени будет потраченно на клиент: дизайн, верстку, смайлы, подсветка ников, информация о пользователе, звуки и так далее.

    Насчет комнат. В socket.io они уже реализованны.

    По поводу безопасности. Чат сервер по сути является echo сервером. Он просто пробрасывает сообщения от клиента к клиентам. Ему не обязательно знать содержание сообщений. Поэтому для безопасности в большенстве случаев хватает авторизации на сервере и чистки пришедших данных на клиенте простой функцией:
    function htmlEscape(text) {
       return text.replace(/&/g, '&').
         replace(/</g, '&lt;'). 
         replace(/"/g, '&quot;').
         replace(/'/g, '&#039;');
    }


    Простую реализацию чата можете посмотреть тут.
    Ответ написан
    Комментировать
  • Чат в тяжелом проекте на symfony (в любом тяжелом бэкенд-движке) — как?

    @frantic
    Делайте чат на Nodejs. Реализовать бету можно за день. Используйте socket.io.
    Вот простой пример:
    www.itlessons.info/nodejs/chat-with-nodejs-and-socket-io-with-auth/

    Использую socket.io в 2 проектах. В каждом примерно 200-500 онлайн. Тормозов нет.
    Ответ написан
    Комментировать
  • Выбрать СУБД между MySQL, PostgreSQL, MariaDB и MSSQL?

    @frantic
    Выбирайте то, что знаете лучше!

    Если MySQL, то рассмотрите MariaDB или Percona. Да и на них вы сможете переехать с MySQL в любое время, так как они обратно совместимы.
    Судя по вашим данным, вопрос нагрузки при учете прямых рук, возникнет перед вами года через два-три. А преждевременная оптимизация может погубить проект.

    И постарайтесь максимально отказаться от JOIN'ов. Как правило из-за них возникает большинство проблем.
    Ответ написан
    Комментировать
  • Каково Ваше мнение при выборе ультрабука?

    @frantic
    Недавно купили другу Lenovo Yoga 13, правда мощней (http://market.yandex.ru/model.xml?modelid=9356625&hid=91013).

    Программы открываются мгновенно. При открытом Photoshop'е, двух редакторах и нескольких браузерах не тормохит. Touch скрин, возможность использовать его как планшет. IPS матрица. Все круто. Друг доволен.

    Правда win8 как по мне немного глючен при Touch скрине. При скролинге страниц бывают глюки. Полноценно работает разве што IE10.
    Ответ написан
  • Какой купить роутер?

    @frantic
    У меня стоит ASUS RT-N66U (http://market.yandex.ru/model.xml?modelid=7857439&hid=723087).

    Подключен по L2TP. Торенты качаются со скоростью 9.7 MB/s. Причем как по лану, так и по wifi. При этом гигабитная лан сеть из 5 компов работает без тормозов. В это время можно смотреть фильмы с локального сервака, сидеть в нете, играть в старик или доту2 и никто не заметит тормозов.

    Работает больше года. Советую.
    Ответ написан
    1 комментарий
  • Есть ли ресурсы по здоровью айтишников?

    @frantic
    Не айтишные (думаю таких не бывает), но о здоровье.
    1. http://www.fit4life.ru/
    2. Видео канал Сергея Бадюка. Например, потрясающий семинар по ОФП
    3. http://www.dvjournal.ru/
    Ответ написан
    Комментировать
  • Propel.........?

    @frantic
    1. Кажется можно, создав свой вариант сборки (http://www.propelorm.org/cookbook/customizing-build.html).
    2. Ответили
    3. В пропеле есть поддержка неймспейсов (http://www.propelorm.org/cookbook/namespaces.html). А раз есть, то по идее должен и работать автолоадер. Если нет, то попробуйте решение от Symfony (https://github.com/symfony/ClassLoader). Код пропела менять не придется.
    Ответ написан
    Комментировать
  • Постить в фейсбук через google plus?

    @frantic
    Попробуйте сервис http://ifttt.com/.
    Возможно подойдет — ifttt.com/recipes/1813
    Ответ написан
    Комментировать
  • Проект для туториала по symfony2?

    @frantic
    1. форум
    2. q&a
    3. планировщик задач (аля www.rememberthemilk.com)
    4. магазин
    5. сервис закладок
    6. сервис тестов и анкет
    Ответ написан
    Комментировать
  • Многоуровневая UITableView?

    @frantic
    Делал подобное.

    На входе миссив (NSArray), у каждого элемента есть уровень. Пробегал по массиву и создавал вьювы со сдвигом влево. Потом это все пихал в UITableViewCell.

    -(void) flateCommentsData:(NSArray *)_data withLevel:(NSInteger)level
    {
      NSEnumerator * dataEnum = [_data objectEnumerator];
      
      NSDictionary * commentData;
      
      while (commentData = [dataEnum nextObject])
      {
        SModelComment * commentModel = [[SModelComment alloc]init];
        
        [commentModel set:@"id" withValue:[commentData objectForKey:@"id"]];
        [commentModel set:@"text" withValue:[commentData objectForKey:@"text"]];
        [commentModel set:@"userId" withValue:[commentData objectForKey:@"userId"]];
        [commentModel setLevel:level];
        
        CGRect cellRect = CGRectMake(commentModel.level*5, 0, 320 - commentModel.level*5, 0);
        UIView * cellView = [[UIView alloc] initWithFrame: cellRect];
        
        //add avatar
        SModelUser * user = [SModelUserPeer loadObjectById:[commentModel get:@"userId"]];
        UIImageView * avatarView = [[UIImageView alloc] initWithImage: user.smallAvatar.image ];
        avatarView.frame = CGRectMake(5, 7, 35, 35);
        [cellView addSubview:avatarView];
        
        //add username
        UILabel * usernameLabel = [[UILabel alloc] initWithFrame:CGRectMake(45, 5, cellRect.size.width - 75, 20)];
        usernameLabel.font = [UIFont boldSystemFontOfSize:14.0];
        usernameLabel.text = [user get:@"fullName"];
        [cellView addSubview:usernameLabel];
            
        //add text
        CGRect cellTextRect = CGRectMake(45, 25, cellRect.size.width - 75, 0);
        UILabel * cellTextLabel = [[UILabel alloc] initWithFrame:cellTextRect];
        cellTextLabel.text = [commentModel get:@"text"];
        cellTextLabel.font = [UIFont systemFontOfSize:12.0];
        cellTextLabel.numberOfLines = 0;
        [cellTextLabel sizeToFit];
        cellTextLabel.backgroundColor = [UIColor whiteColor];
        [cellView addSubview:cellTextLabel];
        
        
        CGRect textFrame = cellTextLabel.frame;
        textFrame.size.height = textFrame.size.height + 10 + usernameLabel.frame.size.height
        ;
        textFrame.size.height = textFrame.size.height > 50 ? textFrame.size.height : 50;
    
        cellRect.size.height = textFrame.size.height;
        cellView.frame = cellRect;
            
        NSMutableDictionary * item = [[NSMutableDictionary alloc] initWithCapacity:2];
        [item setObject:cellView forKey:@"view"];
        [item setObject:commentModel forKey:@"model"];
        
        [commentsList addObject:item];
        
        if ([commentData objectForKey:@"childs"])
        {
          [self flateCommentsData:[commentData objectForKey:@"childs"] withLevel:level+1];
        }
      }
    }
    


    потом

    -(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    	NSDictionary * item = [commentsList objectAtIndex:indexPath.row]; 
    	UIView * cellView   = [item objectForKey:@"view"];
    	SModelComment * commentModel = [item objectForKey:@"model"];
    	
    	NSString * CellIdentifier = [NSString stringWithFormat:@"comment_cell_%d", [commentModel get:@"id"]];
    	
    	UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    	
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        }
    	
    	cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    	[cell.contentView addSubview:cellView];
    
        return cell;	
    }
    
    Ответ написан
    4 комментария