понедельник, 12 мая 2014 г.

Кинезиотейпирование Мишки

В результате перелома акромиального конца ключицы Мишка был обездвижен на 3 недели.
Результат - всё срослось как надо, но ослабли мышцы плеча плюс отёк после ушиба за эти три недели не прошёл и при нагрузке возникла резкая боль и стало невозможно двигать рукой. На МРТ ничего криминального, правда было немного жидкости.
Первые три дня рука разрабатывалась по 3-5 раз в день по 15-45 минут от мелких движений и разогрева до растяжек до места болевых ощущений (останавливались чуть ранее точки боли) после прогрева.
Через три дня боль осталась только в верхней части бицепса и только при сильном отведении назад либо при попытке бросить шайбу клюшкой (см. точки боли на фото).


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

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

2. Приклеиваем нижний конец без натяжения

3. Кладём руку на плечо и с натяжением в 50% приклеиваем к лопатке как показано на фото (последние 3-4 см без натяжения)

4. Отводим руку назад, разворачиваем ладонью наружу, а большим пальцем вверх и так же с 50% натяжением клеим переднюю ленту Y тейпа (последние 3-4 см. так же без натяжения)

5. Повторяем со второй Y лентой, только чуть выше:




FYI: Возможно лучше было положить не 2 Y тейпа, а 2 обычные полосы - одна спереди, а другая сзади - эффект будет скорее всего даже лучше, но это после пришло в голову.

6. Третью ленту разрываем посередине

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


8. Края приклеиваем без натяжения

9. Позднее Мишка сказал, что за день чуть лучше держало и я решил, что Y-ки надо было наклеивать пониже в его случае, ну и налепил третий для подстраховки (в принципе - лишний)


Ну, с тремя Y лентами это перебор - надо делать вместо этого две ленты вокруг плеча.

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

Отдельное спасибо Лаврентию Неустроеву (врач восстановительной медицины СК "Петровский") за помощь в выборе метода тейпирования.

В качестве инструкции взято видео (см. ниже): 


Но Y я бы заменил на 2 ленты (см. видео №2):

Мишка смог с тейпом без боли не только отводить руку назад (хотя видно, что делал это аккуратно поначалу), но и бросить, правда не сильно и осторожно:


P.P.S.> Да - и никакой излишней нагрузки. Только движения, которые не доставляют болевых ощущений.



P.P.P.S.> Вот вариант без Y тейпов:




четверг, 7 июня 2012 г.

Организация движения на перекрёстке Невского и Восстания

Когда стоишь в пробке, то в голову лезут всякие мысли по делу и нет. Иногда начинаешь задумываться о причине пробки. Если стоит весь город, то тут сложно идентифицировать суть проблемы, но когда всё вокруг едет, а один перекрёсток стоит, то дело упрощается. По результатам очередного стояния на подъезде к дому родился вот такой вот документ:


Аналогичная бумажка была отправлена в ГИБДД.
Как ни странно через месяц-другой я получил ответ, что аргументы признаны разумными и переданы для дальнейшего рассмотрения куда-то там дальше по инстанциям. Я прочитал и забыл, но тут - вдруг - получаю вот такую бумажку:


Мне уже стало интересно - чем же всё это закончится :)?...

суббота, 28 апреля 2012 г.

