Мой дневник

27.08.2010

Всем превед !

Filed under: Разное — sae762 @ 11:49

Долго думал, как организовать свое веб-пространство… И вот, придумал. Буду валить все свои записи в один поток, в один блог, но помечать категориями. Так что если что нужно найти – юзайте поиск. Но и категории почитать тоже полезно, мы ведь не всегда сами знаем что хотим найти…

Advertisements

30.03.2018

Раздайте ваши файлы

Filed under: компьютеры — sae762 @ 23:31

Давно не писал )

Если у вас завалялись большие файлы, которые вы скачали торрентом, но не помните откуда, и вы хотите их раздавать, то можете

1. получить хеш файла (не sha-1): rhash –btih <filename>
2. найти магнет-ссылку по хешу: https://btdig.com%5B/<hash>%5D
3. добавить ссылку в торрент-клиент
4. Переместить (move) torrent туда где лежит ваш файл, начтнется процесс его верификации и затем он начнет раздаваться

А чтобы хорошо раздавать торренты, нужно поставить правильные трекеры. Для transmission remote сделал небольшой скрипт:

#torrent id (number)
tn=4

#remove first 5 trackers
for (( a = 1; a < 5; a++ )) do
transmission-remote <host> –auth user:pass -t $tn -tr $a
done

#add trackers (всегда свежий лист на https://raw.githubusercontent.com/ngosang/trackerslist/master/trackers_best_ip.txt)
for tr in \
udp://62.138.0.158:6969/announce \
udp://5.79.209.57:6969/announce \
udp://87.233.192.220:6969/announce \
udp://51.15.4.13:1337/announce \
udp://151.80.120.113:2710/announce
do
#echo $tr
transmission-remote <host> –auth user:pass -t $tn -td $tr
done

10.01.2018

SMS to Telegram and Google Doc

Наступил новый год, внезапно у нас разблокировали wordpress, а я тут как раз с новым проектом.

Screenshot_20180110-112508Сначала была симка.
Номер существовал давно, и была заведена на него куча всяких сервисов. Особенно подтверждения всяких финансовых операций.
Но тут появился новый провайдер, тарифный план и т.п., к тому же при поездках за границу не всегда удобно ловить смс-ки в роуминге. В общем, созрела мысль:
– оставлять нечто с сим-картой дома
– при поступлении смс перенаправлять их в интернет, в мессенджер.
Выбор мессенджера определялся его открытостью, тут telegram вне конкуренции. Однако, хотелось гибкости, поэтому решил ввести еще один “слой”. Есть такая система, IFTTT. Так что смс сначала идет в это облако, а уже там обрабатывается. Причем обработчиков можно создать несколько, например, отправлять в telegram и сохранять в google-документах.

ifttt

Кстати, тут уже можно остановиться: есть готовое приложение ifttt, оно наверное может ловить смс на оставшемся дома старом телефоне и отправлять его в сеть. Но на тот момент свободной сотки под рукой не оказалось, и я решил собрать свое устройство.

m590eНа алиэкспрессе приобрел модуль gsm, m590e. Хитрые китайцы продают “набор diy”, на деле же они где-то навыдирали б/у модулей и просто прикладывают к ним примитивную плату и пяток деталек. Выходит дешево, но паять smd-компоненты нужно хорошее увеличение. Тем не менее модуль запускается, в сети регистрируется. Будьте внимательны с питанием, при gsm-операциях потребление резко возрастает, я допаял еще конденсатор на 2000мкФ.

Первые опыты с модулем делал на компьютере, через usb-serial кабель. Только питания не хватает. Если решить вопрос, можно также написать скрипт и повесить сервисом на компьютере. Возможно, когда-нибудь я так и сделаю.

d1_mini_v2.3.0_1_16x9Но я пошел дальше. В качестве сервера взял модуль esp8266. Wifi в нем есть, serial как раз 3.3V, а поскольку взял модуль nodemcu, то получил micro-usb вход для питания и 5V вывод для подключения gsm-модуля.

