2016년 8월 14일 일요일

Stetho - A debug bridge for Android applications by Facebook



homepage: http://facebook.github.io/stetho/
GitHub: https://github.com/facebook/stetho

이 프로젝트는 간단히 말하면 안드로이드 앱을 디버깅을 쉽게 할 수 있게 해주는
프로젝트입니다.
크롬 개발자 툴을 통해서 안드로이드 앱을 디버깅하겠다는 프로젝트인데
신기해서 한번 들여다봤습니다.

밑에 설명이 더 있는데 한번 가볼까요.


크롬 개발자 툴에서 chrome://inspect로 디버깅 할 수 있고
네트워크 측정을 할 수 있습니다.



데이터베이스도 볼 수 있으며, 뷰 계층도 볼 수 있습니다.



dumpapp은 크롬 DevTool과는 다른 컴포넌트 툴인데 앱을 덤프해서
각종 preference를 설정하고 뭔가 할 수 있는 것 같은데 아직은 잘 모르겠으니
설치하고 한번 알아봐야겠습니다.

또, 자바스크립트 콘솔을 통해서
안드로이드 SDK함수까지도 테스트 할 수 있습니다.

한번 설치하고 튜토리얼을 해보죠.

저는 일단 그래들로 설치해서 설정, 실행까지 해보겠습니다.

app의 build.gradle 파일에서
// Gradle dependency on Stetho dependencies { compile 'com.facebook.stetho:stetho:1.3.1' }
이 compile 'com.facebook.stetho:stetho:1.3.1' 코드를 추가해줍니다.
싱크를 하고나서 onCreate 함수에

//Stetho initStetho.initializeWithDefaults(this);

이 코드를 삽입해줍니다.
(Application 클래스의 onCreate 함수에 넣어 주셔야 합니다.)

그럼 이제 돌려볼까요. 돌리고 나면 Stetho가 디버깅을 하겠다고
영어로 Alert가 뜨는데 그러고 앱이 동작합니다.

그리고 chrome://inspect 에 들어가봅니다.
그러면 지금 돌리고 있는 앱이 나올겁니다.


