SlideShare a Scribd company logo
1 of 121
Download to read offline
Автоматизация
  локализации iOS-приложений


             Андрей Субботин

         eploko@yandex-team.ru
                      @eploko
    1
Зачем?         Что это?


Как это?         Кто?


Яндекс.        Страшное


Полезное       Забавное

           2
Зачем нужна
локализация?


     3
Can't read,
won't buy.


     4
52,4% не покупают продукт на чужом
                             языке.
      60% — для Франции, Японии и
                          России.
    89,3% — если английский знают
                           плохо.




                5
http://bit.ly/whylocalize




            6
Интернационализация   i18n


 = подготовка продукта к
            локализации


              7
Локализация      L10n

= адаптация продукта к
   конкретному языку и
            местности

          8
Понятный язык интерфейса.




      9
Дата и время в привычном формате.




              10
Корректная сортировка списков.




           11
Поддержка местных единиц измерения.




                12
Правильное форматирование чисел.




             13
Что локализуется
 в приложении?


       14
Текстовые строки.




15
XIB-файлы.




16
Изображения, аудио.




17
Как приложение
  подгружает
   ресурсы?

      18
19
en.lproj


           20
ru.lproj


           21
Подготовка строк
 к локализации


       22
NSLocalizedString

           = ваш друг!




   23
NSLocalizedString(@"key",
@"translator comment")




               24
