목차

반응형

유니티에서 네트워크 특히 작업할때 코루틴이 거의 100%쓰인다.

문제상황은

메인 스크립트

A클래스.이미지다운로드 - 이미지 다운로드후 앱에 반영


이런식으로 있을때 메인스크립트에서 단순히 A클래스의 코루틴을 호출하면 

StartCorutine(A클래스.이미지다운로드()); 정말 이해가 안되게도 NullReferenceException 오류를 뿜는다.

별다른 오류와 지시사항이 있는것도 아니고 그냥 해당 함수를 못찾는것처럼 에러가 나온다.

여러가지 방법을 뒤지다가 아래처럼 처리를 하면 된다는 것을 알았다.


A클래스.StartCoroutine(A클래스.이미지다운로드());

차이점은 메인스크립트에서 StartCorutine 앞에 호출하고자 하는 코루틴을 포함하는 클래스를 적어줘야한다는 것이다.

물론 해당 클래스의 인스턴스가 존재해야한다.


위 사항이 몰랐는데 알아두면 개꿀이다

반응형
반응형



Replacing

Regular Expressions supports tagged expressions. This is accomplished using ( and ) to surround the text you want tagged, and then using \1 in the replace string to substitute the first matched text, \2 for the second, etc.

For example:

Text bodySearch stringReplace stringResult
Hi my name is Fredmy name is (.+)my name is not \1Hi my name is not Fred
The quick brown fox jumped over the fat lazy dogbrown (.+) jumped over the (.+)brown \2 jumped over the \1The quick brown fat jumped over the fox lazy dog

에디트플러스로 regex로 편히 수정을 하다보면 키워드를 찾은뒤에 가공이 필요할 때가 있다.

예를들자면

안녕하세요 김정은입니다.

안녕하세요 문재인입니다.

안녕하세요 홍준표입니다.

안녕하세요 닐리리아입니다.


이런상태에서 양식만 조금 바꾸고싶을때가 있을때

안녕 김정은이라고해

안녕 문재인이라고해

...

이렇게 바꾸고 싶을때는 냅두고 싶은 검색키워드를 ()로 감싸서 아래 바꿀 말에서 그룹 순서를 적어서 써먹을 수 있다.



주로 데이터 삽입하는 쿼리문 작성하거나 쿼리문 대량으로 수정할때 써먹을수있음

반응형
반응형

갑자기 회사 네이트온 채팅방을 대상으로 word cloud를 해보고싶어졌다.

word cloud란 

word cloud에 대한 이미지 검색결과

이런식으로 대량의 텍스트에서 가장 자주 쓰이는 텍스트를 추출하여 시각화하는 것을 말한다.

그냥 재미용으로 많이 쓰이기도 하고 발표할때 시선집중용도로도 자주쓰이는것같다.


어쨌든 회사 네이트온 채팅방에서 모든 텍스트를 긁어왔다.

하지만 큰 문제가 있다.


AAA 님의 말(2017/9/21(목) 오전10:00:13) : 

 - 입니다 


XXX 님의 말(2017/9/21(목) 오전10:00:30) : 

 - 넵넵 


XXX 님의 말(2017/9/21(목) 오전10:00:46) : 

 - 감사합니다~ 


이런식으로 ㅁㅁㅁ 님의 말 날짜 필요없지만 계속해서 점유율이 높은 텍스트가 있기때문에 결과가 제대로 나오지 않는다.

저걸 에디트플러스로 간단하게 지워서 처리할거다.

원리는 regex로 특정 텍스트를 찾아내서 지우는 것이지만 regex에대하여 자세하게 설명하지는 않을 것이다.

에디트플러스나 regex로 검색이 가능한 문서도구를 킨다.


이후 Ctrl + H를 눌러서 정규식표현(Regular expression)과 파일 끝에서 검색(Wrap at the end of file)을 체크해준다.

Find 부분에다가는 "[가-힣ㄱ-ㅎㅏ-ㅣ]{3,} 님의 말.*\n - " 따옴표안의 텍스트를 넣어준다.

그리고 검색을 눌러보면