(요즘 얼굴인식 프로젝트 중이라
여기서 inspect를 눌러보겠습니다.



오오... 한번 뷰가 어떻게 나오는지 보겠습니다.


원래는 웹페이지라면 옆에 스타일을 탭을 통해서 수정할 수 있지만
여기선 별 의미 없는 자리인 것 같습니다.

콘솔테스트도 한번 해보겠습니다.



안되네요.. ㅎㅎ 추가적으로  설치해야하는게 있는 것 같습니다.
"Not supported without stetho-js-rhino dependency"
그럼 추가해줍니다.
아까 추가했던 곳에
compile 'com.facebook.stetho:stetho-js-rhino:1.3.1'

이 코드를 추가해줍니다.
그리고 다시 실행해보겠습니다.



오오... 다른 것도 이것저것 테스트 할 수 있는 좋은 툴인 것 같습니다.

즐거운 코딩하시길!

2016년 8월 11일 목요일

Cocos2d-x 3.12 MacOS 설치 후 실행 오류

Cocos2d-x 를 다음프로젝트에 사용하게 되어서 업데이트를 하려했으나
에러를 만나고 말았습니다.
이 에러는 cocos 명령어를 사용하고자 하면 나타났습니다.

➜  cocos2d-x-3.12 cocos
Traceback (most recent call last):
  File "/Users/pineoc/Desktop/cocos2d-x-3.12/tools/cocos2d-console/bin/cocos.py", line 22, in <module>
    import cocos_project
  File "/Users/pineoc/Desktop/cocos2d-x-3.12/tools/cocos2d-console/bin/cocos_project.py", line 4, in <module>
    import cocos
  File "/Users/pineoc/Desktop/cocos2d-x-3.12/tools/cocos2d-console/bin/cocos.py", line 936, in <module>
    language, encoding = locale.getlocale()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/locale.py", line 562, in getlocale
    return _parse_localename(localename)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/locale.py", line 475, in _parse_localename
    raise ValueError, 'unknown locale: %s' % localename
ValueError: unknown locale: UTF-8

에러를 요약하자면,
ValueError: unknown locale: UTF-8

UTF-8이라는 locale이 없다는 것인데,
저는 일단 컴퓨터의 환경설정이 지금 설치하고자 하는 버전과 잘 맞는지
확인해보았습니다.

Build Requirements

v3.12


  • Mac OS X 10.7+, Xcode 7+
  • Ubuntu 14.04+, gcc, CMake 2.6+
  • Windows 7+, VS 2013 or VS 2015
  • Python 2.7.5
  • NDK r10c+ is required to build Android games
  • Clang for developing Android games
  • Windows Phone/Store 8.1, VS 2013 Update 4+ or VS 2015
  • Windows Phone/Store 10.0, VS 2015
음.. 다 충족합니다.
뭐가 문제일까 하고 구글에게 물어봅니다.

위의 링크인 이슈 논의를 봤는데
아래와 같이 설정해주면 에러없이 잘 동작한다고 해서 해봤습니다.

$export LC_ALL=en_US.UTF-8
$export LANG=en_US.UTF-8

설정을 한 후에 실행해보았습니다.
$cocos


잘 되네요 ㅎㅎㅎ
에러의 원인은 예상하기로는
MAC + python 문제인 것으로 보입니다.

이참에 파이썬도 업데이트 해야겠습니다.

즐거운 코딩하시길 바라요 ㅎㅎ

2016년 8월 10일 수요일

Cocos Creator v1.2 released!


http://blog.cocos2d-x.org/2016/08/cocos-creator-v1-2-released/

코코스 크리에이터 1.2 버전이 릴리즈 되었네요.
릴리즈 내용은 아래와 같습니다.

1.2 Main Features
  • 1. Build to Lua Engine
  • 2. WebGL auto batching and culling
  • 3. Canvas rendering with dirty region optimization
  • 4. Graphics drawing system
  • 5. Refactored Properties panel supporting customized elements
  • 6. Modular JavaScript Engine
  • 7. AnySDK support
1. 루아 엔진으로 빌드 가능
두 달전에 루아 개발팀하고 만들었다고하는데 이제 루아로도 빌드가 가능해졌다고하네요.
2, 3 을 통해서 웹앱 게임 엔진 성능을 높힘.
배치파일을 통해서 최적화하고 (오토 컬링도 포함), 캔버스 렌더링을 최적화 했다고 하네요.
5배 이상 성능이 좋아졌습니다.

 

4. 그래픽 드로잉 시스템
SVG와 같은 벡터 그래픽 데이터, 이미지를 이용해서 개발할 수 있습니다.

5. 프로퍼티 패널 개선
6. 자바스크립트 엔진을 모듈화
자바스크립트 엔진 모듈화를 통해서 게임에 필요한 모듈만 넣어서 빌드,
게임 엔진 크기를 줄일 수 있게 되었습니다.
7. AnySDK 지원

2016년 8월 8일 월요일

구글 I/O 2016 한글 자막버전이 나왔습니다.

http://googledevkr.blogspot.kr/2016/08/google-io-2016-android-korean-subtitle.html

영어로 그냥 들었었는데
자막이 있으니 한결 이해가 더 잘되서 좋네요

GitHub 자바스크립트 게임 엔진 프로젝트 모음 - Phaser

https://github.com/showcases/javascript-game-engines

가끔 심심할 때에 깃헙에 있는 Explore 를 보곤합니다.
어떤 프로젝트가 요즘 뜨고 있는가, 재미있는 프로젝트가 있나해서
두리번 두리번 보곤했는데

오늘은 자바스크립트 게임엔진 프로젝트가 있길래 한번 들여다 봤습니다.





총 15개의 프로젝트가 있는데
제일 많은 스타를 받은 프로젝트를 한번 볼까요?

https://github.com/photonstorm/phaser

이 프로젝트는 Phaser 라는 이름의 게임 엔진 프로젝트입니다.




아래에는
엔진의 특징을 설명해놓았네요



WebGL, Canvas 그래픽 표현부터 시작해서
소리, 인풋, 애니메이션 등에 대한 특징에 대해 설명하고 있습니다.

그 아래에는 튜토리얼, 소식 등에 대한 내용이 있습니다.



각 포스트에는 내용에 따라 라벨이 붙어있네요.
튜토리얼, 게임, 컨퍼런스 등으로 나눠져 있습니다.

그리고 마지막에는
퀵스타트 가이드가 있습니다.



Phaser를 깃헙에서 받을 수 있기도 합니다만.
링크로 가면 해당 사이트에 있는 다운로드 페이지로 가서
stable 버전을 다운 받을 수 있게 되어있네요.




저는 js 버튼을 눌러서 다운받아 보았습니다.
(3.3MB 정도의 크기의 phaser.js 파일이 다운받아졌습니다.)

튜토리얼을 한번 해보려고 했으나
http://phaser.io/tutorials/getting-started/index
영어 + 조금 불친절한 내용으로 힘들 것 같네요.

튜토리얼 말고 예시에 대해서 한번 보고 마치겠습니다.
http://phaser.io/examples
깃헙 Examples 링크: https://github.com/photonstorm/phaser-examples



많은 예제가 있는데 하나만 들어가보겠습니다.

ACADE PHYSICS로 가서 Accelerate to pointer 라는 예제를 보겠습니다.



이 예제는 저 초록 화살표가 마우스를 따라옵니다.

이 밑에는 코드 예시가 있는데요



다운받아서 플러그인 처럼 사용해도될 것 같습니다.

Phaser로 한번 간단한 게임 만들어도 재미있을 것 같네요.
이상 자바스크립트 게임 엔진 프로젝트인
Phaser 포스팅을 마치겠습니다.

즐거운 코딩하시길 바랍니다 :)

