2016. 11. 9. 23:18

윈도우 에서 삽질하다 포기하고 리눅스로 넘어왔다.


첨부터 리눅스로 할껄...;;


필요한 프로그램 설치

apt install gcc-avr avr-libc avrdude 


다른 곳에서는 binutils 와 uisp 까지 설치 하라고 되있는 곳도 있던데...

일단 테스트 결과 네모 안에 있는 3개만 설치해도 빌드 및 프로그램이 가능함을 확인 하였다.

avr-gcc, avrdude 만 있음 되는 거 같다... 일단은 -_-


음영으로 표시된 부분이 명령창에서 입력하는 부분이다.



1. 소스 작성 (cpp)

2. Makefile 작성

3. 컴파일 -> hex 파일 생성

4. 프로그램 -> hex 파일 을 ATMega328p 에 전송 (USBASP 2.0 사용)

5. 퓨즈비트 세팅 -> 내장클릭 1Mhz 를 사용하지 않고 외부의 16 MHz 크리스탈을 사용하여 동작하도록 설정



잊어먹기 전에 정리.... -_-;;


안되서 맨날 시방시방 하다가 되니까... 이 기분을 어찌 표현해야 할지... ㅎㅎㅎ


펌웨어 버젼 어쩌고 경고 뜨는데, 현재로서는 모르겠다능 -_-;;

펍업 하다 USBASP 해먹으면... 진행을 못하니까... 열댓개 사서 시도를 해보던가 해야겠다.



ledblink.cpp

#define F_CPU 16000000UL

#include <avr/io.h>

#include <util/delay.h>

int main(void)

