Apache를 통한 Synology Proxy 설정

Linux
<VirtualHost *:80> ServerAdmin your-email ServerName your-privkey-domain RewriteEngine On RewriteCond %{HTTPS} off RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] ErrorLog ${APACHE_LOG_DIR}/your-privkey-domain.error.log LogLevel warn CustomLog ${APACHE_LOG_DIR}/your-privkey-domain.access.log combined #ProxyPass / http://your-privkey-domain:port #ProxyPassReverse / https://your-privkey-domain:port </VirtualHost> <VirtualHost *:443> ServerAdmin your-email ServerName your-privkey-domain ProxyRequests Off SSLProxyEngine on ProxyPreserveHost On AllowEncodedSlashes NoDecode SSLEngine on SSLProxyVerify none SSLProxyCheckPeerCN off SSLProxyCheckPeerName off SSLProxyCheckPeerExpire off SSLCertificateFile "/etc/letsencrypt/live/your-privkey-domain/cert.pem" SSLCertificateKeyFile "/etc/letsencrypt/live/your-privkey-domain/privkey.pem" SSLCertificateChainFile "/etc/letsencrypt/live/your-privkey-domain/chain.pem" ProxyPass / https://your-privkey-domain:port nocanon ProxyPassReverse / https://your-privkey-domain:port RequestHeader set X-Forwarded-Proto "https" RequestHeader set X-Forwarded-Port "443" ErrorLog ${APACHE_LOG_DIR}/your-privkey-domain.error.log LogLevel warn CustomLog ${APACHE_LOG_DIR}/your-privkey-domain.access.log combined </VirtualHost>
Read More

TCS V20220101

TCS
TCS 프로그램의 사소한 에러를 수정하였습니다. google 검색 단어에 대해서 정상적으로 처리 하지 못하는 문제를 수정하였습니다.데이터 검색시에 잘못된 결과값이 나오는 문제를 수정하였습니다.프로그램 자체 인증서를 등록하여서 처리하였습니다. 프로그램이 자동으로 버전 체크를 하지 않습니다. 독립적으로 실행되도록 처리해서 별도 처리가 현재는 없습니다. 앞으로 기능이 추가 될 경우에는 버전체크등을 도입할 계획은 있지만 자동 업데이트 기능은 지원 하지 않을 생각입니다. TCS다운로드 현재 TCS 프로그램에는 비빈이 걸려 있지 않지만 추후에는 압축 파일에 비밀번호가 등록될 예정입니다.
Read More

code server 세팅 기록

Linux, Tool
외근이 많다보니 IDE 세팅을 일일이 맞추기도 힘들어서 알아보던 도중에 code-server가 존재하는것을 알게 되었습니다. PC에 설치 하지 않고 Server에 설치해서 Webbrowser를 이용해서 IDE를 사용하도록 해주는 Tools 이여서 상당히 끌리게 되어서 제 서버에 설치를 하게 되었습니다. 전 웹서버를 이용할대 Apache를 잘 이용하지만 이번에는 code-server 때문에 nginx 를 이용해서 설치를 하게 되었습니다. code-server만을 이용할때는 상당히 잘 작동을 하고 빠르게 작동을 하여서 만족을 하게 되었습니다. 애초에 nginx가 apache보다 가볍기 때문에 속도가 잘 보장이 되어서 좋은 기능을 사용할 수 있게 되었지만 서버를 code-server 만으로 사용하기에는 자원을 너무 낭비를 하기에 여러가지 올리는 도중에 webdav까지 사용할 수 있도록 설정을 하려고 하다보니 여러가지 설정을 찾아서 헤매게 되었습니다. nginx 설정을 인터넷에 많기 때문에 자료를 정리하려다가 포기하고, apache로 갈아 타게 되었습니다. apache도 code-server 기능을 이용하기 위해서는 인터넷에 찾아보니 여러가지로 돌아 다니지만 참 난관의 연속이였습니다.꼬박 하루를 설정을 가지고 WEB 서버 가동을…
Read More

TCS 테스트 버전

TCS
지금가지 만든내용 공개 입니다. 별다른 기능도 현재 없고, 시험 운영중이라서 아마 데이터가 초기화 될수도 있습니다. 아직 여러가지 보완 해야 될 점이 있기전에 한번 공개해 보는것입니다. 조금 안정화 되면은 여러가지 기능을 추가 하면서 업데이트 진행할 예정입니다. 현재 테스트 버전이여서 비밀번호 없이 공개를 하고 있지만 이후에는 비밀번호를 걸어서 불특정 다수에게 공개 하지 않습니다.
Read More