2016년 8월 4일 목요일

Cocos2d-x v3.12 released!

Cocos2d-x 3.12 버전이 릴리즈 되었네요.
다음 링크는 깃헙에 있는 변경사항 링크입니다.
https://github.com/cocos2d/cocos2d-x/blob/v3/CHANGELOG

업데이트 사항은 다음과 같습니다.

[HIGHLIGHT]     add VR support
[HIGHLIGHT]     add Tizen support
[HIGHLIGHT]     fix Android performance issue
[HIGHLIGHT]     Web engine performance improved in WebGL mode
[HIGHLIGHT]     support obb extension on Android

[NEW]           Core: add `utils::findChild()`
[NEW]           Core: add CSV format support to tile maps
[NEW]           Core: add `FileUtils::getContents()`
[NEW]           Core: cocos2d::Value supports unsigned
[NEW]           Particle: add feature to pause/resume particle emitter
[NEW]           Platform: support Windows 10 UWP x64
[NEW]           UI: add clamp and shrunk feature for system fonts, currently only support iOS, Android and Mac
[NEW]           UI: make ListView select item programmatically
[NEW]           UI: add `EditBox::InputFlag::LOWERCASE_ALL_CHARACTERS` to lowercase characters
[NEW]           UI: add `setBounce()` to WebView
[NEW]           Web: refactor TMXLayer renderers
[NEW]           Web: can force orientation in mobile browser
[NEW]           Web: support high resolution TTF Label on retina display

[REFINE]        Android: use clang instead of gcc to compile codes
[REFINE]        Android: hide virtual button by default
[REFINE]        Android: set music volume control as default
[REFINE]        Android: usage clang insteand of gcc to compile codes
[REFINE]        Audio: catch `IllegalStateException` exception to avoid crash when playing background music with SimpleAudioEngine on Android
[REFINE]        Core: fix many warnings
[REFINE]        Core: move StringUtils functions from deprecated header file to ccUTF8.h
[REFINE]        Core: FontFNT will ignore chars that exceeds 65535 and print a warning information
[REFINE]        Core: `Node::ignoreAnchorPointForPosition()` is deprecated and add `Node::setIgnoreAnchorPointForPosition()`
[REFINE]        Core: allow inherit from platform FileUitils
[REFINE]        Core: add optional alpha parameter to Color4B and Color4F
[REFINE]        Core: Follow action can accept horizontal and vertical offset
[REFINE]        Core: TMXXMLParse parse `id` element
[REFINE]        Lua: rename all member functions named `end()` to `endLua()`
[REFINE]        JSB: make selectedSprite opitional in MenuItemSprite
[REFINE]        JSB: return null if read failed in `js_cocos2dx_CCFileUtils_getDataFromFile()`
[REFINE]        Template: iOS tempalte is refined to make cocos2d-x game scene work better with other UIView
[REFINE]        Template: remove `build_native.sh`
[REFINE]        Template: ARC support on iOS and Mac OS
[REFINE]        UI: TTF and BMFont label wrap mode will automanytically changed to char wrap mode when label's width is less than word's boundary
[REFINE]        UI: UIWidget adds missing properties for clone
[REFINE]        UI: UIScrollBar caches the texture created with base64 encoded images
[REFINE]        UI: EditBox now prints lowercase letters by default
[REFINE]        UI: enable WebView's local storage on Android
[REFINE]        UI: improve EditBox implementation on WinRT
[REFINE]        UI: make PageView indicator more tunable
[REFINE]        UI: make PageView page turning event time tweak configurable
[REFINE]        UI: RichText is improved: add effect of outline, shadow and glow; catch the event of open url; ability to extend tags; add anchor of image tag
[REFINE]        3D: skeleton animation is more efficient when two animations switch frequently
[REFINE]        3rd party: update webp to 0.5.0
[REFINE]        Web: improve basic types to reduce memory usage
[REFINE]        Web: Show line number in console statements
[REFINE]        Web: Cache base64 image of PageViewIndicator and ScrollViewBar
[REFINE]        Web: Pass error in cc.AsyncPool in onEnd callback
[REFINE]        Web: Separate ccui.ListView event callback from ccui.ScrollView for its own events

