시놀로지 DS116+을 사용하다가 성능과 1베이 용량에 아쉬움을 느껴 DS718+를 구매했다. 전에 작성해두었던 게시글을 토대로 Gogs를 다시 설치하려다가 718+는 Docker 사용이 가능해서 추후 복구가 편하도록 Docker 위에 올리기로 했....는데 한글로 쓰인 자료가 거의 없다...ㅜㅜ 그냥 되는대로 설치해 보기로 한다. 나중에 EC2나 회사 코로케이션 서버에 구축할 수도 있으니 최대한 시놀로지의 GUI없이 CLI에서만 구축해 보았다. - 2024-01-08 수정 최근에 watchtower 컨테이너를 구성해서 컨테이너들이 자동업데이트 되게 해놓았는데... 당시 볼륨을 설정해놓지 않아 어젯밤 업데이트하며 컨테이너가 재생성되며 db가 싹 날아가버렸다......... 멍청한 청년......... 본..
전체 글
플레이스토어에 앱 업로드 시 versionCode가 기존에 올라가있는 Bundle과 같거나 작을 경우 업로드가 차단된다. 매번 까먹고 다시 빌드해서 다시 올리는건 상당히 귀찮은 일이다. 다행히도 Gradle 문법에서 Programmatically Versioning이 가능하다. 먼저 Module단계의 폴더(기본: app)에 version.properties 파일을 하나 생성해 주고 관리하고 싶은 버전의 이름을 넣는다. VERSION_MAIN=0 VERSION_SUB=1 VERSION_CHILD=5 VERSION_RELEASE=5 이후 Module 단계의 build.gradle을 수정해주면 된다. 나는 Main은 신규기능 추가나 시스템 개편 등 업데이트를 설치하지 않으면 앱 사용이 불가할 정도의 업데이트 ..
로그를 눈에 보이게 처리해야 해서 TextBox에 로그를 남기는 함수를 만들었다. 근데.. static 함수에서는 this를 사용할 수 없다... 고민하던 중 생각난 해결책은 아래와 같다. public partial class Form1 : Form { public static Form1 instance; public Form1(){ InitializeComponent(); instance = this; } public static void func1(){ instance.Log("message"); } private void Log(string Message) { this.Invoke(new Action(() => { try { tb_log.AppendText($"[{DateTime.Now.ToStri..
Intro SSL Handler가 구현되어있는 최초 버전 (버전코드 1번)이 테스트 트랙에 올라가 있다는 이유로 구글플레이에서 삭제되었다. 당장 해당 트랙을 비활성화 한 뒤 업데이트를 시도해 보았지만 Cross App Scripting Vulnerability로 리젝되어 클라이언트의 요청이 지속되는 상황이었다. Vulnerability APK Version(s) Past Due Date Cross-app Scripting Your app(s) are using a WebView that is vulnerable to cross-app scripting. To address this issue, follow the steps in this Google Help Center article. 33 August..
요즘들어 유니티 프로젝트의 의뢰가 많다. 유니티는 자체적으로 Collaborator라는 클라우드 스토리지 서비스를 지원하지만, commit log를 제외하면 git처럼 버전 관리할 수 있는 곳이 암만 찾아봐도 없다. Github는 파일당 100MB 제한이 있고, BitBucket은 파일당 용량 제한은 없지만 총 용량 제한이 있다. 그리고 매우 느리다.. 그래서 그냥 시놀로지 DSM에 있는 Git Server를 활용하기로 했다. 사전에 Git Server와 MariaDB 5 설치가 필요하지만, Git을 사용하고 서버를 구축하기 위해 여기까지 찾아온 여러분께는 구태여 설명할 필요가 없을 것 같으므로 생략합니다. *** 시놀로지에서 Docker를 지원하는 경우 여기를 참조하세요. 도커로 구성하는게 추후 관리가..
DSM 패키지 센터 커뮤니티 소스 리스트 http://packages.synocommunity.com/ http://synology.sysco.ch/ http://www.cphub.net http://syno.dierkse.nl/ 인터넷에 떠돌아다니는 리스트 중 현재는 유효하지 않은 링크는 삭제했습니다 이 게시글의 패키지는 ARM 코어가 탑재된 보급형 Synology 기기에서도 사용이 가능합니다. 설치방법 Perl 패키지가 필요합니다. 시놀로지 공식 패키지센터에서 설치합니다. 패키지센터 우측 상단의 설정 버튼을 누르고, 패키지 소스 탭에 위 리스트를 추가합니다. ipkg만 설치하실거면 맨 아래 cphub 링크만 추가하셔도 됩니다. 패키지센터를 종료 후 다시 엽니다. 검색창에 ipkg를 검색 후 Easy ..
카카오 미러서버 - apt sudo sed -i -re 's/([a-z]{2}.)?archive.ubuntu.com|security.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list sudo apt update sudo apt upgrade -y 카카오 미러서버 - pip mkdir ~/.pip echo "[global] index-url=http://ftp.daumkakao.com/pypi/simple trusted-host=ftp.daumkakao.com" >> ~/.pip/pip.conf pip3 install --upgrade pip zsh 및 oh-my-zsh 설치 sudo apt install -y zsh curl git sh -c "$(curl -..
iOS 에서의 Javascript Interface Bridge는 단방향, JS -> Native로밖에 값을 전달하지 못한다. 따라서 js에 setValue() 등의 함수를 사용해야 한다.. 그러나 window.webkit.messageHandler.foo.postMessage(args) 를 호출하고, 네이티브에서 evalJavascript로 setFooValue(bar) 함수를 호출해 밸류를 지정해준다 한들, 완성된 js코드를 보는 후임 개발자 입장에서 코드가 쉽게 눈에 들어오지 않을 것이고, 예쁘지도 않다. 또 리턴받아야 하는 함수가 여러 개인 경우 setValue() 함수를 여러번 생성해야 하며, Android JavascriptInterface Bridge와 다른 방식으로 사용해야 한다. 안드로이..
카톡로그인 인텐트를 아래와 같이 처리해줬다. @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith("intent:")) { try { Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME); Intent existPackage = getPackageManager().getLaunchIntentForPackage(intent.getPackage()); if (existPackage!=null) { startActivity(intent); } else { Intent marketIntent = new Intent(Intent.ACTI..
MainActivity.java private long backKeyPressedTime = 0; private Toast toast; @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK)) { // 웹뷰 History상 이전 페이지가 있을 경우 if(mWebView.canGoBack()){ mWebView.goBack(); // 뒤로가기 return true; } // 없을 경우 앱 종료 전 Toast로 물어보기 else{ // 토스트메세지 출력 if (System.currentTimeMillis() > backKeyPressedTime + 2000) { backKeyP..