пятница, 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

пятница, 20 июля 2012 г.

Маразмы месяца : НОВОСТИ В ФОТОГРАФИЯХ

Давно, очень давно я последний раз перепостил прикол в блог, только в ленту обычно на социалке, НО ЭТО ДОСТОЙНО остаться в блоге!
Маразмы месяца : НОВОСТИ В ФОТОГРАФИЯХ

понедельник, 16 июля 2012 г.

Simple value assignment in BPEL

I've spent a lot of time on a problem when we need to assign just simple value to the tag body which has some attributes already assigned before. E.g. we have some variable varOut which contains the following structure:

<complexStructure>
  <complexValue someAttr="someAttrValue"></complexValue>
</complexStructure>

To assign some value from the variable varWithSimpleValue to the complexValue tag body now we might want to make a following copy procedure:

<assign name="someName">
  <copy>
    <from variable="varWithSimpleValue"/>
    <to variable="varOut" query="/complexStructure/complexValue"/>
  </copy>
</assign>

But BPEL treats source anyway as a complex structure regardles which type is used to define it, let it be even xsd:string and as a result of this operation the whole complex destination (complexValue with its children which are its attributes for the given example) is replaced thus someAttr will be lost. To solve the problem we can use string function which converts object to simple value and have a copy made like this:

<assign name="someName">
  <copy>
    <from expression="string(bpws:getVariableData(varWithSimpleValue))"/>
    <to variable="varOut" query="/complexStructure/complexValue"/>
  </copy>
</assign>

And better and more logical solution is to use text function for the destination to specify that we are selecting complexValue's simple text content not the whole structure:

<assign name="someName">
  <copy>
    <from variable="varWithSimpleValue"/>
    <to variable="varOut" query="/complexStructure/complexValue/text()"/>
  </copy>
</assign>

Originally the problem appeared with JBPM 3.2 but I believe other BPEL implementation should behave similarly.

вторник, 21 февраля 2012 г.

Our company Serena is IT Innovator of the year!

Yahoo!!!

The company I'm currently working in, Serena Software, is the Pink Elephant 2011 Innovator of the Year!!!
Here is our baby :)

Another news about that on PR-Web

пятница, 13 января 2012 г.

Deadline

Dedicated to IT... What does deadline mean for us :)