Все бы хорошо, но serial порт в esp8266 всего один. По нему надо и программировать, и отлаживать, и работать с gsm… Весьма неудобно. В Arduino IDE есть библиотека SoftwareSerial, можно использовать ее, но при малейшей модификации кода нужно пересобирать и перезаливать всю прошивку. В общем, посмотрел я многие варианты, и остановился на Cesanta Mongoose OS с примитивной javascript-машиной.

Большим плюсом является возможность заливать только js-файлы, не пересобирая прошивку. Также имеется встроенный web и rpc – сервисы. А это значит, что программировать модуль можно не через usb/serial, а прямо по wifi сети!

mos

O Mongoose OS от Cesanta. Это не первый мой проект под этой системой. В целом мне нравится ее гибкость и функционал. Однако, хочу все же влить пару ложек дегтя в эту бочку меда. Вся система развивается, и части меняются полностью, так что через полгода приходится заново скачивать и изучать систему. Отсюда возникают проблемы с недостатком документации. И к большому сожалению, новая версия javascript-машины, mJS, настолько “оптимизирована”, что функционала явно не хватает. Например, не осталось функций работы со строками, типа indexOf или escape, что почти убивает возможности программирования на javascript. Форкнуть что ли проект пока не поздно… По крайней мере, прошивку и IDE точно надо сохранить.

IMG_20180110_103734Но вернемся к проекту. Подключил я модуль к RX,TX,Gnd и 5V, для запуска модема подключил пин модема Boot к выводу nodemcu D2… и нифига модем не запускается! Для начала оказалось, что D2 это вовсе не 2, а GPIO5 (а сначала на тестер грешил ))) читаем даташиты!). Затем, оказалось, что логического 3V мало, поэтому подтянул вывод boot на +5V через резистор 15K, а вывод D2 перевожу в режим INPUT, тогда и получаем достаточный для старта уровень.

Затем, оказалось, что передача данных в модем работает, а прием от модема – никак. Долго измерал уровни, подтягивал резистором… а оказалось, что нужно отключить обработчик rpc-комманд от порта. Прописал в conf0.conf uart: -1 и дело пошло на лад. Но времени потратил изрядно.

Затем, нужно дождаться от модема строки +PBREADY, и лишь после этого инициализировать его серией AT-команд для того чтобы он передавал по serial номер звонящего и текст смс. Однако в новой mJS нет нормальных функций задержки! delay просто затормаживает весь модуль. Выполнение javascript внутри обработчиков событий тоже имеет свои особенности. Словом, пришлось городить функцию, в которой внутренний счетчик определяет который раз она вызвана, и в зависимости от этого выполняет набор инструкций, а сама функция вызывается по таймеру. Ну и вообще пришлось поломать голову, так что “не ругайте программиста”… Код постараюсь выложить на github.

Для отладки и некоторых тестов в программу включил также примитивный telnet. Ведь консоль занята gsm-модемом. Вывод всей консольной информации туда все же не доходит, так что если в javascript ошибка, получаем “кирпичик”, который впрочем можно поднять через wifi rpc.

Добавил мониторинг модема. Теперь программа временами отправляет на модем “AT”, а обработчик ответа выставляет таймстамп последнего “ОК”. Если ответа нет, происходит повторное дерганье пина BOOT.

Много возни с кириллицей. Переключился на формат UCS2, получаю много цифр, перевести это в url-кодированный utf8 было непросто. Тем более что часть сообщения приходит в ascii, а функционал javascript в mjs обрезан до слез.

telneДобавил конфигурацию через веб-интерфейс. Фактически, взял готовый пример и добавил в него всего один параметр – ключ ifttt. По дизайну системы, просто так добавить поле в параметры нельзя. Нужно пересобрать всю прошивку, перегуглить кучу страниц, понять как правильно добавить поле… выкинуть все нафиг и записать ключ в неиспользуемый параметр.

Наконец, множественные сохранения в чипе тоже иногда приводят к злым глюкам, время от времени приходилось полностью перешивать чип и настраивать заново.

Теперь я понимаю как Толстой писал вайнуимир.

