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

gitlab CE 버전 의 설치 및 Apache2 동시 운영 실패

Linux
sudo apt updatesudo apt dist-upgrade sudo apt-get install curl openssh-server ca-certificates postfixcurl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bashsudo apt updatesudo apt install gitlab-cesudo EXTERNAL_URL="http://git.truds.kr" apt-get install gitlab-ce vi /etc/gitlab/gitlab.rb sudo gitlab-ctl reconfigure dpkg-reconfigure tzdata a2enmod rewritea2enmod headersa2enmod ssla2dismod -f autoindexa2enmod proxya2enmod proxy_http 10 5 * * 1 /usr/bin/letsencrypt renew >> /var/log/le-renew.log15 5 * * 1 /usr/bin/gitlab-ctl restart nginx sudo vi /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml gitlab-ctl restartgitlab-ctl stop ServerName gitlab.truds.krServerSignature OffProxyPreserveHost On <Location /> Order deny,allow Allow from all ProxyPassReverse http://127.0.0.1:8080 ProxyPassReverse http://gitlab.truds.kr/ </Location> RewriteEngine on RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f RewriteRule .* http://127.0.0.1:8080%{REQUEST_URI} [P,QSA] # needed for downloading attachments DocumentRoot /opt/gitlab/embedded/service/gitlab-rails/public 그냥 정보를 알려주기보다는 그냥 기록을 남겨보는 정도 입니다. 명령어를 모아 놓아서 보기도 불편합니다. 하지만 실패도 기록이 되기에 남겨서 추후에 제가 잘못한 부분등이 있다면은 수정을 해서 다시 시도해 보기 위해서 기록을 남깁니다.
Read More

ShellScript로 원격DB 백업 및 로컬DB 복원 하기

Linux
#!/bin/bash LOCALDB={로컬DB명} REMOTEDB={원격DB명} LOCALDBFILE=/home/databaseBackup/sqlFile/$LOCALDB.sql echo "Backup:: $REMOTEDB > $LOCALDB" /usr/bin/mysqldump -h{원격DB서버주소} -P {원격DB서버포트} -u {원격DB사용자} -p"{원격DB사용자비밀번호}" --add-drop-table $REMOTEDB > $LOCALDBFILE LOCALDBFILESIZE=$(wc -c "$LOCALDBFILE" | awk '{print $1}') echo "FileSize: $LOCALDBFILESIZE" #파일이 일정 용량 있상일경우에만 복원을 시도 if [ $LOCALDBFILESIZE -gt 3000 ];then # 원격서버의 Root권한이 %인것을 로컬에서는 localhost로 문자 치환 echo "Strng replace:: $LOCALDBFILE >> $LOCALDBFILE.bk" /usr/bin/cat $LOCALDBFILE | sed 's/DEFINER=`root`@`%`/DEFINER=`root`@`localhost`/g' > $LOCALDBFILE.bk # 문자치환된 파일을 덮어써서 1개로 만듬 echo "File Move:: $LOCALDBFILE.bk >> $LOCALDBFILE" /usr/bin/mv -f $LOCALDBFILE.bk $LOCALDBFILE # 문자치환된 파일 삭제처리 echo "Tmpfile Remove $LOCALDBFILE.bk" /usr/bin/rm -rf $LOCALDBFILE.bk # 로컬 DB에 파일 복구 echo "Restore:: $LOCALDB < $LOCALDBFILE" /usr/bin/mysql -u{로컬DB사용자} -p"{로컬DB사용자비밀번호}" $LOCALDB < $LOCALDBFILE fi
Read More

Windows10 OneDrive 삭제

Windows
OneDrive를 삭제 하게 될경우에는 기본에 동기화 된게 있으면은 동기화를 해제하고 작업을 해야 합니다. 동기화가 이뤄지는 도중에 작업하면은 동기화 항목중에 바탕화면이나 다른것이 있다면은 함께 지워지게 됩으로 꼭 동기화를 해제하고 삭제 처리 해주시기 바랍니다. @echo off cls set x86="%SYSTEMROOT%\System32\OneDriveSetup.exe" set x64="%SYSTEMROOT%\SysWOW64\OneDriveSetup.exe" echo Closing the OneDrive process. echo. taskkill /f /im OneDrive.exe > NUL 2>&1 ping 127.0.0.1 -n 5 > NUL 2>&1 echo Uninstalling OneDrive... echo. if exist %x64% ( %x64% /uninstall ) else ( %x86% /uninstall ) ping 127.0.0.1 -n 5 > NUL 2>&1 echo Removing OneDrive leftovers... echo. rd "%USERPROFILE%\OneDrive" /Q /S > NUL 2>&1 rd "C:\OneDriveTemp" /Q /S > NUL 2>&1 rd "%LOCALAPPDATA%\Microsoft\OneDrive" /Q /S > NUL 2>&1 rd "%PROGRAMDATA%\Microsoft OneDrive" /Q /S > NUL 2>&1 echo Removing OneDrive from the Windows Explorer Side Panel... echo. REG DELETE "HKEY_CLASSES_ROOT\CLSID\{018D5C66-4533-4307-9B53-224DE2ED1FE6}" /f…
Read More