[FIX]           Android: fix compiling error if using NDK r11+
[FIX]           Android: package name is `libcocos2dx` instead of application name if building with Android Studio
[FIX]           Audio: AudioEngine can not work if the file path contains not ascii code on iOS
[FIX]           Audio: SimpleAudioEngine::playEffect() doesn't work correctly on Linux
[FIX]           AssetsManager: can not work
[FIX]           AssetsManagerEx: use manifestUrl from remote version
[FIX]           Core: `FileUtils::writeValueMap()` will crash on iOS if it contains `Value::Type::None` type element
[FIX]           Core: `ClippgNode::setStencil()` may cause assert error if it is invoked before
[FIX]           Core: `TextureCache::addImageAsync()` doesn't set pixel format corretly
[FIX]           Core: `GL::SetBlending()` doesn't set dst correctly
[FIX]           Core: vertex z can not work correctly if window size changed on desktop platforms
[FIX]           Core: use `std::isnan()` instead of `isnan()` to fix compiling errors on some Linux platforms
[FIX]           Core: crash on windows when using PolygonInfo
[FIX]           Core: fix `libpng error: CgBI: unhandled critical chunk` error with Xcode 7.3
[FIX]           Core: EXC_BAD_ACCESS random crash caused by reallocation of shared indices memory
[FIX]           Core: memory leak of `utils::captureScreen()` on iOS and Mac OS
[FIX]           Core: assert error if remove an event listener twice at the same time
[FIX]           Core: FileUtils::getValueMapFromFile() returns wrong value if it is a number with scientific notation on Android
[FIX]           Core: UIGrayScale shader is not reloaded when reloading shaders
[FIX]           Core: `SpriteFrame::clone()` doesn't clone polygonInfo
[FIX]           Core: `FileUtils::createDirectory()` fails on Mac OS with sandbox
[FIX]           Core: `cocos2d::Value` operator overloading of comparison `==` returns wrong value in case Type::VECTOR 
[FIX]           Core: wrong content size if minisize
[FIX]           Core: can not have a class named `Game` on Windows
[FIX]           Core: crash if load bad image on Windows
[FIX]           Core: custom shader uniforms and attributes do not have effect in DrawNode
[FIX]           Core: blend mode doesn't work with animated sprite
[FIX]           Core: `FileUtils::removeDirectory()` can not work correctly when the path is not end of `/` on iOS and Mac
[FIX]           JSB: fix some bugs related with JSB debegger
[FIX]           JSB: scheduler callback target lost
[FIX]           JSB: missing scroll widgets constants
[FIX]           JSB: if obj is undefined or null then attempt to access obj.__nativeObj leads to incorrect behavior
[FIX]           JSB: use `require()` to require the same script twice may crash
[FIX]           Lua: lua function is not invoked when error happens in websocket
[FIX]           Network: HttpClient Content-type limitation on iOS
[FIX]           Network: downloader crash when storage path contains spaces
[FIX]           Network: SocketIO crash on reconnect
[FIX]           Physics: PhysicsBody damping doesn't wrok
[FIX]           UI: EditBox may cause `java.lang.IndexOutOfBoundsException` exception on Android
[FIX]           UI: TextFieldTTF doesn't show password correctly
[FIX]           UI: RichText crash on Windows
[FIX]           UI: EditBox can not use custom font on Android
[FIX]           UI: can not use TTF font on Android
[FIX]           RenderTexture: `setOpacity()` has not effect
[FIX]           3D: `Sprite3D::createNode()` may not work correctly with particular model data
[FIX]           Web: `getParentToNodeTransform` doesn't return result
[FIX]           Web: remote image without extension in url can't be loaded as image
[FIX]           Web: nested clipping nodes rendering issue in WebGL render mode
[FIX]           Web: IMEDispatcher can't work in mobile Chrome


