Новый сервер с игрищами и блудницами – 2

Итак, надо виртуализироваться. Виртуализироваться будем через KVM потому что опять же продвигается редхатом, всеми поддерживается и так далее и тому подобное.

Для начала ставим кучку жутко “необходимого” софта: yum install qemu-kvm libvirt python-virtinst bridge-utils

Затем запускаем установленное

systemctl start libvirtd
systemctl enable libvirtd

Опять же, ничего такого вроде не появилось, за исключением пары интерфейсов с названиями virbr и адресом 192.168.122.1/24.

3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
link/ether 52:54:00:ba:d8:82 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 500
link/ether 52:54:00:ba:d8:82 brd ff:ff:ff:ff:ff:ff

Первым делом мне надо добавить ipv6 адрес. Только не вздумайте искать по совпадениям и править руками. Есть гораздо более приятные средства.

virsh net-destroy default
virsh net-edit default

Screenshot 2016-01-16 15.18.40

И добавим еще одно определение сети.

Screenshot 2016-01-16 15.27.38

virsh net-start default

Screenshot 2016-01-16 15.30.24

а в логах должно быть что-то похожее на

Jan 16 13:28:36 tower dnsmasq-dhcp[3544]: DHCP, IP range 10.100.0.100 -- 10.100.0.200, lease time 1h
Jan 16 13:28:36 tower dnsmasq-dhcp[3544]: DHCPv6, IP range 2a01:4f8:171:1a43:8000::1000 -- 2a01:4f8:171:1a43:8000::2000, lease time 1h
Jan 16 13:28:36 tower dnsmasq-dhcp[3544]: router advertisement on 2a01:4f8:171:1a43::
Jan 16 13:28:36 tower dnsmasq-dhcp[3544]: IPv6 router advertisement enabled

Откуда появился 2a01:4f8:171:1a43:8000::2/96 ?

Дело в том, что hetzner выдал мне ipv6 адрес 2a01:4f8:171:1a43::2/64. Типа подсеть на хост и все такое. Я взял с серединки (:8000) кусочек в 32 бита (128-96) или 4 миллиарда адресов. Ну или столько, сколько сейчас адресов в интернете 🙂 Из этого диапазона я выделил малюсенький кусочек в тысячу адресов для виртуалок. Думаю, что мне этого хватит 🙂 Ну и заодно поменял адрес для ipv4 на более подходящий мне.

Теперь самое время проверить доступность с другого хоста.

[root@outpost ~]# ping6 2a01:4f8:171:1a43:8000::2 -c 2
PING 2a01:4f8:171:1a43:8000::2(2a01:4f8:171:1a43:8000::2) 56 data bytes
64 bytes from 2a01:4f8:171:1a43:8000::2: icmp_seq=1 ttl=59 time=0.864 ms
64 bytes from 2a01:4f8:171:1a43:8000::2: icmp_seq=2 ttl=59 time=0.490 ms

--- 2a01:4f8:171:1a43:8000::2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.490/0.677/0.864/0.187 ms
[root@outpost ~]# ping6 2a01:4f8:171:1a43::2 -c 2
PING 2a01:4f8:171:1a43::2(2a01:4f8:171:1a43::2) 56 data bytes
64 bytes from 2a01:4f8:171:1a43::2: icmp_seq=1 ttl=59 time=0.341 ms
64 bytes from 2a01:4f8:171:1a43::2: icmp_seq=2 ttl=59 time=0.452 ms

--- 2a01:4f8:171:1a43::2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.341/0.396/0.452/0.058 ms

В общем, все как в ipv4, только маски дикие по размерам и не привычные.

Теперь надо поднять какую-нибудь виртуалку, что бы протестировать роутинг и прочие штуки.

Добавляем полезную утилиту для лентяев yum install virt-install virt-viewer

И останавливаемся. Потому что нам надо выделить немножко места для виртуалок.

lvcreate -L 100G -n vm vg0
mkfs.xfs /dev/vg0/vm
mkdir /vm
mcedit /etc/fstab
mount /vm

100Гб для начала хватит, а потом по необходимости растяну.

Так как я хардкорничаю, то добавляю необходимое для selinux

yum install policycoreutils-python
semanage fcontext -a -t virt_image_t "/vm(/.*)?"
restorecon -R /vm

И выкачиваю дистрибутив CentOS (Тут немного бальзама: качается по ipv6. Мелочь, а приятно)

mkdir /vm/iso
cd /vm/iso
wget http://ftp.funet.fi/pub/mirrors/centos.org/7/isos/x86_64/CentOS-7-x86_64-DVD-1511.iso

Ну и теперь пора поставить тестовую машину. Пока без всяких ускорений, акселераций и прочего. Мне надо просто проверить сеть и все, что с ней связано.

virt-install --name test --ram 1024 --disk path=/vm/test.qcow2,size=8 --vcpus 1 --os-type linux --network bridge=virbr0 --location /vm/iso/CentOS-7-x86_64-DVD-1511.iso --extra-args='console=tty0 console=ttyS0,115200n8 serial' --nographics

Значение каждого параметра либо понятны сразу, либо описаны в документации или интернете. Если все сделали правильно (я каюсь, не сразу все сделал правильно, но это оставим за скобками), то вы должны увидеть текстовый интерфейс, очень похожий расположением элементов на графический. Инсталлятор понятен любому, кто хоть раз ставил центось. В общем, после указания всех шагов получим наглядную иллюстрацию процесса инсталляции.

Screenshot 2016-01-16 16.40.05

После установки мы увидим консоль сервера и может туда залогиниться и даже попинговать ipv4 адреса. ipv6 не пингуется, потому что на интерфейсе сидит только локальный адрес.

Screenshot 2016-01-16 17.37.01

Более того, можно даже немного поэстетствовать и использовать графический virt-manager. Правда, придется добавить немного пакетов, что бы графическая часть морды не ругалась.

yum install xauth libcanberra-gtk3 PackageKit-gtk3-module dejavu-lgc-sans-fonts dejavu-lgc-sans-mono-fonts

Если virt-manager ругается на то, что консоль занята, значит вы не отцепились (Ctrl-]) от текстовой в другом терминале

Ну и затем с любого линукса ssh -X на машину и я получаю вот это.

Screenshot 2016-01-16 17.50.45

В принципе, полный контроль над машинами. Иногда очень удобно, иногда нет.

Но я отвлекся. В виртуальной машине ipv4 есть, получен и даже работает, а ipv6 нет. И еще тормозит по диску уж больно жутко.

Диск лечится просто: тормозим машину, virsh edit test и где driver добавляем cache=’unsafe’ (для рабочих не надо так делать). После запускаем и видим вполне себе шустро бегающую машинку.

Теперь с сетью. Заходим на тестовую машину, запускаем dhclient -6 ens3 (ens3 это у меня сетевой интерфейс). И видим в логах

Jan 16 16:30:58 tower dnsmasq-dhcp[3544]: no address range available for DHCPv6 request via virbr0

Оппа! А почему? Вроде же определили все и выдали тоже все …

Прибиваем в тестовой машине адрес 2a01:4f8:171:1a43:8000::99 и пингуем – пингуется, но только с хоста. Это нормально.

Как прибить? В /etc/sysconfig/network-scripts/ifcfg-ens3

#IPV6_AUTOCONF=yes
IPV6ADDR=2a01:4f8:171:1a43:8000::1234

и перезапустить network

Так, раз пингуется, значит проблема не в адресе, а в настройках. Судя по аналогичным сообщениям, у меня проблемы с маской. Почитав еще немного интернетов, я дошел до такой конфигурации.

<ip family='ipv6' address='2a01:4f8:171:1a43:8000::2' prefix='64'>
<dhcp>
<range start='2a01:4f8:171:1a43:8000::100' end='2a01:4f8:171:1a43:8000::200'/>
</dhcp>
</ip>

Как видите, разница только в маске. Как ни странно, но в этом отношении ipv6 (вернее, его роутинг в линуксе) ведет себя немного “странней”, чем для ipv4. Но в любом случае, прочитанное оказалось верным и машина получила свой адрес.

Jan 16 18:03:01 tower dnsmasq-dhcp[5491]: DHCPREQUEST(virbr0) 10.100.0.141 52:54:00:81:5b:8f
Jan 16 18:03:01 tower dnsmasq-dhcp[5491]: DHCPACK(virbr0) 10.100.0.141 52:54:00:81:5b:8f test
Jan 16 18:03:03 tower dnsmasq-dhcp[5491]: RTR-SOLICIT(virbr0)
Jan 16 18:03:03 tower dnsmasq-dhcp[5491]: RTR-ADVERT(virbr0) 2a01:4f8:171:1a43::
Jan 16 18:03:03 tower dnsmasq-dhcp[5491]: DHCPCONFIRM(virbr0) 00:01:00:01:1e:2d:1e:b1:52:54:00:81:5b:8f
Jan 16 18:03:04 tower dnsmasq-dhcp[5491]: DHCPSOLICIT(virbr0) 00:01:00:01:1e:2d:1e:b1:52:54:00:81:5b:8f
Jan 16 18:03:04 tower dnsmasq-dhcp[5491]: DHCPADVERTISE(virbr0) 2a01:4f8:171:1a43:8000::13c 00:01:00:01:1e:2d:1e:b1:52:54:00:81:5b:8f
Jan 16 18:03:05 tower dnsmasq-dhcp[5491]: DHCPREQUEST(virbr0) 00:01:00:01:1e:2d:1e:b1:52:54:00:81:5b:8f
Jan 16 18:03:05 tower dnsmasq-dhcp[5491]: DHCPREPLY(virbr0) 2a01:4f8:171:1a43:8000::13c 00:01:00:01:1e:2d:1e:b1:52:54:00:81:5b:8f

Вывод ip addr

2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:81:5b:8f brd ff:ff:ff:ff:ff:ff
inet 10.100.0.141/24 brd 10.100.0.255 scope global dynamic ens3
valid_lft 3590sec preferred_lft 3590sec
inet6 2a01:4f8:171:1a43:8000::13c/128 scope global dynamic
valid_lft 3595sec preferred_lft 3595sec
inet6 fe80::5054:ff:fe81:5b8f/64 scope link
valid_lft forever preferred_lft forever

