리눅스는 주로 까만 화면의 터미널로 사용하지만, 가끔은 X Window 응용프로그램을 사용해야할 때가 있다. (xcalc 랄지...) 난 리눅스를 데스크탑으로 사용하지 않으므로, X System 전체를 설치하지 않는다. 이런 상황을 해결하기 위해서 맥북에 X Window를 설치하고 ssh X portforwarding을 하면 되는데, 다음과 같은 방법으로 한다.

Linux 에서

1. sshd의 X11 포트포워딩을 허용한다.

$ sudo vim /etc/ssh/sshd_config

확인!


X11Forwarding yes

설정 파일 내용중 X11Forwarding yes 가 아니라면 고쳐주고 sshd를 재시작한다. 요즘 systemctl로 관리하므로,

systemctl restart sshd

MacOSX에서

1. X Window를 설치한다.

$ brew cask install xquartz

2. XQuartz의 tcp 접속을 허용한다.

$ defaults write org.macosforge.xquartz.X11 nolisten_tcp 0

3. DISPLAY 환경 변수를 설정하여 맥 터미널에서도 쉽게 접속할 수 있도록 한다.

export DISPLAY=:0

4. 접속!

$ ssh -X targethost




Promise 기반의 fetch 라이브러리의 최대 단점은, json으로 예상하고 parsing했는데, 오류가 생겨서 원문 text를 구해야하는 상황에서, 한 번 사용된 body라 다시 쓸 수 없다고한다.


그렇다.

리눅스의 실행프로세스의 환경변수는 /proc 파일시스템을 통해서 알 수 있다. 예를 들어 pid 1000번의 환경변수는 


cat /proc/1000/environ


로 확인 할 수 있다. 하지만, 이 결과는 변수간 구분이 잘 확인이 안된다. 변수간 구분을 '\0'으로 분리시켜 놓았기 때문이다. 실제 프로세스 메모리에서도 '\0'으로 구분되어 있고 이를 그대로 화면에 출력하는 것이다. 다음을 보자.


cat /proc/1000/environ | xargs -0 -n 1 echo


xargs 는 표준 입력을 명령의 argument로 전달해 실행해주는 함수인데, 이때 기본값은 공백을 사용하여 표준입력을 분리한다. 하지만 위와 같이 '-0' (zero) 옵션을 주면 구분자를 '\0'으로 하라는 뜻이며, '-n 1' 을 주어 하나의 인자마다 하나의 명령을 실행(여기서는 echo)하라는 의미가 된다.


사족으로 xargs의 -0 옵션은 find 의 -print0 옵션과 같이 사용하여 출력결과를 실행시에 적절하게 처리하는데 사용한다.

vimscript로 실행 파일을 만든다면, python이 흔히 그러하든 #!을 맨 앞에 두어


#!/usr/bin/env vimscript


echo 10 + 20


이런 식이 될 수 있다. 그럼 vimscript는 기존의 vim을 이용하도록 만들 수 있는데, 몇가지 옵션을 줘야한다.


  • Swap file (.sw*) 파일을 만들지 말 것 (-n)
  • 고전의 vi 모드로 동작하지 말 것 (-N)
  • Visual mode가 아닌 ex 모드로 시작할 것 (-E)
  • 시작시 조금 조용하게 시작할 것 (-s)
  • .viminfo 파일을 읽지 말 것 (-i NONE)
  • vim option 중 verbose 는 1로 두어 출력을 완전 끄지 말 것 (-c 'let &verbose = 1')
  • 본문을 source 하여 실행 할 것 (-c 'source %')
  • 맨 마지막에 개행을 두고 종료할 것 (-c 'echo ""', -c 'qa!')

#!/bin/bash


exec /usr/bin/env vim -n -N -E -e -s -i NONE -c 'let &verbose=1' -c 'source %' -c 'echo ""' -c 'qa!' -- $@


위와 같이 두 줄짜리 ~/bin/vimscript 파일을 만들어 실행 속성을 주면 되겠다.

iOS Simulator를 통해서 로그메시지를 보다가 다음과 같은 것을 만나면, Spam 성 로그 유발자로 지목되어 더이상 로그메시지를 화면에 표시 안해준다는 뜻이다.


LOG MESSAGE QUOTA EXCEEDED - SOME MESSAGES FROM THIS PROCESS HAVE BEEN DISCARDED


간단히 Simulator를 재시작하자.


  1. 소액결제 2017.12.04 06:37 신고

    감사합니다 ~

http://entropymine.com/jason/lr/misc/controls.html 에 있는 일부를 옮겨보면,

  • 이동 멈춤: Space
  • 자살: Ctrl-A
  • 끝: Ctrl-R
  • 일시정지: Esc
  • 다음단계로 넘김: Ctrl-U, Ctrl-6
  • 소리 끔/켬: Ctrl-S
  • 게임 속도 올림: -
  • 게임 속도 내림: =

게임은 Javascript로 구현한 Apple2 가상머신으로 할 수 있...

https://www.scullinsteel.com/apple2/#lode_runner

