




Обзавелся я тут, значит, очередным трансивером в июле. Нужно зарегистрировать в Роскомнадзоре.
Раньше я пользовался услугой одного дядички - отдавал ему документы и его девочки-мальчики сами ездили оформлять разрешение на станцию с этой муторной процедурой. С нынешним разбродом (например, позывные до сих пор не дают и я не могу повысить категорию из-за этого), дядечка пока такой курьерской услугой не занимается. Так что теперь все самому.
Выяснил, что на rsoc.ru есть форма для подачи заявления в электронном виде - чтоб лишний раз туда не мотаться, я ее заполнил и стал ждать неизвестно чего.
Прошел практически месяц, никто не пишет и не звонит. Проверяю статус заявки на сайте: "заявка передана в электронную систему Роскомнадзора". Ну пипец какой-то, сайт уже не электронная система. Там же дан телефон справочной.
Звоню. Объясняю девушке в справочной, что частоты выделять мне не нужно, всего лишь зарегистрировать РЭС. в итоге договорились до того, что мне нужно позвонить в "отдел".
Еще неделя уходит на то, чтобы в этом "отделе" сняли трубку. В общем, меня отредиректили в справочную московского отделения Роскомнадзора. Звоню туда. Опять описываю девушке (теперь из московского филиала) ситуацию. Дает номер тетеньки, занимающейся электронными заявлениями. Звоню ей. Та раздроженным голосом завляет, что я уже второй за день умник, который звонит по этому поводу и к ней (не смотря на поданное в электронном виде заявление) это никакого отношения не имеет. Правда, дала телефон в "отдел", теперь уже региональный. Фиерия продолжается.
Звоню в "отдел": "А вы нам бумажные копии заявлений привозили? Откуда мы знаем о том, что вы завели электронные? Вот привезете - узнаем". Занавес.
Надо сказать, что все девушки, кроме той, что на электрических заявках, весьма вежливы. Хоть какой-то прогресс в госучереждении.
Posted via LiveJournal app for iPad.
|
class JSString
{
public:
JSString(const char* value);
JSString(const std::string& value);
JSString(const JSStringRef& value);
JSString(const JSContextRef& context, const JSValueRef& value);
~JSString();
operator JSStringRef();
operator std::string();
operator Glib::ustring();
private:
JSStringRef string;
};
JSString::JSString(const char* value)
{
string = JSStringCreateWithUTF8CString(value);
}
JSString::JSString(const std::string& value)
{
string = JSStringCreateWithUTF8CString(value.c_str());
}
JSString::JSString(const JSStringRef& value)
{
string = value;
JSStringRetain(string);
}
JSString::JSString(const JSContextRef& context, const JSValueRef& value)
{
string = JSValueToStringCopy(context, value, NULL);
}
JSString::~JSString()
{
JSStringRelease(string);
}
JSString::operator JSStringRef()
{
return string;
}
JSString::operator std::string()
{
size_t length = JSStringGetMaximumUTF8CStringSize(string);
gchar buffer[length];
JSStringGetUTF8CString(string, buffer, length);
return std::string(buffer);
}
JSString::operator Glib::ustring()
{
size_t length = JSStringGetMaximumUTF8CStringSize(string);
char buffer[length];
JSStringGetUTF8CString(string, buffer, length);
return Glib::ustring(buffer);
}
context = JSGlobalContextCreate(NULL);
JSObjectMakeFunctionWithCallback(context, JSString("dnsResolve"), dns_resolve);
JSObjectMakeFunctionWithCallback(context, JSString("myIpAddress"), my_ip);
JSEvaluateScript(context, JSString(proxyConfigureFunctions), NULL, NULL, 1, NULL);
JSEvaluateScript(context, JSString(script), NULL, NULL, 1, NULL);
| Линия К-98 | Линия порта В | Настройка реле |
| K1 (2) | B1 (20) | ANT |
| K2 (3) | B2 (21) | ANT |
| K3 (4) | B3 (22) | ANT |
| K4 (5) | B4 (23) | ANT |
| K5 (6) | COM (4) | |
| PTT IN (T) | B7 (10) | SEQ |
| PTT IN (S) | B7 COM (6) |