XXX 님의 말(2017/9/21(목) 오전10:00:46) : 

 - 감사합니다~ 

위처럼 입력한 텍스트를 제외한 부분이 선택이 될 것이다.

정삭적으로 인식 되는것을 확인하였으면 Replace with는 비워두고 Repalce All을 눌러 의미있는 텍스트 외에는 전부다 지운다.


결과물을 아래의 wordcloud 사이트에 넣은뒤에 generate 하면 된다.

https://worditout.com/word-cloud/create


regex 참고사이트

http://egloos.zum.com/Cliver/v/2271143

http://blog.edit.kr/entry/%ED%8E%8CJava%EC%97%90%EC%84%9C-%ED%95%9C%EA%B8%80%EC%9D%84-%EC%A0%95%EA%B7%9C%EC%8B%9D%EC%9C%BC%EB%A1%9C-%EC%B0%BE%EA%B8%B0

반응형
반응형

게시판 같은 경우 mysql이나 oracle에서는 rownum을 이용하여 페이징을 쉽게 처리하였으나

몽고db, 몽구스는 해당 기능이 딱히 없는듯 하다.

그래서 아래와 같이 페이징 처리를 해주는 함수를 만들어봤다


필요한 파라미터는 몽구스 find함수의 결과물, pageIndex, pageUnit이다.

pageUnit은 한 페이지에 들어가는 게시물 개수를 뜻하고 pageIndex는 불러올 페이지의 개수를 뜻한다.

만약에 게시판의 맨처음 페이지로 진입하면 pageIndex는 1이어야한다.



bbs.find(query, function (err, result) {
if (err)
return res.end(err);
if (!req.body.pageIndex)
req.body.pageIndex = "";
if (!req.body.pageUnit)
req.body.pageUnit = "";
res.end(JSON.stringify(paging(result, req.body.pageIndex, req.body.pageUnit)));
});




var paging = function (bbs, pageIndex, pageUnit) {

var length = bbs.length;
//bbs -> 게시물 조회결과, pageIndex -> 현재 페이지, pageUnit -> 페이지당 게시물 단위수
if (pageIndex == '' && pageUnit == '')
return bbs;
else {
if (pageIndex > length / pageUnit) {
console.log("error no such page index " + pageIndex + "<=" + length + "/" + pageUnit);
return null;
}
var startIndex = (pageIndex - 1) * pageUnit;
var endIndex = pageIndex * pageUnit;
var data = [];
for (var i = startIndex; i < endIndex; i++) {
data.push(bbs[i]);
}
return data;
}
}


오 근데 인텔리제이 개오지네 그냥 소스복붙만해도 이렇게나옴 

반응형
반응형

Stackoverflow 2017 설문조사 결과(프로그래밍 관련)

개인적으로 주목할만한 정보들을 긁어모았다.


https://insights.stackoverflow.com/survey/2017


Programming Languages : 가장 많이 쓰이는 언어

5년연속 가장 많이 쓰이는 언어로 자바스크립트가 뽑혔다.

또한 sql도 연이어 2등을 차지하였고 자바도 마찬가지

그리고 5년만에 드디어 파이썬이 드디어 PHP를 제쳤다.


저 많은 C# 개발자는 도대체 어딨는걸까 ㅎ긓그

내주변의 팀프로젝트에도 회사에서도 자바 개발자밖에 없다. 역시 C# 커뮤니티를 활동하거나 스터디를 하나 들어야겠다. 





Frameworks, Libraries, and Other Technologies : 가장 많이 쓰이는 프레임워크, 라이브러리, 기타 기술

Nodejs와 AngualrJS가 작년과 더불어 1, 2등을 나란히 차지


사실 이 게시물을 작성하게된 계기는 웹 기반 서비스를 만들기 위해서 어떤 언어와 어떤 프레임워크가 가장 적합할까 찾아봤다.

일단 말나온것으로는 Nodejs에 Angular, react, vue 또는 Java Tomcat에 jsp 요렇게 두개가 있는데 일단 Nodejs 엔진으로 하기로 했다. 그리고 그중에서도 컨트롤러, 뷰단을 뭘로 처리할지 고민하다가 다른사람들은 뭘쓰나 조사하게 된 것이다. 얘기하다보니 Nodejs에 React로 하기로했다.