Как видно, сервер получил свой персональный ipv6 адрес, но ничего, кроме хоста пинговать не может. Причина простая как грабли – ipv6 не имеет NAT в принципе. Только роутинг.

Косвенным подтверждением является попытка попинговать адрес тестовой машины снаружи

[root@outpost ~]# ping6 2a01:4f8:171:1a43:8000::13c
PING 2a01:4f8:171:1a43:8000::13c(2a01:4f8:171:1a43:8000::13c) 56 data bytes
From 2a01:4f8:171:1a43::2 icmp_seq=1 Destination unreachable: Address unreachable
From 2a01:4f8:171:1a43::2 icmp_seq=2 Destination unreachable: Address unreachable

То есть пинг доходит до хоста, а тот отвечает, что не знает, куда роутить этот адрес. Аналогичное получим, если попытаемся напрямую с хоста попинговать. Ну нету этого адреса в таблице роутинга и все тут. Меняем маску на основном интерфейсе (64->128), что бы таблицу роутинга в порядок привести. Без перезагрузки

ip addr del 2a01:4f8:171:1a43::2/64 dev eth0
ip addr add 2a01:4f8:171:1a43::2/128 dev eth0

А с перезагрузкой в /etc/sysconfig/network-scripts/ifcfg-eth0

Что изменилось? С хоста началась пинговаться виртуалка и все. В общем, лично мне стало понятно, что ipv6 – это нифига не ipv4, только с бОльшими масками.

(чтение мануалов опущено)

В общем, с одной стороны все проще, а с другой – все сложнее. В ipv6 есть такая штука, как SLAAC, которая работает как некий навороченный DHCP сервер. Подробнее в маны.

Поэтому выкидываю нафиг все из настроек dnsmasq (virsh net-edit default) и оставляю только описание интерфейса.

<ip family='ipv6' address='2a01:4f8:171:1a43::3' prefix='64'>
</ip>

Ну и адрес попроще сделал. И сделал /etc/radvd.conf

interface virbr0
{
AdvSendAdvert on;
AdvManagedFlag off;
AdvOtherConfigFlag off;
prefix 2a01:4f8:171:1a43::/64
{
AdvOnLink on;
AdvAutonomous on;
AdvRouterAddr on;
};
RDNSS 2001:db8:0:a0a1::add:1010
2001:db8:0:a102::add:9999
2001:db8:0:a111::add:9898
{
};
};

Затем

systemctl enable radvd.service
systemctl start radvd.service

и перезагрузка виртуалки. Вуаля! Магия ipv6 сработала и виртуалка получила свой адрес.

inet6 2a01:4f8:171:1a43:5054:ff:fe81:5b8f/64 scope global noprefixroute dynamic
valid_lft 86170sec preferred_lft 14170sec

И даже пинги ходят во все стороны. То, что и требовалось получить.

Для проверки я создал еще одну виртуалочку (теперь с сразу с “быстрым” диском)

virt-install --name test2 --ram 1024 --disk path=/vm/test2.qcow2,size=8,bus=virtio,cache=none --vcpus 1 --os-type linux --network bridge=virbr0 --location /vm/iso/CentOS-7-x86_64-DVD-1511.iso --extra-args='console=tty0 console=ttyS0,115200n8 serial' --nographics

И сеть в ней сразу заработала без каких-либо дополнительных команд. То, что и требовалось получить. Теперь можно и виртуалки клепать.

Как выдаются адреса? А очень просто: простым маппингом мак-адреса сетевой. Опять же за подробностями в документацию.

link/ether 52:54:00:e4:63:05 brd ff:ff:ff:ff:ff:ff
inet6 2a01:4f8:171:1a43:5054:ff:fee4:6305/64 scope global noprefixroute dynamic

Главное изменение теперь в “политике безопасности”.

Раньше: вся сетевая безопасность лежала на хосте. Гости получали уже отфильтрованный трафик, только на те порты, которые разрешены. Можно было спокойно открывать порты, не опасаясь ничего.

Теперь: каждый гость выставлен наружу “напрямую” и требует соответствующей защиты. И не важно, что ipv4 адреса из “приватной” сети. Фаирволл, обновление и выключение ненужного – наше все.

Не страшно и не сложно, но помнить надо.

Итак, считаю, что очередной шаг закрыт. Теперь надо переносить существующее (разумеется, с одновременным апгрейдом)

Новый сервер с игрищами и блудницами – 1

Пришла ко мне рассылка от hetzner. Дескать, дорогой валуабный клиент, сделали мы новую линейку серверов. Памяти больше, проц быстрее, диски толще а денег надо меньше. Приходи и заказывай. Походил я кругами и заказал. А то на старом уже диски сыпаться начали и своп образовываться.

Но просто так переносить сервисы абсолютно не интересно: на старом сервере у меня стоит OpenVZ и весь перенос будет заключаться в паре команд, да смене имен в DNS. Где же развитие и толчок вперед? В общем, потыкался я и решил:

– Сменить основную OS с CentOS 6 на CentOS 7. systemd, firewalld и прочие d в полном изобилии. Некий опыт есть, но чего-то в голову лезут пошлые мысли про RHCE.
– Привести в порядок DNS. Сейчас у меня часть серверов тут, часть там, часть вообще через одно место. Пусть все будет одинаковым и у меня.
– ipv6. Не очень-то и надо, но смотреть выше про развитие.
– SNI. Хватит тратить ipv4 адреса на каждый SSL сервер (да и дешевле будет).
– Да и вообще, надо все закриптовать. А то стыдоба – личный SVN голым ходит.
– Ну и KVM надо. Иногда жутко как требуется винда “в прекрасном и далеком”, а городить туннели не охота. Заодно получится бесплатный терминальный сервер для меня любимого.
– OwnCloud тоже не помешал бы, как и OpenVPN сервер для разностей нехороших.
– Ну и остальное по вкусу.

Практика прошлых лет показала, что принцип “ставим один сервер, выкидываем с него лишнее, а все сервисы в виртуалки” оправдал себя на все 100%. Да, при настройке чуть-чуть подумать надо, но зато потом абсолютно никаких проблем и заморочек. Ни с хакерами, ни с распределением нагрузки, ни с резервным копированием … да вообще ни с чем. Так буду и тут делать.

Идем в админку и заказываем новый сервер. Ждем получения письма, в котором пишут радостное:

Screenshot 2016-01-16 10.52.41

Заходим, нас пускают …

Screenshot 2016-01-16 10.52.57

Для приличия делаем passwd root и начинаем осматриваться. Сразу замечаю, что немцы стойко держат флаг “мы делаем нах ордунг” и сделали два больших рейда по 2Тб. Один отдали под /, другой под /home. Интересно, какой у них был сценарий использования? Но в любом случае, мне такое не надо.

Идем опять в консоль и перегружаемся в rescue

Screenshot 2016-01-16 11.04.38

Выглядит именно тем, что я и заказывал (каюсь, да, не посмотрел раньше). Поэтому сразу набираем installimage

Там нам дают в mcedit поправить конфиг. Там я меняю имя сервера на tower.multik.org и ниже я показал, как указываю 16 гигов свопа, 512 мегабайт для /boot и все остальное отдать в LVM. В LVM прошу создать раздел / размером в 16 гигов. Остальное оставить нетронутым. Почему так мало? Так потому что все остальное – в виртуалки! В корне сервера делать лишнему абсолютно нечего, тут будут только штуки, связанные с внешним миром типа фаирволла.

Screenshot 2016-01-16 11.42.58

Сохраняю (F2 или ESC-2), выхожу (ESC-0 или F10) и жду перезаливки сервера

Screenshot 2016-01-16 11.10.30

Потом reboot, снова захожу (про ключи и их смену не говорю) и вуаля! Я в новом сервере.

Screenshot 2016-01-16 11.23.09

Опять меняю пароль root.

Итак, на этом этапе я получил пустой и голый сервер. Что он умеет? Да ничего. Добрые немцы выкусили из образа вообще все (вот тут реально молодцы!) и на сервере есть только ssh и настроенная ipv4/ipv6 сеть.

Первым (опять первым, но тут все такое) делом обновляемся. yum update

Добавляем полезные программки yum install mc screen bind-utils iotop iftop

Включаем синхронизацию времени systemctl start ntpd && systemctl enable ntpd

и переходим к фаирволлу. yum install firewalld ; systemctl enable firewalld ; systemctl start firewalld (Почему firewalld? Потому что мне лень править правила для ipv4 и ipv6 одновременно. Ну и редхатом проталкивается)

Внешне ничего не изменилось, но теперь снаружи на машину можно зайти только по 22му порту. Проверить можно посмотрев правила iptables. Но я-то двигаюсь вперед, поэтому все должно быть по фен-шую.

systemctl status firewalld

Screenshot 2016-01-16 12.13.29

и побалуемся с командой firewall-cmd

Screenshot 2016-01-16 12.15.57

Если я правильно понял, то никаких активных правил нет, просто стоит public по умолчанию, в которой разрешен только dhcp-клиент и ssh. Все остальное запрещено. Вполне логичные правила, но опять же, мне не сильно подходят. Будем менять.

Для начала попробую

firewall-cmd --zone=public --change-interface=eth0 --permanent
firewall-cmd --get-active-zones

И вижу фигу. Ничего не изменилось. Оказывается, это фича. Скрипт видит, что зона public и так применена (ну и что, что по умолчанию, поэтому ничего не делает).

Меняю зону на home и обратно. Вот теперь показывает

Screenshot 2016-01-16 12.27.56

Но лично мне не нужно, что бы было правило для dhcp клиента

firewall-cmd --zone=public --remove-service=dhcpv6-client --permanent
firewall-cmd --list-all

Ну вот теперь хорошо. Ничего лишнего, все закрыто и замуровано. Остался последний шаг – применить все, что я тут натворил, в реальность

firewall-cmd --reload

Все, теперь и iptables показывает именно то, что полагается.

Как говорится, первый шаг сделан. Следующим – виртуализироваться. Но виртуализироваться хардкорно, поэтому ставим SELINUX=permissive для начала и перезагружаемся, проверяя правильность всего преднастроенного.

