'말랑말랑한 이야기'에 해당되는 글 5건

  1. 2010.12.04 WM_DISPLAYCHANGE 메시지는 중첩 될 수 있다.
  2. 2010.10.18 Active Mode 와 Passive Mode 의 차이점
  3. 2010.10.16 Saving ASP VBScript "Objects" to Session
  4. 2010.09.09 The limitations of AsyncTask (1)
  5. 2010.08.19 Android Units (1)
말랑말랑한 이야기2010. 12. 4. 20:31
윈도우 해상도가 변경되거나 칼라비트가 변경되면 모든 Top-Level 윈도우에 해당 메시지가 전송됩니다. 이때 wParam에는 칼라비트가 그리고 lParam에는 변경된 해상도 값이 인자로 넘어옵니다. 윈도우7에서 테스트해보니 wParam, lParam에 항상 0가 오더군요. 아무튼 이때 GetSystemMetric() 함수로 해상도나 비트 값을 얻어서 사용하면 되기 때문에 큰 문제는 아닙니다. 문제는 이 메시지가 중첩되서 오는 경우가 있다는 겁니다. 즉 해당 메시지를 처리하는 로직이 끝나기도 전에 다시 해당 메시지가 들어오는 경우가 있습니다. 전체화면 모드 게임 실행중에 Alt+Tab 키를 눌렀을때가 이에 해당합니다. 프로그래밍을 하다보면 로직 처리에 대한 어려움보다 이러한 동기화적인 문제로 발생하는 버그를 찾는데 엄청나게 많은 시간을 빼앗기곤 합니다. 타이밍적인 문제이기 때문에 에러 발생이 일관적이지 않죠.
이해하기 쉽게 예를들어보죠. 해상도가 변경되면 변경된 해상도에 따라 아이콘 위치를 정렬하는 기능이 있다고하죠. 해상도 마다 위치할 아이콘의 위치 정보를 담은 파일이 있습니다. 해상도 변경 이벤트를 감지하면 파일을 읽고 적용할 위치 정보를 vector에다가 넣어둡니다. 그리고 벡터를 차례대로 순회하면서 실제 아이콘의 위치를 정렬합니다. 이때 벡터 순회중에 다시 해상도 변경 이벤트가 들어옵니다. 그럼 순회중이던 백터는 참조를 잃게되고 알수 없는 버그로 이어집니다. 디버깅이 매우 어려워지는 상황이죠. 요점은 이렇습니다. 해당 메시지를 처리하기 위해선 처리 로직이 끝나기전까지 재진입하지 않도록 플래그 변수를 두시거나, 아니면 사용자 정의 메시지를 만들어서 메시지큐에 Post하시기 바랍니다.
Posted by Ditongs Ditongs

댓글을 달아 주세요

말랑말랑한 이야기2010. 10. 18. 11:41
- 실제 데이터가 오가는 Data Port의 접속방식

FTP 서비스는 일반적인 서비스와는 달리 2개의 Port를 사용한다.
- 명령어와 응답이 오가는 Command Port(21번)와 실제 데이터가 오가는 Data Port(20번)로 구성된 TCP 기반의 서비스

[[ Active Mode ]]

- Command Port를 통해 클라이언트가 전해준 정보를 바탕으로 서버가 클라이언트의 Data Port에 접속을 시도한 후
  클라이언트의 요청에 따라 데이터를 클라이언트에 전송

Active Mode의 FTP에서 클라이언트는 사용되지 않는 랜덤한 포트 n(n>1023)을 통해 서버의 Command 포트(21번)에 접속
이때, 포트번호 n에 1을 더한, n+1번 포트의 정보를 서버에 전송하며, 클라이언트는 n+1번 포트를 Listening 하기 시작함
FTP 서버의 Data Port(20번)는 클라이언트에서 지정한 Data Port(n+1)를 통해 클라이언트에 접속

