Building NS-3 3.26 in Mac OS X 10.13 (High Sierra)

Standard

I haven’t updated the ns-3 installation guide for Mac OS X, so I updated with most recent version of Mac OS X 10.13 (High Sierra)

1. Get the source and unarchive

cd
mkdir workspace
cd workspace
wget http://www.nsnam.org/release/ns-allinone-3.26.tar.bz2
tar xjf ns-allinone-3.26.tar.bz2

2. Install required library (except goocanvas and pygoocanvas)

brew install libxml2
# if libxml2 is installed but still shows error on installing NS-3, 
# try 'brew upgrade libxml2' without quote

# install other required library (valgrind should be manually installed)
brew install gsl libgcrypt doxygen gtk cvs unrar p7zip xz cmake bzr 

brew install python python3
pip3 install meson
brew install graphviz pygtk

# install gccxml
git clone https://github.com/gccxml/gccxml.git
cd gccxml
mkdir gccxml-build
cd gccxml-build
cmake ../
make
sudo make install
cd ../..
rm -rf gccxml

# install required python library
pip2 install pygraphviz pygccxml

# install qt4 if you want to use netanim
# https://www.nsnam.org/wiki/Installation#Mac_OS_X, step 3
brew install cartr/qt4/qt-legacy-formula

# install mercurial if you want to use it
# https://www.nsnam.org/wiki/Installation#Mac_OS_X, step 4
brew install mercurial

# install valgrind by source
xcode-select --install

git clone git://sourceware.org/git/valgrind.git
cd valgrind

# Recent version is already patched to support High Sierra, so nothing to do 
./autogen.sh
./configure
make
sudo make install

valgrind --version # just for test
cd ..

3. Install goocanvas-0.14 (It is important to use 0.14, though more recent versions are available)

wget http://ftp.gnome.org/pub/gnome/sources/goocanvas/0.14/goocanvas-0.14.tar.gz
tar xvfz goocanvas-0.14.tar.gz
rm goocanvas-0.14.tar.gz

cd goocanvas-0.14
./configure
make
sudo make install
cd ..
rm -rf goocanvas-0.14

4. Install pygoocanvas-0.14.1 (tested with goocanvas 2.0.2 from homebrew)

wget https://launchpad.net/pygoocanvas/trunk/0.14.1/+download/pygoocanvas-0.14.1.tar.gz
tar xvfz pygoocanvas-0.14.1.tar.gz

cd pygoocanvas-0.14.1
wget http://study.prl85.com/wp-content/uploads/sites/2/2015/03/install-on-mac.sh
chmod 755 install-on-mac.sh

wget http://study.prl85.com/wp-content/uploads/sites/2/2015/03/pygoocanvas-0.14.1-mac.patch
patch < pygoocanvas-0.14.1-mac.patch
./install-on-mac.sh

cd ..
rm -rf pygoocanvas-0.14.1

5. Install ns-3

cd ns-allinone-3.26
python2 ./build.py --enable-examples --enable-tests

6. Test whether ns-3 is installed properly

cd ns-3.26
./test.py

7. Execute example file to check ns-3 is working or not

cp examples/tutorial/first.cc scratch/myfirst.cc
./waf
./waf --run scratch/myfirst

Reference)
https://www.nsnam.org/docs/release/3.26/tutorial/html/getting-started.html
https://www.nsnam.org/wiki/Installation#Mac_OS_X
https://stackoverflow.com/questions/39690404/brew-install-qt-does-not-work-on-macos-sierra
http://valgrind.org/downloads/repository.html
https://stackoverflow.com/questions/13421675/make-fails-while-installing-valgrind
https://github.com/mesonbuild/meson/issues/1054
https://mithunme.wordpress.com/2012/09/11/installing-ns-3-in-ubuntu

Appendix A)
In previous guide, the list of required library was following:

brew install wget mercurial bzr boost pkg-config gtk gsl doxygen graphviz cvs unrar p7zip xz cmake gtkmm gtkmm3 pygtk

If you have problem with installing, try installing package above.

Appendix B)
To test PyViz, see link https://www.nsnam.org/wiki/PyViz for the instruction.

Make your Raspberry Pi keep time synced!

Standard

Condition) Internet connectivity

As Raspberry PI don’t have RTC module, the time will be incorrect while turned on.
Though the OS will try to sync time, it might not be sufficient because of tolerance from NTP daemon (will not fix the time if the difference is <1000 seconds, by default).

Alternatively, use cron to periodically sync time.

1. Contents of updatetime.sh (I stored in ~/, usually /home/pi)

#/bin/bash

sudo /usr/sbin/service ntp stop > /dev/null 2>&1
sudo /usr/sbin/ntpd -gq > /dev/null 2>&1
sudo /usr/sbin/service ntp start > /dev/null 2>&1

2. Change file mode to 755 (if your file directory is different, use that directory instead of ~/)

chmod 755 ~/updatetime.sh

3. type crontab -e, and append following line, and save.
(meaning ‘execute the script every 1 minute’)

*/1 * * * * /home/pi/updatetime.sh

4. Now, your PI will be keep time synced 🙂