{

DDRB |= (1<<DDB5); //Set the 6th bit on PORTB (i.e. PB5) to 1 => output

while(1)

{

PORTB |= (1<<PORTB5);    //Turn 6th bit on PORTB (i.e. PB5) to 1 => on

_delay_ms(1000);        //Delay for 1000ms => 1 sec

PORTB &= ~(1<<PORTB5);    //Turn 6th bit on PORTB (i.e. PB5) to 0 => off

_delay_ms(1000);        //Delay for 1000ms => 1 sec

}



Makefile

ledblink.o: dummy

avr-gcc -mmcu=atmega328p -Os ledblink.cpp -o ledblink.o


ledblink: ledblink.o

avr-objcopy -j .text -j .data -O ihex ledblink.o ledblink.hex


dummy: 



compile

$ make ledblink

avr-gcc -mmcu=atmega328p -Os ledblink.cpp -o ledblink.o

avr-objcopy -j .text -j .data -O ihex ledblink.o ledblink.hex 



program

$ avrdude -c usbasp -p m328p -e -U flash:w:ledblink.hex


avrdude: warning: cannot set sck period. please check for usbasp firmware update.

avrdude: AVR device initialized and ready to accept instructions


Reading | ################################################## | 100% 0.00s


avrdude: Device signature = 0x1e950f (probably m328p)

avrdude: erasing chip

avrdude: warning: cannot set sck period. please check for usbasp firmware update.

avrdude: reading input file "ledblink.hex"

avrdude: input file ledblink.hex auto detected as Intel Hex

avrdude: writing flash (176 bytes):


Writing | ################################################## | 100% 0.15s


avrdude: 176 bytes of flash written

avrdude: verifying flash memory against ledblink.hex:

avrdude: load data flash data from input file ledblink.hex:

avrdude: input file ledblink.hex auto detected as Intel Hex

avrdude: input file ledblink.hex contains 176 bytes

avrdude: reading on-chip flash data:


Reading | ################################################## | 100% 0.13s


avrdude: verifying ...

avrdude: 176 bytes of flash verified


avrdude: safemode: Fuses OK (E:FF, H:DE, L:FF)


avrdude done.  Thank you. 



fuse-bit setting

$ avrdude -c usbasp -p m328p -C /etc/avrdude.conf -U lfuse:w:0xFF:m -U hfuse:w:0xDE:m -U efuse:w:0x05:m


avrdude: warning: cannot set sck period. please check for usbasp firmware update.

avrdude: AVR device initialized and ready to accept instructions


Reading | ################################################## | 100% 0.00s


avrdude: Device signature = 0x1e950f (probably m328p)

avrdude: reading input file "0xFF"

avrdude: writing lfuse (1 bytes):


Writing | ################################################## | 100% 0.00s


avrdude: 1 bytes of lfuse written

avrdude: verifying lfuse memory against 0xFF:

avrdude: load data lfuse data from input file 0xFF:

avrdude: input file 0xFF contains 1 bytes

avrdude: reading on-chip lfuse data:


Reading | ################################################## | 100% 0.00s


avrdude: verifying ...

avrdude: 1 bytes of lfuse verified

avrdude: reading input file "0xDE"

avrdude: writing hfuse (1 bytes):


Writing |                                                    | 0% 0.00s ***failed;  

Writing | ################################################## | 100% 0.03s


avrdude: 1 bytes of hfuse written

avrdude: verifying hfuse memory against 0xDE:

avrdude: load data hfuse data from input file 0xDE:

avrdude: input file 0xDE contains 1 bytes

avrdude: reading on-chip hfuse data:


Reading | ################################################## | 100% 0.00s


avrdude: verifying ...

avrdude: verification error, first mismatch at byte 0x0000

         0xd9 != 0xde

avrdude: verification error; content mismatch


avrdude: safemode: hfuse changed! Was de, and is now d9

Would you like this fuse to be changed back? [y/n] y

avrdude: safemode: and is now rescued

avrdude: safemode: Fuses OK (E:FF, H:DE, L:FF)


avrdude done.  Thank you. 








Posted by 해비
2016. 10. 30. 23:40

ATMega328P 를 브레드보드에 직접 구성하여 동작시켜 보았다.


인터넷 찾아가며 구성해서 일단 동작은 되긴 되는데...

1초에 한번씩 깜빡거리도록 작성된 코드인데 엄청 느리게 깜빡인다.


외부 클럭 설정문제 또는 크리스탈 불량으로 의심된다.



브레드 보드를 제외한 모든 부품은 알리에서 구매한 것들이다.


USBASP 드라이버는 구글 검색으로 쉽게 찾을 수 있다.


USBASP 핀 구조



카즈마? AVR 프로그래머는 오류... 메시지가 뜨는데.. 걍 무시하고 진행하면 OK 메시지 나온다.


아트멜 스튜디오 에서 컴파일 하고, hex 파일을 카즈마? AVR 프로그래머로 AVR에 집어 넣었다.



사용한 툴

Atmel Studio 7.0

http://www.atmel.com/Microsite/atmel-studio/


Khazama AVR Programmer

http://khazama.com/project/programmer/



소스코드 (인터넷에서 검색한 샘플 소스코드)

#define F_CPU 16000000UL

#include <avr/io.h>

#include <util/delay.h>

int main(void)

{

DDRB |= (1<<DDB5); //Set the 6th bit on PORTB (i.e. PB5) to 1 => output

while(1)

{

PORTB |= (1<<PORTB5);    //Turn 6th bit on PORTB (i.e. PB5) to 1 => on

_delay_ms(1000);        //Delay for 1000ms => 1 sec

PORTB &= ~(1<<PORTB5);    //Turn 6th bit on PORTB (i.e. PB5) to 0 => off

_delay_ms(1000);        //Delay for 1000ms => 1 sec

}



hex 파일

blinkled.zip




결과



정면 샷





Posted by 해비
2016. 10. 22. 00:45

iptables 내용 출력을 clear로 갱신하다가 깜빡임을 줄이고 싶어 검색했더니 역시나 있었다.

http://unix.stackexchange.com/questions/81167/prevent-text-screen-blinking-when-doing-clear



가운데 CMD 부분에 명령을 넣으면 된다.

# flicker less refresh script.
# http://unix.stackexchange.com/questions/81167/prevent-text-screen-blinking-when-doing-clear

#!/bin/sh
watchit() {
    HOME=$(tput cup 0 0)
    ED=$(tput ed)
    EL=$(tput el)
    ROWS=$(tput lines)
    COLS=$(tput cols)
    printf '%s%s' "$HOME" "$ED"
    while true
    do
        CMD="sudo iptables -L -n -v --line-numbers"
        ${SHELL:=sh} -c "$CMD" | head -n $ROWS | while IFS= read LINE; do
            printf '%-*.*s%s\n' $COLS $COLS "$LINE" "$EL"
        done
        printf '%s%s' "$ED" "$HOME"
        sleep 1
    done
}
watchit top -b -n 1



종료하면 문자가 그대로 남아있는채로 커서가 올라가는 것으로 보아 화면전체를 지우기 보다는 바뀐것만 치환하는 느낌인데... 분석해 봐야 할 것 같다.




Posted by 해비
2016. 10. 21. 21:37
리눅스 iptables 방화벽 구성 스크립트 공유 합니다.

여기 스크립트 보고 신선한(?) 충격에 기존 방화벽 소스 대거 고치게 되었습니다.

베이스만 가져와서 대폭 수정하였습니다.


크게 아래 5가지 항목으로 잡았습니다.

1. INPUT PORT TCP
들어오는 TCP 포트 연결

2. INPUT PORT UDP
들어오는 UDP 포트 연결

3. OUTPUT ADDR
나가는 주소

4. OUTPUT PORT TCP
나가는 TCP 연결

5. OUTPUT PORT UDP
나가는 UDP 연결


OUTPUT 기본정책을 DROP 로 만들면 예기치 못한 상황을 겪을 수 있습니다. 처음에 ALLOW 로 설정하고 LOG 로 빠지는 놈이 있나 없나 체크 한 후에 마지막에 DROP 로 설정 합시다.

sudo iptables -L -n -v --line-numbers

이 명령어 한줄이면 아래 처럼 테이블이 나타납니다

빨간 네모 부분 LOG에 패킷, 바이트가 0 이 아니면 이쪽으로 향하는 길 잃은 영혼(패킷-_-)이 존재 한다는 겁니다.


dmesg 명령어로 LOG를 확인하고 출발지, 목적이 IP, PORT, prot 등을 확인하여 규칙을 추가하여 줍시다.


위 내역에서 숫자가 발생한 부분은 각각 패킷, 데이터가 얼마나 흘렀는지를 알 수 있는 부분이며, 0 은 아직 한번도 이 쪽 규칙을 타지 않았음을 나타냅니다. (한참 지켜보고 필요없다 싶으면 제거할 수도 있겠죠? ㅎㅎ)




현재 설정에 apt 패키지 업데이트 호스트도 추가해야 되는데 빠졌네요.
apt-get 하면 업데이트 서버에 접근 못합니다. OUTPUT도 막았으니까요.
이 부분은 OUTPUT ADDR에 업데이트 서버의 주소나 IP 추가해 주면 됩니다.

나가는 주소에 허용된 유일한 내역은 현재 서브넷 대역 (제 경우 172.17.10.0/24)을 설정하였는데 이 부분은 내부 네트워크의 주소에는 접근이 가능하게 하고자 함입니다.

그리고... NAT 부분은 VPN 때문에 설정하였습니다.
FORWARD 를 DROP 하면 NAT의 MASQUERADE 가 동작하지 않습니다. (패킷 전달을 막으면 안되는게 당연하겠죠?)
고로 여기서는 NAT 때문에 FORWARD를 막지 않습니다만, 필요없으면 DROP 이 보안상 좋겠네요.

#!/bin/bash

# Haebi's iptables script 
# http://haebi.kr, http://haebi.net

# based on
# https://gist.github.com/thomasfr/9712418

# Check iptables status
# sudo iptables -L -n -v --line-numbers

IPT="/sbin/iptables"

# Your DNS servers you use: cat /etc/resolv.conf
DNS_SERVER="
	8.8.4.4
	8.8.8.8
"

# Service List (TCP)
# -----------------------
# 22		SSH
# 80		Web
# 443		Web (HTTPS)
# 1194		OpenVPN #1
# 1196		OpenVPN #2
# 3306		MySQL
# 21		FTP (Command)
# 50000:51000	FTP (Data)
# 137:139	SAMBA
# 445		SAMBA

ALLOW_INPUT_PORT_TCP="
	22
	80
	443
	1194
	1196
	3306
	21
	50000:51000
	137:139
	445
"

# Service List (UDP)
# -----------------------
# 53		DNS
# 137:139	SAMBA
# 8649		ganglia

ALLOW_INPUT_PORT_UDP="
	53
	137:139
	8649
"

# Allow outgoing access
ALLOW_OUTPUT_ADDR="
	172.17.10.0/24
"

# Allow outgoing TCP
# 22		ssh connect other server

ALLOW_OUTPUT_PORT_TCP="
	22
"

# Allow outgoing UDP
# 123		ntp syncs

ALLOW_OUTPUT_PORT_UDP="
	123
"

$IPT -P INPUT ACCEPT
$IPT -F

# Allowing DNS lookups (tcp, udp port 53) to server
for ip in $DNS_SERVER
do
	$IPT -A OUTPUT -p udp -d $ip --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
	$IPT -A INPUT  -p udp -s $ip --sport 53 -m state --state ESTABLISHED     -j ACCEPT
	$IPT -A OUTPUT -p tcp -d $ip --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
	$IPT -A INPUT  -p tcp -s $ip --sport 53 -m state --state ESTABLISHED     -j ACCEPT
done

# Allow any connection from this host.
$IPT -A INPUT  -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT

# Allow all broadcast traffic.
iptables -A INPUT -m pkttype --pkt-type broadcast -j ACCEPT

# Open Incoming TCP Ports
for PORT in $ALLOW_INPUT_PORT_TCP
do
	$IPT -A INPUT  -p tcp --dport $PORT -m state --state NEW,ESTABLISHED -j ACCEPT
	$IPT -A OUTPUT -p tcp --sport $PORT -m state --state ESTABLISHED     -j ACCEPT
done

# Open Incoming UDP Ports
for PORT in $ALLOW_INPUT_PORT_UDP
do
	$IPT -A INPUT  -p udp --dport $PORT -m state --state NEW,ESTABLISHED -j ACCEPT
	$IPT -A OUTPUT -p udp --sport $PORT -m state --state ESTABLISHED     -j ACCEPT
done

# Allow out going access
for ip in $ALLOW_OUTPUT_ADDR
do
	$IPT -A OUTPUT -d $ip -m state --state NEW,ESTABLISHED -j ACCEPT
	$IPT -A INPUT  -s $ip -m state --state ESTABLISHED     -j ACCEPT
done

# Allow out going TCP access
for port in $ALLOW_OUTPUT_PORT_TCP
do
	$IPT -A OUTPUT -p tcp --dport $port -m state --state NEW,ESTABLISHED -j ACCEPT
	$IPT -A INPUT  -p tcp --sport $port -m state --state ESTABLISHED     -j ACCEPT
done

# Allow out going UDP access
for port in $ALLOW_OUTPUT_PORT_UDP
do
	$IPT -A OUTPUT -p udp --dport $port -m state --state NEW,ESTABLISHED -j ACCEPT
	$IPT -A INPUT  -p udp --sport $port -m state --state ESTABLISHED     -j ACCEPT
done

#######################################################################################################
## Global iptable rules. Not IP specific

# Allow outgoing icmp connections (pings,...)"
$IPT -A OUTPUT -p icmp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT  -p icmp -m state --state ESTABLISHED,RELATED     -j ACCEPT

# Simple Service Discovery Protocol
$IPT -A INPUT -p udp --dport 1900 -d 239.255.255.250 --state NEW -j ACCEPT

# Multicast address
# 224.0.0.1 The All Hosts multicast group addresses all hosts on the same network segment.
$IPT -A INPUT -d 224.0.0.1 -j ACCEPT

# 224.0.0.22 Internet Group Management Protocol
$IPT -A OUTPUT -d 224.0.0.22 -j ACCEPT

# Device discovery
$IPT -A INPUT  -d 239.255.255.250 -j ACCEPT
$IPT -A OUTPUT -d 239.255.255.250 -j ACCEPT

# Default -----------------------------------------------------------------
iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# Log before dropping
$IPT -A INPUT  -j LOG  -m limit --limit 5/min --log-level 7 --log-prefix 'IP INPUT drop: '
$IPT -A OUTPUT -j LOG  -m limit --limit 5/min --log-level 7 --log-prefix 'IP OUTPUT drop: '

# If forward drop then NAT Masquerade will not work.
$IPT -P INPUT DROP
#$IPT -P FORWARD DROP
$IPT -P OUTPUT DROP
$IPT -nL

# NAT ---------------------------------------------------------------------
$IPT -t nat -F
$IPT -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
$IPT -t nat -A POSTROUTING -s 10.8.2.0/24 -d 172.17.10.0/24 -o eth0 -j MASQUERADE
$IPT -t nat -nL










Posted by 해비
2016. 10. 19. 07:07

.Net 3.5 이상부터 지원되는 Func<T, T Result> 를 사용하면 함수를 인자로 넘길 수 있습니다.


무슨 말인고 하니 함수를 콜 하였는데 그 함수 내부에서 다른 쪽의 함수를 실행해야 하는 경우가 있습니다.


이해를 돕기 위해 예문을 추가합니다.


using System;

namespace test1019
{
    class Program
    {
        static void Main(string[] args)
        {
            ClassA ca = new ClassA();

            ca.AA(BB); // 함수 BB 를 AA의 인자로 넘깁니다

            Console.WriteLine("Press any key to continue.");
            Console.ReadKey();
        }

        public static bool BB()
        {
            // do something...
            Console.WriteLine("BB");

            return true; // T Result 때문에 임의의 리턴값을 설정. 특별한 의미는 없다.
        }

        class ClassA
        {
            public void AA(Func<bool> func)
            {
                // do something
                Console.WriteLine("AA");

                func(); // AA 수행 중 클래스 바깥에 있는 BB()를 실행
            }
        }

    }

}

리턴타입이 void 형인 함수는 넘길수 없다는 것에 유의해 주세요.

Func<T, T Result> 가 인자 T는 생략이 가능하지만 T Result 인자는 생략이 안됩니다.




MSDN 링크 입니다.

https://msdn.microsoft.com/ko-kr/library/bb549151(v=vs.110).aspx



Posted by 해비
2016. 9. 25. 17:25

프린터로 내용 출력하는 방법에 대해 다룹니다.


예시는 visualstudio 2015 Community edition 을 사용 합니다.

설치 시 SQL Server Data Tools 항목이 체크되어 있어야 합니다. 컨트롤이 보이지 않으면 프로그램 추가/제거 에서 변경을 누른다음 체크 하여 추가하도록 합니다.



도구상자 에서 ReportViewer 컨트롤을 폼에 추가 합니다.



새 항목 추가 - 데이터 집합 추가



데이터 집합 -> 추가 - DataTable



테이블 생성

테이블 명을 지정하고, Ctrl+L 을 눌러 컬럼을 하나씩 추가합니다. (Ctrl+L 누를때마다 컬럼이 하나씩 늘어납니다)



레포트 생성

새 항목 추가 - 보고서



보고서에 테이블 추가

이름은 적당히 알아서 지정하고, 데이터 원본과 데이터 집합은 위에서 생성한 데이터 집합의 내용을 선택합니다.



데이터 집합으로 부터 하나씩 끌어다 각 컬럼에 올립니다.

제목 출력을 위한 매개변수도 하나 추가, 배치 합니다.



작업한 보고서를 컨트롤에 연결

Report Viewer 선택 - 우상단 작은 삼각형 클릭 - 팝업에서 보고서 선택



소스코드

데이터 테이블 넘길때 이름을 위에서 지정한 데이터 집합에 설정한 이름으로 넘깁니다.

제목 파라메터 역시 레포트에서 생성한 파라메터 명칭으로 넘깁니다.

            DataTable dt = new DataTable();
            dt.Columns.Add("Name");
            dt.Columns.Add("Tel");
            dt.Columns.Add("Addr");

            dt.Rows.Add(new object[] { "AAA1", "BBB1", "CCC1" });
            dt.Rows.Add(new object[] { "AAA2", "BBB2", "CCC2" });
            dt.Rows.Add(new object[] { "AAA3", "BBB3", "CCC3" });

            for (int i = 10; i < 100; i++)
            {
                dt.Rows.Add(new object[] {
                    string.Format("AAA{0}", i.ToString())
                    , string.Format("BBB{0}", i.ToString())
                    , string.Format("CCC{0}", i.ToString()) });
            }

            ReportParameter[] rp = new ReportParameter[1];
            rp[0] = new ReportParameter("title", "샘플 보고서 제목");

            reportViewer1.PageCountMode = PageCountMode.Actual;

            ReportDataSource rDS = new ReportDataSource("reportdata", dt);
            this.reportViewer1.LocalReport.DataSources.Clear();
            this.reportViewer1.LocalReport.DataSources.Add(rDS);
            this.reportViewer1.LocalReport.SetParameters(rp);
            this.reportViewer1.LocalReport.Refresh();

            this.reportViewer1.RefreshReport();


빌드 및 실행




테이블이 2페이로 넘어가는 경우, 제목이 보여지지 않습니다.

페이지 마다 테이블 제목을 출력하도록 수정 하도록 하겠습니다.


레포트를 열고 테이블을 선택 합니다.

하단의 고급모드를 선택합니다.



행 그룹 항목의 정적을 클릭 -> 우측 속성에서 RepeatOnNewPage 값을 True 로 설정 합니다.



다시 빌드, 실행 하고 페이지를 넘겨보면 제목이 출력됨을 확인 할 수 있습니다.




본 레포트를 적용하여 개발한 프로그램 소스코드 입니다.

https://github.com/haebi/APTManager






Posted by 해비
2016. 9. 5. 17:43

부팅 USB를 ISO 로 변환해야할 일이 생겼는데 우연하게 되는 방법을 찾아서 기록하고자 한다.


예시는 윈도우10 이미지 이다.


필요한 툴은 ImgBurn 이다.



1. USB 드라이브 선택

2. Advanced > Bootable Disc > 부팅가능 체크

3. 부트 이미지 선택 \boot\etfsboot.com

4. ISO 생성




Posted by 해비
2016. 9. 3. 19:27

예)

find 로 하위폴더에서 찾은 파일을 vim 으로 여는 예


find . -name page_alloc.c -exec vim {} \;



{} 괄호 부분이 find 에서 찾은 내용의 목록을 가지고 있다.


결과가 여럿일 경우 모두 열릴 거 같은데...?


Posted by 해비
2016. 8. 23. 23:28

폴더별 용량 확인 및 크기순 정렬

du -h --max-depth=1 | sort -hr

Posted by 해비
2016. 8. 18. 18:44


예시를 chmod 로 들었으나 -exec 뒤에 오는 명령에 따라서 뭐든 적용 가능하다.


find의 역할은 작업 대상 파일을 추려내기 위한 용도이다.





chmod 각 폴더 하단까지 돌면서 진행. (find 응용)

find . -name *.sh
현재 폴더로 부터 이름이 *.sh인 파일을 찾는다.

find . -name *.sh -exec chmod -v 755 {} \;
현재 폴더로 부터 이름이 *.sh인 파일을 찾는다 + 파일 권한을 755로 세팅한다.



Posted by 해비