Jun 18, 2018 - arduino_fan

아두이노 선풍기 만들기

아두이노에 프로그래밍을 하기위해 아두이노 ide를 인스톨 해야 된다.

arduino ide download 여기에서 다운로드를 받아서 인스톨을 먼저해야된다.

호환보드는 ch340 driver를 인스톨해야 되는데 링크에서 인스톨 먼저 진행 하면 되겠다.

그다음에 아두이노 ide가 실행 되면 아래의 코드를 붙혀 넣고 업로드를 진행하면 된다. ^^


#include <Servo.h>

Servo myservo;
int dcmPin1 = 3;
int dcmPin2 = 11;
int servoPin = 13;

int POW_SW_Pin = 8;
int PAN_SW_Pin = 7;
int LV1_SW_Pin = 6;
int LV2_SW_Pin = 5;
int LV3_SW_Pin = 4;

int pos = 90;
int Dir_Servo = 0;
unsigned char dcmPower = 50;
int PAN_OnOff = 0;
int POW_OnOff = 0;
int POW_LEVEL = 1;

int Key_Data[10] = {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH};
int Key_Data_Before[10] = {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH};

void setup() {

  myservo.attach(servoPin);
  myservo.write(90);
  
  pinMode(POW_SW_Pin, INPUT);
  pinMode(PAN_SW_Pin, INPUT);
  pinMode(LV1_SW_Pin, INPUT);
  pinMode(LV2_SW_Pin, INPUT);
  pinMode(LV3_SW_Pin, INPUT);

  pinMode(dcmPin1, OUTPUT);
  pinMode(dcmPin2, OUTPUT);
  digitalWrite(dcmPin1, LOW);
  digitalWrite(dcmPin2, LOW);
  analogWrite(dcmPin1, 0);
  analogWrite(dcmPin2, 0);
  delay(1000);
}

void loop() {
    readKey();
  if (POW_OnOff == HIGH)
  {
    if (POW_LEVEL == 1 ) analogWrite(dcmPin2, 85);
    else if (POW_LEVEL == 2 ) analogWrite(dcmPin2, 175);
    else if (POW_LEVEL == 3 ) analogWrite(dcmPin2, 255);
    else;
    analogWrite(dcmPin1, 0);
    PAN_Control();
    delay(60);
  }
  else if (POW_OnOff == LOW)
  { 
    analogWrite(dcmPin1, 0);
    analogWrite(dcmPin2, 0);
    delay(100);
  }
  else;
}

void PAN_Control()
{
  if (PAN_OnOff == HIGH)
  {
    if (Dir_Servo == LOW)
    {
      if (pos < 150)
      {
        pos++;
        myservo.write(pos);
      }
      else Dir_Servo = HIGH;
    }
    else
    {
      if (pos > 30)
      {
        pos--;
        myservo.write(pos);
      }
      else Dir_Servo = LOW;
    }
  }
  else;
}

void readKey()
{
  for (int i = POW_SW_Pin; i >= LV3_SW_Pin; i--)
  {
    Key_Data[i] = digitalRead(i);
    if (Key_Data[i] == LOW && Key_Data[i] != Key_Data_Before[i])
    {
      Key_Data_Before[i] = Key_Data[i];
      if (i == POW_SW_Pin) {
        if (POW_OnOff == LOW) POW_OnOff = HIGH;
        else POW_OnOff = LOW;
      }
      else if (i == PAN_SW_Pin) {
        if (PAN_OnOff == LOW) PAN_OnOff = HIGH;
        else PAN_OnOff = LOW;
      }
      else if (i == LV1_SW_Pin) POW_LEVEL = 1;
      else if (i == LV2_SW_Pin) POW_LEVEL = 2;
      else if (i == LV3_SW_Pin) POW_LEVEL = 3;
      else;
      delay(200);
    }
    else if (Key_Data[i] == HIGH && Key_Data[i] != Key_Data_Before[i])
    {
      Key_Data_Before[i] = Key_Data[i];
    }
    else;
  }
}



참조


Jun 14, 2018 - intellij_failed_to_create_a_child_event_loop

intellij idea failed to create a child event loop

일단 회사 인턴분 PC에서 java 클래스를 하나 생성시켜서 main을 만들고 hello world를 찍을려고 하는데


Error: Failed to create a child event loop

