2020년 4월 24일 금요일

UDP 통신에서 MULTICAST이용하기

MFC CAsyncSocket이용하기

CmyAsyncSocket m_UDP;

// 약속된 포트를 연다.  받기 위해서
m_UDP.Create(m_port,SOCK_DGRAM,FD_READ | FD_WRITE);  // SOCK_DGRAM : UDP통신

// 보내기
SOCKADDR_IN saddr;
memset(&saddr,0,sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = inet_addr( ipaddress );  // 보낼곳.
saddr.sin_port=htons(m_port);                       // 그 약속된 포트
m_UDP.SendTo(m_msg.GetBuffer(0), 1024, (SOCKADDR*)&saddr, sizeof(saddr));

// 받기
SOCKADDR_IN saddr;
int size=sizeof(saddr);
TCHAR tbuff[1024]={0,};
int nRead = m_UDP.ReceiveFrom(tbuff,1024,(SOCKADDR*)&saddr,&size);

// 다음은 MULTICAST ...
// 옵션을 추가한다... D ipaddress group으로 전송하고자 한다.
// 보내기 위해서  TTL  로 뚫고  IF를 local ip로 지정한다.
int ttl=2;
m_UDP.SetSockOpt(IP_MULTICAST_TTL, (char *)&ttl, sizeof(ttl), IPPROTO_IP) ;
char ipaddr[25]; // local address
WideCharToMultiByte(CP_ACP, 0, m_ip, -1, ipaddr, 25, NULL, NULL);
IN_ADDR localaddr;
localaddr.s_addr = inet_addr( ipaddr );
m_UDP.SetSockOpt(IP_MULTICAST_IF, (char *)&localaddr, sizeof(localaddr), IPPROTO_IP) ;

// 받기 위해서  D ip address group을 등록한다.
char ipaddress[25]={"224.0.0.123"};  //D group ip address 사용. 
struct ip_mreq mreq ;
memset(&mreq, 0, sizeof(mreq)) ;
mreq.imr_multiaddr.s_addr = inet_addr( ipaddress );
mreq.imr_interface.s_addr = htons(m_port); //htonl( INADDR_ANY );
mreq.imr_interface.s_addr = htonl( INADDR_ANY );
m_UDP.SetSockOpt(IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq), IPPROTO_IP) ;

// 옵션 지정후 보내기는 D group ip로 보내야 한다.
saddr.sin_addr.s_addr = inet_addr( "224.0.0.123" );  
m_UDP.SendTo(m_msg.GetBuffer(0), 1024, (SOCKADDR*)&saddr, sizeof(saddr));
// 그러면 Multicast 받기 그룹에 등록된 곳을 받는다.    

2020년 4월 8일 수요일

UNICODE에서 CString format 사용하기...


 filebuf.Format(_T("%s\\%s"), CString(AppPath), _T("APCDATA"));
  // UNICODE 뒷부분이 안보인다.
 BOOL ret = PathIsDirectory( filebuf );
 char str[1024]; sprintf(str, "%s\\%s", AppPath, "APCDATA" );
 // UICODE에서 Format에 char 있으면 안된다. 2020-04-08  ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
 if( GetFileAttributes( filebuf ) == 0xffffffff ){
  if ( ! ::CreateDirectory( filebuf, NULL ) )
   ::MessageBox((HWND)NULL,_T("./APCDATA 폴더 생성 실패."),NULL,MB_OK|MB_TOPMOST);
 }

2020년 4월 4일 토요일

CXIMAGE를 사용하면 BMP를 JPG로 저장할 수 있다.


#include "./cximage/cximage/ximage.h"
#pragma comment(lib,"./cximage/cximage/CxImageDLL/Debug/cximagecrtd.lib")
//#pragma comment(lib,"./cximage/cximage/Debug/cximage.lib")



CxImage* newImage = new CxImage();
newImage->Load(file_bmp, CXIMAGE_FORMAT_BMP);