간단히 메모한다. DNS 323 Sensor는 온도센서와 FAN Speed Sensor가 있다.


온도는


/sys/class/hwmon/hwmon1/device/temp1_input


FAN Speed는


/sys/class/hwmon/hwmon0/device/fan1_input

으로 알 수 있다.


온도값은 temp1_input 값의 1/1000 이며, 단위는 섭씨이다.

FAN Speed는 RPM을 나타낸다.

  1. june8th 2017.08.11 07:53 신고

    이게 아직도 돌아갑니까 나는 꺼 놨어요.

  2. Coolen 2017.08.11 07:55 신고

    집에 NAS는 하나 있어야해서 어떻게든 돌리고있는 중. 갑자기 쉘이 필요할 때도 있으므로...

    Alt-f 로 덮어썼음. 원래 펌웨어는 기억도안나네.

개발자가 만드는 어떤 기능이란, 완전 무에서 창조하는 것이 아닌 이미 존재하는 하위 기능을 조합하여 상위기능으로 만들어 내는 것이다. 하위 기능에 대한 충분한 이해를 바탕으로 상위 기능을 조합해야하는데, 하위 기능자체에 버그 혹은 구현 미비점이 있어서 상위기능을 만들어내는데, 문제가 생긴다면 우회하는 방법으로 만들어야한다. 이때 사용하는 기술에 대한 통칭을 'Hack'이라한다. 정석이 아닌 꼼수를 사용하였기 때문이다.


간혹, 하위기능의 버그가 아닌 이해부족으로 우회하는 방법을 사용해야했다면, 이것은 Hack이라 할 수 없다. 왜 자신의 무지에 근거한 개발을 Hack이라는 고상(?)한 이름으로 포장하려하나. 그것은 자신의 무지를 드러내기 싫고, 이해하기 위해 들인 노력을 무위로 돌리고 싶지 않기 때문에 그렇다.


여러개의 탭을 열었을 때, 인접한 탭들을 한 번에 닫고 싶으면, SHIFT 혹은 Cmd (Window의 ctrl)키를 누른 채 마우스로 선택한다음 Cmd+W (Windows의 Ctrl-W)을 누르면 된다.

라즈베리파이에 무선랜 USB를 꽂고, (무선랜이 지원되는 버전3의 경우에도 비슷하리라 생각되는데) 이동하면서 작업할 때, 무선랜 접속 설정을 변경해야 할 일이 생긴다. 무선랜에 접속하는 정보는 /etc/wpa_supplicant/wpa_supplicant.conf 파일에 저장되며, 여기에 알려진 무선랜 접속 정보를 기록해두는데, 대략의 설정은 다음과 같다.


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

network={
	ssid="lorthlorien"
	psk="xxxxxxxxx"
	key_mgmt=WPA-PSK
}

network={
	ssid="TOMNTOMS"
	psk="toms5123"
	key_mgmt=WPA-PSK
}

저 network 항목하나만 추가하면 될 일인데, micro sd card를 빼어 수정하면 될 일이지만, adapter가 없거나, 노트북에서 읽을 수 없는 파티션으로 만들어졌다면, 라즈베리파이 화면이 보이지 않기 때문에 손 쓸 수 있는 방법이 쉽지 않다.


다음과 같은 방법으로 해결한다. 안전한 곳에서 연결되었을 때 미리 해두어야한다.


/etc/rc.local 에 /etc/rc.hojin 을 실행하도록 한다.


#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

/etc/rc.hojin &
exit 0

그리고 /etc/rc.hojin은 다음과 같이 부팅후 접속되어 있는 모든 파티션에서 wpa_supplicant.conf 가 있는지 확인해서 뒤에 추가하는 방식을 취한다. 소스에는 기존 내용을 덮어 쓰지 않기 위한 장치를 마련했으나 자세한 설명은 생략한다.


#!/bin/sh

W=wpa_supplicant.conf
T=/etc/wpa_supplicant/wpa_supplicant.conf

fdisk -l /dev/sd[abcd] 2>/dev/null | grep ^/ | awk '{print $1}' |
while read partition
do
	mount $partition /media
	if test -f /media/$W 2>/dev/null; then
		echo "Found setup file: $partition"
		LINE=`grep -n HOJIN $T | awk -F: '{print $1}'`
		if test -z "$LINE"; then
			echo "#HOJIN" >> $T
			cat /media/$W >> $T
		else
			( head -n +$LINE $T; cat /media/$W ) > /tmp/$W
			mv /tmp/$W $T
		fi
		( sleep 20; mount $partition /media; ifconfig -a > /media/ifconfig.log; umount /media ) &
	fi
	if test -f /media/rc.sh; then
		bash /media/rc.sh
	fi
	umount /media 2>/dev/null
done

일단 처음 부팅하면 wpa_supplicant.conf를 수정하는 일만 일어나므로 다시 부팅하도록 한다.


두번째 부팅후 20초가 지나면 같은 파티션에 ifconfig.log 로 현재 ip 정보를 기록하도록 되어 있으므로 노트북으로 확인할 수 있다.





+ Recent posts