잊지 않겠습니다.

QueryOver<> method에서 LINQ 쿼리인 .Contains가 먹히지 않는다.;
이때 다음과 같은 코드를 사용하면 LIKE 검색을 가능하게 할 수 있다.

var restriction = Restrictions.On(m => m.Name).IsLike("%바람과%");
var movies = session.QueryOver().Where(restriction).List();
foreach(var movie in movies)
{
    Console.WriteLine(movie.Name);
}

Posted by Y2K
,
NHibernate의 Collection Type은 총 4가지를 가지고 있다.
다른 성격을 가지고 있기 때문에 어떤 Collection Type을 사용해야지 될지 고민해야지 된다.

   Bag Set
List
Map
 중복값 허용
 Yes No
Yes
Key must be unique.
Value may be duplicated.
 Ordering  No No
Yes
No
 Type  IList Iesi.Collections.ISet
IList
IDictionary
 Bi-Direction  Yes Yes
No
No

일반적인 Table 구조에서는 Set을 사용하는 것이 EF나 MSLINQ와 동일하게 사용을 할 수 있다.

각각의 hbm.xml은 다음과 같다.

1. Bag


  
    
    
    
      
        
      
      
      
    
  
  
    
      
    
    
    
    
  


2. Set


  
    
    
    
           
         
    
  
  
    
      
    
    
    
    
  


3. List

  
    
    
    
      
        
      
    
  
  
    
      
    
    
    
    
  


4. Map
  
    
    
    
      
       
            
    
  
  
    
      
    
    
    
  


Posted by Y2K
,
NHibernate에서 상속된 model을 지원하는 방법은 총 3가지가 있다.

1. "subclass" 로 하나의 Table에 discriminator column을 지정해서 생성하는 방법
  - discriminator 값으로는 class의 full name이 들어가게 된다.
2. "joined-subclass"로 model의 parent class를 하나의 Table로, 그리고 나머지 model의 property를 묶은 table을 FK로 엮는 방법
3. "union-subclass"로 정규화를 고려하지 않고, 상속된 모든 property를 각각의 table로 구현하는 방법


subclass




  
    
      
    
        
        
    
    
  
  
    
    
    
  
    
  



joined-subclass




  
    
      
    
        
    
    
  
  
    
    
    
  
  
    
        
  


union-subclass




  
    
      
    
        
    
    
  
      
    
    
  
  
        
  


Posted by Y2K
,
NHibernate mapping class의 Id는 natural-Id와 Surrogate Id로 나눌수 있는데, Natural-Id는 기본적으로 사용자가 assign 시켜줘야지 되는 Id가 되고, Surrogate Id는 Instance가 생성되어서 DB에 insert될때, DB를 통해서 채워지는 Id다. NHibernate에서는 Surrogate Id를 사용하는 것을 추천하고 있다. 그럼에도 불구하고, Natural Id를 사용해야지 되는 2가지 경우가 있는데,

1. composite keys에 의해서 Id가 결정이 나는 경우
2. natural key가 실 값이 되는 경우 : 이 경우에는 UserId 같은 특정 값을 사용할 수 있다.

이 두가지 경우를 제외하고, 나머지는 모두다 Surrogate Id를 사용해야지 된다. 다른 경우에는 확실히 코드도 지저분해지고 읽기가 힘들다. (매번 중복되지 않는 값을 확인하고 insert 시켜주는 수고를 덜 수 있다.)


 hilo  Hi/Lo Algorithm에 의하여 integer value가 자동 생성된다.

 guid  System.Guid.NewGuid() method에 의하여 새로운 Guid가 생성된다.

 guid.comb  10byte의 random-guid값이 NHibernate에 의하여 새롭게 생성된다. 이때, 값은 Date와 Time값의 조합으로 만들어진다.

 guid.native  Database에서 얻어지는 Guid값을 이용한다.

 uuid.hex  GUID 값을 32bit hex digital 값으로 dash 없어 얻어낸다.

 uuid.string  GUID깞을 string 형태로 얻어낸다. 사람이 읽을수 없는 값이다.

 counter  계속해서 증가되는 integer값으로 counter값이 생성된다.

 increment  database에서 제공되는 increment 값으로 사용한다.

 sequence  Oracle, DB2, PostreSQL에서 제공되는 sequence의 return값을 이용해서 Id값을 생성한다.

 seqhilo  hilo 알고리즘보다 좀더 좋은 속도를 가진 알고리즘으로 integer value를 자동 생성한다.

 foreign  외래 키 값을 자동으로 카피한다.

 identity  Database에서 생성되는 값을 사용한다.

 sequence-identity  Database에서 제공되는  sequence값을 이용

 trigger-identity  trigger에서 return 시켜주는 값을 이용


