Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

136 linhas
26KB

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <feed xmlns="http://www.w3.org/2005/Atom"><title>Opensource Game Studio</title><link href="https://ogstudio.github.io/" rel="alternate"></link><link href="https://ogstudio.github.io/feeds/all.atom.xml" rel="self"></link><id>https://ogstudio.github.io/</id><updated>2017-06-08T10:00:00+07:00</updated><entry><title>iOS tutorial</title><link href="https://ogstudio.github.io/ios-tutorial.html" rel="alternate"></link><published>2017-06-08T10:00:00+07:00</published><updated>2017-06-08T10:00:00+07:00</updated><author><name>Opensource Game Studio</name></author><id>tag:ogstudio.github.io,2017-06-08:/ios-tutorial.html</id><summary type="html">&lt;p&gt;&lt;img alt="iOS tutorial" src="https://ogstudio.github.io/2017-06-08-ios-refactoring.png"&gt;&lt;/p&gt;
  3. &lt;p&gt;This article describes problems we faced during the creation of iOS tutorial in May 2017.&lt;/p&gt;
  4. &lt;p&gt;&lt;a href="https://twitter.com/OpenGameStudio/status/826816343433498627"&gt;This February&lt;/a&gt; we managed to get simple model rendered under iOS in just a few days. We expected to finish iOS tutorial in no time. However, the reality reminded us: it's easy to come up …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="iOS tutorial" src="https://ogstudio.github.io/2017-06-08-ios-refactoring.png"&gt;&lt;/p&gt;
  5. &lt;p&gt;This article describes problems we faced during the creation of iOS tutorial in May 2017.&lt;/p&gt;
  6. &lt;p&gt;&lt;a href="https://twitter.com/OpenGameStudio/status/826816343433498627"&gt;This February&lt;/a&gt; we managed to get simple model rendered under iOS in just a few days. We expected to finish iOS tutorial in no time. However, the reality reminded us: it's easy to come up with a hackish demo that works for one person, but it's hard to create a concise example that works for everyone.&lt;/p&gt;
  7. &lt;h3&gt;Native library&lt;/h3&gt;
  8. &lt;p&gt;The first question we had to answer was: should the sample application be part of Xcode project or be a separately built library?&lt;/p&gt;
  9. &lt;p&gt;We had to consider the following facts:&lt;/p&gt;
  10. &lt;ol&gt;
  11. &lt;li&gt;Xcode project can use C++ directly (thanks to Objective-C++) without stuff like JNI&lt;ul&gt;
  12. &lt;li&gt;There's no need for a separate library (+ application)&lt;/li&gt;
  13. &lt;li&gt;Creating a separate library is an additional work (- library)&lt;/li&gt;
  14. &lt;/ul&gt;
  15. &lt;/li&gt;
  16. &lt;li&gt;OpenSceneGraph builds libraries&lt;ul&gt;
  17. &lt;li&gt;It's easier to use standard build process (+ library)&lt;/li&gt;
  18. &lt;li&gt;It's harder to create custom build process just for a single platform (- application)&lt;/li&gt;
  19. &lt;/ul&gt;
  20. &lt;/li&gt;
  21. &lt;li&gt;OpenSceneGraph uses CMake build system, which is not supported by Xcode&lt;ul&gt;
  22. &lt;li&gt;Xcode project can't include CMake files (- application)&lt;/li&gt;
  23. &lt;li&gt;It's easy to create custom CMake file that includes OpenSceneGraph CMake file to build a single library (+ library)&lt;/li&gt;
  24. &lt;/ul&gt;
  25. &lt;/li&gt;
  26. &lt;li&gt;CMake can generate Xcode project&lt;ul&gt;
  27. &lt;li&gt;It's possible to create a CMake file that builds both OpenSceneGraph and the sample application (+ application)&lt;/li&gt;
  28. &lt;li&gt;Xcode is the de-facto tool to create Xcode projects; it's easier to use standard build process (+ library)&lt;/li&gt;
  29. &lt;/ul&gt;
  30. &lt;/li&gt;
  31. &lt;/ol&gt;
  32. &lt;p&gt;After evaluating the pros and cons of each approach, we decided to turn the sample application into a library and include it in Xcode project. The downside of this approach is that simulator and real device builds need separate library builds.&lt;/p&gt;
  33. &lt;h3&gt;Refactoring&lt;/h3&gt;
  34. &lt;p&gt;The second question we had to answer was: should there be a single source code base for all platforms or several ones, one for each platform?&lt;/p&gt;
  35. &lt;p&gt;While doing Android tutorial we used single source code base because it worked fine for desktop and Android. As we started to work through iOS tutorial, it became apparent that particular features may or may not work on some platforms. For example, one feature may work on desktop and iOS, but not Android. Another feature may work on iOS and Android, but not desktop. Since we didn't want to pollute the code with #ifdefs, we started to put each platform combination into a separate file. The number of files grew rapidly. The files were reusable, but it became extremely hard to see the whole picture.&lt;/p&gt;
  36. &lt;p&gt;At this point, we realized there's the second question. We reminded ourselves that the main purpose of the sample source code is to teach how to do basic OpenSceneGraph things, not create a reusable library with API that is stable across several years.&lt;/p&gt;
  37. &lt;p&gt;That's when our home grown feature tool came into play. With its help, we separated the code into several parts, which in the end produce just two files for each platform:&lt;/p&gt;
  38. &lt;ol&gt;
  39. &lt;li&gt;functions.h - contains reusable classless functions&lt;/li&gt;
  40. &lt;li&gt;main.h - contains the rest of the sample application code&lt;/li&gt;
  41. &lt;/ol&gt;
  42. &lt;p&gt;Their contents differ slightly for each platform, but it's easy to see the whole picture now.&lt;/p&gt;
  43. &lt;p&gt;That's it for describing problems we faced during the creation of iOS tutorial in May 2017.&lt;/p&gt;</content></entry><entry><title>Самоучитель iOS</title><link href="https://ogstudio.github.io/ios-tutorial-ru.html" rel="alternate"></link><published>2017-06-08T10:00:00+07:00</published><updated>2017-06-08T10:00:00+07:00</updated><author><name>Opensource Game Studio</name></author><id>tag:ogstudio.github.io,2017-06-08:/ios-tutorial-ru.html</id><summary type="html">&lt;p&gt;&lt;img alt="Самоучитель iOS" src="https://ogstudio.github.io/2017-06-08-ios-refactoring.png"&gt;&lt;/p&gt;
  44. &lt;p&gt;Эта статья описывает проблемы, с которыми мы столкнулись во время создания самоучителя для iOS в мае 2017.&lt;/p&gt;
  45. &lt;p&gt;&lt;a href="https://twitter.com/OpenGameStudio/status/826816343433498627"&gt;В феврале&lt;/a&gt; мы сумели отобразить простую модель под iOS за считанные дни. Это дало нам уверенность, что самоучитель для iOS мы сделаем столь же быстро. Тем не менее, реальность напомнила нам о простой …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="Самоучитель iOS" src="https://ogstudio.github.io/2017-06-08-ios-refactoring.png"&gt;&lt;/p&gt;
  46. &lt;p&gt;Эта статья описывает проблемы, с которыми мы столкнулись во время создания самоучителя для iOS в мае 2017.&lt;/p&gt;
  47. &lt;p&gt;&lt;a href="https://twitter.com/OpenGameStudio/status/826816343433498627"&gt;В феврале&lt;/a&gt; мы сумели отобразить простую модель под iOS за считанные дни. Это дало нам уверенность, что самоучитель для iOS мы сделаем столь же быстро. Тем не менее, реальность напомнила нам о простой вещи: быстро сделать можно лишь поделку на коленке, работающую только у самого разработчика; над логически связанным примером, работающим у всех, придётся попотеть.&lt;/p&gt;
  48. &lt;h3&gt;Нативная библиотека&lt;/h3&gt;
  49. &lt;p&gt;Прежде всего нам необходимо было ответить на следующий вопрос: "должен ли пример приложения быть частью проекта Xcode или отдельной библиотекой?"&lt;/p&gt;
  50. &lt;p&gt;Для принятия решения мы использовали следующие факты:&lt;/p&gt;
  51. &lt;ol&gt;
  52. &lt;li&gt;Проект Xcode может напрямую использовать C++ (благодаря Objective-C++) без прослоек вроде JNI&lt;ul&gt;
  53. &lt;li&gt;Отдельная библиотека не нужна (+ приложение)&lt;/li&gt;
  54. &lt;li&gt;Создание отдельной библиотеки - это дополнительная работа (- библиотека)&lt;/li&gt;
  55. &lt;/ul&gt;
  56. &lt;/li&gt;
  57. &lt;li&gt;OpenSceneGraph собирается в библиотеки&lt;ul&gt;
  58. &lt;li&gt;Легче использовать стандартный процесс сборки (+ библиотека)&lt;/li&gt;
  59. &lt;li&gt;Создавать свой процесс сборки лишь для одной платформы сложно (- приложение)&lt;/li&gt;
  60. &lt;/ul&gt;
  61. &lt;/li&gt;
  62. &lt;li&gt;OpenSceneGraph использует систему сборки CMake, которая не поддерживается Xcode&lt;ul&gt;
  63. &lt;li&gt;Проект Xcode не может включать файлы CMake (- приложение)&lt;/li&gt;
  64. &lt;li&gt;Свой файл CMake может с лёгкостью включить файл OpenSceneGraph CMake для сборки единой библиотеки (+ библиотека)&lt;/li&gt;
  65. &lt;/ul&gt;
  66. &lt;/li&gt;
  67. &lt;li&gt;CMake может генерировать проект Xcode&lt;ul&gt;
  68. &lt;li&gt;Можно создать файл CMake, который будет собирать как OpenSceneGraph, так и пример приложения (+ приложение)&lt;/li&gt;
  69. &lt;li&gt;Xcode - это де-факто инструмент для создания проектов Xcode; легче использовать стандартный процесс сборки (+ библиотека)&lt;/li&gt;
  70. &lt;/ul&gt;
  71. &lt;/li&gt;
  72. &lt;/ol&gt;
  73. &lt;p&gt;Оценив плюсы и минусы обоих подходов, мы решили сделать библиотеку, которую можно включать в проект Xcode. Минусом данного подхода является то, что сборки приложения для симулятора и реального устройства используют разные сборки библиотеки.&lt;/p&gt;
  74. &lt;h3&gt;Рефакторинг&lt;/h3&gt;
  75. &lt;p&gt;Также нам пришлось ответить на ещё один вопрос: "использовать ли единую кодовую базу для всех платформ или несколько под каждую платформу?"&lt;/p&gt;
  76. &lt;p&gt;При создании самоучителя для Android мы использовали единую кодовую базу, т.к. она отлично работала для десктопа и Android. Когда мы начали работу над самоучителем iOS, стало ясно, что часть функционала либо работает, либо не работает на некоторых платформах. Например, один функционал может работать на десктопе и iOS, но не работать на Android. Другой функционал может работать на iOS и Android, но не работать на десктопе. Т.к. мы не хотели загрязнять код кучей #ifdef, мы решили помещать функционал, специфичный для конкретной платформы или нескольких платформ, в разные файлы. Это привело к резкому увеличению количества файлов. Такой подход хорошо подходил для повторного использования, но совершенно не годился для понимания общей картины.&lt;/p&gt;
  77. &lt;p&gt;В этот момент мы осознали необходимость ответа на второй вопрос. Мы напомнили себе, что главная цель примера приложения состоит в том, чтобы обучить базовым вещам OpenSceneGraph, а не создать повторно используемую библиотеку с API, который будет жить без изменений десятилетиями.&lt;/p&gt;
  78. &lt;p&gt;Для ответа на этот вопрос нам помог наш внутренний инструмент feature tool. С его помощью мы разделили код на несколько частей, который в итоге собирается ровно в два файла для каждой платформы:&lt;/p&gt;
  79. &lt;ol&gt;
  80. &lt;li&gt;functions.h - содержит повторно используемые бесклассовые функции&lt;/li&gt;
  81. &lt;li&gt;main.h - содержит остальной код приложения&lt;/li&gt;
  82. &lt;/ol&gt;
  83. &lt;p&gt;Их содержимое несколько отличается для каждой из платформ, но наличие всего двух файлов позволяет увидеть общую картину.&lt;/p&gt;
  84. &lt;p&gt;На этом мы заканчиваем описание проблем, с которыми мы столкнулись во время создания самоучителя для iOS в мае 2017.&lt;/p&gt;</content></entry><entry><title>Pelican review</title><link href="https://ogstudio.github.io/pelican-review.html" rel="alternate"></link><published>2017-06-03T22:00:00+07:00</published><updated>2017-06-03T22:00:00+07:00</updated><author><name>Opensource Game Studio</name></author><id>tag:ogstudio.github.io,2017-06-03:/pelican-review.html</id><summary type="html">&lt;p&gt;So far so nice. Pelican is really cool, and provides a quick starting guided
  85. to get up and running real fast.&lt;/p&gt;
  86. &lt;p&gt;Much more smooth than Jekyll.&lt;/p&gt;
  87. &lt;p&gt;I &amp;lt;3 Python and its ecosystem. Something is just EASIER in Python.&lt;/p&gt;</summary><content type="html">&lt;p&gt;So far so nice. Pelican is really cool, and provides a quick starting guided
  88. to get up and running real fast.&lt;/p&gt;
  89. &lt;p&gt;Much more smooth than Jekyll.&lt;/p&gt;
  90. &lt;p&gt;I &amp;lt;3 Python and its ecosystem. Something is just EASIER in Python.&lt;/p&gt;</content></entry><entry><title>Обзор Pelican</title><link href="https://ogstudio.github.io/pelican-review-ru.html" rel="alternate"></link><published>2017-06-03T22:00:00+07:00</published><updated>2017-06-03T22:00:00+07:00</updated><author><name>Opensource Game Studio</name></author><id>tag:ogstudio.github.io,2017-06-03:/pelican-review-ru.html</id><summary type="html">&lt;p&gt;Пока что полёт нормальный. Pelican действительно крут, позволяет
  91. быстро всё настроить и запуститься.&lt;/p&gt;
  92. &lt;p&gt;Намного легче, чем Jekyll.&lt;/p&gt;
  93. &lt;p&gt;&amp;lt;3 Python и его экосистему. Что-то просто ЛЕГЧЕ в Python.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Пока что полёт нормальный. Pelican действительно крут, позволяет
  94. быстро всё настроить и запуститься.&lt;/p&gt;
  95. &lt;p&gt;Намного легче, чем Jekyll.&lt;/p&gt;
  96. &lt;p&gt;&amp;lt;3 Python и его экосистему. Что-то просто ЛЕГЧЕ в Python.&lt;/p&gt;</content></entry><entry><title>My first review</title><link href="https://ogstudio.github.io/keyboard-review.html" rel="alternate"></link><published>2017-06-01T10:20:00+07:00</published><updated>2017-06-01T10:20:00+07:00</updated><author><name>Opensource Game Studio</name></author><id>tag:ogstudio.github.io,2017-06-01:/keyboard-review.html</id><summary type="html">&lt;p&gt;Here is a full review, guys.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Here is a full review, guys.&lt;/p&gt;</content></entry><entry><title>Моё первое ревью</title><link href="https://ogstudio.github.io/keyboard-review-ru.html" rel="alternate"></link><published>2017-06-01T10:20:00+07:00</published><updated>2017-06-01T10:20:00+07:00</updated><author><name>Opensource Game Studio</name></author><id>tag:ogstudio.github.io,2017-06-01:/keyboard-review-ru.html</id><summary type="html">&lt;p&gt;Вот и моё первое ревью, чуввви.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Вот и моё первое ревью, чуввви.&lt;/p&gt;</content></entry><entry><title>kr10</title><link href="https://ogstudio.github.io/kr10.html" rel="alternate"></link><published>2017-01-01T10:04:00+07:00</published><updated>2017-01-01T10:04:00+07:00</updated><author><name>Opensource Game Studio</name></author><id>tag:ogstudio.github.io,2017-01-01:/kr10.html</id><summary type="html">&lt;p&gt;kr10&lt;/p&gt;
  97. &lt;p&gt;LANG: en&lt;/p&gt;</summary><content type="html">&lt;p&gt;kr10&lt;/p&gt;
  98. &lt;p&gt;LANG: en&lt;/p&gt;</content></entry><entry><title>kr10</title><link href="https://ogstudio.github.io/kr10-ru.html" rel="alternate"></link><published>2017-01-01T10:04:00+07:00</published><updated>2017-01-01T10:04:00+07:00</updated><author><name>Opensource Game Studio</name></author><id>tag:ogstudio.github.io,2017-01-01:/kr10-ru.html</id><summary type="html">&lt;p&gt;kr10&lt;/p&gt;
  99. &lt;p&gt;LANG: ru&lt;/p&gt;</summary><content type="html">&lt;p&gt;kr10&lt;/p&gt;
  100. &lt;p&gt;LANG: ru&lt;/p&gt;</content></entry><entry><title>kr9</title><link href="https://ogstudio.github.io/kr9.html" rel="alternate"></link><published>2017-01-01T09:04:00+07:00</published><updated>2017-01-01T09:04:00+07:00</updated><author><name>Opensource Game Studio</name></author><id>tag:ogstudio.github.io,2017-01-01:/kr9.html</id><summary type="html">&lt;p&gt;kr9&lt;/p&gt;
  101. &lt;p&gt;LANG: en&lt;/p&gt;</summary><content type="html">&lt;p&gt;kr9&lt;/p&gt;
  102. &lt;p&gt;LANG: en&lt;/p&gt;</content></entry><entry><title>kr9</title><link href="https://ogstudio.github.io/kr9-ru.html" rel="alternate"></link><published>2017-01-01T09:04:00+07:00</published><updated>2017-01-01T09:04:00+07:00</updated><author><name>Opensource Game Studio</name></author><id>tag:ogstudio.github.io,2017-01-01:/kr9-ru.html</id><summary type="html">&lt;p&gt;kr9&lt;/p&gt;
  103. &lt;p&gt;LANG: ru&lt;/p&gt;</summary><content type="html">&lt;p&gt;kr9&lt;/p&gt;
  104. &lt;p&gt;LANG: ru&lt;/p&gt;</content></entry><entry><title>kr8</title><link href="https://ogstudio.github.io/kr8.html" rel="alternate"></link><published>2017-01-01T08:04:00+07:00</published><updated>2017-01-01T08:04:00+07:00</updated><author><name>Opensource Game Studio</name></author><id>tag:ogstudio.github.io,2017-01-01:/kr8.html</id><summary type="html">&lt;p&gt;kr8&lt;/p&gt;
  105. &lt;p&gt;LANG: en&lt;/p&gt;</summary><content type="html">&lt;p&gt;kr8&lt;/p&gt;
  106. &lt;p&gt;LANG: en&lt;/p&gt;</content></entry><entry><title>kr8</title><link href="https://ogstudio.github.io/kr8-ru.html" rel="alternate"></link><published>2017-01-01T08:04:00+07:00</published><updated>2017-01-01T08:04:00+07:00</updated><author><name>Opensource Game Studio</name></author><id>tag:ogstudio.github.io,2017-01-01:/kr8-ru.html</id><summary type="html">&lt;p&gt;kr8&lt;/p&gt;
  107. &lt;p&gt;LANG: ru&lt;/p&gt;</summary><content type="html">&lt;p&gt;kr8&lt;/p&gt;
  108. &lt;p&gt;LANG: ru&lt;/p&gt;</content></entry><entry><title>kr7</title><link href="https://ogstudio.github.io/kr7.html" rel="alternate"></link><published>2017-01-01T07:04:00+07:00</published><updated>2017-01-01T07:04:00+07:00</updated><author><name>Opensource Game Studio</name></author><id>tag:ogstudio.github.io,2017-01-01:/kr7.html</id><summary type="html">&lt;p&gt;kr7&lt;/p&gt;
  109. &lt;p&gt;LANG: en&lt;/p&gt;</summary><content type="html">&lt;p&gt;kr7&lt;/p&gt;
  110. &lt;p&gt;LANG: en&lt;/p&gt;</content></entry><entry><title>kr7</title><link href="https://ogstudio.github.io/kr7-ru.html" rel="alternate"></link><published>2017-01-01T07:04:00+07:00</published><updated>2017-01-01T07:04:00+07:00</updated><author><name>Opensource Game Studio</name></author><id>tag:ogstudio.github.io,2017-01-01:/kr7-ru.html</id><summary type="html">&lt;p&gt;kr7&lt;/p&gt;
  111. &lt;p&gt;LANG: ru&lt;/p&gt;</summary><content type="html">&lt;p&gt;kr7&lt;/p&gt;
  112. &lt;p&gt;LANG: ru&lt;/p&gt;</content></entry><entry><title>kr6</title><link href="https://ogstudio.github.io/kr6.html" rel="alternate"></link><published>2017-01-01T06:04:00+07:00</published><updated>2017-01-01T06:04:00+07:00</updated><author><name>Opensource Game Studio</name></author><id>tag:ogstudio.github.io,2017-01-01:/kr6.html</id><summary type="html">&lt;p&gt;kr6&lt;/p&gt;
  113. &lt;p&gt;LANG: en&lt;/p&gt;</summary><content type="html">&lt;p&gt;kr6&lt;/p&gt;
  114. &lt;p&gt;LANG: en&lt;/p&gt;</content></entry><entry><title>kr6</title><link href="https://ogstudio.github.io/kr6-ru.html" rel="alternate"></link><published>2017-01-01T06:04:00+07:00</published><updated>2017-01-01T06:04:00+07:00</updated><author><name>Opensource Game Studio</name></author><id>tag:ogstudio.github.io,2017-01-01:/kr6-ru.html</id><summary type="html">&lt;p&gt;kr6&lt;/p&gt;
  115. &lt;p&gt;LANG: ru&lt;/p&gt;</summary><content type="html">&lt;p&gt;kr6&lt;/p&gt;
  116. &lt;p&gt;LANG: ru&lt;/p&gt;</content></entry><entry><title>kr5</title><link href="https://ogstudio.github.io/kr5.html" rel="alternate"></link><published>2017-01-01T05:04:00+07:00</published><updated>2017-01-01T05:04:00+07:00</updated><author><name>Opensource Game Studio</name></author><id>tag:ogstudio.github.io,2017-01-01:/kr5.html</id><summary type="html">&lt;p&gt;kr5&lt;/p&gt;
  117. &lt;p&gt;LANG: en&lt;/p&gt;</summary><content type="html">&lt;p&gt;kr5&lt;/p&gt;
  118. &lt;p&gt;LANG: en&lt;/p&gt;</content></entry><entry><title>kr5</title><link href="https://ogstudio.github.io/kr5-ru.html" rel="alternate"></link><published>2017-01-01T05:04:00+07:00</published><updated>2017-01-01T05:04:00+07:00</updated><author><name>Opensource Game Studio</name></author><id>tag:ogstudio.github.io,2017-01-01:/kr5-ru.html</id><summary type="html">&lt;p&gt;kr5&lt;/p&gt;
  119. &lt;p&gt;LANG: ru&lt;/p&gt;</summary><content type="html">&lt;p&gt;kr5&lt;/p&gt;
  120. &lt;p&gt;LANG: ru&lt;/p&gt;</content></entry><entry><title>kr4</title><link href="https://ogstudio.github.io/kr4.html" rel="alternate"></link><published>2017-01-01T04:04:00+07:00</published><updated>2017-01-01T04:04:00+07:00</updated><author><name>Opensource Game Studio</name></author><id>tag:ogstudio.github.io,2017-01-01:/kr4.html</id><summary type="html">&lt;p&gt;kr4&lt;/p&gt;
  121. &lt;p&gt;LANG: en&lt;/p&gt;</summary><content type="html">&lt;p&gt;kr4&lt;/p&gt;
  122. &lt;p&gt;LANG: en&lt;/p&gt;</content></entry><entry><title>kr4</title><link href="https://ogstudio.github.io/kr4-ru.html" rel="alternate"></link><published>2017-01-01T04:04:00+07:00</published><updated>2017-01-01T04:04:00+07:00</updated><author><name>Opensource Game Studio</name></author><id>tag:ogstudio.github.io,2017-01-01:/kr4-ru.html</id><summary type="html">&lt;p&gt;kr4&lt;/p&gt;
  123. &lt;p&gt;LANG: ru&lt;/p&gt;</summary><content type="html">&lt;p&gt;kr4&lt;/p&gt;
  124. &lt;p&gt;LANG: ru&lt;/p&gt;</content></entry><entry><title>kr3</title><link href="https://ogstudio.github.io/kr3.html" rel="alternate"></link><published>2017-01-01T03:04:00+07:00</published><updated>2017-01-01T03:04:00+07:00</updated><author><name>Opensource Game Studio</name></author><id>tag:ogstudio.github.io,2017-01-01:/kr3.html</id><summary type="html">&lt;p&gt;kr3&lt;/p&gt;
  125. &lt;p&gt;LANG: en&lt;/p&gt;</summary><content type="html">&lt;p&gt;kr3&lt;/p&gt;
  126. &lt;p&gt;LANG: en&lt;/p&gt;</content></entry><entry><title>kr3</title><link href="https://ogstudio.github.io/kr3-ru.html" rel="alternate"></link><published>2017-01-01T03:04:00+07:00</published><updated>2017-01-01T03:04:00+07:00</updated><author><name>Opensource Game Studio</name></author><id>tag:ogstudio.github.io,2017-01-01:/kr3-ru.html</id><summary type="html">&lt;p&gt;kr3&lt;/p&gt;
  127. &lt;p&gt;LANG: ru&lt;/p&gt;</summary><content type="html">&lt;p&gt;kr3&lt;/p&gt;
  128. &lt;p&gt;LANG: ru&lt;/p&gt;</content></entry><entry><title>kr2</title><link href="https://ogstudio.github.io/kr2.html" rel="alternate"></link><published>2017-01-01T02:04:00+07:00</published><updated>2017-01-01T02:04:00+07:00</updated><author><name>Opensource Game Studio</name></author><id>tag:ogstudio.github.io,2017-01-01:/kr2.html</id><summary type="html">&lt;p&gt;kr2&lt;/p&gt;
  129. &lt;p&gt;LANG: en&lt;/p&gt;</summary><content type="html">&lt;p&gt;kr2&lt;/p&gt;
  130. &lt;p&gt;LANG: en&lt;/p&gt;</content></entry><entry><title>kr2</title><link href="https://ogstudio.github.io/kr2-ru.html" rel="alternate"></link><published>2017-01-01T02:04:00+07:00</published><updated>2017-01-01T02:04:00+07:00</updated><author><name>Opensource Game Studio</name></author><id>tag:ogstudio.github.io,2017-01-01:/kr2-ru.html</id><summary type="html">&lt;p&gt;kr2&lt;/p&gt;
  131. &lt;p&gt;LANG: ru&lt;/p&gt;</summary><content type="html">&lt;p&gt;kr2&lt;/p&gt;
  132. &lt;p&gt;LANG: ru&lt;/p&gt;</content></entry><entry><title>kr1</title><link href="https://ogstudio.github.io/kr1.html" rel="alternate"></link><published>2017-01-01T01:04:00+07:00</published><updated>2017-01-01T01:04:00+07:00</updated><author><name>Opensource Game Studio</name></author><id>tag:ogstudio.github.io,2017-01-01:/kr1.html</id><summary type="html">&lt;p&gt;kr1&lt;/p&gt;
  133. &lt;p&gt;LANG: en&lt;/p&gt;</summary><content type="html">&lt;p&gt;kr1&lt;/p&gt;
  134. &lt;p&gt;LANG: en&lt;/p&gt;</content></entry><entry><title>kr1</title><link href="https://ogstudio.github.io/kr1-ru.html" rel="alternate"></link><published>2017-01-01T01:04:00+07:00</published><updated>2017-01-01T01:04:00+07:00</updated><author><name>Opensource Game Studio</name></author><id>tag:ogstudio.github.io,2017-01-01:/kr1-ru.html</id><summary type="html">&lt;p&gt;kr1&lt;/p&gt;
  135. &lt;p&gt;LANG: ru&lt;/p&gt;</summary><content type="html">&lt;p&gt;kr1&lt;/p&gt;
  136. &lt;p&gt;LANG: ru&lt;/p&gt;</content></entry></feed>