PPAM 파일 소스를 보는 방법  기타 유용한 파일 

2011.08.12. 15:58

복사http://blog.naver.com/mktoolbox/70115865590

번역하기 전용뷰어 보기

PPAM 파일 소스를 보는 방법

 

1. 오피스 메뉴 PowerPoint 옵션에 보안센터 탭의 보안 센터 설정 단추를 누른 후

VBA 프로젝트 개체 모델에 안전하게 접근할 수 있음을 체크합니다.

 

2. Regedit 통해 HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\PowerPoint\Options 에

DebugAddins, DWORD, 1 추가합니다.

저렇게 하면 2007에서도 소스보기가 가능하네요...

 

1번 작업을 안하시면 2번작업한 후 PPT를 실행시키면 자동으로 DebugAddins 값이 0으로 변경됩니다.

그러니까 1번 작업부터 순서대로 하셔야 할 것 같습니다.

2003에서는 2번 작업만 해도 보이나보네요.


by 개발자가 되자! 2017. 2. 13. 20:55

C# AST Parser


Abstract Syntax Tree

한마디로 언어에 관계 없는 프로그래밍 언어의 형태를 나타내어 주는 간략한 트리라고 볼 수 있다.

위키


종류

-Cecil : C#의 IL코드를 분석하여 컴파일?하는 방식

-NRefactory : Cecil 오픈 라이브러리를 이용하여 AST 파서를 만들어 제공하는 것으로 요즘 내가 사용하고 있는 오픈소스 라이브러리임.


NRefactory

Github에서 소스파일이나 Library(Dll) 파일을 받을 수 있으며 사용하는 방법은 CodeProject의 예제에 나와있다. (NRefactory_Demo_and_IndexOf-Sample_-_Source)

Method 들의 호출관계(Call Hierarchy)를 구하고 싶어서 사용했으며 예시 코드는 다음과 같다.


이 프로젝트를 진행하면서 고생했던 것은

1. 오픈소스 라이브러리의 존재 유무

오픈소스 라이브러리가 있는 줄 몰랐기 때문에 처음에는 갖은 방법을 생각했었다.

처음 생각했던 것은 직접 Parser를 구현했지만 역시나 컴파일러 수준으로 작성하는 것은 효율적이지 못했고 어려웠다.

두번째로 생각했던 것은 정규표현식으로 함수모양으로 생긴 것들을 찾아내는 것이었으나 주석안에 있는 함수 등등 상당한 문제를 내포하고 있었다 (주석을 지우고 실행하는 것으로 해결)

마지막으로 찾은 것이 바로 AST Parser였다.

2. 오픈소스 라이브러리의 사용 방법

라이브러리마다 다른 사용법을 가지고 작성되었기 때문에 각각의 특성에 맞게 이용하는 것이 중요하다. 하지만 어떤 구성으로 되어있는지 처음에 사용하기도 어려웠기 때문에 Demo를 통해서 분석했다.

메소드는 어떤 타입으로 검사해야되는지(IMethod, MethodDeclaration) 등등 원하는 정보를 찾는 것도 어려웠다.

3. Find References

호출관계를 구하는 과정에서 시간이 오래걸렸다. 초기의 버전에서는 Method의 Call Hierarchy를 구할때마다 재귀적인 방식으로 FindReferences를 이용하여 구했는데 (해당 주소로 이동) 매번 호출하게 되니 거의 3분가량의 시간이 소모되었다. 개선하는 과정에서 Call Hierarchy를 Map으로 저장해두고 필요할때 타고 이동하는 방식을 사용해야겠다고 생각되었다.

4. Hash Collision

Method를 Hashtable에 넣어서 Call Hierarchy를 저장해두는 방식을 택하게 되었는데 어떤 문제인지 모르겠지만 계속 Hash값이 충돌되는 일이 발생되었다. 처음에는 GetHashCode에 문제가 있는 것 같아서 새로운 Hash값을 넣었지만 같은 충돌이 계속발생되었다. 같은 Method를 2번씩 넣기에 .cs이 중복되지 않았으며 Method는 계속 2번씩 호출되고 있었다. 그 이유는 interface를 피하고 class만을 구하는 방법이 잘못된 것이었다. 해결하기 위해 Method의 BodyRegion이 비어있는지 확인하는 것으로 해결했다.

5. Interface

