간만에 웹기반 코딩을 하니, 생각보다 잘 안됩니다.
늘 그렇지만, 간단한 것 하나 때문에 고생하다가 노트 해 둡니다.
그 전에 중요한 것 한가지. 물론 잘 알고 계시겠지만...
Javascript는 클라이언트 사용자의 컴퓨터에서 실행되며, PHP는 서버에서 해석되고 실행됩니다.


1. 변수를 그냥 쓰는 방법
<script>
function fx()
{
    excution += "<?=$variable?>";
}
</script>
※ string 따위의 경우, 앞뒤에 \" 처리 필요.

2. 파라미터로 전달하는 방법
<script>
function fx(variable)
{
     excution += variable;
}
</script>

※ call
echo("<script>fx(\"$phpvar\");</script>");



Tag // JavaScript, php
FTP 업/다운로드를 할 경우, 요즈음은 [자동]모드로 대부분 FTP 프로그램에서 알아서 해 줍니다만,
가끔 이 모드가 잘못되어 실컷 보낸/받은 파일이 사용할 수 없는 상태가 되기도 합니다.
또한 저 처럼, cmd창에서 windows의 기본 FTP를 이용하여 파일을 업/다운로드 할 경우에도 binary로 받겠다는 명령어를 사전에 날려줘야 합니다. 저는 이를 알고 있음에도 불구하고, 실수를 저질러서 오늘 큰 낭패를 보기도 했는데요.

기본적으로 Text 모드이건 Binary모드이건, 내용은 동일합니다. 그러나 Binary모드의 파일이 Text로 저장될 경우, 특정 문자가 다르게 저장이 됩니다. 여기서 그 특정문자는 줄바꿈 문자인데, CR+LF(캐리지리턴+라인피드) 이 문자가 다르게 저장됩니다.
Binary파일은 말 그대로 Binary방식으로 읽어들이도록 되어 있다보니, 이것이 Text로 저장되면 올바로 읽어낼 수가 없습니다.
압축 파일을 Text로 전송해 버리면, 풀리지가 않는 것도 그 이유입니다.
역으로 해석하면 어떤 파일이건간에 Binary모드로 전송하면 [문제없다]가 됩니다.

의문점이 생기시지 않나요? Binary모드로 전송하면 아무런 문제가 발생하지 않는다면, Text모드는 왜 존재하는 걸까요?
Text는 7비트로 한 개의 문자를 표현합니다. 이는 해석도 7비트로 한다는 의미가 되며, 일종의 규약이 됩니다.
7비트 단위의 규약에 따라 전송하기 때문에, 안정성과 빠른전송에 장점이 있습니다. 또한 Binary모드와 달리, 일부 정보가 유실되어도 접근이 가능하죠. 또한, 인터넷 초창기 시대에는 Text방식의 전송만이 허용이 되었습니다. 그 관습이 아직도 남아있어, 그러한 방식만 지원하는 경우와의 호환성 등으로 아직 Text모드가 존재합니다.

※ 위에서 사용한 Text 모드는 ASCII 모드와 동일한 표현임.
[덧] 본Article과 관련된 Programming 정보도 있네요 http://snbosoft.tistory.com/entry/바이너리Binary-텍스트Text-파일의-차이


Tag // ASCII, binary, ftp, TEXT

수많은 벤더에서, 시스템과 FC/SCSI카드, LTO 등을 만들고 있으며, 이를 사용하게 하는 백업 S/W또한 다양하다.
그만큼 이 장치들간의 접속/호환/운영에 많은 문제점들이 있는데, 작업 순서는 일반적으로 아래와 같다.

1. 서버에 FC/SCSI카드 장착
2. LTO와 물리적으로 연결
3. 서버에서 Drive 및 Changer(Robot) 인식
4. 백업 소프트웨어 설치 및 백업 스케줄링, 백업 실시

여기서, 3번에 주목하자.
Drive는 Tape를 읽어, 실제로 I/O를 일어나게 한다. 여기에서 Drive에 Tape을 자동으로 삽입하게 하는 Robot을 Changer라 하는데,
이 Changer의 인식이 OS에서 불가한 몇몇 장비들이 존재한다. 아니, 일반적으로 Drive만 OS에서 인식하고, Changer는 백업 소프트웨어를 설치하면 Changer를 인식한다.