마지막으로 native 값을 사용하는 경우, 각 DB의 종류에 따라 각기 다른 값을 사용한다. MSSQL, DB2, MySQL의 경우에는 Integer값을 이용하고, Oracle, Firebird의 경우 sequence와 동일하다.


Posted by Y2K
,
Oracle에서 REFCURSOR 타입을 사용하는 StoreProcedure를 OUT parameter로 사용하는 경우에는 2가지 제약 사항이 있다.

1. Table Cursor를 사용하는 것이 아닌, SYS_REFCURSOR 를 사용해야지 된다.
2. 1개의 Cursor만 return되는 것을 지원하며, in parameter의 순서가 중요하다. 반드시 SYS_REFCURSOR를 처음에 return시켜줘야지 된다.

이와 같은 규칙을 따르면 다음과 같은 StoreProcedure를 사용하는 경우 다음과 같이 HBM이 구성 가능하다.


CREATE OR REPLACE PROCEDURE FWKUSER.sp_XMMenu_MenuName_Test_q
  (
   spcur        OUT sys_refcursor, 
   p_menu_name    IN VARCHAR2) IS
BEGIN
  OPEN spcur FOR
    select   
    *         
   
    from   xm_menu 
    where   menu_name like '%' || p_menu_name || '%'
    and        fold_yn = 'N'
    and        hidden_yn = 'N'
    and        use_yn = 'Y'
    and        del_yn = 'N'
    order by instr(menu_name, p_menu_name, 1, 1), menu_name;
END;
/


  
    
            
      
      
            
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
        
  


이렇게 구성된 hbm을 이용해서 다음과 같이 StoreProcedure를 호출 할 수 있다.

using(var session = sessionFactory.OpenSession())
{
    var query = session.GetNamedQuery("GetMenus");
    query.SetParameter("menuName", "%");
    var output = query.List();

    foreach(var p in output)
    {
        Console.WriteLine(p.MenuName);
    }
}
Posted by Y2K
,
출처는 http://tnocdam.egloos.com/5375448


간만에 도움이 되는? 정보입니다..

아이튠즈는 역시 애플 제품 답게도 프로그램 자체에 대해서 설정해 줄 수 있는 것들이 별로 없지요.

특히나, 미디어가 저장되어 있는 장소나 아이폰이 백업되는 장소등은 쉽게 변경 할 수 없습니다.

보관함이나 미디어 라이브러리 (음악의 앨범 자켓 캐쉬등이 저장되는) 등은 그나마 바꿀 수는 있긴 한데 잘 안되지요 -,.-;




그래서 이번에 이 자리에서 소개해 볼까 합니다.

왜 라이브러리나 백업 폴더를 옮기느냐? 하면, 기본적으로 이것들이 C드라이브에 저장되기 때문입니다.

그리고, 특히나 백업 폴더는 아이폰의 사용용량과 같은 용량을 하드에서 잡아먹게 됩니다. (정확하게는 사진+앱+etc)

사진이나 앱이 용량이 별로 안되시는 분들은 문제가 안되실지도 모르겠지만

저처럼 카메라로 찍은 동영상이 많거나, Oplayer등의 응용프로그램 도큐먼트를 사용하는 어플이 있으면

그 도큐먼트의 용량만큼 (Oplayer에 넣은 동영상 용량 등) 백업폴더의 용량이 커지게 됩니다.

또한 음악이 많고, 앨범 재킷이 지정되어 있는 곡이 많으면, 다운받은 어플의 수가 많으면 라이브러리도 커지게 됩니다.