У меня выползла одна единственная проблема – предустановленный немцами chrony мешался ntpd. Удаляем его (yum remove chrony) и все.

PS В запоминалку: настроить монитор raid.

Кто дурак?

Любой из нас играл в дурака. Дома, в студенчестве, на картошке или в каптерке. Простой дурак, переводной, без масти и прочее, прочее, прочее.

Screenshot_2016-01-10-11-59-59

В любом магазине приложений подобных игр много. Но играть в них обычно невозможно: то карты неудобно кидать, то компьютерные игроки тупят напропалую.

https://youtu.be/7c70EOho0yU

Эта версия игры наиболее проработанная. В ней и карты “правильные” и игроки не тупят, выбор большой да и если раззадоришься, можно и в онлайне сразиться с себе подобными.

Игра просит денежку малую, но это того стоит.

В общем, берем скорее: iOS Android

Свинья – лучший друг человека!

Все играли или пробовали играть в Angry Birds. Злобные птицы мешают милым зеленым поросятам спокойно жить в своих домиках. При этом нет ничего, что говорило бы про желание свиней питаться яйцами (кроме нагло смонтированных роликов). А ведь на самом деле свиньи умны, веселы и изобретательны!

Screenshot_2016-01-08-13-16-43

Берем детали, конструируем машинку, сажаем туда свинью и пытаемся набрать как можно больше звезд. Просто, симпатично и затягивающе.

https://youtu.be/pH9FJM5yXCw

Если в птичках думать не надо (бери да швыряйся), то тут халява не проходит: надо “кумекать”, особенно на последних уровнях. Число собранных звездочек варьируется от времени работы двигателя, места посадки свиньи или варианта конструкции. Более того, собранное обожает разваливаться, рассыпаться, взрываться и улетать в самых разных направлениях.

Берем для iOS, Android и OS X

Надави побольше!

Больше таких игр не делают. Слишком не толерантно, слишком кроваво, слишком весело.

Screenshot_2016-01-07-11-26-30

Кармагеддон или “Кровь, кишки и машины”. Берем машину и давим всех, кто подвернется. Чем больше надавили, тем больше очков заработали. Выиграл тот, кто либо проехал быстрее, либо передавил всех пешеходов, либо поломал всех соперников.

https://youtu.be/dvd_0pJLfd8

Игра была запрещена во многих странах, но ФИДО и потом интернетики не дали завять такой штуке. Как ни странно, но игра официально 16+.

Взять для iOS, Android или Steam

PS Главное, не садитесь сразу после игры за руль!

Шарики черные, зеленые и белые …

… и все лезут не тогда, когда надо и не туда, куда надо. А потом из-за них всё ломается!

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

IMG_0012

Как и положено хорошей игре, всё происходит без доната и с постепенно увеличивающейся сложностью. Не поддающиеся уровни можно пропустить или просто перейти на другую карту, если шариков собрано достаточное количество.

Играть просто: черные шарики создают постоянные связи, а зеленые – временные, которые можно разрушить в любой момент. Красные шарики при выносе надуваются и тянут вверх, а белые умеют образовывать цепочки. Надо создать такую икебану, что бы достать одним из шариков до выхода, но не зацепить ничего лишнего. Уровень считается пройденным если шариков засосало достаточно. Просто, понятно и на последних уровнях неимоверно сложно.

Игра есть под все платформы, поэтому найти ее не составит труда. Поверьте, 250 рублей за такое не дорого.

World of Goo для iOS и Android и даже Steam

А потом мультик покажут!

Карманный размер, два батарейки, часы с будильником и игра в комплекте. Первая игровая консоль у многих детей моего времени. “Ну, погоди”, “Веселый Повар”, “Тайны Океана” … если эти названия для вас не просто набор слов, то у меня хорошие новости. Наконец-то появились нормальные ремейки этих игрушек.

nupogodi

Нормальные – это значит яйца падают так, как тогда и управление не заставляет мучаться. Да что я тут рассказываю, проще посмотреть …

В те годы ходила байка, что стоит набрать 1000 очков, как игра покажет мультик про волка и зайца. Я набирал. Мультика не было, игра просто начиналась сначала … Обидно было до жути.

iOS и Google

Да, версия для iOS платная, но она того стоит, ибо наиболее полная реализация игры из встречавшихся мне. Там даже волк “подмаргивает” во время звука, прямо как в оригинале. Сразу видно – люди играли.

PS. Есть куча версий для андроида, но эта вроде наиболее играбельная на мой вкус.

Хорошо быть рыцарем …

Пехотинцы простые и тяжелые, кавалерия, лучники и замки. Рыцари, гриффоны и драконы, а так же прочая нечисть в полном ассортименте. Встречайте предка практически всех стратегий. Никакой 3D графики, никаких вау-эффектов, одна чистая и незамутненная ничем стратегия. Пошаговая.

IMG_0009

Вторая версия этой игры появилась на PC в 1989 году и практически мгновенно завоевала популярность. По крайней мере я потратил на нее в 90-91 году ну очень много времени, сидя за древним 286м и делая вид, что занимаюсь работой.

Вам дают карту, один город и одного рыцаря. Ваша задача: завоевать как можно больше городов. Выигрышем считается тот момент, когда у противника не будет больше городов или рыцарей.

Каждый город приносит некий доход в виде золота и воинов с частотой “раз в Нцать ходов”. Воины могут охранять город (тогда им добавляется еденичка к “силе”) или атаковать противника. Если с воинами в группе рыцарь – то еще одна еденичка к силе. Чем чаще воин побеждает, тем опытней и сильнее он становится. Просто и понятно.

Спасибо авторам, они перенесли весь игровой мир на современную платформу без потерь. Играя, я практически не нашел отличий от оригинала и поэтому игра обоснованно поселилась в моем списке. Игра есть в обоих вариантах: платном и бесплатном, но я считаю правильным потратить 280 рублей ради удовольствия.

К сведению: средняя партия “один-на-один” длится примерно пару часов, партия “один против всех” – промерно пару дней, так что будьте осторожны. Есть возможность небольшого доната, но все играбельно и без него.

К сожалению, игра есть только для iOS. Берите в iTunes Store

Дави зомбей!

Иногда напрягать мозги совершенно нет никого желания. А поиграть охота. Во что-нибудь в меру простое и не требующее напряжения извилин: в метро или электричке или просто под настроение. Пару-тройку раундов по несколько минут и хорошо. Одной такой игрой для меня стал Earn to Die 2

unnamed

Сюжет игры простой: вам надо добраться из точки А в точку Б. В вашем арсенале есть машина, управляемая педалью газа и двумя кнопками балансировки (потом добавится ускоритель). Попыткам добраться в нужную точку мешают зомби и беспорядочно сваленные препятствия. Давим зомбей, разрушаем препятствия и доезжаем.

Просто? На первый взгляд да, на второй тоже … да третий сильно не поменяет точку зрения. Одно из главных отличий этой игры от подобных – возможность каждый раз ехать по-другому: где-то можно газануть и проскочить поверху, а где-то наоборот, притормозить и проехать ниже. В некоторых картах своевременное включение ускорителя способно помочь преодолеть на одном дыхании половину уровня. За каждую попытку “доезда” вам дают немного денег, которые можно потратить на обновление или усиление машины.

IMG_0003

Обновления довольно условные, но тем не менее разделены на четкие категории: двигатель, трансмиссия, колеса, оружие, ускоритель, баланс, защита и бензобак. Чем больше денег вливаете в соответствующую категорию, тем лучше машина себя ведет. Скажем, если больше денег в колеса, то машина будет легче преодолевать препятствия, а если в “баланс” – то можно будет проехать всю трассу, просто зажав педаль газа. А проехав – получить новую машину, еще круче и новую трассу.

Несмотря на всю кажущуюся простоту, в игрушку можно залипнуть надолго, благо авторы организовали все так, что игру можно пройти без каких-либо вливаний денег от слова совсем. Но для наиболее нетерпеливых есть возможность добавить денег и практически сразу перескочить на пару-тройку уровней вперед. Если надумали потратиться, то я рекомендую воспользоваться “money doubler”, который удваивает число получаемых денег. Стоит недорого и не “сгорает”.

Приятной игры!

Защищаемся от …

Вообще-то это целый жанр игр, который пошел от одной – Tower Defense. Суть игры простая – вам надо защитить от прохода/проезда/проплыва/прополза и пролета какую-либо точку. Защита организуется не менее просто – вам необходимо расставить на пути движения злодеев пушки/орудия/бластеры. Враги тоже не отличаются изысками – они тупые и прут по маршруту, не обращая внимания на то, что их уничтожают всеми доступными и недоступными способами.

Придумать тут что-либо новое сложно, поэтому враги попадают под следующие категории

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

Ну и у летающих есть те же самые классы. Иногда добавляют врагов, которые могут уничтожать пушки или лишать их каких-либо особенностей.

Казалось бы, что может быть интересного в подобного рода играх? Расставил – уничтожил. И тут на сцену выходит его величество баланс. Большинство “новых” игр этого жанра построены по классической схеме: даём легко выиграть первые уровни, а затем начинаем задирать сложность до такой степени, что игроку просто невозможно пройти уровень честно, не покупая различные дополнения и улучшения. Плюс большинство авторов придерживаются канонического устройства игры: на карте есть дороги/реки, свернуть с которых невозможно. А ведь куда приятней “закрутить” врагов на карте, заставив пройти мимо одной и той же пушки несколько раз.

В результате всех игр у меня на планшете обосновалась игра Tower Madness HD, а на телефоне – Robo Defense. Tower Madness есть и на андроиде, но там он почему-то не очень играбельный на мой вкус. Но точно такой же, как и на иос

10389983_10153033126008930_8674888893737785096_n

В Tower Madness ваша задача защищать 10 овечек от злобных инопланетян, которые желают их утащить к себе на корабль. Перед игрой вам дают выбрать пушки, которыми вы будете обороняться. Баран в оружие не входит, но способен один раз уничтожить всех посягнувших на отару.

Robo Defense устроен проще – есть N входов и N же выходов. Всякие штуки пытаются пройти из входа в направлении выхода. В начале карьеры до проигрыша можно пропустить 10 врагов, но потом накопленные очки можно потратить на увеличение этого числа. Графика тут не такая красочная, как в tower madness, но не обращайте внимания – играбельность тут на уровне. Я посадил аккумулятор не на одном смартфоне и не один раз, играя “по 5 минуточек”.