BOOL bRet;
if (newImage->IsValid()){
newImage->Save(path,CXIMAGE_FORMAT_JPG);
}

delete newImage;
newImage = NULL;

2020년 3월 23일 월요일

인스턴스와 핸들

A라는 프로그램이 B 라는 프로그램의 C라는 서브 윈도우에 버튼을 누르는 효과나 커멘드 메시지를 날려 메뉴를 선택하는 행위하는 것을 구현하려면 ...


그때 필요한것은 B의 신스턴스요 그 인스턴스가 관장하는 그리고 액비브 된 C라는 윈도우의 핸들.

2020년 1월 18일 토요일

MSSQL express 사용

MS SQL Server Express 사용

  1. 2008 버젼을 사용했다.  express 버젼은 데이터 가져오기가 안될 수 있다는 메세지는 2014에서도 똑 같이 나타난다. 아마도 2014에서도 될듯.

  2. SQLEXPRWT_x64_KOR 를 사용했다.  SQLManagementStudio_x64_KOR가 포함되어 있다.

  3. 보안이 되어있으면 충돌이 일어나니 우선 지우자.

  4. 설치는 디폴트로 다하고 우선 윈도우즈 인증 모드로 들어간다.

  5. 데이터베이스에 MxxxFxxx을 생성한다.

  6. 사용자도 생성한다.  elexxxx   elexxxx
     사용자 옵션에 sysadmin을 추가하고, 생성 데이터베이스 기본으로 가져가고, owner처리하고 accessadmin도 해두자.

  7.  데이터 가져오기를 한다.   ms access는 보안으로 되어 있다면 열기에서 단독모드로 열기를 하고 암호를 제거한 상태로 저장해야한다.  그러면 데이터 가져오기를 할 수 잇다.

  8.  속성에서 윈도우즈 인증 모드와 로그인 복합 모드가 되게 한다.

  9.  SQL SERVER가  tcp/ip 가 되게 한다. 1433포트로 가능하게 한다.  외부에서 접속하기 위해서는 방화벽도 손봐야 한다.

2019년 12월 26일 목요일

시놀로지 파일서버에서 웹서버를 돌리기

chaejoo@LIFENTECH2:~$ pip -V
-sh: pip: command not found
chaejoo@LIFENTECH2:~$ sudo wget https://bootstrap.pypa.io/get-pip.py
chaejoo@LIFENTECH2:~$ sudo python3 get-pip.py
chaejoo@LIFENTECH2:~$ echo $PATH
/sbin:/bin:/usr/sbin:/usr/bin:/usr/syno/sbin:/usr/syno/bin:/usr/local/sbin:/usr/                                 local/bin
chaejoo@LIFENTECH2:~$ PATH=$PATH:/volume1/@appstore/py3k/usr/local/bin:
chaejoo@LIFENTECH2:~$ pip -V
pip 19.3.1 from /volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/pi                                 p (python 3.5)
chaejoo@LIFENTECH2:~$ sudo pip install django
Collecting django
  Downloading https://files.pythonhosted.org/packages/cb/c9/ef1e25bdd092749dae74                                 c95c2707dff892fde36e4053c4a2354b2303be10/Django-2.2.9-py3-none-any.whl (7.5MB)
     |████████████████████████████████| 7.5MB 5.5MB/s
Collecting sqlparse
  Downloading https://files.pythonhosted.org/packages/ef/53/900f7d2a54557c6a3788                                 6585a91336520e5539e3ae2423ff1102daf4f3a7/sqlparse-0.3.0-py2.py3-none-any.whl
Collecting pytz
  Downloading https://files.pythonhosted.org/packages/e7/f9/f0b53f88060247251bf4                                 81fa6ea62cd0d25bf1b11a87888e53ce5b7c8ad2/pytz-2019.3-py2.py3-none-any.whl (509kB                                 )
     |████████████████████████████████| 512kB 13.5MB/s
