현재 알림을 받을 수 있는 상태인지 아닌지 확인 하는 Swift 코드입니다.

 

let isRegistered = UIApplication.shared.isRegisteredForRemoteNotifications

if(isRegistered) {

}

else {

}

 

예제 코드

// 알림 설정이 on / off 인지 확인 후 , off 일 경우 알림을 활성화 하라는 얼럿창 노출
let isRegistered = UIApplication.shared.isRegisteredForRemoteNotifications
if(isRegistered) {
   //
   _ = SweetAlert().showAlert("title_regist".localized, subTitle: "알림 수신이 설정되어 있습니다", style: AlertStyle.warning)
   return
}
else{
   _ = SweetAlert().showAlert("title_regist".localized, subTitle: "알림 수신 설정을 활성화 하세요", style: AlertStyle.warning)
   return
}

 

SweetAlert 은 얼럿창관련 오픈 소스인데 https://sweetalert2.github.io/

여기로 가시면 다운 받을 수 있습니다.

 

SweetAlert2

A beautiful, responsive, customizable and accessible (WAI-ARIA) replacement for JavaScript's popup boxes

sweetalert2.github.io

일단 IOS13에서 테스트 해보니 잘 됩니다.

 

 

백터 사용 시 실수 할 수 있는 문제입니다.

 

아래 코드에서 어떤 문제점이 있나 한번 보실래요?

 

#include "stdafx.h"
#include <string>
#include <vector>

using namespace std;

int fn1(vector<string> *pvt) {

	int totallen = 0;
	
	for (int i = 0; i < pvt->size(); i++) {
		totallen += pvt[i].size();
	}
	
	return totallen;
}

int main()
{
	vector<string> vtDumy;
	vtDumy.push_back("hello");
	vtDumy.push_back("my");
	vtDumy.push_back("name");
	vtDumy.push_back("is");
	vtDumy.push_back("ososoi!");

	int totallen = fn1(&vtDumy);

	printf("total len=%d\n", totallen);

	getchar();
    return 0;
}

 

 

위 코드를 가지고 visual studio 에서 빌드하면 정상적으로 빌드가 되고 실행도 됩니다. 

 

우리가 예상한 결과값은 "hellomynameisososoi!" 총 20자 입니다.  

 

하지만 실행하게 되면 

 

오잉 쓰레기값이??

 

결과를 말씀드리면 아래코드에서 문제가 있습니다.

 

totallen _= pvt[i].size();

 

여기서 pvt는 백터의 포인터이기 때문에 실제 우리가 원하는 백터의 n번째 원소(string)의 길이를 얻기위해서는

 

totallen += (*pvt)[i].size();

 

더 명시적으로 표현하자면 아래와 같습니다.

 

totallen += (*(vector<string>*) pvt)[i].size();

 

 

비단 벡터 뿐만 아니라 포인터를 다루면서 종종 실수 할 수 있는 경우인데요,

 

기본 변수 타입의 포인터는 익숙해서 실수를 잘 안 할 수 있는데, 벡터등 컨터이너에 포인터를 붙일 때 . 찍고 컴파일 오류가 없기 때문에 그냥 지나칠 수 있을 것 같습니다.

 

저도 좀전에 실수 해서 생각 나는 김에 여기에 샘플코드와 함께 적어봤습니다. 

 

 

코딩량이 많고 빨리빨리 작업하다보면 빌드가 정상적으로 되는 것을 보고 그냥 지나칠 수 있는데요,

 

잘못하다간 나중에 로직에러 / 데이터 검증에 디버깅 할때는 더 많은 수고가 들지도 모르겠죠..;;

 

포인터를 다룰 때는 함수의 전달과 사용되는 부분들을 꼼꼼히 훑어 보고 다음 코드로 넘어가는 습관과 펑션을 짜고 나서 데이터 전달. 연산에 대한 테스팅을 한번씩 해보고 다음 단계로 넘어가는 습관이 중요할 것 같습니다.

 

 

 

 