Но в конце все более-менее получилось. Код выложу на github, однако есть несколько тонкостей в настройке модуля, так что повторение может быть не столь тривиальным…

31.07.2017

Как получить доступ к flickr.com

Filed under: Uncategorized — sae762 @ 10:54

Background:

при создании TLS сессии современные браузеры вставляют имя хоста в первый пакет handshake. “Трищ майор” вылавливает этот нешифрованный пакет и блокирует соединение.

Хвала опенсорцу – это можно пофиксить в браузере и пересобрать! Для мозиллы (в моем случае версии 33 пол линух) это выглядит так:

качаем свою версию nss https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_16_2_3_RTM/src/nss-3.16.2.3-with-nspr-4.10.6.tar.gz

патчим:

sslsecur.c
SECStatus
SSL_SetURL(PRFileDesc *fd, const char *url)
{
sslSocket * ss = ssl_FindSocket(fd);
SECStatus rv = SECSuccess;

if (!ss) {
<——>SSL_DBG((“%d: SSL[%d]: bad socket in SSLSetURL”,
<——><——> SSL_GETPID(), fd));
<——>return SECFailure;
}
ssl_Get1stHandshakeLock(ss);
ssl_GetSSL3HandshakeLock(ss);

if ( ss->url ) {
<——>PORT_Free((void *)ss->url);<—>/* CONST */
}

//вот эту часть кода комментируем

// ss->url = (const char *)PORT_Strdup(url);
// if ( ss->url == NULL ) {
//<—->rv = SECFailure;
// }

ssl_ReleaseSSL3HandshakeLock(ss);
ssl_Release1stHandshakeLock(ss);

return rv;
}

затем пересобираем make nss_build_all

и заменяем в нашем браузере либы libssl3.so, libnssutil3.so и libnss3.so

вуаля! flickrнаш )

NB: а ведь можно такой патч сделать и для windows. кто возьмется?

UPD: для linux_x86_64: make nss_build_all USE_64=1

и достаточно заменить libssl3.so

05.04.2017

Самый простой термометр на arduino

Filed under: электроника — sae762 @ 10:25
Tags:

В ряде случаев необходимо хотя бы примерно измерять температуру, например нагрев радиатора транзисторов. Можно конечно использовать специальные модули и датчики. Но если под рукой их нет, то можно сделать датчик из любого диода или транзистора.
Теория гласит, что падение напряжения на p-n переходе составляет порядка 600mV при комнатной температуре и изменяется почти линейно с коэфициентом -2mV/C. То есть, если например при +25 600mV, то при +35 уже 580mV.

pic1

Как измерить такие величины?
У arduino есть аналоговый компаратор, который позволяет измерать входное напряжение от 0 до некоторого “эталонного” напряжения. В качестве эталона можно использовать как внешний источник, так и внутренний, номиналом 1.1 вольт. Последний вполне подходит. Задаем analogReference(INTERNAL) и получаем analogRead(A7) значение от 0 до 1023 что примерно соответствует милливольтам.
Обычно для измерения падения напряжения схема состоит из последовательно соединенных диода и резистора. Резистор подключается к 3.3V можно и к 5V, диод к GND, а с точки соединения снимается прямое напряжение на p-n переходе.
Схему можно собрать и не транзисторе, превратив его в диод, соединив коллектор и базу. Эмиттер транзистора npn подключем к земле, а коллектор с базой – к резистору.

pic2
Где-то на форуме прочитал, что можно еще упростить схему, используя внутренний подтягивающий резистор arduino. То есть подключаем эмиттер npn транзистора к земле, базу с коллектором, к примеру, к A7. Затем “подключаем внутренний резистор командой digitalWrite(A7, INPUT_PULLUP);”.

НЕ РАБОТАЕТ! Мало того что команда должна быть pinMode(A7, INPUT_PULLUP), но похоже резистор слишком велик, и падение напряжения получается нестабильным.

ВОТ ТАК НЕ РАБОТАЕТ:pic3
В качестве бонуса привожу код, получающий аналоговое значение без задержек. В регистры устанавливаем параметры для считывания, запускаем процесс, а результат опрашиваем когда нам удобно. Можно также сделать по прерыванию.