위에 에러 메시지가 보임 해당 에러를 검색하니 아래의 쓰레드가 나옴

봤는데 바이러스 프로그램 문제인가 해서 에러가 왜 나는지 로그 파일을 확인해봄

인텔리 제이 로그 파일 경로를 몰라서 제일 처음엔 인스톨한 폴더로 들어감 그담에 아래 파일을 확인


C:\Program Files\JetBrains\IntelliJ IDEA 2018.1.2\bin\idea.properties

-----------------------------------------


#---------------------------------------------------------------------
# Uncomment this option if you want to customize path to IDE system folder. Make sure you're using forward slashes.
#---------------------------------------------------------------------
# idea.system.path=${user.home}/.IntelliJIdea/system

#---------------------------------------------------------------------
# Uncomment this option if you want to customize path to user installed plugins folder. Make sure you're using forward slashes.
#---------------------------------------------------------------------
# idea.plugins.path=${idea.config.path}/plugins

#---------------------------------------------------------------------
# Uncomment this option if you want to customize path to IDE logs folder. Make sure you're using forward slashes.
#---------------------------------------------------------------------
# idea.log.path=${idea.system.path}/log

위에처럼 시스템 path 아래의 로그 폴더가 존재함 들어가서 로그 확인


2018-06-14 17:23:24,497 [  31074]   INFO - rains.ide.BuiltInServerManager - failed to create a child event loop 
java.lang.IllegalStateException: failed to create a child event loop
	at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:88)
	at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:58)
	at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:47)
	at io.netty.channel.MultithreadEventLoopGroup.<init>(MultithreadEventLoopGroup.java:59)
	at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:77)
	at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:72)
	at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:59)
	at com.intellij.util.io.NettyKt.MultiThreadEventLoopGroup(netty.kt:311)
	at org.jetbrains.io.BuiltInServer.start(BuiltInServer.java:73)
	at org.jetbrains.ide.BuiltInServerManagerImpl.lambda$startServerInPooledThread$0(BuiltInServerManagerImpl.java:101)
	at com.intellij.openapi.application.impl.ApplicationImpl$1.run(ApplicationImpl.java:310)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
Caused by: io.netty.channel.ChannelException: failed to open a new selector
	at io.netty.channel.nio.NioEventLoop.openSelector(NioEventLoop.java:177)
	at io.netty.channel.nio.NioEventLoop.<init>(NioEventLoop.java:151)
	at io.netty.channel.nio.NioEventLoopGroup.newChild(NioEventLoopGroup.java:127)
	at io.netty.channel.nio.NioEventLoopGroup.newChild(NioEventLoopGroup.java:36)
	at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:84)
	... 15 more
Caused by: java.io.IOException: Unable to establish loopback connection
	at sun.nio.ch.PipeImpl$Initializer.run(PipeImpl.java:94)
	at sun.nio.ch.PipeImpl$Initializer.run(PipeImpl.java:61)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.nio.ch.PipeImpl.<init>(PipeImpl.java:171)
	at sun.nio.ch.SelectorProviderImpl.openPipe(SelectorProviderImpl.java:50)
	at java.nio.channels.Pipe.open(Pipe.java:155)
	at sun.nio.ch.WindowsSelectorImpl.<init>(WindowsSelectorImpl.java:127)
	at sun.nio.ch.WindowsSelectorProvider.openSelector(WindowsSelectorProvider.java:44)
	at io.netty.channel.nio.NioEventLoop.openSelector(NioEventLoop.java:175)
	... 19 more
Caused by: java.net.ConnectException: Connection refused: connect
	at sun.nio.ch.Net.$$YJP$$connect0(Native Method)
	at sun.nio.ch.Net.connect0(Net.java)
	at sun.nio.ch.Net.connect(Net.java:454)
	at sun.nio.ch.Net.connect(Net.java:446)
	at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:648)
	at java.nio.channels.SocketChannel.open(SocketChannel.java:189)
	at sun.nio.ch.PipeImpl$Initializer$LoopbackConnector.run(PipeImpl.java:127)
	at sun.nio.ch.PipeImpl$Initializer.run(PipeImpl.java:76)
	... 27 more

위에처럼 에러가 나고 있음 위에처럼 rains.ide.BuiltInServerManager를 어떤것이 사용하는지 정상 로그에서 확인


2018-06-14 16:50:25,889 [  10884]   INFO - rains.ide.BuiltInServerManager - built-in server started, port 63343 