Drive는 대부분 /dev/rmt 에 device가 생성이 되나, Changer가 여기에 생성되지 않는 장비들이 있다.
퀀X, 오버XX 등의 장비들이 이에 속하는데, 그 이유는 이들이 기본 인터페이스로 SCSI 인터페이스를 가지고 있기 때문이다.
대부분 LTO의 drive module은 st module을 사용하는데, 이러한 장비들은 sgen 이라 하는 모듈을 사용한다.

#modinfo |grep sgen
결과에 아무런 정보가 출력되지 않는다면, sgen driver가 load되지 않은 것이다.

sgen driver를 load한다.
#modload /kernel/drv/sparcv9/sgen

확인한다.
#modinfo |grep sgen
254 7b7e6000   3d90 151   1  sgen (SCSI generic driver 1.11)

/kernel/drv/sgen.conf 파일 내부에 changer에 해당하는 부분을 기술한다.
device-type-config-list="changer";

그 후, 해당 Changer의 target number와 lun number를 /kernel/drv/sgen.conf 파일 내부에 기술한다.
name="sgen" class="scsi" target=0 lun=0;
name="sgen" class="scsi" target=0 lun=1;
name="sgen" class="scsi" target=1 lun=0;
name="sgen" class="scsi" target=1 lun=1;

Changer를 인식시킨다
#touch /reconfigure
#shutdown -g0 -i6 -y
또는,
#update_drv -f sgen

인식 확인은 다음과 같이 한다.
#ls /dev/scsi/changer
(changer는 cxtxdx 명으로 인식된다.)

이후, 백업 소프트웨를 설치하여 해당 Changer(Robot)을 컨트롤 하는 테스트와 함께 백업 테스트를 실시해 본다.

협력사 대상으로 솔라리스 Jumpstart 구성 방법을 강의하고, 필요한 내용을 요약 해 둔다.
강의 내용은 자사 플랫폼만을 대상으로 하였으나, 일부 범용적으로도 사용할 수 있도록 수정.
아래 예제는 서버 1대에 클라이언트 1대를 대상으로 함.

1. 인스톨서버에 디렉토리 작성 후 CD로 부터 OS Image 생성
# mkdir -p /export/install/Sol10
# cd /cdrom/cdrom0/s0/Solaris_10/Tools
# ./setup_install_server /export/install/Sol10
(시간이 꽤 걸림) <- 여기서 생성된 /export/install/Sol10 디렉토리 내용을 iso로 묶어 두면, 재사용 가능

2. 미니루트 작업용 디렉토리 작성 후 복사, unpack중 에러발생할 경우, 가볍게 무시
# mkdir /tmp/work
# /boot/solaris/bin/root_archive unpackmedia /export/install/Sol10 /tmp/work
# rm /tmp/work/tmp/AdDrEm.lck

3. 드라이버 설치
Jumpstart는 네트웍을 통해 설치를 하므로, 해당 네트웍 인터페이스에 대한 드라이버가 없다면, 해당 드라이버를 설치한다.
아래 드라이버는 Fujitsu용 Giga-Ethernet 드라이버와 Ultra-SCSI 드라이버 설치과정이다.

3.1. 미니루트에 FJSVgid 설치
# cd /cdrom/cdrom0/FJSVgid_4.0/10
# pkgadd -R /tmp/work -d . FJSVgid.u
# pkgadd -R /tmp/work -d . FJSVgid.v

3.2. 미니루트에 Ultra SCSI 설치
# cd /cdrom/cdrom0/ultra_lvd_driver/10
# pkgadd -R /tmp/work -d . FJSVulsa.u
# pkgadd -R /tmp/work -d . FJSVulsa.v
# patchadd -C /tmp/work 914572-01(?) - 그냥 들어있는 패치하면 됨

4. 미니루트를 재포장 후 적용
# mkdir -p /tmp/media/Solaris_10
# /boot/solaris/bin/root_archive packmedia /tmp/media /tmp/work
# cd /tmp/media
# find boot Solaris_10/Tools/Boot | cpio -pdum /export/install/Sol10
# df -k 확인
# umount -f /dev/lofi/1
# lofiadm -d /dev/lofi/1

5. 커스텀 jumpstart 디렉토리 작성, 드라이버, 샘플 복사
# mkdir /jumpstart
# echo "share -F nfs -o ro,anon=0 /jumpstart" >> /etc/dfs/dfstab
# shareall