Из отдельных плюсов Tower Madness – сохранение резервных копий достижений в iCloud. И даже сменив телефон или планшет, ваши достижения и открытые карты не исчезнут. Robo Defense так не умеет.

Хорошей игры!

PS Где найти? В магазинах приложений по имени.

ZFS, солярка и все-все-все …

Вообще-то этот пост я задумывал давно. И пытался писать давно – вон, в черновиках штуки три лежит. Но все получалось не то и не туда. Попробую в четвертый раз. Пусть будет нечто вроде сказки про жизнь.

Итак, некоторое время назад ко мне в руки попала инфраструктура, которая за 5 лет сменила пятерых же админов. Самым больным местом были стораджи, с них и начал разборки. Ситуация осложнялась тем, что сисадмины менялись то ли вместе с начальством, то ли у начальства были постоянно меняющиеся вектора “куда мы движемся” – мне выяснять лень.

Первым делом была проведена ревизия, чего же попало ко мне в руки.

– Стораджи на NetApp. Здесь был маленьких плюс: есть человек, которых ими управлял и какого-то внимания с моей стороны не требовал.
– Стораджи на ESX. То есть берем сервер с RAID контроллером, ставим туда ESX и вместе с хостингом виртуалок раздаем еще и диски.
– Стораджи на Nexenta. Некоторые с просроченными лицензиями.
– Стораджи на OmniTI. Некоторые с веб-мордами, некоторые “голые”.

И вот последних двух пунктов было много! Стал разбираться. Что нексента, что OmniTI построены на древнем ядре от solaris. Если кто-то из продаванов нексенты будет втирать, что они там что-то делали, модернизировали и так далее, не верьте – я из любопытства менял и ядра и библиотеки – никаких криков “ой, у меня тут сломалось” не было.

Все отличие нексенты от omniti/openindiana – это веб-мордочка с красивыми графиками, криво обкусанный шелл и всякие параметры по умолчанию.

Родной файловой системой для этих штук является ZFS. Поначалу по чтению документации у меня разгорались глаза: умеет сама делать raid, поддерживает сжатие и дедупликацию на ходу, снапшоты и прочее прилагаются.

Освободил один хост, обновил софт, обновил фирмварь … И все, солярка перестала загружаться – не может проинициализировать дисковый контроллер. Как говорится, оппа. Контроллеру 5 лет, солярка типа с последними обновлениями и не может. Побежал по инету – везде стоны про какое гавно ставит деллы в свои сервера. Поставил для проверки линукс – встал без каких-либо проблем.

Тут у меня поднялся флажочек: если солярка то не трогай фирмварь. 5 лет ей никто не занимался и больше заниматься не будет …

Ладно, благодаря новой политике у меня есть место, куда слить данные и освободить еще пару серверов для “на попробовать”.

Итак, два полностью одинаковых Dell R510. Вообще одинаковых – партнамберы из одной сотни. На одном – поставленная с нуля солярка, на другом – центось седьмая.

На солярке поднял zfs согласно лучшим шаманским методикам (там из духа “если число дисков четное и больше 9 – то лучше raidz3, иначе raidz2 и смотри не перепутай”), на линуксе – тупо software raid той же конфигурации, что и у солярки. И XFS поверх

И начал тупо заливать и сливать данные. NFS3, без каких-либо затей.

Солярка показала чистую, красивую и прибитую гвоздями “полку” на 3,5 гигабита. Линукс честно упирался в скорость сети и рисовал 10ку. Очень удивился. Ведь корпоративная система, типа ого-го и эге-гей!

Полез тюнить. А тюнить-то в общем и нечего. После линукса с его /sys и /proc солярка кажется очень бедным родственником. Методом последовательного теста выяснил, что у сети полка на 5 гигабит. И все – дальше проц умирает по загрузке. Древний драйвер, новее никто не делал.

В более низкой полке виноваты диски, вернее какие-то ядерные потроха этой ZFS. Потому что когда я поставил уже на третий сервер linux, прикрутил к нему zfs с теми же настройками, то он стал выдавать ту же 10ку.

Вывод: в стораджах солярке и ее производным делать нечего. Старый софт, никакой поддержки и теде и тепе. Если кто покажет на сайт соляриса, где типа недавно они выкатили новую версию, спешу огорчить, там то же самое ядро из 2010 года … я пробовал 🙂

Но может быть есть шанс ZFS завести под линуксом? Фигня вопрос: как раз приехал новый сервер. Ставим линукс, ставим ZFS, размечаем диски, запускаем туда клиентов … Поначалу все шло шикарно. Но внезапно клиенты стали жаловаться на то, что их машинки “умирают”. Пошел смотреть.

На сторадже занято примерно 65% диска, до обещанных ораклом 85% еще далеко. Решил посмотреть на производительность и немедленно поджег стул – 5 мегабайт в секунду. Представляете, 24 SAS диска и такая скорость? Сколько нервов я потерял, “раскидывая” этот сторадж и представить тяжело. Причем скорость выросла до приличных значений уже на практически пустом сторадже.

Попытался разобраться и не смог – по всем статьям, хаутушкам и прочим заклинаниям у нас должно быть более чем хорошо – и кешу место выделено и прочему раздано согласно документации. Ан нет – заливаешь на 40Тб сторадж 25ТБ и он “умирает”. И лежит “мертвым” до 5-10Тб занятого. Где-то какой-то глюк в драйверах zfs.

Стало понятно, что и ZFS на сторадже не жить. Перебилдил на софтверный raid, поставил xfs и все – все проблемы ушли.

Однако есть у меня место, где я недавно поставил пару новых хостов на солярке и аккуратно обновил старые. Это специальные хранилки, которые хранят снапшоты клиентских файловых систем. Вот там ZFS развернулась на всю катушку – и сжатие и дедупликация нужны как воздух. Опять же, я провел пару недель, гоняя данные между этими хостами (дедупликация работает гораздо лучше, когда одном сервере “давятся” одни и те же клиентские данные). В результате есть несколько … наблюдений

1. “Свежая” солярка, ZFS 28 и raidz3 – наше все. Оно даже на глаз быстрее работает того, что было 5 лет назад. Но линукс все равно быстрее.
2. Сжатие практически ничего не стоит для процессора, а давит в 1,5-2 раза. Можно включать.
3. Хочешь дедупликацию? Добавь памяти из расчета 1ТБ данных на диске – 5-6ГБ ОЗУ. Иначе будет тормозить.
4. Никогда (слышишь: никогда!) не забивай ZFS на 97-98%. Оно умирает даже на чтение до скоростей 100-200 килобайт в секунду. В принципе, мне именно поэтому не удалось забить на 100% – тесты умирали раньше. И вообще, для ZFS – 85% занятого – уже тревожный звонок.
5. Солярка в изучении чуть сложнее линукса, в основном из-за очень кривой и слабой документации. Изучать целенаправленно смысла нет, разве что в удовольствие.

Boulder Dash 30th Anniversary

… темные подвальные или полуподвальные помещения, уставленные цветными телевизорами, перед которыми торчат латанные-перелатанные черные пластмассовые джойстики с красными кнопками. И толпы хаотично клубящихся детей, наблюдающих за счастливчиками добывших правдами и неправдами денег и теперь тратящих их за право поиграть. В мое время стоимость игры составляла 15 копеек за минуту, так что очередь продвигалась довольно быстро.

Если владелец зала был в хорошем настроении, то его можно было попросить сменить игру – почему-то в моё время это считалось особым шиком. А если время близилось к вечеру, то можно было попросить поставить игру и посложнее, ибо к тому времени вся малышня уже расставалась с добытыми у родителей деньгами и больше не претендовала на место в очереди к джойстику.

Одной из этих игр “посложнее” был Boulder Dash.

Screenshot 2015-12-06 14.54.44

Суть игры простая: управляя прогрызающим ходы муравьем (сусликом? кротом?) необходимо было за определенное время собрать все алмазы и добраться до выхода. Главное – не дать камням попасть по башке и не столкнуться с жуками. Плевое дело!

Быстренько скачал эмулятор ZX Spectrum и нашел “тапочек” с игрой.

Да, она самая! Правда, на Atari за счет более продвинутого видеоконтроллера скроллинг был плавнее, но уровни те же самые, как и проблемы при их прохождении. И как “тогда”, я заклинился на третьем уровне. Банально не хватало алмазов для открытия дверей. Помучавшись некоторое время, я нашел подсказку и застрял теперь уже на четвертом уровне .. или пятом? Не важно: я застрял. Раз за разом я пытался пройти уровень, не желая сдаваться: ведь сохранений нет, да и денег за прохождение никто не просит.

Наконец у ноутбука покраснел индикатор заряда, однозначно намекая на желание переместиться поближе к розетке и я перестал терзать бедный эмулятор. Но желание играть никуда не пропало, поэтому я пошел искать эмуляторы для планшетов. Правда, вовремя решил просто посмотреть – вдруг кто-нибудь уже скопировал игру?

Ну … не сказать, что скопировали, но переписали под современные рамки – это точно.

Псевдо-3D, обучалки, миссии, “открывашки за деньги” – все это присутствует в полной мере. Даже за старые уровни требуют доплатить 100 с лишним рублей. Буржуи и капиталисты!

Зато музыка ну очень похожа на ту самую, и уровни из Classic Pack вообще один-в-один. Доказательство на видео выше. И даже застреваешь на тех же местах и совершаешь те же самые ошибки, что и тогда.

Из замеченных минусов:
– К управлению приходится привыкать, особенно таким старперам как мне (ребенок освоился сразу). Но привыкнув, играешь спокойно.
– Мне кажется, что в оригинале размер экрана был “больше”. Больше элементов помещалось на экране и не надо было так судорожно мотаться по карте.

И только наигравшись до одури замечаешь, что эту игру выпустили в честь 30-ти летия. Но я взрослый и состоявшийся мужчина и могу позволить себе поиграть в такие игры (и не обращать внимания на возраст). Осталось теперь джойстик найти …