Visual Studio 2015에서 테스트 되었습니다.

 

CTRL + M + O : 전체 폴딩 하기

CTRL + M + L :  전체 폴딩 풀기

CTRL + M + M : 현재 섹션에서 폴딩 하기 / 풀기

 

 

 

예제)

 

아래와 같은 문자열들이 있을 때,

ID01---0---1---  

ID02--0-------1 

-----ID03--0--1

 

위의 문자열들을 아래와 같이 변경하고 싶다면 (반복된는 문자열들을 하나만 남겨두고 모두제거 하고 싶다면)

ID01-0-1-

ID02-0-1

-ID03-0-1

 

string result = Regex.Replace(str, "-+", "-");

 

 

만약 양쪽 끝에 발견되는 반복되었던 문자를 제거할려면 Trim 을 사용.

ID01-0-1

ID02-0-1

ID03-0-1

 

string result2 = result .Trim('-');

 

 

윈폼(WinForm)의 TextBox,RichEditBox 등 컨트롤에서 다음과 같이 문자열이 입력되어 있을 때,

 

WinForm의 RichEditBox에 입력한 단어들 컨트롤 이름을 rtbColor 이라고 하자.

개행을 제거하고, 공백을 제거 하고 싶을 때,

다시 말해서 결과 문자열이 '노란색,하늘색,붉은색,푸르스름한색' 으로 출력되게 하고 싶을 때,

 

string keyword = rtbColor.Text

char[] except = { '\n', ' ' };

keyword = keyword.Trim(except);

 

MSDN 의 설명을 보면 Trim()은 세가지의 Overload 펑션을 제공하고 있습니다.

 

Trim(Char[])

현재 문자열에서 배열에 지정된 문자 집합의 선행 항목과 후행 항목을 모두 제거합니다.

Trim(Char)

현재 문자열에서 문자의 선행 인스턴스와 후행 인스턴스를 모두 제거합니다.

Trim()

현재 문자열에서 선행 공백과 후행 공백을 모두 제거합니다.

 

그럼 선행/후행 모두가 아니라 후행에 나오는 문자만 제거하기 위해서는 ?

 

TrimEnd 를 사용하시면 됩니다.

 

