Let’s go!

  • 중국경제 추락에 대비하라

    중국경제 추락에 대비하라

    중국경제 추락에 대비하라
    isbn : 8952220684

    얼마전에 이진우의 경제콘서트에서 김기수 박사가 강의를 했는데, 몇년후 중국 경제가 추락한다는 내용이었다. 지금도 상당히 그 징조가 보이는데, 그 주장이 상당히 맞아 보인다. 주장이 맞고 틀리고가 아니라, 몇가지 원칙을 제시해서 왜 추락하는지를 설명했는데, 상당히 매력적이었다. 이에 반해서 관련된 책을 찾아 보았는데 이 책이었다. 2012년에 출판했고, 이때에는 아무도 사지 않았다고 한다. 목차를 정리하면 아래와 같다.

    1장 과학과 기술 없는 경제성장은 없다.
    2장 중국경제가 성장한 비결과 그 한계는?
    3장 기술ㆍ제도가 취약한 중국경제가 강해질 수는 없다.
    4장 중국의 경제정책 역시 경제를 왜곡시켰다.
    5장 중국정치의 왜곡은 더 큰 문제다.

    요약하면 아래와 같다. 경제 성장을 위해서는 원천기술 발명, 사회적 제도가 필수적이다. 산업혁명이 왜 유럽에서 시작했는지도 위의 기준으로 설명할 수 있다. 중세 유럽은 아시아에 비해서 중앙정부의 권력이 약했다. 교권이 이를 대신하고 있었다. 교권이 약해지면서 국민들이 국가를 상대로 딜이 가능했고 군주가 국민의 눈치를 보는 상황이었다. 이런 상태로 상당히 지속되었고, 사유권 보장, 자유로운 기술 개발이 개인에 의해서 실행되었다. 천재들이 나오면서 유럽의 국가들은 산업혁명이 발생했다. 이 상태로 지금까지 지속 되엇다.

    이에 비해 과거 고속성장을 경험한 일본, 동아시아 국가들은 이런 과정을 거치지 않았다. 원천기술은 없고, 생산성 향상으로으로 국가의 부를 증가시켰다. 이런 방식으로는 한계가 있다. 현재 일본이 저성장인 이유가 이 때문이다. 과거 선진국들이 몇백년이 걸린 성장을 몇십년으로 압축하려다 보니, 사회적 분위기, 기반, 기초 체력이 이를 따라주지 못한다. 이런 것들이 국가 경쟁력인것 같다.

    과거 중국은 외국 자본의 투입으로 고속성장을 했다. 중국이 가지고 있는 원천기술은 없고, 투입된 자본역시 그 효과가 약해지므로, 경제성장률이 낮아지고 있다. 지속적인 경제 성장을 위해서는 자본을 투입해서는 안되고 시장에 맡겨야 한다. 이렇게 하기 위해서는 인민들에게 부를 분배해줘야한다. 그러나 현재는 공산당의 소수에게 권련과 부가 집중되어 있다. 이렇기때문에, 향후 중국경제는 충격을 받을 것이란 내용이다.

    산업혁명이 왜 유럽에서 시작되었는지, 왜 동아시아는 과거 엄청났는데 지금 이상황인가를 경제의 시점에서 설명해 준 좋은 책이다. 몇가지 기준을 과거와 지금에 적용해보고 이를 깔끔하게 설명해주어 나의 궁금증을 해소시켜 준 책이다.

    한국은 과거 기적이라 불리는 일을 해냈다. 경제 발전 후 민주화..역사적으로 이런 나라가 없다고 한다. 지금 저성장에 허덕이는데 이런 상태는 당연한 것이라 봐야 한다. 옆의 일본도 20년간 저성장을 했는데 이 단계를 넘어서는 것 자체가 어렵기 때문이라 보인다. 중진국에서 선진국으로 도약하기 위해서는 투명한 시장이 필요하다. 객관적인 법 집행이 이를 보장할 것이다. 또한 국민들의 잠재 능력도 필요하다. 현재 소위 갑질이라 불리는 행태를 보면, 한국의 일반 대중들은 개, 돼지라 불려도 별로 할말이 없어 보인다. 원천기술 습득을 위한 개인의 자유로운 연구과제 선택도 필요하다. 연구자들이 뭔가 새로운 연구를 하려고 하면, 해본 경험이 없기때문에 예산을 안준다는데, 정부의 행태가 많이 심각해 보인다. 이런 상태로 한 백년은 있어야 지속 가능한 경제성장이 가능해 보인다. 지금 선진국도 몇백년이 걸렸기 때문에 우리도 아마 이런 시간이 필요해 보인다.

  • 해우재

    해우재

    Sorry you have no rights to view this post!

  • Lego 조립 설명서

    Lego 조립 설명서

    Lego City 60022 Cargo Terminal

    index
    1번
    2번
    3번
    4번


     

     

    Lego City 60060 Auto Transporter
    60060-0000-XX-12-1
    1번
    2번
    3번


     

     

    Lego City 60083 Snowplow Truck
    60083-0000-XX-12-1
    1번

    Lego City 60042 HighSpeed Police Chase City Police
    60042-0000-XX-12-1
    1번


     

     

    Lego City 60043 Prisoner Transporter
    60043-0000-XX-12-1

    1번


     

     

    Lego City 60001 Fire Chief Car
    60001-0000-XX-12-1
    1번


     

     

    Lego Mindstorm EV3 31313
    index
    기본 메뉴얼


     

     

     

     

     

    Lego Mindstorm NXT 8527
    NXT1-8527Box
    기본 메뉴얼


    Lego Technic 42007 MotoCross Bike
    42007-0000-XX-12-1
    1번
    2번


     

     

    10507 My First Train Set DUPLO Town
    10507-0000-XX-12-1

    1번


     

     

    10506 Train Accessory Set DUPLO Town
    10506-0000-XX-12-1

    1번


     

     

     

     

    많이도 샀네..

  • HSM을 활용한 레고 장난감 만들기

    HSM을 활용한 레고 장난감 만들기

    기억하기 위해서 기록해 놓음..

    처음 다이어그램인데..수정.
    12113378_1289445931071053_7620380557359358782_o

    수정 다이어그램은 아래와 같다.
    20160908_225320

    기존 대비 S11을 지워 버렸다. S10에서 S11로 transiton이 발생할 때, 모터 동작이 끝나기 때문에 굳이 S11을 만들 필요가 없다. self transition으로 처리했다. state machine을 내가 제대로 이해하고 있는지 모르겠으나..

    S13에서도 self transition을 추가 했는데, 회전 동작시 장애물을 완전하게 피했는지를 확인하기 위해서이다. S13에서 이벤트를 다시 한번 확인하고, 장애물에 걸리면 전진동작 없이 회피 동작을 하도록 했다.

    가장 고민했던 부분은 S0은 event driven program이고 S1은 data driven program 방식으로 접근해야 할 것 같은데, 모든 ir센서로 읽어 들이는 모든 데이터를 event로 분류하기가 힘들었다. 이벤트로 설정하려면 배타적 관계도 확인해 봐야 하는데, 버튼 눌림여부 * 버퍼의 수치별 이벤트를 한개의 event로 처리하려면 경우의 수가 너무 많았다. 쿨하게 evnet는 아래와 같이 몇가지 경우만 잡았다. 나머지는 S1에 들어갔으므로 대략 무시하기로 했다.

    package hsm;
    
    import lejos.hardware.Button;
    
    public class Event {
    	  
    	  public enum mEvent {EnterPressed,DownPressed,GapIsWide,GapIsNarrow,Nothing};
    	  
    	  //Ir센서를 읽기 위한 부분..
    	  private float irValue;
    	  
    	  public Event(float tmp){
    		  this.irValue = tmp;
    	  }
    	 /* 
    	  public void setEventBuffer(float value){
    		  this.irValue = value;
    	  }
    	  */
    	  
    	  public mEvent getID(){
    		  
    		  mEvent thisEvent = mEvent.Nothing;
    		  
    		  //버퍼에서 데이터를 읽어 들임 
    
    		  if(Button.ENTER.isDown() == true)
    			  return mEvent.EnterPressed;
    
    		  if(Button.DOWN.isDown() == true)
    			  return mEvent.DownPressed;
    		  
    		  if(irValue > 10)
    		  	return mEvent.GapIsWide;
    		  
    		  if(irValue <= 10)
    			  return mEvent.GapIsNarrow;
    		 		  
    		  return thisEvent;
    	  }
    	  
    	  
    
    
    }

    일단 S1에 들어가면, irRead -> ir 버퍼 가공 -> 모터 동작의 방식으로 처리했는데, 이 방법도 좋지 않았다. 각 state별 process가 다른데, thread로 돌리면 이를 구분할 수 없게 된다. 따라서 아래와 같이 수정했다.

    S10,S13에서만 irRead 동작, S10,S12,S13에서는 모터 동작, 각 transition에 따른 버퍼값 수정..

    S0에서는 버튼이 눌림만 감시하기 때문에 event driven programming으로 접근했다.

    hsm의 c++ -> java 이식은 인터넷의 코드를 그대로 사용했다.
    hsm의 구조는 대략 아래와 같다.

    package hsm;
    
    import mypackage.IrBufferv2;
    import mypackage.MotorData;
    
    public class myHsmForLego extends Hsm{
    	private MotorData mMotorData;
    	
    	Runnable myIrRun;
    	Runnable myMotorRun;
    	Runnable myProcessRun;
    
    	
    
    
    	public myHsmForLego(MotorData motor,Runnable irTh, Runnable motorTh, Runnable ProcessTh){
    		this.mMotorData = motor;
    		
    		//thread를 전달하기 위한 부분
    		this.myIrRun = irTh; 
    		this.myMotorRun = motorTh;
    		this.myProcessRun = ProcessTh;
    
    	}
    	
    	@Override
    	public void init() {
    		// TODO Auto-generated method stub
    		System.out.print("Top-INIT;" );
    	    
    	    //초기화시 모터 목표를 0으로 설정
    		super.init();
    	}
    
    	@Override
    	public State fireInit() {
    		// TODO Auto-generated method stub
    	    System.out.print("INIT>>s;" );
    		return s0;
    	}
    
    	@Override
    	public void enter() {
    		// TODO Auto-generated method stub
    	    System.out.print("ENTRY>>s;" );
    
    	}
    	
    	@Override
    	public State fireEvent(Event e) {
    		// TODO Auto-generated method stub
    		return getParent();
    	}//fireEvent
    
    	@Override
    	public void exit() {
    		// TODO Auto-generated method stub
    	    System.out.print("EXIT<<s;" );
    	    System.out.print("\n");
    
    
    	}
    	
    	Hsm s = this;                 // This is just alias of current instance
    
    	
    	
    	State s0 = new State(s){
    		@Override
    		public State fireEvent(Event e) {
    			// TODO Auto-generated method stub
    			switch(e.getID())
    			{
    				case EnterPressed :
    					transition(s1);
    					return null;
    
    				default :
    					  break;
    			}
    			
    			return getParent();
    		}//fireEvent
    		
    		@Override
    		public State fireInit() {
    			// TODO Auto-generated method stub
    		    System.out.print("INIT>>s0;" );
    			return null;
    		}
    
    		@Override
    		public void enter() {
    			// TODO Auto-generated method stub
    		    System.out.print("ENTRY>>s0;" );
    			
    		}
    
    		@Override
    		public void exit() {
    			// TODO Auto-generated method stub
    		    System.out.print("EXIT<<s0;" );
    		    System.out.print("\n");
    		
    		}
    		
    	};//sate s0
    	
    	State s1 = new State(s){
    
    		@Override
    		public State fireInit() {
    			// TODO Auto-generated method stub
    		    System.out.print("INIT>>s1;" );
    			return s10;
    		}
    
    		@Override
    		public void enter() {
    			// TODO Auto-generated method stub
    		    System.out.print("ENTRY>>s1;" );
    	
    		}
    
    		@Override
    		public State fireEvent(Event e) {
    			// TODO Auto-generated method stub
    			switch(e.getID())
    				{
    					case DownPressed :
    						transition(s0);
    						return null;
    
    					default :
    						  break;
    				}
    			return null;
    		}
    
    		@Override
    		public void exit() {
    			// TODO Auto-generated method stub
    		    System.out.print("EXIT<<s1;" );
    		    System.out.print("\n");
    				
    		}
    		
    	};//state s1;
    	
    	
    
    	State s10 = new State(s1){
    
    		@Override
    		public State fireInit() {
    			// TODO Auto-generated method stub
    		    System.out.print("INIT>>s10;" );
    			return null;
    		}
    
    		@Override
    		public void enter() {
    			// TODO Auto-generated method stub
    			// IR 센서값을 버퍼에 저장..
    			// 이벤트를 판단할 수 있게됨..
    			myIrRun.run();
    		    System.out.print("ENTRY>>s10;" );
    	
    		}
    
    		@Override
    		public State fireEvent(Event e) {
    		
    			// TODO Auto-generated method stub
    			switch(e.getID())
    			{
    			case GapIsWide :
    				//모터 이동부분 추가.
    				// 아래 process run은 삭제필요..
    				// thread를 인수로 줄수 없음..
    				//myProcessRun.run();
    				mMotorData.storeTargetDistance(10, 10);
    				myMotorRun.run();
    				
    				//seft transition
    				transition(s10);
    				return null;
    
    			case GapIsNarrow :
    				mMotorData.storeTargetDistance(-50, -50);
    				myMotorRun.run();
    
    				transition(s12);
    				return null;
    
    			default :
    				break;
    			
    			}
    			return getParent();
    		}//fireEvent
    
    		
    		@Override
    		public void exit() {
    			// TODO Auto-generated method stub
    		    System.out.print("EXIT<<s10;" );
    			System.out.print("\n");
    
    		}
    			
    	};//state s10
    
    	
    	/* 아래 부분은 삭제..2016.09.08
    	State s11 = new State(s1){
    
    		@Override
    		public State fireInit() {
    			// TODO Auto-generated method stub
    		    System.out.print("INIT>>s11;" );
    			return null;
    		}
    
    		@Override
    		public void enter() {
    			// TODO Auto-generated method stub
    		    System.out.print("ENTRY>>s11;" );
    			
    		}
    
    		@Override
    		public State fireEvent(Event e) {
    			// TODO Auto-generated method stub
    			switch(e.getID())
    			{
    			case GapIsWide:
    				//seft transition
    				//모터 이동부분 추가.
    				myIrRun.run();
    				myProcessRun.run();
    				myMotorRun.run();
    				transition(s11);
    				//모터 이동부분 추가.
    				return null;
    
    			case GapIsNarrow:
    				//모터 이동부분 추가.
    				mMotorData.storeTargetDistance(-10, -10);
    				myMotorRun.run();
    
    				transition(s12);
    				return null;
    
    			default :
    				break;
    			
    			}
    			
    			return getParent();
    		}//fireEvent
    
    		@Override
    		public void exit() {
    			// TODO Auto-generated method stub
    			System.out.print("EXIT<<s11;" );
    			System.out.print("\n");
    		}
    			
    	};//State s11
    	*/
    	
    	State s12 = new State(s1){
    
    		@Override
    		public State fireInit() {
    			// TODO Auto-generated method stub
    		    System.out.print("INIT>>s12;" );
    
    			return null;
    		}
    
    		@Override
    		public void enter() {
    			// TODO Auto-generated method stub
    		    System.out.print("ENTRY>>s12;" );
    		}
    
    		@Override
    		public State fireEvent(Event e) {
    			// TODO Auto-generated method stub
    			//모터 이동부분 추가.
    			mMotorData.storeTargetDistance(50, -50);
    			myMotorRun.run();
    
    			transition(s13);
    			return getParent();
    
    		}//fireEvent
    
    		@Override
    		public void exit() {
    			// TODO Auto-generated method stub
    			System.out.print("EXIT<<s12;" );
    			System.out.print("\n");
    
    		}
    		
    		
    	};//State s12
    
    	State s13 = new State(s1){
    
    		@Override
    		public State fireInit() {
    			// TODO Auto-generated method stub
    			System.out.print("INIT>>s13;" );
    
    			return null;
    		}
    
    		@Override
    		public void enter() {
    			// TODO Auto-generated method stub
    			// 충분하게 돌았는지 확인.
    			myIrRun.run();
    			System.out.print("ENTRY>>s13;" );
    
    			
    		}
    
    		@Override
    		public State fireEvent(Event e) {
    			// TODO Auto-generated method stub
    			switch(e.getID())
    				{
    					case GapIsWide :
    						//모터 이동부분 추가.
    						// 아래 process run은 삭제필요..
    						// thread를 인수로 줄수 없음..
    						//myProcessRun.run();
    						transition(s10);
    						return null;
    
    					case GapIsNarrow :
    						//충분하게 돌지 못해더 더 돌아야 된단고 판단.
    						mMotorData.storeTargetDistance(50, -50);
    						myMotorRun.run();
    						transition(s10);
    						return null;
    
    					default :
    						break;
    
    			}
    			return getParent();
    		}//fireEvent
    
    		@Override
    		public void exit() {
    			// TODO Auto-generated method stub
    			System.out.print("EXIT<<s13;" );
    			System.out.print("\n");
    
    			
    		}
    
    		
    	};//State 13
    
    
    		
    }//myHsmForLego
    

    다음에는 iR센서에 모터를 달아서 한바퀴 돌려보고 몇도로 움직여야 판단까지 하고 싶으나, 갈길이 멀어 보인다. 일단 이걸 다 뜯을 생각을 하니 머리가 아프다..한번 뜯으면 다시 조립 못할 것 같다..
    20160908_232920

  • mysql을 사용한 견적 산출 방법

    필요 조건..
    1. 최소 아이템을 입력으로
    2. 업데이트는 빈번하게..
    3. 한번 입력한 아이템은 다른 곳에서 사용할 수 있도록..

    임시 테이블을 만들어서, (각 경우에 따른, 주제어반/보조제어반+메이커 조합)
    어느 아이템이 들어갈지 정함..
    이 임시 테이블에 수량에 대한 항목이 정해져 있어야 됨..

    모든 테이블에서 해당하는 아이템을 뽑아내면, 사용 가능할 것 같음..

    select * from `cost`;
    
    create temporary table `주제어반_ABPLC` (`ItemID` int, `수량` int);
    
    
    #제어반을 구성하기 위한 ID/수량 매핑
    
    insert into `주제어반_ABPLC` values (7,1),(13,5),(17,1),(20,3);
    
    select * from `주제어반_ABPLC`;
    
    drop temporary table `주제어반_ABPLC`;
    
    
    #각 항목에서 해당하는 ITEM, 수량을 산출하기 위한 식..
    
    select '주제어반',`cost`.`모델명`, `cost`.`세부사양`,`cost`.`제작사`,`주제어반_ABPLC`.`수량`,`cost`.`개당가격` from `cost`
     inner join `주제어반_ABPLC` on `cost`.`ItemID`=`주제어반_ABPLC`.`ItemID`;

    단점은 만들 임시 테이블이 너무 많음..