Стоит ли играть: да. Даже если и не играли в оригинал
Где взять: в магазинах приложений. Есть и платная и бесплатная версия.

Обновление: Оказывается, есть версия для браузеров, переделанная из версии для ZX Spectrum

Дело было вечером …

… и делать было нечего. Организм в достаточной мере отдохнул и к смене вида деятельности с “полежать на диване” на “поиграть во что-нибудь” отнесся довольно благосклонно.

Достал планшет, обновил все и решил посмотреть, что сейчас предлагает мобильная индустрия для развлечений таких, как я. Сначала попробовал на андроиде, затем на ios. Скачал пару игрушек, купил другую … И не сказать что меня это удивило, но создалось впечатление что современные игроделы рассчитывают, что играть в игры будут полные дебилы, для которых красивая картинка важнее сюжета. Не имеешь быстрых пальцев? Не беда – заплати или посмотри рекламу. А лучше и то и другое.

Например вот скриншот, снятый мной сегодня в магазине Apple Store.

Apple Store donat

Из 16 игр только две стоят каких-то денег и всего лишь одна не предлагает покупки в игре. Ну хорошо, я готов согласиться с такой монетизацией, тем более что на андроидах играть бесплатно вообще практически невозможно – там на каждый чих выпрыгивает реклама и войти во вкус очень тяжело.

Но где хоть какое-либо напряжение мозгов? Все игры кроме двух требуют от игроков только быстрой реакции и точных пальцев. Не, одноклеточным этого может и хватит, но мне – нет. Если посмотреть на оставшиеся игры то обнаружим, что они имеют корни “из тех времен”. Что SimCity, что Lara Croft в свое время были практически на любом компьютере.

Пробежался по интернету и не нашел ничего, что бы могло ответить на вопрос “во что можно поиграть взрослому мужику”. Да, тому самому, что вырос на Tetris, Formula One, Prehistorik, RiverRaid, Saboteur и Boulder Dash. Где были Atari 2600, ZX Spectrum и капелька Денди. И именно поэтому я органически не перевариваю бегалки типа Temple Run, где максимально развивается только связь “глаз-палец” …

Как известно, спасение утопающих – дело самих утопающих, поэтому я и решил открыть новый сайт, на котором буду делиться своими впечатлениями об играх, в которые не стыдно играть. Будет он развиваться или я его заброшу – узнаем лишь через некоторое время.

На чем играть? В принципе мне все равно – лишь бы игра была захватывающей. Да и беглый просмотр показывает, что большинство игр существуют сразу и под Android и iOS. И очень-очень редко случается так, что разработчик по сути только “столбит” место на одной из платформ, выпуская слабое подобие игры на другой. В общем, если не указано иное, то я буду играть на планшете с iOS, а с телефона на Android.

Места всегда мало! Или ищем место онлайн.

Мы сейчас находимся в период очень интересных ценовых войн за пользователя. Все сервисы пошли в интернет, вместо покупки предлагается подписка и прочее, прочее, прочее. И то, что сначала казалось прорывом, сейчас не вызывает никаких эмоций.

Вот и мне потребовалось найти немного места в онлайне. С одной стороны, искать мне место в онлайне … Ну странно как-то. Есть и свой сервер в германии, где как минимум терабайт простаивает и где можно развернуть тот же owncloud, а с другой стороны, на нем и так уже крутится куча всего полезного, которое неплохо было бы положить еще куда-нибудь.

Итак, что мне надо?

Мне надо некий сервис, в который я положу следующее

Примерно 200Гб всяких штучек, которые мне потерять нет желания.
Примерно 300Гб других штучек, которые мне дороги как память
Ну и примерно 20Гб фотографий.

Ну и как обычно, аппетиты приходят во время еды, поэтому сразу замахнусь на терабайт места.

Что мне надо?

Мне нужна поддержка всех трех платформ – linux, os x, windows. Пусть через нное место, но что бы все работало. Никаких браузеров, “у нас в разработке” и так далее.

Мне нужны “прокачанные” технологии. Сидеть как dropbox на плечах amazon’а конечно хорошо, но охота более прямого контакта. Зачем? Да просто так.

И мне не нужна “халява”. Если халява – значит никаких гарантий и никакой возможности хотя бы покачать права.

Для начала пойдем по отечественным сервисам.

Яндекс.Диск. 200 рублей за 1Тб в месяц. Есть прямой доступ до диска через dav_fs, что для меня является большим плюсом. Минус – как любая компания, живущая от рекламы, Яндекс собирает о пользователе все, до чего сможет дотянуться.

Облако mail.ru. Цен на сайте не нашел, другие сайты говорят про 499 рублей в месяц. Но я имею крайне печальный опыт работы с mail.ru, поэтому данная компания даже не рассматривается и здесь приведена из-за того, что она есть.

В общем-то на этом отечественные провайдеры кончаются, не успев начаться. Пойдем по импортным

Dropbox. Самый первый, самый широко поддерживаемый сервис. За 1Тб желают 10 долларов в месяц или 700 рублей.

iCloud. За терабайт хотят 19 долларов в месяц. Или 1400 рублей в месяц.

Microsoft OneDrive. 199 рублей в месяц. И добавляют еще лицензию на Office 365 (Word, Excel и прочие штуки).

Кажется, тут выбор очевиден. Тем более, я недавно попробовал Windows 10 … и знаете, она мне понравилась.

Update: капиталисты не смогли не подгадить и в итоге не 200 рублей в месяц, а целых 286. Я близок к разорению 🙂

Продолжаю искать музыку …

После обновления играющего мне в уши оборудования довольно-таки резко встала проблема “а что слушать?”. То, что раньше было собрано тяжким трудом, слушать стало невозможно. Когда знаешь, как оно должно звучать, мозг автоматом переключается с “слушать музыку” на “слушать, как воспроизводится”. Когда не знаешь, то и 320 kbps прокатывает на ура, хоть и вызывают подозрения.

Что делает воспитанный в пост-советских реалиях человек? Правильно, лезет на торрент, обнаруживает там залежи flac’ов и начинает качать. Я в процессе замены библиотеки докачал до буквы D и забил 2 терабайта.

А потом я начал слушать то, что накачал … Скажу сразу: стер практически 90% накачанного. Ибо к понятию “качественная запись” это не относилось ни с какой стороны. Итак, как понять, что запись стоит оставить в коллекции.

Первое, на что абсолютно не стоит обращаться внимание, так это на логи рипперов, анализаторов и прочей фигни. Все они рассчитаны на то, что бы обращающийся с ними хотя-бы понимал, что и зачем он делает. Любой граббер покажет “no errors” на свежезаписанный диск. Ему пофиг, что записанное – сильнозажатый mp3. Да и руками при желании эти текстовые файлики понабирать можно. А уж подделать картинку спектрограммы и делать нечего. Так же не стоит обращать внимание на цифры и “источник звука”: нам же музыку слушать надо, тем более и их легко можно накрутить/подделать. Плюс очень часто запись в 16/44 звучит гораздо лучше какой-нибудь 24/192 исключительно из-за качества оригинала и прямизны рук звукорежисера. Особенно это часто слышно на треках из iTunes Store, которые Apple специально пересводила.

Второе, что необходимо сделать сразу же: взять и послушать “наскоком”, просто перематывая в разные места. Через некоторое время “вау-эффект” пройдет и вы сможете практически “с лету” определять примерный источник записи. По динамическому диапазону, звучанию басов и высоких и так далее и тому подобное. Да, я наступаю на все мозоли аудиофилам и цифродрочерам, но стадию “винил или сидюк” я прошел где-то за неделю. Сейчас у меня стадия “сидюк – dvd|студия”, но сильно лажаюсь на концертах.

Какие основные симптомы для “надо выкидывать”?

1. Нет панорамы. Если слушать в наушниках, то все инструменты собраны в этакую кучу прямо перед носом. Нет ничего звучащего “левее” или “правее” – только четко впереди, слева или справа. Басы бьют внутри черепа. Все это признаки того, что “оригинал” был взят из mp3. Joint-stereo и так далее.

2. Все звуки “глухие”. Слушается так, как будто вы слушаете концерт по телевизору. Опять же, последствия mp3 или винила. Но (!) на всякий случай обратите внимание на дату записи. Очень может быть, что записи лучшего качества попросту нет. Или так изначально было записано. Ну тяжело ждать от записи 50-60х годов того, что можно услышать в современных.

3. Дефекты/артефакты. Скрипы, “песок”, “щелчки”, “звон” и так далее. Нет, они встречаются и в студийных записях, но гораздо реже, чем в сделанных самостоятельно. Да и любой студийный “артефакт” обязательно обсосан на форумах, найдено подтверждение того, что “да, лучшего качества нет” и так далее и тому подобное. Короче, это не bug, а feature.

4. Чрезмерное использование обработчиков звука. “Клиппинг”, “компрессии” и так далее и тому подобное. Опять же, через некоторое время слышится ну просто сразу. Ну и при сомнениях можно поглядеть на график громкости: если видите “прямую” – это оно. Да в некоторых случаях хватит просто посмотреть на индикатор уровня в течении 10-15 секунд. Вот просто для примера:

bad_music

good_music

Обратите внимание на поведение стрелок. Там, где все хорошо, стрелку колбасит практически по всей шкале. Там, где плохо, стрелка колеблется не сильно и “прилипает к нулю”. Особенно подобными “украшательствами” страдают студии в США, поэтому если есть возможность, послушайте тоже самое, но предназначенное для другого рынка – иногда бывает ну очень большая разница.

И наконец, самым последним шагом надо просто сесть/лечь и послушать. В спокойной обстановке, когда ничего не отвлекает и можно реально послушать музыку. И, особенно для хорошо знакомых дорожек, огребать увольствие лопатами, тележками и тазиками …

Резюмируя: если музыка нравится – оставляйте. Не нравится – удаляйте без жалости. Поверьте, в мире дофига хорошей музки, которую вы еще не слышали …

OS X 10.11 El Capitan & USB

Не надо никаких шаманств: теперь делатель флешек есть прямо в инсталляторе

sudo /Applications/Install OS X 10.11 Developer Beta.app/Contents/Resources/createinstallmedia --volume /Volumes/Untitled --applicationpath /Applications/Install OS X 10.11 Developer Beta.app --nointeraction