TCS 개발 화면 공개

TCS
TCS 개발중 이미 서버상의 기초 개발은 완료된 상태 입니다. 처음에 계획한대로 WindowsAPP을 현재 제작중에 있습니다. 서버와의 통신방법과 사용자 데이터 처리 방법등에 대해서 여러가지 처리를 하기 위해서 개발을 하고 있다보니 조금은 더디게 가고 있습니다. 전신인 ACTS의 화면 구성을 그대로 받아 들이지만 내용이 많이 달라져서 현재 UI 구성을 고민하여서 하고 있기 때문에 상당한 시일이 소요 될것 같습니다. 그렇지만 이전보다 많은 양의 데이터를 제공하기 위해서 개발을 진행을 하고 있으며, 앞으로도 그렇게 나아갈 예정입니다. 가끔 개발 화면을 공유해서 올리도록 하겠습니다.
Read More

TCS 오픈 안내

TCS
안녕하세요. 몇년간의 개발경험을 바탕으로 새롭게 Torrent, Caption 정보를 제공하는 서비스를 새롭게 오픈 하려고 합니다. 이전 프로그램인 ACTS, SFCA는 주제가 한정되어서 새롭게 데이터를 제공하기기 쉽지 않았습니다. 그래서 새롭게 서비스를 개발하게 되었습니다. 이번에는 Animation 이라는 주제를 제외 하고 서비스를 개발 하게 됩니다. 좀 더 많은 양의 정보를 제공하기 위해서 주제를 Torrent로 확대 적용을 하게 됩니다. 물론 Caption 서비스를 제공하지만 이전 프로그램처럼 세밀하게 제공을 하지 않습니다. 현재 서버에서 자료 처리 방법은 구현이 완료 되어 있으며 윈도우APP과 , 안드로이드APP, Web, RSS 제공하기 위해서 각각의 Client 버전을 제작중에 있습니다. 현재 RSS는 개인 테스트 중에 있는 상태 입니다. 또한, ACTS 기능에 있는 즐겨찾기 기능에 대해서 좀 더 기능을 확장 및 변경을 하여서 여러가지 정보를 타겟팅하여서 보여 줄 수 있도록 즐겨찾기 기능이 대폭 변경이 되면서 해당 기능과 연동하여서 RSS 서비스를 제공하기 위해서 준비중에 있습니다. 2021년에는 제공해 드리지…
Read More

ACTS / SFCA 데이터 제공 중단

ACTS/SFCA
안녕하세요. 포기한다고 하고 오래동안 데이터 제공을 해왔지만 이제 정말 마무리를 해야 될것 같습니다. 차일피일 미루다가 이제서야 하게 되었습니다. 현재로서는 서버에서 데이터 수집에 대한 확장성과 처리에 있어서 너무 많은 자원을 할당을 하고 있어서 서버를 유지할 이유조차 사라지게 되었고, 프로그램이 탄생하게 된 이유의 목적이 많이 소실된 상태 입니다. 이러한 이유를 가지고 2021년이 지나가기 전에 서비스를 종료 하려고 합니다. 그동안 몇몇분이 사용해 주신것을 알고 있으면 앞으로로 이용해 주실것을 알고 있지만 저 또한 유지보수를 하지 않고 사용을 하지 않는 서비스에 시간을 할애하시고 정상적으로 작동하지 않는 프로그램에 대한 서비스를 하는것은 맞지 않는다는 생각에 마무리를 할려고 합니다. 그동안 사용해 주셔서 감사합니다.
Read More

안드로이드 웹뷰에서 화면 캡쳐하기