Меня умиляют решения с асинхронным вводом-выводом в современных операционных системах. Он вроде как есть, но его вроде как нет.
Задачка: делаю редиректор с последовательного порта в UNIX pipe. Нужно переложить данные из порта в один pipe, "модемные" биты - во второй, а из третьего - читать и писать эти данные в порт. Задачка несложная, даже весьма простая, вроде как.
Начинаем изучать проблемную область... Первое, что видим - "модемные" биты нельзя опрашивать асинхронно, за их опрос отвечает соответствующий системный вызов ioctl. Время опроса нам не столь критично, будем дролбиться каждые 100 миллисекунд. Получаем ситуацию, что нам нужно ожидать изменения пары дескрипторов (порт и входящий pipe) и некоторого таймаута. Для данного действа в POSIX у нас есть целых три способа - poll, select и kqueue, унаследованный от BSD.
select явно попахивает математиками из комитета по стандартизации C++ - поганее способа придумать нельзя было - каждый раз для метода нужно прогружать новую таблицу дескрипторов, чтобы после вызова получить в нем из всего списка только те, по которым нужно произвести изменения, Не забываем, что нам эту дурацкую операцию нужно проводить каждые 100 миллисекунд. Получается, что на создание этого списка и передачу его в kernel space тратиться больше ресурсов чем на всю последующую работу. Параметр таймаута, кстати, тоже нужно каждый раз перезаписывать.
Ну вроде как на замену select-у есть станларный poll и замечательно продуманый kqueue. Но... по не понятной для меня причине Mac OS X и все ее производные не поддерживают работу kqueue с устройствами TTY! На его дескриптор попросту получаем EINVAL.
Хорошо, у меня в рукаве есть третий замечательный и весьма стандартный метод - poll. Ну и с ним мы наступаем на те же самые грабли. Получается, что замены весьма неэффективному select-у в таких задачах нет! Ну что же, прийдется смириться.

Posted via LiveJournal app for iPhone.

diskutil в командной строке.
#!/usr/bin/php -q
<?php
// Constants form RouterCommands.h
define("ROUTERFUNCTION", 0x80);
define("KEYERFUNCTION", 0x40);
define("CLOSEFUNCTION", 0x20);
define("FUNCTIONMASK", 0x1f);
define("WRITEONLY", 0x80);
// Commands sent to the master port
define("OPENMICROKEYER", ROUTERFUNCTION + 0x01); // get a port to the microKEYER router
define("OPENCWKEYER", ROUTERFUNCTION + 0x02); // get a port to the CW KEYER router
define("OPENDIGIKEYER", ROUTERFUNCTION + 0x03); // get a port to the DIGI KEYER router
define("OPENKEYER", ROUTERFUNCTION + 0x08); // get a port to keyer from following keyerID (char*)
define("KEYERID", ROUTERFUNCTION + 0x09); // get Keyer ID (null terminated string) of the nth keyer (next byte after command)
define("QUITIFNOKEYER", ROUTERFUNCTION + 0x1f); // quit if there are no keyers
define("QUITIFNOTINUSE", ROUTERFUNCTION + 0x1e); // quit if not connected
define("QUITALWAYS", ROUTERFUNCTION + 0x1d); // quit
define("ROUTERVERSION", ROUTERFUNCTION + 0x1c); // router version <1><80> = v1.80
define("WATCHDOG", 0x08); // keep UDP port alive
// Commands sent to the router ports (numbers are within FUNCTIONMASK)
define("ROUTERPORT", KEYERFUNCTION + 0x01); // (reserved for router internal use)
define("OPENRADIO", KEYERFUNCTION + 0x02); // get a RADIO port
define("OPENCONTROL", KEYERFUNCTION + 0x03); // get a CONTROL port
define("OPENPTT", KEYERFUNCTION + 0x04); // get a port to the PTT flag bit
define("OPENCW", KEYERFUNCTION + 0x05); // get a port to the serial CW flag bit
define("OPENRTS", KEYERFUNCTION + 0x06); // get a port to the RTS flag bit
define("OPENFSK", KEYERFUNCTION + 0x07); // get an FSK port
define("OPENWINKEY", KEYERFUNCTION + 0x08); // get the WinKey port
define("OPENFLAGS", KEYERFUNCTION + 0x09); // get the FLAGS port
define("OPENEMULATOR", KEYERFUNCTION + 0x0a); // get the WinKey Emulator port (only in µH Router; not in microHAM keyers
define("WINDOWSIZE", KEYERFUNCTION + 0x0b); // used by UDP to change window size
define("CLOSERADIO", CLOSEFUNCTION + OPENRADIO); // close a RADIO port
define("CLOSECONTROL", CLOSEFUNCTION + OPENCONTROL); // close a CONTROL port
define("CLOSEPTT", CLOSEFUNCTION + OPENPTT); // close a port to the PTT flag bit
define("CLOSECW", CLOSEFUNCTION + OPENCW); // close a port to the serial CW flag bit
define("CLOSERTS", CLOSEFUNCTION + OPENRTS); // close a port to the RTS flag bit
define("CLOSEFSK", CLOSEFUNCTION + OPENFSK); // close an FSK port
define("CLOSEWINKEY", CLOSEFUNCTION + OPENWINKEY); // close the WinKey port
define("CLOSEFLAGS", CLOSEFUNCTION + OPENFLAGS); // close the FLAGS port
define("CLOSEEMULATOR", CLOSEFUNCTION + OPENEMULATOR); // close the WinKey Emulator port
define("CLOSEKEYER", KEYERFUNCTION + FUNCTIONMASK);
//
define("LAUNCH_ROUTER", "osascript -e 'tell application \"µH Router\"' -e 'tell microKEYER' -e 'retain' -e 'end tell' -e 'end tell'");
define("KILL_ROUTER", "osascript -e 'tell application \"µH Router\"' -e 'tell microKEYER' -e 'release' -e 'end tell' -e 'quitIfNotInUse' -e 'end tell'");
define("ROUTER_PIPES", "/tmp/microHamRouter");
class uHRouterConnection
{
private $input;
private $output;
public function __construct($name = ROUTER_PIPES)
{
$this->input = @fopen($name."Read", "r");
$this->output = @fopen($name."Write", "w");
}
public function __destruct()
{
@fclose($this->input);
@fclose($this->output);
}
public function Connected()
{
return (($this->input !== FALSE) && ($this->output !== FALSE));
}
public function Execute($command, $read = TRUE)
{
if (is_numeric($command))
$command = chr($command);
@fwrite($this->output, $command);
if ($read)
{
stream_set_timeout($this->input, 10);
$value = @fread($this->input, 20);
return trim($value);
}
}
}
//
function Stop()
{
global $router, $keyer;
if (isset($keyer) && $keyer->Connected())
$keyer->Execute(CLOSEKEYER, FALSE);
unset($keyer);
unset($router);
exec(KILL_ROUTER);
exit();
}
// set_time_limit(0);
print("Starting uH Router...\n");
exec(LAUNCH_ROUTER);
print("Openning uH Router connecion...\n");
$router = new uHRouterConnection();
if (!$router->Connected())
{
print("Can not open uH Router connection.\n");
Stop();
}
print("Requesting Keyer conection...\n");
$name = $router->Execute(OPENMICROKEYER);
if (($name == FALSE) || (strlen($name) == 0))
{
print("Requested keyer not found.\n");
Stop();
}
print("Openning Keyer conection ($name)...\n");
$keyer = new uHRouterConnection($name);
if (!$keyer->Connected())
{
print("Can not open connection for Keyer.\n");
Stop();
}
print("Requesting radio connection...\n");
$name = $keyer->Execute(OPENRADIO);
if (($name !== FALSE) || (strlen($name) == 0))
{
print("Forwarding connection for radio ($name)...\n");
print("Press Ctrl+C to stop forwarding.\n");
$redirector = "sh -i -c 'socat -d TCP-LISTEN:7001,rcvbuf=1,sndbuf=1 PIPE:${name}Read!!PIPE:${name}Write'";
system($redirector);
print("\n");
print("Stopping...\n");
}
Stop();
?>


