1월, 2015의 게시물 표시

OS/2 tricks: Icon corruption

Sometimes, a default icon of a program which is shown on WPS is corrupted even though an original .ico file is normal. Generally, this problem occurs when compressing resources with 24-bits and/or 32-bits icons. On OS/2, the executables such as .exe and .dll can be compressed with /EXEPACK option when linking with IBM linkers such as link386.exe and ilink.exe , or with lxlite.exe after linking. Out of these, lxlite.exe may corrupt a default icon, and maybe other icons as well if it compress the executables containing resources. In addition, a resource compiler, rc has -x option to compress resources, too. This may also corrupts icons. The best way to fix this icon corruption problem is to fix a resource compiler and lxlite. However this is not easy. Then, which ways are possible ? The simplest way is to compress neither the executables nor resources. However, we will get much bigger executables. More reasonable way is to compress the executables only. For example, L...

VirtualBox 에서 스크린 샷 찍기

현재 VirtualBox 4.1 을 쓰고 있다. 개인적으로 OS/2 를 주로 쓰고 있는데, OS/2 가 가장 잘 지원되고 있는 버전이 4.1 이기 때문이다. 그런데 VirtualBox 에서 OS/2 의 스크린 샷을 찍으려고 메뉴를 찾아봤더니, 메뉴에는 보이지 않았다. 스냅샷 이 있길래 혹시 이건가 ? 해서 시도했덨니, 흠... ScreenShot 은 아니었다. 그래서 구글신께 여쭸봤더니 답을 주셨다. VirtualBox 4 이전에는 아예 기능이 없었지만, VirtualBox 4 부터는 스크린샷 기능이 있다고 한다. 다만 메뉴에는 없고 VBoxManage 를 이용해야 한다. 4.2 에나 4.3 에는 메뉴에 있을 수도 있다. 명령행에서 다음을 수행하면 된다. VBoxManage controlvm  "가상 머신 이름" screenshotpng "png 파일 이름" 큰 따옴표(") 는 문자열에 공백이나 특수 문자가 없다면 생략할 수 있다. 이런 궁금중이 있을 것이다. 게스트 OS 의 화면 갈무리(캡쳐) 프로그램을 쓰면 되지 굳이 저렇게 해야 하나 ? 물론 게스트 OS 의 화면 갈무리(캡쳐) 프로그램을 써도 된다. 하지만 그런 프로그램이 없거나, 게스트 OS 에스 파일을 가져오지 못하는 경우이거나, 또는 텍스트 화면을 갈무리할 필요가 있거나, 아니면 게스트 OS 자체의 설치 과정을 갈무리해야 할 때 등등... 이럴 때는 꽤나 유용하다.

git patch 파일에 판번호 붙이기

git 의 가장 강력한 장점 중의 하나는 패치 관리라고 생각한다. 패치를 로컬에서 관리하다가 때로는 업스트림에 보내야 할 때가 있다. 한 번에 통과되면 좋겠지만, 대부분 여러 번의 리뷰를 거쳐서 통과된다. 그런데 매 번 같은 이름으로 패치를 보내게 되면 이전의 패치와 헛갈리는 경우가 종종 있다. 이를 피하기 위해 패치에 판번호를 붙일 필요가 있는데, 이 방법을 살펴보자. 가장 기본적인 방법이라면, format-patch 로 패치를 만들고 나서, 해당 패치 파일들을 수작업으로 수정하는 것이다. 패치 파일이 한 두개라면 상관없지만, 그 이상이면 일일이 바꾸는 게 쉽지 않다. 다행히 git 에서는 이를 위한 기능을 제공한다. 두 가지 방법이 있다. 하나는 --subject-prefix 를 이용하는 것이고, 다른 하나는 -v숫자 를 이용하는 것이다. --subject-prefix 일반적으로 format-patch 로 만들어진 패치 파일들의 제목은 [PATCH n/m] 형태이다. --subject-prefix 는 이 중에서 'PATCH' 를 지정된 문자열로 바꾼다. 예를 들어서 --subject-prefix "PATCH v2"  라고 하면 [PATCH n/m] 대신에 [PATCH v2 n/m] 형태가 된다. 하지만 패치 파일 이름의 형식은 달라지지 않는다. -v숫자 -v숫자 는 'PATCH' 문자열을 바꾸지 않고 대신에 'PATCH' 문자열 다음에 'v숫자' 를 추가한다. 예를 들어, -v3 라고 하면 [PATCH n/m] 대신에 [PATCH v3 n/m] 형태가 되며, --subject-prefix 와 달리 패치 파일 이름의 형식도 바꾼다. 파일 이름의 앞에 v숫자- 가 붙는다. 그리고 -v숫자 는 --subject-prefix 와 함께 쓰일 수 있다. 기본적으로 이 두 옵션은 format-patch 에서 쓰이지만, send-...

OS/2 codes: How to support DBCS #5 Level 3 application(Full-IME)

So far, we've found the way to support DBCS without consideration of IME itself. They are called level 1 application. Level 1 applications are useful. However, they still lack something. Because, a conversion window is not integrated to a working window. For example, let's consider a word processor program. On level 1 application, a size and a type of a font of a conversion window are different from ones in a working window. This looks ugly and uncomfortable. In addition, level 1 applications use over-the-spot input type. That is, a conversion window shows up over a underlying text. Users cannot see the texts under the conversion window until a conversion is completed. In this article, let's find to make level 3 applications, which use IME fully. Making Level 3 Applications To make level 3 applications, you neede OS/2 ToolKit v4.5 or later. And when linking a program, you need to link against os2im.lib . Make sure to add os2tk45/h to C_INCLUDE_PATH and to add os2tk...

OS/2 codes: How to support DBCS #4 Process WM_QUERYCONVERTPOS

이미지
WM_QUERYCONVERTPOS is sent in order to query a position of a conversion window and a candiate window. However, an application is not aware of IME and not needed to control IME at all. Let's see a syntax of WM_QUERYCONVERTPOS. This message is sent by an application to determine whether it is appropriate to begin conversion of DBCS characters. param1 PRECTL pCursorPos /* Cursor position. */ param2 ULONG ulReserved /* Reserved value, should be 0. */ This message may return QCP_CONVERT or QCP_NOCONVERT. If you return QCP_NOCONVERT, then an window does not receive DBCS characters. That is, this has an effect to disable IME. If you return QCP_CONVERT, then an window receives DBCS characters. In this case, [pCursorPos] should be updated. [pCursorPos->xLeft] and [pCursorPos->yBottom] is a bottom-left corner of a conversion window and a upper-left corner of a candidate window. [pCursorPos->xRight] and [pCursorPos-yTop] is a upper-right corner of a ...

OS/2 codes: How to support DBCS #3 Process WM_CHAR

On PM, users' key inputs are delivered with WM_CHAR message. First see a syntax of WM_CHAR. This message is sent when an operator presses a key. param1 USHORT fsflags /* Keyboard control codes. */ UCHAR ucrepeat /* Repeat count. */ UCHAR ucscancode /* Hardware scan code. */ param2 USHORT usch /* Character code. */ USHORT usvk /* Virtual key codes. */ Here, the relavant things are [fsflags](=SHORT1FROMMP(mp1)), [ucscancode](=CHAR4FROMMP(mp1)) and [usch](=SHORT1FROMMP(mp2)). A DBCS character consists of two bytes. So do not assume that [usch] is a single-byte. Then what is the way to distinguish a SBCS character and a DBCS character ? Check a high-byte of [usch]. If it is 0, then a SBCS character, or a DBCS character. If it is a DBCS character, its low-byte is a lead-byte and its high-byte is a trail-byte. You can access these bytes of [usch] with several ways. First is to use [usch] itself. In this case,...

OS/2 codes: How to support DBCS #2 Manipulate DBCS strings

Unlike SBCS, a DBCS(double-byte character set) character consist of two bytes as its name. ^^ So manipulating DBCS strings needs some different works. For example, strlen() returns a length of a string in bytes not in characters. And if walking through DBCS strings, indice should be moved by 2 bytes. To solve the above problems, the most basic is to get an information of DBCS lead-bytes. Here, a lead-byte is first byte of a DBCS character. And second byte is called a trail-byte. On OS/2, there are two ways to do this. One is DosQueryDBCSEnv() , and the other is UniQueryUconvObject() . Using these functions, it is possible to determine a chracter is a SBCS character or a DBCS character. DosQueryDBCSEnv() give a vector of ranges of lead-bytes. Whereas, UniQueryUconvObject() give a vector of a char size in according to a lead-byte. If you prefer compatibility, then use DosQueryDBCSEnv() . If got a information for lead-bytes, now what to do is to determine if a DBCS character. This...

OS/2 codes: How to support DBCS #1 Determine if DBCS env

Most of OS/2 users are in SBCS countries. Naturally, many OS/2 programs are developed in their countries. And those programs lack DBCS support. To begin with this article, I'll write a series of articles for DBCS support. How to determine if DBCS environment OS/2 is based on a code page. And OS/2 provides many APIs for a code page. Out of these, you can use DosQueryDBCSEnv() to determine if DBCS environment because DBCS code pages provides the ranges of DBCS lead-bytes. This is a syntax for DosQueryDBCSEnv(). Obtains a DBCS (double-byte character set) environmental vector that resides in the country file. #define INCL_DOSNLS #include <os2.h> ULONG cb ; /* The length, in bytes, of the data area ( pBuf ) provided by the caller. */ PCOUNTRYCODE pcc ; /* A pointer to the COUNTRYCODE structure in which the country code and code page are identified. */ PCHAR pBuf ; /* The data area where the country-dependent information for the DBCS ...

< 온도계의 철학 > 을 읽고...

지난 5 월이었던 것 같다. EBS 에서 '장하석의 과학, 철학을 만나다' 라는 강의가 방송되고 있었다. 평소에 과학철학에 관심이 많았던 터라, 재밌게 보았다. 그런데 방송 내용이 그가 쓴 '온도계의 철학' 이라는 책에 바탕을 두고 있다는 것을 알았고, 얼른 주문해서 읽기 시작했다. 조금 읽다가 계속 읽어야지, 읽어야지 생각만 하면서 미루어오다가, 올해가 가기 전에 꼭 읽어야지 해서, 해가 지나기 전 두 시간 전쯤에 약속을 지킬 수 있었다. ^^ 간단히 내용을 정리하면 온도계의 철학은 미지의 영역에 대한 측정의 과정을 다룬 책이다. 이 과정에서 그 동안 잊혀져 왔던 몇 몇 과학자들의 업적을 재평가하기도 하고, 측정하면서 겪는 어려움들과 관련된 에피소드들도 알려준다. 장하석은 새로운 영역, 미지의 영역에 대한 측정을 하려는 순간, 측정을 하기 위해서는 기준이 필요하고, 기준을 정하기 위해서는 다시 측정 결과가 필요하다는 순환 논증 빠지게 된다는 것을 보여준다. 과거의 과학자들도 이를 잘 알고 있었고, 이 어려움을 어떻게 극복했는지, 그리고 어떻게 해야 하는지 잘 보여주고 있다. 그 과정에서 우리가 당연하다고 알고 있는 여러 온도 기준점들이 어떻게 탄생할 수 있었는지, 그리고 그보다 먼저 온도 측정을 어떻게 이루어질 수 있었는지, 곧 온도계가 어떻게 만들어질 수 있었는지 아주 자세히 보여준다. 결국 장하석은 과학사를 들여다봄으로써 지금은 당연한 것이 과거에 많은 이들의 노력으로 얻어진 결실이라는 것을 깨닫게 해준다. 더 나아가, 과학계 주류에 대한 비판도 가한다. 현재의 과학계는 일종의 엘리트 과학이다. 고도로 전문화된 영역에 엘리트 과학자들만이 그들만의 언어로 과학을 논하고 있다는 것이다. 온도계의 발전 과정을 살펴 보면서, 장하석은 그 발전 과정에 기여한 인물들이 요즘처럼 전문 과학자들만 있었던 것은 아니었다는 것을 보여준다. 그리고 그 당시 사회적으로 과학에 기여했던 많은 인물들 또한 요즘 말하는 아마추어 과학자...

절대온도 0K 유도

이미지
절대 온도의 단위는 켈빈(K)이다. 절대 온도는 0 K에서 시작하고, 그 아래로는 내려가지 않는다. 이 절대 온도 0 K 를 우리가 많이 쓰는 섭씨 온도로 표현하면 약 -273 도이다. 이 온도를 어떻게 계산할 수 있을까 ? 샤를의 법칙을 보자. 샤를의 법칙이란 압력이 일정할 때, 기체의 부피와 온도는 비례한다는 법칙이다. 그리고 1 도 오를 때마다 기체의 부피는 0 도일 때의 부피의 1/273 씩 증가한다. 이를 수식으로 표현하면 이렇다. (V : 현재 부피, V0 : 0 도일 때 기체 부피, Tc : 섭씨 온도) V0 로 묶으면 그런데, V 는 부피이므로, 0 보다 작을 수 없다. 곧 V >=0 가 성립해야 하므로, 가 된다. 결국 섭씨 온도는 -273 도 밑으로 내려갈 수 없고, 이는 곧 절대 온도 0 K 를 뜻한다. 따라서 절대 온도 0 K 는 섭씨 온도로 -273 도와 같다. 그리고 절대 온도 1 K 차이와 섭씨 온도 1 도 차이는 같기 때문에 이 둘 사이에 다음과 같은 변환 공식이 성립한다.

OS/2 tircks: EARLYMEMINIT and JFS chkdsk failure

While using OS/2 with JFS, I have had a headache. It's an JFS chkdsk failure with the following message. Insufficient dynamic storage available for required workspace (1,6). CANNOT CONTINUE Due to this, I could not execute chkdsk on OS/2 Warp, but could on eCS. After all, I had to reboot to eCS to execute chkdsk for JFS. By the way, I noticed EARLYMEMINIT=TRUE statement in config.sys of eCS. This statement allows device drivers and IFSes to use high-memory area(>16MB) at initialization time. But it has incompaitiblities with some device drivers, especially HPFS386. So I've not used it. Nevertheless, I tried it with disabling HPFS386. The result was awesome. JFS chkdsk did not fail. Consequently, JFS chkdsk requires EARLYMEMINIT=TRUE to be executed successfully on large volumes with too many files. But HPFS386 does not work with it. Now, so, I use HPFS386 and JFS without EARLYMEMINIT=TRUE at normal, but use HPFS and JFS with EARLYMEMINIT=TRUE at chkdsk.

위치 에너지와 운동에너지 공식 유도

이미지
에너지는 일을 할 수 있는 능력을 뜻한다. 그리고 외부에서 어떤 물체에 일을 해주면, 그 물체의 에너지는 증가하고, 거꾸로 그 물체가 외부에 일을 해주면 그 물체의 에너지는 감소한다. 다시말해서, 일과 에너지는 서로 전환될 수 있는 것이다. 실제로 일과 에너지의 단위는 같다. 이를 바탕으로 위치 에너지와 운동 에너지의 공식을 유도해보자. 위치 에너지 위치 에너지는 어떤 물체가 기준면으로부터 어떤 높이에 위치해 있을 그 물체가 가지는 에너지를 뜻한다. 이 위치 에너지의 공식은 다음과 같다.  (Ep : 위치 에너지, m : 물체의 질량, g : 중력가속도, h : 기준면으로부터의 높이) 앞에서도 말했듯이 외부에서 일을 한만큼 물체의 에너지는 증가한다. 따라서 위치 에너지의 크기는 그 물체를 기준면으로부터 해당 높이까지 들어올리는데 한 일의 크기와 같다. 물체를 들어올릴 때 한 일은 다음과 같다. (W : 한 일, F : 힘의 크기, s : 이동 거리) 물체의 들어올릴 때 필요한 힘은 물체의 무게와 같고, 이동거리는 물체의 높이와 같으므로, 그리고 한 일의 크기는 곧 증가한 에너지의 크기이므로, 운동 에너지 운동 에너지는 움직이고 있는 물체가 가지고 있는 에너지를 뜻한다. 이 운동 에너지의 공식은 다음과 같다. (Ek : 운동 에너지, m : 물체의 질량, v : 물체의 속력) 운동 에너지는 곧 그 물체가 정지 상태에서 해당 속력을 가질 때까지 물체에 해 준 일과 같으므로, 물체에 해 준 일을 계산하면 물체의 운동 에너지를 계산할 수 있다. ----- (1) (W : 한 일, F : 힘의 크기, s : 이동 거리, m : 질량, a : 가속도) 여기에서 힘의 크기 F 가 일정하다고 가정하면 등가속도 운동이 되므로, (v : 나중 속력, v0 : 처음 속력) 그런데 정지 상태에서 출발했으므로 처음 속력 v0 는 0 이다. 이를 정리하면 그런데, 가...