영어로 되어있긴하지만 주요 업데이트 내용은 다음과 같습니다.
1. VR 지원
2. 타이젠 지원
3. 안드로이드 성능 이슈 해결
4. 웹 엔진 성능 WebGL mode로 향상
5. obb extension 안드로이드 지원

그 외 새로 추가된 메서드, 이슈 해결 관련 목록이네요
천천히 읽어보고 추가할 내용있으면 추가해서 다시 작성해보겠습니다.

즐거운 개발 되시길 바랍니다.

2016년 7월 30일 토요일

서울시 정보 GitHub 공개

https://github.com/seoul-opengov/opengov

몇 달 전에 서울시에서 공개한 정보들을 GitHub에 올렸다고
뉴스에서 봤었는데 이제 한번 찾아봤습니다.

실제 저기 있는 데이터는
http://opengov.seoul.go.kr/ - 서울시 정보소통광장

여기에 있는 데이터들을
GitHub에 다운받아서 사용하기 좋게 디렉터리 별로 나눠놓은 것 같습니다.

주요 공개 정보는 다음과 같습니다.


  • 결재문서 - info_list
  • 정책연구보고서 - public_list
  • 사전정보공표 - research_list

결재문서의 폴더를 한번 들어가 보겠습니다.



이렇게 쭉 있고
글 작성 최근 5일전까지 데이터가 업로드 되었습니다.
꾸준히 관리하고 있는 것 같습니다.

각 정보 파일은 .json, .xml, xlsx, csv 데이터로 각각 저장되어있습니다.
.json 파일 한번 열어보도록 하겠습니다.



파일 한번 다운받아봤는데
34.4MB 크기로 되게 큽니다.

결재 문서의 형식 정보는
https://github.com/seoul-opengov/opengov#분야별-항목설명-별도-표시-없는-경우-not-null항목
위의 README.md에 있습니다
결재문서
  • package_id : 문서관리번호(PK)
  • doc_prdctn_dt : 자료생산일자
  • trck_card_nm : 단위과제카드명
  • title : 제목
  • src_dept_doc_id : 문서번호 (예: 정보공개정책과-1234)
  • writer : 담당자
  • othnd_pd : 문서보존기간(1년, 3년, 5년, 10년, 30년, 준영구, 영구)
  • dept_nm : 부서명
  • othbs_se : 공개구분코드(공개,부분공개,비공개)
  • cpyrht : 라이선스(CCL 적용, CC BY, CC BY-ND, CC BY-SA, CC BY-NC, CC BY-NC-SA, CC BY-NC-ND ), nullable
  • url : 원문공개URL, nullable
  • 주의사항 :cpyrht,url은 원문공개중인 경우만 해당 정보가 존재함.

제가 보기엔 이 데이터들을 무언가에 사용하기엔
2차, 3차 가공이 필요해보이긴합니다.

해당 공개된 자료를 다운받고, 그에 대한 자료 처리를 통해서 뭔가 할 수 있을 것 같습니다. 
저는 정보공개 외에는 큰 의미가 있을까, 어떻게 사용할 수 있을지 의문이 듭니다.

PS.
저는 개인적으로 통계적인 데이터를 받아서 사용할 수 있게 만들어서 주는게 
차라리 낫지 않을까 싶습니다.
서울의 통계나 공공데이터를 깃헙에 정리하는 것도 좋을 것 같지만 따로 사이트가 있으니 
http://data.seoul.go.kr/index.jsp - 여기가서 필요한 정보 받아서 사용하는게 좋을듯 합니다.