| Date | Station | Locator | Band | Mode | RST R | RST S | ||
| 2012-05-07 06:46 | UB3ABM | ![]() |
RX3ACY | LO06aa | 2M | FM | 59 | 59 |
| 2012-05-07 06:44 | UB3ABM | ![]() |
RA3ARU | LO06aa | 2M | FM | 59 | 59 |
| 2012-05-07 06:14 | UB3ABM | ![]() |
RP67GK | KO96bb | 2M | FM | 59 | 59 |
| 2012-05-07 06:11 | UB3ABM | ![]() |
UA3CS | KO86wb | 2M | FM | 59 | 59 |
| 2012-05-07 06:11 | UB3ABM | ![]() |
UA3DAV | LO06aa | 2M | FM | 59 | 59 |
| 2012-05-07 06:07 | UB3ABM | ![]() |
RA3DKM | KO96hk | 2M | FM | 41 | 41 |
| 2012-04-22 18:34 | UB3ABM | ![]() |
RZ6HFR | LN25cj | 80M | LSB | 59 | 59 |
| 2012-04-22 18:29 | UB3ABM | ![]() |
RN3OY | LO06aa | 80M | LSB | 59 | 59 |
| 2012-04-22 18:10 | UB3ABM | ![]() |
R1AMB | DB00aa | 80M | LSB | 59 | 59 |
| 2012-04-22 18:10 | UB3ABM | ![]() |
R1ATK | DB00aa | 80M | LSB | 57 | 59 |
| 2012-04-12 16:08 | UB3ABM | ![]() |
RX3DHM | LO06aa | 40M | LSB | 59 | 58 |
| 2012-03-07 08:07 | UB3ABM | ![]() |
RK3ASQ | LO06aa | 40M | LSB | 59 | 59 |
| 2011-12-18 07:28 | UB3ABM | ![]() |
RA3VFF | LO06aa | 40M | LSB | 59 | 59 |
| 2011-11-25 17:35 | UB3ABM | ![]() |
UA3WDO | LO06aa | 80M | LSB | 59 | 59 |
| 2011-11-25 17:34 | UB3ABM | ![]() |
RA3WCQ | LO06aa | 80M | LSB | 59 | 59 |
| 2011-11-25 14:45 | UB3ABM | ![]() |
UR6IW | KO50mm | 80M | LSB | 49 | 56 |
| 2011-11-25 14:45 | UB3ABM | ![]() |
UT4QX | KO50mm | 80M | LSB | 59 | 59 |
| 2011-11-03 17:51 | UB3ABM | ![]() |
RD3ATR | KO85qv | 2M | FM | 59 | 59 |
| 2011-10-24 15:01 | UB3ABM | ![]() |
RU4PIA | LO64jm | 40M | LSB | 59 | 59 |
| 2011-10-24 15:00 | UB3ABM | ![]() |
RW4PIC | LO64jm | 40M | LSB | 59 | 59 |