пятница, 16 августа 2013 г.

Command line in Far to new ConEmu console

Using [Far 2 + ConEmu]? Here is the solution how to run new command in Far Manager 2 targeting the new ConEmu console.
Download and run this file to add macros for Far into the registry.
Now use ALT+SHIFT clicking ENTER on any item you wish to run in the new ConEmu console of the same ConEmu which runs Far. If command line is empty item under cursor on the file panel is running otherwise the command line typed in the text field under the panels is running.
The macro runs these commands adding the "-new_console" in the command line. The feature is working if ConEmu has been setup to intercept command line commands (you may check it in the settings, by default it is).

вторник, 21 мая 2013 г.

iNEXT IPTV

Меня продолжительное время донимала проблема доступа к системному диску моего мультимедийного устройства iNEXT 3D Kid с целью размещения на нём плейлиста IPTV моего интернет-провайдера Maximum.NET. Доступом через самба-сервер я когда-то смог разместить его там один раз. Потом сетевой диск исчез, я обновил прошивку до 9980 и один раз опять смог положить но после обновления он опять пропал и никакие мои эксперименты к успеху не приводили пока я, наконец, не обратился в поддержку.
Спасибо огромное Олегу Омельченко, который откликнутся и не только объяснил мне проблемы а также добавил поддержку IPTV моего провайдера в устройство с доступом через IPTV в главном меню. На мой вопрос почему этой информации нет на официальном сайте, Олег ответил, что программное обеспечение в стадии разработки, там всё меняется, поэтому промежуточные решения не выкладываются. Но я всё-таки решил поделиться этой информацией с вами.
Итак, проблемы и их решения:
  • Сетевой диск iNEXT не доступен через включенный самба-сервер. Решается подсоединением любого устройства памяти (диск или флешка) в USB коннектор, что позволяет включить самба-сервер, после чего вы сможете попасть в пункт назначения. Или просто используйте FTP как описано ниже.
  • При заходе через FTP вы попадаете в пустой пользовательский каталог вместо корневой структуры. Решается использованием рутового юзера root без пароля. Используйте именно эти аутентификационные данные вместо тех, которые у вас настроены в устройстве, что бы попасть в коренной каталог системного диска.
  • Вы не обнаружили поддержку IPTV вашего провайдера. Я лично не жаловался на это, но Олег по собственной инициативе, за что ему огромное спасибо, сделал для меня поддержку провайдера Maximum.NET, да заодно и себе в копилку, как я понимаю, добавил :) Так что, видимо, начиная со следующей прошивки она теперь будет поставляться. Ну а пока суть до дела и новой прошивки ещё нет - вот динамический плейлист, любезно сгенерированный Олегом (который будет вживую подкачиваться с сайта Maximum.NET), который надо разместить в системной папке "/data/other/IPTV" используя, например, вышеописанный доступ через FTP.
Для запуска просмотра IPTV, добавленного, как описано в последнем пункте:
  1. Запустить IPTV из приложений.
  2. Нажать ОK чтобы увидеть список каналов для плейлиста который запустился (это не обязательно будет нужный), не обращая внимания на возможные ошибки, возникающие при попытке использования плей-листа по-умолчанию.
  3. Нажимаем кнопку перемотки >> она над зеленой кнопкой и попадаем в список плейлистов (наборы).
  4. Кнопками LEFT и RIGHT листаем страницы в списке плейлистов. Для приаттаченного плейлиста выше будет не на первой странице и называется он Maximum.NET.list
  5. Выбираем нужный Вам плейлист и нажимаем OK, потом выбираем нужный Вам канал и нажимаем OK.
  6. Наслаждаемся просмотром.

пятница, 8 марта 2013 г.

Event Waiter

Needed a possibility to notify a thread about event occurred in anothre thread. Originally other attemps were made to organize the necessary approach inside that threads but then idea came up to use a separate object for this kind of synchronization and it finally came out as pretty intelegent light easy to read approach so good that I wanted to share it with you.

/**
 * Event Waiter object is to synchronize one or several threads with a thread-event originator</br>
 * Thread safe.</br>
 * Actors: event originator thread and one or more event waiter thread(s)</br>
 * Event Waiter thread(s) must call {@link #waitForEvent()} to wait for the Event to occur</br>
 * Event Originator thread must call {@link #eventOccurred()} to notify that the Event has been occurred</br>
 * If the Event has been occurred waiter thread(s) are not blocked on {@link #waitForEvent()} call</br>
 * If the Event has not been occurred yet waiter thread(s) are blocked on {@link #waitForEvent()} call until the Event has occurred</br>
 
 @author vtkachenko
 *
 */
public class EventWaiter {

  private boolean eventOccurred = false;

  /**
   * Once the event has been occurred this method should be called to notify that
   */
  public synchronized void eventOccurred() {
    eventOccurred = true;
    notifyAll();
  }

  /**
   * Method to wait for the event to occur
   @throws InterruptedException
   */
  public synchronized void waitForEvent() throws InterruptedException {
    if (!eventOccurred) {
      wait();
    }
  }
}

And usage example.

public class EventWaiterTest {
  
  private static void waitedFirstTest() {
    
    System.out.println("waitedFirstTest begin");
    
    final EventWaiter eventWaiter = new EventWaiter();
    
    Thread threadWithEvent = new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          Thread.sleep(1000);
        catch (InterruptedException e) {
          e.printStackTrace();
        }

        System.out.println("occurring the event...");
        eventWaiter.eventOccurred();
      }
    });
    threadWithEvent.start();
    
    try {
      System.out.println("waiting for the event...");
      eventWaiter.waitForEvent();
      System.out.println("event occurred");
    catch (InterruptedException e) {
      e.printStackTrace();
    }
    
    System.out.println("waitedFirstTest end");
  }
  
  private static void waitedLastTest() {
    
    System.out.println("waitedLastTest begin");
    
    final EventWaiter eventWaiter = new EventWaiter();
    
    Thread threadWithEvent = new Thread(new Runnable() {
      @Override
      public void run() {
        System.out.println("occurring the event...");
        eventWaiter.eventOccurred();
      }
    });
    threadWithEvent.start();

    try {
      Thread.sleep(1000);
    catch (InterruptedException e) {
      e.printStackTrace();
    }
    
    try {
      System.out.println("waiting for the event...");
      eventWaiter.waitForEvent();
      System.out.println("event occurred");
    catch (InterruptedException e) {
      e.printStackTrace();
    }
    
    System.out.println("waitedLastTest end");
  }

  /**
   @param args
   */
  public static void main(String[] args) {
    waitedFirstTest();
    waitedLastTest();
  }

}


Java HTML generated using Java2html