WebView 기능을 이용한 앱 개발중

Android
오랜만에 기술적인 내용이 아닌 일반적인 내용을 작성을 하게 되었습니다. 이번에 새롭게 공부를 시작하면서 Web과 App을 이용한 하이브리드(?) 용으로 App을 개발하게 되었습니다. 아직 시작 단계이지만 순항을 하는중이라고 생각을 합니다. 현재는 안드로이드의 기능중 WebView를 이용해서 순서 Web에 대한 표시를 하고, 웹에 포함된 기능중 일부에 대해서는 App과 사용작용으로 작동하는 기능을 개발중에 있습니다. 해당 기능이 되면은 말 그대로 하이브리드 형식이되지 않을까 싶습니다. 순수하게 웹으로만 작동하는것도 아니고, App만으로도 작동하지 않지만 서로가 상호 보완을 통해서 기능이 작동을 하리라고 생각이 됩니다. 아직 내용을 정리하기에는 부족하고 정리가 미흡하지만 조만간 해당 내용에 대해서 글을 작성하지 않을까 싶습니다. 카테고리를 만들고 나서 예고 차원에서 일단 기술적인 내용이 없는 글을 먼저 작성을 해서 신규 카테고리가 있다는것도 알리고 카테고리의 글을 하나씩 채워 나갈 생각 입니다. 잘하시는 분들이 볼 경우에는 많이 미흡할 수 있지만 이런 내용이 있다는 정도로 제가 정리해서 남기기 위한 글입니다. 이번에…
Read More

PEM 파일을 PPK 파일로 변환후 안될때

Linux
pem 파일을 가지고 ppk 로 변환을 하였는데, 정상적인디 안될때 ppk file의 버전을 3 에서 2로 변경을 하니 정상적으로 ppk 파일을 이용할 수 있었습니다. 정확한 이유는 버전 차이라고 생각이 됩니다. 가끔 PPK파일이 필요하기때문에 미리 미리 만들어서 테스트를 해두면은 나중에 급할때 사용하기에 편리할수 있다는 생각을 합니다. 물론 Key파일에 대해서는 관리를 잘해서 보관을 해야지 유출되면은 바로 접속 권한을 모두 주기 때문에 적절히 잘 관리하여서 처리를 해야 합니다.
Read More

개인 소스 관리를 시작 하였습니다.

프로그램
회사에서는 이미 Gitlab를 통해서 개발코드에 대한 형상관리를 하고 있습니다. 하지만 개인적으로는 그다지 필요가 없다고 생각을 해서 하지 않던것을 이번에 모두 정리해서 등록하는데 꽤 시간을 할애해서 작업을 진행하였습니다. 그래도 개인적으로 연습삼아 한 일에 대해서는 모두 올리려고 하니 너무 많아서 조금 간추리는 작업을 해서 어느정도 남에게 공개한 프로그램들에 한해서만 하는것도 꽤 시간이 걸리는 작업을 하게 되었습니다. 그래도 이제 개인적인 저장소에서 FTP를 통해서 소스 관리하던것을 올리고 나서 보니 여러가지 일을 하였고, 여러가시 소소한것이 많다는 생각을 하였습니다. 시작하고 마무리 하지 않은 일도 계획만 잡아 두거나 혹은 다른 사람의 코드를 연구하기 위해서 만들어 놓은것들이 한둘이 아니라서 정리가 꽤 애를 먹었습니다. 그래도 큰맘 먹고 정리를 하니 디렉토리도 정리가 되고 한결 찾기가 수월해져서 좋은듯 합니다. 그동안에 소스 형상관리를 어느곳에 이용할까 혹은 개인 서버를 만들까 하면서 고민을 많이 하였습니다. 솔직히 오픈소스로 공개할 정도가 되지 않으니 github를 이용하기도 조금…
Read More

기록물

Database
MES 개념도 그냥 관계도를 그려본것입니다. 상세한 자료는 솔직히 인터넷에 공개를 할 수 없어서 이렇게 구분을 해야 하지 않을까 하는 형태로 그려본 것입니다. MES 개발이라는것을 처음해보는것이라서 준비과정이 상당히 많고 어딘가에 참조를 해서 개발을 한다는것이 조금은 시간이 걸리는것 같습니다. 각자 고유의 기능을 포함하고 DATA를 관리하는 방법을 보여주지 않으려고 해서 화면만으로 보고 기능을 개발하는것은 상당히 고역입니다. 하지만 한번에 성공한다고 하기 보다는 실제 DATA를 입력을 하고 진행을 하다 보면은 조금씩 보완이 되고 업데이트가 되면서 조금씩 완성형에 다가가지 않을까 하는 생각을 하게 되기에 초기 자료로서 기록을 남겨 둡니다.
Read More