<서울 열린데이터 광장>

서울 열린데이터 광장도 많은 기능이 있는 것 같은데
한번 사용해보고 포스팅해봐야겠습니다.

2016년 7월 29일 금요일

더 많은 사용자를 위한 개발 - 구글 개발자 블로그

원글: http://android-developers.blogspot.kr/2016/06/building-for-billions.html

구글 개발자 코리아 블로그 글
http://googledevkr.blogspot.kr/2016/07/building-for-billions.html

좋은 이야기인 것 같습니다.
사용자들이 좋은 환경에서 잘 사용해야 좋은 앱이지요!

블로그 글의 내용은

- 느린 인터넷 및 오프라인 상태에서 올바르게 동작하기
- 정확히 상황에 들어맞는 올바른 콘텐츠 제공
모바일 하드웨어를 위한 최적화
- 배터리 소모 절감
- 데이터 사용량 절약

해당 내용은
구글 빌리온즈 (https://developers.google.com/billions/) 에서 볼 수 있습니다.

웹에 대한 내용은
https://developers.google.com/web/billions/

안드로이드에 대한 내용은
https://developer.android.com/distribute/essentials/quality/billions.html

2016년 7월 28일 목요일

Updating Global Packages, NPM

https://docs.npmjs.com/getting-started/updating-global-packages

#NPM을 통해서 다운받았던 글로벌 패키지들을 업데이트합니다.
링크에 나와있는 내용을 기반으로 업데이트를 진행해봤습니다.
사용하는 모듈이 최신버전이 아닐경우 문제가 생기는 경우가 간혹 있어서
업데이트하는 방법을 찾아봤는데 어렵지 않더라구요.

공유합니다.


$npm updated -g



#Update these outdated list

$npm update -g




2016년 7월 26일 화요일

RegExr - 정규식 공부, 연습할 수 있는 서비스

http://regexr.com/



정규식에 대해서 관심이 있던차에
이런 서비스를 찾았습니다.

RegExr의 의미는 RegularExpression.
정규 표현식이라는 의미입니다.

정규표현식이란 무엇일까요?
위키: 위키 링크

"특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. 정규 표현식은 많은 텍스트 편집기와 프로그래밍 언어에서 문자열의 검색과 치환을 위해 지원하고 있으며, 특히과 Tcl은 언어 자체에 강력한 정규 표현식을 구현하고 있다." - 위키 

특정한 규칙을 가진 문자열의 집합을 표현한다.
우리는 이러한 규칙을 이용해서 문자열을 치환한다던지, 찾아낸다던지, 그에 맞게 처리하는
로직에 정규식을 넣고 싶어합니다.

다만 조금, 아니 많이 어려울 뿐이죠 ㅎㅎ
(한번 알고나면 괜찮다는데 여전히 어렵습니다.)

RegExr라는 서비스는 연습 데이터가 있고 그 데이터에서 정규식을 사용자가
직접 수정하고 적용하면서 어떻게 되는지 공부할 수 있는 서비스 입니다.

<튜토리얼 영상>

현재 이 서비스는 깃헙에 공개되어있습니다.

사용법은 튜토리얼 영상을 보지 않더라도 어렵지 않게 사용할 수 있지만
정규식을 모르는 분들이라면 이 서비스로 공부하는게 어렵긴합니다.
(저도 어려워서 다른 곳에서 정보 찾아가며 공부중입니다)

정규식에 대한 문법은 아래에 있습니다.
위키 링크: 정규식 문법

그에 대한 예시도 포함되어있습니다.
위키 링크: 정규식 예

RegExr에는 레퍼런스 메뉴가 있는데
거기 있는 내용을 참고해서 테스트 해볼 수 있습니다.



<메뉴대로 쭉 눌러서 들어간 후 "." 을 테스트해보았다.>

그 외에 테스트 했던 정규식을 저장하고, 정규식을 공유하는 기능 등이
잘 녹아 있는 서비스 입니다.




모두 즐거운 코딩하시길!

JIRA Plugin - ScriptRunner 소개 #2

관련 글 소개 #1:  https://pineoc.blogspot.com/2019/03/scriptrunner-1.html ScriptRunner 소개 #2 지난 글에서는 Behaviours를 보았고 다음 내용인 콘솔, 리스너 등을 ...