Installing collected packages: sqlparse, pytz, django
Successfully installed django-2.2.9 pytz-2019.3 sqlparse-0.3.0
chaejoo@LIFENTECH2:~$ cd
chaejoo@LIFENTECH2:~$ mkdir DjangoProject
chaejoo@LIFENTECH2:~$ cd DjangoProject/
chaejoo@LIFENTECH2:~/DjangoProject$ ls
chaejoo@LIFENTECH2:~/DjangoProject$ django-admin startproject djangotest1
chaejoo@LIFENTECH2:~/DjangoProject$ cd djangotest1/
chaejoo@LIFENTECH2:~/DjangoProject/djangotest1$ sudo python3 manage.py runserver                                 Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 17 unapplied migration(s). Your project may not work properly until you                                  apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

December 27, 2019 - 13:46:37
Django version 2.2.9, using settings 'djangotest1.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
^Cchaejoo@LIFENTECH2:~/DjangoProject/djangotest1$ sudo python3 manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying sessions.0001_initial... OK
Watching for file changes with StatReloaderst1$ sudo python3 manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).
December 27, 2019 - 13:48:02
Django version 2.2.9, using settings 'djangotest1.settings'
Starting development server at http://127.0.0.1:8000/
chaejoo@LIFENTECH2:~/DjangoProject/djangotest1$ sudo python3 manage.py runserver 192.168.0.139:8080
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
December 27, 2019 - 13:49:46
Django version 2.2.9, using settings 'djangotest1.settings'
Starting development server at http://192.168.0.139:8080/
Quit the server with CONTROL-C.
^Cchaejoo@LIFENTECH2:~/DjangoProject/djangotest1$
chaejoo@LIFENTECH2:~/DjangoProject/djangotest1$
chaejoo@LIFENTECH2:~/DjangoProject/djangotest1$
chaejoo@LIFENTECH2:~/DjangoProject/djangotest1$ ls
db.sqlite3  djangotest1  manage.py
chaejoo@LIFENTECH2:~/DjangoProject/djangotest1$ cd djangotest1/
chaejoo@LIFENTECH2:~/DjangoProject/djangotest1/djangotest1$ ls
__init__.py  __pycache__  settings.py  urls.py  wsgi.py
chaejoo@LIFENTECH2:~/DjangoProject/djangotest1/djangotest1$ sudo nano settings.py
sudo: nano: command not found
chaejoo@LIFENTECH2:~/DjangoProject/djangotest1/djangotest1$ sudo vi settings.py
chaejoo@LIFENTECH2:~/DjangoProject/djangotest1/djangotest1$ sudo python3 manage.py runserver 192.168.0.139:8080
python3: can't open file 'manage.py': [Errno 2] No such file or directory
chaejoo@LIFENTECH2:~/DjangoProject/djangotest1/djangotest1$ cd ..
chaejoo@LIFENTECH2:~/DjangoProject/djangotest1$ cd ..
chaejoo@LIFENTECH2:~/DjangoProject$ cd djangotest1/
chaejoo@LIFENTECH2:~/DjangoProject/djangotest1$ sudo python3 manage.py runserver 192.168.0.139:8080
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
December 27, 2019 - 13:53:31
Django version 2.2.9, using settings 'djangotest1.settings'
Starting development server at http://192.168.0.139:8080/
Quit the server with CONTROL-C.
[27/Dec/2019 13:53:44] "GET / HTTP/1.1" 200 16348
[27/Dec/2019 13:53:44] "GET /static/admin/css/fonts.css HTTP/1.1" 200 423
[27/Dec/2019 13:53:44] "GET /static/admin/fonts/Roboto-Light-webfont.woff HTTP/1.1" 200 85692
[27/Dec/2019 13:53:44] "GET /static/admin/fonts/Roboto-Bold-webfont.woff HTTP/1.1" 200 86184
[27/Dec/2019 13:53:44] "GET /static/admin/fonts/Roboto-Regular-webfont.woff HTTP/1.1" 200 85876
Not Found: /favicon.ico
[27/Dec/2019 13:53:45] "GET /favicon.ico HTTP/1.1" 404 1981
^Cchaejoo@LIFENTECH2:~/DjangoProject/djangotest1$ sudo wget https://bootstrap.pypa.io/get-pip.py
--2019-12-27 13:56:28--  https://bootstrap.pypa.io/get-pip.py
Resolving bootstrap.pypa.io... 151.101.228.175, 2a04:4e42:36::175
Connecting to bootstrap.pypa.io|151.101.228.175|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1775835 (1.7M) [text/x-python]
Saving to: 'get-pip.py'