C드라이브가 넓으신 분들은 별로 문제되지 않겠으나,

저처럼 C드라이브가 SSD여서 그다지 용량에 자유롭지 않은 분들 혹은  C에 뭐 이상한게 자리차지하는게 싫은 분들은

옮기고 싶으실 겁니다.


1. 기본 아이튠즈 라이브러리 옮기는 법

일단, 기본 저장 위치는 내문서의 내 음악에 아이튠즈의 미디어 폴더가 저장됩니다.

xp와 vista 이상급의 os의 내 음악 절대경로는 서로 다르지만, 내문서-내음악 으로 접근하는 것은 같으므로...

일단 들어가시면 iTunes 폴더가 있습니다. 이 폴더를 통째로 원하는 위치에 "복사"합니다. (이동이 아닙니다.)

그리고 iTunes를 실행하신 후,


기본 설정에서


고급 탭의 변경을 눌러 복사해 놓은 경로에 접근 합니다.

그중, iTunes 폴더 밑에 iTunes Media 폴더에 들어가신 후


폴더 선택을 하시면 됩니다.

이렇게 설정하신 후, 아이튠즈를 종료하시고 나서,

아이튠즈가 설치되어있는 폴더에 갑니다.

보통 C드라이브의 Frogram Files\iTunes 폴더에 있습니다.



여기서 iTunes.exe를 선택하신 후, Shift 키를 누른 상태에서 더블 클릭(혹은 엔터)을 하셔서 실행시키십니다.

그러면

 
요런 놈이 뜨는데 여기서 보관함 선택을 누르시고

아까의 iTunes 를 통쨰로 복사한 곳에 가셔서 (iTunes Media 폴더까지 들어가지 말고) 




iTunes Library.itl 파일을 선택하시면 iTunes가 실행이 될 것입니다.


이제 iTunes가 실행이 되고 나면, 원래 내음악의 iTunes 폴더를 삭제합니다.

(휴지통을 비우시기 전에 정말로 제대로 변경되었나 확인하시기 바랍니다. 정상적으로 아이튠즈가 실행이 되고

보관함의 내용물이 그대로 있다면 성공적으로 변경된 것입니다.)



2. iPhone Backup 폴더 변경하는 법

이 폴더는 제가 찾아보기에는 일반적인 설정 변경으로 변경 지정할 수 있는 방법은 없습니다.

따라서 생각해 낸 방법이, NTFS의 심볼릭 링크를 이용하는 것입니다.

심볼릭 링크는 간단히 말해서, "바로가기" 같은 방법을 통해서 어떤 대상폴더를 다른 지정폴더로 연결시켜주는 것입니다.

하지만 간단히 바로가기를 만드는 것은 아니고, Junction이라는 프로그램을 이용해야 합니다.

(윈7의 관리자 계정에선 위 프로그램이 필요 없습니다. 비스타나 7의 관리자 계정이신 분들은 junction 파일 없이 진행 바랍니다.)

원래는 마이크로소프트 테크넷에서 간단히 다운 받을 수 있지만 편의를 위하여

junction.zip

요 넘을 다운 받으시길 바랍니다.

그렇게 하셔서 압축을 c드라이브나 윈도우 폴더의 system32등의 path가 지정된 곳에 푸시기 바랍니다.

(간단히 커맨드 창에서 실행시키기 위함입니다. 다른 장소에 푸셨을 경우에는 압축 푸신 곳까지 경로 이동 후 실행 하셔야 합니다.)


이제 Backup 폴더가 존재하는 곳으로 갑니다. (전 이미 심볼릭 링크를 생성하였기에 단축아이콘으로 표시되어 있습니다)

비스타나 7의 경우는


C드라이브\사용자\계정명(사용자마다 다름)\AppData\Roaming\Apple Computer\MobileSync\Backup 입니다.

xp는 C드라이브\Documents and Settings\계정명(사용자마다 다름)\Application Data\Apple Computer\MobileSync

이중 AppData 폴더는 숨김 속성이므로 탐색기 설정에서 미리 숨김파일 및 폴더 보기 옵션을 켜주셔야 합니다.