PS Это для девелоперской версии. Думаю, что для обычной надо будет убрать упоминания Developer Beta

Продолжение аудиофильства …

Торрент-клиент уже который раз докладывает, что места на диске больше нет, а я отмахиваюсь, ибо слушать не на чем. Нет, SGS+CX300II (см прошлый пост) отрабатывают свое на все 100%, но мне их не хватает.

Во-первых, я уже нашел мелодии (спасибо hdtracks.com), где я ясно слышу, что эта “аудиосистема” не тянет. Вот совсем чуть-чуть, но не тянет.
Во-вторых, SGS все-таки довольно старый. Большие и толстые треки проигрывать ему откровенно тяжело. Паузы и тормоза. Хорошо, что заиканий нет.

Вывод: надо идти менять “аудиосистему”. А на что менять? Возвращаясь с работы, зашел в магазин sony. Поспросил послушать какие-то супер-новые наушники (фиг его знает, что за марка, но в названии extra bass или как-то так). Услышал фигню какую-то вместо музыки. Пошел к соседям-маководам. Там послушал beats – еще хуже сонек. Немного поучаствовав в теологической дискуссии на тему “что вы можете услышать на 128кбит/c”, потребовал наушники от B&W (или от B&O – фиг их разберет). Они вроде заиграли более-менее прилично, но их цена мгновенно придавила мою жабу.

Промежуточный вывод: надо идти к аудиофилам. Там обычно горы всякой техники и дают послушать. Ну ок, быстрый чёс по интернетам привел к doctorhead.ru. Ну и что, что на другом конце Москвы? Главное – они в выходные работают.

Пока шел, сформулировал требования:
– Наушники должны быть закрытыми и накладными. Ибо метро, офис и дом автоматически ставят крест на открытых. Ну а “затычки” у меня уже есть.
– Наушники должны нормально сидеть на голове и нигде не давить, даже чуть-чуть, даже капельку. Наушники – не ботинки, разнашиваться не умеют.
– Наушники должны понравиться звуком. Пофиг на цену.

Наушники это хорошо, но должно быть что-то, что в них играет. На аудиофильском языке мне нужен DAC и Headphone AMP. Опять же, требования простые:
– Должен уметь играть звук, что бы мне понравилось.
– Должен уметь играть звук с ноутбука и андроида.
– Должен быть портативным, дабы с собой таскать.

В общем, зашел в магазин. Постоял, послушал депешей, зашел в фокус колонок, оценил звук. Подошедшему продавцу объяснил на пальцах требования и он притащил мне горку наушников. Сел я и не глядя на марки и ценники стал втыкать наушники в SGS. Какие-то наушники заиграли сразу, некоторым не хватало мощи SGS, а некоторые …. ну в общем фигней оказались. Постепенно получился этакий шорт-лист наушников, звучание которых не вызывало во мне возражений.

Теперь надо их раскачать, что бы точно быть уверенным, что они играют и старый SGS не портит мне малину. В общем, стал пробовать всякие коробочки. Одни не умеют в DAC, другие не умеют с андроидом, третьи гавном оказались … Всем моим хотелкам одновременно удовлетворил только iBasso D-Zero MK2. И название звучное и с подтекстом для русского языка.

Ну и теперь последний круг: из шорт-листа наушников “выслушиваю” те, которые играют лучше всего. Darren Hayes, Anne Dudley и треки с hdtracks. Потом я поймал себя на том, что пытаюсь придраться к слушаемому и не могу. Нет, я не стал тут же срывать наушники с головы и кричать “вот эти!”. Не, я переключился на B-Tribe, East-17, Depeche Mode и Keiko Matsui. И опять мне все понравилось.

И вот только после этого я снял наушники с головы. Представьте мое удивление, когда я увидел, что марка наушников – Sony. Sony MDR-1A. Осторожно интересуюсь ценой, ибо некоторые наушники продавец таскал из “пацанско-аудиофильской” части магазина и откуда эти – хз. Цена оказалась … довольно приличной, но реальной. А ибасса? Тоже не золотой! Хрен с ними, с деньгами – заверните! 🙂

Потом пошел посмотреть на цены тех наушников, которые отверг. В общем, я пока столько не готов тратить. Хотя когда увидел ценники, сразу возникло желание попонтоваться 🙂

Результат: сижу, слушаю накачанное и балдею. Половину уже удалил – слышу, что upscale из mp3.

Аудиофилическое … или история моей болезни.

tidal

Вообще-то я считаю термин “аудиофил” оскорбительным. Это те самые люди, которые тащатся от слов “бескислородная медь” и покупают патч-корды за 500 баксов. В общем и целом вполне себе мирное заболевание, угрозы не несет никому, кроме кошелька его владельца, поэтому нормальные люди о нем практически ничего не знают.

Кто такие аудиофилы? Это люди, которые повернуты на качестве музыки, но при этом совершенно не разбирающиеся в том, на чем эту музыку играют. Именно для них sony выпустила специальную SD карту “для меломанов”, именно они спорят про разное звучание звука при смене кабелей на цифровых интерфейсах и так далее и тому подобное. Но при этом в “слепом тесте” они не могут отличить настоящий кабель от сделанного из вешалки.

Как отличить аудиофильскую тусовку или журнал от нормальных людей, жаждущих хорошего звука? Открываете любой обзор или тему и просматриваете наискосок. Если не увидели каких либо цифр и графиков, кроме стандартных “диапазон воспроизводимых частот” и “АЧХ”, а только слова про “кристальность звука” и “глубину звуковой панорамы” – это аудиофилы. Если пошли непонятные графики с пиками и терминами типа THD, SNR, SQ – то очень похоже, что это нормальные.

Можно подойти и с другой стороны. Аудиофилы не могут и не умеют оперировать объективными факторами, которые может подтвердить или опровергнуть измерительный прибор. Вся их основа сродне религии и опирается на “а я слышу!”.

В общем, вляпаетесь как я, разберетесь. А я вляпался довольно неожиданно для себя.

Давным давно, еще в начале этого тысячелетия, при “граблении” очередного диска я решил выяснить уровень, при котором я перестаю слышать разницу. Для этого я взял хорошо известный трек и начал “давить” его в разных форматах. Послушал его на компьютере, с колонками и наушниками. Перегнал на CD, оделся поприличней (что бы не посчитали за лоха) и сходил в один из пафосных салонов по продаже аудиоаппаратуры (в таких обязательно дают послушать покупаемое, даже со своих носителей). В результате походов я вывел четкое правило – “mp3, два прохода, VBR, средний битрейт 256” и все это время я подгонял коллекцию под это условие. Потом появился iTunes Store. Послушал их AAC, признал нормальным и дальше уже пополнял библиотеку им, тем более что я считаю iTunes лучшим каталогизатором музыки. Но не суть. Главное в том, что стандарты выработаны, библиотека собрана и в последнее время практически перестала пополняться – 60 тысяч треков мне в принципе хватило.

Одним субботним вечером я колупал USB стек у микроконтроллера и мне потребовалось что-то, что можно воткнуть в USB порт и оно при этом не было бы ни флешкой, ни мышкой с клавиатурой. После довольно долгих поисков я наткнулся на древнючую usb аудиокарту от SoundBlaster. Воткнул, у меня не заработало и я решил проверить, живая ли она воообще и переткнул в ноутбук. Воткнул наушники, переключил выход плеера на карту и пару минут не мог понять, что не так. Внезапно меня озарило: звук какой-то не такой.

Стал слушать. Достал смартфон, закачал ту же песню, стал сравнивать. Звук разный! Ничего не понял. Подпробовал одно, другое … Не может же древняя звуковуха, да дешевые наушники ТАК влиять? Пошел на трекер, выкачал образ диска без потери качества и начал “передавливать” в разные битрейты.

Обнаружил, что я слышу разницу между 256 и 320. Но только на внешней звуковой. Но слышу. Опять не поверил. Пошел проверять.

Проверка простая: скачиваем foobar2000 и к нему расширение для слепого тестирование. Называется ABX Comparator. Два трека, слушаем, отмечаем, который думаем что лучше и потом смотрим. В общем, разберетесь, там просто.

Проверка показала: я 100% различаю 256 и 320 на знакомых мне мелодиях. Офигел мрачно. Включил FLAC. Различаю!

Ну, думаю “все, теперь пересобирать всю библиотеку во FLAC”. Расстроившись, полез смотреть, чем ее играют. Пока смотрел, наткнулся на тему про проигрывание многоканального звука. SACD, DTS, DVDA – эти буковки обычно про это. На пробу скачал какой-то альбом и попытался запустить на проигрывание. Почему попытался? Потому что в ответ услышал в колонках шум. Тут меня зацепило: у меня в колонках шум, а народ там хвалит вовсю. Разобрался, доставил декодеры. Заиграло … Ну вроде получше FLAC, а вроде и нет. Решил послушать на “большом” компьютере, к которому через встроенную звуковуху подключен девятилетний (в смысле старый, дешевый и из ДСП) комплект акустики 5.1.

И вот тут я обалдел. Это вообще совершенно иной звук. И это действительно надо слушать, ибо словами передать очень тяжело, потому что постоянно скатываюсь на междометия и правильных терминов не знаю. В результате я решил оставить вообще все задачи до завтра, расставил колонки и сел слушать с закрытыми глазами. И тут меня накрыло: я стал различать, где какой инструмент стоит и как соседи усаживаются поудобней (я скачал “живую” запись с какого-то концерта классической музыки). Обалдевший от прослушивания, решил прильнуть к “истокам”: альбом Майкла Джексона HiStory. 95й год, мой первый лицензионный диск, заслушанный до дыр на всех классах железок. Скачал пересведенную под DTS запись, включил и … попросту перестал удивляться. На досконально знакомой дорожке я услышал множество деталек, которые раньше не было слышно. Понимаете, их просто не было. Вообще.

Метнулся к компьютеру, начал на выборку выкачивать то один, то другой трек (благо интернет у меня быстрый) и в каждом обнаруживал что-то новое … Внутри меня стала расти волна предвкушения: представляете, 60 тысяч треков и все с чем-то новым? Ну или почти все, ибо я сомневаюсь что качество записей Высоцкого или Цоя будет отличаться.