서버에 설치된 방화벽에서는 Active Mode의  FTP가 지원되려면 다음의 통신 채널이 열려있어야함
- FTP 서버의 21번 포트 : 클라이언트에서 접속을 시도할 수 있는 Command Port
- FTP 서버의 21번 포트 >> 클라이언트의 n(n>1023)번 포트 : 서버에서 클라이언트의 Command Port로 응답
- FTP 서버의 20번 포트 >> 클라이언트의 n+1(n>1023)번 포트 : 서버에서 클라이언트의 Data Port로 접속
- FTP 서버의 20번 포트 << 클라이언트의 n+1(n>1023)번 포트 : 클라이언트에서 서버의 Data Port 에 응답

※ Active Mode의 FTP에서 접속문제는 대부분 클라이언트측에서 기인함
     FTP클라이언트느 서버의 Data Port에 직접 접속이 불가능.
     단지 어떤 포트를 Listening 하고 있으며 서버가 데이터 전송을 위해 접속할 클라이언트 포트를 서버에 알려줄 뿐임
     클라이언트에 설치된 방화벽의 입장에서는 FTP 서버가 클라이언트의 특정포트에 접속하려는 시도가
     외부의 시스템 침입으로 간주되어 방화벽에 의해 차단되는 경우가 발생

[[ Passive Mode ]]
- Command Port 뿐만 아니라 데이터 접속도 클라이언트에서 시도하여 서버에 데이터를 요청하고 전송받는 방식

- 서버가 클라이언트에 접속을 시도해야하는 문제점을 해결하기 위해 다른 방식의  FTP 연결이 개발
   Active Mode에서 클라이언트에 설치된 방화벽이 FTP 서버의 접속 시도를 외부의 침입으로 간주하고 차단하는 문제를 해결하기위해
   Passive Mode에서는 두개의 포트 모두 클라이언트에서 서버에 접속을 함

- FTP 연결을 위해 클라이언트는 사용되지 않는 랜덤한 포트 n(n>1023)과 n+1 포트를 열 어둡니다.
  n 포트는 서버의 Command 포트인 21번 포트에 접속함
  클라이언트는 (서버로 하여금 클라이언트의 Data 포트 연결을 허용하기 위해) Port 명령어를 호출하지 않고 Pasv 명령어를 호출함
  서버는 사용되지 않는 랜덤한 포트 p(p>1023)를 열어두고 클라이언트에 해당 정보를 넘겨줌
  클라이언트는 데이터 전송을 위해 자신의 n+1 포트와 서버의 p 포트 연결을 시도

서버에 설치된 방화벽에서는 Passive Mode의  FTP가 지원되려면 다음의 통신 채널이 열려있어야함
- FTP 서버의 21번 포트 :  클라이언트에서 접속을 시도할 수 있는 Command 포트
- FTP 서버의 21번 포트 >> 클라이언트의 n(n>1023)번 포트 : 서버에서 클라이언트의 Command 포트로 응답
- FTP 서버의 p(p>1023)번 포트 : 클라이언트의 n+1(n>1023)번 포트에서 데이터 접속
- FTP 서버의 p(p>1023)번 포트 >> 클라이언트의 n+1(n>1023)번 포트 : 클라이언트의 요청에 대한 응답 및 실제 데이터 전송

※  Passive mode 에서의 문제점
      Passive mode의 FTP가 클라이언트 입장의 문제점을 해결한 방법이라면 서버 입장에서는 포트 전체를 열어두어야하는 문제점이 생김
      FTP의 접속을 위해 서버에 많은 수의 포트가 필요하다는 점이 가장 큰 문제점


명령행 FTP(CMD mode)에서 Passive 모드를 설정하는 방법

1. 시작 / 실행 / cmd 입력하고 확인
2. 명령행에서 FTP 명령을 이용해 Site에 접속 예) c:>ftp ftp.scnt.co.kr
3. User ID와 Password 를 입력하고 FTP 서버로 로그인 한다.
4. FTP 프롬프트가 뜨면 다음과 같은 명령을 입력한다
     ftp>quote pasv