get-pip.py                   100%[===========================================>]   1.69M  1.49MB/s    in 1.1s

2019-12-27 13:56:30 (1.49 MB/s) - 'get-pip.py' saved [1775835/1775835]

chaejoo@LIFENTECH2:~/DjangoProject/djangotest1$

솔리드웍스 VR할때

https://www.demo3d.com/cardboard-virtual-reality/

2019년 10월 8일 화요일

mfc stack over flow

MFC에서  스택 사이즈가 1MB로 설정 되어 있다.

이때 지역변수를 정적으로 1MB이상 잡아주면 오버플로가 난다.

VS6.0 에서는
Project Settings(Alt+F7) -> Link 탭 -> category - output -> Stack allocations - Reserve
부분을 0xa00000 (10485760) 로 변경해 준다


효과가 없을때는 전역변수를 써야 하는데,

전역은 여러개를 써야 하기 때문에,

calloc를 사용해 봐야 겠다.

2019년 9월 30일 월요일

Add SSH non admin root user to your Synology Diskstation

vi /etc/passwd

The last line in this file is your new user. The user cannot login because the shell is set to /sbin/nologin. Change the /sbin/nologin to /bin/ash

2019년 9월 24일 화요일

PI Minimum Environment for GUI Applications

https://die-antwort.eu/techblog/2017-12-setup-raspberry-pi-for-kiosk-mode/

Minimum Environment for GUI Applications

sudo apt-get install --no-install-recommends xserver-xorg x11-xserver-utils xinit openbox
Web Browser
sudo apt-get install --no-install-recommends chromium-browser

2019년 9월 22일 일요일

PI 스럽게

그 대답하는 태도는 뭐야.

1. balenaEtcher로 pi linux iso를 16GB microSD에 깐다

2. WIFI가 되는 pi로 진입하여

3. locale 을 kr로 한다. 언어는 나중에 설치한다.

4. 이때 wifi지역은 us가 되어야  wifi가 잡히는 것 같다.

5.  sudo apt-get update   # 이거 먼저해줘야 ...
    sudo apt-get upgarde

    sudo apt-get install xrdp   # 이후 최신 pi linux iso는 바로 원격 연결이 가능하다.

6.  sudo apt-get install ibus  ibus-hangul fonts-unfonts-core    #한글

7.  python 과 python3는 설치되어 있더라.

8. sudo apt-get install simba-common-bin #윈도와 공유
   $ sudo smbpasswd -a pi # 공유용 비번
   $ sudo nano /etc/samba/smb.conf
[pi]
comment = rpi samba
path = /home/pi/Public
valid user = pi
writable = yes
read only = no
browseable = yes
뒤에 코멘트 붙이지 말것.    valid users도 이상하고
   이거 에러나면   restart 안됨.
   $ sudo /etc/init.d/smbd restart 

9.  Building seabreeze manually
$sudo apt-get install git-all build-essential libusb-dev
$sudo python -m pip install --upgrade pip
$sudo git clone https://github.com/ap--/python-seabreeze.git python-seabreeze
$cd python-seabreeze
$sudo python -m pip install .   