[C#] Visual Studio Installer 사용하기 (1) 

 

에서 만든 인스톨러로 수정된 프로그램의 재배포를 할 때 정상적으로 처리가 되지 않는다.

이미 프로그램을 배포했고, 프로그램 수정이 이루어져 새로운 버전으로 배포해야 할때... 

 

setup 프로젝트의 속성창에서

DetectNewerInstalledVersion 이 True로 되어 있는지 확인

RemoveOreviosVersions 을 False -> True 변경

 

 

실제로 새로운 버전의 프로그램을 적용하기 위해서 원 프로젝트의 속성창에서 [응용프로그램] -> [어셈블리정보] 에서 

버전정보를 올려주자

 

[C#] Visual Studio Installer 사용하기 (1)

 

 

같이 공부하는 마음으로, 시작해봅시다.

 

1. 기존에 프로젝트가 준비 되어 있으면 바로 다음단계로(2) 이동. 필자는 실행하면 윈폼창이 뜨는 프로그램을 샘플로 작성하였습니다.

설치할 프로그램을 준비

2. [솔루션] 창에서 오른쪽 마우스 클릭 -> [추가] -> [새 프로젝트]를 차례대로 클릭 하고 새 창이 뜨면

   [Visual Studio Installer] -> [Setup Project] 선택

   인스톨 프로그램의 프로젝트 명을 입맛대로 변경 후 확인 하면 (4)로

   Visual Studio Installer 설치가 되어 있지 않으면 안보일 수 있습니다. 그럼 (3) 으로 이동

 

3. Visual Studio Installer 가 설치가 되어 있지 않은 경우만 보세요

   상단 메뉴의 [도구] -> [확장 및 업데이트] -> [온라인] -> 검색어 Visual Studoi Installer 를 검색하고 설치.

   필자는 이미 설치 했기 때문에 [설치됨] 항목에 나타납니다. 아래 사진에 보이는 Visual Studio Installer Projects 입니다.

 

4. 아래와 같은 화면이 나오면 된겁니다

5. 그럼 [Application Folder] 를 마우스 우클릭 하고 [Add] -> [프로젝트 출력] 을 선택하면 [프로젝트 출력 그룹 추가] 라는 폼이 뜨는데 이미 프로젝트가 있으면 선택되어 져서 나올 껍니다. [확인]

그럼 기본 출력란이 바뀌었는지 확인 하고 솔루션 창에서 Installer 프로젝트를 빌드 하고 정상적으로 빌드 됐는지 확인 하면 됩니다.

 

6. 디렉토리에 setup.exe 프로그램이 정상적으로 만들어졌는지 확인하고 실제로 설치를 해봅시다.

   ~.msi 파일로 설치해도 됩니다. 

   주의점은 원 프로젝트가 빌드가 되어 있어야 하고, debug, release 모드를 구분하기 때문에 실제 배포시에는 release 로 빌드하시는게 좋겠죠.

 

다음에는 좀더 디테일 하게 installer 프로젝트를 다뤄보고 알려드리도록 하겠습니다.

 

[C#] Visual Studio Installer 사용하기 (2)

 

(base) [root@guest ~]# netstat
-bash: netstat: command not found

자.. 당황하지 말고~

(base) [root@guest nshopassist]# yum -y install net-tools
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
Resolving Dependencies
--> Running transaction check
---> Package net-tools.x86_64 0:2.0-0.25.20131004git.el7 will be installed
--> Finished Dependency Resolution
...
...
Running transaction
  Installing : net-tools-2.0-0.25.20131004git.el7.x86_64                                                                              1/1
  Verifying  : net-tools-2.0-0.25.20131004git.el7.x86_64                                                                              1/1

Installed:
  net-tools.x86_64 0:2.0-0.25.20131004git.el7

Complete!
(base) [root@guest nshopassist]# netstat -h
usage: netstat [-vWeenNcCF] [<Af>] -r         netstat {-V|--version|-h|--help}
       netstat [-vWnNcaeol] [<Socket> ...]
       netstat { [-vWeenNac] -I[<Iface>] | [-veenNac] -i | [-cnNe] -M | -s [-6tuw] } [delay]

help 명령이 잘되는 것까지 확인.

  • openssl 설치 확인 (설치가 되어 있지 않다면 openssl 설치 필요)
(base) [root@guest ~]# openssl version
OpenSSL 1.1.1g  21 Apr 2020

 

  • rsa 키파일을 생성한다
(base) [root@guest ~]# openssl genrsa 1024 > rsa.key
Generating RSA private key, 1024 bit long modulus(2 primes)
................+++++
..................+++++
e is 65537 (0x010001)

 

  • cert 파일을 생성한다
(base) [root@guest ~]# openssl req -new -x509 -nodes -sha256 -days 365 -key rsa.key > django.cert
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:ko
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:seoul
Organization Name (eg, company) [Internet Widgits Pty Ltd]:ososoi
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:ososoi
Email Address []:ososoi@daum.net
(base) [root@guest ~]#

-x509

이 옵션은 인증서 요청 대신 자체 서명 된 인증서를 출력합니다. 일반적으로 테스트 인증서 또는 자체 서명 된 루트 CA를 생성하는 데 사용됩니다

 

-days n

옵션을 사용하는 경우 인증서를 인증 할 일 수를 지정합니다. 기본값은 30 일입니다.

 

  • django 프로젝트의 setting.py 을 열어 sslserver 앱을 추가한다.
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'sslserver',
]

 

  • 서버를 실행한다. 필자는 이미 443포트를 사용하고 있기 때문에, 8443 포트를 열어서 사용하도록 하였다.
(base) [root@guest nshopassist]# python manage.py runsslserver --certificate django.cert --key rsa.key 0.0.0.0:8443
Watching for file changes with StatReloader
Validating models...

System check identified no issues (0 silenced).
June 29, 2020 - 21:43:13
Django version 3.0.3, using settings 'nshopassist.settings'
Starting development server at https://0.0.0.0:8443/
Using SSL certificate: django.cert
Using SSL key: rsa.key
Quit the server with CONTROL-C.

 

Q) 특정 호스트를 지정하기 어려운경우, 점검을 해야할 시간을 특정 하지 못할 때, 어떤 패킷이 랜덤하게 들어올때 , 다량의 패킷을 tcmpdump 떠야 할때 어떻게 해야할까 ?

 

위와 같은 상황에서 좀더 tcmpdump 를 유용하게 쓸 수 있는 방법에 대해서 알아봅시다.

 

사용하게된 옵션들은 아래와 같습니다.

-C : 파일 사이즈 The units of file_size are millions of bytes(1,000,000 bytes, not 1,048,576 bytes).  

-W : 최대 파일 갯수

-Z root : 파일을 나누어 남길때 권한 오류가 발생한다면 추가

-i any : 모든 인터페이스

 

icmp 패킷만, 10MB의 크기로, 최대 10개의 파일을 생성하게 하고 , 계속 로테이션 되게 로그를 쌓고 싶을 경우 아래와 같이 사용합니다. 캡쳐된 내용이 capfile0, capfile1, capfile2... 으로 9까지 생기고 계속 로테이션 되면서 기록됩니다.

$ tcpdump icmp -C 10 -W 10 -w capfile

 

권한오류가 발생 할 수도 있습니다. 그럴 경우 마지막에 -Z root 을 추가하여 루트권한으로 실행하도록 합니다.

 tcpdump -i any icmp -C 10 -W 10 -w capfile -Z root

 

예제추가) 백그라운드로, 모든 인터페이스, udp 161 포트, 소스아이피 또는 목적지아이피가 10.0.0.1 , 파일은 10개 크기는 20MB씩 로테이션이 되도록 하고 파일명은 dump~ , 루트권한으로 실행

 $ nohup tcpdump -i any src 10.0.0.1 or dst 10.0.0.1 and udp port 161 -W 10 -C 20 -w dump -Z root &

 