(Giga-Ethernet)
# mkdir /jumpstart/fjgi
# cp -p /cdrom/cdrom0/install_v4 /jumpstart/fjgi/.
# cp -p /cdrom/cdrom0/admin /jumpstart/fjgi/.
# cp -pr /cdrom/cdrom0/FJSVgid_4.0/10/* /jumpstart/fjgi/.
(Ultra-SCSI)
# mkdir /jumpstart/fjulsa
# cp -p /cdrom/cdrom0/install /jumpstart/fjulsa/.
# cp -p /cdrom/cdrom0/admin /jumpstart/fjulsa/.
# cp -pr /cdrom/cdrom0/ultra_lvd_driver/10/* /jumpstart/fjulsa/.

# cp -r /export/install/Sol10/Solaris_10/Misc/jumpstart_sample/* /jumpstart

6. nfs서버 가동중 확인, disable이면 enable
# svcs -av | grep nfs
# svcadm enable (기동시킬 서비스)

7. profile 작성 (설치 기본정보를 기록한다-아래 형식에 주의)
# vi /jumpstart/profile
 install_type initial_install
 system_type server
 partitioning explicit
 cluster SUNWCXall
 filesys c0t0d0s0 51200 /
 filesys c0t0d0s1 24576 swap
 geo             Asia
 locale          ko

8. finish 작성
# vi /jumpstart/finish
 #!/bin/sh
 BASE=/a
 JUMPSTART=/a/mnt
 mount -F nfs 인스톨서버IP:/jumpstart ${JUMPSTART}
 ${JUMPSTART}/fjgi/install_v4 -R ${BASE} -d ${JUMPSTART}/fjgi -p sun4u
 ${JUMPSTART}/fjulsa/install -R ${BASE} -d ${JUMPSTART}/fjulsa -p sun4u
 umount ${JUMPSTART}
 exit 0

9. rules 작성
# vi /jumpstart/rules의 가운데 쯤, 클라이언트 호스트 정보 입력
 hostname 클라이언트호스트명 - profile finish

10. rules 체크 (ok가 떨어질 때 까지 위 내용 확인)
# cd /jumpstart
# ./check -p /tmp/media -r rules

11. 인스톨서버에 클라이언트 서버정보 추가
# vi /etc/hosts
클라이언트IP[탭]hostname(클라이언트)[탭]loghost

12. 클라이언트의 맥어드레스 확인
클라이언트 PROM(ok-mode까지 부팅)
{ok} show-nets
jumpstart에 사용될 ethernet-port 선택
{ok} cd ethernet-port 주소
{ok} .properties
mac 부분에서 해당 MAC Address 확인

13. 클라이언트 서버 맥 등록
# vi /etc/ethers
맥어드레스 hostname(클라이언트)

14. bootparams 생성
# /export/install/Sol10/Solaris_10/Tools/add_install_client -c 서버호스트명:/jumpstart 클라이언트호스트명 sun4u  <== 호스트명은 꼭 /etc/hosts에 들어가 있어야하며(IP안됨) 서버호스트명은 loghost명 이어야 됨
# cat /etc/bootparams 확인하여 올바로 값이 입력되었는지 확인

15. 인스톨
{ok} boot net - install
위 방법이 안될경우, net의 alias 를 확인하거나
{ok} boot 자신의 네트웍 물리주소 - install

#mkisofs -o /tmp/test.iso -V cies -R /test

-o : Output Option
/tmp/cies.iso : Image file이 생성되는 디렉토리
-V : Volume 이름 Option
cies : Volume 이름
-R : Sub dir. Option
/test : Image를 만들고자 하는 디렉토리(Source)

체크아웃 연말 이벤트! 100명에게 아이폰을 쏜다! 이벤트 보기
나도 아이폰 한번 써 보자!

1. [New File] 메뉴를 이용하여 나오는 창에서 C++ 항목을 선택하세요
    - Cocoa Thouch 에서는 C++ 생성 항목이 없습니다, 아래쪽 Cocoa 항목에서 선택할 수 있습니다.

2. 파일이름을 입력하세요( CppObject.mm)
   - 헤더파일과 함께 프로젝트에 생성됩니다.

3. 클래스를 구현하세요.

 CppObject.h

    class CppObject
    {
           int  m_nMeber;
public:        
       CppObject();
       ~CppObject();
    }

 

 CppObject.mm

   CppObject::CppObject()
   {
       m_nMember = 10;
   }   
   CppObject::~CppObject()
   {
   }

4. 컴파일을 우선 해봅니다.
5. 컴파일 성공해서 빌드까지 무사히 성공되는 것을 볼 수 있습니다.

--------------------------------------
 이제 Object-C에서 직접 사용해 보시다.
--------------------------------------

