• Возможно ли создать линейную сеть из RF репитеров (Daisy Chain)?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    Ну если модуль действительно репитер, то обо всем позаботились уже до вас. Что из себя представляет конкретно этот модуль неясно. Действительно существуют трансмиттеры с ячеистой топологией сети, но я что то сомневаюсь что это такой.
    Два соседних репитера ничего не "заглушат" - это же не тупой передатчик - это упрощенное сетевое устройство, просто на проприетарном протоколе, данные ходят пакетами, идет контроль за доступностью среды передачи, есть свой сетевой адрес, вероятно, и отработка коллизий есть и т.д.

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

    В любом случае задержки будут заметными... К чему так извращаться=\
    Ответ написан
    3 комментария
  • Видны все пользователи провайдера в доме. В чем проблема сети?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    А в чем проблема то? Что удивительного в локальной сети?
    Наверно на своем роутере не включили службы NAT и DCHP вот локальный IP адрес для ПК получили от выше стоящего роутера, тем самым попав в одну подсеть, вот винда и показала остальных, либо сами себе назначили IP - кто знает что там у вас и у вашего провайдера.. Интернет работает - вот и хорошо.
    Ответ написан
  • Чем передать сигнал на Arduino за 150м?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    Взять пару радио трансмиттеров на 433-470мгц для обхода проблемы преград типа таких www.aliexpress.com/item/2pcs-SI4432-1000m-Wireless...
    Ответ написан
    2 комментария
  • Почему из сдвигового регистра получился датчик присутствия?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    Вероятно входы Reset- MR и/или Enable- OE не подключили, и пока они висят в воздухе ловят помехи, включая-выключая чип и сбрасывая его. И керамический конденсатор, который уже советовали, паять максимально близко к выводам микросхемы.
    6243b847edd44b8fb439a33d989cc871.png
    Ответ написан
  • Как правильно отлаживать JS?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    Не знаю как Вы можете давно работать с JS и не уметь пользоваться консолью, без консоли там делать нечего, разве что дергать блоки через Jquery.
    если неправильно указан DOM-элемент, как это узнать

    $('#content').on('click' ,'#singleclick', function () {
    debugger;
    var product = $(this).parents('.product-block');
    $('#product_name').val(product.find('.product-action .name a').text());
    $('#product_price').val(product.find('.product-action .price').text());
    $('#singleclick_title').text(product.find('.product-action .name a').text());
    });

    Да как и всегда- ставить брейкпоинт любым способом и пошагово, с возвратом, выполнить функции с цепочки и смотреть какой результат они возвращают, в случае с JQ смотреть что будет находится в массиве выборки элементов - не пустой ли массив например, значит селектор не отработал или что еще.
    Вообщем, нужно сначала почитать статьи, благо их хватает на эту тему, а потом уже разбираться с конкретным случаем.
    Ответ написан
    Комментировать
  • Как вывести массив с атрибутом title?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    Потому что attr работает только с первым элементом в коллекции.

    var links = $('.ofice a[title]').map(function(){
               return $(this).attr('title');
           });


    Для общего кругозора - на чистом тоже самое выглядело бы так
    var links = Array.prototype.map.call(document.querySelectorAll('.ofice a[title]'),function(el){
      return el.getAttribute('title');
    });
    Ответ написан
    1 комментарий
  • Как российскому айтишнику уехать жить и работать в Украину?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    Девочка 23 года=\? Думаю, если Вы девушка - проблем не должно быть, разве что Вы- разведчик-frontender под прикрытием с гранатометом в сумке ноутбука=)
    Тоже терзают смутные сомнения насчет замысла этого вопроса, ибо таких 100 уже видел на ответах мейл ру и, честно признаться, пола топикстартера.

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

    1) насчет национальности - всем без разницы что работодателю, что коллективу, дело в человеке+его склиллах, а не в том какой он национальности, и да немало кто говорит на русском и немало тех кто заговорят с Вами на русском, коль придется.
    2) с учетом пола - проблем не будет.

    Насчет "украинцы заполонили upwork- все торба ИТ" - ну, что ж, там всегда немало их + многие парни чтоб не рисковать, уходят во фриланс на время, чтоб повестку на работу не принесли - отсюда и повышенная активность на биржах.
    Ответ написан
    Комментировать
  • Как происходит проверка времени нажатия кнопки?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    Делается программный таймер, аппаратный таймер и аппаратные внешние прерывания только под кнопку отдавать это мягко говоря нерационально.
    В одном аппаратном таймере обновляются все программные таймеры, которые могут быть использованы для чего угодно.
    Значит заводим программный таймер для опроса кнопки, например с тиком каждые 100мс и переменную-счетчик. Далее проверяем в нем если кнопка нажата и если счетчик меньше 30 то инкрементируем его, иначе ставим флаг об удержании и выполняем функцию которая должна выполнятся при удержании ее. Если кнопка не нажата - сбрасываем счетчик и флаг удержания.
    Псевдокод:
    u08 buttonCounter=0;
      u08 buttonHold=0;
    
      u16 Timers[1]={0};//массив счетчиков программных таймеров
    
      interupt HardwareTimer1(){//прерывание аппаратного таймера каждые 25мс
            if(Timers[0]++==4){//  100мс/25мс=4 раза
                Timers[0]=0;
                onProgTimer1();
            }
      }
     
      void onProgTimer1(){//этот программный таймер тикает каждые 100ms
          if(button1==PRESSED){
                 onButton1Press();//функционал когда кнопку нажали
    
                if(buttonCounter<30){//ждем пока счетчик досчитает до 30 - 100мс*30 раз=3000мс=3 сек
                    buttonCounter++;
                }else{
                    if(buttonHold==0){
                        buttonHold=1;//Ставим флаг удержания кнопки
                        onButton1Hold();//выполняем функционал при удержании
                    }
                }
          }else{
                buttonCounter=0;//сбрасываем таймер-счетчик
                onButton1Release(buttonHold);//функционал когда кнопку отпустили
                buttonHold=0;//сбрасываем флаг удержания кнопки
          }
      }
    Ответ написан
    6 комментариев
  • Как правильно выполнить mouseout в меню?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    Ну так эти события ж всплывают, проверяйте event.target == sidebar ли он... тогда уж закрывайте..
    Ответ написан
  • JavaScript, уменьшение числа до 0 за промежуток времени?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    Можно так:
    /**
            *
            * @param duration - продолжительность работы таймера
            * @param interval - время тика таймера
            * @param from     - начальное значение
            * @param to       - конечное значение
            * @param minStep  - минимальный шаг вызова callback
            * @param callback - обработчик
            */
    
           function timer(duration,interval,from,to,minStep,callback){
               var value=from,
                   forward=(from<to),
                   range=Math.abs(to-from),
                   steps=duration/interval,
                   step=range/steps,
                   last=from,
    
                   handle=setInterval(function(){
                       value+=step*(forward?1:-1);
    
                       if(forward?value>to:value<to){
                           value=to;
                           clearInterval(handle);
                           handle=null;
                       }
    
                       if(!minStep||!handle||Math.abs(last-value)>=minStep){
                           last=value;
                           callback(value,from,to);
                       }
                   }
               ,interval);
               
               return handle;
           }
    
    
           timer(800,20,50,0,1,function(value){
               console.warn(Math.floor(value));
           })
    Ответ написан
    Комментировать
  • Чат на сайте без JavaScript?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    И чего сегодня только не прочитаешь=)
    Функционал чата таков: текстовое и видео общение. Проблема, собственно в том, что я не знаю JavaScript, а найти и впаять хороший чат не получается.

    Звучит примерно - как построить ядерный реактор, если я не знаю таблицы умножения, а готовый найти не удается.

    Ну тут 3 выхода:
    - учить JS и явно не месяц
    - продолжать искать=)
    - нанять человека JS Developer'a + NodeJS

    Websocket это сетевой API для JS. Понимаете как звучит "Websocket без JS"? =)

    О, это я еще не прочитал :
    Пользователей будет около 5-10 миллионов

    10 млн и Вы собрались как то сделать FrontEnd'овый продукт без JS? =)) Вы хоть представляете какие это нагрузки и с чем их едят?
    Ответ написан
    8 комментариев
  • Как определить событие вызова функции?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    Месье знает толк...
    Тут явно что то не то, но все же можно , но не нужно, что то наподобие этого:
    var test=function(){
    
               this.enable = false;
    
               this.protectedFunc1=function(){
                    console.warn('Protected func1 called!');
               }
    
               this.protectMethod=function(fn){
                   var self=this,
                       fn;
    
                   if(typeof fn!=='function'){
                       throw TypeError('Given thing is not a function!');
                   }
    
    
                   return function(){
    
                       console.log(self.enable);
    
                       if(!self.enable){
                           throw Error('Access to protected method not allowed');
                       }
    
                       return fn.apply(self,arguments);
                   };
               }
    
               this.protectedFunc1=this.protectMethod(this.protectedFunc1);
    
               this.protectedFunc2=this.protectMethod(function(args){
                   console.warn('Protected func1 called!');
               })
    
    
           }
    
    
           var obj=new test;
    
           obj.enable=true;
           obj.protectedFunc1(); //Protected func1 called!
    
           obj.enable=false;
           obj.protectedFunc1();// Error: Access to protected method not allowed
    Ответ написан
  • Как работают неинвазивные датчики тока?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    типа acs712? обычный датчик хола с усилителем. На выходе напряжение смещенное на 1/2 U питания и зависит линейно от тока . 10$? Они по доллару с небольшим на aliexpress

    Первый попавшийся продавец за 5 штук 7$ www.aliexpress.com/item/NEW-20A-Hall-Current-Senso...

    Если по старинке на трансформаторе тока(www.aliexpress.com/item/Non-invasive-Split-Core-Cu...), то на выходе тоже самое, но может быть как относительно 0 выход так и относительно 1/2U питания - зависит от модуля
    Ответ написан
  • Как влияет прототип на потребление памяти в JS?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    КЭП подтверждает: хранение общих свойств в прототипе экономит память=)
    А на вопрос сколько- ответит профайлинг консоли, хотя это не важно.
    Ответ написан
    Комментировать
  • Как реализовать передачу данных с одного МК на другой через Интернет?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    Зачем тут web сервер? простой TCP, но все ровно надо будет разбираться со стеком IP.
    Еще нужно учесть, что IP в мобильных сетях серые, т.е к нему не подключится с Интернета, правда как дополнительная услуга часто предоставляется белый IP, но, кажется, только в 3G сетях.
    Возможно, проще будет сервер разместить на обычном хостинге, а клиенты - мк через него чтоб обмен вели.
    Ну а вместо модема - готовый GSM модуль. очень дешево.
    www.aliexpress.com/wholesale?catId=0&initiative_id...

    Если нужна видео трансляция, то о GPRS забудьте. Это к 3G.
    Ответ написан
    3 комментария
  • Как не заплыть жиром, работая удаленно программистом?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    А разве не проще не работать удаленно, ходить на работу пешком, или, как некоторые, не спеша на велосипеде? Разве выигрыш в $ стоит тех проблем?
    Подсев на уделёнку можно и не заметить, как ты весь день будешь небритым, в трусах и с гнездом на голове сидеть за компом и, смотря на третьем мониторе south park, долбить код=)) Офис, как ни как, держит тебя в рамках, особенно, если там будет отдел manual тестировщиц, стратегически заготовленный работодателем=)
    Ответ написан
  • Студент и Низкоуровневое программирование?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    ИМХО к сожалению, состояние нашей промышленности не способствует созданию таких рабочих мест, где широко нужны программисты "железячники". Если сравнивать с прикладными+веб, то их можно считать что и нету. Увы.
    Сам я тоже должен быть железячником по образованию, все с паяльниками сидел, но еще после школы понял что скорее всего это останется занятием для души бумажки о ВО, а основным, как и все, упорно заняться прикладным, через пару лет дошло что лучше веб. Просто не в том месте или не в то время я родился=) Писать даже индуский код на том же php для "забугра" в разы выгоднее.
    Вообщем себе рисовал картину так - минусы железячника:
    - производство стоит, отсталое
    - маленькое количество рабочих мест
    - относительно низкая ЗП, в несколько раз меньше по сравнению с другими
    - работа на внутренний рынок
    - сложное освоение, большие затраты на покупку демо-железяк
    - привязанность к конкретному месту производства
    - устроится сложно, работа часто "по блату"
    - сам один ты в поле не воин, ты не напишешь крутую прошивку, скажем умного дома, под устройство которого нет, сам не запустишь производство, сам не продашь... как бы этого не хотелось... разве что kickstarter=) и то команда нужна серьезная чтоб создать свое маленькое дело
    - там где есть хоть какое то производство -ужасная экология, жить в индустриальном районе не хочется, ну это так - придирки
    - мало шансов свалить в "загнивающийзапад" по рабочей визе

    Конечно, есть яркие исключения, но в основной массе оно примерно так...

    Может получиться как у меня - отучился на железячника, а все ровно параллельно сам учил прикладное и веб- круть, теперь я web dev с никому ненужными навыками программиста мк, системотехника и архитектора сетей=))
    Вообщем хорошенько еще подумайте=)
    Если бы у меня была машина времени- я бы вообще вернулся на 10 лет назад и сказал бы себе - "харе кодить, забей - сиди на лавке пей пиво, через 10 лет будешь ручным тестированием заниматься - там за месяц буш готов, мозг береги"=)))
    Ответ написан
    3 комментария
  • Как заставить 'reduce' изменять 'this' а не возвращать новый объект?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    var beers=[1,{locale:'domestic'},5,6,{locale:'domestic'},0,{locale:'domestic'}];
    
           beers.reduceBeers = function () {
    
               var stack=[];
    
               this.forEach(function(item,index){
                   if (item.locale === 'domestic') {
                       stack.push(item);
                   }
               });
    
               this.length = 0;//empty an Array;
    
               this.push.apply(this,stack);
    
               return this;
           };
    
           beers.reduceBeers();


    Насчет целесообразности reduce терзают смутные сомнения ... Хотя можете запихать в stack что хотите, все что в stack будет добавлено в "this". Тоже самое:
    beers.reduceBeers = function () {
    
               var stack=this.filter(function(item,index){
                    return item.locale === 'domestic';
               })
    
               this.length = 0;//empty an Array;
               this.push.apply(this,stack);
               return this;
           };
    Ответ написан
    1 комментарий
  • Как скрыть список вне блока?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    Уже отвечал на такой вопрос - там было на чистом JS - так что есть желание - переделаете
    jsfiddle.net/awtb35om
    Ответ написан
    1 комментарий
  • Как сделать повторное изменение стиля при нажатии кнопки?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    В лоб:
    function myFunc(){
               var el=document.getElementById('tt2'),
                   str=el.style.transform,
                   translate=(/translate\((\S+?),\s(\S+?)\)/i.exec(str)||[0,0]),
                   translateX=parseInt(translate[1]); //-66.6%
    
               translateX+=33.3;
    
               console.log(translateX);
    
               el.style.transform = "translate(" +translateX+"%,0)";
           }


    Вообщем, пытаться с того кода что то слепить у меня выдержки не хватило :
    codepen.io/anon/pen/XbxEwX
    <div id="tt2" class="slider">
      <div><div>Digital</div><div>Brain</div><div>created</div><div>this</div></div>
    </div>
    
    
    <button onclick="slider.prev();">Prev</button>
    <button onclick="slider.next();">Next</button>


    .slider{
                width:30%;
                height:100px;
                background-color: green;
                overflow: hidden;
                position: relative;
            }
    
            .slider>div{
                display: inline-block;
                height:100%;
                white-space: nowrap;
                position: relative;
                width:100%;
                padding: 0;
                -webkit-transition: all 1s cubic-bezier(0.5, 0, 0.5, 1);
            }
    
            .slider>div>div{
                display: inline-block;
                width:100%;
                height:100%;
                text-align:center;
                margin: 0;
            }


    function Slider(el){
               var $el=(typeof el=="string")?document.getElementById(el):el,
                   content=$el.getElementsByTagName('div')[0],
                   sliders=content.getElementsByTagName('div'),
                   count=sliders.length,
                   width=content.offsetWidth,
                   step=width/count;
    
    
    
               this.index=0;
    
               function setTX(value){
                   content.style.transform = "translate(" +value+"%,0)";
               }
    
               this.showIndex=function(index){
                   console.info(index);
                   var max=count-1;
                   if(index>max){
                       index=0;
                   }else if(index<0){
                       index=max;
                   }
    
                   console.log('index=',index,max);
    
                   this.index=index;
    
                   setTX(index*(-100));
               }
    
               this.next=function(){
                   console.log('next');
                   this.showIndex(++this.index)
               }
    
               this.prev=function(){
                   console.log('prev');
                   this.showIndex(--this.index)
               }
    
           }
    
           var slider=new Slider("tt2");
    Ответ написан
    5 комментариев