[XE] 회원 가입 시, 사용자가 수정 불가능한 항목 설정하기

Standard

http://study.prl85.com/xe-관리자만-수정-가능한-회원-정보-항목-설정하기/
에서는 회원 정보 수정 시, 관리자만 수정 가능한 항목을 설정하는 방법을 다루고 있습니다.

이 글에서는 이를 응용하여 회원 가입 시 사용자가 수정 불가능한 항목을 설정하는 방법을 다루겠습니다.
(활용: 특정 서비스 인증키.
즉, 회원 가입/정보 수정 시 사용자가 임의로 수정할 수는 없지만, 관리자가 정한 값을 본인 회원 정보에서는 보여주고 싶은 경우)

회원 정보 수정 때만 아니라, 회원 가입시에도 동일한 함수가 항목들을 출력하는 부분을 처리합니다.

xe – modules – member – member.admin.view.php에서
function _getMemberInputTag($memberInfo, $isAdmin = false)

다만 회원 정보 수정 때와 회원 가입 때 $readonly를 처리하는 부분이 조금 다릅니다.
회원 정보 수정 시에는, 로그인된 정보에서 관리자인지를 가려내서 수정 가능/불가능 여부가 가려지지만, 회원 가입시는 로그인된 정보라는 것이 없기 때문이죠 (로그인되지 않은 상태에서만 회원 가입이 가능하기 때문).
역으로 이 점을 이용해서, 로그인된 정보가 없을 때 (=회원 가입) 원하는 항목을 수정 불가능하게 만들면 됩니다.

$readonly = '';

if (Context::get('logged_info') == null) // 회원 가입시
    $readonly = 'readonly="readonly"';

if (Context::get('logged_info')
    && Context::get('logged_info')->is_admin != 'Y') // 회원 정보 수정시 (관리자만 가능)
    $readonly = 'readonly="readonly"';

회원 가입시에만 혹은 회원 정보 수정시 (이 경우는 관리자만)에 수정이 불가능하게 하려면 해당 항목만 남겨두면 되겠지요.

나머지 사항은 위의 링크를 참고하시면 되겠습니다.

[XE] 회원 정보 수정 시, 관리자만 수정 가능한 항목 설정하기

Standard

xe – modules – member – member.admin.view.php에서
function _getMemberInputTag($memberInfo, $isAdmin = false)
이 함수가 회원정보 수정 시 항목들을 출력하는 부분을 처리하는 함수이다.

1. 기본 정보의 경우, 쭉 내려와서 if($formInfo->isDefaultForm) 아래에서 다음 부분을 찾는다.

1.1. 이메일, 홈페이지, 블로그 같이 이미 조건문에 명시적으로 나와있는 경우
여기선 예시로 이메일의 경우를 살펴본다. (1.8.2 기준 495 라인 쯤)

else if($formInfo->name == 'email_address')
{
    $formTag->type = 'email';
    $inputTag = '<input id="email_address" name="email_address" type="email" value="'.$memberInfo['email_address'].'" />';
}

else if($formInfo->name == 'email_address')
{
    $readonly = '';
    if (Context::get('logged_info') && Context::get('logged_info')->is_admin != 'Y')
        $readonly = 'readonly="readonly"';

    $formTag->type = 'email';
    $inputTag = '<input type="email" name="email_address" id="email_address" value="'.$memberInfo['email_address'].'"'.$readonly.' />';
}

수정한다.


1.2. 이름, 닉네임처럼 조건문에 나와있지 않은 경우
여기서는 예시로 이름의 경우를 살펴본다. (1.8.2 기준 510 라인 쯤)

else
{
    $formTag->type = 'text';
    $inputTag = sprintf('<input type="text" name="%s" id="%s" value="%s" />',
        $formInfo->name,
        $formInfo->name,
        $memberInfo[$formInfo->name]);
}

위에

else if ($formInfo->name == 'user_name')
{
    $readonly = '';
    if (Context::get('logged_info') && Context::get('logged_info')->is_admin != 'Y')
        $readonly = 'readonly="readonly"';

    $formTag->type = 'text';
    $inputTag = sprintf('<input type="text" name="%s" id="%s" value="%s" %s/>',
        $formInfo->name,
        $formInfo->name,
        $memberInfo[$formInfo->name],
        $readonly);
}

추가한다.

(즉, 아래와 같이 되면 된다)
Screen Shot 2015-06-16 at 3.06.29 PM

여러 항목을 추가할 때에는 추가한 항목들이 다 else 위에 있으면 된다
(else if 구문끼리의 순서는 관계 없음)


2. 확장 변수로 지정된 항목의 경우,
}//end isDefaultForm 아래에서 다음 부분을 찾는다.

$formTag->type = $extendForm->column_type;
if($extendForm->column_type == 'text')
{
    $template = '<input type="text" name="%column_name%" id="%column_name%" value="%value%" />';
}

수정할 확장 변수가 텍스트인 경우 if($extendForm->column_type == ‘text’)보다 먼저 조건 확인이 되어야 한다. (그래야, 다른 텍스트형 확장 변수와는 다르게 처리할 수 있으니까)