NSLog(NSLocalizedString(@"Some sample
text", @"A text string to be output to the
logs."));




                     25
2012-03-06 08:10:05.433
L10nSample[15433:f803] Some sample
text



2012-03-06 08:11:02.117
L10nSample[15438:f903] Некий
примерный текст




                 26
NSFormatter

        = тоже ваш друг!
→ Data Formatting Guide




   27
Выделение строк


       28
*.m → Localizable.strings

$ genstrings *.m -o Resources/en.lproj




                   29
en.lproj/Localizable.strings
/* A text string to be output to the logs. */

"Some sample text" = "Some sample text";




ru.lproj/Localizable.strings
/* A text string to be output to the logs. */

"Some sample text" = "Некий примерный текст";




                              30
Выделение строк
    из XIB


       31
*.xib → *.strings

$ ibtool --export-strings-file 
en.lproj/ViewController.strings 
en.lproj/ViewController.xib




               32
en.lproj/ViewController.strings


/* Class = "IBUIButton"; normalTitle = "Welcome!";
ObjectID = "8"; */

"8.normalTitle" = "Welcome!";




                         33
Вмерживание
 переводов
  обратно

     34
*.strings → *.xib

$ ibtool --import-strings-file 
en.lproj/ViewController.strings 
en.lproj/ViewController.xib 
--write en.lproj/ViewController.xib




                35
Инкрементальное
обновление XIB'ов


        36
Создали en.XIB.
  Локализовали en.XIB → ru.XIB.
Добавили новую кнопку в en.XIB.

               А теперь что?!




          37
en.xib → ru.xib
$ ibtool
--previous-file en.lproj/Window.old.xib
--incremental-file ru.lproj/Window.old.xib
--strings-file ru.lproj/Window.strings
--localize-incremental
--write ru.lproj/Window.xib
en.lproj/Window.new.xib


                     38
en.xib → ru.xib
$ ibtool
--previous-file en.lproj/Window.old.xib
--incremental-file ru.lproj/Window.old.xib
--strings-file ru.lproj/Window.strings
--localize-incremental
--write ru.lproj/Window.xib
en.lproj/Window.new.xib


                     39
en.xib → ru.xib
$ ibtool
--previous-file en.lproj/Window.old.xib
--incremental-file ru.lproj/Window.old.xib
--strings-file ru.lproj/Window.strings
--localize-incremental
--write ru.lproj/Window.xib
en.lproj/Window.new.xib


                     40
en.xib → ru.xib
$ ibtool
--previous-file en.lproj/Window.old.xib
--incremental-file ru.lproj/Window.old.xib
--strings-file ru.lproj/Window.strings
--localize-incremental
--write ru.lproj/Window.xib
en.lproj/Window.new.xib


                     41
en.xib → ru.xib
$ ibtool
--previous-file en.lproj/Window.old.xib
--incremental-file ru.lproj/Window.old.xib
--strings-file ru.lproj/Window.strings
--localize-incremental
--write ru.lproj/Window.xib
en.lproj/Window.new.xib


                     42
en.xib → ru.xib
$ ibtool
--previous-file en.lproj/Window.old.xib
--incremental-file ru.lproj/Window.old.xib
--strings-file ru.lproj/Window.strings
--localize-incremental
--write ru.lproj/Window.xib
en.lproj/Window.new.xib


                     43
en.xib → ru.xib
$ ibtool
--previous-file en.lproj/Window.old.xib
--incremental-file ru.lproj/Window.old.xib
--strings-file ru.lproj/Window.strings
--localize-incremental
--write ru.lproj/Window.xib
en.lproj/Window.new.xib


                     44
Храните предыдущие
 версии XIB файлов.




45
Не правьте руками
локализованные XIB файлы.




      46
Переводчики


     47
Переводчики

понимают английский.




 48
Переводчики

не всегда понимают русский.




       49
Переводчики
 не используют Xcode
и не редактируют XIB.




 50
Переводчики
Не знают контекста перевода
          без вашей помощи.




        51
Как они
работают?


    52
Вместе с вами,
           но редко.




53
Очень часто

        по e-mail.




54
translations.launchpad.net
                +1 к карме




        55
Tanker

= web-сервис
= API для загрузки и
выгрузки переводов

           56
Babelfish




 Yoda



   57
Babelyoda


           избавляет от
рутинной ручной работы


сводит количество багов
      при локализации к
              минимуму


    58
генерирует .strings
 из кода и XIB’ов          загружает .strings
                                в Tanker

    забирает из Tanker’а
     свежие переводы

                                обновляет
                                XIB файлы
      аккуратно все
      коммитит в git
                             PROFIT!!
Babelyoda


= библиотека для работы с .strings,
                genstrings и ibtool




              60
Babelfile
              ...по аналогии с
Makefile, Gemfile, Rakefile и т.п.

= единое место конфигурации.




        61
Babelyoda::Specification.new do |s|
 s.name = 'YandexMaps'
 s.development_language = :en
 s.localization_languages = [:ru, :uk, :tr]
 s.engine = Babelyoda::Tanker.new do |t|
  t.token = ENV['TANKER_TOKEN']
  t.project_id = 'myak_iphone'
  t.endpoint = ENV['TANKER_HOST']
 end
 s.scm = Babelyoda::Git.new
 s.source_files = FileList['{Classes,Shared}/**/*.{m,mm,h}']
 s.resources_folder = 'Resources'
 s.xib_files = FileList['Resources/**/en.lproj/*.xib']
 s.strings_files = FileList['Resources/**/en.lproj/*.strings']
end


                                 62
Babelyoda::Specification.new do |s|
 s.name = 'YandexMaps'
 s.development_language = :en
 s.localization_languages = [:ru, :uk, :tr]
 s.engine = Babelyoda::Tanker.new do |t|
  t.token = ENV['TANKER_TOKEN']
  t.project_id = 'myak_iphone'
  t.endpoint = ENV['TANKER_HOST']
 end
 s.scm = Babelyoda::Git.new
 s.source_files = FileList['{Classes,Shared}/**/*.{m,mm,h}']
 s.resources_folder = 'Resources'
 s.xib_files = FileList['Resources/**/en.lproj/*.xib']
 s.strings_files = FileList['Resources/**/en.lproj/*.strings']
end


                                 63
Babelyoda::Specification.new do |s|
 s.name = 'YandexMaps'
 s.development_language = :en
 s.localization_languages = [:ru, :uk, :tr]
 s.engine = Babelyoda::Tanker.new do |t|
  t.token = ENV['TANKER_TOKEN']
  t.project_id = 'myak_iphone'
  t.endpoint = ENV['TANKER_HOST']
 end
 s.scm = Babelyoda::Git.new
 s.source_files = FileList['{Classes,Shared}/**/*.{m,mm,h}']
 s.resources_folder = 'Resources'
 s.xib_files = FileList['Resources/**/en.lproj/*.xib']
 s.strings_files = FileList['Resources/**/en.lproj/*.strings']
end


                                 64
Babelyoda::Specification.new do |s|
 s.name = 'YandexMaps'
 s.development_language = :en
 s.localization_languages = [:ru, :uk, :tr]
 s.engine = Babelyoda::Tanker.new do |t|
  t.token = ENV['TANKER_TOKEN']
  t.project_id = 'myak_iphone'
  t.endpoint = ENV['TANKER_HOST']
 end
 s.scm = Babelyoda::Git.new
 s.source_files = FileList['{Classes,Shared}/**/*.{m,mm,h}']
 s.resources_folder = 'Resources'
 s.xib_files = FileList['Resources/**/en.lproj/*.xib']
 s.strings_files = FileList['Resources/**/en.lproj/*.strings']
end


                                 65
Babelyoda::Specification.new do |s|
 s.name = 'YandexMaps'
 s.development_language = :en
 s.localization_languages = [:ru, :uk, :tr]
 s.engine = Babelyoda::Tanker.new do |t|
  t.token = ENV['TANKER_TOKEN']
  t.project_id = 'myak_iphone'
  t.endpoint = ENV['TANKER_HOST']
 end
 s.scm = Babelyoda::Git.new
 s.source_files = FileList['{Classes,Shared}/**/*.{m,mm,h}']
 s.resources_folder = 'Resources'
 s.xib_files = FileList['Resources/**/en.lproj/*.xib']
 s.strings_files = FileList['Resources/**/en.lproj/*.strings']
end


                                 66
rake babel yoda
$


One command to rule
      them all!

        67
$ rake -T
rake babelyoda
rake babelyoda:create_keysets
rake babelyoda:drop_empty_strings
rake babelyoda:drop_orphan_keys
rake babelyoda:drop_orphan_keysets
rake babelyoda:extract
rake babelyoda:extract_strings
rake babelyoda:extract_xib_strings
rake babelyoda:fetch_strings
rake babelyoda:initBabelfile
rake babelyoda:localize_xibs
rake babelyoda:pull
rake babelyoda:push
rake babelyoda:remote:drop_keysets
rake babelyoda:remote:list
rake babelyoda:verify

                              68
yxbuildkit-prebuild.sh



#!/bin/bash

function verify {
	 if [ $CONFIGURATION == 'AppStore' ] ; then
	 	 rvm rvmrc trust . && rvm rvmrc load . && bundle 
                      && bundle exec rake babelyoda:verify
	 	 return $?
	 fi
	 return 0
}
	
git submodule update --init --recursive && verify

                            69
Available on GitHub!


https://github.com/eploko/babelyoda




                 70
Плюрализация

х орр ор стори


      71
I scanned 12
directories.



      72
NSLog(@"I scanned %g directories.",
      directoryCount);




                 73
I scanned 1
directories.



       74
NSLog(@"I scanned %g %@.",
    directoryCount,
    directoryCount == 1 ?
     @"directory" : @"directories",
 );



                   75
I scanned 1
directory.



       76
NSLog(
     NSLocalizedString(@"I scanned %g %@.", @”Text to show the number of
directories scanned”),
     dirScanCount,
     dirScanCount == 1 ?
       NSLocalizedString(@"directory", @”Single directory”) :
       NSLocalizedString(@"directories", @”Plural directories”)
 );




                                    77
Как это видит
переводчик?




      78
"I scanned %g %@."
"directories"
"directory"




                79
"Я просканировал %g %@."
"каталоги"
"папка"




             80
Я отсканировал 1
папка.



       81
Я отсканировал 5
каталоги.



       82
NSLog(
dirScanCount == 1 ?
NSLocalizedString("I scanned %g directory.", @”Blah”) :
NSLocalizedString("I scanned %g directories.", @”Blah”),
dirScanCount );




                            83
“It is more complicated than
you think.”
— The Eighth Networking Truth, from RFC 1925




                                 84
NSString *pluralTransfers =
NSLocalizedString(@"%d changes",
@"The number of changes shown in the route description");




                           85
NSString *forms[4] = {0};
forms[0] = NSLocalizedString(@"%d change", @"Blah");
forms[1] = NSLocalizedString(@"%d changes", @"Blah");
forms[2] = NSLocalizedString(@"%d changes", @"Blah");
forms[3] = NSLocalizedString(@"%d changes", @"Blah");

int form = YXPluralFormForN(self.transfersCount);
NSString *pluralTransfers = forms[i];




                              86
int YXPluralFormForRU(NSInteger n)
{
   // One - 1, 21, 31, ...
   // Some - 2-4, 22-24, 32-34 ...
   // Many - 5-20, 25-30, ...
   NSInteger n10 = n % 10;
   if ((n10 == 1) && ((n == 1) || (n > 20))) {
       return 0;
   } else if ((n10 > 1) && (n10 < 5) && ((n > 20) || (n < 10))) {
       return 1;
   } else {
       return 2;
   }
}




                                        87
Как это видит
переводчик?




      88
"%d change"
"%d changes"
"%d changes"
"%d changes"


              89
NSString *forms[4] = {0};
forms[0] = NSLocalizedString(@"NumberChanges0", @"Blah");
forms[1] = NSLocalizedString(@"NumberChanges1", @"Blah");
forms[2] = NSLocalizedString(@"NumberChanges2", @"Blah");
forms[3] = NSLocalizedString(@"NumberChanges3", @"Blah");

int form = YXPluralFormForN(self.transfersCount);
NSString *pluralTransfers = forms[i];




                              90
Как это видит
переводчик?




      91
"NumberChanges0"
"NumberChanges1"
"NumberChanges2"
"NumberChanges3"


          92
genstrings “магия”


        93
NSLocalizedString(@"%[one, some, many, none]d changes",
  @"The number of changes shown in the route description");




                                 94
Localizable.strings


/* The number of changes shown in the route description */
"%[one]d changes" = "%d changes";
"%[some]d changes" = "%d changes";
"%[many]d changes" = "%d changes";
"%[none]d changes" = "%d changes";




                             95
Localizable.strings


/* The number of changes shown in the route description */
"%[one]d changes" = "%d остановка";
"%[some]d changes" = "%d остановки";
"%[many]d changes" = "%d остановок";
"%[none]d changes" = "";




                             96
NSString *YXPluralFormForRU(NSInteger n)
{
  // One - 1, 21, 31, ...
  // Some - 2-4, 22-24, 32-34 ...
  // Many - 5-20, 25-30, ...
  NSInteger n10 = n % 10;
  if ((n10 == 1) && ((n == 1) || (n > 20))) {
      return @”[one]”;
  } else if ((n10 > 1) && (n10 < 5) && ((n > 20) || (n < 10))) {
      return @”[some]”;
  } else {
      return @”[many]”;
  }
}




                                        97
NSString *pluralKey = NSLocalizedString(
  @"%[one, some, many, none]d changes",
  @"The number of changes shown in the route description");

NSString *pluralTransfers = YXLocalizedStringN(pluralKey,
self.transfersCount);




                                  98
"%[one, some, many, none]d changes"




  "%[some]d changes"
“Хитрости”


    100
Английский текст в качестве ключа


NSLocalizedString(@"Tap Here", @"Action button title");

NSLocalizedString(@"TapButtonTitle", @"Action button title");




                                101
Английский текст в качестве ключа



      WelcomeButtonTitle
      WelcomeTitle
      ButtonTitleWelcome
      WelcomeTITLE
      WelcomeBtnTitle


              102
Различные контексты




Edit = Править
Edit = Изменить
Edit = Переименовать



        103
Различные контексты



NSLocalizedStringFromTable
(<#key#>, <#tbl#>, <#comment#>)

NSLocalizedStringFromTable
(@”Edit”,@”Common”,@”Blah”)

NSLocalizedStringFromTable
(@”Edit”,@”Buttons”,@”Blah”)


              104
Склеивание строк


NSString *part1 = NSLocalizedString(@"People in the room",
                     @"Part 1");
NSString *part2 = NSLocalizedString(@"%d", @"Part 2");
NSString *halfResult = [NSString stringWithFormat:@"%@: %@",
              part1, part2];
NSString *result = [NSString stringWithFormat:halfResult, 5];




                へやへ:5人
                              105
Склеивание строк



NSLocalizedString(
  @"People in the room: %[one, some, many, none]d",
  @"Blah blah");




                へやへ:5人
                             106
Полезные проекты




107
Linguan




108
Wincent Strings Utility



“Merges, extracts and
combines .string files (for
incremental localization)”
— http://wincent.com/a/products/wincent-strings-util/




                                   109
genstrings2




“40x faster than genstrings”
— http://www.cocoanetics.com/2012/01/genstrings2/




                                110
Twine



“String Management for iOS,
Mac OS X, and Android
Development”
— http://www.mobiata.com/blog/2012/02/08/twine-string-management-ios-mac-os-x




                                     111
WTF!?




  112
WTF!?




113
WTF!?




114
WTF!?




115
WTF!?




        116
WTF!?
              WTF!?




WTF!?


        117
WTF!?




        118
WTF!?
WTF!?

WTF!?

WTF!?


              WTF!?
        119
WTF!?         WTF!?
        120
Andrey Subbotin
Вопросы? :-)   eploko@yandex-team.ru
                            @eploko

More Related Content

What's hot

Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование LinuxAnthony Shoumikhin
 
Не превращайте ваши логи в клинопись
Не превращайте ваши логи в клинописьНе превращайте ваши логи в клинопись
Не превращайте ваши логи в клинописьAndrey Rebrov
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование LinuxAnthony Shoumikhin
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПzfconfua
 
Romanova techforum bash
Romanova techforum bashRomanova techforum bash
Romanova techforum bashkuchinskaya
 

What's hot (6)

Приручаем linux-консоль
Приручаем linux-консольПриручаем linux-консоль
Приручаем linux-консоль
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
 
Не превращайте ваши логи в клинопись
Не превращайте ваши логи в клинописьНе превращайте ваши логи в клинопись
Не превращайте ваши логи в клинопись
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
 
Romanova techforum bash
Romanova techforum bashRomanova techforum bash
Romanova techforum bash
 

Similar to Андрей Субботин "Автоматизация локализации iOS-приложений"

Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Александр Егурцов
 
Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Yandex
 
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"Yandex
 
Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Nikita Borzykh
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Yandex
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов ИгорьPVasili
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорьdrupalconf
 
Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Yandex
 
Xe4 launch мобильная разработка всеволод_леонов
Xe4 launch мобильная разработка всеволод_леоновXe4 launch мобильная разработка всеволод_леонов
Xe4 launch мобильная разработка всеволод_леоновЕкатерина Макарова
 
Docker в работе: взгляд на использование в Badoo через год
Docker в работе: взгляд на использование в Badoo через годDocker в работе: взгляд на использование в Badoo через год
Docker в работе: взгляд на использование в Badoo через годAnton Turetsky
 
Docker в работе: взгляд на использование в Badoo через год
Docker в работе: взгляд на использование в Badoo через годDocker в работе: взгляд на использование в Badoo через год
Docker в работе: взгляд на использование в Badoo через годBadoo Development
 
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...Ontico
 
SECON'2017, Клементьев Михаил, Обнаружение руткитов в GNU/Linux
SECON'2017, Клементьев Михаил, Обнаружение руткитов в GNU/LinuxSECON'2017, Клементьев Михаил, Обнаружение руткитов в GNU/Linux
SECON'2017, Клементьев Михаил, Обнаружение руткитов в GNU/LinuxSECON
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Minktyomo4ka
 
PHP libevent Daemons. A high performance and reliable solution. Practical exp...
PHP libevent Daemons. A high performance and reliable solution. Practical exp...PHP libevent Daemons. A high performance and reliable solution. Practical exp...
PHP libevent Daemons. A high performance and reliable solution. Practical exp...Arvids Godjuks
 
Лекция 1. Начало.
Лекция 1. Начало.Лекция 1. Начало.
Лекция 1. Начало.Roman Brovko
 

Similar to Андрей Субботин "Автоматизация локализации iOS-приложений" (20)

Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
 
Jenkins в docker in mesos in ...
Jenkins в docker in mesos in ...Jenkins в docker in mesos in ...
Jenkins в docker in mesos in ...
 
Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"
 
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
 
Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"
 
Xe4 launch мобильная разработка всеволод_леонов
Xe4 launch мобильная разработка всеволод_леоновXe4 launch мобильная разработка всеволод_леонов
Xe4 launch мобильная разработка всеволод_леонов
 
Docker в работе: взгляд на использование в Badoo через год
Docker в работе: взгляд на использование в Badoo через годDocker в работе: взгляд на использование в Badoo через год
Docker в работе: взгляд на использование в Badoo через год
 
Docker в работе: взгляд на использование в Badoo через год
Docker в работе: взгляд на использование в Badoo через годDocker в работе: взгляд на использование в Badoo через год
Docker в работе: взгляд на использование в Badoo через год
 
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
 
SECON'2017, Клементьев Михаил, Обнаружение руткитов в GNU/Linux
SECON'2017, Клементьев Михаил, Обнаружение руткитов в GNU/LinuxSECON'2017, Клементьев Михаил, Обнаружение руткитов в GNU/Linux
SECON'2017, Клементьев Михаил, Обнаружение руткитов в GNU/Linux
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
 
PHP libevent Daemons. A high performance and reliable solution. Practical exp...
PHP libevent Daemons. A high performance and reliable solution. Practical exp...PHP libevent Daemons. A high performance and reliable solution. Practical exp...
PHP libevent Daemons. A high performance and reliable solution. Practical exp...
 
php frameworks
php frameworksphp frameworks
php frameworks
 
Лекция 1. Начало.
Лекция 1. Начало.Лекция 1. Начало.
Лекция 1. Начало.
 
Erlang tasty & useful stuff
Erlang tasty & useful stuffErlang tasty & useful stuff
Erlang tasty & useful stuff
 
Little Service in 2h
Little Service in 2hLittle Service in 2h
Little Service in 2h
 

More from Yandex

Предсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksПредсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksYandex
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Yandex
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаСтруктурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаYandex
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаПредставление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаYandex
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Yandex
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Yandex
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Yandex
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Yandex
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Yandex
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Yandex
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Yandex
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Yandex
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровYandex
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Yandex
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Yandex
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Yandex
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Yandex
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Yandex
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Yandex
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Yandex
 

More from Yandex (20)

Предсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksПредсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of Tanks
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаСтруктурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаПредставление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
 

Андрей Субботин "Автоматизация локализации iOS-приложений"