이제 Backup 폴더를 원하는 위치에 통째로 "이동"합니다. (MobileSync 폴더가 비어있게)


그런다음 윈7이나 비스타의 관리자 계정이신 분들은

비어있는 MobileSync 폴더 안에서 Shift키를 누른상태에서 오른클릭을 하시어

여기서 명령 창 열기를 실행한 후,

커맨드 창이 뜨면

mklink /d Backup 복사한백업폴더 경로

이렇게 쓰시면 됩니다.  예를 들면


이렇게 하시면 단축아이콘이 만들어집니다.

만약 에러창이 나오거나, 이미 폴더가 존재한다고 나올 경우, 원래 자리에 Backup 폴더가 남아있기 때문이니

먼저 "이동"을 통해서 백업폴더를 옮기신 후 재시도 하시기 바랍니다.

관리자 권한이 없으면 mklink를 실행 할 수 없고 xp에서는 아예 명령어가 존재하지 않기 때문에 

junction프로그램을 이용합니다.

아래처럼 관리자 권한으로 도스명령창을 실행하신 후




사용법은 마찬가지로 커맨드 창에서

junction "원래 백업 폴더 위치" "옮긴 백업 폴더 위치"

를 입력하시면 됩니다. (따옴표는 경로에 띄어쓰기가 있을 경우에만 입력합니다. 대부분의 경우 기존 폴더 위치가

Apple Computer아래이므로 경로에 띄어쓰기가 포함되어 있습니다. 따라서 기존폴더 위치를 입력할 때 따옴표로 감싸야합니다.)

예를 들면 junction 파일을 C 드라이브에 압축 푸셨다면


이처럼 입력하시면 됩니다.

그러면 mklink와 마찬가지로 단축아이콘이 생성되며 심볼릭 링크로 연결됩니다.


이후에 아이튠즈를 실행하면, 아이튠즈는 생성된 심볼릭 링크를 통해 옮겨진 백업폴더의 위치를 자동으로 연결받게 됩니다.

(아이튠즈는 아무것도 모른채 그냥 하던대로 동작됩니다만, 실제 파일들은 전부 옮겨진 위치에 저장됩니다.)

이제 보관함과 백업폴더가 전부 원하는 곳으로 이동되었습니다. (저의 경우 D드라이브의 iPhone폴더)


C드라이브는 자유입니다. 설령 포맷을 하여야 하는 경우도 포맷하신 후, 다시 위치 지정만 해 주시면 됩니다.

제 삽질이 (;;;) 도움이 되길 바라며....
Posted by Y2K
,
Network Copy등을 하기 위해서 ID와 Password를 알고 있는데, code 상으로 구현하는 방법을 한번 정리.

일단, WindowsIdentify는 win32 dll을 이용하고, Windows Token을 사용한다. Windows Token은 어떤 시스템에 Logon한 이후에, 일정시간 유지가 되는 Windows의 memory안에 자신의 Identity를 저장하게 된다. 

먼저, Win32의 [DllImport("advapi32.dll", SetLastError = true)] 를 이용해서 LogonUser method를 dll import 시켜온다.

        [DllImport("advapi32.dll", SetLastError = true)]
        public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);


마지막 값인 phToken값을 이용해서 WindowsIdentify를 얻어 내면 타 시스템에 접근이 가능하다. 여기에서 userName은 upn형태로 넣어져야지 되며, 이 형식은 ykyoon@vplex.net 과 같은 email과 같은 형식으로 입력이 되어야지 된다.

다음은 NetworkCopy를 하는 Test code이다. 