즉, 다음과 같이 내용을 추가한다 (ext_var는 원하는 확장변수의 변수명을 쓰면 된다)
(기존 if($extendForm->column_type == ‘text’) 구문이 else if로 변경된 것을 알 수 있다)

$formTag->type = $extendForm->column_type;
if($extendForm->column_name == 'ext_var')
{
    $readonly = '';
    if (Context::get('logged_info') && Context::get('logged_info')->is_admin != 'Y')
        $readonly = 'readonly="readonly"';

    $template = '<input type="text" name="%column_name%" id="%column_name%" value="%value%" '.$readonly.'/>';
}
else if($extendForm->column_type == 'text')
{
    $template = '<input type="text" name="%column_name%" id="%column_name%" value="%value%" />';
}

(여기서는 텍스트 형 변수 두 개를 처리했다.)
Screen Shot 2015-06-16 at 4.09.46 PM

팁)
– 관리자 여부와 상관없이 무조건 회원정보 수정에서 불가하게 하려면, 다음 두 줄을 없애거나 주석 처리하면 된다.

// $readonly = ”;
// if (Context::get(‘logged_info’) && Context::get(‘logged_info’)->is_admin != ‘Y’)

– 2번에서, text 형태인 것이 확실하다면 if …. else if 구조로 바꿀 필요 없이, text 조건문 안에 다음과 같이 변경해도 된다. (막상 이렇게 보니, 이게 더 효율적일 수도 있겠다 싶다.)

if($extendForm->column_type == 'text')
{
    $readonly = '';
    // 위의 그림처럼 여러 확장 변수를 처리할 경우를 대비해서, 의도적으로 if 문 분리
    if ($extendForm->column_name == 'ext_var')
    {
        if (Context::get('logged_info') && Context::get('logged_info')->is_admin != 'Y')
            $readonly = 'readonly="readonly"';
    }

    $template = '<input type="text" name="%column_name%" id="%column_name%" value="%value%" '.$readonly.'/>';
}

참고 링크)
http://www.xpressengine.com/qna/20457366

(Updated) Creating Wi-Fi AP using Raspberry Pi

Standard

(Update) After the Raspbian being updated, the way setting Wi-Fi AP is changed a bit.


1. Installing Raspbian (It’s explained how it can be done with Mac OS X; however it doesn’t differ much for Windows or Linux too)
(Skip to step 2 if your Raspberry Pi already works with Raspbian.)
(You also can use image without noobs, but it might be complex)

1-1. Download NOOBS
(NOOBS is an easy operating system installer which contains Raspbian. It also provides a selection of alternative operating systems which are then downloaded from the internet and installed.)

Download NOOBS from http://downloads.raspberrypi.org/NOOBS_latest.
(If above link doesn’t work well, then download NOOBS from https://www.raspberrypi.org/downloads)

1-2. Format the MicroSD card with FAT32 partition.
(In my case, using SD Association’s SD formatter with 64 GB memory formatted the card as exFAT. However, the Raspberry Pi only detected FAT32-formatted memory, so use other tools for formatting; like Disk Utility in Mac with specifying partition type as FAT32 (FAT in DIsk Utility))

(old) 1-2. Download SD Association’s SD formatter.
Download the formatter from https://www.sdcard.org/downloads/formatter_4/eula_mac.
After download, install by executing pkg file.

(old) 1-3. Execute SD Association’s SD formatter.
Insert SD card you want to use on Mac, execute SD Association’s SD formatter, then format the card with selecting “overwrite format”

1-3. Copy NOOBS files to the SD CARD
Uncompress the downloaded NOOBS archive file (e.g. NOOBS_v1_4_1.zip)
After then, copy all files to the root of the SD card.
(Files including bootcode.bin, BUILD-DATA, …. should come to the root directory like below.)

Screen Shot 2015-06-12 at 12.37.33 PM

1-4. Turn on raspberry pi
Detach the sd card from Mac, then insert it to raspberry pi.
Boot raspberry pi. When NOOBS run, select Raspbian as operating system to install.
(Optional: set language as English (US))


2. Setting IP of Ethernet Interface (in case of static IP)
Refer to https://www.modmypi.com/blog/how-to-give-your-raspberry-pi-a-static-ip-address-update. However, you should’t assign your wireless LAN IP address (wlan0 interface in the example) to /etc/dhcpcd.conf.

3. Setting IP of Wireless LAN interface, AP configuration
Refer to https://frillip.com/using-your-raspberry-pi-3-as-a-wifi-access-point-with-hostapd.

However, I needed to exclude ieee80211n=1 in /etc/hostapd/hostapd.conf (after channel setting) to get worked. (802.11n mode is enabled even without the settings)

After setting things according to the link, you can see the AP.
You can also make AP created automatically on each boot by below commands (one-time):

sudo update-rc.d hostapd enable
sudo update-rc.d dnsmasq enable

Reference)
https://www.modmypi.com/blog/how-to-give-your-raspberry-pi-a-static-ip-address-update.
https://frillip.com/using-your-raspberry-pi-3-as-a-wifi-access-point-with-hostapd
(Deprecated) good reference from my lab mate’s blog http://blog.naver.com/solar0ryu/220391354960