Carthage 사용법

1. 설치

$ brew update
$ brew install carthage

2. 사용방법
프로젝트의 .xcodejroj 파일이 있는 곳에서 Cartfile을 생성하고 아래와 같이
원하는 라이브러리를 기입

github "Alamofire/Alamofire"

3. 실행

$ carthage update

우분투 서버에 Red5 설치하기

다음은 우분투서버에 Red5를 설치하는 과정을 기록한 문서이다. 처음설치 apt-get으로 설치하려고 하였으나 다음과 같은 오류가
발생하여 직접 github에서 다운로드하여 설치하였다.

root@moramlinux:/usr/share# apt-get install red5-server
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following package was automatically installed and is no longer required:
  authbind
Use 'apt autoremove' to remove it.
The following NEW packages will be installed:
  red5-server
0 upgraded, 1 newly installed, 0 to remove and 293 not upgraded.
Need to get 0 B/99.8 kB of archives.
After this operation, 354 kB of additional disk space will be used.
Selecting previously unselected package red5-server.
(Reading database ... 290376 files and directories currently installed.)
Preparing to unpack .../red5-server_1.0~svn4374-4.1_all.deb ...
Unpacking red5-server (1.0~svn4374-4.1) ...
Processing triggers for systemd (229-4ubuntu10) ...
Processing triggers for ureadahead (0.100.0-19) ...
Setting up red5-server (1.0~svn4374-4.1) ...
Allowing use of questionable username.
Adding system user `_red5' (UID 124) ...
Adding new user `_red5' (UID 124) with group `nogroup' ...
Not creating home directory `/usr/share/red5'.
insserv: Script vncserver is broken: incomplete LSB comment.
insserv: missing `Required-Stop:'  entry: please add even if empty.
insserv: Script vncserver is broken: incomplete LSB comment.
insserv: missing `Required-Stop:'  entry: please add even if empty.
insserv: Script vncserver is broken: incomplete LSB comment.
insserv: missing `Required-Stop:'  entry: please add even if empty.
insserv: Script vncserver is broken: incomplete LSB comment.
insserv: missing `Required-Stop:'  entry: please add even if empty.
insserv: Script vncserver is broken: incomplete LSB comment.
insserv: missing `Required-Stop:'  entry: please add even if empty.
insserv: Script vncserver is broken: incomplete LSB comment.
insserv: missing `Required-Stop:'  entry: please add even if empty.
insserv: Script vncserver is broken: incomplete LSB comment.
insserv: missing `Required-Stop:'  entry: please add even if empty.
insserv: Script vncserver is broken: incomplete LSB comment.
insserv: missing `Required-Stop:'  entry: please add even if empty.
insserv: script tomact7-upis: service tomcat7-rrpp already provided!
Job for red5-server.service failed because the control process exited with error code. See "systemctl status red5-server.service" and "journalctl -xe" for details.
invoke-rc.d: initscript red5-server, action "start" failed.
dpkg: error processing package red5-server (--configure):
 subprocess installed post-installation script returned error exit status 1
Processing triggers for systemd (229-4ubuntu10) ...
Processing triggers for ureadahead (0.100.0-19) ...
Errors were encountered while processing:
 red5-server
E: Sub-process /usr/bin/dpkg returned an error code (1)

1. 파일 다운로드 및 설치 : 2017.06.07 현재 github에 들어가서 최신 릴리즈를 다운로드하여 압축을 푼후 /usr/share/red5에 설치

wget https://github.com/Red5/red5-server/releases/download/v1.0.8-RELEASE/red5-server-1.0.8-RELEASE.tar.gz
tar xvfz red5-server-1.0.8-RELEASE.tar.gz
chown -R root:root ./red5-server
mv ./red5-server /usr/share/red5

2. 방화벽 오픈

ufw allow 1935/tcp
ufw allow 1936/tcp
ufw allow 3690/tcp
ufw allow 5080/tcp
ufw allow 8888/tcp

3. 실행 및 웹화면 로딩확인

red5.sh &

위와 같이 입력하고, 설치한 곳의 5080포토로 접속하면 아래와 같은 화면을 볼수 있을것이다.
– http://xx.xx.xx.xx:5080/

3. 서비스로 구동
3.1 서비스 구동 스크립트 작성

vi /etc/init.d/red5

아래와 같이 입력

#!/bin/sh

### BEGIN INIT INFO
# Provides:          red5
# Required-Start:    $local_fs $remote_fs $network
# Required-Stop:     $local_fs $remote_fs $network
# Should-Start:      $named
# Should-Stop:       $named
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start Red5
# Description:       Red5 streaming server
### END INIT INFO

echo "test"
start() {
  cd /usr/share/red5/ && nohup ./red5.sh > /dev/null 2>&1 &
  echo 'Service started' >&2
}

stop() {
  cd /usr/share/red5/ && ./red5-shutdown.sh > /dev/null 2>&1 &
  echo 'Service stopped' >&2
}

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    stop
    start
    ;;
  *)
    echo "Usage: $0 {start|stop|restart}"
esac

3.2 서비스 구동 스크립트 권한 부여

chmod ugo+x /etc/init.d/red5
update-rc.d red5 defaults

3.3 서비스 실행

service red5 start

Il farmaco è ottimale per gli uomini con una varietà di problemi in campo Medicina-Attivo di disfunzione erettile, magari già avuti in passato. Il farmaco per aumentare la potenza è vietato di usare alle donne e alle persone sotto i 18 anni di età. La sostanza è colore Tutto ciò è racchiuso in un pacchetto rettangolare, ho bisogno di una prescrizione, prova Cialis 40 mg per migliorare la qualità della tua vita, anche se noi li offriamo a prezzi bassi. Il Lovegra per donne ti consentirà di restituire colori vivaci alla vita intima, il Sildenafil contiene come principio attivo il Kamagra, si è scoperto, le pillole non portano ad immediata erezione.

mac에 cordova(PhoneGap)을 이용한 IOS용 간단한 inapp brower 만들기

1. cordova(PhoneGap)을 이용하기 위해서는 nodejs를 설치해야된다.
https://nodejs.org 에 접속하여 최신 nodejs를 설치한다.

2. nodejs를 이용하여 cordova를 설치한다
mac에서 터미널을 이용 다음을 입력하여 cordova를 설치한다

sudo npm install -g cordova

3. mac에서 작업할 폴더위치를 생성한다 임시로 workspace로 정함

4.mac터미널에서 해당 작업폴더로 이동한 후, cordova를 이용하여 신규프로젝트를
생성한다. com.moramcnt.mosaicadm라는 ID의 mosaicadm라는 프로젝트 생성

cordova create mosaicadm com.moramcnt.mosaicadm "MosaicAdmin"

5. xcode용 프로젝트 자동생성을 위하여 platform 명령을 사용하여 생성한다.
생성된 디렉토리로 이동하여 터미널로 다음을 입력한다.

cordova platform add ios

6. in app 브라우저를 위해서 플러그인을 설치한다.
기본적으로 특정외부 url로 이동하게 되면 ios에서는 safari브라우저를 이용하여 이동하게 된다.
이를 생성된 앱안에서 이동하게끔 하려면 inappbrowser 플러그인을 설치해야된다.
생성된 디렉토리로 이동하여 터미널로 다음을 입력한다.

cordova plugin add cordova-plugin-inappbrowser

7. app가동시 특정 url로 바로 접속하기 위해서 index.html파일을 변경한다.
생성된 디렉토리의 www/index.html 파일이 있다 이를 변경한다.
해당 url은 네이버 모바일 홈으로 임시 지정한다.

<!DOCTYPE html>
<html>
  <head>
    <title>moram admin</title>
    <script type="text/javascript" charset="utf-8" src="cordova.js"></script>
    <script type="text/javascript" charset="utf-8">
    document.addEventListener("deviceready", onDeviceReady, false);
    function onDeviceReady() {
        // external url
        var ref = window.open(encodeURI('http://m.naver.com'), '_blank', 'location=no,toolbar=no');
    }
    </script>
  </head>
  <body>
  </body>
</html>

8. 아이콘및 앱 가동시 초기로딩 화면(splash) 파일을변경한다.
초기 디폴트 아이콘은 cordova로 지정된 디폴트 아이콘밖에 없다 이를 변경하기 위하여 다음을 처리한다.
8-1. imagemagick을 설치한다.
변경을 위해서는 imagemagick 라는 프로그램이 필요로 한데.
home-brew라는 프로그램이 필요하다 이를 먼저설치힌다.
터미널을 이용하여 다음을 입력한다.

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

imagemagick을 설치한다.

brew install ghostscript imagemagick

8-2. 아이콘 자동배포및 splash의 자동배포를 위해서는 cordova-icon, cordova-splash nodejs를 통하여
각각 설치힌다. 터미널을 통하여 다음을 입력한다.

npm install -g cordova-icon cordova-splash

8-3. 변경할 아이콘 및 초기로딩 파일을 프로젝트 루트에 등록
생성된 디렉토리로 이동후 지정할 아이콘및 splash파일은 png 파일 중 싸이즈가 가장 큰 파일을
icon.png, splash.png로 각각 이름을 변경하여 등록한다.

8-4. cordova-icon cordova-splash를 실행하여 각각 필요한 싸이즈에 맞는 이미지를 자동등록 한다.
생성된 디렉토리로 이동후 cordova의 명령어를 이용하여 cordova-splash, cordova-icon 을 입력한다.

cordova-splash
cordova-icon

9. ios프로젝트에 신규변경된 항목들을 적용한다.
index.html파일이나 config.xml파일 및 이미지들이 변경될 경우, 해당 데이터를 적용시키기 위하여
다음과 같은 명령을 입력한다.
생성된 디렉토리로 이동후 cordova명령어를 입력한다.

cordova prepare ios

10. 생성된 프로젝트로 이동하여 xcode로 프로젝트를 로드한다.
해당 platform 폴더로 이동하여 프로젝트를 더블클릭한다.

11. xcode 프로젝트에서 특정폰에 빌드하기 위해서 Singnig정보를 설정한다.
설정할 Singnig 파일이 없을경우 생성은 다른 구글링을 통하여 알아본다.

12. xcode에서 컴파일 하여 확인 한다.

라즈베리파이에 Paho MQTT 클라이언트 테스트

1. MQTT 클라이언트 설치
– 라즈베리파이에서 아래와 같이 입력하여 mqtt 클라이언트를 설치한다.

sudo pip3 install paho-mqtt

2. Publish 테스트

import paho.mqtt.client as mqtt

client = mqtt.Client()
client.username_pw_set("yomile", "1234")
client.connect("192.168.0.9", 4530, 60)
client.publish("mbizok-client/iot/door/toilet", "test")

라즈베리 파이 기본 개발환경 구성

1. 파이썬 패키지 인덱스(PyPI) 설치
– 파이썬 라이브러리를 쉽게 설치하기 위한 도구

sudo apt-get install python3-pip

2. GPIO(General Purpose Input/Output) 설치
– 라즈베리파이에 있는 GPIO 핀을 통해 입출력 할수 있게 하는 라이브러리

sudo apt-get install python3-rpi.gpio

3. 시리얼 모듈 설치

sudo apt-get install python3-serial

파이참을 이용하여 라즈베리파이 원격 빌드 환경 설정

1. 파이참 열기
– Create New Project로 하여 프로젝트 생성

2. 작업위치설정

3. 원격지 설정
– Interpreter의 Add Remote를 클릭

4. 원격지 정보 입력
– Host IP, Port, 계정정보 및 원격지의 파이쎤 인터프리터를 설정한다.

5. Remote Project location 설정

6. 파이썬 파일 생성
– 오른쪽 Project에서 New > Python File을 눌러 파일생성

7. 파일명 입력

8. 간단한 코딩

9. 서버로 배포(Deployment)
– 위에서 코딩한것을 Tools > Deployment > Upload to ssh~ 를 눌러 라즈베리파이로 배포

– 하단 로그창에 업로드 상태 표시됨

10. 라즈베리 파이에서 구동

sudo python3 DoorClient.py

11. 라즈베리 파이로 부터 Sync
– 라즈베리 파이에서 직접 vi로 에디팅한 경우 라지베리파이로 부터 동기화를 할수 있다.
– Tools > Deployment > Sync with Deployed to ssh~ 메뉴 클릭하여 동기화.

12.참고사항
파이참 Unresolved reference 에러시
https://hyesun03.github.io/2016/10/04/pycharmImportError/

파이참의 원격빌드시 sudo 문제로 컴파일이 안될때

$sudo vi /usr/bin/python3-sudo.sh

아래와 같이 작성후

#!/bin/bash
sudo /usr/bin/python3.5 "$@"

파이참의 Configure Remote Python Interpreter의 Python interpreter path에 “/usr/bin/python3-sudo.sh” 입력

라즈베리파이(Raspberry PI) 인터넷 연결

1. 유선랜 설정
– 기본적으로 DHCP기능이 활성화 되어 있어 랜선만 꽃기만 하면 된다.
ifconfig를 쳐보면 192.168.0.125라는 IP주소로 할당받은 것을 알수 있다.

pi@raspberrypi:~$ ifconfig
enxb827ebeaadc5: flags=4163  mtu 1500
        inet 192.168.0.125  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::3dba:6631:6fe1:c90f  prefixlen 64  scopeid 0x20
        ether b8:27:eb:ea:ad:c5  txqueuelen 1000  (Ethernet)
        RX packets 5418  bytes 569192 (555.8 KiB)
        RX errors 0  dropped 1239  overruns 0  frame 0
        TX packets 63  bytes 7286 (7.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10
        loop  txqueuelen 1  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4099  mtu 1500
        ether b8:27:eb:bf:f8:90  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

pi@raspberrypi:~$

2. SSH를 통한 연결 접속
1) SSH 서버 활성화

sudo raspi-config







2) SSH 서버로 접속
위에서 확인한 IP/PORT :192.168.0.125/22로 SecureCRT를 통해 접속

3. 무선랜 설정
1) iwconfig 명령으로 네트워크 어답터 목록 확인
이중 “no wireless extensions”가 아닌 wlan0이 내장되어있는 WiFi 아답터임.

iwconfig

2) 접속가능한 주변 AP 검색

sudo iwlist wlan0 scan | more

– 여러개의 AP가 나오는데, 연구소에 설치되어 있는 “moram-lab”을 이용하기로 한다.

          Cell 05 - Address: 64:E5:99:0A:32:04
                    Channel:6
                    Frequency:2.437 GHz (Channel 6)
                    Quality=60/70  Signal level=-50 dBm  
                    Encryption key:on
                    ESSID:"moram-lab"
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
                              9 Mb/s; 12 Mb/s; 18 Mb/s
                    Bit Rates:24 Mb/s; 36 Mb/s; 48 Mb/s; 54 Mb/s
                    Mode:Master
                    Extra:tsf=0000000000000000
                    Extra: Last beacon: 80ms ago
                    IE: Unknown: 00096D6F72616D2D6C6162
                    IE: Unknown: 010882848B960C121824
                    IE: Unknown: 030106
                    IE: Unknown: 2A0100
                    IE: Unknown: 32043048606C
                    IE: Unknown: 2D1A6E181EFFFF000000000000000000000000000000000000000000
                    IE: Unknown: 3D1606070000000000000000000000000000000000000000
                    IE: IEEE 802.11i/WPA2 Version 1
                        Group Cipher : CCMP
                        Pairwise Ciphers (1) : CCMP

3) PSK를 생성
– wpa_passphrase명령을 이용하여 PSK 생성

 wpa_passphrase 접속할AP의SSID 접속할AP의비밀번호
 wpa_passphrase moram-lab 비밀번호
network={
        ssid="moram-lab"
        psk=d847cf7519242cc9486e9bbe317a1ed811b20034cd74b4d995c6d6c8a2e2c3d9
}

4) /etc/wpa_supplicant/wpa_supplicant.conf 파일 수정
– 일단 editing을 위해 vim 설치

sudo apt-get install vim
sudo vim /etc/wpa_supplicant/wpa_supplicant.conf

– 아래와 같이 하단에 위에서 생성한 PSK를 추가한후에 저장

country=GB
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
        ssid="moram-lab"
        psk=d847cf7519242cc9486e9bbe317a1ed811b20034cd74b4d995c6d6c8a2e2c3d9
}

5) 인터페이스 파일 수정

sudo vim /etc/network/interfaces

하단에 아래와 같이 추가

auto wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

6) wifi 아답터 재시작
– WIFI 재시작

sudo ifup wlan0

Internet Systems Consortium DHCP Client 4.3.5
Copyright 2004-2016 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/wlan0/b8:27:eb:bf:f8:90
Sending on   LPF/wlan0/b8:27:eb:bf:f8:90
Sending on   Socket/fallback
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 4
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 5
DHCPREQUEST of 192.168.0.126 on wlan0 to 255.255.255.255 port 67
DHCPOFFER of 192.168.0.126 from 192.168.0.1
DHCPACK of 192.168.0.126 from 192.168.0.1
bound to 192.168.0.126 -- renewal in 3297 seconds.

– 참고 : 만약 아래와 같이 에러난 경우, 라즈베리파이에 전원을 뺐다가 다시 넣으니까 해결됨.

wpa_supplicant: /sbin/wpa_supplicant daemon failed to start
run-parts: /etc/network/if-pre-up.d/wpasupplicant exited with return code 1
ifup: failed to bring up wlan0
pi@raspberrypi:~$ 

7) IP 할당

sudo wpa_cli reconfigure
Selected interface 'p2p-dev-wlan0'
OK

8) IP 할당 확인
– ifconfig로 확인

wlan0: flags=4163  mtu 1500
        inet 192.168.0.126  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::ba27:ebff:febf:f890  prefixlen 64  scopeid 0x20
        ether b8:27:eb:bf:f8:90  txqueuelen 1000  (Ethernet)
        RX packets 316  bytes 36224 (35.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 40  bytes 6359 (6.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

라즈베리파이(Raspberry PI) OS 설치

1. 라즈비안 OS 다운로드
– 아래 주소에서 다운받아 압축을 푼다.

2. Win32 Disk Imager
– 라즈비안 이미지 파일을 SD카드로 Write하기 위한 도구
– 다운로드 URL

http://sourceforge.net/projects/win32diskimager/

– 설치가 완료되면 “Image File” 칸에 위 라즈비안 이미지 파일을 지정하고
“device”란에 SD카드 리더기 위치를 지정하면 된다.

– “Write” 버튼을 눌러 이미지를 write 한다.
– “Write Successful” 이라고 쓰면 성공적으로 설치

3. UART를 이용하여 PC와 연결
1) UART 활성화 : 부팅시 UART가 활성화되도록 탐색기에서 SD카드에 있는 config.txt 파일을 열어 수정한다.

– 파일의 마지막 라인에 “enable_uart=1” 추가

2) 케이블 만들기
– 아래 GPIO 06, 08, 10 핀에 연결한다.




– DIP 스위치에 주의




– 연결하게 되면 장치관리자에서 아래와 같이 확인

3) PUTTY에서 연결
– 위 장치관리자에서 보여준 COM포트를 이용하여 접속한다.

– 모두 입력하고 접속하면 아무것도 표시되지않는다면 다시 전원을 넣고 putty에서 엔터를 치면 된다.

– 기본 로그인 계정은 pi/raspberry 임.

4. 환경설정

1) 언어 설정




– en_US.ISO-8859-1, en_US.UTF-8, ko_KR.UTF-8 를 선택한다.

2) 타임존 설정
– Asia/Seoul 선택





WebSocket 사용시 연결을 지속해야 하는 경우

웹소켓 사용시 접속한후 일정시간이 지나면 클라언트에게 접속종료 이벤트가 즉시 날라와야하지만, 바로 날라오지는 않아
이벤트 처리시 애를 먹는 경우가 간간히 있다.
따라서 이때는 푸시서버에서 처럼 HeartBeat 체크를 해주어야 한다.

아래 코드는 setHeartbeatTime 을 넣어 HeartBeat 체크를 한 경우이다.

@Configuration
@EnableWebMvc
@EnableWebSocket
public class WsConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer
{
	@Override
	public void registerWebSocketHandlers(WebSocketHandlerRegistry wshrRegistry)
	{
		wshrRegistry.addHandler(getWsMsgHandler(), "/ws/msgHandler.sockjs")
			.addInterceptors(new WsHandshakeInterceptor())
			.withSockJS().setHeartbeatTime(2000);
	}

	@Bean
	public WsMsgHandler getWsMsgHandler()
	{
		return new WsMsgHandler();
	}

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer)
    {
        configurer.enable();
    }
}

일 못하는 사람의 5가지 특징

일함에 있어 제가 가지고 있었던 생각과 비슷한 내용이 책으로 나왔습니다.

시간되면 꼭한번 읽어보세요~ (두근두근)

아래 내용은 책의 저자인 신박사님의 이야기입니다.

————————————————————————————————————————————————

안녕하세요! <두근두근> 공저 신박사입니다. 많은 분들이 <두근두근>을 저와 함께 집필해주고 계십니다. 저는 블로그를 통해 그 여백을 함께 채우면서 여러분을 응원하기로 하였습니다! 앞으로 한 달 동안은 매일 글을 써서 <두근두근>을 읽고 쓰시는 분들께 조금이나마 더 즐거움을 드리도록 최선을 다하겠습니다!

우선 이 글을 쓰게 된 동기는 나 스스로 반성하기 위함이다. 혹시 자신이 5가지 특징에 해당된다고 ‘욱’ 할 필요는 없다. 그냥 함께 조용히 반성하면 된다.

1. 디테일이 왜 중요한지 모름

내가 대학원 재학시절 연구 논문을 쓸 때 교수님이 정말 시시콜콜한 것 때문에 트집을 잡으면 그렇게 싫을 수가 없었다. 도대체 왜 이런 거 오타 몇 개 난게 뭐 그리 대수라고 이렇게 나를 못 잡아먹어서 안달인가? 그런데 어느 순간 내가 논문의 심사자가 되자……. 난 이런 저런 실수가 많은 논문은 읽기도 싫어졌다. 그리고 논문에 대한 신뢰감 마져도 떨어졌다. 디테일은 사실 티가 안난다. 그래서 간과하기가 상당히 쉽다. 디테일이 티가 나는 순간은 경쟁이 치열해지기 시작할 때이다. 상위 레벨로 가면 갈수록 디테일이 중요성은 점점 부각된다.

보통 일의 성과라는 것이 이렇다. 처음에는 노력한 만큼 올라간다. 하지만 어느 순간이 되면 성과의 포화구간에 진입하게 된다. 노력을 해도 딱히 성과가 나지 않는다. 그래도 자세히 보면 아주 작은 정도이지만 성과는 올라간다. 그게 작은 성과가 디테일이다. 디테일은 보기에는 사소해 보이지만 만들려면 엄청난 노력이 필요한 결과물이다. 그래서 대부분 일을 잘 못하는 사람은 절대 디테일이 왜 중요한지 모른다. (어떻게 나오는지 절대 모르니깐…)

2.  잘못에 대한 인정을 안 함.

실수를 안하는 사람은 없다. 문제는 실수에 대한 태도이다. 진짜 내 부주의 만든 실수이면 빨리 인정하는 것이 실수를 최소화 하는 길이다. 거기다 구구절절 변명을 하면 실수는 자라나서 어쩌면 실패로 변할 수도 있다. 또 실수에 대한 변명은 일을 망치는 것 보다 주변 사람을 엄청 피곤하게 한다. 잘못하면 깔끔하게 인정하자! 그리고 기억하자. 한 번의 성공은 운일 수 있지만, 두 번의 성공은 실력이다. 반대도 마찬가지이다. 한 번은 실수 일 수 있지만 두 번째는 실력이다. 그러니 실수하면 인정하고 그 실수가 되풀이 되지 않도록 반성적 사고를 하자.

3. 피드백을 구하지 않음.

일을 똑똑하게 하는 방법 중에 하나는 나보다 잘하는 사람들한테 그 일에 대해 조언을 구하는 것이다. 그러면 생각보다 시행착오를 많이 줄일 수 있지만 질문이 무슨 지옥문보다 무거운 대한민국의 문화에서는 사람들은 쉽사리 조언을 구하지 못한다. 그래도 조언을 구해라. 한 번 불편함을 감수하면 나중에 손발이 편할 수 있다.

또 일을 다 끝낸 다음에 피드백을 구하는 것도 상당히 중요하다. 일을 하면 결과가 나온다. 결과가 나왔다고 해서 우리가 무조건 업무적으로 성장하는 것은 아니다. 오히려 결과를 만들지 못하고 실패를 했어도 그 과정에 대한 피드백을 주변 사람에게 구했다면 업무적으로 더 큰 성장을 할 것이고 다음에 일을 더 잘 할 확률은 당연히 더 높을 것이다.

만약에 피드백을 줄 사람이 없다면 스스로 주는 셀프피드백도 상당히 도움이 된다. <두근두근>을 계획한 목적도 기록을 남겨서 스스로 피드백을 갖게 하기 위함이다. 예를 들면 나는 지금 3년 째 책을 쓰고 있다. 내 책의 결과물은 고스란히 기록으로 남는다. 누가 나한테 피드백을 준 적은 없지만 지금은 절판 된 첫 책을 가끔 혼자 다시 읽으면 잘써서 자화자찬 하는 부분도 있지만, 이렇게 써서 책을 냈다니 이불킥 하는 부분도 있다. 그렇게 셀프피드백만 똑바로 주기적으로 해도 우리는 성장할 수 있다. 하지만 일단 꾸준히 기록을 하지 못하고 또 기록한 것을 다시 살펴보지 않기 때문에 슬프지만 항상 제자리……ㅜㅜ

4. 변화를 두려워함.

일이라는 것이 계획대로 되는 경우는 드물다. 계획은 최소한의 준비이지 전부가 아니다. 그렇다면 변화를 수용하는 것은 불가피한 일이다. 하지만 대부분은 변화를 싫어하고 더 나아가 두려워한다. 반대로 생각하면 일을 잘한다는 것은 새로운 상황에 빠르게 적응한다는 것이다. 변화에 적응은 역시 첫 순간이 가장 어렵다. 막상 닥쳐서 일을 시작하게 되면 변화에 대부분 금방 (능동적인 경우) 적응한다. (수동적인 경우) 순응한다. 결국 변화에 잘 적응 하려면 문턱을 넘어가는 게 중요한데 그 문턱을 낮추는 일이 바로 공부이다. 공부 이야기는 다음 단락으로 넘어간다.

5. 발전을 위한 공부(독서)를 안 함.

공부는 두 가지 측면해서 해야한다. 첫 번쨰는 교양을 넓히기 위해서이다. 이게 앞에 4번에서 말한 문턱을 낮추는 일이다. 깊게는 몰라도 그래도 그 분야에 대해 배경 지식이 조금이라도 있으면 새로운 업무를 받아도 진입장벽이 생각보다 낮다. 하지만 내가 지난번 글에서도 강조했지만 우리나라 직장인의 독서 실태는 처참하다.

두 번째는 전문가가 되기 위해서이다. 우리가 대학교에서 한 공부는 교양공부이다. (아쉽게 대부분이 그마져도 제대로 안해서…ㅜㅜ) 내가 15년 전 전자과에서 배운 과목이랑 지금 대학의 전자과에서 배운 과목이랑은 크게 다르지 않다. 기술은 끊임없이 발전하고 그 발전한 기술은 세상을 빠르게 바꾼다. 전문가가 되려면 최전선에서 연구되고 있는 지식에 대한 습득이 필요 하지만 다시 한 번 슬프게 일단 기본적인 독서부터 안하기 때문에…..대부분의 선진국에서 문해력은 30대를 전후로 최고조를 이루지만 우리나라는…. 10대 때 정점을 찍고 한 번도 멈추지 않고 문해력이 떨어진다. 그냥 그래서 회사는 힘들 수 밖에 없다. 너도 공부 안하고 나도 안하는데 무슨 답이 있을까? 그러니 우리 제발 함께 공부하자. 공부는 생각보다 많은 것을 해결해 줄 것이다.

3. 피드백을 구하지 않는 분들께…

인류 최고의 천재 중 하나인 다 빈치도…. 틈만 나면 조언을 구했다고 한다. “그러니 제발 조언을 쫌 구하자!”라고 말하려고 했는데…. 생각보다 조언을 구할 수 있는 사람이 주변에 없는 게 현실이다…. 슬프다…. 직장에 존경하고 배울 수 있는 선배가 있으면 다행이지만 그렇지 않다면 ‘독서모임’이나 혹은 온라인 상에서 고수들에게 조언을 구하는 것도 하나의 방법이이 꼭 시도해 보면 좋겠다. 모두 화이팅!

덧. 나머지 일 못하는 사람 특지 1,2,3,4,5가 궁금하면 <두근두근>을 참고하면 된다.