Понапихал в трекер и стал разбираться, чем это играть. Если с большим компьютером проблем нет – там либо foobar2000, либо DeadBeeF и тему можно закрыть надолго, то с смартфоном и ноутбуком проблемы. Проблемы две: чем играть и чем слушать? С ноутбуком пока решил повременить: я смартфон слушаю чаще и дольше.

Почему я нашел проблему “чем играть”? Ведь в маркете этих плееров хоть ешь одним местом – выбирай любой. У этой проблемы аж два конца. Первый: разнообразие форматов и контейнеров. Где каждая песня отдельным файлом, где весь альбом в одной куче, а где вообще непонятно что. И это должно играться. Если с фубаром проблем нет, то с мобильными плеерами жопа. Декларируют много, а в реальности все зависят от возможностей одной и той же библиотеки.

Второй конец это сам андроид. До 5й версии андроиду было пофиг, какой звук и какого качества в него пихают – он его тупо перекодировал в 16бит на 44 килогерцах (В 5м обещают эту планку поднять) и только потом передавал наружу. Поэтому народ начал придумывать разные варианты. Скажу сразу, нормальных только два. Остальные – это улучшайзеры, которые умеют только играться эквалайзером и эффектами.

Первый способ – использование внешней звуковой карточки. Или по ихнему, аудиофильскому, DAC. В этом способе плеер берет файл, декодирует его в звуковой поток и отдает DAC напрямую, минуя всякие андроидные заморочки. А DAC уже преобразовывает его в звук, ибо только для этого он и создан. Из известных мне на сегодняшних дней способов рабочий только один – подключить DAC через кабель usb-otg и найти плеер, который умеет с такими штуками работать.

Второй способ – хаканье андроида с получением прямого доступа к железу. В моменте изучения данного вопроса для меня вскрылся очень интересный факт: в топовые модели обычно вставляют и топовые чипы, в том числе и аудио. То, что их никто и ничего использовать не может – никого не волнует: маркетолухи отчитались, хомячки впечатлились и напокупали. В данном способе есть пара очередных проблем: производители вовсе не горят желанием давать доступ до внутренностей телефона и у некоторых моделей попросту нет отдельного звукового чипа.

После “всплывания” из глубин интернета появилась и еще одна проблема: качество разных реализаций декодеров тоже было разным. Одна проблема тащит за собой другую …

Походы по форумам выявили двух претендентов на звание “музыкальный плеер”: USB Audio Player PRO и Neutron. Оба стоят в районе 300 рублей, оба собрали кучу положительных отзывов на профильных форумах.

Ставлю первый. Играет. Достаю usb-otg кабель и подключаю через него SoundBlaster. Играет. С заморочками типа “сначала подключите карточку, а только потом запускайте плеер”, но играет. Ок.

Ставлю второй. Играет. Как использовать внешнюю карточку не понял, но играет. Потыкал всякие аудиофильские галочки типа “наплевать на процессор, считай все в 64х битах”. Заиграл еще лучше. Основной минус – совершенно уе…щный интерфейс. Автор (кстати наш, русскоговорящий) откровенно забил на дружелюбность к пользователям. Все, что не относится к звуку – начхать. Поэтому забудьте про плейлисты и прочие прибамбасы типа выбора откуда играть будем. Они официально есть, но не работают. Но играет хорошо, собака серая.

neutron

Казалось бы, на этом можно успокоиться. Но охота еще лучше: я стал слышать моменты, когда явно в оригинале было поярче, поизящней (о, аудифильское прорвалось). Значит, надо хакать андроид.

Опять на форумы. Мой нынешний Lenovo P70 хакать смысла особого нет: весь звук на одном чипе с процессором. Что там – фиг его знает. Через кучу времени выбора моего будущего смартфона наткнулся на немного ностальгический пост про то, какой же клевым был Samsung Galaxy S и каким гавном оказался шестой. Звуковой чип Wolfson 8994, топовый для 2010 года … Оппа! А у меня валяется мой старый SGS. И даже в рамках ТО я недавно заряжал ему аккумулятор – вполне живой.

Сначала заливаю туда тестовые треки. Слушаю. Ну в принципе неплохо, но P70 играет лучше. И довольно сильно лучше так – сказываются 5 лет разницы. Заливаю туда последний цианоген, попутно снося все накопленное непосильным трудом, включаю все галочки …

DSP

Нахожу более-менее приличное и вижу зажегшуюся иконку. Жамкаю на play … едреныть! Как он оказывается умеет играть! Одни писки, визги и междометия от меня.

В результате я получил дешевый аудиофильский плеер. Да, он тормозит, да он не выглядит гламурно и стоит копейки. Но зато 24 бита, 96kHz и 100dB SNR вместе с усилителем D/AB.

И тут я остановился. Любой шаг в сторону улучшения звука теперь для меня будет стоить денег. Нет, куда двигаться понятно и так: сначала хорошие наушники на замену моим CX-300II, а затем внешний DAC. Но вот насколько широким должен быть шаг ….

Программируем микроконтроллеры в QtCreator

Это копия моей статьи, опубликованной на хабре

qbs03
Почему-то в интернете мало документации про qbs, пора немного исправить эту ситуацию.

Как-то у меня сложилось так, что практически исчезли проекты, в которых надо сделать что-то одно. Обычно надо и написать прошивку для микроконтроллера и управляющую программу для смартфона или десктопа. Можно делать все по старинке: писать код для каждого устройства в родной для него среде разработки.

Но поверьте, это довольно быстро задалбывает. Под виндовс – MSVC, под ARM – CooCox или Keil (приношу свои соболезнования вынужденным работать под IAR), под MSP – CCS, под андроид – eclipse, под ios – Xcode, под пики – MPLAB. И ладно бы, со всем этим работать можно было бы, но ведь фиг: везде свои заморочки, тонкости и неписанные правила. Все это накладывается на общую тормознутость так популярного эклипса помноженную на криворукие дополнения от производителей.

Некоторое время назад я начал сводить все свои разработки под мобильные и десктопные приложения под одну платформу. После довольно долгого чеса по интернетикам мой выбор остановился на Qt. Есть все, что надо, при необходимости можно подцепить нативный код. В общем, задача закрылась.

Но вот с микроконтроллерами ситуация не желала складываться категорически. В основном из-за того, что везде свои хотелки и желалки. Ну ладно, про это я уже жаловался. Я бы еще долго мучался, пока внезапно не наткнулся на краткое описание qbs.

Желающие могут пошариться по инету сами, но если кратко, то это заменитель всяких make и cmake, использующая нормальный (тут должен быть смаил) язык программирования. И сам QtCreator собирается с ее помощью, значит она уже вылезла из штанишек …

Да, документации по ней как обычно кот наплакал, но исходники еще никто не отменял, поэтому довольно быстро ко мне пришло понимание, что это практически то, что я искал. Посудите сами: сидишь в одной среде разработки (самой по себе очень приятной и быстрой) и спокойно пишешь и редактируешь файлы под несколько платформ. И тебе, как кодописателю, пофиг на наличие всяких там заморочек с “родными” средами.

Хватит излияний, пора попробовать. Создадим очень простой проект, в котором у нас будет десктопная и микроконтроллерная составляющая.

Открываем QtCreator, выбираем создать Non-Qt Project (что бы пока не заморачиваться сильно) и далее выбираем то, где присутствует C и Qbs. Обратите внимание на приятные взгляду слова Platform independent

qbs01

В результате получаем один main.c и qbs. Можно уже нажать “build” и получить вывод Hello World.

Открываем qbs и ничего не понимаем. Поэтому все стираем, вооружаемся интернетом и начинаем писать. Яваскрипт и все такое.

import qbs

Так, тут вроде понятно. Импортируем всякое необходимое для работы самого qbs.

Project {
name: "simple"
}

Сохраняем и наблюдаем исчезновение main.c с левой панели. При попытке запустить проект QtCreator спросит: а чего пускать-то? В принципе пока все логично.

Из чего состоит проект в терминологии qbs? Из продуктов. И их может быть несколько, но пока я сделаю один.

Project {
name: "simple"
Product {
name: "desktop"
}
}

Теперь для нашего “десктопного” укажем исходник.

Project {
name: "simple"
Product {
name: "desktop"
files: "main.c"
}
}

При попытке скомпилировать не изменится ровным счетом ничего. Подсмотрим в некоторые обучалки и добавим зависимость от cpp и укажем, что вообще-то это приложение.

Project {
name: "simple"
Product {
name: "desktop"
files: "main.c"
Depends {name: "cpp"}
type: "application"
}
}

И вот теперь при попытке собрать приложение QtCreator пошуршит немного диском и в панельке Application Output появится искомое

qbs02

Ага, значит мы на верном пути. Осталось разобраться, что делают те самые две магические строки.

Depends {name: "cpp"}

Читаю документацию и понимаю, что данной командой я устанавливаю зависимость проекта от какого-то модуля с именем cpp. Понятней стало? Мне нет.

Простым поиском нахожу что-то подобное в /usr/share/qtcreator/qbs/share/qbs/modules/ (Если у вас другая операционка, то скорее всего аналогичное лежит где-то неподалеку от QtCreator). Если говорить коротко, то там куча яваскрипта, которая в зависимости от платформы подбирает компилятор под эту платформу. Полностью повторять подобное мне смысла нет, поэтому оставляю как есть.

type: "application". Из документации: The file tags matching the product’s target artifacts. Артефакт … An Artifact represents a single file produced by a Rule or Transformer. … ерр .. Rule? Creates transformers for input tags. Напоминает ситуацию про сепулькарий .. Transformer? Creates files, typically from other files.

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

Но вернемся к нашему проекту. Давайте добавим еще один продукт, только уже для микроконтроллера

Project {
name: "simple"
Product {
name: "desktop"
files: "main.c"
Depends {name: "cpp"}
type: "application"
}
Product {
name: "micro"
files: "blink.c"
}
}

При попытке что-то сделать, нам сразу выскочит сообщение, что вообще-то файла blink.c нет. Ну, ок, добавим в проект фаил blink.c. Как видно из названия, это тот же HelloWorld, только для микроконтроллеров. Я взял из примеров для микроконтроллера семейства msp430.