Иногда возникает непонятное желание получить дату в Юлианском стиле.
Если у кого-то вдруг это желание возникает при написании XSLT преобразования, то ему - я думаю - облегчит жизнь следующий скрипт (julian-1600.xsl):


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template name="julian">
    <!--Construct Julian value for the Date-->
    <xsl:param name="date"/>
    <xsl:param name="add" select="0"/>
    <xsl:param name="year"/>
    <xsl:param name="month"/>
    <xsl:param name="day"/>
    <xsl:param name="jul_year"/>
    <xsl:param name="jul_month"/>
    <xsl:param name="jul_day"/>
    <xsl:choose>
      <xsl:when test="number($add) != $add">
        <xsl:call-template name="julian">
          <xsl:with-param name="date" select="$date"/>
          <xsl:with-param name="add" select="0"/>
          <xsl:with-param name="year" select="$year"/>
          <xsl:with-param name="month" select="$month"/>
          <xsl:with-param name="day" select="$day"/>
          <xsl:with-param name="jul_year" select="$jul_year"/>
          <xsl:with-param name="jul_month" select="$jul_month"/>
          <xsl:with-param name="jul_day" select="$jul_day"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:when test="string-length($date) &gt;= 10">
        <xsl:call-template name="julian">
          <xsl:with-param name="year" select="substring-before($date,'-')"/>
          <xsl:with-param name="month" select="substring-before(substring-after($date,'-'),'-')"/>
          <xsl:with-param name="day">
            <xsl:choose>
              <xsl:when test="contains($date,'T')">
                <xsl:value-of select="substring-before(substring-after(substring-after($date,'-'),'-'),'T')"/>
              </xsl:when>
              <xsl:otherwise>substring-after(substring-after($date,'-'),'-'))</xsl:otherwise>
            </xsl:choose>
          </xsl:with-param>
          <xsl:with-param name="jul_year" select="1600"/>
          <xsl:with-param name="jul_month" select="1"/>
          <xsl:with-param name="jul_day" select="1"/>
          <xsl:with-param name="add" select="2305448 + $add"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:when test="number($jul_year) + 400 &lt;= number($year)">
        <xsl:call-template name="julian">
          <xsl:with-param name="year" select="$year"/>
          <xsl:with-param name="month" select="$month"/>
          <xsl:with-param name="day" select="$day"/>
          <xsl:with-param name="jul_year" select="$jul_year+400"/>
          <xsl:with-param name="jul_month" select="$jul_month"/>
          <xsl:with-param name="jul_day" select="$jul_day"/>
          <xsl:with-param name="add" select="$add + 365*400 + 97"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:when test="number($jul_year) + 4 &lt;= number($year)">
        <xsl:call-template name="julian">
          <xsl:with-param name="year" select="$year"/>
          <xsl:with-param name="month" select="$month"/>
          <xsl:with-param name="day" select="$day"/>
          <xsl:with-param name="jul_year" select="$jul_year+4"/>
          <xsl:with-param name="jul_month" select="$jul_month"/>
          <xsl:with-param name="jul_day" select="$jul_day"/>
          <xsl:with-param name="add" select="$add + 365*4 + 1"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:variable name="bis_sextus">
          <xsl:value-of select="1 * (number($jul_year) mod 400 = 0 or (number($jul_year) mod 4 = 0 and number($jul_year) mod 100 != 0))"/>
        </xsl:variable>
        <xsl:variable name="month_days">
          <xsl:value-of select="31 - (number($jul_month)=4 or number($jul_month)=6 or number($jul_month)=9 or number($jul_month)=11) * 1 - (number($jul_month)=2)*(3-number($bis_sextus))"/>
        </xsl:variable>
        <xsl:choose>
          <xsl:when test="number($jul_year) &lt; number($year)">
            <xsl:call-template name="julian">
              <xsl:with-param name="year" select="$year"/>
              <xsl:with-param name="month" select="$month"/>
              <xsl:with-param name="day" select="$day"/>
              <xsl:with-param name="jul_year" select="$jul_year+1"/>
              <xsl:with-param name="jul_month" select="$jul_month"/>
              <xsl:with-param name="jul_day" select="$jul_day"/>
              <xsl:with-param name="add" select="$add + 365 + $bis_sextus"/>
            </xsl:call-template>
          </xsl:when>
          <xsl:when test="number($jul_month) &lt; number($month)">
            <xsl:call-template name="julian">
              <xsl:with-param name="year" select="$year"/>
              <xsl:with-param name="month" select="$month"/>
              <xsl:with-param name="day" select="$day"/>
              <xsl:with-param name="jul_year" select="$jul_year"/>
              <xsl:with-param name="jul_month" select="$jul_month + 1"/>
              <xsl:with-param name="jul_day" select="$jul_day"/>
              <xsl:with-param name="add" select="$add + $month_days"/>
            </xsl:call-template>
          </xsl:when>
          <xsl:when test="number($jul_day) &lt; number($day)">
            <xsl:call-template name="julian">
              <xsl:with-param name="year" select="$year"/>
              <xsl:with-param name="month" select="$month"/>
              <xsl:with-param name="day" select="$day"/>
              <xsl:with-param name="jul_year" select="$jul_year"/>
              <xsl:with-param name="jul_month" select="$jul_month"/>
              <xsl:with-param name="jul_day" select="$day"/>
              <xsl:with-param name="add" select="$add + $day - $jul_day"/>
            </xsl:call-template>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="$add"/>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