Databases : 가장 많이 사용하는 DataBase

위의 조사는 올해 처음 한것이라고한다.


역시 소규모 벤처기업이 늘어나다보니 MySQL의 사용빈도가 늘어난 것이 아닐까 싶다.

난 근데 MongoDB가 좋다. 하지만 복잡한 연산이 필요한 경우 MySQL이 더 좋은것같다(아니면 내가 MongoDB 다루는 실력이 안좋아서 그런걸수도...? 나만 그런가?)







Platforms : 가장 많이 사용된 플랫폼

윈도우와 리눅스가 가장 많이 쓰였다.









Languages Over Time : 5년간의 프로그래밍 언어 사용 빈도 변화 추세

c#은 폭삭 앉다가 멈추고 나머지 기성 언어들도 줄어드는 추세

다만 nodejs js는 엄청 상승하는것으로 보임

설문조사에 웹 개발자가 많아서 그런것같기도 하다.







Most Loved, Dreaded, and Wanted : 가장 사랑받는, 피하고싶은, 배우고싶은 언어

가장 사랑받는 언어(앞으로도 계속 사용하고 싶은 언어)



기피언어(일하면서 마주하고 싶지 않은 언어)


배우고 싶은 언어(올해 한번 배워보고 싶은 언어)






Correlated Technologies



반응형
반응형

장편으로 연재할 프로그램이다.

옛날에 어떤학교 외주로 만든 프로그램인데 오래되기도 해서 한번 올려본다.



laser maze에 대한 이미지 검색결과


Laser Maze라고 원래는 특정 조건을 제시해주면 해당 퍼즐을 풀어나가는 혼자 할 수 있는 보드게임이다.

이 보드게임을 프로그램으로 바꾸는 것이 목적이었다.



해당 프로그램을 만드는 과정에 대하여 설명하겠다.

반응형
반응형

효진이는 멀리 뛰기를 연습하고 있습니다. 효진이는 한번에 1칸, 또는 2칸을 뛸 수 있습니다. 칸이 총 4개 있을 때, 효진이는
(1칸, 1칸, 1칸, 1칸)
(1칸, 2칸, 1칸)
(1칸, 1칸, 2칸)
(2칸, 1칸, 1칸)
(2칸, 2칸)
의 5가지 방법으로 맨 끝 칸에 도달할 수 있습니다. 멀리뛰기에 사용될 칸의 수 n이 주어질 때, 효진이가 끝에 도달하는 방법이 몇 가지인지 출력하는 jumpCase 함수를 완성하세요. 예를 들어 4가 입력된다면, 5를 반환해 주면 됩니다.


수학적으로 생각해보았다.



항상 수학적인 깨달음은 그래프화를 하면서 나오기에, 일단 그래프를 그렸다.

위의 식에서 n은 칸의 개수, x는 한칸 움직이는 횟수, y는 두칸 움직이는 횟수다.

2x+y=n이라는 식에서

만약 n이 4이면 x, y는 위 그래프에서 x가 정수인경우의 정의역과 그에 따른 치역을 가진다.

n이 4 => x는 0, 1, 2

y는 4, 2, 0

그리고 각 순서쌍에 대하여 경우의 수를 구하는 식을 만들어내었다.

(n-x)!/{(n-2x)!x!}인데 경우의 수 문제에서 남학생과 여학생 문제를 기억하면 쉽다.

n-x는 총 학생의 수, n-2x는 남학생 수, x는 여학생 수 이렇게 생각하면 식이 나온다.

해당 식을 다른 방법으로 접근하여 점화식 형태로 바꿔서 계산을 해보려고 시도해보았으나 여간 쉽지않아서 위의 형태로 해결하였다.


코딩에서는 알고리즘을 