int t;

void setup() {
Serial.begin(115200);
//pinMode(A7,INPUT_PULLUP);
//first measure
ADMUX=0b11000111;//ref 1.1v, input A7
ADCSRA |= 0b01000000;//start bit
delay(300);
}

void loop() {
if ((ADCSRA & 0b01000000) == 0) { //if bit ADSC cleared
t=ADCL; //read it first, to lock adch
t|=(ADCH<<8);//read it last to unlock
}
Serial.println(t);
//start new conversion
ADCSRA |= 0b01000000;//start bit
delay(1000);
}

Обратите внимание на порядок считывания значения ADCL и ADCH

 

07.02.2017

Маленький пингвин для маленькой системы

Filed under: Uncategorized — sae762 @ 17:11

или возвращение gentoo =)

Давненько я не устанавливал Gentoo. Десктоп собирать то еще удовольствие, ведь система ставится из исходников. Проще брать готовый Debian, или, если хочется именно Gentoo-way, то SystemRescueCD.  На серверах проще: нужно добавить всего несколько пакетов и не тянуть кучу зависимостей.

Собственно, потому и вспомнил о Gentoo для Orange Pi Zero. Дистрибутивы armbian в принципе ничего, но повергают систему в спячку так что пинг может достигать секунды. Можно настроить наверное. Но почему бы не собрать свою систему?

Для начала нужно создать загрузочную флешку. Скачал образ, с современным (mainline) ядром есть только ubuntu, да в общем без разницы.

  • Закатал образ на флешку через dd if=<образ> of=<флешка>
  • снес все файлы кроме /boot, /lib/firmware и /lib/modules
  • распаковал на флешку stage3 для armhf
  • поправил /etc/inittab, /etc/shadow
  • добавил portage

Загрузилось, серийная консоль работает, но в stage3 нет wpa_supplicant, и даже dhcpcd (

Простое решение – использовать eth0, но у меня нет проводной сети вообще. Пришлось заморочиться с мобилой: подключил андроид по usb, включил тетеринг, в системе появился rndis адаптер usb0. Но поскольку параметров для выставления вручную я не нашел, все же пришлось скачать отдельно исходники dhcpcd, закинуть их скажем в /opt и скомпилить. После этого сеть поднялась и emerge доустановил wpa_supplicant, dhcpcd, mc и все что нужно.

Чтобы избежать такого геморроя, могу предложить образ gentoo для заливки на флешку. Не знаю, надо ли кому, пишите – залью куда-нибудь

 

 

12.01.2017

Освещение комнаты на mongoose-iot

Filed under: Uncategorized — sae762 @ 11:06

пока standalone

Продолжение. Начало работы с mongoose-iot в предыдущей статье

Для примера я сделал систему управления лентой RGB и белой лентой для отдельной комнаты. Все что нужно добавить – веб-страницу интерфейса, в нашем случае с четырьмя слайдерами. После изменения положения слайдера в чип отправляется команда вида PWM.set(red,10000,value) и соответствующий канал меняет интенсивность свечения.

Несколько модификаций в системе. Можно их не делать, а вызывать страницу с домашнего веб-сервера.

  • перенес встроенный веб-сервер на порт 88 (через веб-страницу конфига)
  • переименовал встроенную страницу конфига с index.html в config.html
  • собственную страницу управления поставил как index.html

15871461_1285211388227636_5588909604704536074_n
15826727_1285211304894311_2186298967977520777_n
Планы:
– Нельзя опросить состояние каналов. Думаю, нужно добавить переменные, которые будут содержать значения pwm.
– В некоторых помещениях (кухня, коридор) уместно добавить детектор движения. Сейчас на кухне такое сделано, но на Arduino IDE. Нужно подобрать алгоритм зависимости освещенности от движения. Как раз посильная задача для javascript.
– Буду подключать датчики воздуха, термометр, и т.п.

так что продолжеие следует.

Ниже код самой страницы (команды обрабатываются на url /eval, см httpd.js из предыдущего поста, html вставляется плохо, просто скопировать не получится,если что спрашивайте):

<!DOCTYPE html>
<html>
<head>
<meta name=”viewport” content=”width=device-width, initial-scale=1″/>

var url=”http://192.168.1.180/eval&#8221; //for ext web
//var url=”/eval” //for inernal page

// common method
var http = new XMLHttpRequest();// one object instance

function send_eval(cmd) {
var params = “cmd=”+cmd;
document.getElementById(‘status’).value+=cmd+”\n”;
//jquery way also ok: $( “#status” ).val( $( “#status” ).val() + cmd+”\n” );
//sync (false) is deprecated but works better, connection always keep-alive (
http.open(“POST”, url, false);
//in case of sync.
//http.onreadystatechange = function() {
//if(http.readyState == 4 ) {
document.getElementById(‘status’).value+=http.responseText+”\n”;
//}
//}
http.send(params);
}

< script src=”https://code.jquery.com/jquery-1.12.4.js”></script&gt;
< script src=”https://code.jquery.com/ui/1.12.1/jquery-ui.js”></script&gt;

<link rel=”stylesheet” href=”//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css”/>
<style>
body {width: 100%;background-color: #DDDDDD; }
.p1 {text-align: center;}
#debug {width:100%; padding-left: 10%; padding-top: 20px;}
#status {width: 80%; height: 150px; }

#red, #green, #blue, #white {
clear: left;
width: 80%;
margin: 25px 15px 25px 10%;
}
#off {
width: 20%;
margin: 15px 15px 15px 10%;
}
#random {
width: 20%;
margin: 15px 10% 15px 0%;
}