Posted by Ditongs Ditongs

댓글을 달아 주세요

말랑말랑한 이야기2010. 10. 16. 06:40

Saving ASP VBScript "Objects" to Session (Tuesday, March 08, 2005)
Continuing my trouble and hatred of anything todo with Visual Basic, especially VBScript.  In this episode of The VB Sucks Edition, I'll reivew the problem with VBScript "Objects”.  As any programmer knows, VBScript was never meant to be object-oriented, but by VBS 5, someone at Microsoft thought they could try to make it a bit OO compatible.  The introduction of VBS classes was a major step in that direction.  This seems like a good idea, but instead of making real objects, Microsoft hacked together classes that really mean nothing.  Let me explain.

VBS objects are not really stored in memory as objects.  For this reason, it is not possible to store a VBS object in the Session or Application variables in ASP.  This creates huge headaches, and is completely rediculous.  There are however, some solutions.

The first solution is "Serializing" your class.  You will not truely be serializing anything, but rather creating a "seralize" and "deserialize" method for each class that you declare.  These methods will take a Session variable name as a parameter and "store" or "retrieve" a class from session.  See the example below.

Class MyClass
     Dim Var1
     Dim Var2
End Class

Function Serialize_MyClass( instance, sessionVar )
     Session( sessionVar & ".Var1" ) = instance.Var1
     Session( sessionVar & ".Var2" ) = instance.Var2
End Function

Function Deserialize_MyClass(sessionVar)
     Dim instance : Set instance = new MyClass
     instance.Var1 = Session( sessionVar & ".var1" )
     instance.Var2 = Session( sessionVar & ".var2" )

     Set Deserialize_MyClass = instance
End Function

This solution will work if you must keep all your code in VBScript, however is quite a pain to implement.  If you can mix JScript into your code, I suggest using the following solution.

The other way of saving objects to session in ASP is not to use VBScript objects, but use JScript objects instead.  Because of the way JScript creates objects, you can save JS objects to Session.  By declaring your class in JS, you can keep your code (somewhat) clean, and still have the ability to save your objects.  See below for an example.

<script runat="server" language="jscript">

function MyClass()
{
   this.Var1 = Var1;
   this.Var2 = Var2;
}

var Var1, Var2;

function MyClassFactory()
{
   return new MyClass();
}

</script>

Using script like the one above allows you to keep your class declarations clean, and removes the need for "serialization” functions.  The only problem that still remains is VBScript can't declare instances of JScript classes (even though it can use them).  For this reason, I suggest using a factory function in JScript for your classes (such as MyClassFactory in the example above).  Because VBScript can call JScript functions, you will be able to get a new instance of the JScript class into your VB code, as shown below.

Dim instance : instance = MyClassFactory()
instance.Var1 = "12345"


So there you have it, the half-ass hack to solve the problem of saving classes to Session or Application variables to the piece of junk that is VBScript.

Filed under:
Posted by Ditongs Ditongs

댓글을 달아 주세요

말랑말랑한 이야기2010. 9. 9. 20:28

Sunday, May 30, 2010

The limitations of AsyncTask

AsyncTask is a fine API, it's been said that it "holds your hand", and makes performing background operations painless. It pulls this off so well in fact, that I see people overusing it in situations where it's not really appropriate.

It's particularly unsuited for situations when you have a multiple tasks to perform concurrently. Imagine an Activity that needs to download about 30 small images from a remote server, and update the UI as these become available. AsyncTask uses a static internal work queue with a hard-coded limit of 10 elements. That means if you were to create an AsyncTask instance for each image, the work queue would quickly overflow and many of your tasks would get rejected. The best solution in this case is to create your own ThreadPoolExecutor instance that uses a queue that's large enough to hold all your tasks, if you need an unbounded queue, a LinkedBlockingQueue will work just fine.