위를 잘 활용하면, 네트워크의 문제 (ping 유실, 네트워크 부하, 이상 패킷 흐름) 등의 모니터링을 하는데 도움을 줄 수 있다고 생각합니다. 실제로 현업에서 며칠에 한번씩 랜덤하게 ping 유실되는 것을 증명할 때 사용하기도 했습니다.  디스크 용량을 확인하고 적절하게 계산하여 원하는 만큼의 기간동안의 패킷을 로깅 할 수 있습니다.

 

같이 보기 [Linux/Unix] Tcpdump 

 

[Linux/Unix] Tcpdump

개요  명령 줄에서 실행하는 일반적인 패킷 가로채기 소프트웨어이다. 사용자가 TCP/IP뿐 아니라, 컴퓨터에 부착된 네트워크를 통해 송수신되는 기타 패킷을 가로채고 표시할 수 있게 도와 준

ososoi.tistory.com

 

  • 개요

 명령 줄에서 실행하는 일반적인 패킷 가로채기 소프트웨어이다. 사용자가 TCP/IP뿐 아니라, 컴퓨터에 부착된 네트워크를 통해 송수신되는 기타 패킷을 가로채고 표시할 수 있게 도와 준다. BSD 허가서를 통해 배포되는[2] tcpdump는 자유 소프트웨어이다.