1. AppDelegate 클래스의 초기화 함수에서 호출해 봅니다. 

 AppDelegate.m

 #include "CppObject.h"
 - (void) somefunction
{
   CppObject* pObj = new CppObject();
  delete pObj;
}

2. 컴파일 합니다.
3. 에러가 발생합니다.
   - Object-C는 파일확장자를 이용하여 언어를 구분하는 것 같았습니다.
   - m 확장자인 경우에는 C++ 코드를 사용할 수 없었습니다.
4. 그래서 AppDelegate.m의 확장자를 mm으로 변경합니다

 AppDelegate.mm

 #include "CppObject.h"
- (void) somefunction
{
   CppObject* pObj = new CppObject();
  delete pObj;
}

5. 다시 빌드합니다
6. 빌드 성공해서 디버깅해봅니다.
   m_pObj->m_nMember 값이 생성자에서 설정한 '10'을 가지고 있음을 알 수 있습니다.
이제부터는 C++를 자유롭게 이용할 수 있다니, 한결 개발이 자유로울 것 같네요. 

----------------------------------------------
Cocoa 객체 사용하기
----------------------------------------------

다음으로, C++ 클래스에서 Cocoa 객체를 사용할 수 있는지 테스트 해보았습니다. 
1. 아래와 같이 Cocoa 객체를 선언하고, 생성합니다. 

 CppObject.h

    class CppObject
   {
       int  m_nMeber;
       NSString*   strTitle;
public:        
       CppObject();
       ~CppObject();
    }

 

 CppObject.mm

   CppObject::CppObject()
   {
       m_nMember = 10;
       strTitle = [NSString stringWithString:@"Hello World"];
   }   

   CppObject::~CppObject()
   {
       [strTitle release];
   } 

2. 빌드 합니다.
3. 위의 테스트 코드에서 breakpoint를 설정하고 값을 확인 또는 생성자에서 값을 확인합니다.
   - strTitle이 "Hello World"를 가지고 있는 것을 볼 수 있습니다. 
이상입니다. 

결론은  C++를 사용하고 싶으면 확장자를 mm으로 사용하는 것 이었습니다. 참 쉽죠~

기존에 가지고 있던 C++ 코드가 있다면, 많은 부분을 재사용할 수 있을것 같네요.
C++를 사용함으로써 iPhone에서 다른 문제가 있는지는 저두 입문한지 얼마안되서 잘 모르겠습니다.
이부분은 저두 사용해 보면서, 추가적인 정보가 있으면 올리도록 하겠습니다.

[출처]맥부기 개발자 모임: 아이펠스님 게시물

Tag // C++, 아이폰
일단은 간단하게 기록 해 둡니다. VMWare를 이용합니다.

[기본설정]
1. VMWare leopard 10.5.7 torrent 검색(google) - 최신 XCode가 10.5.6 이상을 요구
   - iDeneb Max OSX 10.5.7 이 검색됨
2. torrent를 이용, 파일을 다운로드 하고, 압축 해제.(약 10G)
3. VMWare 6.5실행, Open메뉴에서 압축 푼 폴더에서 파일 선택
4. VMWare에서 새로운 탭이 생성되는 것을 확인
5. [Resume this virtual machine]을 선택하고 실행(기본 상태가 suspend)

※ 주의사항
- 기본상태가 suspend상태임. power-off하고 부팅하면 정상부팅 안됨
- OSX 내부에서 Shutdown 이나 Log-off 하면 안됨.
> 종료시에도 반드시 suspend 사용.

[네트웍 설정]
기본적인 네트웍이 Host 상태임
VMWare의 suspend 상태에서는 네트웍을 변경할 수 없음

1. 가상머신이 설치된 곳의 iDeneb Mac OSX 10.5.7.vmx 파일을 텍스트 에디터로 오픈
2. ethernet0.connectionType = "nat" 를 추가 (메모리 용량도 추가 가능)
3. OSX를 다시 실행(Resume)
4. 네트웍 설정에서 DHCP로 설정
5. 사파리로 웹 커넥션 테스트
6. 안되면 다시 점검

[XCode]
인터넷이 올바로 연결되었으므로
1. developer.apple.com 에서 XCode를 download & install

※ 주의사항
- OS업그레이드 하면 부팅안됨
- 종료시 반드시 suspend
- 종료 가능한 버전이 10.5.4이나, XCode가 10.5.6을 요구하므로 업그레이드 하면 부팅 안됨.