public static long factorial(long i)
{
if(i>1)
 return i * factorial(i-1);
else if(i==0)
  return 1;
else
  return i;
}
public static long factorial2(long i,long j)
{
if(j<i)
 return i * factorial2(i-1,j);
else
  return 1;
}
 long result=0;
    for(int i=0;i<=num/2;i++)
    {
      result += factorial2(num-i, num-2*i)/factorial(i);
    }
      return result;


위와같이 팩토리얼을 2개의 함수로 나누었다.

그 이유는 사람이라면 169!/167!을 계산할때 당연히 약분하여 169x168이라 순식간에 계산이 되지만 컴퓨터의 팩토리얼 정의를 위의 factorial 함수처럼 하면 169!/167!을 전부다 계산해서 오버플로 에러가 나버린다.

따라서 factorial2라는 함수를 선언하여 2개의 숫자를 입력받아서 약분을 해주는 함수를 넣어서 해결하였다.

반응형

'IT > 알고리즘' 카테고리의 다른 글

문자열 사이에만 쉼표 붙이도록하기  (2) 2019.01.29
3n+1 문제 in C  (0) 2016.12.05
반응형

bizsiren 휴대폰 인증, IPIN 인증 모듈 사용시

PccIpinSecu 또는 PccHpSecu 함수에서 java.lang.StringIndexOutOfBoundsException 에러가 발생한다.



근데 아직도 모르겠는게 일단은 원인 해결해서 넘어갔는데 분명 저런문제가 없었는데 갑자기 어느날부터 저런 에러가 발생했다.



에러 메시지는 아래와 같다.

java.lang.StringIndexOutOfBoundsException: String index out of range: -1

at java.lang.String.substring(String.java:1911) ~[?:1.7.0_151]

at CommonUtil.PccIpinSecu(Util.java:547) ~[classes/:?]


까보니까


retInfo  = sciSecuMg.getDec(retInfo, ReqNum);


int inf1 = retInfo.indexOf("/",0); <===== 요기에서 에러가 난다.

retInfo는 뭐하는놈이냐면 인증 모듈에서 서버측으로 전송하는 암호화된 인증 결과값이다.

getDec는 인증사에서 암호화되어 넘어온 retInfo를 유저 브라우저의 세션에서 저장되어 키값역할을 하는 ReqNum로 복호화를 해야하는데 (SciSecuManager 자바파일이 없어서 자세한건 모름)



서버쪽하고 클라이언트쪽에 얼러트와 sysout을 마구 심어서 살펴본 결과 문제를 찾았다.

세션에서 잘 유지되고 있어야하는 ReqNum이 null이어서 복호화하고나서(애초에 복호화하면 결과값이 ""임 복호화부터 실패한거지만 에러가 안날뿐임) 복호화된 정보를 split할때 인덱스 에러가 나는것이다.



근데 이게또 웃긴게 어떤컴퓨터는 세션에 남고 어떤 컴퓨터는 세션에 안남는게 문제다.

그래서 회사에 전화해봤다.

처음 전화했을때는 친절한 남자분이 받으셨는데 증상을 말씀드리고 서비스 등록정보 말씀드리고 우리꺼를 살펴보시다가

한번 인증 해보라고 하셔서 인증 해봤다.

"음 우리쪽에서는 문제가 없이 잘 처리가 되는 것 같은데요... 좀더 알아보고 연락드리겠습니다..."

예외상황을 처리한다는건 매우 귀찮고 삽질인것을 알기때문에 며칠기다리다가 다시 전화를 드렸다.

아마 연구원? 이신것같은데 어떤 까칠한 여성분께 상담을 받았다.

똑같이 증상을 말씀드렸다. 그러자 "음 근데 그 세션에 reqnum(키값)이 남는건 우리측 문제가 아닌것같음. 님쪽에서 처리해야함" 이러셨다.

흠 그래서 속으로 '조졌네' 이러고 끊으려는데 저쪽에서 reqnum을 랜덤으로 생성해서 세션유지하지말고 그냥 하드코딩해서 박아버리라는것이었다.

유레카 바로 그리했더니 처리됐다 ㅇㅇ 개똑똑하다.


기존 인증 모듈로 넘어가기전 클라이언트 측에서 랜덤 암호키를 생성하는 코드