정상일때 로그에서는 built-in server에서 사용한다고 함 해당 서버에 대한 설명은 아래 참조를 확인

그래서 소켓에러가 나길래 서버가 그럼 기동중인지도 확인함

netstat -na 

실행중이지 않음 에러가 났으니 당연한건가 그래서 이상해서 전체 서비스가 꼬였는지 확인 인텔리 제이 파일을 전체 삭제후 재설치

에러남 그래서 백신을 확인 백신에서 방화벽이랑 셋팅이 안됨 그래서 백신을 업데이트 하고 다시 인텔리제이를 설치후 실행 정상적임

결론적으로는 백신이 문제였던것 같음 ㅡㅡ avast 잊지 않겠다. ㅋ

참조


Jun 12, 2018 - codespitz_73_part6

코드스피츠73 part6

generator, promise, async/await

generator

breaking block


const infinity=(function*(){
    let i = 0;
    while(true) 
        yield i++;
})();

console.log(infinity.next());
....
console.log(infinity.next());

time slicing manual


const looper =(n, f, slice = 3)=>{
	let limit = 0, i = 0;
		const runner=_=>{
			while(i < n){
				if(limit++ < slice) f(i++);
				else{
					limit = 0;
					requestAnimationFrame(runner);
					break;
					}
			}
		};
		requestAnimationFrame(runner);
};

looper(12, console.log);

위에 로직을 generator 변경


const loop = function*(n, f, slice = 3)=>{
	let limit = 0, i = 0;
        while(i < n){
            if(limit++ < slice) f(i++);
            else{
                limit = 0;
                yleid;
                }
        }
};

const executor =iter =>{
    const runner =_=>{
        iter.next();
        requestAnimationFrame(runner);
    };
    requestAnimationFrame(runner);
};

executor(loop(10, console.log));

로직과 알고리즘의 분리가 가능

generator + async + executor

yleid는 값을 받아들이거나 출력할수 있다.


const profile = function*(end, next, r){
    const userid = yield $.post('member.php', {r}, next);
    let added = yield $.post('detail.php', {userid}, next);
    added = added.split(",");
    end({userid, nick:added[0], thumb:added[1]});
};

const executor = (end, gene, ...arg)=>{
    const next =v=> iter.next(v);
    const iter = gene(end, next,...arg);
    iter.next();
};

executor(console.log, profile, 123);

위에 로직은 콜백지옥을 탈출 목표

비동기를 동기식으로 보이게 하기 위해

promise

passive async control

콜백을 보낼수는 있지만 언제올지는 모른다.

콜백은 순서에 관계가 있게 개발해야 되나?(순서 없는쪽으로 가야된다.)


$.post(url, data, e=>{
    //언제올까
});

왜언제가중요한가?


let result;

$.post(url1, data1, v=>{
    result = v;
});

$.post(url2, data2, v=>{
    result.nick = v.nick;
    report(result);
});

콜백 제어는 순서를 모르는것이 죄악 ㅜㅜ

active async control

프라미스는 then을 호출해야 결과를 얻는다.


let result;

const promise = new Promise(r=>$.post(url1, data1, r));
promise.then(v=>{result = v;});

const promise1 = new Promise(r=>$.post(url1, data1, r));
const promise2 = new Promise(r=>$.post(url2, data2, r));

promise1.then(result=>{
    promise2.then(v=>{
        result.nick = v.nick;
        report(result);
    });
});

generator + promise


const profile = function*(end, r){
    const userid = yield new Promise(res=>$.post('member.php', {r}, res));
    let added = yield new Promise(res=>$.post('detail.php', {userid}, res));
    added = added.split(",");
    end({userid, nick:added[0], thumb:added[1]});
};

const executor = (gene, end, ...arg)=>{
    const iter = gene(end, ...arg);
    const next = ({value, done}) =>{
        if(!done) 
            value.then(v=>next(iter.next(v)));
    };
    next(iter.next());
};

executor(profile, console.log, 123);

async await

await promise = sync


const profile = async function(end, r){
    const userid = await new Promise(res=>$.post('member.php', {r}, res));
    let added = await new Promise(res=>$.post('detail.php', {userid}, res));
    added = added.split(",");
    end({userid, nick:added[0], thumb:added[1]});
};

profile(console.log, 123);


참조