종료 가능한 정상버전 또는 방법을 알고계신 분 계시면 연락 부탁드립니다.
Taejon 2001 :
본선문제 PKU 1060 ~ 1092  or  ARC 2321 ~ 2328
http://acmicpc-live-archive.uva.es/nuevoportal/region.php?r=as4&year=2001
http://acm.pku.edu.cn/JudgeOnline/searchproblem?field=source&key=Taejon+2001


Taejon 2002 :
본선문제 PKU 1330 ~ 1337
http://acm.pku.edu.cn/JudgeOnline/searchproblem?field=source&key=Taejon+2002


Seoul 2003 :
본선문제 ZJU 2679 ~ 2687
2679 :
http://acm.zju.edu.cn/show_problem.php?pid=2679


Seoul 2004 :
예선문제 Hello-World 44
http://www.hello-world.co.kr/?q=node/110


Seoul 2005 :
예선문제 Hello-World 41 - 43
http://www.hello-world.co.kr/?q=node/104

본선문제 TJU 2501~2510
http://acm.tju.edu.cn/toj/search_process.php?s=Asia+-+Seoul+2005


Seoul 2006 :
예선문제 Hello-World 35 - 40
http://www.hello-world.co.kr/?q=node/98

본선문제 ZJU 3131 ~ 3140
http://acm.zju.edu.cn/onlinejudge/searchProblem.do?contestId=1&titlefrom=0&authorfrom=0&sourcefrom=0&query=Seoul%202006


Seoul 2007 :
본선문제 ARC 3900~3909
http://acmicpc-live-archive.uva.es/nuevoportal/region.php?r=as4&year=2007


Seoul 2008 :


원본 출처 : wookayin.com


'지혜 이야기 > 알고리즘' 카테고리의 다른 글

ACM ICPC 국내지역 대회 기출문제  (0) 2009/10/06
ROBOCODE Master의 비밀!!!  (0) 2007/04/23
우연히 보게 된 코드  (2) 2007/04/19
DP(Dynamic Programming)  (0) 2006/01/20
칼로리 계산(Back Tracking)  (0) 2006/01/18
ACM 10018 Reverse And Add  (0) 2006/01/16
종종 어플리케이션들은 시작할때 솔라리스의 버전을 체크 합니다. 필자는 최근에 그러한 어플리케이션을 설치 하였습니다. 어플리케이션이 솔라리스의 구버전에서만 인증되었는지에 대해서는 알 수 없었습니다. 또한, 어플리케이션의 인스톨러는 OS 의 버전을 확인할 만큼 훌륭하지 않았었습니다!

그러므로 결국 저는 제 시간을 낭비한 걸까요? 아닙니다! 'dtrace' 가 저를 구원해 주었습니다. 필자는 dtrace 스크립트를 이용하였습니다.

1.실행 파일을 'fubar' 라고 가정해 봅시다. fubar 가 어떻게 솔라리스 버전을 가져오는지를 살펴 봅시다. 결과를 통해서 uname() 시스템 콜임을 알았습니다.

$ truss ./fubar 2>&1 | grep uname
uname(0xFFBFF898)                               = 1

2.'fubar' 가 기대하고 있는 솔라리스 버전을 살펴 봅시다.
$ strings fubar | grep 'SunOS '
SunOS 5.5.1
SunOS 5.6
SunOS 5.7
SunOS 5.8
SunOS 5.7 Generic_106541-05 sun4u

필자가 이것을 이전에 알았다면 아마 솔라리스8 마이그레이션 지원 환경에 설치하였을 것입니다.

3.아래가 'fubar' 를 속이기 위한 dtrace 스크립트 입니다. 'fubar' 는 오직 "SunOS" 와 "5.5.1" 만을 신경 씁니다. 그러므로 솔라리스가 1986년도에 8086에서 돌아가는 것이라도 상관 없습니다.
$ cat unameSol8.d
#!/usr/sbin/dtrace -s
#pragma D option destructive
syscall::uname:entry
/execname == "fubar"/
{
        self->addr = arg0;
}

syscall::uname:return
/execname == "fubar"/
{
        copyoutstr("SunOS", self->addr, 257);
        copyoutstr("PowerPC", self->addr+257, 257);
        copyoutstr("5.5.1", self->addr+(257*2), 257);
        copyoutstr("gate:1996-12-01", self->addr+(257*3), 257);
        copyoutstr("PPC", self->addr+(257*4), 257);
}


필자:
Katsumi Inoue

이 글의 영문 원본은
Spoofing Solaris version using dtrace
에서 보실 수 있습니다.