tcpdump는 리눅스, 솔라리스, BSD, 맥 OS X, HP-UX, AIX 따위의 대부분의 유닉스 계열 운영 체제에서 동작하며 여기서 libpcap 라이브러리를 사용하여 패킷을 포획한다. 윈도용 tcpdump 이식판으로는 WinDump가 있으며, 이는 libpcap의 윈도 이식판인 WinPcap을 이용한다.  - wiki 백과

 

<조건식(expression)>

옵션의 제일 마지막인 조건식은 어떤 패킷들을 출력할지를 선택하는데 쓰인다. 조건식이 주어지지 않는 다면 모든 패킷들이 그 대상이 될 것이다. 일단 주어지면, 아무리 패킷들이 많아도 조 건식에 부합하는 패킷만을 출력한다.

조건식들은 하나 또는 몇 개의 primitive들로 구성되어 있다. primitive들은 보통 하나 혹은 몇개의 qualifier들 다음에 오는 하나의 값으로 이루어진다. Qualifier들은 모두 3 종류이며 다음과 같다.

 

type : 주어진 값의 종류가 무엇인지를 나타낸다. 가능한 type들은 'host', 'net', 'port'가 있다. type이 없는 값들은 type을 host라 가정한다.

 

dir : id로 부터의 어떤 특정한 전송 방향을 나타낸다. 가능한 방향은 'src', 'dst', 'src or dst', 'src and dst'이다. 만약 방향이 정해지지 않았다면, src or dst라 가정한다. "For `null' link layers (i.e. point to point protocols such as slip) the inb ound and out bound qualifiers can be used to specify a desired direction."

 

proto : 매칭을 특정 프로토콜에 한해서 수행한다. 가능한 프로토콜들은 ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp, udp이다. 만약 프로토콜이 명시되지 않았다면, 해당하는 값의 type에 관련된 모든 프로토콜들이 그 대상이 된다.


  • 사용예

<옵션>
-c Number : 제시된 수의 패킷을 받은 후 종료한다.
-i device : 어느 인터페이스를 경유하는 패킷들을 잡을지 지정한다. 지정하지 않을 경우 가장 낮은 번호를 가진 인터페이스를 선택한다(이 때 loopback은 제외된다).

-i any : 인터페이스를 구분 하지 않는다. 

-w tcpdump.log : 결과를 tcpdump.log 파일에 저장함.(임의로 지정가능)

-s 1500 :캡쳐할 패킷의 길이로서 1500은 패킷의 전체길이를 의미하므로 모든 패킷을 캡쳐하게됨.

tcp port 22 : 캡쳐할 대상 프로토콜과 포트를 지정한 것으로 tcp 포트 22번으로 송수신되는 데이터를 캡쳐하게 됨.

host 192.168.0.1 :192.168.0.1 서버와 송수신되는 데이터를 대상으로 캡쳐함.

 

A와 B사이의 주고받는 icmp 패킷을 캡쳐할 경우

tcpdump host A and host B and icmp

10.0.0.1 과 10.0.0.13 의 icmp 패킷 캡쳐

여기서 조금더 응용을 하여 A와 B의 주고받는 포트 161을 사용하는 udp 패킷을 캡쳐해서 파일로 저장한다면,

tcpdump -w tcpdump.log host A and host B and udp port 161

10.0.0.1과 10.0.0.22 사이의 udp 161 포트를 캡쳐하여 tcpdump.log 파일에 기록

파일로 저장하였기 때문에 화면에 출력되는 것은 없다.

임의의 패킷을 전송한 후 만들어진 tcpdump.log 파일을 열어보자. 아래와 같이 바이너리 형태로 저장되기 때문에 내용을 알 기 어렵다. 

이를  옵션 -r 을 사용하여 파일을 확인해보자. 

tcpdump -r tcpdump.log

-r 옵션을 사용하여 파일을 열어보면, 10.0.0.1 에서 10.0.0.22 로 snmp 프로토콜 sysUpTime을 요청하였고 그에 대한 응답을 주는 것을 확인 할 수 있다.