Ну и ниже привожу пример трансляции xml файла с датой в её "Юлианское" представление.
root.xml:
<?xml version="1.0" encoding="UTF-8"?>
<root>2011-12-02T00:00:00</root>
root.xsl:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:include href="julian-1600.xsl"/>
    <xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="root">Julian (<xsl:value-of select="."/>): <xsl:call-template name="julian">
            <xsl:with-param name="date">
                <xsl:value-of select="."/>
            </xsl:with-param>
        </xsl:call-template>
    </xsl:template>
</xsl:stylesheet>

msxsl root.xml root.xsl:
Julian (2011-12-02T00:00:00): 2455898

P.S.> Единственное ограничение - дата не ранее 01.01.1600.

вторник, 13 декабря 2011 г.

Установка DD-WRT на Linksys E3000 (прошивка 17990 mega)

Собственно, по началу ничего не предвещает проблем, но -как оказалось - это поначалу...
На входе имеем Linksys E3000 с уже установленной прошивкой (прошивка была старая 14???, но можно было ставить и на родную Linksys-овскую).



К роутеру подключен WD Elements 2.5''. Разбит на 4 партиции: jffs (2Gb) (ext-3), swap (256Mb) (linux-solaris swap), mnt (293Gb) (ext-3), opt (2Gb) (ext-3). Тип разбивки не готов сказать - либо dos, либо - что скорее всего - linux-овый.
Прошивка взяда с ftp-ddwrt ресурса и устанавливалась в два этапа: сначала 17990_NEWD-2_K2.6_mini-e3000.bin, после чего делался rest (30/30/30) и далее - устанавливался dd-wrt.v24-17990_NEWD-2_K2.6_mega-nv60k.bin (тоже с reset после него).


Проблема номер раз: смонтировать JFFS
. Старая версия dd-wrt у меня монтировала первую партицию и всё было пучком. Новая - сначала монтирует первую как ext-3, а затем - по необъяснимым пока причинам - третью в ту же точку монтирования, но уже как ext-2 при том, что размечено всё под ext-3. Причём вторичное монтирование происходит уже после выполнения скриптов Startup и FireWall.
В комментах к прошивке DD-WRT 17967 было сказано, что имена партиций теперь поддерживаются в uppercase формате. Естественно - попробовал переименовать jffs в JFFS, плюс переформатировать её в ext2. Всё равно в некий момент времени происходило монтирование третьей партиции поверх первой. Я сделал ещё 2 предположения - что у меня не DOS разбивка, а Linux и что моя текущая разбивка отличается от новых "веяний", описанных на сайте dd-wrt, где JFFS стоит 3-ей.

Поскольку при подключении через роутер или VMWare Fusion скорость переноса данных ну ооочень маленькая, а ставить на iMac линукс или искать Ext-3 драйвера под Fuse мне не хотелось, то я принял решение забить на automount и сделать всё в manual режиме. Итак: первый шаг: отключаем automount на диск.
Далее - необходимо смонтировать данный диск. Для этого используем секцию Administration/Commands/Startup. Поскольку диск у нас не смонтирован, то взять файл скрипта неоткуда, а в данной секции можно лишь разместить набор шеловских команд. Поступаем следующим образом: командой echo создаём скрипт /tmp/mt, ставим ему атрибут исполнения и запускаем. Ну и далее - запускаем скрипт с нашего смонтированного диска: /jffs/etc/init.d/local.start, который уже выполняет все действия по настройке и запуску остальных процессов. Вот текст данного набора команд:
echo '#!/bin/sh'>/tmp/mt
echo insmod usb_storage>>/tmp/mt
echo insmod mbcache>>/tmp/mt
echo insmod jbd>>/tmp/mt
echo insmod ext2>>/tmp/mt
echo insmod ext3>>/tmp/mt
echo prt=\'sda1\'>>/tmp/mt
echo n=1>>/tmp/mt
echo 'while [ $n -lt 90 ] ; do'>>/tmp/mt
echo ' if [ -z "$p" ] ; then'>>/tmp/mt
echo ' p=`grep "$prt" /proc/partitions | awk '\''{print $4}'\'\`>>/tmp/mt
echo ' else'>>/tmp/mt
echo ' grep -q "/dev/discs/disc0/part1" /proc/mounts && break'>>/tmp/mt
echo ' mount -t ext2 -o noatime /dev/discs/disc0/part1 /jffs'>>/tmp/mt
echo ' fi'>>/tmp/mt
echo ' let n+=1'>>/tmp/mt
echo ' sleep 1'>>/tmp/mt
echo done>>/tmp/mt
chmod a+x /tmp/mt
/tmp/mt
/jffs/etc/init.d/local.start

