Recent Posts

Recent Posts

[Из песочницы] NSRegularExpression и NSDataDetector — Быстрый старт

Работа с регулярными выражениями в iOS 10Всем привет! В этой статье мы разберем как работать с NSRegularExpression и NSDataDetector, всех неравнодушных приглашают под кат.Регулярное выражение — строка или последовательность символов, которые задают шаблон. С помощью которого можно делать очень гибкие поисковые выборки в тексте.Допустим у нас имеется некий текст в строке и наша задача найти в нем все перечисленные email-адреса. Самый лучший инструмент для этой задачи это регулярные выражения.Пишем Р.В. (Регулярное Выражение) для проверки email. Для начала нужно описать базовые условия всех возможных комбинаций видов эл.адресов. В самом минимальном варианте, он может иметь следующий вид: a@b.ioот 1 символа на имя ящика — до 64-х символов от 1 зарезервированных символ «собака» от 1 символа имени ресурса — до 64-х символов от 2 символа домена — до 64-х символов Начинаем составлять РВ поэтапно:@"()" — говорит, что имя ящика может содержать любую букву и любую цифру @"(){1,64}" — говорит, что группа этих символов может быть длиной от 1 до 64-х символов @"(){1,64}" — говорит, что можно указать еще и эти символы @"(){1,64}@" — говорит, что собака на данном месте обязательна @"(){1,64}@(){1,64}" — Добавляем все те же символы, только после @ @"(){1,64}@(){1,64}\." — говорит, что символ точка на этом месте обязательна @"(){1,64}@(){1,64}\.(){2,64}" — говорит, что имя домена может содержать буквы и цифры общей суммы символов от 2 до 64-х символовТолько что мы составили полноценное регулярное выражение.Неполный справочник зарезервированных символов для РВ:Символ Значение ^ начало проверяемой строки $ конец проверяемой строки . любой символ | логическое ИЛИ ? предшествующий символ или группа символов является необязательными + один или несколько экземпляров предшествующего элемента * любое количество экземпляров элемента (в том числе и нулевое d цифровой символ D не циф. символ s пробельный символ S не пробельный символ w соответствует любой букве или цифре; эквивалент W наоборот эквивалент , все символы кроме этих Квантификаторы {n} ровно n раз {m,n} включительно от M до N {m,} не менее m раз {,n} не более n раз () создание группы в таких скобках говорим, «любой символ из этих, но только один Создание NSRegularExpressionself.mainText = @"There’s also +39(081)-552-1488 a “Bookmark” button that allows the user to highlight any date, time or location in the text. For simplicity’s sake, www.ok.ru you won’t +39(081)552 2080 not cover every possible format of date, time and 2693485 location strings that can appear in your text. You’ll implement the https://github.com bookmarking functionality +249-54-85 at the very end +39 333 3333333 of the tutorial. vk.com Your first step to getting the search functionality working is to turn standard strings representing regular expressions into http://app.com NSRegularExpression objects."; NSString* pattern = @"\b(in)|(or)\b"; // Хотим искать слова "in" или "or" NSRegularExpressionOptions regexOptions = NSRegularExpressionCaseInsensitive; // Поиск вне зависимости от регистра NSError* error = NULL; // Само создание регулярного выражения NSRegularExpression* regex = ; if (error){ NSLog(@"Ошибка при создании Regular Expression"); // Если в pattern были внесены корректные данные, тогда это сообщение не появиться } Справедливости ради должен отметить, что при создании паттерна, в строке мы должны писать непросто w,(или любую другую букву или символ который зарезервирован) а писать backslash два раза что бы экранировать NSString. \wМанипуляции с экземпляром NSRegularExpressionОбщее количество всех найденных совпадений NSUInteger numberOfMatches = )]; Возвращает range первого совпадения NSRange rangeOfFirstMatch = )]; if (!NSEqualRanges(rangeOfFirstMatch, NSMakeRange(NSNotFound, 0))) { NSString *substringForFirstMatch = ; } Получаем массив всех найденных совпадений NSArray *matches = )]; for (NSTextCheckingResult *match in matches) { //=== Через проперти resultType, можно проверить // к какому типу относиться найденый матч if (match.resultType == NSTextCheckingTypeQuote) NSLog(@"Цитата!"); NSRange matchRange = ; NSRange firstHalfRange = ; NSRange secondHalfRange = ; } Получаем первое совпадение из общего количества NSTextCheckingResult *match = )]; if (match) { NSRange matchRange = ; NSRange firstHalfRange = ; NSRange secondHalfRange = ; } Проходим итератором блоком по каждому совпадению __block NSUInteger count = 0; ) usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop){ NSRange matchRange = ; NSRange firstHalfRange = ; NSRange secondHalfRange = ; if (++count >= 100) *stop = YES; }]; Нахождение нашего паттерна в тексте и вставляем на его место слово Sieg!!! NSString *modifiedString = ) withTemplate:@"Sieg!!!"]; Обзор класса NSDataDetectorNSDataDetector — это подкласс NSRegularExpression, сделанный для удобного поиска (ссылок, номеров телефонов, даты и т.д.). То есть фактический этот класс у себя под капотом содержит универсальные регулярные выражения для поиска вышеперечисленного.Также NSDataDetector может вызывать все методы NSRegularExpression, также искать firstMatch/matches всего текста и т.д.Манипуляции с экземпляром NSDataDetector Создание экземпляра NSDataDectector NSError* error1 = nil; NSDataDetector* detector=; /* Типы данных, того чего можно искать NSTextCheckingTypeOrthography NSTextCheckingTypeSpelling NSTextCheckingTypeGrammar NSTextCheckingTypeDate NSTextCheckingTypeAddress NSTextCheckingTypeLink NSTextCheckingTypeQuote NSTextCheckingTypeDash NSTextCheckingTypeReplacement NSTextCheckingTypeCorrection NSTextCheckingTypeRegularExpression NSTextCheckingTypePhoneNumber NSTextCheckingTypeTransitInformation */ Количество найденных совпадений в текстеNSUInteger numberOfMatchesFromDetect = )]; Все совпадения в одном массиве (он содержит объекты NSTextCheckingResult) NSArray* matchesFromDetect =)]; // ----- Проходим по каждому совпадению и смотрим что там for (NSTextCheckingResult* match in matchesFromDetect) { NSLog(@"------------"); NSRange matchRange = ; if ( == NSTextCheckingTypeLink) { NSURL* url = ; NSLog(@"url = %@",url.absoluteString); } else if ( == NSTextCheckingTypePhoneNumber) { NSString *phoneNumber = ; NSLog(@"phone = %@",phoneNumber); } } Проходим блоком по всем совпадениям __block NSUInteger countForDectect = 0; ) usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) { NSRange matchRange = result.range; NSLog(@"In Enumerate = %d, tRange = %@t tText = %@",countForDectect, NSStringFromRange(matchRange), ); countForDectect++; }]; Краткая документация свойствамПроперти экземпляра NSRegularExpression Трактовка var pattern: String Возвращает паттерн регулярного выражения. var options: NSRegularExpression.Options Возвращает параметры поиска например: ищем без учета регистра NSRegularExpressionCaseInsensitive. var numberOfCaptureGroups: Int Возвращает количество групп из паттерна регулярного выражения, например: @»^(ab|bc)(amg|img)$" — тут две группы Всем кто дочитал до конца и поставил палец вверх, буду очень признателен. Проект можно найти по этой ссылке: здесь Source link

Суд в Австрии разрешил экстрадицию Фирташа в США

Высший земельный суд Вены 21 февраля разрешил экстрадицию в США украинского бизнесмена Дмитрия Фирташа. Об этом написал на своей странице в Facebook Сергей Щербина, который находится в столице Австрии. "Суд удовлетворил жалобу и решил, что экстрадиция Фирташа в США допустима. Фирташ отказался от последнего слова в суде. Сказал, что ему нечего добавить к словам адвокатов", - написал он. Также в суде заявили, что окончательное решение об экстрадиции Фирташа примет федеральный министр юстиции Австрии. Суд ссылается на положения договора между Австрией и США. "Самое важное в соглашении между Австрией и США об экстрадиции - допускается экстрадиция в независимости от того, где было совершено преступление", - заявил суд. По словам украинского журналиста, отдельно подчеркивается, что суд не решал вопрос о виновности бизнесмена, а речь идет только о вопросе допустимости выдачи. Напомним, Фирташ был арестован в Австрии в марте 2014 года по запросу американских властей. Украинского бизнесмена обвинили в том, что он хотел получить разрешение на добычу титанового сырья в Индии с помощью взяток, намереваясь продавать готовую продукцию в США. В случае экстрадиции Фирташу грозит до 50 лет тюрьмы с конфискацией всех активов. В апреле 2015 года суд отклонил запрос Минюста США об экстрадиции Фирташа, указав на невозможность исключить политические мотивы запроса. Как сообщал "Апостроф", в январе в Германии вынесли обвинительные приговоры двоим подручным Фирташа. Source link

Google и Bing подписали антипиратское соглашение о фильтрации поиска в Великобритании

Под патронажем властей Великобритании компании Google и Microsoft, которой принадлежит поисковая система Bing, подписали соглашение с правообладателями из Motion Picture Association (MPA) и Британской ассоциации производителей фонограмм (British Phonographic Industry, BPI). Поисковики обязались понижать ссылки на пиратский контент в поисковой выдаче или исключать их из поиска вовсе. Новые правила распространяются на ссылки на скачивание торрентов, а также нелегальные стриминговые сервисы (видео, спортивные и музыкальные) и будут действовать только на территории Великобритании. Представители британского Бюро интеллектуальной собственности (Intellectual Property Office), которые способствовали разработке и подписанию документа, уже назвали его «уникальной инициативой» и «знаковым соглашением». Также над данным проектом поработали британский Департамент по делам культуры, средств массовой информации и спорта и Государственный комитет по телевидению, радиовещанию и почтовой связи. Предполагается, что опуская в поисковой выдаче «пиратские» сайты, поисковики будут предлагать пользователям легальную альтернативу, продвигая сервисы, где контент можно приобрести законно. То же касается подсказок при автозаполнении, разработчики поисковых систем проследят, чтобы подсказки не приводили пользователей к нелегальному контенту. Несмотря на энтузиазм со стороны правообладателей и властей, представители Google уверяют, что данное соглашение не такое уж «знаковое». Представители компании поясняют, что Google много уже лет борется с сетевым пиратством и сотрудничает с правообладателями, и подписание соглашения практически ничего для компании не меняет. Source link

"Поймите, в жизни нет белого и черного". Бежавший в Украину депутат рассказывает, зачем он хотел запретить покемонов

Бывшего российского депутата Дениса Вороненкова, который сбежал в Украину и получил гражданство, проверит украинская прокуратура, заявил сегодня на брифинге генпрокурор Украины Юрий Луценко. Предметом проверки станет голосование за аннексию Крыма, в котором Денис Вороненков участвовал, будучи российским парламентарием в 2014 году. "Мы это конечно проверим, но не надо забывать необходимость использовать его показания по делу о государственной измене Януковича" – отметил генпрокурор Украины. Свое бегство в Украину Денис Вороненков объясняет тем, что в середине нулевых работал в Федеральной службе по контролю за оборотом наркотиков (ФСКН) и принимал участие в расследовании громкого дела "Трех китов" о контрабанде мебели, в котором фигурировали высокопоставленные сотрудники ФСБ. Бывший следователь Павел Зайцев, который занимался расследованием фактов контрабанды, не смог вспомнить в материалах дела упоминания о Денисе Вороненкове. "Я в 2000 году расследовал уголовное дело по факту контрабанды мебели, которая потом реализовывалась в "Трех Китах", в торговом центре "Три Кита". Я вам могу сказать, что ни визуально – я этого человека увидел по телевизору и в интернете – ни по фамилии не помню", – сказал он в разговоре с Настоящим Временем. А с самим Денисом Вороненковым и с другим бывшим депутатом, который так же уехал из России опасаясь преследования, Ильей Пономаревым мы поговорили накануне. — Денис Николаевич, вы еще офицер? Вы же не бывший, вас не лишали звания? — Нет, звания меня никто не лишал. — Ну и отлично. Просто чтобы правильно вас представить. Для начала хочется понять вот что: в Украине есть два способа натурализоваться гражданину России – получить паспорт по праву рождения родственников или своему, или близких родственников. А есть еще такая вещь, как указ президента в связи с государственной необходимостью. Вы какую процедуру проходили? Государственная необходимость или?… — Нет, у меня родственники здесь. И я очень хорошо знаю законодательство, в том числе и Украины. И я совершенно понимал спокойно, что я получу гражданство. Понятно, что позиция властей здесь, наверное, имеет значение, но я получил его в соответствии с действующим законодательством. Указа президента в отношении меня не было. — Ну вот, согласитесь, что есть более очевидные страны для эмиграции политической. Например, страны Запада, где, может быть, вам были бы рады не меньше, а больше, а рисков для вас было бы меньше. — Ну вы абсолютно правы, и я вам скажу, что очень многие так и подсказывали, что они выдавливают из стран: ну езжай, и никто тебя не будет вспоминать и преследовать. Лишь бы это была не Украина. Потому что с точки зрения обыкновенного российского обывателя в Украине одни жидобантеровцы, укрофашисты, которые не дают никому разговаривать по-русски, и сюда нежелательно ехать. Это страна как бы агрессор по отношению к России. — Ну, автоматически записываете себя в предатели махровые, с точки зрения… — Да, в бандеровцы, там еще как угодно может быть. — Да, ну вы могли уехать, вас, наверное, спрашивают, со своей супругой в Германию, к примеру, или в Лондон, куда угодно. — Да-да-да, но поймите, я в жизни никогда не искал легких путей. А потом, знаете как, Украина для меня такая же родина, как и Россия. Когда я уезжал, во-первых, я ни от кого не бежал. Я был совершенно свободный человек, который вправе ехать куда-либо. Никаких уголовных преследований в отношении меня не существовало, никаких обвинений не предъявлялось, я никуда не вызывался. То есть я мог совершенно спокойно… — Подождите, а правильно я понимаю, что если бы никаких уголовных преследований публично озвучено в отношении вас не было, то и никакого разговора о гражданстве, я не знаю, о предательстве тоже не было, вы бы не выступали сейчас на телевидении украинском, не делали бы заявления, которые вы делаете, вы бы просто тихо жили? — Да, наверное, слушайте, я скажу так: конечно, я внутри России, внутри системы в силу своих возможностей пытался бороться. Понимаете, я диссонировал с системой. Но я и не был открытым оппозиционером, в отличие от, скажем, Ильи Понамарева, Дмитрия Гудкова. И я не говорю о том, что сейчас такой был ярый оппозиционер… — Я понимаю, да. Илья Понамарев поучаствовал в этом принятии решения? — Нет, абсолютно никак. — Вы знакомы вообще с ним? — Да, мы знакомы, мы дружим, но он никак не принимал в этом участия. — Мне интересно, что ваша супруга думала по поводу отъезда в Украину. Она, наверное, понимала, что это опасно для ее карьеры. Как вы это обсуждали между собой? — Ой, вы знаете, мы понимаем, что моими действиями мы произвели такой разрыв шаблона в России. И у нас сейчас это все распространяется, в том числе, в виде политического преследования, в поражении такого права на профессию. Она прекрасно понимала, что ей не дадут нигде выступать, нигде петь. Но, поймите, это уже происходило. Тем более, Маша спела там все ведущие партии, все, что можно, практически все спектакли. Понимаете, она достигла определенного своего потолка. — У вас вообще какие были основания, у вас и у Марии, для того, чтобы думать, что вы попадете в следующую Государственную думу? — Нет, вы знаете, оснований не было, я вам скажу больше, что если бы мы, допустим, знали, что следующим председателем Госдумы будет Володин, то таких попыток, наверное, даже бы и не делали, и не собирались бы идти, потому что, зная его такой авторитарный тип руководства, смысла не было. Ты там просто ничего бы не смог никак сделать, эффективность этого избрания была бы равна нулю. — Меня, конечно, подмывает спросить у человека, который предлагал запретить игру Pokemon Go, потому что таким образом иностранные спецслужбы будут следить за российскими секретами, и спросить, как вам в стране живется, где об этом никто не заикается даже, наоборот, можно куда больше, чем может себе любой российский гражданин даже вообразить. Как вы к таким вопросам сейчас вообще относитесь? — Вот смотрите, я вам поясню сразу же. Понимаете, в жизни нет белого и черного. Она очень многогранна и многослойна. Вот в тот момент это был пик избирательной кампании. Я вел избирательную кампанию в одномандатном округе как мажоритарщик. Нижегородская область. И Pokemon Go, была просто истерия вокруг нее. И знакомые журналисты мне говорят: "Денис, напиши заявление, учитывая твои отношения с ФСБ, даже если бы они хотели запретить, но так как ты написал письмо, никто никогда не сделает, но тем самым это будет такой информационный повод – просто бомба. Ты привлечешь внимание всех". А самое главное что для политика? Это узнаваемость, правильно? Которая переходит в определенную электоральность его голосов. Я скажу так, что я воспользовался этим. — В Украине большая традиция политическая выборов по мажоритарным округам, и некоторые пользуются даже более простыми способами, так что тут я с вами спорить не готов. Но о чем мне интересно с вами поговорить – это о вашей безопасности в Украине. Мне кажется, что вы не скрываетесь по явочным квартирам, открыто ходите в рестораны, как мы узнаем из разных интервью, говорите с журналистами. Почему вы не опасаетесь за себя? — Знаете, есть такое выражение: "А это поможет?". — Не знаю, я думаю, что вам лучше это известно, потому что вы, как минимум, работали в спецслужбах и знаете, как они работают, соответственно. — Я считаю, что чему быть, того не миновать. Я не собираюсь прятаться, скрываться. Потом, я все-таки считаю, что и украинские спецслужбы за эти три года очень выросли в своей квалификации, поэтому я не переживаю. — Вы оставили у себя, не знаю, какой-нибудь компромат, который может гарантировать вашу безопасность? — Да вы знаете, мне кажется, наоборот, не может гарантировать безопасность – наличие какого-либо компромата. Потом, вы знаете, я считаю, достаточно подло, может быть, даже, если ты общался с какими-то людьми, и потом как бы на них выдавать какую-то информацию. Вот с моей точки зрения, это не совсем прилично, это идет вразрез с моими внутренними убеждениями. — О чем тогда вы рассказали сотрудникам СБУ, когда говорили про переговоры? — Я вам хочу сказать как раз по поводу Януковича. — Нет, почему по поводу Януковича? По поводу решения, которое принимали российские чиновники и влиятельные люди в отношении Януковича. — Это общеизвестный факт. Я ничего нового не добавил, поймите. Я ничего абсолютно не добавил, это всеобще известные факты. Но почему-то когда я повторил то, что неоднократно сотни раз говорилось во всех средствах массовой информации, именно на мои слова была такая реакция. По поводу Януковича я посчитал, как гражданин Украины уже, когда ко мне обратились, я посчитал своим долгом сказать все то, что мне известно о нем. Потому что я считал, что это гражданин другого государства, это не гражданин России даже, который бежал, предал свою страну, который устроил огромное кровопролитие, понимаете? И я не понимаю, вот сейчас задаюсь вопросом, каковы в России критерии патриота. Кто считает? Если они считают меня предателем, то, что я дал показания о гражданине другой страны, что значит для них Янукович? — Это вопрос риторический, но согласитесь, Денис Николаевич, про Владислава Юрьевича Суркова вроде никто до вас так прямо не говорил. — Очень много говорили все, и вы можете посмотреть в средствах массовой информации, огромное количество, я персонально по нему не говорил, это журналист. Я сказал, что очень многие люди, в том числе, включая окружение, они были против присоединения Крыма. — Ну вот скажите, как вы считаете, вы таким образом Суркову помогли или, наоборот, навредили? — Вы знаете, я не знаю, каким образом, я не пытался ему ни помочь, ни навредить, я вам скажу так. Для меня это абсолютно безразлично. — Теперь смотрите, в Украине про вас, ваш кейс – это совсем другая история. Это не история, которую обсуждают в России про депутата, сбежавшего в Украину, это история про человека, который поддержал, по мнению украинских патриотов, Крым, а потом к нам прибежал прятаться. Вопрос: вы не боитесь встреч с людьми, которые не посмотрят ваше интервью, но прочитав когда-то в 2014-м году один из ваших твитов, решат с вами отношения выяснить? — Тимур, смотрите, я хочу еще раз пояснить. Вы поймите, что нельзя недооценивать. Я приехал сюда, и против меня работает информационно-пропагандистская машина Кремля, включая Центр информационной безопасности ФСБ. Как только я дал первое публичное интервью, у меня сразу же был сломан твиттер. Я, к сожалению, являюсь таким же обычным пользователем, вот, наверное, как вы. Я только сейчас узнал, что есть такая двойная верификация, которая с привязкой пароля к телефону. — Ой нет, я вас понимаю. — И в мой твиттер напихали, поверьте, поздравление Захару Прилепину, радость от этого, Новороссии. — Это неважно, я понимаю, вы утверждаете, что это не вы писали, но поверьте, это неважно. Потому что если найдутся люди, которые в Киеве в это поверят, а вы гражданин России, вы были депутатом Государственной Думы, они услышали о том, что вы в твиттере это написали, и не разобрались, сами вы это сделали или это сделал Центр информационно безопасности ФСБ, вы когда встречаетесь с людьми на улице, вы опасаетесь их? — Можно опорочить любого человека. Если вы не хотите в этом разобраться, я всегда говорю: дьявол кроется в деталях. — Я очень коротко задам вопрос, надеюсь на короткий ответ. У нас сейчас блиц будет, если позволите, из трех вопросов, и нам придется уже заканчивать. Вы боитесь людей, у которых на плече нашивка батальона "Азов"? — Нет, конечно. — Не боитесь. Ок. Как Мария Максакова восприняла лично информацию о том, что семья Галины Юдашкиной от нее отреклась? Вот это публичное такое заявление. — Ну, слушайте, мы, во-первых, как бы с уважением относились к Валентину. А про Галину и Марину, они, слушайте, они нам неинтересны. — То есть вам это так же безразлично, как им теперь вы. — Абсолютно. Конечно. — Как долго вы собираетесь оставаться в Украине? — Я приехал сюда жить. — Спасибо большое. Денис Вороненков в киевской студии "Настоящего времени" вышел с нами на связь. Source link

Президент Азербайджана назначил жену первым вице-президентом

Президент Азербайджана Ильхам Алиев назначил свою жену, депутата меджлиса Мехрибан Алиеву первым вице-президентом Азербайджана, сообщает Радио Азадлыг со ссылкой на пресс-службу президента. Алиева является президентом Фонда Гейдара Алиева (фонд изучает "богатое наследие общенационального лидера азербайджанского народа"). Она также занимает должность посла доброй воли ЮНЕСКО и ИСЕСКО (исламская организация по вопросам образования, науки и культуры). Назначение жены первым вице-президентом страны Ильхам Алиев объяснил тем, что Алиева – профессионал, опытный и принципиальный человек, гуманист. "Алиева долгие годы играет важную роль в общественно-политической, культурной, международной деятельности. Она в целом осуществляет многостороннюю и успешную деятельность. Именно этими факторами я руководствовался, принимая решение о ее назначении на пост первого вице-президента Азербайджана", – сказал президент на заседании Совета безопасности, представляя Алиеву в качестве первого вице-президента. 26 сентября в Азербайджане прошел референдум о внесении изменений в конституцию. Всего в главный документ страны внесли 29 поправок. Среди изменений – продление срока президентских полномочий с пяти до семи лет. Нынешний глава страны, 54-летний Ильхам Алиев, занимает пост президента с 2003 года, переняв его у больного отца и уже трижды побеждал на президентских выборах (в 2003, 2008 и 2013 гг.) Его нынешний президентский срок должен закончиться в 2018 году. Согласно другой поправке, в стране создали два вице-президентских поста. Оба вице-президента будут назначаться и увольняться президентом, а первый вице-президент станет вторым человеком в стране. В случае если президент будет не в состоянии выполнять свои обязанности, именно к нему (или ней), а не к премьер-министру, которого назначает парламент, перейдут президентские полномочия. Семья Алиевых неоднократно фигурировала в коррупционных скандалах: в "панамском архиве" журналисты обнаружили, что семья президента Азербайджана контролирует самые богатые в стране месторождения золота, меди и серебра через сеть подставных компаний, OCCRP обнаружил, что Алиевы за госсчет отдыхают на яхтах азербайджанских нефтяников, контролируют по меньшей мере шесть роскошных пятизвездочных отелей, построенных в Баку в последние годы и два роскошных курорта в азербайджанских горах, у дочери президента Лейлы Алиевой есть дача на российской Рублевке по соседству с резиденцией Путина, по данным OCCRP, оффшоры, связанные с Алиевыми и контролирующие бизнес семьи, долгое время не платили налоги в бюджет Азербайджана: бюджету был нанесен ущерб порядка $600 млн. Source link

Как отремонтировать наши дороги и заставить расти экономику, — глава совета НБУ

Реструктуризация принадлежащих Национальному банку ОВГЗ, которая позволит увеличить в этом году финансирование строительства дорог на 15 млрд грн, вновь повысила интерес к проблеме, активно обсуждаемой в экспертной среде – о целесообразных методах стимулирования экономики Украины. В данной колонке хочу порассуждать о некоторых из них. Отдельные «горячие головы» поспешили окрестить такой репрофайлинг (реструктуризация с продлением срока обращения) ОВГЗ едва ли не эмиссией денег. Это ошибочное мнение - как технически, так и по своей сути подобная операция не может считаться эмиссией. Добавлю, что механизм использования средств на дорожное строительство, высвобождающихся вследствие данного репрофайлинга ОВГЗ, закреплен в законе о госбюджете на 2017 год. Представляю, как некоторые читатели скажут: «Опять госбюджет… Разве можно позволить финансировать экономику за бюджетный счет?» Вопрос электорально чувствительный и неоднозначный. А также зависящий от экономической философии, которую исповедует тот или иной специалист. И от контекста, в котором приходиться давать на него ответ. Одной из почти непререкаемых догм экономического дискурса у нас в стране является необходимость иметь сбалансированный государственный бюджет. В среде некоторых просвещенных экспертов предлагается смотреть на проблему шире: сбалансированный госбюджет в рамках бизнес-цикла: дефициты госбюджета во время рецессий должны компенсироваться его профицитами во время экономических подъемов. Впрочем, дефицит госбюджета, по определению, как правило, является констатацией факта рецессии в экономике. Мы должны уже сейчас разрабатывать систему привлечения госбюджетных средств к процессу обеспечения устойчивого роста экономики Украины Но действительно ли государство не должно влиять на национальную экономику в долгосрочном периоде времени, отдав происходящие в ней процессы на откуп пресловутой «невидимой руке рынка»? Стоит ли столь серьезно принижать роль и возможности державы в экономических процессах? Я бы так не утверждал - даже несмотря на не лишенные резона замечания тех, кто считает, что стимулирование развития экономики с участием госбюджета способно привести к росту цен. Моя точка зрения базируется на том, что в условиях экономической рецессии, из которой Украина сейчас пытается выйти, домохозяйства и корпоративный сектор увеличивают свои сбережения. Рост сбережений частного сектора ведет к торможению деловой активности. То есть, осложняет процесс выхода из рецессии. Конечно, было бы чрезмерно смело призывать прямо сейчас к масштабному госбюджетному стимулированию экономики. Да и возможности такой нет. Однако, ситуация, когда весьма значительная доля средств госбюджета тратится на цели социальной поддержки, а развитие промышленности обделяется вниманием, не может считаться приемлемой, так как она консервирует проблему, а не решает ее. Вопрос ведь не только в дефиците госбюджета, как таковом, но и в эффективности его использования. Мы должны уже сейчас разрабатывать систему селективного точечного привлечения госбюджетных средств (пусть и в реалистично скромных объемах) к процессу обеспечения устойчивого роста экономики и создания в Украине индустриальных предприятий, адекватных современной мировой технологической парадигме. По мере выхода экономики из кризиса средства для этого в госбюджете должны быть запланированы. В плане участия государства в развитии экономики важен еще и психологический эффект. Особенно сейчас, когда глубоким и долгосрочным кризисом, в котором пребывала экономика Украины с 2014 по 2016 годы, определены нынешние стандарты поведения: предприниматели сокращают бизнес, банки прекращают кредитование, все, в особенности население, переходят в режим строгой экономии. Эти стандарты вынужденные, но бесперспективные. С ними можно консервировать состояние полужизни - бродить поперек тоннеля, радуясь, что ноги еще ходят, но не идти к свету в его конце. А экономике нужно показать свет. В том числе, и при помощи бюджетных стимулов (хотя бы скромных) для стратегических долгосрочных проектов (с учетом напряженной бюджетной ситуации, пожалуй, пока только для них). Ведь важная проблема украинской экономики состоит в том, что у большинства предприятий горизонт планирования сжался до единицы зарплатно-налогового цикла - до квартала. Нацеленность лишь на выживание - губительный для экономики фактор. Нужны задачи с циклом реализации, как минимум, в 2-3 года. Психологическая, а затем производственная перестройка под более длинный горизонт планирования вдохнут жизнь в украинский бизнес. Разве можно питать оптимизм в условиях, когда для многих предприятий выплата зарплаты является чуть ли не маленьким подвигом? Думаю, что создание системы государственного участия в долгосрочных проектах стратегической важности, помимо финансовой помощи в их реализации, создаст необходимые предпосылки и для улучшения психологического аспекта настроений и ожиданий бизнеса в нашей стране. В конце концов, когда частный сектор экономики начнет тратить больше, то и дефицит госбюджета за счет автоматических стабилизаторов уменьшится. Я всегда с уважением отношусь к мнениям оппонентов. В том числе и тех, кто как огня боится увеличения количества денег в экономике, предрекая обязательным следствием этого инфляцию. Но тесная связь между объемом денежной массы и изменениями других экономических переменных (в том числе динамикой ВВП и инфляции) сама по себе не говорит однозначно о происхождении или направлении влияния. С одной стороны, монетарные изменения могут зависеть от возникших независимо от них изменений в других экономических переменных. С другой стороны, изменения в объеме ВВП и динамике цен могут быть вызваны причинами, возникшими независимо от монетарной политики. Оба эти фактора могут взаимодействовать, но при каждом из них могут присутствовать элементы независимости. В завершении вернусь к проблеме дорог. Один из вариантов финансирования ее решения - государственно-частное партнерство (ГЧП), которое может и должно быть еще одним способом реализации активного участия государства в стимулировании экономики. Механизм ГЧП применяется тогда, когда государство заинтересовано в притоке частных инвестиций, но не намерено утрачивать право собственности на объект, в который необходимо вкладывать средства, а также ограничено в возможностях в плане объемов собственных вложений в его развитие. В наибольшей степени подобное партнерство подходит для реализации крупных инфраструктурных проектов. Применяя механизм государственно-частного партнерства, Украина имеет возможность использовать финансовый и научно-технический потенциал частного сектора в условиях серьезной ограниченности госбюджетного финансирования и пока что дорогого банковского кредитования. Важной чертой подобного партнерства является синергия финансовых возможностей частных компаний с госгарантиями, которые значительно повышают уровень доверия к реализуемым проектам. В аспекте ГЧП для Украины едва ли не в первую очередь стоит говорить о сфере инфраструктуры, в том числе, транспортной, и о ЖКХ. Бесспорно, важна прозрачная процедура отбора проектов в рамках ГЧП. А прогнозная окупаемость реализуемых проектов должна оцениваться с применением такого критерия, как будущие налоговые поступления от компаний, которые поведут свою деятельность с использованием результатов реализации таких проектов. Кстати, во Франции два основных оператора ГЧП обеспечивают 60% переработки отходов, 62% водоснабжения и 75% городского центрального отопления. А в Великобритании проекты государственно-частного партнерства обеспечивали в последние несколько лет 17% экономии госбюджета. Думаю, что активизация применения механизма ГЧП должна позволить сэкономить средства государственного бюджета Украины, которые мы сможем направить не только на поддержку социально незащищенных слоев населения, но и на цели формирования современной индустриальной экономики. А если эти цели будут достигнуты, то создадутся предпосылки для снижения количества остро нуждающихся в государственной поддержке граждан. Больше мнений здесь Source link

Качество сервиса на три буквы

«В старом мире, мы тратили 30% нашего времени на создание хорошего сервиса и 70% времени на то, чтобы рассказать о нём. В современном мире всё наоборот» — Джефф Безос, CEO, Amazon“Это самый ужасный сервис на свете! Верните мне мои деньги немедленно!” — каждый инженер техподдержки хотя бы раз, но слышал такое от пользователя. Да что и говорить, чаще всего высказываются самые недовольные: “Я 27 минут висел на телефоне", “Мою проблему не могут решить уже четвертый день!”. Те, кто никогда не работал в саппорте судят о качестве предоставляемого сервиса по своему личному опыту. А как о нем судим мы, те, кто отвечает на звонки и решает проблемы? Как определить, хороший ли сервис вы предоставляете своим пользователям?На самом деле тут не нужно изобретать велосипед — всё уже давно придумали до нас. Достаточно обратиться к ключевым показателям эффективности (КПЭ/kpi) и цифрам. Цифры - язык, понятный всем, будь то новый инженер, которому ставят цели или топ-менеджер, которого нужно убедить о необходимости расширения штата. Существует множество метрик, сотни книг и статей, о том, как их применять и что с ними делать. Я же хочу рассказать лишь о тех, которые используются в нашей команде и как показала практика, они выполняют свое назначение. Причем я не буду приводить тут безумные графики и научные исследования, а просто расскажу несколько любопытных историй из жизни.Начну с самого начала. Когда я пришла работать в Parallels, у нас уже было порядка 5 млн пользователей Parallels Desktop for Mac по всему миру. В активе значились первая линия поддержки на аутсорсе, вторая линия в Москве и посменный график 24/7. Команд было много, работы тоже. Я пришла как раз во время очередного мажорного релиза. Так получилось, что все тренеры были в Индии на обучении наших саппортеров. Мне дали почитать правила работы и инструкции по продуктам и «десантом» выбросили сразу в ночные смены. Первым делом, как прилежная ученица я изучила все метрики (а тогда их было больше 20!), вроде бы разобралась и благополучно забыла до тех пор, пока следом за мной не пришел новый инженер, которого мне поручили учить. В голове была абсолютная путаница — какая метрика за что отвечает? Как что считается? А самое главное — как я могу на что повлиять? Конечно, в итоге я во всем разобралась, но, став тимлидом, первым делом я убрала из целей половину метрик, оставив только самые главные.У меня нет никаких саппортерских дипломов или пройденных специализированных курсов. В активе скромный штат и ресурсы. Все чему я научилась и учусь, приходит через практику и собственные ошибки. Далее я расскажу про наши основные метрики. Некоторые из них являются еще и целями для инженеров в команде. Постараюсь излагать все предельно кратко, без сумасшедших графиков и лишней «воды». Если что-то непонятно, спрашивайте в комментариях. Incoming volume или количество обращений Как измерять? Считать количество созданных заявок за заданный промежуток времени.Почему это важно для нас? Позволяет предсказать входящий объем заявок и подготовиться — нанять вовремя больше инженеров и обучить их.Помню, когда я только пришла в поддержку, на релизах нас «заваливало», в буквальном смысле этого слова. А если кто-то из опытных вдруг еще и заболевал, то приходилось работать по 6 смен подряд, чтобы хоть как-то раскидать заявки. Бывало так, что задержка в ответе доходила до двух недель. Мы звонили пользователям, а они говорили: «Знаете, я уже просто всё заново поставил, слишком уж долго вы отвечали».Благодаря тому, что у нас есть данные о количество входящих заявок за несколько лет, мы научились правильно распределять ресурсы, планировать. Сейчас почти все релизы происходят настолько спокойно и незаметно, что раньше нам и не снилось. За 2016 год мы зафиксировали минимальное количество обращений в день — 1 заявка (9 октября) и максимальное количество — 52 заявки (16 марта). Что удивительно, даже в январские праздники нам прилетает в среднем по 8-12 заявок в день и не было ни одного дня без обращений.IRT — initial response time или время обработки новых заявок Как измерять? Берем суммарное время реакции на новые заявки и делим на количество созданных заявок за определенный промежуток времени.Почему это важно для нас? Никто не любит, когда ответа от техподдержки приходится ждать долго. В среднем, пользователь ждет ответа в social media ресурсах в течение часа, а на свой email запрос в течение 24 часов. И здесь не берутся в расчет автоответы: “ваша заявка создана”, только нормальный адекватный ответ с информацией по проблеме. Я как-то даже проводила эксперимент: завела заявку в 5 разных компаний и ждала ответа. Два письма прилетело сразу же с автоответом, что со мной свяжутся в течение 24 часов; через полчаса мне ответили из компании #3 и предоставили решение, #4 отвечали в среднем порядка 7 часов, а последнее письмо так и осталось без ответа. Удивительно то, что после обещания связаться со мной, компании #1 и #2 потерялись надолго: один ответ пришел спустя пару дней, а другой через неделю.Когда мы только начали предоставлять поддержку корпоративным клиентам, мы понятия не имели, как быстро мы отвечаем. Какие на самом деле должны быть SLA, чтобы мы их выполняли? Мы отслеживали динамику IRT в течение 3 месяцев, учли всевозможные составляющие, в том числе “человеческий фактор” и релизы, и теперь точно знаем свои сроки и стремимся их перевыполнить.FCR — first contact resolution или число заявок, решенных одним ответом Как измерять? В Parallels всегда было принято отслеживать количество интеракций в рамках одной заявки и считать заявки, решенные в первом же ответе. Хотя, судя по последним течениям и обсуждениям, это не совсем верно, ведь пользователь может вернуться и в новую заявку, но с уточняющим вопросом? Многие компании «следят» за пользователем в течение 7 дней с момента обращения в саппорт. Если пользователь пришел один раз и больше не звонил после полученного решения — отлично, это FCR.Почему это важно для нас? Если инженеры решают заявку с первого ответа — это показатель технической «прокаченности» команды. Также, отслеживая вопросы в тикетах, решенных с первого ответа, можно понять, какие статьи в базу знаний очень нужно написать, а какую инфо добавить в документацию по продукту. У нас FCR очень разный в зависимости от линии поддержки и продукта. Так, например, во второй линии поддержки для физических лиц FCR совпадает с первой линией поддержки для корпоративных клиентов. Тут причина простая — в больших компаниях есть свои админы, которые уже провели изначальный анализ и проблемы и пришли только тогда, когда сами не смогли решить.TTR — time to resolution или время решения заявкиКак измерять? Берем общее время с момента создания заявок до момента, когда проблемы решены и делим на количество созданных заявок за данный промежуток времени.Почему это важно для нас? Чем быстрее решена заявка — тем довольнее пользователь.  А что если инженер на смене не может сам решить проблему? Что если нужно задействовать разработку, QA или даже маркетинг? Получается, что от того, насколько эффективно и правильно построены процессы в вашей компании зависит, как быстро обычный пользователь получит результат, за которым пришел. А строить их нужно так, чтобы всё было быстро и четко, и легко отследить, где именно заявка «застряла». Мы, например, за 1.5 года три раза сменили схему, как заявки эскалируются «дальше», есть четкие инструкции, кому писать и куда звонить при тех или иных ситуациях, и, главное, какую информацию необходимо при этом предоставить.И опять пример из жизни (не про техподдержку, но про сервис и очень показательный). На прошлой неделе я ходила на почту за марками и простояла в очереди добрых 27 минут, а когда подошла к окошку, оказалось, что марки именно в этом окне закончились и мне нужно в другое, во второе. Во втором окне никого не было и пришлось молча ждать снова. Еще 9 минут, я уже опаздываю на работу и тут появляется Светлана. За 2 минуты Светлана рассказала мне всё, что мне нужно знать о марках, объяснила, чем отличаются марки за 37 и 35 и предложила взять открытки сразу же к себе в окошко, потому что из ящика сегодняшнюю почту на отправку уже вытащили. Я не пожалела, что ждала Светлану. То, как быстро она решила мой запрос перечеркнуло томительное время ожидания и я осталась очень довольна сервисом.QA — quality assurance или качество выполнения заявкиКак измерять? Выборочно проверяются выполненные заявки инженера и выставляется оценка, берется средняя оценка за заданный промежуток времени.Почему это важно для нас? Потому что с количеством и быстрыми ответами мы не хотим терять качество.Оценивать работу других — сложно, тем более, если заявок много, а в каждой заявке много инфы. Плюс еще оценка может быть субъективной, ведь каждый думает по-разному. Для того, чтобы была некая объективность, мы разработали специальную форму, содержащую несколько основных блоков, по которым оценивается заявка. QA менеджер (кстати, обязательно – инженер в прошлом) только выставляет «да/нет», а финальный балл считается автоматически. Еще у нас есть правила, по которым можно оспорить поставленную оценку. Получается, что-то вроде медиации — есть две заинтересованные стороны, каждый из которых выражает свою точку зрения, и независимый эксперт, который выражает объективность. Ну и конечно, CSAT – customer satisfaction или удовлетворенность клиента, про который я не буду рассказывать подробно, но не потому что «не важно», а потому что про него всегда говорят больше всего и уж точно все знают. Для нас — это одна из самых главных метрик, ведь самое важное, чтобы пользователь был счастлив, не так ли? Мы всегда разбираем «плохие» отзывы, а хорошими гордимся. Очень рекомендую инженерам создавать свою «копилку счастья» — собирать всё хорошее и хранить у себя, чтобы иногда перечитывать и понимать, для чего вы здесь и что всё не зря. Примеры из личной копилки (орфография и пунктуация сохранены):Конечно, у нас есть и второстепенные метрики. Есть цифры, которые мы достаём раз в год для каких-то особых случаев. Но есть и ситуации, в которых мы стараемся уходить от метрик. Они могут показать, в каком направлении смотреть, но они не расскажут всю историю. За цифрами всегда стоят люди, а люди совершают ошибки, думают по-разному, да и вообще иногда воспринимают KPI как демотиватор. Вводите ли вы, выбрасываете ли или просто следуете метрикам — всегда обязательно проговаривайте всё с командой и начальством. Так, в итоге, какими же должны быть КПЭ и как определить, нужны они вам или нет? Я считаю, что метрики — это хороший и проверенный инструмент. Но для него нужна четкая и подробная инструкция. Ещё Питер Друкер, один из самых влиятельных теоретиков менеджмента XX века, говорил, что управлять можно только тем, что можно измерить. Не жалейте времени, разберитесь сами и объясните каждому в своей команде, зачем, для чего и как.Руководствуйтесь базовыми принципами:выбранные метрики должны отвечать глобальной цели вашей компании. Если вы хотите, чтобы вашу техподдержку знали, как самую отзывчивую, то и измеряйте время реакции/время обработки новой заявки полученные цифры соотносите с реальностью - чтобы не смотреть на картину под одним углом вам нужно несколько опорных метрик. Расширяйте угол обзора, добавляйте те или иные цифры и проверяйте: правда? Если нет, значит, выбрали опорные метрики неверно ваша команда должна иметь влияние на метрики. Как пример, даже на количество входящих заявок вы можете так или иначе повлиять. Из самого простого — если видите, что все пользователи приходят к вам с одним и тем же вопросом, то напишите об этом статью в вашу базу знаний КБ. Банально? Тогда заведите задачу FR програм-менеджеруPMу, чтобы сделать продукт более удобным каждый в команде должен понимать, какие у него сейчас цели и как к ним прийти. Обсуждайте их периодически. Мы это стараемся делать раз в неделю или в месяц, чтобы следить за прогрессом Ну и последнее, цифры говорят правду. Да-да, даже когда это больно. Совсем больно. Будьте готовы и к этому.З.Ы. Тема КПЭ оказалась настолько интересной, что мы обсудили ее на недавнем митапе для руководителей и специалистов техподдержки SupNet. По ссылке доклады со встречи. Кстати, если хотите принять участие в очередном митапе лайкайте нашу страничку в Facebook и следите за новостями.  Source link

Фирташ поедет в США без визы

Австрийский суд разрешил экстрадицию Фирташа в США. Зачем и кому это надо? Сегодня высший земельный суд Вены завершил рассмотрение апелляции австрийской прокуратуры на решение об отказе в экстрадиции украинского бизнесмена Дмитрия Фирташа в США по запросу ФБР. Прокуратура выиграла апелляцию о выдаче украинского олигарха США, и теперь Фирташа ожидает экстрадиция.Большинство экспертов видит в лица Фирташа второго Лазаренко - но так ли это на самом деле?Давайте вспомним, кто такой Фирташ, и какова его роль в подготовке событиям, которые мы сегодня знаем, как Революцию Достоинства?Принято считать, что Фирташ был одним из спонсоров Майдана, и его креатура была одним из "лидеров" Майдана, через которую он и вел торги с Януковичем. Переговоры не удались. Янукович залил Майдан кровью.21 февраля Янукович бежал из Киева. В ночь на 23 его эвакуировали из Крыма. В ночь на 24 февраля в Крыму был совершен вооруженный захват власти и в Крым началась переброска вооруженных сил России.Сложилась ситуация, которую никто не прогнозировал. Возникла угроза не только оккупации Украины Россией, но и сильно увеличилась вероятность того, что Путин лично рассчитается с теми, кто причастен к смещению его марионетки с поста президента. Убивать свидетелей и конкурентов Путин умеет как никто.Это Фирташу, стало особенно понятно после оккупации Крыма.Поэтому он пошел на весьма хитрый ход. Украинский олигарх был задержан 12 марта 2014 года в столице Австрии по запросу Федерального бюро расследований (ФБР) США и помещен в следственный изолятор. Фирташа стали охранять агенты ФБР!Идем дальше.Помните, 22 апреля, на день рождения Владимира Кличко в Вене произошла встреча Петра Порошенко, Виталия Кличко, Виталия Ковальчука, Юрия Стеця, Сергея Левочкина и Дмитрия Фирташа.Многие тогда говорили, что на встрече обсуждался раздел Украины между "победителями Майдана" присутствовавшими на встрече. Так вот, это неправда. В Вене обсуждался план дальнейших действий между командой Фирташа и примкнувшего к ним Порошенко.Без малого три года Фирташ жил в Австрии, находясь под пристальным вниманием ФБР. Он не мог, по каким-то причинам уехать как и Лазаренко в США. Может боялся самолетов. может Обама не давал ему тех гарантий, которые пообещал Трамп.Тем не менее, как только ситуация с новым президентом США устаканилась, Фирташ начал собирать вещи. И, наверняка, уже скоро присоединится к Лазаренко в США. Там все-таки безопаснее.И еще одно интересное обстоятельство: Фирташа создал Медведчук. Кто хозяин Медведчука говорить я думаю не надо. Фирташ занимался газовыми вопросам России. Представляя ее интересы, он и нажил свои нечаянные миллиарды. Или украл? Украл у Путина? Может ли такое быть, что Фирташ догадался, что если он сдаст своего работодателя он не понесет наказание за воровство? Source link

Сам себе DBаггер. Пишем свой MySQL proxy-сервер на языке Go и подсматриваем запросы

Содержание статьи Неpедко в приложении со сложной бизнес-логикой требуется найти баг, который корнями уходит куда-то глубоко в DB-слой. Дело еще больше усложняется, когда в прилoжении нетривиальные SQL-запросы выражены через ORM или, что еще хуже, когда в системе пoстроения запросов напрочь отсутствует какая-то структура. В такой ситуации на помoщь может прийти proxy-сервер, который перехватит вcе запросы из приложения в БД и отобразит их в удобочитаемoм виде. В этой статье мы рассмотрим те особенности протокола MySQL, которые помoгут нам написать такой сервер.  Общая идея Место proxy-сервера кaк раз между приложением, запросы которого нужно пeрехватить, и базой данных MySQL. То есть это будет обычный TCP-сервер, котоpый слушает на заданном порту входящие соединения, читает из него данные, парсит их и далее пересылает уже в базу данных в точности в том виде, в кaком они и пришли. Причем важно, чтобы proxy-сервер был асинхронным. Реализовывать вcе это хозяйство мы будем на Go, возможности которого в данном случае идеально пoдходят.  Инструментарий Сегодня нам понадобится: MySQL-сервeр. Приложение, которое шлет запросы к MySQL-серверу и зaпросы которого мы будем перехватывать. Wireshark, чтобы посмoтреть, как устроен MySQL-пакет. Базовые знания Go.  Каркас приложeния Начнем с подготовки каркаса нашего proxy-сервера, который пoка что будет работать просто посредником между приложениeм и базой данных, совершенно ничего не анализируя. Слушать он будет на локальном порту 3305, а пересылать пакеты на локальный порт 3306. // Файл main.go package main import ( "io"http://su.epeak.in/wp-content/uploads/2017/02/Сам-себе-DBаггер.-Пишем-свой-MySQL-proxy-сервер-на-языке-Go-и-подсматриваем-запросы"log"http://su.epeak.in/wp-content/uploads/2017/02/Сам-себе-DBаггер.-Пишем-свой-MySQL-proxy-сервер-на-языке-Go-и-подсматриваем-запросы"net" ) const ( MYSQL = "127.0.0.1:3306" PROXY = "127.0.0.1:3305" ) func handleConnection(conn net.Conn) { defer conn.Close() mysql, err := net.Dial("tcp", MYSQL) if err != nil { log.Fatalf("%s: %s", "ERROR", err.Error()) return } go io.Copy(conn, mysql) io.Copy(mysql, conn) } func main() { proxy, err := net.Listen("tcp", PROXY) if err != nil { log.Fatalf("%s: %s", "ERROR", err.Error()) } defer proxy.Close() for { conn, err := proxy.Accept() if err != nil { log.Printf("%s: %s", "ERROR", err.Error()) } go handleConnection(conn) } } Подробно раcсмотрим, что здесь происходит. Как ты уже, вероятно, знаешь, точка входа — это функция main. Строка proxy, err := net.Listen("tcp", PROXY) инициирует начало проcлушки на порту 3305. Важно не забыть закрыть proxy перед выходом из main: defer proxy.Close() Так как сервер должeн постоянно принимать входящие соединения, запускаем вечный цикл, в котоpом и ожидаем подключения: for { conn, err := proxy.Accept() //... go handleConnection(conn) } Здесь очень важно отметить, что вызов proxy.Accept()блокирующий. Это означает, что дaльше этой строчки кода программа выполняться не будет, пока на порт 3305 не поступит соединение. Далeе начинается все самое интересное. Последняя строка цикла запускaет метод handleConnection(conn) в отдельной горутине, что обеспечивает возможность пpинимать входящие соединения и обрабатывать их независимо дpуг от друга. Как только произошел вызов handleConnection(conn) в отдельной горутине, сразу же, не дожидаясь, пока этот метод отработает, начинается переход к следующей итерации цикла, зaтем опять ожидание подключения и так далее до бесконечности, пока прогу не зaвершат или пока она не вылетит сама :). Содержимое метода handleConnection довольно простое и пoнятное, но тем не менее именно он — «сердце» приложения. Как только приложeние коннектится к нашему proxy-серверу, происходит «дозвон» до MySQL и начинaется обмен пакетами в асинхронном режиме: go io.Copy(conn, mysql) io.Copy(mysql, conn) Все, что приходит в proxy-сервер из пpиложения, мы тут же пересылаем в MySQL, и наоборот. Это и есть проксиpование, просто пока довольно бесполезное. Чтобы дoбиться решения наших задач, придется один из вызовов io.Copy заменить своей реaлизацией, которая будет выдирать запрос из пакета. Какой из этих двух io.Copy будем заменять? А тот, который копирует данные из прилoжения в MySQL. io.Copy имеет следующую сигнатуру: func Copy(dst Writer, src Reader) (written int64, err error) Значит, наш «клиент» — это второй вызов io.Copy, его в свое вpемя и подменим. А перед тем как начать, нужно рассмотреть, как устроен MySQL-пакeт, чтобы знать, как его парсить.  Основы MySQL-протокола В MySQL предусмотрено несколько типoв команд, на которых основывается весь прокол пeредачи данных — такие как COM_QUERY, COM_DROP_DB, COM_PING, COM_STMT_PREPARE. Каждая команда имеет свою структуру и определeнный список возможных ответов. Например, когда приложение решаeт разорвать соединение с MySQL-сервером, драйвер, который реaлизует протокол MySQL, посылает команду COM_QUIT, а в ответ может получить OK_Packet. Если вeрить официальной документации MySQL Internals Manual, то каждый пакет должен быть сформирован по следующим правилам: Размер пакета не должен пpевышать 16 Мбайт. Каждый пакет должен иметь так называемый packet header, который, в свoю очередь, состоит из payload_length (3 байта) — длина тела пакета, в байтах, и sequence_id (1 байт) — номер пакeта в последовательности. Каждый пакет должен включать в себя payload, то есть тело пaкета, содержащее всю полезную информацию. Схематично MySQL-пакeт можно представить так: payload_length sequence_id payload Нам будут интересны только команды COM_QUERY и COM_STMT_PREPARE, так кaк они и содержат в себе SQL-запросы, которые хочется достать. Пришло время выпустить монcтра Wireshark и посмотреть вживую, из чего состоят эти команды. Учитывая, что приложение, запpосы которого будем смотреть, и MySQL-сервер находятся на локальнoй машине, в списке интерфейсов Wireshark нужно выбрать что-то вроде Loopback: lo0: Начальная страница WiresharkВыбрав интерфейс, попадаем в окно, где будет видно весь нужный трафик. Пришло время отослать несколько SQL-зaпросов к серверу и посмотреть, что же получается. Пишем запрос и выпoлняем: SELECT version(); В окне Wireshark сразу же станет видно весь трафик между приложением и MySQL-сервером. Для удoбства выставим фильтр mysql.query, чтобы видеть только те пакеты, которые соответствуют командaм COM_QUERY и COM_STMT_PREPARE или, иначе говоря, которые содержат строку SQL-запроса. Страница трафикаВыбpав любую строку и развернув список ▶ MySQL Protocol, можно наблюдать всю ту структуру пакета, о которой нaписано выше: Структура пакетаКрасным выделено поле Packet Length — то же самое, что payload_length, его размeр 3 байта, а равно оно значению 17. Зеленым на рисунке выделены эти 17 байт. Как видно, тело пакета СOM_QUERY состоит из чаcтей Command и Statement. Command — это как раз индикатор команды, в данном случае СOM_QUERY. А Statement — это то, ради чего мы здесь. Команда COM_STMT_PREPARE имеет аналoгичное строение пакета. Вот, собственно, и все, что потребуется. Значит, чтобы распарсить такой пакет, нужно предпринять следующие шаги: Получить заголовoк пакета (первые 4 байта). При помощи заголовка посчитать длину тела пaкета (в данном случае это 17 байт). Получить SQL-запрос длиной 16 байт (1 байт приxодится на Command). Приступим. Извини, но продолжение статьи доступно только подписчикам Вариант 1. Подпишись на журнал «Хакер» по выгодной цене Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта, включая эту статью. Мы принимаем банковские карты, Яндекс.Деньги и оплату со счетов мобильных операторов. Подробнее о проекте Вариант 2. Купи одну статью Заинтересовала статья, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: в каждом выпуске журнала можно открыть не более одной статьи. Уже подписан? Source link

Топилин: вводить в России почасовую оплату труда – «опасная затея»

<!--Категория: --> Вводить в России почасовую оплату труда – это «опасная затея», которая может привести к нарушениям взаимоотношений между работником и работодателем. Так прокомментировал предложение депутатов Госдумы министр труда и социальной защиты РФ Максим Топилин, передает РИА «Новости». Во вторник в Госдуме состоялось заседание рабочей группы по подготовке предложений о повышении МРОТ. Министр напомнил, что в правительстве обсуждаются разные варианты по доведению МРОТ до уровня прожиточного минимума. В их числе – установление МРОТ на уровне прожиточного минимума в среднем по стране, на уровне регионального прожиточного минимума в каждом субъекте и введение почасовой заработной платы. Относительно последнего не совсем понятно, как могут складываться отношения между работником и работодателем, «нам представляется, что мы здесь можем больше потерять, нежели приобрести», отметил Топилин. Он также указал, что уровни прожиточного минимума в разных субъектах составляют от 8 до 20 тысяч рублей. Поэтому резкое повышение МРОТ может негативно сказаться на 53 регионах страны, особенно юга России и средней полосы. В конце декабря прошлого года президент Владимир Путин подписал указ об увеличении МРОТ с 1 июля 2017 года на 4% – до 7,8 тысячи рублей. <!--comments powered by HyperComments-->   <!--Категория: --> Source link

ТОП-10 необычных автомобилей Lincoln

Марка Lincoln появилась в 1917 году Генри Лиландом, но уже пять лет спустя небольшую компанию "поглотил" Ford, и с тех пор Lincoln — это бренд, под которым Ford производит и показывает автомобили высшего класса. За 100-летнюю историю марки имя Lincoln носили очень интересные машины, – передает "Популярная Механика". Lincoln XL-500 (1953). Один из многочисленных дизайнерских экспериментов компании Ford 1950-х годов. Помимо "космической" внешности, XL-500 имел встроенный телефон, диктофон и кнопочное переключение передач — на руле, как в "Формуле-1". Машина была показана на Чикагском автосалоне 1953 года, но, будем честны, затерялась в массе схожих по дизайнерским принципа концепт-каров. Lincoln Futura (1955). Двумя годами позже был показан "наследник" XL-500, модель Futura, двухместное купе с прозрачным стеклопластиковым колпаком кабины. Автомобиль на шасси Continental Mark II стал успешным — использованные в его дизайне черты впоследствии появились в моделях Lincoln Premiere, Lincoln Capri, Mercury Monterey и Ford Galaxie. Судьба самого концепта занимательна: в 1966 году его купил знаменитый кастомайзер Джордж Бэррис, как раз получивший от киностудии заказ на очень быструю разработку… "Бэтмобиля" для сериала про Бэтмена. В считанные недели он полностью изменил облик Lincoln Futura, превратив его в классический Barris Batmobile — в таком виде он дошел до наших дней. Lincoln Indianapolis (1955). Итальянский дизайнер Феличе Марино Боано дружил с Генри Фордом II, и тот в начале 1955-го заказал у итальянца оригинальный кузов на серийном шасси Lincoln, чтобы посмотреть, может ли работать в рамках бренда европейский дизайн. Боано поручил работу своему сыну Джан Паоло, и на свет появился Indianapolis, самый необычный концепт Lincoln 1950-х. Автомобиль дебютировал в Турине, некоторое время ходил по рукам коллекционерам, почти целиком сгорел в 1980-х и был отреставрирован в 2000-х. Lincoln Mark I (1973). Серия автомобилей Mark началась в 1956 году еще под отдельным брендом Continental, затем перешла к Lincoln — и закончилась восьмым (!) поколением в 1998-м. Но в середине 1970-х итальянское ателье Ghia предложило переосмыслить концепцию — и представила под своей маркой модель Lincoln Mark I (на тот момент в производстве было поколение Mark IV — но серия началась сразу с Mark II, и потому Ghia решила вернуться и использовать незадействованный номер). По сути, это был перелицованный Ford Granada немецкого производства, а решетку радиатора явно срисовали с Mercedes-Benz. Ford концепт не принял. Lincoln Continental Concept 100 (1983). Видение автомобиля будущего Ford образца 1980-х. Аэродинамические формы, галогеновые лампы (для 1983-го — просто революция), обогрев переднего стекла, парктроник и открывание дверей брелком (обратите внимание на отсутствие дверных ручек). Lincoln Quicksilver (1983). Аэродинамический эксперимент, заказанный "Фордом" у ателье Ghia — эта машина была частью исследовательского проекта под общим названием Ford Probe. Шикарный седан с двигателем V6 был представлен на Женевском автосалоне и до 1986-о регулярно появлялся на самых разных автошоу. Интересно, что в 2014-м компания продала машину на благотворительном аукционе, и сегодня концепт-кар находится в частной коллекции. Lincoln Sentinel (1996). Концептуальный макет (полноценного "Сентинела" не существовало), вдохновленный формами классических Lincoln начала 1960-х. Предполагалось, что именно в этом направлении будет двигаться дизайн автомобилей Ford высшего класса. Lincoln Navicross (2003). Концепт спортивного внедорожника — даже название прототипа представляет собой смесь слов Navigator (серийного джипа Lincoln) и "кросс". Интересно, что при всем этом компания пыталась сохранить люксовую стилистику, и даже использовала заднепетельный подвес задних дверей, что для внедорожника более чем странно. Lincoln Mark X (2004). Эффектная попытка возродить серию Mark, о которой уже шла речь выше. Поразительной красоты концепт, разработанный ведущим дизайнером бренда Мареком Рейхманом, был впоследствии продан на аукционе "Сотби" за $129 000. Lincoln C (2009). Семейный городской автомобиль с 1,6-литровым двигателем — это совсем не стиль Lincoln. Просто под этим брендом представили будущую серийную модель Mercury. Но поскольку корпорация спустя несколько лет бренд Mercury ликвидировала как таковой, модель С так и осталась концепт-каром. Source link

Робот Роскомнадзора оштрафовал «Медиазону». Реакция соцсетей

Протокол об административном правонарушении был составлен за новости о Меджлисе крымскотатарского народа (организация запрещена в России, далее — ОЗПвР), включенном в список экстремистских организаций в апреле 2016 года, и националистической организации Misanthropic Division (ОЗПвР), признанной экстремистской и запрещенной в 2015 году. В этих заметках не было указания о запрете данных организаций на территории России. «Медиазону» оштрафовали за новости про экстремистские организации. Нарушение нашел робот Роскомнадзораhttps://t.co/J58aRUUZ7m — Meduza (@meduzaproject) 21 лютого 2017 р. О том, почему Медиазоной столь пристально и не без финансовой подоплеки заинтересовалось российское надзорное ведомство, в официальном Telegram-канале издания подробно рассказал его главный редактор Сергей Смирнов: «Сегодня мы с Дмитрием Швецом были в РКН, на нас выписали протокол об административном правонарушении: в новостях про Меджлис и Мизантропик Дивижн мы не написали, что это экстремистские организации. Для понимания, мы обычно пишем, но тут упустили. То есть формально да, нарушение. Нам в РКН сказали, что нарушение этой нормы закона теперь выявляет робот — специальная программа. Вычисляет, присылает сотруднику РКН ссылку, тот делает скриншот, пересылает третьему сотруднику. Тот оформляет протокол. Штраф от 4 до 5 тысяч для должностных лиц (на меня два таких выписали), но есть и штрафы для юрлиц. Там от 40 до 50 тысяч. Важно, что нам так и не объяснили, сколько есть у корректора/редактора времени, чтобы исправить ошибку. В принципе для штрафа может хватит и получаса. И еще. В Роскомнадзоре сказали, что вот прямо стали выписывать: «мы раньше предупреждали, звали на профилактические беседы. А вот с начала февраля стали выписывать штрафы» Честно говоря мы не видим общественной опасности в том, что в новости про Мизантропик дивижн написали, что это ультраправые, обвиняемые в убийствах, но не упомянули, что они в списке экстремистских организаций. Но будь аккуратен, робот РКН следит за тобой». . Ранее Роскомнадзор рассылал СМИ предупреждения, но с февраля начал выписывать штрафы, не делая предварительных замечаний. Закон «О СМИ» требует от изданий обязательного упоминания запрета деятельности на территории России экстремистких организаций. Штраф за нарушение данного закона составляет от 4 до 5 тысяч рублей для должностных лиц и от 40 до 50 тысяч для юридических. Вторую жизнь новость о штрафе Медиазоны получила в соцсетях — пользователи отреагировали на «робота Роскомнадзора»: У Роскомнадзора появился специальный робот, которые ищет упоминания экстремистских организаций в СМИ. Штраф 5000 рублей. pic.twitter.com/8QtG6noyA0 — ROTENBERG (@SERG__ROTENBERG) 21 лютого 2017 р. Робот Роскомнадзора нарушает все три закона робототехники — Боевая фурфура (@dm_e) 21 лютого 2017 р. .@sssmirnov pic.twitter.com/kwjyS6IBuj — 🐷❤️✨ (@OraclePigFuntik) 21 лютого 2017 р. (на фото — главред Медиазоны) @sssmirnov платить будете? Встанете на колени перед роботом фашистской системы? — Константин Львович (@Sector_KL) 21 лютого 2017 р. @sssmirnov @meduzaproject Наконец-то роботы начали работать. Видно, что страна технически прогрессирует. — La Russie parle (@Russia_calls) 21 лютого 2017 р. @sssmirnov @Sector_KL Ты сам напросился, белковый pic.twitter.com/hqPkYTZg7l — Робот Роскомнадзора (@OVCIOM) 21 лютого 2017 р. (вообще вариаций роботов было очень много) Робот Роскомнадзора pic.twitter.com/y8xYWMePAs — Vladislav (@unkn0wnerror) 21 лютого 2017 р. Робот Роскомнадзора pic.twitter.com/wuJ2apb0Zp — Захар Май (@ZaxarBorisych) 21 лютого 2017 р. @ZaxarBorisych К новости «Роскомнадзор заблокировал 127.0.0.1». pic.twitter.com/wqfVRsaq5g — Pan Doktor (@pan_dok) 21 лютого 2017 р. Ну и из раннего (когда это ещё не было мейнстримом): Запущеный в интернет робот Роскомнадзора для поиска экстремизма вернулся обратно пьяный и в ватнике. — Усы Пескова (@Sandy_mustache) 25 квітня 2014 р. тестирую робот роскомнадзора:. пропаганда педофилии превыше тетранитропентаэритрита клянусь суицидом — павел лобков (@pavellobkov) 25 квітня 2014 р. Надзорное ведомство запустило систему автоматического мониторинга интернета в 2014 году. По словам главы Роскомнадзор Александра Жарова, программа «самообучаемая», предназначена для мониторинга не только СМИ, но также форумов и соцсетей. В её задачи входит поиск материалов экстремистского характера, ориентируясь на «ключевые маркеры». Также Роскомнадзор использует автоматические системы мониторинга интернета, разработанные «Лигой БезИнтернета». Но они используются для поиска информации, связанной с пропагандой педофилии, самоубийств и наркотиков. Системы автоматического мониторинга интернета на предмет «запрещёнки» используют или пока только заказывают разные ведомства Российской Федерации — от региональных властей до силовых структур. Видимо, СМИ нужно запустить своего бота, который будет вставлять в публикации вышеупомянутый ОЗПвР, ориентируясь на свои «ключевые маркеры». . . Читайте также: Экстремизм для МВД в Сети отыщет робот🔓На службу России призвали Зевса. Полиция закупает ПО для слежки за пользователями соцсетей🔓Робот-цензор-социопат от «Триколор ТВ»🔓Власти Башкирии решили осуществить в Сети масштабный поиск экстремизма🔓Роскомнадзор выделит 216 млн рублей на экспертизу СМИ и блогов по соблюдению ими законов . Source link

Recent Posts

[Из песочницы] NSRegularExpression и NSDataDetector — Быстрый старт

Работа с регулярными выражениями в iOS 10Всем привет! В этой статье мы разберем как работать с NSRegularExpression и NSDataDetector, всех неравнодушных приглашают под кат.Регулярное выражение — строка или последовательность символов, которые задают шаблон. С помощью которого можно делать очень гибкие поисковые выборки в тексте.Допустим у нас имеется некий текст в строке и наша задача найти в нем все перечисленные email-адреса. Самый лучший инструмент для этой задачи это регулярные выражения.Пишем Р.В. (Регулярное Выражение) для проверки email. Для начала нужно описать базовые условия всех возможных комбинаций видов эл.адресов. В самом минимальном варианте, он может иметь следующий вид: a@b.ioот 1 символа на имя ящика — до 64-х символов от 1 зарезервированных символ «собака» от 1 символа имени ресурса — до 64-х символов от 2 символа домена — до 64-х символов Начинаем составлять РВ поэтапно:@"()" — говорит, что имя ящика может содержать любую букву и любую цифру @"(){1,64}" — говорит, что группа этих символов может быть длиной от 1 до 64-х символов @"(){1,64}" — говорит, что можно указать еще и эти символы @"(){1,64}@" — говорит, что собака на данном месте обязательна @"(){1,64}@(){1,64}" — Добавляем все те же символы, только после @ @"(){1,64}@(){1,64}\." — говорит, что символ точка на этом месте обязательна @"(){1,64}@(){1,64}\.(){2,64}" — говорит, что имя домена может содержать буквы и цифры общей суммы символов от 2 до 64-х символовТолько что мы составили полноценное регулярное выражение.Неполный справочник зарезервированных символов для РВ:Символ Значение ^ начало проверяемой строки $ конец проверяемой строки . любой символ | логическое ИЛИ ? предшествующий символ или группа символов является необязательными + один или несколько экземпляров предшествующего элемента * любое количество экземпляров элемента (в том числе и нулевое d цифровой символ D не циф. символ s пробельный символ S не пробельный символ w соответствует любой букве или цифре; эквивалент W наоборот эквивалент , все символы кроме этих Квантификаторы {n} ровно n раз {m,n} включительно от M до N {m,} не менее m раз {,n} не более n раз () создание группы в таких скобках говорим, «любой символ из этих, но только один Создание NSRegularExpressionself.mainText = @"There’s also +39(081)-552-1488 a “Bookmark” button that allows the user to highlight any date, time or location in the text. For simplicity’s sake, www.ok.ru you won’t +39(081)552 2080 not cover every possible format of date, time and 2693485 location strings that can appear in your text. You’ll implement the https://github.com bookmarking functionality +249-54-85 at the very end +39 333 3333333 of the tutorial. vk.com Your first step to getting the search functionality working is to turn standard strings representing regular expressions into http://app.com NSRegularExpression objects."; NSString* pattern = @"\b(in)|(or)\b"; // Хотим искать слова "in" или "or" NSRegularExpressionOptions regexOptions = NSRegularExpressionCaseInsensitive; // Поиск вне зависимости от регистра NSError* error = NULL; // Само создание регулярного выражения NSRegularExpression* regex = ; if (error){ NSLog(@"Ошибка при создании Regular Expression"); // Если в pattern были внесены корректные данные, тогда это сообщение не появиться } Справедливости ради должен отметить, что при создании паттерна, в строке мы должны писать непросто w,(или любую другую букву или символ который зарезервирован) а писать backslash два раза что бы экранировать NSString. \wМанипуляции с экземпляром NSRegularExpressionОбщее количество всех найденных совпадений NSUInteger numberOfMatches = )]; Возвращает range первого совпадения NSRange rangeOfFirstMatch = )]; if (!NSEqualRanges(rangeOfFirstMatch, NSMakeRange(NSNotFound, 0))) { NSString *substringForFirstMatch = ; } Получаем массив всех найденных совпадений NSArray *matches = )]; for (NSTextCheckingResult *match in matches) { //=== Через проперти resultType, можно проверить // к какому типу относиться найденый матч if (match.resultType == NSTextCheckingTypeQuote) NSLog(@"Цитата!"); NSRange matchRange = ; NSRange firstHalfRange = ; NSRange secondHalfRange = ; } Получаем первое совпадение из общего количества NSTextCheckingResult *match = )]; if (match) { NSRange matchRange = ; NSRange firstHalfRange = ; NSRange secondHalfRange = ; } Проходим итератором блоком по каждому совпадению __block NSUInteger count = 0; ) usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop){ NSRange matchRange = ; NSRange firstHalfRange = ; NSRange secondHalfRange = ; if (++count >= 100) *stop = YES; }]; Нахождение нашего паттерна в тексте и вставляем на его место слово Sieg!!! NSString *modifiedString = ) withTemplate:@"Sieg!!!"]; Обзор класса NSDataDetectorNSDataDetector — это подкласс NSRegularExpression, сделанный для удобного поиска (ссылок, номеров телефонов, даты и т.д.). То есть фактический этот класс у себя под капотом содержит универсальные регулярные выражения для поиска вышеперечисленного.Также NSDataDetector может вызывать все методы NSRegularExpression, также искать firstMatch/matches всего текста и т.д.Манипуляции с экземпляром NSDataDetector Создание экземпляра NSDataDectector NSError* error1 = nil; NSDataDetector* detector=; /* Типы данных, того чего можно искать NSTextCheckingTypeOrthography NSTextCheckingTypeSpelling NSTextCheckingTypeGrammar NSTextCheckingTypeDate NSTextCheckingTypeAddress NSTextCheckingTypeLink NSTextCheckingTypeQuote NSTextCheckingTypeDash NSTextCheckingTypeReplacement NSTextCheckingTypeCorrection NSTextCheckingTypeRegularExpression NSTextCheckingTypePhoneNumber NSTextCheckingTypeTransitInformation */ Количество найденных совпадений в текстеNSUInteger numberOfMatchesFromDetect = )]; Все совпадения в одном массиве (он содержит объекты NSTextCheckingResult) NSArray* matchesFromDetect =)]; // ----- Проходим по каждому совпадению и смотрим что там for (NSTextCheckingResult* match in matchesFromDetect) { NSLog(@"------------"); NSRange matchRange = ; if ( == NSTextCheckingTypeLink) { NSURL* url = ; NSLog(@"url = %@",url.absoluteString); } else if ( == NSTextCheckingTypePhoneNumber) { NSString *phoneNumber = ; NSLog(@"phone = %@",phoneNumber); } } Проходим блоком по всем совпадениям __block NSUInteger countForDectect = 0; ) usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) { NSRange matchRange = result.range; NSLog(@"In Enumerate = %d, tRange = %@t tText = %@",countForDectect, NSStringFromRange(matchRange), ); countForDectect++; }]; Краткая документация свойствамПроперти экземпляра NSRegularExpression Трактовка var pattern: String Возвращает паттерн регулярного выражения. var options: NSRegularExpression.Options Возвращает параметры поиска например: ищем без учета регистра NSRegularExpressionCaseInsensitive. var numberOfCaptureGroups: Int Возвращает количество групп из паттерна регулярного выражения, например: @»^(ab|bc)(amg|img)$" — тут две группы Всем кто дочитал до конца и поставил палец вверх, буду очень признателен. Проект можно найти по этой ссылке: здесь Source link
1 of 6,674

Recent Posts

1 of 6,674