#include <msp430.h>

int main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR |= 0x01;

while (1) {
P1OUT ^= 0x01;
__delay_cycles(1000000); // 1 second @ 1MHz
}

return 0;
}

Будучи скомпилированным и залитым, он начнет дергать ножкой P1.0 с интервалом в одну секунду. А так как на этой ножке у большинства демо- и девелоперских плат висит светодиодик, то он замигает.

Теперь QtCreator не ругается, но и в микроконтроллер ничего не заливается. Странно, да?

Добавлять Depends {name: “cpp”} смысла нет, потому что установленный в системе родной gcc не в курсе про существование такой платформы, да и в дальнейшем пригодится, например для пиковских контроллеров, где вообще все свое.

Теперь воспользуемся обрывками тех сакральных буковок, что встретились раньше.

Для начала, я предпочитаю в микроконтроллерных проектах расписывать каждый функционал в своем файле. Записывать каждый файл руками? Лень. Подсматриваем решение и переписываем блок

Product {
name: "micro"
Group {
name: "msp430 sources"
files: 'src/*.c'
fileTags: ['c']
}
}

Тут создаем группу файлов, которые обзываем “msp430 sources” и тупо включаем в нее все файлы, которые подходят под маску src/*.c. Для дальнейшей работы с ними тегируем их буквой С.

Что с ними делать? У qbs есть на этот случай две штуки – Rule и Transformer. По сути они близки, но немного разные. Счас попробую описать на пальцах разницу.

Rule умеет срабатывать на каждый файл, попадающий под что-то. Может срабатывать по разу на каждый фаил (например, для вызова компилятора), а может один раз на все (линкер).

Transformer предназначен для срабатывания только на один фаил, с заранее определенным именем. Например, прошивальщик или какой-нибудь хитрый скрипт.

Ок, добавляем правило, которое должно будет сработать на все наши файлы, промаркированные как “с”.

Product {
name: "micro"
Group {
name: "msp430 sources"
files: 'src/*.c'
fileTags: ['c']
}
Rule {
inputs: ["c"]
prepare: {
var cmd = new JavaScriptCommand();
cmd.description = "file passing"
cmd.silent = false;
cmd.highlight = "compiler";
cmd.sourceCode = function() {
print("Nothing to do");
};
return cmd;
}
}
}

В принципе из синтаксиса уже все понятно. Есть inputs, есть prepare, в который засовывается яваскрипт, который выполняет необходимое. В данном случае он должен в окошке Compile Output показать file passing, и куда-то вывести Nothing to do. Ну по документации вроде так.

Запускаем перекомпиляцию всего и смотрим. Не знаю, как у вас, но я ничего не вижу. Почему? Потому что qbs больно умный, а документация к нему страдает лакунами.

Правило не срабатывает, потому что qbs считает, что оно не производит никаких действий в системе и от него ничего не зависит. В принципе это соответвует реальности, но провести проверку мешает.

Ок, за это отвечают те самые артефакты. Под ними подразумеваются результаты деятельности Rule или Transformer. Лучше всего это объяснить на примере компиляции. Когда мы компилируем .с файл, то на выходе мы получим объектный файл .о. Он нам нужен для дальнейшей линковки, но с другой стороны, мы его можем удалить, так как потом спокойно сможем сгенерировать заново.

Опять копируем пример из документации и чуть-чуть модернизируем.

Rule {
inputs: ["c"]
Artifact {
fileTags: ['obj']
filePath: '.obj/' + qbs.getHash(input.baseDir) + '/' + input.fileName + '.o'
}
prepare: {
var cmd = new JavaScriptCommand();
cmd.description = "Compiling "+ input.fileName
cmd.silent = false;
cmd.highlight = "compiler";
cmd.sourceCode = function() {
print("Nothing to do");
};
return cmd;
}
}

Теперь мы говорим, что после нашей деятельности останутся артефакты в каталоге .obj (ну и я добавил вывод того, над каким файлом мы сейчас работаем). Запускаем. Опять ничего в ответ. Почему? Ответ тот же – никому не нужны файлы с тегом ‘obj’.

Хорошо, для проверки сделаем так, что они нужны нам. И вообще, наше приложение – это один сплошной obj.

Product {
name: "micro"
type: "obj"
Group {
name: "msp430 sources"
files: 'src/*.c'
fileTags: ['c']
}
Rule {
inputs: ["c"]
Artifact {
fileTags: ['obj']
filePath: '.obj/' + qbs.getHash(input.baseDir) + '/' + input.fileName + '.o'
}
prepare: {
var cmd = new JavaScriptCommand();
cmd.description = "Compiling "+ input.fileName
cmd.silent = false;
cmd.highlight = "compiler";
cmd.sourceCode = function() {
print("Nothing to do");
};
return cmd;
}
}
}

Пробуем, и удача! В окошке появился заветный “Compiling blink.c”. Теперь давайте добавим, что бы оно реально компилировало и сразу по-быдлокодерски, то есть тупо забив все необходимое в одну кучу.

prepare: {
var args = [];
args.push("-mmcu=cc430f5137")
args.push("-g")
args.push("-Os")
args.push("-Wall")
args.push("-Wunused")
args.push('-c');
args.push(input.filePath);
args.push('-o');
args.push(output.filePath);
var compilerPath = "/usr/bin/msp430-elf-gcc"
var cmd = new Command(compilerPath, args);
cmd.description = 'compiling ' + input.fileName;
cmd.highlight = 'compiler';
return cmd;
}

Перекомпилируем все с нуля и смотрим в каталог .obj

$ ls -R1
.:
f27fede2220bcd32

./f27fede2220bcd32:
blink.c.o

Ура! Файлик появился. Теперь, для проверки я делаю еще один файлик, с хитрым названием hz.с. Если я прав, то после перекомпиляции рядом появится еще один объектный файл.

В выводе появилось

compiling blink.c
compiling hz.c

а в каталоге

./f27fede2220bcd32:
blink.c.o
hz.c.o

Все вроде ок. Теперь необходимо все это дело слинковать. А значит опять правило, только теперь для линковки.

Rule {
multiplex: true
inputs: ['obj']
Artifact {
fileTags: ['elf']
filePath: project.name + '.elf'
}
prepare: {
var args = [];
args.push("-mmcu=cc430f5137")

for (i in inputs["obj"])
args.push(inputs["obj"][i].filePath);

args.push('-o');
args.push(output.filePath);
var compilerPath = "/usr/bin/msp430-elf-gcc"
var cmd = new Command(compilerPath, args);
cmd.description = 'linking ' + project.name;
cmd.highlight = 'linker';
return cmd;
}
}

Где отличия? Во-первых, добавился флаг multiplex, который говорит о том, что это правило обрабатывает сразу все файлы данного типа скопом. А во-вторых, во входных параметрах исчез input. Появился inputs, который является массивом файлов данного типа. Ну и я вопользовался именем продукта, что бы брать имя для финальной прошивки.

Ставим тип приложения elf и пробуем собрать. Через некотрое время мы в каталоге для сборки обнаружим файл simple.elf

$ file simple.elf
simple.elf: ELF 32-bit LSB executable, TI msp430, version 1, statically linked, not stripped

То, что нам и необходимо. Его можно уже заливать в плату и наслаждаться мигающим светодиодиком.

Исходная цель достигнута: мы в одной среде разработки делаем все: и редактирование и компиляцию.

На всякий случай конечный qbs

import qbs
Project {
name: "simple"
Product {
name: "desktop"
files: "main.c"
Depends {name: "cpp"}
type: "application"
}
Product {
name: "micro"
type: "elf"
Group {
name: "msp430 sources"
files: 'src/*.c'
fileTags: ['c']
}
Rule {
inputs: ["c"]
Artifact {
fileTags: ['obj']
filePath: '.obj/' + qbs.getHash(input.baseDir) + '/' + input.fileName + '.o'
}
prepare: {
var args = [];
args.push("-mmcu=cc430f5137")
args.push("-g")
args.push("-Os")
args.push("-Wall")
args.push("-Wunused")
args.push('-c');
args.push(input.filePath);
args.push('-o');
args.push(output.filePath);
var compilerPath = "/usr/bin/msp430-elf-gcc"
var cmd = new Command(compilerPath, args);
cmd.description = 'compiling ' + input.fileName;
cmd.highlight = 'compiler';
return cmd;
}
}
Rule {
multiplex: true
inputs: ['obj']
Artifact {
fileTags: ['elf']
filePath: project.name + '.elf'
}
prepare: {
var args = [];
args.push("-mmcu=cc430f5137")

for (i in inputs["obj"])
args.push(inputs["obj"][i].filePath);

args.push('-o');
args.push(output.filePath);
var compilerPath = "/usr/bin/msp430-elf-gcc"
var cmd = new Command(compilerPath, args);
cmd.description = 'linking ' + project.name;
cmd.highlight = 'linker';
return cmd;
}
}
}
}

PS Вынос “захардкоденных” переменных в более удобное место оставлю на вашей совести, ибо это уже к обучалке по яваскрипту.

Lenovo P70

В принципе, после пары месяцев владения уже можно описать свои впечатления от агрегата. Всякие “что внутри” легко можно найти в сети, поэтому повторяться не буду, только личные впечатления.

Итак, для начала о плохом. Внутри android 4.4.4. У самого андроида только одна проблема – кривой часовой пояс. Поэтому время звонков и смсок сдвинуто на час вперед. К сожалению, нормально лечится только рутованием аппарата, поэтому забил.

К самой оболочке есть только одна претензия – на всякие выпенждрежные штуки типа включения-выключения по расписанию разработчики забили. То есть оно может сработать, а может и не сработать. Но так как это именно выпендрежная штука, то никаких проблем она не доставляет.

В остальном вроде проблем нет. Все ставится, все работает … Кстати, работает очень долго. Как и предидущая модель, позволяет заряжаться не тогда, когда надо, а тогда, когда есть время. А если зарядиться забыл, то до вечера он дотянет без каких-либо проблем.

Screenshot_2015-04-01-17-18-18

Этот график я снял в первые дни владения телефоном. Никаких заморочек типа “замораживания” или выключения беспроводных сетей не делалось. Владельцы модных самсунгов и айфонов нервно завидуют.