10. scipy 설치   $ sudo apt-get install python3-scipy
$ sudo apt-get install python-scipy

2019년 9월 21일 토요일

우드잡

주인공 히라노 유키역의 소메타니 쇼타의 능청스러운 연기 일품으로  너무 밋밋해질 수도 있는 스토리를 맛깔나게 이끌어 나가는 역할을 해낸다.

'우에~'

리드미컬한 그 탄성...

2019년 9월 20일 금요일

붉은 색 글자를 찾아서 1


chaejoo@lifentech.com

image_bgr = cv2.imread(image_file)
img_hsv_h = image_hsv[:, :, 0]
img_hsv_s = image_hsv[:, :, 1]
img_hsv_v = image_hsv[:, :, 2]

lower_red1 = (0.95*180, 0.4*255*0.6,        0)
upper_red1 = (180,              255, 0.97*255)
lower_red2 = (0,        0.4*255*0.6,        0)
upper_red2 = (0.1*180,  255,         0.97*255)

img_hsv = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2HSV)
img_hsv1 = cv2.inRange(img_hsv, lower_red1, upper_red1)
img_hsv2 = cv2.inRange(img_hsv, lower_red2, upper_red2)
img_red = cv2.bitwise_or(img_hsv1, img_hsv2)

#Clear up by getting rid of particles less than 400 pixels in area.
imge_red = baweraopen(img_red,4000)
imge_red = imge_red - baweraopen(imge_red,19000)
# and remove bigsize
# Fill any holes in the blobs.
imge_red = img_fill(imge_red, 127)
cv2.imshow('IMG', imge_red)
cv2.waitKey(0)

2019년 9월 19일 목요일

적외선 온도계 IR-22 통신 사용방법

IR-22 비접촉 온도계는 485통신이 된다.

보통 9600 속도로 설정되어 있어.

0x02 0x30 0x31 0x52 0x30 0x03 0x62

STX+'0'+'1'(국번)+'R'+'0'+ETX+BCC

응답은
   STX+'0'+'1'+'R'|0x80+'0'+ x30 + x31 + x30 + x3F + ETX + BCC
이다.

  그럼  x30 + x31 + x30 + x3F  ==  x010F 와 같다.

temp = 0*16^3+1*16^2+0*16+F = 256+15 = 271  이여서 27.1 도 가 된다.

  x00FA = 15*16 + 10 = 250  이면  25도 임.


  xFED4 = 65236 - 65535 - 1 = -30 도임.

          32767 보다 크면  영하임.

printf deg C를 해보자.

" -> %s\xB0 C " works. The printout is: 18.4° C

But " -> %s\xB0C " does not work. The printout then is: 18.4

The blank between \xB0 and C is necessary! And this is acceptable.

2018년 9월 27일 목요일

기계시각의 이미지 프로세싱 #001

1. 영상의 이진화

    임계값, threshold, 문턱값, 기준값을 이용하여 영상의 모든 픽셀을 검사하여 문턱값보다 높을 경우 1, 낮을 경우 0 으로 하는 이진 영상(binary image)를 만들어 내는 것. 매트랩에서는 영상의 이진화를 im2bw 라는 함수를 이용하여 간단히 수행.

img = imread('2.bmp');
BW = im2bw(img,0.5);  ! 0.5 = 127.5 값
s  = regionprops(BW,'centroid');
centroids = cat(1, s.Centroid);
imshow(BW);
hold on;
plot(centroids(:,1), centroids(:,2), 'b*');
hold off;



2.  영상 이진화(binarization, thresholding)
   영상의 밝기 분포를 보고 임계값을 찾아주는 방법 Otzu's method (N. Otsu, “A threshold selection method from gray-level histograms,” IEEE Trans. Syst., Man, Cybern., vol. SMC-9, pp. 62-66, 1979).   임계값을 0-255까지 변화시켜  밝기평균의 차의 제곱의 최대값을 찾는 방법.