Class의 method만을 가져오려고하는데 계속 Interface까지 가져오기에 함수가 두번씩 나오게 되었다. 이를 처리하기 위해서 Class를 먼저 구하고, 그 class 내부에서 method를 찾는 방식으로 진행했는데 partial class에서 method를 2번씩 가져오는 문제가 발생되었다.


여러가지 삽질끝에 NRefactory Parser를 잘 쓸 수 있게 됐다.

'프로그래밍 > C#' 카테고리의 다른 글

[Unity] Android Plugin  (0) 2015.09.29
[Error] ClickOnce error  (0) 2014.11.21
FTP with .NET (C#)  (0) 2014.10.21
by 개발자가 되자! 2015. 11. 3. 15:01

Regular Expression 들어가기에 앞서


1950년대 Stephen Kleene에 의해서 생각된 개념입니다.


텍스트들 중에서 내가 원하는 부분을 찾는 방법은 키워드로 검색하는 것이 일반적입니다.

키워드 검색의 정확성은 높지만 비슷한 정보들을 찾기는 어렵다는 단점이 있습니다.

이때 이용할 수 있는 방법이 바로 Regular Expression


예시를 들어보겠습니다.

게시판에서 글의 정보를 가져오는 쿼리의 ResultSet을 클래스에 담는 경우를 생각해봅니다.

TITLE, NAME

2개의 컬럼이 있는경우는 간단합니다.



SEQ, TITLE, NAME, DATE, UPDATE_DATE

5개의 컬럼이 있는 경우? 혹은 20개가 있는 경우는 일일이 작성해야 할까요?

위의 field 선언부를 보면 알 수 있지만 여러개를 모두 작성하려니 힘이 듭니다.

이럴때는 정규표현식을 이용하면 굉장히 편리합니다.




Regular Expression 시작하기

가장 많이 사용하는 정보를 위주로 설명드리겠습니다.

정규표현식 테스트사이트로 이동하셔서 테스트 해보시기 바랍니다.


1. meta sequences

어떠한 1글자를 나타내는 키워드

 .

 라인을 변경하는 문자를 제외한 다른 문자 1개

 Matches any character other than newline (or including newline with the /s flag) 

 \s

 공백, Tab, 라인변경

 Matches any space, tab or newline character.

 \S 

 \s를 제외한 나머지 문자

 Matches anything other than a space, tab or newline.

 \d

 숫자

 Matches any decimal digit. Equivalent to [0-9].

 \w

 문자, 숫자, 밑줄(_)

 Matches any letter, number or underscore.

 

 

 

 


2. quantifiers

수량을 나타내는 키워드


 ?

 0 ~ 1

 *

 0 ~ 무한 

 +

 1 ~ 무한 

 {숫자}

 정확히 숫자 갯수 

 {숫자,}

 숫자 갯수 이상 

 {숫자1, 숫자2}

 숫자1 ~ 숫자2 갯수 사이



3. group construct

어려우면서 잘쓰면 좋은 그룹!

...은 찾을 키워드 (다른 키워드들이 들어가거나 문자 숫자 들이 들어갑니다.)

그룹을 찾고 나면 찾은 순서대로 \1, \2, \3 이런식으로 사용이 가능합니다.


 ( ... ) 

 괄호 사이를 찾고 그룹으로 지정합니다.

 (\w)

 ( a | b )

 a 또는 b

 (a|b)

 (?: ... )

 괄호 사이를 찾지만 그룹으로 지정하지 않습니다

 

 (?<name> ... )

 괄호 사이를 찾고 그룹의 이름을 name으로 지정합니다

 

 앞...(?=뒤...)

 Positive lookahead

 앞을 찾되 뒤가 같은 결과만 찾습니다

 abc(?=def)

=> abcdef abc000

 앞...(?!뒤...)

 Negative lookahead

 앞을 찾되 뒤가 다른 결과만 찾습니다

 abc(?!def)

=> abcdef abc000

 앞...(?<=뒤...)

 Positive lookbehind

 뒤를 찾되 앞이 같은 경우만 찾습니다

 abc(?<=def)

=> abcdef 123def

 앞...(?<!뒤...)

 Negative lookbehind

 뒤를 찾되 앞이 다른 경우만 찾습니다

 abc(?<!def)

=> abcdef 123def

 

 

 

 

 

 




Regular Expression 적용하기


선언부를 이용하여 아래의 결과값을 만들도록 합니다.

원하는 결과값 입니다.

첫줄을 설명하면

int 라는 타입을 찾고 변수명인 SEQ를 찾아서 getter setter를 그대로 이용하도록 하는 코드입니다.


검색

1. 먼저 변수명을 찾으려면 어떻게 해야할지 생각해봅니다

; 문자 앞에 변수명이 오고 있습니다.

[정규표현식]  (\w+);

[설명] \w라는 문자 숫자 밑줄을 한개 / + 갯수(1~무한) / ; 라인이 끝남 / 괄호 (, ) 를 통해서 그룹 설정을 합니다


2. 사이사이에 공백문자가 들어갈 수 있음을 염두해둡니다

[정규표현식]  (\w+)\s*;

[설명] \s 공백문자/ * 갯수(0~무한)



3. 데이터 타입을 찾습니다

[정규표현식]  (\w+)\s+(\w+)\s*;

[설명] 공백이 1개 이상 있으며 그앞에 데이터 타입이 있습니다. / 괄호 (, ) 를 통해서 타입에 대한 그룹 설정을 합니다


4.앞 뒤의 모든 문자들을 포함합니다.

[정규표현식]  .*\s+(\w+)\s+(\w+)\s*;.*

[설명] 데이터 타입 앞에 1개의 공백을 띄우고 / .* 나머지 문자를 앞뒤로 모두 포함합니다.


5. 대소문자 구분을 위해 \w+를 \w{1}\w* 로 변경합니다

[정규표현식]  .*\s+(\w+)\s+(\w+)\s*;.*

[설명] 함수의 대소문자를 맞추기 위해 맨 앞자리를 구분합니다



변경

원하는 부분을 모두 검색했으며, 이젠 그룹을 통해 원하는대로 변경하는 작업이 남았습니다

현재의 그룹 상태

\1 에 들어있는 값 => 데이터 타입의 첫번째 문자

\2 에 들어있는 값 => 데이터 타입의 나머지 문자

\3 에 들어있는 값 => 변수명의 첫번째 문자

\4 에 들어있는 값 => 변수명의 나머지 문자


대문자로 출력하기가 설정되어야 합니다만 텍스트 에디터마다 다른 기능을 통해 지원하고 있습니다.

예를 들어 VIM, Notepad++ 은 \U를 통해 뒤에 나온 내용 전체 대문자화, \u를 통해 뒤에 나온 내용만 대문자화를 지원하고 있습니다. 소문자의 경우는 \L \l 입니다.


article.set\u\3\4\(resultSet\.get\u\1\2\("\3\4"\)\);

Notepad++을 기준으로 설명드리기 전에 먼저 regex101.com을 이용한 결과를 보여드리겠습니다

\u 키워드를 지원하지 않고 있기 때문에 그대로 u라고 출력되었습니다.


Notepad++을 통해 변경작업을 하게 되면 다음과 같습니다.


javascript를 이용하면 결과값에서 대문자화를 추가적으로 진행해야 합니다. stackoverflow 사이트로 이동

var re = /(\b[a-z](?!\s))/g;
var s = "fort collins, croton-on-hudson, harper's ferry, coeur d'alene, o'fallon"; 
s = s.replace(re, function(x){return x.toUpperCase();});
console.log(s); // "Fort Collins, Croton-On-Hudson, Harper's Ferry, Coeur D'Alene, O'Fallon"


이런식으로 Regex를 만들어두고 필요할 때 변경하여 사용하면 화살표 Ctrl+c, Ctrl+v 노가다를 줄일 수 있습니다!

댓글 피드백을 남겨주세요↓



by 개발자가 되자! 2015. 10. 22. 13:58

필요한 것들

- 안드로이드 개발환경, 유니티

안드로이드 스튜디오(기준으로 설명) 혹은 안드로이드를 개발가능한 이클립스






- 안드로이드 스튜디오를 이용하여 프로젝트를 생성한다

blank로 하던 Add No Activity로 하던 안에 있는거 다 삭제

res 안에 것들


- .java 파일을 하나 만든다

package stars.com.starsplugin;

AndroidManager.cs


Plugin.java



import android.util.Log;
import com.unity3d.player.UnityPlayer;

public class Plugin {
private static Plugin _plugin = null;
private Plugin() {

}
public static Plugin getInstance() {
if (_plugin == null) {
_plugin = new Plugin();
}
return _plugin;
}

public void CallAndroid(String msg)
{
Log.d("MYTEST", "CallAndroid");
String message = msg + "(by CallAndroid)";
UnityPlayer.UnitySendMessage("AndroidManager", "SetLog", message);
}
}

이대로라면 import가 되지 않았다며 빨간줄이 뜰 것이므로


- classes.jar 설정

 C:\Program Files\Unity\Editor\Data\PlaybackEngines\androidplayer\development\bin\classes.jar

복사

C:\Users\Administrator\AndroidStudioProjects\project\app\libs


Open Module Settings -> Dependencies -> File dependency -> libs/classes.jar 추가







- Gradle 설정

Gradle Scripts -> build.gradle(Module:app) 열기

아래와 같이 수정


apply plugin: 'com.android.library' // application -> library

android {
compileSdkVersion 22
buildToolsVersion "22.0.1"

defaultConfig {
// applicationId "com."
minSdkVersion 15
targetSdkVersion 22
// versionCode 1
// versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.1'
compile files('libs/classes.jar')
}

//task to delete the old jar
task deleteOldJar(type: Delete) {
delete 'release/AndroidPlugin.jar'
}

//task to export contents as jar
task exportJar(type: Copy) {
from('build/intermediates/bundles/release/')
into('release/')
include('classes.jar')
///Rename the jar
rename('classes.jar', 'AndroidPlugin.jar')
}

exportJar.dependsOn(deleteOldJar, build)

- Make Module App (Ctrl + Shift + F9) 를 실행한다


- 안드로이드 스튜디오의 오른쪽에 보면 Gradle Project가 있다.

Project -> :app -> Tasks -> other -> exportJar을 Run 한다.



- C:\Users\Administrator\AndroidStudioProjects\StarsPlugin\app\release 폴더에 가면

AndroidPlugin.jar 파일이 생긴다.

- UnityProject의 Assets\Plugins\Android 폴더로 옮긴다.




- 유니티 스크립트에서 


public void CallJavaFunc(string strFuncName, string strTemp)

{ using (AndroidJavaClass cls = new AndroidJavaClass("stars.com.starsplugin.Plugin")) {   using (AndroidJavaObject stars = cls.CallStatic<AndroidJavaObject>("getInstance"))

  {

    stars.Call(strFuncName, strTemp);

  }

} }

public void SetLog(string strJavaLog) { Debug.Log("message from java: " + strJavaLog); GameObject.Find("GameManager").GetComponent<debug>().strLog = strJavaLog; strLog = strJavaLog; }

- 유니티의 함수를 호출하기 위해 유니티에서 Empty Object를 생성하고




GameObject이름을 동일하게 해준다. UnityPlayer.UnitySendMessage("AndroidManager", "SetLog", message);

UnitySendMessage의 정의는 UnitySendMessage("GameObjectName1", "MethodName1", "Message to send");



함수가 있는 스크립트를 추가해줌





잘나온다




- 끗

무슨 NativePlayer니 어쩌니 그딴거 쓸일이 뭐가있나 삽질..


첨부파일 참고


참고 사이트 : http://answers.unity3d.com/questions/437708/jni-exception-using-android-plugin.html

http://docs.unity3d.com/Manual/PluginsForAndroid.html

http://blog.naver.com/bluefallsky/220110061131

gradle 파일 참고 : http://egloos.zum.com/dra784/v/11168585


'프로그래밍 > C#' 카테고리의 다른 글

[C# Parser] NRefactory  (0) 2015.11.03
[Error] ClickOnce error  (0) 2014.11.21
FTP with .NET (C#)  (0) 2014.10.21
by 개발자가 되자! 2015. 9. 29. 20:37

안드로이드 프로그래밍을 할때 꼭 필요한 것은 바로 디버그 메세지 확인이다.

물론 스마트폰의 디바이스 드라이버는 설치가 되어 있고, SDK가 설치 되어 있어야 한다.


1. ADB LOGCAT


cmd를 통해 아래의 adb를 실행하면 된다.

C:\Users\Administrator\AppData\Local\Android\sdk\platform-tools\adb.exe logcat 태그명:D *:S

C:\Users\Administrator\AppData\Local\Android\sdk\platform-tools\adb.exe logcat | find "찾을내용"


리눅스에서는 find 대신 grep을 이용하면 된다.


하지만 adb logcat을 이용하려면 CUI방식이기 때문에 불편함을 많이 느끼는데 이때 사용하면 좋은 것이 바로

DDMS!!! => Monitor로 업그레이드되었다.


2. Monitor (DDMS)


아래의 SDK 위치로 이동하여 monitor.bat를 실행한다.

C:\Users\Administrator\AppData\Local\Android\sdk\tools\monitor.bat



연결된 스마트폰의 로그도 볼 수 있고, 디바이스 위쪽 아이콘 중에서 스마트폰 3개가 겹쳐진 모양을 누르면 화면 캡쳐도 가능하다.


굳굳!

by 개발자가 되자! 2015. 7. 21. 23:08

개인이 소지했던 미국 달러를 우리 돈으로 환전하려면 어떻게 해야 많이 받을 수 있을까요?

미국 달러를 환전하기 위해서 여러 가지 경로를 알아봤습니다.


1. 비행기에 달러를 가지고 탑승

만달러 이하는 세관에 신고하지 않아도 되니 그냥 가지고 탑니다

그리고 환율이 높을 때에 직접 달러를 환전 하기


2. 계좌를 그대로 이용하다가 해외 송금으로 한국 계좌로 전송

해외 은행을 통해 보내기 때문에 추가적인 수수료 차감이 있음.

여러 메이저 은행들은 일정 금액 이상 넣어 두어야 수수료가 없는 조건이 있습니다.


3. 미국 신한은행(Shinhanbank america)을 통해 한국의 신한은행으로 송금

같은 이름을 달고 있지만 본점과 지점의 느낌이 아니라 법인이 다르기 때문에 연결되어있지 않다고 함.

신한은행을 이용하면 $100 이상 넣어두면 수수료가 없기 때문에 해외의 다른 은행들 보다 금액적인 부담이 적고

한국으로 송금할때 만원의 수수료만 제외하면 송금 가능 ($3000 이하는 신고 없이 송금)

따라서 금액이 많으면 나누어 보내면 됨.



$1000 바꾸어 보기도 하고 송금으로 받아보기도 했는데 결과는 가지고 비행기로 와서 환전하는게 최고.

일단 송금으로 받게되면 현재 환율이 아래이니



비행기로 가져오는 경우 (1159.60 그대로 반영)

1. 서울역 환전센터에 가면 수수료 90% 우대를 해준다.

2. 명동에 있는 환전소들 중에서 환율이 가장 높은 곳으로 가면 현재 환율가 그대로 환전이 가능함.

$1,000 기준으로 115만9600원

$10,000 기준으로 1159만6천원


송금을 받는 경우 (1148.30 반영)

송금가 기준으로 받기 때문에 이미 손해를 보게 되며 신한->신한을 통해 입금 받더라도 +만원이라는 수수료가 발생

(물론 다른 은행으로 송금시 환율 수수료가 훨씬 비쌈)

$1,000 기준으로 113만 8300원

$10,000 기준으로 거의 1147만 3천원


결론은 $1,000에서 약 2만원 차이, $10,000에서 12만원까지 차이가 납니다.

by 개발자가 되자! 2015. 7. 21. 13:24

GTA5의 설치 경로를 변경하고 싶을 때는 레지스트리를 수정해주시면 됩니다.

 

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Rockstar Games\Grand Theft Auto V]

 

 

[InstallFolder] 는 설치 경로를 나타내고

[Language] 는 언어입니다.

 

한글 : ko-KR

영어 : en-US

by 개발자가 되자! 2015. 5. 12. 23:25

GTA5의 가장 어렵다고 소문난 지능 범죄를 성공했습니다!!!


$10,000,000의 보상을 받을 수 있는 도전


지능 범죄의 마지막!


퍼시픽 $1,250,000 동영상










지능 범죄 성공!


by 개발자가 되자! 2015. 5. 2. 06:02


GTA5 에서 52가지 스턴트를 즐길 수 있습니다.

스턴트를 즐기다 보면 새로운 색으로 도색할 수 있습니다.

일단 제가 진행한 것들에 대해서 작성했습니다.


요기로 들어가시면 해당하는 맵이 나옵니다.

제가 작성한 해당 위치에 대한 설명을 드리자면

녹색은 쉽게 깰 수 있는 모양입니다.

노랑색은 자동차를 이용해서 깨면 좋습니다.

파란색은 오토바이를 이용해서 깨면 좋습니다.

보라색은 빠른 자동차를 이용해서 깨면 좋습니다.

빨간색은 아직 못깬...

깨면서 사진 올린 것 스크린샷 첨부합니다.


by 개발자가 되자! 2015. 5. 2. 05:51


죄송합니다. 이 시스템에 Grand Theft Auto V가 설치되지 않았습니다. 게임을 다시 설치한 다음 다시 시도하십시오.

by 개발자가 되자! 2015. 5. 1. 03:56
| 1 2 3 4 ··· 6 |