aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Nazaryev <sergey@nazaryev.ru>2020-07-20 01:42:09 +0300
committerSergey Nazaryev <sergey@nazaryev.ru>2020-07-20 01:42:09 +0300
commit9637e97f1cfb0abcb243215c01bc745e4fc6c5ca (patch)
treefca8f2402d0ca5fa049abac7c6e6cf77f946b846
parent585a141866bafe5dbb41208abf8f24b91e7e1154 (diff)
downloadportfolio-master.zip
portfolio-master.tar.gz
portfolio-master.tar.bz2
Update to the latest versionHEADmaster
-rw-r--r--Gemfile1
-rw-r--r--Gemfile.lock37
-rw-r--r--README.md63
-rw-r--r--_config.yml29
-rw-r--r--_includes/nav.html19
-rw-r--r--_layouts/default.html15
-rw-r--r--_layouts/projects.html145
-rw-r--r--_posts/.2018-11-17-multiplayer-games.md.swpbin0 -> 12288 bytes
-rw-r--r--_posts/2016-05-20-good-designs.md34
-rw-r--r--_posts/2016-11-11-linux-spb.md74
-rw-r--r--_posts/2016-11-17-zaurus-c700.md48
-rw-r--r--_posts/2016-11-21-jjb-folders.md23
-rw-r--r--_posts/2017-03-17-job-sites.md68
-rw-r--r--_posts/2017-07-03-ultrabooks.md14
-rw-r--r--_posts/2018-10-15-busybox-ulyanovsk.md41
-rw-r--r--_posts/2018-11-17-multiplayer-games.md33
-rw-r--r--articles.md7
-rw-r--r--assets/Graphik-Bold-Cy-Web.woffbin0 -> 65840 bytes
-rw-r--r--assets/Graphik-Regular-Cy-Web.woffbin0 -> 61038 bytes
-rw-r--r--assets/candara.ttfbin218504 -> 0 bytes
-rw-r--r--assets/game/android.pngbin0 -> 26613 bytes
-rw-r--r--assets/game/battletoads.gifbin0 -> 39867 bytes
-rw-r--r--assets/game/belmont.pngbin0 -> 4253 bytes
-rw-r--r--assets/game/billrizer.pngbin0 -> 5308 bytes
-rw-r--r--assets/game/cache.pngbin0 -> 61650 bytes
-rw-r--r--assets/game/chipndale.pngbin0 -> 4111 bytes
-rw-r--r--assets/game/game.html473
-rw-r--r--assets/game/higgins.pngbin0 -> 1580 bytes
-rw-r--r--assets/game/ios.pngbin0 -> 25269 bytes
-rw-r--r--assets/game/mario.pngbin0 -> 4098 bytes
-rwxr-xr-xassets/game/objects/forest.pngbin0 -> 5895 bytes
-rwxr-xr-xassets/game/objects/lamp.pngbin0 -> 3506 bytes
-rwxr-xr-xassets/game/objects/shop-blue.pngbin0 -> 4136 bytes
-rwxr-xr-xassets/game/objects/shop-red.pngbin0 -> 5198 bytes
-rwxr-xr-xassets/game/objects/shop-violet.pngbin0 -> 4135 bytes
-rwxr-xr-xassets/game/objects/sign-blue.pngbin0 -> 3494 bytes
-rwxr-xr-xassets/game/objects/tall-green.pngbin0 -> 7952 bytes
-rwxr-xr-xassets/game/objects/tall-red.pngbin0 -> 8198 bytes
-rwxr-xr-xassets/game/objects/tall-violet.pngbin0 -> 8043 bytes
-rwxr-xr-xassets/game/objects/trash.pngbin0 -> 2892 bytes
-rwxr-xr-xassets/game/objects/wide-gray.pngbin0 -> 6935 bytes
-rwxr-xr-xassets/game/objects/wide-green.pngbin0 -> 7005 bytes
-rwxr-xr-xassets/game/objects/wide-violet.pngbin0 -> 6815 bytes
-rwxr-xr-xassets/game/objects/world.pngbin0 -> 8877 bytes
-rw-r--r--assets/game/stollman.pngbin0 -> 25944 bytes
-rw-r--r--assets/game/world.pngbin0 -> 8877 bytes
-rw-r--r--assets/style.css250
-rw-r--r--assets/syntax.css62
-rw-r--r--forge.md38
-rw-r--r--index.md37
-rw-r--r--notes.md7
-rw-r--r--projects.md7
-rw-r--r--resume.pdfbin0 -> 26385 bytes
53 files changed, 1258 insertions, 267 deletions
diff --git a/Gemfile b/Gemfile
index d846141..2148910 100644
--- a/Gemfile
+++ b/Gemfile
@@ -18,4 +18,5 @@ gem "jekyll", "3.3.0"
# If you have any plugins, put them here!
group :jekyll_plugins do
gem "jekyll-feed", "~> 0.6"
+ gem "jekyll-redirect-from"
end
diff --git a/Gemfile.lock b/Gemfile.lock
index 4dcc886..ce7298b 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,10 +1,10 @@
GEM
remote: https://rubygems.org/
specs:
- addressable (2.5.0)
- public_suffix (~> 2.0, >= 2.0.2)
+ addressable (2.5.2)
+ public_suffix (>= 2.0.2, < 4.0)
colorator (1.1.0)
- ffi (1.9.14)
+ ffi (1.9.18)
forwardable-extended (2.6.0)
jekyll (3.3.0)
addressable (~> 2.4)
@@ -19,25 +19,31 @@ GEM
safe_yaml (~> 1.0)
jekyll-feed (0.8.0)
jekyll (~> 3.3)
- jekyll-sass-converter (1.4.0)
+ jekyll-redirect-from (0.13.0)
+ jekyll (~> 3.3)
+ jekyll-sass-converter (1.5.1)
sass (~> 3.4)
- jekyll-watch (1.5.0)
- listen (~> 3.0, < 3.1)
- kramdown (1.12.0)
+ jekyll-watch (1.5.1)
+ listen (~> 3.0)
+ kramdown (1.16.2)
liquid (3.0.6)
listen (3.0.8)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
mercenary (0.3.6)
- pathutil (0.14.0)
+ pathutil (0.16.1)
forwardable-extended (~> 2.6)
- public_suffix (2.0.4)
- rb-fsevent (0.9.8)
- rb-inotify (0.9.7)
- ffi (>= 0.5.0)
+ public_suffix (3.0.1)
+ rb-fsevent (0.10.2)
+ rb-inotify (0.9.10)
+ ffi (>= 0.5.0, < 2)
rouge (1.11.1)
safe_yaml (1.0.4)
- sass (3.4.22)
+ sass (3.5.5)
+ sass-listen (~> 4.0.0)
+ sass-listen (4.0.0)
+ rb-fsevent (~> 0.9, >= 0.9.4)
+ rb-inotify (~> 0.9, >= 0.9.7)
PLATFORMS
ruby
@@ -45,9 +51,10 @@ PLATFORMS
DEPENDENCIES
jekyll (= 3.3.0)
jekyll-feed (~> 0.6)
+ jekyll-redirect-from
RUBY VERSION
- ruby 2.1.5p273
+ ruby 2.6.2p47
BUNDLED WITH
- 1.13.6
+ 1.17.2
diff --git a/README.md b/README.md
index 5b2a406..d57ecf9 100644
--- a/README.md
+++ b/README.md
@@ -1,14 +1,59 @@
-zar's homepage
-==============
+# nazaryev-blog
-Site based on Jekyll with my blog and portfolio
+Welcome to your new Jekyll theme! In this directory, you'll find the files you
+need to be able to package up your theme into a gem. Put your layouts in
+`_layouts`, your includes in `_includes` and your sass in `_sass`. To
+experiment with this code, add some sample content and run `bundle exec jekyll
+serve` – this directory is setup just like a Jekyll site!
-## Building
+TODO: Delete this and the text above, and describe your gem
-For building just type in shell:
+## Installation
-```bash
-$ jekyll build
-```
+Add this line to your Jekyll site's Gemfile:
+
+```ruby gem "nazaryev-blog" ```
+
+And add this line to your Jekyll site's `_config.yml`:
+
+```yaml theme: nazaryev-blog ```
+
+And then execute:
+
+ $ bundle
+
+Or install it yourself as:
+
+ $ gem install nazaryev-blog
+
+## Usage
+
+TODO: Write usage instructions here. Describe your available layouts, includes,
+and/or sass.
+
+## Contributing
+
+Bug reports and pull requests are welcome on GitHub at
+https://github.com/[USERNAME]/hello. This project is intended to be a safe,
+welcoming space for collaboration, and contributors are expected to adhere to
+the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
+
+## Development
+
+To set up your environment to develop this theme, run `bundle install`.
+
+You theme is setup just like a normal Jelyll site! To test your theme, run
+`bundle exec jekyll serve` and open your browser at `http://localhost:4000`.
+This starts a Jekyll server using your theme. Add pages, documents, data, etc.
+like normal to test your theme's contents. As you make modifications to your
+theme and to your content, your site will regenerate and you should see the
+changes in the browser after a refresh, just like normal.
+
+When your theme is released, only the files in `_layouts`, `_includes`, and
+`_sass` tracked with Git will be released.
+
+## License
+
+The theme is available as open source under the terms of the [MIT
+License](http://opensource.org/licenses/MIT).
-Static HTML pages will be generated in `_site` directory.
diff --git a/_config.yml b/_config.yml
index 807badd..e2aaa32 100644
--- a/_config.yml
+++ b/_config.yml
@@ -1,15 +1,17 @@
name: Сергей Назарьев
-position: Software Developer
-location: Saint Petersburg
+position: Инженер Linux (embedded)
+location: Санкт-Петербург
+age: 22 года
email: sergey@nazaryev.ru
+telegram: picokun
description: Сергей Назарьев. Разработчик всяких IT-штук. Санкт-Петербург.
markdown: kramdown
links:
- - title: "CV"
- url: "http://forge.nazaryev.ru/CV.pdf"
+ - title: "Резюме"
+ url: "http://nazaryev.ru/resume.pdf"
- - title: "File Archive"
+ - title: "Файлопомойка"
url: "http://files.nazaryev.ru/"
exclude:
@@ -30,9 +32,6 @@ sites:
- title: "Газовик"
url: "http://gazovik.ru"
- - title: "Кинотеатр Пионер"
- url: "http://pioner-kino.ru"
-
- title: "Океан-тур"
url: "http://okean-tur.ru"
@@ -41,7 +40,7 @@ products:
url: http://cp.mobiumapps.com
screenshot: assets/products/mobium.png
icon: assets/products/mobium_icon.png
- tags: [ ASP.NET, Вёрстка ]
+ tags: [ asp.net, вёрстка ]
description: >
Некоторое время по работе поддерживал панель для клиентов
сервиса по созданию кроссплатформенных приложений. В
@@ -52,7 +51,7 @@ products:
url: http://galaxy-rpg.ru
screenshot: assets/products/gy.png
icon: assets/products/gy_icon.png
- tags: [ MODx, PHP ]
+ tags: [ modx, php ]
description: >
По старой дружбе с клиентом выступил в этом проекте в роли
менеджера и программиста: тесно взаимодействовал с клиентом,
@@ -62,7 +61,7 @@ products:
url: unknown
screenshot: assets/products/exhosting.png
icon: assets/products/exhosting_icon.png
- tags: [ PHP, Linux ]
+ tags: [ php, linux ]
description: >
Ныне уже несуществующий игровой хостинг. Для него была
сделана удобная и простая панель для управления игровыми
@@ -73,7 +72,7 @@ products:
url: https://play.google.com/store/apps/details?id=ru.copypaste
screenshot: assets/products/kopipasta.png
icon: assets/products/kopipasta_icon.png
- tags: [ Android, Java ]
+ tags: [ android, java ]
description: >
Читалка сайта Kopipasta.ru с кэшированием и системой
избранного. Проба пера.
@@ -82,7 +81,7 @@ products:
url: unknown
screenshot: assets/products/lovesushi.png
icon: assets/products/lovesushi_icon.png
- tags: [ Android, Java ]
+ tags: [ android, java ]
description: >
Меню для суши-бара Love Суши (г. Саратов). Используется
вместо традиционного бумажного меню.
@@ -91,7 +90,7 @@ products:
url: http://cpt-yurcom.ru
screenshot: assets/products/yurcom.png
icon: assets/products/yurcom_icon.png
- tags: [ PHP, MODx ]
+ tags: [ php, modx ]
description: >
Портал юристов, сделанный под эгидой Nopreset (топовой
web-студии г. Саратова). Реализован back-end под управлением
@@ -102,7 +101,7 @@ products:
url: unknown
screenshot: assets/products/emuteam.png
icon: assets/products/emuteam_icon.png
- tags: [ Вёрстка, Дизайн ]
+ tags: [ вёрстка, дизайн ]
description: >
Сайт «стримеров» — игроков, показывающих игровой процесс в
прямом эфире. Я был их посетителем, когда ещё их сайт был
diff --git a/_includes/nav.html b/_includes/nav.html
index 12789b4..08ac5a4 100644
--- a/_includes/nav.html
+++ b/_includes/nav.html
@@ -4,26 +4,35 @@
<a href="/" class="title-link">{{ site.name }}</a>
</div>
<div class="contacts__info">
- <span class="contacts__position">{{ site.position }}, <span id="age">20</span> at {{ site.location }}</span>
+ <div class="contacts__position">{{ site.position }},</div>
+ <span id="age">{{ site.age }}</span> @ {{ site.location }}
</div>
</div>
- <menu class="menu">
- <ul class="menu-horizontal">
+ <menu class="menu-container">
+ <ul class="menu">
{% for my_page in site.pages %}
{% if my_page.title %}
- <li class="menu-horizontal__item">
+ <li class="menu__item">
<a href="{{ my_page.url | relative_url }}">{{ my_page.title | escape }}</a>
</li>
{% endif %}
{% endfor %}
{% for link in site.links %}
{% if link.title %}
- <li class="menu-horizontal__item">
+ <li class="menu__item">
<a href="{{ link.url }}">{{ link.title | escape }}</a>
</li>
{% endif %}
{% endfor %}
</ul>
</menu>
+
+ <div class="email">
+ <b>Почта</b>
+ <a href="mailto:{{ site.email }}">{{ site.email }}</a>
+ <br>
+ <b>Telegram</b>
+ <a href="https://t.me/{{ site.telegram }}">@{{ site.telegram }}</a>
+ </div>
</nav>
diff --git a/_layouts/default.html b/_layouts/default.html
index fb2c1d9..1988d5a 100644
--- a/_layouts/default.html
+++ b/_layouts/default.html
@@ -4,19 +4,28 @@
<meta charset="utf-8" />
<title>{% if page.title %}{{ page.title | escape }} ≡ {% endif %}{{ site.name }}</title>
- <meta name="description" content="{{ description }}" />
+ <meta name="description" content="{{ page.description }}" />
<link rel="stylesheet" href="{{ "/assets/style.css" | relative_url }}">
+ <link rel="stylesheet" href="{{ "/assets/syntax.css" | relative_url }}">
<link href="{{ "/assets/favicon.ico" | relative_url }}" rel="shortcut icon" type="image/x-icon" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
+ <div class="wrapper">
<div class="page">
{% include nav.html %}
{{ content }}
</div>
- <div class="clear"></div>
- <script type="text/javascript" src={{ "/assets/age.js" | relative_url }}></script>
+ <footer>
+ <iframe src="//nazaryev.ru/assets/game/game.html" id="game" class="game"></iframe>
+ <script>
+ document.querySelector("#game").onload = function() {
+ this.contentWindow.focus();
+ }
+ </script>
+ </footer>
+ </div>
</body>
</html>
diff --git a/_layouts/projects.html b/_layouts/projects.html
index 909cb93..353aa82 100644
--- a/_layouts/projects.html
+++ b/_layouts/projects.html
@@ -1,72 +1,87 @@
----
-layout: default
----
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8" />
-<main>
- <div class="products">
- <div class="products-inner">
- {% for product in site.products %}
- <section class="products__item">
- <div class="product-photo">
- <img src="{{ screenshot }}" />
- <div class="product-tags">
- {% for tag in product.tags %}
- <span class="product-tag">{{ tag }}</span>
- {% endfor %}
- </div>
- </div>
- <div class="product-info">
- <div class="product-header">
- <img class="product-icon" src="{{ product.icon }}" />
- <span class="product-title">{{ product.title }}</span>
- </div>
- <div class="product-description">{{ product.description }}</div>
- <div class="product-link">
- {% if product.url == "unknown" %}
- <a target="_blank" class="product-link-passive">Недоступно</a>
- {% else %}
- <a href="{{ product.url }}" target="_blank" class="product-link-active">Перейти на сайт</a>
- {% endif %}
+ <title>{% if page.title %}{{ page.title | escape }} ≡ {% endif %}{{ site.name }}</title>
+ <meta name="description" content="{{ page.description }}" />
+
+ <link rel="stylesheet" href="{{ "/assets/style.css" | relative_url }}">
+ <link rel="stylesheet" href="{{ "/assets/syntax.css" | relative_url }}">
+ <link href="{{ "/assets/favicon.ico" | relative_url }}" rel="shortcut icon" type="image/x-icon" />
+
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ </head>
+ <body>
+ <div class="wrapper">
+ <div class="page">
+ {% include nav.html %}
+ <main>
+ <div class="products">
+ <div class="products-inner">
+ {% for product in site.products %}
+ <section class="products__item">
+ <div class="product-info">
+ <div class="product-header">
+ <img class="product-icon" src="{{ product.icon }}" />
+ <span class="product-title">{{ product.title }}</span>
+ </div>
+ <div class="product-description">{{ product.description }}</div>
+ <div class="product-link">
+ {% if product.url == "unknown" %}
+ <a target="_blank" class="product-link-passive">Недоступно</a>
+ {% else %}
+ <a href="{{ product.url }}" target="_blank" class="product-link-active">Перейти на сайт</a>
+ {% endif %}
+ </div>
+ <div class="product-tags">
+ {% for tag in product.tags %}
+ <span class="product-tag">{{ tag }}</span>
+ {% endfor %}
+ </div>
+ <div class="clear"></div>
+ </div>
+ </section>
+ {% endfor %}
</div>
</div>
- </section>
- {% endfor %}
- <div class="clear"></div>
+ <div class="clear"></div>
+ </main>
</div>
- </div>
- <div class="clear"></div>
-</main>
-<footer>
- <div class="information">
- <div class="additional">
- <h2>
- А также…
- </h2>
- <ul class="left">
- <li>несколько сервисов:
- <ul>
- {% for service in site.services %}
- <li><a class="product-link-active" target="_blank" href="{{ service.url }}">{{ service.title }}</a></li>
- {% endfor %}
+ <footer style="padding-top: 0px;">
+ <div class="information">
+ <div class="additional">
+ <h2>
+ А также…
+ </h2>
+ <ul class="left">
+ <li>несколько сервисов:
+ <ul>
+ {% for service in site.services %}
+ <li><a class="product-link-active" target="_blank" href="{{ service.url }}">{{ service.title }}</a></li>
+ {% endfor %}
+ </ul>
+ </li>
</ul>
- </li>
- </ul>
- <ul class="right">
- <li>множество мелких и/или неопубликованных сайтов:
- <ul>
- {% for item in site.sites %}
- <li><a class="product-link-active" target="_blank" href="{{ item.url }}">{{ item.title }}</a></li>
- {% endfor %}
+ <ul class="right">
+ <li>множество мелких и/или неопубликованных сайтов:
+ <ul>
+ {% for item in site.sites %}
+ <li><a class="product-link-active" target="_blank" href="{{ item.url }}">{{ item.title }}</a></li>
+ {% endfor %}
+ </ul>
+ </li>
</ul>
- </li>
- </ul>
- <div class="clear"></div>
+ <div class="clear"></div>
+ </div>
+ </div>
+ <iframe src="//nazaryev.ru/assets/game/game.html" id="game" class="game"></iframe>
+ <script>
+ document.querySelector("#game").onload = function() {
+ this.contentWindow.focus();
+ }
+ </script>
+ </footer>
</div>
- </div>
- <iframe src="http://game.nazaryev.ru/game.html" id="game" class="game"></iframe>
- <script>
- document.querySelector("#game").onload = function() {
- this.contentWindow.focus();
- }
- </script>
-</footer>
+ </body>
+</html>
diff --git a/_posts/.2018-11-17-multiplayer-games.md.swp b/_posts/.2018-11-17-multiplayer-games.md.swp
new file mode 100644
index 0000000..a4b7b47
--- /dev/null
+++ b/_posts/.2018-11-17-multiplayer-games.md.swp
Binary files differ
diff --git a/_posts/2016-05-20-good-designs.md b/_posts/2016-05-20-good-designs.md
index 668eac1..e379d71 100644
--- a/_posts/2016-05-20-good-designs.md
+++ b/_posts/2016-05-20-good-designs.md
@@ -7,22 +7,18 @@ description: "Лучшие сайты с точки зрения UI/UX, из т
Отсортированы в порядке убывания радости глаза
1. [<s>Веб-студия Eastwood</s>](http://eastwoodlab.ru), [архив](http://web.archive.org/web/20160404215426/http://eastwoodlab.ru/)
- 2. [Monica Dinculescu](http://meowni.ca)
- 3. [Хостинг Jino.ru](http://jino.ru)
- 4. [Healtchecks.io](https://healthchecks.io/)
- 5. [Хартия 97](http://charter97.org)
- 6. [Блог Сергея Короля](http://sergeykorol.ru/blog)
- 7. [Kenneth Reitz](http://www.kennethreitz.org/)
- 8. [Сайт блогера Варламова](http://varlamov.ru)
- 9. [Лаборатория Олега Бунина](http://ontico.ru)
- 10. [Барахолка Deal.by](http://deal.by)
- 11. [Компания Сайтсофт](http://www.sitesoft.ru)
- 12. [Chaos Computing](https://www.christian-gmeiner.info/)
- 13. [Студия Morizo](http://morizo.ru)
-
-Сайты-сборники хороших сайтов
------------------------------
-
-1. [Советы по UX/UI](http://goodui.org/ )
-2. [Награды в Web](http://www.awwwards.com/ )
-3. [Хорошие одностраничники](https://onepagelove.com/ )
+ 2. [Студия MobileUp](http://mobileup.ru/services)
+ 3. [Major Hayden](https://major.io/)
+ 4. [Monica Dinculescu](http://meowni.ca)
+ 5. [Redhead Electronics](http://rh-electronics.ru/)
+ 6. [Хостинг Jino.ru](http://jino.ru)
+ 7. [Healtchecks.io](https://healthchecks.io/)
+ 8. [Хартия 97](http://charter97.org)
+ 9. [Блог Сергея Короля](http://sergeykorol.ru/blog)
+ 10. [Kenneth Reitz](http://www.kennethreitz.org/)
+ 11. [Сайт блогера Варламова](http://varlamov.ru)
+ 12. [Лаборатория Олега Бунина](http://ontico.ru)
+ 13. [Барахолка Deal.by](http://deal.by)
+ 14. [Компания Сайтсофт](http://www.sitesoft.ru)
+ 15. [Chaos Computing](https://www.christian-gmeiner.info/)
+ 16. [Студия Morizo](http://morizo.ru)
diff --git a/_posts/2016-11-11-linux-spb.md b/_posts/2016-11-11-linux-spb.md
index 3c16311..2ac2fdc 100644
--- a/_posts/2016-11-11-linux-spb.md
+++ b/_posts/2016-11-11-linux-spb.md
@@ -4,6 +4,38 @@ title: "/Линуксовые/ компании в СПб"
description: "Список компаний, которые используют FOSS в своих проектах"
---
+### Компании
+
+#### Избранное
+
+ * [НТЦ Метротек](http://ntc.metrotek.ru) — разработка тестеров-анализаторов Ethernet-сетей на C, ARM и Debian
+ * [НТЦ Протей](http://protei-st.ru) — разработка оборудования для телекоммуникации, DPI, телефония, военное оборудование
+ * [OKTET Labs](http://oktetlabs.ru) — аутсорсинговая компания разработки ПО под Linux
+ * ~~[AltEll](http://www.altell.ru)~~, теперь [Нума Технологии](https://numatech.ru/) — пишут свой защищённый BIOS, есть форк vyatta (ALTELL Trust)
+ * [Syntacore](http://www.syntacore.com) — high-quality, open and efficient RISC-V architecture
+ * [Quantenna](http://www.quantenna.com) — свои wi-fi-чипы?
+ * [Emlid](https://emlid.com) — разработка профессиональной электроники (высокоточный GPS-приемник)
+ * [Mentor Graphics](https://www.mentor.com) — ...
+ * [Cogent Embedded](https://www.cogentembedded.com) — ...
+ * [Automated Intelligence Systems](http://aintsys.com/) — ...
+ * [FINOM](https://finom.io/) — ...
+ * [Энергопромавтоматизация](http://www.epsa-spb.ru/) — ...
+ * [Адакта](http://adakta.ru) — ...
+ * [Woodenshark](https://www.woodenshark.com) — ...
+ * [Kraftway](https://www.kraftway.ru) — ...
+
+#### Остальные
+
+ * [Auriga](http://hr.auriga.ru/vacancies/spb/1513/)
+ * [Orbi](https://orbiprime.com/)
+ * [Ready for Sky](https://readyforsky.com/ru/)
+ * [Everynet](https://everynet.com)
+ * [ПКБ РИО](http://www.pkb-rio.com)
+ * [Институт Сетевых Технологий](http://int.spb.ru) — защищённые коммуникации для военных
+ * [RADIOFID](http://radiofid.ru)
+ * [RAIDIX](http://raidix.ru)
+ * [Dr.Web](http://www.drweb.ru/)
+ * [НТЦ-СевенТест](http://seventest.ru)
* [НПК Пеленгатор](http://www.npk-pelengator.ru/)
* [Фертоинг](http://www.fertoing.ru/)
* [Морские Навигационные Системы](http://www.mnsspb.ru/)
@@ -14,16 +46,13 @@ description: "Список компаний, которые используют
* [Componentality](https://componentality.com/en/)
* [НПП ЦРТС](http://www.npp-crts.ru/)
* [НИИ РА](http://niir.ru)
- * [НТЦ-Метротек](http://metrotek.spb.ru)
- * [НТЦ-Протей](http://protei-st.ru)
* [Радуга](http://raduga.spb.ru)
- * [RAIDIX](http://raidix.ru)
- * [Адакта](http://adakta.ru)
* [Валента](http://valenta.spb.ru)
* [SEMRush](http://semrush.com)
- * [Mobium](http://mobiumapps.com)
- * [Oktet labs](http://oktetlabs.ru)
+ * [Радиофид](http://radiofid.ru)
* Симметрон
+ * [Synopsys](http://synopsys.com)
+ * [PERCo](https://www.perco.ru/products)
* [Элтех](http://eltech.com/)
* [АО НПП АМЭ](nppame.ru)
* [Lanit Tercom](http://www.lanit-tercom.ru/)
@@ -32,16 +61,12 @@ description: "Список компаний, которые используют
* [ООО "Фирма НИТА"](http://nita.ru/)
* [Tbricks / Itiviti](http://itiviti.com)
* [TuneIT](http://tune-it.ru)
- * [Dr.Web](http://www.drweb.ru/)
- * [НТЦ-СевенТест](http://seventest.ru)
- * [ОАО "Технологии радиоконтроля"](http://www.stc-spb.ru/)
+ * [Специальный Технологический Центр (СТЦ)](http://www.stc-spb.ru)
* [ООО "Специальные технологии"](http://www.sp-te.ru/en/)
* [Embria](http://embria.ru)
* [Biovoid Robotics](http://biovoid.ru)
- * [Altell](http://www.altell.ru)
* [ИнфоТеКС](https://www.infotecs.ru)
* [Калькулейт](http://www.calculate.ru/)
- * [Энергопромавтоматизация](http://www.epsa-spb.ru/)
* [ООО СпецМедТехника](http://spmt.ru)
* [Octavian](http://www.octavianonline.com/)
* [АО ОКЕНИТ](http://okenit.ru/)
@@ -49,7 +74,6 @@ description: "Список компаний, которые используют
* [Prointech](http://www.prointech.ru/en)
* [Конфидент](http://www.confident.ru/)
* [ЦНИИ РТК](http://www.rtc.ru/ru)
- * [Syntacore](http://www.syntacore.com)
* [АО Радар ММС](http://www.radar-mms.com)
* [ДОЛОМАНТ](http://www.dolomant.ru/)
* [Wrike](https://www.wrike.com/ru/company)
@@ -57,4 +81,28 @@ description: "Список компаний, которые используют
* [СуперТел](http://www.supertel.ru/)
* [РУТОЛЛ](http://www.rutoll.ru/)
* [АКВАМАРИН](http://www.aquamarin.ru/)
- * Дом.ру
+ * [YADRO](http://yadro.com/)
+ * [General R&D](http://genrnd.ru) — аутсорс железок, выходцы из НТЦ Метротек
+
+### Прикольные вакансии системных программистов под Linux (2017)
+
+ * [Digital Security. Системный программист С под Linux (Embedded)](https://www.linux.org.ru/forum/job/13771667)
+ * [AltEll. Инженер-программист (разработка BIOS)](https://hh.ru/vacancy/23106369)
+ * [AltEll. Системный программист Linux в направление виртуализации](https://hh.ru/vacancy/23296564)
+ * [AltEll. Системный программист Linux в сетевое направление](https://hh.ru/vacancy/23106402)
+ * [НТЦ Метротек. Системный программист Linux](https://hh.ru/vacancy/23427761)
+ * [НТЦ Метротек. Системный программист Linux (Junior)](https://hh.ru/vacancy/23427754)
+ * [Dr. Web. UNIX Release engineer](https://hh.ru/vacancy/22922753)
+ * [i-FREE. Embedded (Linux) Developer](https://hh.ru/vacancy/22722237)
+ * [Calculate Linux. Системный программист (Python)](https://hh.ru/vacancy/23307379)
+ * [OKTETLabs. Стажировка для студентов](https://vk.com/topic-171_27713820)
+ * [IT-доминанта. Senior Software Developer (C/embedded)](https://hh.ru/vacancy/23208275)
+ * [ЗАО Институт телекоммуникаций. Инженер-программист (С/asm)](https://hh.ru/vacancy/23203449)
+ * [Quantenna Communications. Senior Embedded SW Developer](https://hh.ru/vacancy/22560853)
+ * [ГК РТЛ Сервис. Ведущий программист/инженер-разработчик встроенного ПО](https://hh.ru/vacancy/22648325)
+ * [Доломант. Инженер-программист](https://hh.ru/vacancy/8396328)
+ * [Базальт. Программист-мэйнтейнер](https://lists.altlinux.org/pipermail/devel/2017-February/202393.html)
+ * [Automated Intelligence Systems. Системный программист Linux (C, Verilog)](https://moikrug.ru/vacancies/1000034848)
+ * [Программист Embedded Linux, Москва](http://forum.vingrad.ru/forum/topic-392508/anchor-entry2675774/0.html)
+ * [YADRO. Embedded Linux (C/C++, Python), Москва](https://www.linux.org.ru/forum/job/13481691)
+ * [Tempesta/Natsys. Linux Kernel Developer](https://www.linux.org.ru/forum/job/13467315)
diff --git a/_posts/2016-11-17-zaurus-c700.md b/_posts/2016-11-17-zaurus-c700.md
new file mode 100644
index 0000000..d0a5c4a
--- /dev/null
+++ b/_posts/2016-11-17-zaurus-c700.md
@@ -0,0 +1,48 @@
+---
+layout: post
+title: "Sharp Zaurus C700"
+description: "Процесс портирования современного ПО на старенький Sharp Zaurus"
+---
+
+Как-то с детства я полюбил маленькие переносные устройства. И так как
+в моё детство КПК были недоступны, то приходилось довольствоваться
+моддингом мобильных телефонов и смартфонов, переделывая их в некое
+подобие их больших братьев-пекарень.
+
+И пока я менял анимации и меню с иконками из Windows в своём Siemens
+CX75, в Японии начали выходить устройства серии Sharp Zaurus. В 2003
+году появился Sharp Zaurus SL-C700:
+
+![Sharp Zaurus SL-C700](http://www.mobile-review.com/pda/review/image/sharp/zaurus-c700/open.jpg)
+
+Это ARM'овая железка с процессором pxa250, из коробки на ней Linux
+2.4.28, busybox и японская версия Qtopia (очень легковесная среда
+рабочего стола на старом Qt). Японское ПО не устроило пользователей,
+и товарищи локализовали и допилили стоковую прошивку, назвав итоговое
+поделие [Cacko ROM](http://my-zaurus.narod.ru/cacko.html) ([зеркало](https://katastrophos.net/zaurus/)).
+
+А вот ребята из OpenEmbedded пошли дальше: они написали что-то
+похожее на современные bootloader'ы и позволили загружаться не только
+с внутренного ограниченного NAND'а, но и с SD-карты. Называется он
+[kexecboot](https://github.com/kexecboot/kexecboot/wiki). Замечу, что
+разработка ПО для Zaurus форсировало проект OpenEmbedded, который
+стал основой Yocto Project -- одного из самых популярных продуктов для
+сборки дистрибутивов Linux для embedded-устройств.
+
+Чуть позже товарищ Omegamoon успешно портировал [Ubuntu
+8.04](http://www.omegamoon.com/blog/static.php?page=ZaurusUbuntu) с
+оболочкой LXDE, фактически задав вектор на создание и портирование
+десктопных дистрибутивов Linux'а с X11, тысячи их: Debian, Angstrom,
+OpenZaurus, Arch Linux ARM. Даже OpenBSD портировали под Zaurus.
+
+Проблема только в том, что все эти дистрибутивы (как и железка,
+собственно, за 13 лет) уже давно протухли. А вот что интересно, так
+это то, что ребята из OpenEmbedded до сих пор поддерживают сборку
+ядра под все вышедшие субноутбуки серии Sharp Zaurus. Слой можно
+найти на сайте openembedded:
+[meta-handheld](https://layers.openembedded.org/layerindex/branch/master/layer/meta-handheld/).
+На момент написания заметки доступно ядро Linux 4.4.
+
+И так как моя половая ориентация не позволяет использовать Yocto, то
+я начал всё собирать под buildroot'ом, в том число перенеся патчи для
+ядра из репозитория OpenEmbedded.
diff --git a/_posts/2016-11-21-jjb-folders.md b/_posts/2016-11-21-jjb-folders.md
new file mode 100644
index 0000000..221721e
--- /dev/null
+++ b/_posts/2016-11-21-jjb-folders.md
@@ -0,0 +1,23 @@
+---
+layout: post
+title: "Поддержка папок в Jenkins Job Builder"
+description: "Как привязать job к определённой папке?"
+---
+
+Для того, чтобы в [Jenkins Job Builder (jjb)](http://docs.openstack.org/infra/jenkins-job-builder/)
+создать и обновлять job в определённой папке, достаточно прописать в
+названии job'а полный путь а-ля:
+
+```yaml
+- job:
+ name: "developer/zar/buildroot"
+```
+
+Таким образом job с названием `buildroot` попадёт в директорию
+`developer/zar`.
+
+**Важно**: на данный момент `jjb` не умеет
+самостоятельно создавать директории: поддержку этой фичи внедряют уже
+несколько лет, а проследить за прогрессом можно в официальном
+Gerrit'е создателей `jjb` [вот
+тут](https://review.openstack.org/#/c/134307/).
diff --git a/_posts/2017-03-17-job-sites.md b/_posts/2017-03-17-job-sites.md
new file mode 100644
index 0000000..7740e26
--- /dev/null
+++ b/_posts/2017-03-17-job-sites.md
@@ -0,0 +1,68 @@
+---
+layout: post
+title: "Места, где искать работу IT-шнику"
+description: "Ссылки на биржи труда для IT-шника"
+---
+
+## Специализированные сайты
+
+ - [Careers StackOverflow](http://careers.stackoverflow.com/)
+ - [HeadHunter](http://hh.ru)
+ - [SuperJob](http://superjob.ru)
+ - [Мой круг](http://moikrug.ru)
+ - [LinkedIn](https://linkedin.com)
+ - [Indeed](http://ru.indeed.com/?r=us)
+ - [Джинн](https://djinni.co/)
+ - [Вакансии Intel'а](http://jobs.intel.com/ListJobs/All)
+ - [ITMozg](http://itmozg.ru)
+ - [Monster.com](http://monster.com)
+ - [jobs.dou.ua](http://jobs.dou.ua)
+
+## Форумы
+
+ - [SQL.ru](http://www.sql.ru/forum/job-offers)
+ - [CyberForum](http://www.cyberforum.ru/job-offer/)
+ - [RSDN](http://rsdn.org/forum/job.offers/)
+ - [linux.org.ru](http://www.linux.org.ru/forum/job/)
+ - [Vingrad](http://forum.vingrad.ru/forum/job-for-programmers.html)
+ - [Клуб программистов](http://programmersforum.ru/forumdisplay.php?s=d7d39461668fbf1f2e516a47ee56186f&f=30)
+
+## Мало вакансий
+
+ - [SearchEngines](http://searchengines.guru/forumdisplay.php?f=62&order=desc&page=2)
+ - [Job.ru](http://job.ru)
+ - [trud.com](http://www.trud.com/)
+ - [careerist.ru](http://careerist.ru/)
+ - [joblab.ru](http://joblab.ru/)
+ - [ya-ob.ru](http://ya-ob.ru/)
+ - [Зарплата](http://www.zarplata.ru/)
+ - [Rabota.ru](http://rabota.ru)
+ - [Developing.ru](http://forum.developing.ru/forumdisplay.php/16-%D0%92%D0%B0%D0%BA%D0%B0%D0%BD%D1%81%D0%B8%D0%B8-%D0%B8-%D0%B7%D0%B0%D0%BA%D0%B0%D0%B7%D1%8B-%D0%B4%D0%BB%D1%8F-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82%D0%BE%D0%B2?s=60713553cfcb49aeca2e82bfe8a91a5a)
+ - http://geekbrains.ru/probations
+ - https://codeby.net/forum/forums/predlozhenija-raboty.24/
+ - http://php.ru/forum/viewforum.php?f=3&sid=1a14c60665b9644aed8f3db557870cfd
+ - http://forum.codeguru.ru/index.php?PHPSESSID=13d09mcir5f4qovvimcce8f5u3&board=10002.0
+ - http://webmasters.ru/forum/f42/
+ - http://domenforum.net/forumdisplay.php?f=88
+ - http://forum.sysman.ru/index.php?s=7e4288ed460eda76d9b7803cb35c5a9d&showforum=96
+ - http://phpforum.su/index.php?s=276293a912bea5cf15a5a4d7f6d9b240&showforum=18
+ - http://coding.in.ua/viewforum.php?f=29
+ - http://javatalks.ru/branches/20
+ - https://sysadmins.ws/viewforum.php?f=75&sid=ed33959d932c3d2b1b4b2d9360395274
+ - http://sysadmins.me/forum/49/
+ - http://sysadmins.ru/forum7.html
+ - http://phpforum.su/index.php?showforum=18
+ - http://forumphp.ru/?board=38.0
+ - http://forum.ishodniki.ru/index.php/board,34.0.html?PHPSESSID=ef50d6c6e111ebf13bf0973ec93be077
+ - http://code-forum.net/forumdisplay.php?f=15&s=58638219d09f21532ac16d7e67bbff0c
+ - http://primat.org/forum/34
+ - http://forum.3dnews.ru/forumdisplay.php?f=66
+ - http://unity3d.ru/distribution/viewforum.php?f=109
+ - http://forum.ixbt.com/?id=101
+ - http://forums.overclockers.ru/viewforum.php?f=135&sid=441bbb182d66d54e3b9ded583507bd05
+ - http://sysadmin.mail.ru/pforum/viewforum.php?f=41&sid=ad750d6ae544ab0948191aa234675fc4
+ - http://unix-forum.ru/forum15.html
+ - http://forum.sys-admin.kz/index.php?PHPSESSID=0645a8cde9439d910855bee3bdfa51aa&board=56.0
+ - http://systalk.ru/viewforum.php?f=125&sid=b6101c21fa5773f48927f986597af3ae
+ - http://www.thg.ru/forum/forumdisplay.php?f=62
+ - http://4pda.ru/forum/index.php?showforum=478
diff --git a/_posts/2017-07-03-ultrabooks.md b/_posts/2017-07-03-ultrabooks.md
new file mode 100644
index 0000000..d73a8e0
--- /dev/null
+++ b/_posts/2017-07-03-ultrabooks.md
@@ -0,0 +1,14 @@
+---
+layout: post
+title: "Ох уж эти ультрабуки"
+description: "Попытка оценить рынок ультрабуков на момент 2017 года"
+---
+
+- Asus ZenBook UX31E
+- Asus ZenBook UX31A
+- Asus ZenBook UX32x — 1.5 кг, дискретная видеокарта, разъём для оперативки, Core i7
+- Asus Zenbook UX305 — 1.2 кг
+- Xiaomi Notebook Air 12.5 (2016)
+- Xiaomi Notebook Air 12.5 (2017)
+- Xiaomi Notebook Air 13.3
+- MacBook Air 11 — 1.2 кг, макбук, маленький и миленький, монолитный корпус, старое железо, оверпрайс
diff --git a/_posts/2018-10-15-busybox-ulyanovsk.md b/_posts/2018-10-15-busybox-ulyanovsk.md
new file mode 100644
index 0000000..dd7d17a
--- /dev/null
+++ b/_posts/2018-10-15-busybox-ulyanovsk.md
@@ -0,0 +1,41 @@
+---
+layout: post
+title: "СРОЧНО! busybox родом из Ульяновска"
+description: "О том, кто написал busybox"
+---
+
+Что-то я тут заковырялся в коде busybox'а, смотрю копирайт вот тут:
+https://git.busybox.net/busybox/tree/miscutils/crond.c
+
+> * Vladimir Oleynik <dzo@simtreas.ru> (C) 2002
+
+Ну и у меня привычка изучать, что за конторы контрибьютят в опенсорс;
+мало ли у них какие вакансии интересные висят.
+
+Открываю: [simtreas.ru](http://simtreas.ru) — Управления Федерального
+казначейства по Ульяновской области
+
+Ну, мало ли с 2002 года забрали другой домен. Иду в
+[http://web.archive.org/web/20020408102201/http://simtreas.ru:80/contacts.htm](http://web.archive.org/web/20020408102201/http://simtreas.ru:80/contacts.htm)
+
+> Сетевой администратор. Олейник Владимир Николаевич
+> Сайт: http://www.simtreas.ru/~dzo
+
+Ы.
+
+P.S. Вот так выглядит количество коммитов в busybox, сделанных с
+разных почтовых доменов:
+
+```
+ ...
+ 178 redhat.com
+>>> 187 simtreas.ru
+ 213 lineo.com
+ 379 debian.org
+ 596 gentoo.org
+ 802 landley.net
+ 962 ihug.co.nz
+ 1105 gmail.com
+ 2521 codepoet.org
+ 7598 googlemail.com
+```
diff --git a/_posts/2018-11-17-multiplayer-games.md b/_posts/2018-11-17-multiplayer-games.md
new file mode 100644
index 0000000..7c8ca61
--- /dev/null
+++ b/_posts/2018-11-17-multiplayer-games.md
@@ -0,0 +1,33 @@
+---
+layout: post
+title: "List of all multiplayer games"
+description: "Full list of all multiplayer games"
+---
+
+## Co-operative games
+
+ - [Nuclear Throne Together (PC)][NTT]
+ - [The Binding of Isaac: True Co-op (PC)][Isaac]
+ - [Tetris Party Deluxe (Wii)][TetrisWii]
+ - [Portal 2 (PC)][Portal2] (в том числе community-карты)
+ - [Cuphead (PC)][Cuphead]
+ - [Trine 1/2/3 (PC)][Trine]
+ - [Castle Crashers (PC)][CastleCrashers]
+ - [Alien Swarm (PC)][AlienSwarm]
+ - [Diablo 2 (PC)][Diablo2]
+ - [Battle City (NES)][BattleCity]
+ - [Chip & Dale 1/2 (NES)][ChipDale]
+ - [Goof Troop (NES)][GoofTroop]
+
+[NTT]: https://yellowafterlife.itch.io/nuclear-throne-together
+[Isaac]: https://steamcommunity.com/sharedfiles/filedetails/?id=1230784774
+[TetrisWii]: https://www.youtube.com/watch?v=HIsk7JJZwQs
+[Portal2]: https://store.steampowered.com/app/620/Portal_2/
+[GoofTroop]: https://en.wikipedia.org/wiki/Goof_Troop_(video_game)
+[Cuphead]: https://store.steampowered.com/app/268910/Cuphead/
+[Trine]: https://en.wikipedia.org/wiki/Trine_(video_game)
+[CastleCrashers]: https://store.steampowered.com/app/204360/Castle_Crashers/
+[AlienSwarm]: https://store.steampowered.com/app/630/Alien_Swarm/
+[Diablo2]: https://en.wikipedia.org/wiki/Diablo_II
+[BattleCity]: https://en.wikipedia.org/wiki/Battle_City_(video_game)
+[ChipDale]: https://en.wikipedia.org/wiki/Chip_%27n_Dale_Rescue_Rangers_(video_game)
diff --git a/articles.md b/articles.md
deleted file mode 100644
index c431bda..0000000
--- a/articles.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-layout: articles
-title: Articles
----
-
-Статьи
-======
diff --git a/assets/Graphik-Bold-Cy-Web.woff b/assets/Graphik-Bold-Cy-Web.woff
new file mode 100644
index 0000000..7c09144
--- /dev/null
+++ b/assets/Graphik-Bold-Cy-Web.woff
Binary files differ
diff --git a/assets/Graphik-Regular-Cy-Web.woff b/assets/Graphik-Regular-Cy-Web.woff
new file mode 100644
index 0000000..ba9ebb0
--- /dev/null
+++ b/assets/Graphik-Regular-Cy-Web.woff
Binary files differ
diff --git a/assets/candara.ttf b/assets/candara.ttf
deleted file mode 100644
index 9c91b71..0000000
--- a/assets/candara.ttf
+++ /dev/null
Binary files differ
diff --git a/assets/game/android.png b/assets/game/android.png
new file mode 100644
index 0000000..24cc3c0
--- /dev/null
+++ b/assets/game/android.png
Binary files differ
diff --git a/assets/game/battletoads.gif b/assets/game/battletoads.gif
new file mode 100644
index 0000000..1de3bdd
--- /dev/null
+++ b/assets/game/battletoads.gif
Binary files differ
diff --git a/assets/game/belmont.png b/assets/game/belmont.png
new file mode 100644
index 0000000..afa5412
--- /dev/null
+++ b/assets/game/belmont.png
Binary files differ
diff --git a/assets/game/billrizer.png b/assets/game/billrizer.png
new file mode 100644
index 0000000..1f5afea
--- /dev/null
+++ b/assets/game/billrizer.png
Binary files differ
diff --git a/assets/game/cache.png b/assets/game/cache.png
new file mode 100644
index 0000000..7c52232
--- /dev/null
+++ b/assets/game/cache.png
Binary files differ
diff --git a/assets/game/chipndale.png b/assets/game/chipndale.png
new file mode 100644
index 0000000..4deec72
--- /dev/null
+++ b/assets/game/chipndale.png
Binary files differ
diff --git a/assets/game/game.html b/assets/game/game.html
new file mode 100644
index 0000000..757f102
--- /dev/null
+++ b/assets/game/game.html
@@ -0,0 +1,473 @@
+<html>
+ <head>
+ <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
+ <script>
+ $(document).ready(function() {
+ var clientId = null;
+ var clientSocket = null;
+
+ var WIDTH_STEP= 6; // Ширина шага
+
+ // Класс игрока
+ function Player(name, x, character) {
+ this.character = character;
+ this.action = 'standingRight';
+ this.name = name;
+ this.remove = false;
+ this.widthStep = WIDTH_STEP; // Ширина шага
+
+ this.x = x;
+ this.newX = 0;
+
+ this.animation = 0;
+
+ this.standLeft = function(x) {
+ this.action = 'standingLeft';
+ this.animation = 0;
+ this.widthStep = WIDTH_STEP;
+ }
+
+ this.standRight = function(x) {
+ this.action = 'standingRight';
+ this.animation = 0;
+ this.widthStep = WIDTH_STEP;
+ }
+
+ this.move = function(x) {
+ this.newX = x;
+ this.animation = 0;
+
+ if(this.x > x)
+ this.action = 'movingLeft';
+ else if(this.x < x)
+ this.action = 'movingRight';
+ }
+ }
+
+ // Экземпляры игроков
+ var players = {};
+
+ // Экземпляры объектов
+ var entities = [];
+
+ // Параметры поля
+ var battlefield = {};
+
+ // Параметры показываемоего участка
+ var show = {}
+
+ // Константы
+ var me = "ME"; // Идентификатор, по которому находим себя
+ var heightFloor = 330; // Высота пола
+ var heightNickname = 20; // Расстояние между игроком и его ником
+ var fps = 20; // Количество отрисовываний в секунду
+
+ function Entity(x, object) {
+ this.object = object;
+ this.x = x;
+ }
+
+ var background_with_entities_loaded = false;
+ var background_with_entities = new Image();
+
+ var objects = {
+ "forest": {resource: new Image(), url: "objects/forest.png",height:57,width:106},
+ "lamp": {resource: new Image(), url: "objects/lamp.png",height:83,width:50},
+ "shop-blue": {resource: new Image(), url: "objects/shop-blue.png",height:97,width:150},
+ "shop-red": {resource: new Image(), url: "objects/shop-red.png",height:97,width:150},
+ "shop-violet": {resource: new Image(), url: "objects/shop-violet.png",height:97,width:150},
+ "sign-blue": {resource: new Image(), url: "objects/sign-blue.png",height:23,width:23},
+ "tall-green": {resource: new Image(), url: "objects/tall-green.png",height:170,width:129},
+ "tall-red": {resource: new Image(), url: "objects/tall-red.png",height:170,width:129},
+ "tall-violet": {resource: new Image(), url: "objects/tall-violet.png",height:170,width:129},
+ "trash": {resource: new Image(), url: "objects/trash.png",height:16,width:17},
+ "wide-gray": {resource: new Image(), url: "objects/wide-gray.png",height:123,width:121},
+ "wide-green": {resource: new Image(), url: "objects/wide-green.png",height:123,width:121},
+ "wide-violet": {resource: new Image(), url: "objects/wide-violet.png",height:123,width:121}
+ };
+
+ // Описание шкурок
+ var characters = {
+ i : {
+ resource : new Image(),
+ url : "ios.png",
+ height : 55,
+ width : 37,
+ animations : {
+ standingLeft : [[0+37*8,0]],
+ standingRight : [[0+37*9,0]],
+ movingLeft : [[0+37*0,0],[0+37*1,0],[0+37*2,0],[0+37*3,0],[0+37*4,0],[0+37*5,0],[0+37*6,0],[0+37*7,0]],
+ movingRight : [[0+37*10,0],[0+37*11,0],[0+37*12,0],[0+37*13,0],[0+37*14,0],[0+37*15,0],[0+37*16,0],[0+37*17,0]],
+ }
+ },
+ android : {
+ resource : new Image(),
+ url : "android.png",
+ height : 55,
+ width : 37,
+ animations : {
+ standingLeft : [[0+37*8,0]],
+ standingRight : [[0+37*9,0]],
+ movingLeft : [[0+37*0,0],[0+37*1,0],[0+37*2,0],[0+37*3,0],[0+37*4,0],[0+37*5,0],[0+37*6,0],[0+37*7,0]],
+ movingRight : [[0+37*10,0],[0+37*11,0],[0+37*12,0],[0+37*13,0],[0+37*14,0],[0+37*15,0],[0+37*16,0],[0+37*17,0]],
+ }
+ },
+ stollman : {
+ resource : new Image(),
+ url : "stollman.png",
+ height : 55,
+ width : 37,
+ animations : {
+ standingLeft : [[0+37*8,0]],
+ standingRight : [[0+37*9,0]],
+ movingLeft : [[0+37*0,0],[0+37*1,0],[0+37*2,0],[0+37*3,0],[0+37*4,0],[0+37*5,0],[0+37*6,0],[0+37*7,0]],
+ movingRight : [[0+37*10,0],[0+37*11,0],[0+37*12,0],[0+37*13,0],[0+37*14,0],[0+37*15,0],[0+37*16,0],[0+37*17,0]],
+ }
+ },
+ };
+
+ // Случайное число от min до max
+ function rand(min, max) {
+ return Math.floor(Math.random() * (max - min + 1)) + min;
+ }
+
+ function init() {
+ var width = 3392;
+ var height = 339;
+ battlefield["canvas"] = document.createElement('canvas');
+ battlefield["context"] = battlefield["canvas"].getContext('2d');
+ battlefield["width"] = width;
+ battlefield["height"] = height;
+ show["canvas"] = document.getElementById("show");
+ show["context"] = show["canvas"].getContext('2d');
+ }
+ init();
+
+ // Выполняется, когда всё загружено
+ function ready() {
+ if(background_loaded && object_loaded == object_names.length && !background_with_entities_loaded)
+ makeBackground();
+ else if(background_with_entities_loaded && character_loaded == character_names.length && background_loaded && object_loaded == object_names.length) {
+ players[me] = new Player("me",
+ rand(30, battlefield["width"]-30),
+ character_names[rand(0,character_names.length-1)]
+ ); // создаём своего персонажа
+
+ $("#character").val(players[me].character);
+
+ //sync(); // запускаем сервис синхронизации
+ moving(); // запускаем сервис движения
+ draw(); // запускаем сервис отрисовывания
+ }
+ }
+ /*
+ // Сервис синхронизации
+ function sync() {
+ if(clientSocket == null) {
+ clientSocket = new WebSocket("ws://nazaryev.ru:8080/");
+ clientSocket.onmessage = function(event) {
+ var data = JSON.parse(event.data);
+ console.log(data);
+ if(clientId == null) {
+ clientId = data.id;
+ return;
+ }
+
+ $.each(players, function(id, player) {
+ players[id].remove = true;
+ });
+
+ players[me].remove = false;
+ $.each(data, function(id, player) {
+ if(id != clientId)
+ if(players[id] === undefined) {
+ players[id] = new Player(player['name'], parseInt(player['x']), player['character'])
+ } else {
+ players[id].move(player['x']);
+ players[id].name = player['name'];
+ players[id].character = player['character'];
+ players[id].remove = false;
+ }
+ });
+
+ $.each(players, function(id, player) {
+ if(players[id].remove) delete players[id];
+ });
+ clientSocket.send(JSON.stringify({id: clientId, x: players[me].x, name: players[me].name, character: players[me].character}));
+ };
+ }
+ */
+ /*$.getJSON("game.php?x=" + players[me].x + "&name=" + players[me].name + "&character=" + players[me].character, function(data) {
+
+ $.each(players, function(id, player) {
+ players[id].remove = true;
+ });
+
+ players[me].remove = false;
+ $.each(data, function(id, player) {
+ if(id != clientId) {
+ if(typeof players[id] == 'undefined') {
+ players[id] = new Player(player['name'], parseInt(player['x']), player['character'])
+ } else {
+ players[id].move(player['x']);
+ players[id].name = player['name'];
+ players[id].character = player['character'];
+ players[id].remove = false;
+ }
+ }
+ });
+
+ $.each(players, function(id, player) {
+ if(players[id].remove) delete players[id];
+ });
+
+ setTimeout (sync, 10000)
+ });
+ }
+ */
+ // Сервис движения
+ function moving() {
+ for(var key in players) {
+ var currentPlayer = players[key];
+ if(currentPlayer.action == 'movingRight' || currentPlayer.action == 'movingLeft') {
+ if(currentPlayer.action == 'movingRight' && currentPlayer.x < currentPlayer.newX) {
+ currentPlayer.widthStep += 0.1;
+ currentPlayer.x += currentPlayer.widthStep;
+ }
+ else if(currentPlayer.action == 'movingLeft' && currentPlayer.x > currentPlayer.newX) {
+ currentPlayer.widthStep += 0.1;
+ currentPlayer.x -= currentPlayer.widthStep;
+ }
+ else if(currentPlayer.action == 'movingLeft')
+ currentPlayer.standLeft();
+ else if(currentPlayer.action == 'movingRight')
+ currentPlayer.standRight();
+
+ animation(currentPlayer);
+ }
+ }
+
+ setTimeout (moving, 50)
+ }
+
+ // Обновление анимации персонажа при каком-либо действии
+ function animation(currentPlayer) {
+ if(currentPlayer.animation+1 < characters[currentPlayer.character]["animations"][currentPlayer.action].length) currentPlayer.animation++;
+ else if(currentPlayer.animation+1 >= characters[currentPlayer.character]["animations"][currentPlayer.action].length) currentPlayer.animation = 0;
+ }
+
+ function makeBackground() {
+ clear();
+
+ var parts = 35;
+ var offset = battlefield["width"] / parts;
+
+ for(var i = 1; i <= 300; i++) {
+ var object = object_names[rand(0, object_names.length-1)];
+ var x = rand((i-1)*offset, i*offset);
+ entities.push(new Entity(x, object));
+ }
+
+ battlefield["context"].drawImage(background, 0, 0);
+
+ for(var key in entities) {
+ var currentEntity = entities[key];
+ battlefield["context"].drawImage(
+ objects[currentEntity.object]["resource"],
+ 0,
+ 0,
+ objects[currentEntity.object]["width"],
+ objects[currentEntity.object]["height"],
+ currentEntity.x,
+ heightFloor - objects[currentEntity.object]["height"],
+ objects[currentEntity.object]["width"],
+ objects[currentEntity.object]["height"]
+ );
+
+ }
+
+ background_with_entities.src = battlefield["canvas"].toDataURL();
+ background_with_entities.onload = function() {
+ background_with_entities_loaded = true;
+ ready();
+ }
+ }
+
+ function clear() {
+ battlefield["canvas"].width = battlefield["width"];
+ battlefield["canvas"].height = battlefield["height"];
+ }
+
+ // Сервис отрисовывания кадров
+ function draw() {
+ // Очищаем холст всего поля
+ battlefield["canvas"].width = battlefield["width"];
+ battlefield["canvas"].height = battlefield["height"];
+
+ // Рисуем фон
+ battlefield["context"].drawImage(background_with_entities, 0, 0);
+
+ // Рисуем игроков и их ники
+ for(var key in players) {
+ var currentPlayer = players[key];
+ battlefield["context"].shadowColor = "rgba(0,0,0,0)";
+ battlefield["context"].drawImage(
+ characters[currentPlayer.character]["resource"],
+ characters[currentPlayer.character]["animations"][currentPlayer.action][currentPlayer.animation][0],
+ characters[currentPlayer.character]["animations"][currentPlayer.action][currentPlayer.animation][1],
+ characters[currentPlayer.character]["width"],
+ characters[currentPlayer.character]["height"],
+ currentPlayer.x,
+ heightFloor - characters[currentPlayer.character]["height"],
+ characters[currentPlayer.character]["width"],
+ characters[currentPlayer.character]["height"]
+ );
+
+ battlefield["context"].font = "bold 12px Arial";
+
+ battlefield["context"].shadowColor = "#000";
+ battlefield["context"].shadowOffsetX = 1;
+ battlefield["context"].shadowOffsetY = 1;
+ battlefield["context"].shadowBlur = 2;
+
+ battlefield["context"].fillStyle = "#fff";
+ battlefield["context"].textAlign = 'center';
+
+ battlefield["context"].fillText(currentPlayer.name, currentPlayer.x + (characters[currentPlayer.character]["width"]/2), heightFloor-heightNickname-characters[currentPlayer.character]["height"]);
+ }
+
+ // Очищаем холст видимого участка
+ show["canvas"].width = document.body.clientWidth; // рисуем по ширине экрана
+ show["canvas"].height = battlefield["height"]; // по высоте поля
+
+ // Определяем видимый участок и отрисовываем его
+ var m = Math.min((players[me].x+show["canvas"].width/2) - show["canvas"].width, battlefield["width"]-show["canvas"].width);
+ show["context"].drawImage(
+ battlefield["canvas"],
+ ((m < 0) ? 0 : m), 0,
+ show["canvas"].width,
+ show["canvas"].height,
+ 0, 0,
+ show["canvas"].width,
+ show["canvas"].height
+ );
+ setTimeout (draw, 1000 / fps)
+ }
+
+ // Количество шкурок
+ var character_names = [];
+ for (var name in characters) character_names[character_names.length] = name;
+
+ // Количество объектов
+ var object_names = [];
+ for (var name in objects) object_names[object_names.length] = name;
+
+ // Загрузка шкурок
+ var character_loaded = 0;
+ for(var key in characters) {
+ characters[key]["resource"].src = characters[key]["url"];
+ characters[key]["resource"].onload = function() {
+ character_loaded++;
+ ready();
+ }
+ }
+
+ var object_loaded = 0;
+ for(var key in objects) {
+ objects[key]["resource"].src = objects[key]["url"];
+ objects[key]["resource"].onload = function() {
+ object_loaded++;
+ ready();
+ }
+ }
+
+ // Загрузка фона
+ var background_loaded = false; // Загрузился ли фон?
+ var background = new Image();
+ background.src = 'world.png';
+ background.onload = function() {
+ background_loaded = true;
+ ready();
+ }
+
+ // Изменение ника
+ $("#nickname").change(function() {
+ if($(this).val().length > 0) players[me].name = $(this).val();
+ });
+
+ // Изменение шкурки
+ $("#character").change(function() {
+ players[me].character = $(this).val();
+ });
+
+ // Запрещаем писать пробелы
+ $("#nickname").keydown(function(e) {
+ if (e.keyCode == 32) return false;
+ });
+
+ // Обрабатываем отжатие клавиши
+ $(document).keyup(function(e){
+ if (e.keyCode == 37) {
+ players[me].standLeft();
+ return false;
+ } else if(e.keyCode == 39) {
+ players[me].standRight();
+ return false;
+ }
+
+ });
+
+ // Обрабатываем нажатие клавиши
+ $(document).keydown(function(e) {
+ if (e.keyCode == 37) {
+ if(players[me].action != 'movingRight' && players[me].action != 'movingLeft') players[me].move(-Infinity);
+ return false;
+ } else if(e.keyCode == 39) {
+ if(players[me].action != 'movingRight' && players[me].action != 'movingLeft') players[me].move(Infinity);
+ return false;
+ }
+ });
+ });
+ </script>
+
+ <style>
+ html, body {
+ padding: 0;
+ margin: 0;
+ height:100%;
+ overflow-y: hidden;
+ }
+ .container {
+ min-height: 100%;
+ height: auto !important;
+ height: 100%;
+ }
+
+ #footer {
+ background: url(world.png);
+ width: 100%;
+ height: 339px;
+ }
+
+ canvas {
+ width: 100%;
+ height: 339px;
+ }
+ </style>
+ </head>
+ <body>
+ <div id="container">
+ <div id="footer">
+ <canvas id='show'></canvas>
+ <div style="position: relative; margin-left: 5px;bottom: 25px;">
+ <input maxlength=20 type="text" id="nickname" value="me" style="height: 15px; font-size: 10px;"/>
+ <select id="character" style="height: 15px; font-size: 10px;">
+ <option value="i">iMan</option>
+ <option value="android">Android</option>
+ <option value="stollman">Stollman</option>
+ </select>
+ </div>
+ </div>
+ </div>
+ </body>
+</html>
diff --git a/assets/game/higgins.png b/assets/game/higgins.png
new file mode 100644
index 0000000..7cb1fc0
--- /dev/null
+++ b/assets/game/higgins.png
Binary files differ
diff --git a/assets/game/ios.png b/assets/game/ios.png
new file mode 100644
index 0000000..8b2451e
--- /dev/null
+++ b/assets/game/ios.png
Binary files differ
diff --git a/assets/game/mario.png b/assets/game/mario.png
new file mode 100644
index 0000000..62684f2
--- /dev/null
+++ b/assets/game/mario.png
Binary files differ
diff --git a/assets/game/objects/forest.png b/assets/game/objects/forest.png
new file mode 100755
index 0000000..5ec07bb
--- /dev/null
+++ b/assets/game/objects/forest.png
Binary files differ
diff --git a/assets/game/objects/lamp.png b/assets/game/objects/lamp.png
new file mode 100755
index 0000000..e9da156
--- /dev/null
+++ b/assets/game/objects/lamp.png
Binary files differ
diff --git a/assets/game/objects/shop-blue.png b/assets/game/objects/shop-blue.png
new file mode 100755
index 0000000..eda6584
--- /dev/null
+++ b/assets/game/objects/shop-blue.png
Binary files differ
diff --git a/assets/game/objects/shop-red.png b/assets/game/objects/shop-red.png
new file mode 100755
index 0000000..97570fc
--- /dev/null
+++ b/assets/game/objects/shop-red.png
Binary files differ
diff --git a/assets/game/objects/shop-violet.png b/assets/game/objects/shop-violet.png
new file mode 100755
index 0000000..e1534d5
--- /dev/null
+++ b/assets/game/objects/shop-violet.png
Binary files differ
diff --git a/assets/game/objects/sign-blue.png b/assets/game/objects/sign-blue.png
new file mode 100755
index 0000000..fd1c58a
--- /dev/null
+++ b/assets/game/objects/sign-blue.png
Binary files differ
diff --git a/assets/game/objects/tall-green.png b/assets/game/objects/tall-green.png
new file mode 100755
index 0000000..d0b4063
--- /dev/null
+++ b/assets/game/objects/tall-green.png
Binary files differ
diff --git a/assets/game/objects/tall-red.png b/assets/game/objects/tall-red.png
new file mode 100755
index 0000000..8e16e40
--- /dev/null
+++ b/assets/game/objects/tall-red.png
Binary files differ
diff --git a/assets/game/objects/tall-violet.png b/assets/game/objects/tall-violet.png
new file mode 100755
index 0000000..3a91f9e
--- /dev/null
+++ b/assets/game/objects/tall-violet.png
Binary files differ
diff --git a/assets/game/objects/trash.png b/assets/game/objects/trash.png
new file mode 100755
index 0000000..448b261
--- /dev/null
+++ b/assets/game/objects/trash.png
Binary files differ
diff --git a/assets/game/objects/wide-gray.png b/assets/game/objects/wide-gray.png
new file mode 100755
index 0000000..f754e45
--- /dev/null
+++ b/assets/game/objects/wide-gray.png
Binary files differ
diff --git a/assets/game/objects/wide-green.png b/assets/game/objects/wide-green.png
new file mode 100755
index 0000000..10dc2bf
--- /dev/null
+++ b/assets/game/objects/wide-green.png
Binary files differ
diff --git a/assets/game/objects/wide-violet.png b/assets/game/objects/wide-violet.png
new file mode 100755
index 0000000..1da2b3c
--- /dev/null
+++ b/assets/game/objects/wide-violet.png
Binary files differ
diff --git a/assets/game/objects/world.png b/assets/game/objects/world.png
new file mode 100755
index 0000000..46ca080
--- /dev/null
+++ b/assets/game/objects/world.png
Binary files differ
diff --git a/assets/game/stollman.png b/assets/game/stollman.png
new file mode 100644
index 0000000..ef27637
--- /dev/null
+++ b/assets/game/stollman.png
Binary files differ
diff --git a/assets/game/world.png b/assets/game/world.png
new file mode 100644
index 0000000..46ca080
--- /dev/null
+++ b/assets/game/world.png
Binary files differ
diff --git a/assets/style.css b/assets/style.css
index 6bd979d..1aa9704 100644
--- a/assets/style.css
+++ b/assets/style.css
@@ -1,16 +1,30 @@
-body {
- overflow-y: scroll;
+@font-face {
+ font-family:Graphik LC;
+ src:url(/assets/Graphik-Bold-Cy-Web.eot);
+ src:url(/assets/Graphik-Bold-Cy-Web.eot?#iefix) format("embedded-opentype"),url(/assets/Graphik-Bold-Cy-Web.woff) format("woff"),url(/assets/Graphik-Bold-Cy-Web.ttf) format("truetype"),url(/assets/Graphik-Bold-Cy-Web.svg#Graphik-Bold-Cy) format("svg");
+ font-weight:700;
+ font-style:normal
+}
+
+@font-face {
+ font-family:Graphik LC;
+ src:url(/assets/Graphik-Regular-Cy-Web.eot);
+ src:url(/assets/Graphik-Regular-Cy-Web.eot?#iefix) format("embedded-opentype"),url(/assets/Graphik-Regular-Cy-Web.woff) format("woff"),url(/assets/Graphik-Regular-Cy-Web.ttf) format("truetype"),url(/assets/Graphik-Regular-Cy-Web.svg#Graphik-Regular-Cy) format("svg");
+ font-weight:400;
+ font-style:normal;
+ font-stretch:normal
}
html, body {
+ -webkit-overflow-scrolling: auto;
width: 100%;
height: 100%;
padding: 0;
margin: 0;
+ line-height: 1.5;
text-rendering: optimizeLegibility;
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
- line-height: 1.6;
+ font-family: "Graphik LC", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
color: #444;
font-size: 18px;
}
@@ -64,52 +78,51 @@ img, .product-tags {
background: none repeat scroll 0% 0% #D6EDFC;
}
-.contacts {
- padding-top: 5px;
- float: left;
-}
-
-.contacts__position {
- vertical-align: middle;
- line-height: 15px;
- font-size: 15px;
-}
-
.contacts__name {
font-size: 25px;
}
-.post {
- padding: 20px 40px;
+.contacts__info {
+ font-size: 14px;
+ padding: 10px 0 0 0;
}
-main {
- width: 1160px;
+footer {
+ height: 339px;
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ padding-top: 50px;
}
-nav {
- width: 1160px;
- margin: 0 40px;
- background: white;
- height: 80px;
- border-bottom: 1px solid #f0f0f0;
+.wrapper {
+ min-height: 100%;
+ position: relative;
}
-.menu-horizontal {
- float: left;
+.page {
+ padding-top: 30px;
+ padding-left: 60px;
+ width: 1000px;
+ padding-bottom: 380px;
+}
+
+.menu {
width: 100%;
- padding: 0;
- margin: 0;
+ padding: 20px 0 20px 0;
+ margin-bottom: 20px;
+ margin-top: 20px;
list-style-type: none;
+ line-height: 36px;
+ border-top: 1px solid #f0f0f0;
+ border-bottom: 1px solid #f0f0f0;
}
-.menu-horizontal__item {
- margin: 0px 0px 0px 15px;
- display: inline;
- float: left;
+.menu__item {
text-transform: uppercase;
letter-spacing: 0.5px;
- font-size: 12px;
+ font-size: 18px;
}
.game {
@@ -121,19 +134,97 @@ nav {
height: 339px;
}
-.menu {
- padding-top: 10px;
- float: left;
+.menu-container {
+ margin: 0;
+ padding: 0;
+}
+
+nav {
+ flex: 0 0 230px;
+ text-align: center;
+ background: white;
+ padding: 0;
+ margin: 0;
+}
+
+main {
+ padding: 0 0 0 60px;
+ flex-grow: 3;
+}
+
+.page {
+ flex-direction: row;
+ display: flex;
+ justify-content: center;
+ align-items: stretch;
+}
+
+.email {
+ font-size: 14px;
+}
+
+@media (max-width: 800px) {
+ html, body {
+ font-size: 16px;
+ line-height: 1.2;
+ }
+
+ .page {
+ flex-direction: column;
+ width: auto !important;
+ padding-left: 0px !important;
+ padding-top: 20px !important;
+ }
+
+ .email {
+ display: none;
+ }
+
+ nav {
+ flex: 0 0 0;
+ margin-bottom: 10px;
+ }
+
+ .contacts__position {
+ display: inline;
+ }
+
+ .contacts__info {
+ padding: 10px 18px 0 18px;
+ }
+
+ .menu {
+ padding: 10px 0 10px 0;
+ line-height: 1.5;
+ }
+
+ menu li {
+ display: inline;
+ list-style-type: none;
+ padding-right: 20px;
+ font-size: 13px !important;
+ }
+
+ main {
+ padding-right: 30px;
+ padding-left: 30px;
+ }
+
+ main p {
+ margin-top: 20px;
+ margin-bottom: 20px;
+ margin-left: 0px !important;
+ }
}
.additional {
- padding: 50px;
+ padding: 0 50px 50px 50px;
}
.additional h2 {
padding: 0;
margin: 0;
- font-size: 60px;
+ font-size: 48px;
}
.additional ul li {
@@ -144,19 +235,8 @@ nav {
content: "— ";
}
-.product-photo {
- display: none;
- float: left;
- padding-top: 10px;
- width: 250px;
-}
-
-.product-photo img {
- width: 280px;
-}
-
.product-tags {
- padding-left: 40px;
+ float: left;
text-align: left;
}
@@ -166,45 +246,54 @@ nav {
margin: 2px;
background: #4779f6;
border-radius: 15px;
-}
-
-.products {
- padding: 15px 35px;
+ font-size: 10px;
}
.products__item {
- display: inline-block;
- width: 325px;
- margin: 5px;
- border: 1px solid #ddd;
+ margin: 0px 10px 20px 5px;
+ padding-bottom: 20px;
+ border-bottom: 1px solid #ddd;
}
-.product-info {
- padding: 20px 10px 15px 25px;
+.products__item:last-child {
+ border: 0;
+ padding-bottom: 0;
}
.product-description {
- font-size: 14px;
+ padding-top: 10px;
+ padding-bottom: 10px;
line-height: 1.5;
- max-height: 170px;
- height: 170px;
+ font-size: 16px;
}
.product-icon {
- float: left;
- padding-right: 10px;
- height: 55px;
+ display: inline-block;
+ padding-right: 2px;
+ vertical-align: middle;
+ height: 20px;
}
.product-header {
- margin-bottom: 10px;
- height: 55px;
+ height: 30px;
}
.product-title {
- display: block;
- padding-top: 10px;
- font-size: 24px;
+ display: inline-block;
+ font-size: 14px;
+ vertical-align: baseline;
+
+ color: #282425;
+ font-weight: 900;
+ letter-spacing: 0.035em;
+ text-transform: uppercase;
+}
+
+.product-link {
+ padding-top: 7px;
+ padding-right: 10px;
+ float: right;
+ font-size: 12px;
}
.product-link-passive:hover {
@@ -212,8 +301,7 @@ nav {
}
main ul, main ol {
- margin-left: 2em;
- margin-bottom: 1em;
+ margin-left: 27px;
}
main ul li:before {
@@ -226,23 +314,31 @@ main ul li:before {
position: absolute;
}
+ul p, main p, ul {
+ line-height: 1.7;
+}
+
main ul p {
margin: 0px;
- line-height: 31px;
}
main p {
- line-height: 25px;
margin: 20px;
}
+main pre {
+ margin: 20px;
+ background: rgba(0,0,0,0.02);
+ padding: 15px;
+}
+
main ul {
padding: 0;
list-style: none;
- line-height: 31px;
}
main h1, main h2 {
+ margin: 0;
padding: 0;
color: #282425;
font-weight: 900;
diff --git a/assets/syntax.css b/assets/syntax.css
new file mode 100644
index 0000000..5ec3fbc
--- /dev/null
+++ b/assets/syntax.css
@@ -0,0 +1,62 @@
+.highlight .c { color: #999988; font-style: italic } /* Comment */
+.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
+.highlight .k { font-weight: bold } /* Keyword */
+.highlight .o { font-weight: bold } /* Operator */
+.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */
+.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */
+.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */
+.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
+.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
+.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */
+.highlight .ge { font-style: italic } /* Generic.Emph */
+.highlight .gr { color: #aa0000 } /* Generic.Error */
+.highlight .gh { color: #999999 } /* Generic.Heading */
+.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
+.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */
+.highlight .go { color: #888888 } /* Generic.Output */
+.highlight .gp { color: #555555 } /* Generic.Prompt */
+.highlight .gs { font-weight: bold } /* Generic.Strong */
+.highlight .gu { color: #aaaaaa } /* Generic.Subheading */
+.highlight .gt { color: #aa0000 } /* Generic.Traceback */
+.highlight .kc { font-weight: bold } /* Keyword.Constant */
+.highlight .kd { font-weight: bold } /* Keyword.Declaration */
+.highlight .kp { font-weight: bold } /* Keyword.Pseudo */
+.highlight .kr { font-weight: bold } /* Keyword.Reserved */
+.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */
+.highlight .m { color: #009999 } /* Literal.Number */
+.highlight .s { color: #d14 } /* Literal.String */
+.highlight .na { color: #008080 } /* Name.Attribute */
+.highlight .nb { color: #0086B3 } /* Name.Builtin */
+.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */
+.highlight .no { color: #008080 } /* Name.Constant */
+.highlight .ni { color: #800080 } /* Name.Entity */
+.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */
+.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */
+.highlight .nn { color: #555555 } /* Name.Namespace */
+.highlight .nt { color: #000080 } /* Name.Tag */
+.highlight .nv { color: #008080 } /* Name.Variable */
+.highlight .ow { font-weight: bold } /* Operator.Word */
+.highlight .w { color: #bbbbbb } /* Text.Whitespace */
+.highlight .mf { color: #009999 } /* Literal.Number.Float */
+.highlight .mh { color: #009999 } /* Literal.Number.Hex */
+.highlight .mi { color: #009999 } /* Literal.Number.Integer */
+.highlight .mo { color: #009999 } /* Literal.Number.Oct */
+.highlight .sb { color: #d14 } /* Literal.String.Backtick */
+.highlight .sc { color: #d14 } /* Literal.String.Char */
+.highlight .sd { color: #d14 } /* Literal.String.Doc */
+.highlight .s2 { color: #d14 } /* Literal.String.Double */
+.highlight .se { color: #d14 } /* Literal.String.Escape */
+.highlight .sh { color: #d14 } /* Literal.String.Heredoc */
+.highlight .si { color: #d14 } /* Literal.String.Interpol */
+.highlight .sx { color: #d14 } /* Literal.String.Other */
+.highlight .sr { color: #009926 } /* Literal.String.Regex */
+.highlight .s1 { color: #d14 } /* Literal.String.Single */
+.highlight .ss { color: #990073 } /* Literal.String.Symbol */
+.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */
+.highlight .vc { color: #008080 } /* Name.Variable.Class */
+.highlight .vg { color: #008080 } /* Name.Variable.Global */
+.highlight .vi { color: #008080 } /* Name.Variable.Instance */
+.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */
+
+.post > .highlight .lineno { color: #ccc; display:inline-block; padding: 0 5px; border-right:1px solid #ccc; }
+.post > .highlight pre code { display: block; white-space: pre; overflow-x: auto; word-wrap: normal; }
diff --git a/forge.md b/forge.md
deleted file mode 100644
index 5e954a9..0000000
--- a/forge.md
+++ /dev/null
@@ -1,38 +0,0 @@
----
-layout: page
-title: Source code
----
-
-Что же я могу показать?
-=======================
-
-* У меня есть набор [dotfiles](http://git.nazaryev.ru/cgit/dotfiles.git/),
- который я использую на большинстве своих девайсов;
-
-* [Медианный
- фильтр](http://git.nazaryev.ru/cgit/metrotek-aptitude-test.git/) в
- качестве тестового задания в [НТЦ Метротек](http://metrotek.spb.ru);
-
-* В рамках университетских работ делаю [контроллер FLASH-памяти ST
- M25P16 на
- Verilog](http://git.nazaryev.ru/cgit/circuit-design-lab234.git);
-
-* [Реверс-инжиниринг приложения под
- Android](http://git.nazaryev.ru/cgit/drweb-aptitude-test.git/) в рамках
- тестового задания в компанию Dr. Web на вакансию `Вирусный
- аналитик-стажёр Android`;
-
-* В свободное время пытаюсь написать [очень ёмкую
- выдержку](http://git.nazaryev.ru/cgit/csbook.git/) из книг
- Таненбаума по архитектуре ЭВМ;
-
-* Для зачёта по дисциплине `Информатика` в университете писал
- [web-приложение для обучения
- алгебре логики](http://git.nazaryev.ru/cgit/euler.git/) на основе кругов Эйлера;
-
-* [Портфолио на сайте
- nazaryev.ru](http://git.nazaryev.ru/cgit/portfolio.git/) собирается с
- помощью Makefile и python'а;
-
-* Резюме [тоже собирается](http://git.nazaryev.ru/cgit/resume.git/), но
- Makefile'ом и pdflatex'ом.
diff --git a/index.md b/index.md
index 673bce1..57b3e38 100644
--- a/index.md
+++ b/index.md
@@ -1,3 +1,38 @@
---
-layout: projects
+layout: page
---
+
+Что же я могу показать?
+=======================
+
+ - У меня есть набор [dotfiles][dotfiles], который я использую на
+ большинстве своих устройств;
+
+ - [Подсчёт статистики сетевого интерфейса в ядре(eBPF)][ifstat] в
+ качестве тестового задания в НТЦ Метротек;
+
+ - [Фреймворк под Xilinx Zynq 7000][zybo-z7] для написания bare
+ metal-кода без использования Xilinx SDK;
+
+ - [Реверс-инжиниринг приложения под Android][drweb] в рамках
+ тестового задания в компанию Dr. Web на вакансию Вирусный
+ аналитик-стажёр Android;
+
+ - В рамках университетских работ делаю поддержку контроллера
+ [ST M25P16 на Verilog][m25p16];
+
+ - Для зачёта по дисциплине Информатика в университете писал
+ [web-приложение для обучения алгебре логики][euler] на основе
+ кругов Эйлера;
+
+ - Резюме [тоже собирается][resume], но Makefile'ом и xelatex'ом.
+
+[resume]: http://git.nazaryev.ru/cgit/resume.git
+[euler]: http://git.nazaryev.ru/cgit/euler.git
+[csbook]: http://git.nazaryev.ru/cgit/csbook.git
+[drweb]: http://git.nazaryev.ru/cgit/drweb-aptitude-test.git
+[m25p16]: http://git.nazaryev.ru/cgit/circuit-design-lab234.git
+[medfilter]: http://git.nazaryev.ru/cgit/metrotek-aptitude-test.git
+[dotfiles]: http://git.nazaryev.ru/cgit/dotfiles.git
+[ifstat]: https://github.com/3ap/ifstat
+[zybo-z7]: https://github.com/3ap/zybo-z7-baremetal
diff --git a/notes.md b/notes.md
new file mode 100644
index 0000000..b001d14
--- /dev/null
+++ b/notes.md
@@ -0,0 +1,7 @@
+---
+layout: articles
+title: Заметки
+---
+
+Заметки
+=======
diff --git a/projects.md b/projects.md
new file mode 100644
index 0000000..1814b1d
--- /dev/null
+++ b/projects.md
@@ -0,0 +1,7 @@
+---
+layout: projects
+title: Проекты
+---
+
+В чём я участвовал?
+===================
diff --git a/resume.pdf b/resume.pdf
new file mode 100644
index 0000000..38c1770
--- /dev/null
+++ b/resume.pdf
Binary files differ