Another severe limitation is that an AsyncTask can't survive your Activity being torn down and recreated on the other side.  Even if you pass it to the new instance via onRetainNonConfigurationState, the internal Handler inside the AsyncTask is still going to be stale and it's not going to behave correctly.  This is important to consider, and the Android documentation makes no mention of it all.  I've already blogged this scenario in detail, so I won't flog a dead horse here.

There are a few other minor issues, such as the fact that you can't change the background threads execution priority. It's hard-coded to a low priority, which granted, is the sensible default.  Also, exception handling is not very well supported.

So just to reiterate, AsyncTask is a nice API, but you should understand it's limitations and apply it appropriately.  If you're serious about writing mobile apps, then you're going to need a few more tools in the toolbox to get the job done.

Source: http://foo.jasonhudgins.com/2010/05/limitations-of-asynctask.html

Posted by Ditongs Ditongs

댓글을 달아 주세요

  1. It can accommodate 13 passengers and fly for 3, http://www.moncleroutletespain.com/ moncler españa,250 nautical miles without refueling. Passengers can fly non-stop from New York to London. Cabin features include executive leather seats, http://www.moncleroutletespain.com/ moncler, a divan and credenza, tables for group meals or meetings, http://www.moncleroutletespain.com/ moncler outlet, individual tables, a galley, http://www.moncleroutletespain.com/ moncler online, an enclosed lavatory, a wardrobe/storage cabinet, http://www.moncleroutletespain.com/ moncler chaquetas, a DVD player with two different sized LCD monitors and a voice/data communication system. So the next time you're flying, http://www.moncleroutletespain.com/ http://www.moncleroutletespain.com/, request the Embraer Legacy and get a taste of flying in real luxury for less!Related articles:


    http://hiddenchampion.tistory.com/741 http://hiddenchampion.tistory.com/741

    http://mba7.tistory.com/59 http://mba7.tistory.com/59

    2013.01.05 16:56 [ ADDR : EDIT/ DEL : REPLY ]

말랑말랑한 이야기2010. 8. 19. 23:24

Dimension

A dimension value defined in XML. A dimension is specified with a number followed by a unit of measure. For example: 10px, 2in, 5sp. The following units of measure are supported by Android:

dp
Density-independent Pixels - an abstract unit that is based on the physical density of the screen. These units are relative to a 160 dpi screen, so one dp is one pixel on a 160 dpi screen. The ratio of dp-to-pixel will change with the screen density, but not necessarily in direct proportion. The compiler accepts both "dip" and "dp", though "dp" is more consistent with "sp".
sp
Scale-independent Pixels - this is like the dp unit, but it is also scaled by the user's font size preference. It is recommend you use this unit when specifying font sizes, so they will be adjusted for both the screen density and the user's preference.
pt
Points - 1/72 of an inch based on the physical size of the screen.
px
Pixels - corresponds to actual pixels on the screen. This unit of measure is not recommended because the actual representation can vary across devices; each devices may have a different number of pixels per inch and may have more or fewer total pixels available on the screen.
mm
Millimeters - based on the physical size of the screen.
in
Inches - based on the physical size of the screen.
Posted by Ditongs Ditongs
TAG android

댓글을 달아 주세요

  1. La police des frontières, http://www.moncleroutletespain.com/ moncler chaquetas?iranienne a annoncé samedi l'arrestation d'une Américaine, http://www.moncleroutletespain.com/ moncler outlet?soup, http://www.moncleroutletespain.com/ moncler online?onnée d'espionnage pour le compte de son pays, http://www.moncleroutletespain.com/ moncler españa, rapporte, http://www.moncleroutletespain.com/ http://www.moncleroutletespain.com/?l'agence de presse iranienne Fars, http://www.moncleroutletespain.com/ moncler.Related articles:


    http://mycodes.tistory.com/65 http://mycodes.tistory.com/65

    http://www.2sisters.kr/155 http://www.2sisters.kr/155

    2013.01.05 20:38 [ ADDR : EDIT/ DEL : REPLY ]