String randomStrIpin = "";

for (int i = 0; i < numLengthIpin; i++) { //0 ~ 9 랜덤 숫자 생성 randomStrIpin += ranIpin.nextInt(10); } String reqNum = randomStrIpin;

위 라인을 그냥 요렇게 바꿔버리고

String reqNum = "jtowpjgrjgpjephprejohtpoej4towy43t";




서버측에서 세션에 저장된 랜덤으로 생성된 암호키를 불러오는 코드

//쿠키값 가져 오기
Cookie[] cookies = request.getCookies();
String tranjectionName = "";
String tranjectionReqNum = "";
/*if(cookies!=null){
for (int i = 0; i < cookies.length; i++){
Cookie c = cookies[i];
tranjectionName = c.getName();
tranjectionReqNum = c.getValue();
System.out.println("tranjectionName>>>>>"+tranjectionName);
System.out.println("tranjectionReqNum>>>>>"+tranjectionReqNum);
if(tranjectionName.compareTo("reqNumIpin")==0) break;

//tranjectionReqNum = "";
}
}*/
tranjectionReqNum = (String) session.getAttribute("reqNum");


에러나고나서 어떻게든 reqNum값 받아올려고 쿠키도 건들고 세션도 건들고 엄청 노력했음.

근데 그냥

String cookiereqNum = "jtowpjgrjgpjephprejohtpoej4towy43t"; 이러면 인증업체에 보낸 reqNum값과 서버측에서 복호화는 키값이 일치하여서 잘 작동함.

반응형
반응형

참고사이트

https://www.comodossl.co.kr/certificate/ssl-installation-guides/Apache-privatekey-crt.aspx


추가해야하는 내용

openssl csr 생성 하는 방법까지 추가해서 넣기

포트 443 열기

포트 사용중인거 확인하기 443


SSL 서버에 적용하기 메뉴얼


주요 경로

/usr/local/apache-tomcat-6.0.20

/etc/httpd/conf.d

/etc/httpd/conf

/usr/local/apache/conf/extra

/usr/local/apache/conf


순서

1. httpd.conf의 ssl.conf 참조 주석 해제

2. worker 설정

3. ssl.conf 설정

4. 인증서 password 설정

5. 테스트


*항상 수정하는 파일의 원본 파일을 백업해 둘 것*



1. /usr/local/apache/conf/httpd.conf

httpd.conf 파일의 ssl.conf 파일을 참조하도록 주석을 해제해야함.

해당 파일을 찾다보면 위와 같은 라인의 주석을 해제하자 (없으면 주석해제한 코드를 추가)

#Include conf/extra/httpd-ssl.conf



2. 톰캣과 아파치의 연동이 되고 worker 설정이 아래와 같다고 가정하에...

worker.list=worker1

worker.worker1.port=8009

worker.worker1.host=localhost

worker.worker1.type=ajp13

#worker.worker1.lbfactor=11

자세한 내용은 아래 링크 참조

http://kkamagistory.tistory.com/37



3. ssl.conf 설정

LoadModule ssl_module modules/mod_ssl.so

NameVirtualHost *:443

Listen 443


AddType application/x-x509-ca-cert .crt

AddType application/x-pkcs7-crl    .crl

#SSLPassPhraseDialog  builtin

SSLPassPhraseDialog exec:/usr/local/apache/test_ssl/passwd.sh


SSLSessionCache         shmcb:/var/cache/mod_ssl/scache(512000)

SSLSessionCacheTimeout  300


SSLMutex default

SSLRandomSeed startup file:/dev/urandom  512

SSLRandomSeed connect builtin

SSLCryptoDevice builtin


## SSL Virtual Host Context


<VirtualHost *:443>

ServerAdmin root@localhost

ServerName www.test.or.kr

#ServerAlias www.test.or.kr

DocumentRoot /home/test/webapps/ROOT

ErrorLog    /var/log/httpd/ssl-test.or.kr-error_log

TransferLog /var/log/httpd/ssl-test.or.kr_access_log


JkMount /* worker1

JkMount /*.article worker1

JkMount /*.do worker1

JkMount /servlet/* worker1

JkMount /*.jsp worker1


LogLevel error

SSLEngine on

SSLProtocol all -SSLv2


SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW


SSLCertificateFile /usr/local/apache/test_ssl/www_ggtest_or_kr_cert.pem

SSLCertificateKeyFile /usr/local/apache/test_ssl/www.ggtest.or.kr.key

SSLCertificateChainFile /usr/local/apache/test_ssl/ChainCA1.crt

SSLCACertificateFile /usr/local/apache/test_ssl/RootCA.crt


<Files ~ "\.(cgi|shtml|phtml|php3?)$">

    SSLOptions +StdEnvVars

</Files>


SetEnvIf User-Agent ".*MSIE.*" \

nokeepalive ssl-unclean-shutdown \

downgrade-1.0 force-response-1.0


CustomLog logs/gg.or.kr_ssl_request_log \

  "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"


</VirtualHost>



*확인사항*

JkMount뒤의 텍스트에는 워커의 이름이 붙어야한다.

DocumentRoot가 맞는 확인

443포트가 열려있는지 확인

하단의

SSLCertificateFile /usr/local/apache/test_ssl/www_ggtest_or_kr_cert.pem

SSLCertificateKeyFile /usr/local/apache/test_ssl/www.ggtest.or.kr.key

SSLCertificateChainFile /usr/local/apache/test_ssl/ChainCA1.crt

SSLCACertificateFile /usr/local/apache/test_ssl/RootCA.crt

는 인증서 파일이 제대로 위치하였는지 확인



4. 인증서 password 설정

SSLPassPhraseDialog exec:/usr/local/apache/test_ssl/passwd.sh

해당 스크립트는 서버 부팅시 입력해야하는 ssl 인증서의 비밀번호를 자동으로 입력하기 위한 설정이다.


passwd.sh를 까보면...


echo "test4848"


echo 뒤에 비밀번를 넣어주면 된다.

이후 passwd.sh 파일의 권한은 755로 줘야한다.



5. 테스트를 하기 위해서

182.162.27.29가 작업중인 서버의 주소고 ggtest.or.kr이 목표로 하는 주소라면

hosts 파일을 아래와 같은 방식으로 설정한다


182.162.27.29 ggtest.or.kr

182.162.27.29 www.ggtest.or.kr


이후 브라우저로 https://www.ggtest.or.kr 에 접속된다면 성공이다.

반응형

'보안 > SSL' 카테고리의 다른 글

SSL 작업하면서 궁금한 점들  (0) 2018.04.03
반응형

일하고 있는데 담당자들이 어디선가 pagespeed란걸 주워들고와서 '님 우리홈페이지 느린데 이것좀 한번 적용시켜보삼'

요렇게 왔다.


홈페이지를 최적화 시켜주는 사이트인데




우선 홈페이지를 주소를 넣으면 최적화 관련하여 분석을 해준다.(분석안되면 https로도 해보자)



여기는 지금 개발중인 사이트인데 26 안좋게나왔다.

사실 속도가 그렇게 느리지는 않다고 생각한다.



여기는 티스토리 블로그



최적화 항목을 보면 CSS, JS, 이미지 파일 관련해서 개선될 수 있는 방안을 말해준다.

그리고 아래쪽에 보면 개선된 리소스 파일 다운로드 버튼이 있다.





다운로드 받으면 프론트단의 리소스 파일들이 있다.



MANIFEST 파일을 열어보면 어떤 경로에 있는 어떤 파일을 교체해야하는지 나온다.



js, css는 min버전으로바꿔준다.

이미지는 png와 용량을 대폭 줄여준다.


하지만 pagespeed 기능이 쓰이기 힘든 두가지 이유가 있다.

1. 주소 http://ajh322.tistory.com을 집어넣으면 해당 페이지만 분석하고 최적화 해줌 -> 사이트의 페이지별로 주소따서 분석을 다해야함.

2. 최적화된 파일을 그냥 복붙하면 되는게아니라 파일 경로를 하나하나씩 다 찾아가서 바꿔줘야함. -> 노가다


반응형