[DllImport("advapi32.dll", SetLastError = true)]
public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
[DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
private unsafe static extern int FormatMessage(int dwFlags, ref IntPtr lpSource, int dwMessageId, int dwLanguageId, ref String lpBuffer, int nSize, IntPtr* Arguments);

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public extern static bool CloseHandle(IntPtr handle);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public extern static bool DuplicateToken(IntPtr ExistingTokenHandle, int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);

public unsafe static string GetErrorMessage(int errorCode)
{
    int FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100;
    int FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200;
    int FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000;

    int messageSize = 255;
    String lpMsgBuf = "";
    int dwFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS;

    IntPtr ptrlpSource = IntPtr.Zero;
    IntPtr prtArguments = IntPtr.Zero;

    int retVal = FormatMessage(dwFlags, ref ptrlpSource, errorCode, 0, ref lpMsgBuf, messageSize, &prtArguments);
    if(0 == retVal)
    {
        throw new Exception("Failed to format message for error code " + errorCode + ". ");
    }

    return lpMsgBuf;
}

static void Main(string[] args)
{
    const int LOGON32_PROVIDER_DEFAULT = 0;
    const int LOGON32_LOGON_INTERACTIVE = 2;
    const int SecurityImpersonation = 2;

    var tokenHandle = IntPtr.Zero;
    bool returnValue = LogonUser(@"Administrator@vplex.net", "network ip in here", "this is password", 9, 0, ref tokenHandle);
    Console.WriteLine("LogonUser called.");
    if(false == returnValue)
    {
        int ret = Marshal.GetLastWin32Error();
        Console.WriteLine("LogonUser failed with error code : {0}", ret);
        Console.WriteLine("\nError: [{0}] {1}\n", ret, GetErrorMessage(ret));
        int errorCode = 0x5; //ERROR_ACCESS_DENIED
        throw new System.ComponentModel.Win32Exception(errorCode);
    }
    else
    {
        var ykyoonAdmin = new WindowsIdentity(tokenHandle);
        var wic = ykyoonAdmin.Impersonate();
        File.Copy("C:\\System.Web.Mvc.dll", "\\\\10.30.3.24\\c$\\abc.dll", true);
        wic.Undo();
        wic.Dispose();
    }
    CloseHandle(tokenHandle);
}
Posted by Y2K
,
PropertyInfo를 이용해서 간단히 슥삭. 너무나 편하게 debuging할 수 있는 방법이라서 자주 사용하기도 하고, 긁어서 그냥 넣어주면 편해서 올려둔다. 기본적으로 Property Invoke를 이용해서 각 값을 얻어내고, 그 값을 표시하는 방법인데... 이모저모로 편하구. 



public override string ToString()
{
    StringBuilder sb = new StringBuilder();
    sb.AppendLine(string.Format("<{0}>", GetType().Name));
    foreach(PropertyInfo property in GetType().GetProperties())
    {
        string propertyName = property.Name;
        object value = property.GetValue(this, null);
        if(value != null)
        {
            if(value is IEnumerable && !(value is string))
            {
                sb.AppendLine(string.Format("<{0}>", propertyName));
                IEnumerator enumerator = ((IEnumerable)value).GetEnumerator();
                while(enumerator.MoveNext())
                {
                    sb.AppendLine(enumerator.Current.ToString());
                }
                sb.AppendLine(string.Format("", propertyName));
            }
            else
            {
                sb.AppendLine(string.Format("<{0}>{1}", propertyName, value.ToString()));
            }
        }
    }
    sb.Append(string.Format("", GetType().Name));
    return sb.ToString();
}
Posted by Y2K
,
개인적으로 굉장히 기대를 하고 있는 Windows 7 Phone Series가 드디어 나왔다.

보면, 재미있는 특징들이 있는데.. 
첫번째로, 스팩을 보면 상당히 천편일률적인 스팩과 디자인
두번째로, OS의 업그레이드는 MS에서 일괄적으로 배포
세번째로, UI의 차별화를 볼 수 있다.


첫번째의 경우에는... 이건 하드웨어 제조사들에게 축복이다. 
기존 안드로이드 폰들의 경우에는 안드로이드에 최적화된, 그리고 자신만의 UI를 넣기 위해서 자신들만의 안드로이드를 각 폰마다 새로 만들고 있었는데, Windows 7 Phone에는 전혀 그럴 필요가 없다. MS의 스팩대로만 만들어주면, 그 다음은 MS에서 알아서. 각 장치 드라이버 관리 뿐 아니라 표준화된 PC의 운영체제의 30년 노하우를 가진 기업이 알아서 처리한다. 왜 퀄컴이 이번 Windows 7 Phone에서 모든 제조업체를 뛰어넘고 MS의 최고 파트너가 되어있는지... 예전의 PC 시장의 Intel + MS 동맹과 같은 방법이다. 

두번째로는... 이건 기존 안드로이드폰들에게 재앙이 될수 있는 문제다.
기존 안드로이드폰의 계속되는 문제는 폰을 발매하고 나서 구글에서 OS 업그레이드를 하고, 그 업그레이드를 자신의 폰에 반영하기 위해서 또 인적자원을 투입해야지되는 악순환의 발생이다. 1.6->2.0->2.1->2.2 여기에 내년에 나올 3.0 업그레이드를 과연 기존 폰들이 할 수 있을까? 그리고, 제조 업체에서는 계속해서 하드웨어에 최적화된 안드로이드 버젼을 만들어낸다는 것은 폰을 팔아서 나온 이윤보다 사후관리가 더 문제가 되버린다. 애플은 앱스토어를 통해서 폰을 판매한 후에 지속적인 이윤을 얻을 수 있지만, 안드로이드는 그것이 불가능하다. 제조업의 특성상 (애플제외) 10~20% 이상 이윤을 얻기는 거의 불가능하다. 거기에 지속적인 업그레이드로 6~7 개월 이상 개발 인력을 그 폰에 계속해서 쏟아야지 된다면... 그건 재앙이다. -_-; 이 부분은 MS가 기존의 Windows upgrade를 관리하던 방법대로 한다면, 의외의 대박은 이 점에서 나올수도 있겠다는 생각이 든다. 제조사들의 코스트를 혁신적으로 줄일 수 있다는 말이지. (안드로이드는 절대 공짜가 아니다. 발머의 의견에 전적으로 동의한다.)

세번째로는 이건 호불호가 나뉠것 같은 의견이긴 하지만, 개인적으로는 MS만의 차이점을 주는 좋은 UI라고 생각된다.
애뮬레이터로 돌려보면 정말 직관적으로 알 수 있는 UI라는 것을 느낄수 있었고, 꼭 내 손으로 만져보고 싶은 그런 UI라는 욕심이 든다. 

이번 Windows Phone 7 발매는... 지금 가속화되어가고 있는.. (미국에서 갤럭시S가 공짜로 풀려있다는..) 스마트폰 시장의 레드오션을 더욱더 가속화하게 될 것 같다. 치킨게임하기에 딱 좋은 운영체제가 나와버렸다는 말이지.; 여기서 가장 좋은 위치는... 뭐니뭐니해도 삼성이다.; 모든 폰들에 들어가는 칩과 AMOLED, LCD를 자신이 생상하기 때문에 가장 적절한 가격으로 공급받고 뿌려버리는 것이 가능하다. 열받으면 경쟁사것 약간약간 막아주기까지 하면서 말이야.; 

애플의 고민은 이제부터 시작일 것 같다. 애플은 안타깝게 치킨게임에서 이긴적이 단 한번도 없다. 애플의 마인드는 새로운 것을 개척하고 놀라움을 주기에는 충분하나, 레드오션에서 자신이 승자가 되기에는 매우 안좋은 마인드를 가지고 있다. 결국, 예전에 했던 바보짓을 또하면 정말로 망하는건데... 과연 어떻게 될지? 




Posted by Y2K
,
SoapException 및 Nullable parameter에서 문제가 발생해서 googling을 해본 결과.

http://fujishinko.exblog.jp/8971956/

どうも、null許可の項目をちゃんと判断できていない模様。
受信しているXMLを見てみると、タグに

xsi:nil="true"


と設定されています。

落ちている箇所のソースを見てみると
/usr/lib/python2.4/site-packages/ZSI/TC.py
32行目

_find_nil = lambda E: _find_xsi_attr(E, "null") or _find_xsi_attr(E, "nil")


nilというアトリビュートで聞いているのがマズい模様。


_find_nil = lambda E: _find_xsi_attr(E, "null") or _find_xsi_attr(E, "xsi:nil")


こうしてやることで、エラーを回避することが出来ました。
Posted by Y2K
,