hex코드로 출력하길 원한다면

tcpdump -Xqnr tcpdump.log

 

이는 tcpdump 의 아주 작은 조각에 불과합니다. 더 자세한 것은 manpage를 적극 활용 보면 좋겠습니다.

 

다음번에 tcpdump 에 대해서 또 유용하게 쓸수 있는 기능을 소개해 보겠습니다.

 

 

 

같이 보기 [Linux/Unix] Tcpdump(2)

 

[Linux/Unix] Tcpdump(2)

Q) 특정 호스트를 지정하기 어려운경우, 점검을 해야할 시간을 특정 하지 못할 때, 어떤 패킷이 랜덤하게 들어올때 , 다량의 패킷을 tcmpdump 떠야 할때 어떻게 해야할까 ? 위와 같은 상황에서 좀더

ososoi.tistory.com

 

'까벨로퍼 > 개발 이야기' 카테고리의 다른 글

[Django] openssl 인증서로 https 사용  (2) 2020.06.29
[Linux/Unix] Tcpdump(2)  (0) 2020.06.29
[c/c++] strcpy,strncpy,memcpy  (0) 2020.06.28
[Xcode] 단축키 모음  (0) 2020.06.26
[c#] 프로그램에 아이콘 집어넣기  (0) 2020.06.24

 

가끔씩 s1 -> s2 인지 s2 -> s1인지 헷갈릴 때가 있다.. 

 

필요한 헤더 : <string.h>

1
2
3
4
5
6
7
//! @brief s2의 문자열을 s1로 복사한다
char *strcpy( char *s1, const char *s2 );
 
//! @brief s2의 문자열을 count(문자갯수)만큼 s1로 복사한다
char *strncpy( char *s1, const char *s2, size_t count );
 
 
cs

 

char *strncpy( char *s1, const char *s2, size_t count );

 - dest에 대한 공간을 확인 하지 않기 때문에 버퍼오버런(buffer overruns) 방지하도록 유의

 - s2에서 null 문자를 만나면, count개의 문자가 쓰여질때까지 s1에 null 문자가 추가된다.

 

번외편. lib을 만들거나 로우레벨 코딩을 할 때 가끔씩 memcpy 쓸때가 있다. 

 

1
2
//! @breif s2의 문자열을 s1으로 n개 만큼 복사한다
void *memcpy(void *s1, const void *s2, size_t n);
cs

그럼 strncpy 와 memcpy 가 하는 일은 같다. 호기심이 생기지 않는가. 직접 속도차이가 궁금하여 테스트 코드를 돌려보았는데 1000바이트의 문자열을 1억번 단순 복사 하는 프로그램이다. 수회 돌려 본 결과 

결과는

평균적으로 strcpy가 2초, memcpy는 1초가 채 안된다.

아래는 짜본 테스트코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include "stdafx.h"
#include <string.h>
#include <time.h>
 
int main()
{
    char s1[1024];
    char s2[] =
        "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" \
        "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" \
        "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" \
        "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" \
        "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" \
        "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" \
        "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" \
        "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" \
        "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" \
        "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" \
        ;
 
    time_t t1, t2 ,t3;
 
 
    t1 = time(NULL);
    for (int i = 0; i < 100000000; i++)
    {
        memcpy(s1, s2, sizeof(s2));
    }
    t2 = time(NULL);
 
    for (int i = 0; i < 100000000; i++)
    {
        strncpy(s1, s2, sizeof(s2));
    }
    t3 = time(NULL);
 
    printf("strcpy:%u, memcpy:%u\n", t2 - t1, t3 - t2);
 
    getchar();
    return 0;
}
 
cs

 

strncpy vs memcpy 에 대해서 다음에 좀더 이야기를 해보도록 하겠습니다.

 

ps - 위 테스트 코드들에서는 변수 초기값을 할당 하지 않았지만 항상 초기값을 세팅하는 습관이 아주 중요하다고 입이 닳고 마르도록 얘기하고 싶습니다.

 

'까벨로퍼 > 개발 이야기' 카테고리의 다른 글

[Linux/Unix] Tcpdump(2)  (0) 2020.06.29
[Linux/Unix] Tcpdump  (0) 2020.06.29
[Xcode] 단축키 모음  (0) 2020.06.26
[c#] 프로그램에 아이콘 집어넣기  (0) 2020.06.24
[Linux/Unix] iptables 설정  (0) 2020.06.24

 

수시 업데이트중..

 

*** 편집 ***

컨트롤 + 커맨드 + 좌우 방향키 : 페이지 이전/이후 이동

컨트롤 + i : 자동 들여쓰기 적용

커맨드 + alt + Enter : 창 이중 분할

커맨드 + Enter : 단일 창으로 변경

 

*** 빌드 ***

커맨드 + Shift + K  : 프로젝트 클린

커맨드 + B  : 프로젝트 빌드

커맨드 + R  : 프로젝트 실행

 

*** 디버깅 ***

커맨드 + \ : 브레이크 포인트

F6 : 다음라인

F7 : 현재 라인 내부 진입

F8 : 현재 함수에서 나가기

 

*** 탐색 ***

커맨드 + Shift + F     :     파인드 창으로 강제 이동

커맨드 + Shift + O     :     프로젝트/클래스/함수 내 검색

커맨드 + F : 현재 창에서 검색

커맨드 + G : 검색된 결과 순차 검색

 

*** UI ***

커맨드 + 0 : 프로젝트 윈도우 숨기기 / 펼치기

커맨드 + 1 : 프로젝트 파인더 표시

커맨드 + 4 : 프로젝트 워닝/에러 표시

커맨드 + 7 : 브레이포인트 모두 표시

 

 

커맨드 + S : 시뮬레이터창 캡쳐

 

1. 폼 (WinForm) 타이틀에 아이콘 넣기

   새로운 윈폼 프로젝트를 하나 만들어서 폼 디자인은 원하시는대로 하세요.

 

붉은색 박스 안의 아이콘을 추가할 겁니다.

 

WinForm의 속성창에서 Icon 항목을 찾아 붉은 박스를 클릭

 

미리 만들어 두었던 아이콘을 찾아 추가해줍니다. 무료 icon을 다운 받을 수 있는 사이트가 많으니 구글링 하셔도 됩니다.

 

icon이 적용된 것을 확인. 주의! - 폼마다 설정해 줘야 합니다.

 

2. 프로그램의 아이콘을 설정하기

   이부분은 쉽습니다. 솔루션 탐색기 > 마우스 우클릭 > 속성을 누르시면 아래와 같은 화면이 표시됩니다.

   또는 메뉴 > 프로젝트(P) > 프로젝트 속성 (단축키 ALT+F7) 

   응용프로그램 항목에서 리소스 부분의 붉은 박스를 클릭해서 아이콘을 찾아서 추가 해주면 됩니다.

 

 

 

 

centos5에서 테스트 되었습니다.

 

규칙 확인

$ iptables -L

 

체인에 정의된 모든 규칙을 삭제

$ iptables -F

 

기본 정책을 ACCEPT 로 변경

$ iptables -P INPUT ACCEPT

 

로컬호스트 인터페이스 패킷 허용

$ iptables -A INPUT -i lo -j ACCEPT

 

22번 포트 허용

$ iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

 

네임서버

$ iptables -A INPUT -p tcp --sport 53 -j ACCEPT

$ iptables -A INPUT -p tcp --dport 53 -j ACCEPT

$ iptables -A OUTPUT -p tcp --sport 53 -j ACCEPT

$ iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT

$ iptables -A INPUT -p udp --dport 53 -j ACCEPT

 

웹서버

$ iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

$ iptables -A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT

 

icmp 허용

$ iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

$ iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

 

설정내용 저장

$ service iptables save

+ Recent posts