Android
아래의 코드는 테스트 코드 입니다. 현재 화면 전체를 캡쳐를 할 수가 없어서 지금 계속 테스트 중에 중간 저장을 위해서 코드를 기록을 해 놓습니다. wvPrint.loadUrl(Url); wvPrint.enableSlowWholeDocumentDraw(); wvPrint.setWebViewClient(new WebViewClient() { public boolean shouldOverrideUrlLoading(WebView view, String url) { return false; } @Override public void onPageFinished(WebView view, String url) { Log.i("deneb::", "page finished loading " + url); float scale = wvPrint.getScale(); int height = (int) (wvPrint.getContentHeight() * scale + 0.5); Bitmap bitmap = Bitmap.createBitmap(780, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); wvPrint.draw(canvas); // 파일 저장 String strFilePath = context.getCacheDir().toString(); Log.d("deneb::", "경로 :: " + context.getCacheDir().toString()); File fileCacheItem = new File(strFilePath, "print_page.png"); OutputStream out = null; try { fileCacheItem.createNewFile(); out = new FileOutputStream(fileCacheItem); bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { out.close(); double…
Read More

C# Debug / Release 체크해서 코드 실행하기

CSharp
C#으로 개발을 하다 보면은 Debug에서만 작동해서 테스트를 위할 때가 있습니다. Release와 동일하게 하면 좋지만은 겨우 확인을 위해서만 필요한 사항인데, 빌드할때 빼먹으면은 남기도 하고 하는등이 피폐한 부분이 있어서 조금은 코드를 찾아보니 좋은 조건문이 있어서 기록을 합니다. #if DEBUG Console.WriteLine("Mode=Debug"); #else Console.WriteLine("Mode=Release"); #endif 이제 그냥 디버그와 릴리즈 일때 구분하지 않고 코드를 나두고 작업을 합니다. 물론 최종 출시전에는 위에 코드가 없는편이 깔끔하고 좋지만은 한창 개발중인 기능에 대해서는 긴급하게 업데이트도 필요하기 때문에 나두면은 좋습니다. 물론 실행을 막아주기도 하는등의 좋은 기능도 있습니다. 주석을 잘 남기는것도 좋지만 확실히 디버그 일때와 릴리즈 모드에 대해서도 구분을 하고 개발을 하면 좋을것 같습니다.
Read More

윈도우 시간 동기화

CSharp
프로그램을 개발하면서 윈도우의 시간동기화가 필수적으로 필요하게 되었습니다. 당연히 윈도우가 자동으로 잘 동기화를 하고 있겠지만은 그렇지 않은 경우에는 강제로 동기화를 해야 하는데, 컴퓨터가 그냥 자동으로 작업을 할 경우에 시간에 예약이 있을 경우에 시간이 동기화가 되지 않으면은 작업이 늦어지기에 한번씩 동기화를 해줘야 합니다. /// <summary> /// Gets the current DateTime from time-a.nist.gov. /// </summary> /// <returns>A DateTime containing the current time.</returns> public static DateTime GetNetworkTime() {     return GetNetworkTime("time.windows.com"); // time-a.nist.gov }   /// <summary> /// Gets the current DateTime from <paramref name="ntpServer"/>. /// </summary> /// <param name="ntpServer">The hostname of the NTP server.</param> /// <returns>A DateTime containing the current time.</returns> public static DateTime GetNetworkTime(string ntpServer) {     IPAddress[] address = Dns.GetHostEntry(ntpServer).AddressList;       if (address == null || address.Length == 0)         throw new ArgumentException("Could not resolve ip address from '" + ntpServer + "'.", "ntpServer");…
Read More

$(document).ready 보다 실행이 늦은 $(window).load

JavaScript
<script> $(window).load(function() { alert(2); }); $(document).ready(function() { alert(1); }); </script> WebPage를 작업하다 보면은 모든것을 Loading이 끝나고 실행해야 하는 상태가 있습니다. 보통은 ready를 사용하지만은 DOM 객체만 loading이 되면은 바로 실행이 됩니다.이렇게 DOM 객체 상관없이 외부이미지 리소스 모두 loading를 하고 실행이 되어야 할 경우에는 load를 사용하면 됩니다.위에 예제처럼 2개의 사용방법이 다르니 한번 살펴보시기 바랍니다.
Read More

안드로이드 웹뷰 기능 제작중

Android
package com.sihwawon.android import android.R.attr import android.R.attr.* import android.annotation.SuppressLint import android.app.AlertDialog import android.app.Dialog import android.content.DialogInterface import android.content.Intent import android.graphics.Bitmap import android.net.Uri import android.net.http.SslError import android.os.Build import android.os.Bundle import android.os.Environment import android.os.Message import android.provider.MediaStore import android.util.Log import android.view.View import android.view.ViewGroup import android.webkit.* import android.widget.ProgressBar import androidx.appcompat.app.AppCompatActivity import java.io.File import java.util.* import java.util.UUID import android.widget.Toast import android.view.Gravity import android.webkit.WebView import android.webkit.WebViewClient import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import android.webkit.ValueCallback import java.io.IOException import java.text.SimpleDateFormat import android.app.Activity import android.content.Intent.ACTION_VIEW import android.content.res.Configuration import android.text.TextUtils import android.webkit.WebChromeClient import android.os.Parcelable import androidx.core.content.FileProvider import android.webkit.WebChromeClient.FileChooserParams import androidx.annotation.RequiresApi import android.print.PrintAttributes import android.print.PrintManager import android.view.KeyEvent import kotlin.time.days class MainActivity : AppCompatActivity() { private lateinit var mWebView: WebView private var pWebView: WebView? = null private lateinit var mProgressBar: ProgressBar private var thisUrl: String? = null private var barcode: String? = "" private var popup: Boolean? =…
Read More

fail2ban 개인 설정

Linux
개인서버를 운영하다보면은 무단으로 접속하는 사람이 많은 편입니다. 처음에는 SSH 접속만을 차단을 하다가 이제는 웹으로도 접속이 많이 시도를 하게 되어서 fail2ban에 설정을 인용해서 apache도 설정을 추가 해서 사용을 합니다. 공개 서버이지만 무단 접속은 막지 않으면은 결국은 쌓여서 서버의 자원을 소모하게 됩니다. 그래서 특단의 조치로 설정을 하게 되면서 설정 파일을 블로그에 기록을 합니다. 개인적인 설정이다 보니 조금은 개인적인 생각이 가미되어 있을수 있지만은 참조를 해서 사용을 하면 되지 않을까 합니다. [DEFAULT] ## 차단하지 않을 IP #ignoreip = 127.0.0.1/8 192.168.10.0/24 # 접속을 차단할 시간. 600 = 10분 bantime = 10800 # 최대 허용 횟수 maxretry = 3 #아래 시간동안 maxretry횟수만큼 실패시 차단 findtime = 60 # (선택) 메일 알림기능 #destemail = sysadmin@example.com #sender = fail2ban@my-server.com #mta = sendmail #action = %(action_mwl)s [sshd] enabled = true #여러 포트를 사용할 경우 port = ssh,10022 port =…
Read More

Javascript 3자리 콤마 및 소수점 2자리 입력 받기

JavaScript
웹페이지를 개발하다 보면은 사용자가 보이기 편하도록 단위마다 콤마도 붙여줘야 하고 소수점도 받아야 합니다. 하지만, 숫자외에 입력을 받다보면은 문제가 생길수 있어서 아래의 코드를 적용하면은 숫자외에는 입력을 받지 않기 때문에 사용자의 입력을 제한 할 수 있습니다. <!DOCTYPE html> <html> <body> <input type="text" id="input1" placeholder="숫자를 입력해주세요" onKeyUp="removeChar(event);inputNumberFormat(this);" onKeyDown="inputNumberFormat(this);" > <script> //문자 제거 function removeChar(event) { event = event || window.event; var keyID = (event.which) ? event.which : event.keyCode; if (keyID == 8 || keyID == 46 || keyID == 37 || keyID == 39) return; else //숫자와 소수점만 입력가능 event.target.value = event.target.value.replace(/[^-\.0-9]/g, ""); } //콤마 찍기 function comma(obj) { var regx = new RegExp(/(-?\d+)(\d{3})/); var bExists = obj.indexOf(".", 0);//0번째부터 .을 찾는다. var strArr = obj.split('.'); while (regx.test(strArr[0])) {//문자열에 정규식 특수문자가 포함되어 있는지 체크 //정수 부분에만 콤마 달기 strArr[0] = strArr[0].replace(regx, "$1,$2");//콤마추가하기 } if…
Read More

블로그만 서버 분리 작업

일상
소규모의 개인 서버를 이용해서 개인 공부도 하고 블로그도 하고 있습니다. 그렇다 보니 가끔 블로그가 속도도 느리고 서버에 이상이 생기면 블로그가 작동을 멈추거나 하는 일이 발생을 하였습니다. 6월이 가기 전에 아마존의 라이트세일을 이용하는 VPS서버중 가장 작은 플랜으로 블로그를 이전 하였습니다. 제 블로그는 그렇게 방문자를 모집하는 블로그가 아니기때문에 가장 작은 플랜을 이용해서 넘치는 작업이 많습니다. 하루에 들어오는 숫자가 많아야 500명이하이고, 그중 방문자는 100명대를 왔다 갔다 하며 그중에서 실제 이용자는 50명 이하라고 판단이 되기 때문에 서버의 자원을 그렇게 필요로 하지 않습니다. 제가 올리는 자료 또한 양질의 자료라고 하기 보다는 짜투리에 가깝기 때문에 많은 정보를 제공하는 블로그가 아니기때문에 방문자를 계속 잡아둘 이유가 없습니다. 그래서 소규모 플랜만으로도 블로그 운영을 할 수 있다고 판단하여서 개발을 하는 서버에서 블로그용만 분리를 하였습니다. 단순하게 커피 한잔값으로 한달을 유지 할 수 있고 서버의 관리는 다른 서버를 하는겸에 겸사겸사 하면은 관리가…
Read More