#red .ui-slider-range { background: #ef2929; }
#red .ui-slider-handle { background:#ef2929; border-color: #ffffff; }
#green .ui-slider-range { background: #8ae234; }
#green .ui-slider-handle { background: #8ae234; border-color: #ffffff; }
#blue .ui-slider-range { background: #729fcf; }
#blue .ui-slider-handle { background: #729fcf; border-color: #ffffff; }
#white .ui-slider-range { background: #ffffff; }
#white .ui-slider-handle { background: #ffffff; border-color: #ffffff; }
</style>

//specific methods

pinR=13;
pinG=12;
pinB=14;
pinW=5;

//init recommend place to controller
$( function() {
cmd = ‘GPIO.setMode(‘+pinR+’,GPIO.OUT);’+
‘GPIO.setMode(‘+pinG+’,GPIO.OUT);’+
‘GPIO.setMode(‘+pinB+’,GPIO.OUT);’+
‘GPIO.setMode(‘+pinW+’,GPIO.OUT)’;
send_eval(cmd);
});

//jquery init
$( function() {
$( “#off,#random” ).button( {} );
$( “#random” ).click( rand );
$( “#off” ).click ( off );

$( “#red, #green, #blue, #white” ).slider({
orientation: “horizontal”,
range: “min”,
max: 10000,
value: 5000,
step: 200
});
$( “#red” ).slider( {change: setR} );
$( “#green” ).slider( {change: setG} );
$( “#blue” ).slider( {change: setB} );
$( “#white” ).slider( {change: setW} );
$( “#status”).hide();
});

//controls
function setR() {
v=$( “#red” ).slider( “value” )
send_eval(‘PWM.set(‘+pinR+’,10000,’+v+’)’);
}
function setG() {
v=$( “#green” ).slider( “value” )
send_eval(‘PWM.set(‘+pinG+’,10000,’+v+’)’);
}
function setB() {
v=$( “#blue” ).slider( “value” )
send_eval(‘PWM.set(‘+pinB+’,10000,’+v+’)’);
}
function setW() {
v=$( “#white” ).slider( “value” )
send_eval(‘PWM.set(‘+pinW+’,10000,’+v+’)’);
}

function off() {
//value change->setX called
$( “#red” ).slider( “value”, 0);
$( “#green”).slider( “value”, 0);
$( “#blue” ).slider( “value”, 0);
$( “#white”).slider( “value”, 0);
//turn off pwm
send_eval(‘PWM.set(‘+pinR+’,0,0)’);
send_eval(‘PWM.set(‘+pinG+’,0,0)’);
send_eval(‘PWM.set(‘+pinB+’,0,0)’);
send_eval(‘PWM.set(‘+pinW+’,0,0)’);
}

function rand() {.
//value change->setX called
$( “#red” ).slider( “value”,rnd());
$( “#green” ).slider( “value”,rnd());
$( “#blue” ).slider( “value”,rnd());
}

function rnd() {
return Math.floor(Math.random()*10000);
}

function debug() {
$(“#status”).toggle();.
$(“#status”).val(”);.
}

</head>
<body>

Anina Lampa

</div>

OFF
RAND

</div>

<textarea id=”status”></textarea>
</div>
</body>
</html>

 

 

Mongoose-iot и все-все-все

Filed under: Uncategorized — sae762 @ 10:50

…или мой обзор технологий для SoC

Традиционно, начал я с arduino и соответствующего IDE. Все было просто: пишем скетч – компилим – заливаем – работает. Или не работает. Отладка и заливка тут же на столе через serial порт.

Дальше появилась esp8266. И началось…

В целом Arduino IDE с модулем для esp8266 вполне работоспособное решение. Но специфика такова, что для прошивки нужно подпаять провода, замкнуть gpio0 на землю и только тогда прошить. Да и компиляция скетча выдает полностью новую прошивку. Все равно что при замене кнопки в ворде нужно было бы переустановить виндовс 😉 Словом, не очень гибкое решение, и мысль начала двигаться в сторону скриптовых языков.

Интересно было посмотреть на MicroPython. Реализация доступна для целого ряда систем, проект выглядит достаточно зрелым. Но язык мне не очень нравится, в частности его позиционность.

Солидно выглядит решение NodeMCU с их LUA script: можно насыпать разных скриптов в файловую систему и вызывать их по мере необходимости. Большое community, солидная документация. Забегая вперед, скажу, что считаю ее второй по удобству для себя, рзервом. Почему второй: как жависту мне не очень нравится язык LUA (особенно nil ;)), и, что более важно, NodeMCU все же ориентирован на свой контроллер, хотя конечно может развиться в многоплатформенный стандарт.

Тут же на глаза попался и весьма интересный проект Espruino. Система выгодно отличается от предыдущих наличием JavaScript. О самом языке можно конечно спорить, и мне в нем тоже не все нравится, но распространенность его, наверное, вне конкуренции. Espruino в свою очередь имеет встроенную telnet-консоль, что позволяет работать с чипом через wifi. К недостаткам следует отнести отсутствие файловой системы (можно добавить micro-sd, но это другая история), что не позволяет вызывать разные модули. Кроме того, espruino – прежде всего продвигает свой модуль на базе esp8266, так что портирование на другие чипы не входит в приоритеты.

Наконец, поиск довел меня до платформы mongoose-iot. Система имеет встроенный веб-сервер mongoose и самую компактную JS-машину. Как утверждают разработчики, этот код давно используется в микро-системах, даже в космосе. В отличие от espruino здесь встроена SPIFFS – файловая система, файлы можно заливать через веб-интерфейс. К сожалению, здесь тоже есть недостатки. Первый – это недостаток поддержки и документации. Community пока небольшое, но думаю потенциал есть. Второй недостаток, по моему мнению – мало средств для работы с системой через wifi: не видно консоли, нельзя послать команду кроме веб-страницы. Но этот вопрос решается достаточно просто, я дописал телнет-сервер и “веб-консоль”, куда можно отправить javascipt, он будет выполнен посредством eval(), и результат будет отправлен на страницу.

15873223_1285223501559758_2809025836598146840_n

//app.js – этот файл запускается системой при старте. try-catch обязателен, иначе любая ошибка в коде выведет из строя всю js-машину

try {
File.eval(“telnetd.js”);
File.eval(“httpd.js”);
File.eval(“main.js”);
}
catch (e) {
print(e);.
}

telnetd.js – моя попытка сделать телнет-консоль. в целом работает, но вывод реальной консоли уходит в serial, попытка подцепить UART закомментирована

var telnetd = tcp.createServer({}, function(sock) {
sock.write(“welcome, use sock.end() to close\n”);
//blocked console! UART(0).onRecv(function() { var u=UART(0).recv(); sock.write(u); });
sock.on(“data”, function(data) {
var res;
try {
res=eval(data);
} catch (e) {
res=e;
}
sock.write(res+”\n”, null, function() { });
});
sock.on(“close”, function() {sock.end();});
sock.on(“error”, function() {sock.end();});
sock.on(“timeout”, function() {sock.end();});
});

telnetd.listen(23, “0.0.0.0”, 0, function() {
print(“telnetd started”);
});

httpd.js – веб-консоль. по мне наиболе удобный инструмент. url /eval обрабатывает все поступающие на контроллер команды

//from beta4/docs/examples/http-server.md
var parse = function(query) {
var obj = {};
var pairs = query.split(‘&’);
for (var i = 0; i < pairs.length; i++) {
var x = pairs[i].split(‘=’, 2);
obj[x[0]] = x[1];
}
return obj;
}

//

var httpd = Http.createServer(function(req, res) {
// print(req);
if (req.url == ‘/eval’) {
var query = parse(req.body);
var cmd = query.cmd;
var rc;
try {
rc=eval(cmd);
} catch (e) {
rc=e;
}
res.writeHead(200, {‘Access-Control-Allow-Origin’: ‘*’}); //for cross-scripting
res.write(rc);
res.end();
} else {
res.serve();
}
});httpd.listen(80, function() {
print(“httpd started”);
});

main.js – скрипт для инициализации GPIO в нашем случае (см пост о моем проекте по освещению комнаты). может отсутствовать.

GPIO.setMode(12, GPIO.OUT);
GPIO.setMode(13, GPIO.OUT);
GPIO.setMode(14, GPIO.OUT);
GPIO.setMode(5, GPIO.OUT);
GPIO.setMode(2, GPIO.OUT);//test led

GPIO.write(12,0);
GPIO.write(13,0);
GPIO.write(14,0);
GPIO.write(5,0);
GPIO.write(2,1);

К сожалению, веб-консоль пока не полноценная. Сообщения системы поступают на serial-консоль и я не разобрался как их перехватить.

Тем не менее, этого функционала достаточно, чтобы использовать в домашней автоматизации.

12.12.2016

Windows на MacOS

Filed under: компьютеры — sae762 @ 09:07

Или пара слов о bootcamp

На днях попросили переустановить windows на macbook air. Хорошо что не начал нахрапом все сносить, сначала погуглил. Смутило то, что windows стоит всего на одном физическом разделе диска.

Оказывается, в макоси все предусмотрено, в том числе и винодовс по соседству. Правильный подход (bootcamp) состоит в следующем:

  • скачать образ windows в виде iso
  • зайти в macOS (опции загрузки появляются, если сразу после стартового звука нажать Options)
  • в приложениях найти bootcamp (bootcamp assistant или как-то так)
  • bootcamp берет скачанный iso, выделяет место для винды на диске, и строит загрузочную флешку с нужными парамерами
  • перегружайтесь и устанавливайте виндовс с созданной флешки
  • затем можно в настройках установить какую систему загружать по умолчанию

По мне так очень грамотно все сделали, разработчикам макоси риспект и уважуха )

BTW, если эта винда вдруг сломается (например, вы решите сжать весь виндовый диск ;)) с помощью этой же флешки можно “восстановить систему”.

 

18.10.2016

GRUB2 на USB флешке, часть 2

Filed under: Uncategorized — sae762 @ 16:47

После прочтения предыдущей статьи вы можете спросить, “зачем grub2 если есть syslinux или unetbootin?”

А вот зачем:

I. grub2 умеет загружать системы из iso-образов! это означает, что можно просто скачать на флешку свежий образ системы, немного поправить grub.cfg –  и можно пробовать!  Ложкой дегтя здесь является то, что образ iso не является полной эмуляцией cdrom, так что загружаемая система должна уметь найти себя в iso-образе. Точно умеют это делать Ubuntu и SystemRescueCD (см параметры ядра в примерах), про остальные надо гуглить.

для Ubuntu/Xubuntu/итп:

set iso=”/xubuntu-16.10-desktop-linuxium.iso”
loopback loop $iso
set root=(loop)

menuentry “Try Xubuntu without installing” {
set gfxpayload=keep
linux /casper/vmlinuz.efi iso-scan/filename=$iso file=/cdrom/preseed/xubuntu.seed boot=casper zswap.enabled=1 zswap.compressor=lz4 splash —
initrd /casper/initrd.lz
}

для SystemRescueCD:

set loop1=”/systemrescuecd-x86-4.8.2-beta001.iso”
insmod loopback
loopback loop $loop1
set root=(loop)
set kernel32=”/isolinux/rescue32 scandelay=3 isoloop=$loop1
set kernel64=”/isolinux/rescue64 scandelay=3 isoloop=$loop1
set initrd=”/isolinux/initram.igz”

menuentry “SystemRescueCd (64bit, default boot options)” {
linux    $kernel64
initrd    $initrd
}

… другие опции из файла isolinux.cfg (там наиболее полный список)

II. Единый /grub.cfg для всех вариантов загрузки – существенно упрощает жизнь

III. Grub2 понимает не только fat, но и другие системы. Значит, можно загружать системы, файлы которых расположены не на usb, а на жестком диске компьютера. Например, можно сложить все файлы RemixOS прямо на диск C: (где windows), и загружать remix из меню нашей флешки:

#на диске с windows создаем папку C:/RemixOS, сливаем туда файлы и добавляем пустой файлик remix-hd для удобства поиска. Data.img будет создан в той же папке /RemixOS. DEBUG добавлен на этапе тестирования.

menuentry ‘HD mode ‘  {
insmod ntfs
insmod part_msdos
search –file –no-floppy –set=root /RemixOS/remix-hd
linux /RemixOS/kernel root=/dev/ram0 androidboot.selinux=permissive SERIAL=random logo.showlogo=1 DATA=/data.img USB_DATA_PARTITION=1 CREATE_DATA_IMG=1 SRC=/RemixOS DEBUG=1
initrd /RemixOS/initrd.img
}

IV. Наконец, зная grub, вам не придется забивать голову другими загрузчиками )

Хотел написать отдельный пост о Remix под NTFS, но в пункте III собственно все и сказано.

ЗЫ: не делайте submenu в grub.cfg: submenu не наследует переменных! (баг или фича сложно сказать)

17.10.2016

Только GRUB2

Filed under: компьютеры — sae762 @ 15:38

только хардкор… 😉

Перебрал несколько вариантов syslinux, extlinux итп, но зачем, если можно сделать единообразно и универсально?

Итак, простой метод создания универсальной загрузочной флешки USB для загрузки как в legacy bios, так и UEFI:

  1. Для grub2 нужен небольшой раздел для загрузчика, 1М достаточно, поэтому gdisk /dev/sdc и создаем: 1) 1M type 0xEF02 (именно так) и 2) на ваш вкус, обычно вся остальная флешка type 0x0700
  2. Форматируем только второй раздел, первый будет использован grub-ом и не монтируется
  3. Монтируем mount /dev/sdc2 /boot  (именно так, туда grub2 по умолчанию пишет свои файлы, наверное можно определить в команде, но проще примонтировать в /boot)
  4. Ставим grub2 для legacy bios: grub2-install –target=i386-pc [–removable]  /dev/sdc (опция removable тут кажется не нужна, но я ставил)
  5. Ставим grub2 для efi: grub2-install –target=x86_64-efi –efi-directory=/boot –removable  /dev/sdc
  6. Получилось на диске /dev/sdc две папки: EFI с загрузчиком grub2-64 и grub2 c модулями для grub-64 и grub-32.
  7. В папку /grub2 прописываем файлик grub.cfg, мне кажется удобно прописать лишь одну строку “configfile /grub.cfg” а уже в корне расположить большой конфиг для разных систем

 

Next Page »