Для наглядности ниже привожу текст получившегося скрипта /tmp/mt:
#!/bin/sh
insmod usb_storage # Загружаем модули
insmod mbcache
insmod jbd
insmod ext2
insmod ext3
prt='sda1' # Это наш диск в процессах
n=1 # Это счётчик итераций
while [ $n -lt 90 ] ; do # Пытаемся замаунтить полторы минуты
if [ -z "$p" ] ; then # Если диск не найден драйверами
p=`grep "$prt" /proc/partitions | awk '{print $4}'` # Проверяем нет ли уже
else # Если диск найден - монтируем, а если смонтирован - выходим из цикла
grep -q "/dev/discs/disc0/part1" /proc/mounts && break
mount -t ext2 -o noatime /dev/discs/disc0/part1 /jffs
fi
let n+=1
sleep 1 # Ждём секунду
done
Проблема номер два: не всё хорошо с ключами на SSH.
Собственно - при подключении по ssh после reboot роутера было озвучено клиентом, что сертификат хоста поменялся и клиент отказывается соединяться в связи с утерей доверия. Анализ показал, что  в nvram не содержатся rsa ключи. Собственно - в этом форуме подобная тема обсасывалась, но в моем случае workaround не прошёл - ключ rsa для хоста все-равно не создавался. Тогда я пошёл иным путём - я создал свои собственные ключи, разместил их на jffs и в скрипте local.start просто останавливаю ssh, копирую новые ключи и запускаю ssh с новыми параметрами (замечу - с ключиком длиной 4096 ssh сессия открывается около 6-8 секунд так что если нет терпения - делайте ключик покороче).

dropbear.sh:

#!/bin/sh
case "$1" in
start)
rm /tmp/root/.ssh/ssh_host_rsa_key # Удаляем старые ключи
rm /tmp/root/.ssh/ssh_host_dss_key
cp /jffs/root/.ssh/dropbear_dss_host_key /tmp/root/.ssh/dropbear_dss_host_key # Копируем новые ключи
cp /jffs/root/.ssh/dropbear_rsa_host_key /tmp/root/.ssh/dropbear_rsa_host_key
dropbear -b /tmp/loginprompt -r /tmp/root/.ssh/dropbear_rsa_host_key -d /tmp/root/.ssh/dropbear_dss_host_key -p 22  -a # Запускаем dropbear с новыми ключами
;;
stop)
killall dropbear # Прибиваем dropbear процессы
n=1
while [ $n -lt 30 ] ; do # Ожидаем пока есть dropbear процессы, но не более 30 секунд 
p=`ps | grep "dropbear" | grep "ssh_host_rsa_key" | grep -v "grep" | awk '{print $5}'`
if [ -z "$p" ] ; then
break;
fi
let
n+=1
sleep # Спим секунду
done
;;
esac
фрагмент local.start:
#!/bin/sh
/jffs/etc/init.d/dropbear.sh stop # Останавливаем демона ssh
mount -t ext3 -o noatime /dev/discs/disc0/part4 /opt # Монтируем /opt
/jffs/etc/init.d/dropbear.sh start # Запускаем демона ssh
...

Ну и на последок:
Если у вас запущен transmission на порту 53024, то в скрипт для firewall нужно добавить строчку:
iptables -I INPUT -p tcp --dport 53024 -j ACCEPT
Если вам надоело, что ваш ssh долбят DDoS-ом или подбором пароля с какого-то (в моем случае тайваньского) сайта :), можно добавить что-то вроде :
iptables -I INPUT 2 -p tcp -s 219.87.138.0/24 --dport 22 -j DROP
Удачи...