지인이 필요하다하여 간단하게 제작해 준 프로그램입니다.

다른 필요하신 분이 있으실 듯하여 프로그램을 공개합니다

프로그램을 이용하시려면 닷넷 프레임웍이 있어야 되며, 윈도우 환경에서만 동작합니다.

 

이 프로그램은 여러 이유로 완벽하지 않을 수 있으므로, 결과에 대한 보장은 하지 않으며,

그에 따른 책임은 제가 지지 않습니다.

 

그것에 동의하신다면 무료로 어디든 사용하시면 됩니다.

 

 

단, 이 프로그램을 재판매 목적으로 상업적 이용은 불가능합니다.

 

 

 

다운로드 : 

 


WordCounter.z01

WordCounter.z02

WordCounter.zip


 

한글 형태소 분석기는 아래 라이브러리를 이용하였습니다.

https://github.com/modamoda/TwitterKoreanProcessorCS

 

 

한동안 떠들석하게 했던 그 업데이트입니다.

스펙터의 경우엔  Bios업데이트로 해결을, 멜트다운 문제는 윈도우 업데이트로 해결이 가능합니다.


메인PC의 경우 업그레이드 한지 얼마 안되어서 그런지, bios업데이트가 있었지만, 구형 PC에는 bios가 아직

나오지 않았더군요. 둘다 기가바이트꺼 인데 ㅠ.ㅠ


https://www.ashampoo.com/en/usd/pin/1304/security-software/spectre-meltdown-cpu-checker


위 링크에서 제공해주는 툴로 쉽게 확인이 가능합니다.


메인PC. 모두 업데이트해서 잘 됬다고 나오고요.






* 기가바이트 메인보드의 경우, 최신 바이오스 파일을 다운로드 받으신 후, USB저장매체등에 복사를 해두고,

재부팅 한 후, F8키를 누르면 바이오스 업데이모드로 진입합니다.

스펙터 해결을 위한 바이오스 업데이트.


서브컴.. 


윈도우7의 경우 업데이트시에는 아래와 같이 나타날 수 있습니다.

Windows Management Framework version5가 필요하다고 하여 업데이트를 해줘야 할 수도 있습니다.






해당하는 윈도우 버전을 체크하여 다운로드 받은 후 설치하면 그 이후에야 멜트다운 관련 업데이트를 진행할 수 있습니다.




이후 윈도우즈에 업데이트 항목에서 보안업데이트를 진행합니다.






바이오스 업데이트가 지원되지 않아 여전히 스펙터에 취약한 서브 컴 ㅠ.ㅠ

본체에서 탈착 할 수 있는 조이콘으로 닌텐도 스위치의 마리오 카트는 2인용을 바로 즐길 수 있습니다.

주말에 애들 게임시켜주면 서로 할려고 난리인데, 조이콘 하나씩 안겨주고 대결하라고 하니

딱이더군요.


처음에 설정하는 법을 몰라 좀 헤맸는데, 이것도 간단합니다.

마리오카트 중에, 패드를 분리하면, 아래와 같은 화면이 나옵니다.




왼쪽을 먼저 분리해 보았습니다.









중간에 좀 작은 화면으로 안내 화면이 보입니다.

패드에  SL키와 SR키를 누르면 분리해서 설정이 가능합니다.









SL키 와 SR키는 아래 화면에 빨간색 박스로 표시된 부분입니다.



역시 같은 방법으로 오른쪽 조이콘도 분리하여 설정하면 됩니다.




설정이 완료되면 버튼 4개중 오른쪽 버튼을 누름니다.






아래처럼 2인 플레이가 가능합니다.


코드를 예쁘게 보이게 하기위해 Syntax highlighting을 붙혔습니다.


적용하는 방법은 아래 링크를 참고하시면 됩니다.

http://mclass.tistory.com/54



그런데, 어떤 소스코드를 붙히니까 자꾸 </t>가 붙더군요.

첨에 왜 그러지..했는지 확인해보니. HTML모드를 하고서는 소스코드 내용에 '<' '>' 문자가 문제였더군요.

HTML모드에서는 < > 문자는 태그로 인식되어서 그랬던 것이었습니다.


해서 강제로 < 는 &lt;   > 는 &gt; 로 바꾸고 등록했습니다.

&는 &amp; , 빈공백은 &nbsp;로 해줘야겠지만 그러한 문자는 없어서 패스했습니다.



즉 태그 내용 등록시 아래처럼 말이죠.



<pre class="brush: csharp">

using System.ComponentModel;


namespace RxTestWinForm

{

    public static class ControlExtension

    {

        /// &lt;summary&gt;

        /// T Type의 Delegate  선언

        /// &lt;/summary&gt;

        /// &lt;typeparam name="T"&gt;T타입&lt;/typeparam&gt;

        /// &lt;param name="obj"&gt;Invoke 할 컨트롤 &lt;/param&gt;

public delegate void RunOnUIThreadDelegate&lt;T&gt;(T obj) where T : ISynchronizeInvoke;

        /// &lt;summary&gt;

        /// ISynchoronizeInvoke 인터페이스 구현체 대한 RunOnUIThread확장 메소드

        /// &lt;/summary&gt;

        /// &lt;typeparam name="T"&gt;T타입, 캐스팅을 피하기 위해 사용&lt;/typeparam&gt;

        /// &lt;param name="obj"&gt;메소드 확장할 컨트롤&lt;/param&gt;

        /// &lt;param name="action"&gt;수행할 Action&lt;/param&gt;

        public static void RunOnUIThread&lt;T&gt;(this T obj, RunOnUIThreadDelegate&lt;T&gt; action)

            where T : ISynchronizeInvoke

        {

            if (obj.InvokeRequired)

            {

                obj.Invoke(action, new object[] { obj });

            }

            else

            {

                action(obj);

            }

        }

    }

}

</pre>





그런데 이렇게 안하고, 그냥, 아래 코드로 먼저 HTML 에서 입력하고 난 뒤,


<pre class="brush: csharp">

</pre>


에디트 모드로 돌아가면 회색 사각형이 보이는데, 거기서 그냥 코드 입력하면, 굳이 위에 처럼 귀찮게 문자 바꾸지 않고도

잘 등록이 되더군요.



위 화면에서 바로 코드를 입력하면 됩니다.


윈폼 컨트롤 사용시 타 쓰레드에서 컨트롤 변경호출시 컨트롤의 InvokeRequired 확인하고 처리하는 코드가 너저분해지기 마련입니다.

이런 류 코드는 많이 쓰일 것 같은데... 



간단히 이렇게도 가능하지만, 

   textBox1.Invoke( new Action (() => { textBox1.Text = count.ToString(); } ));



좀 더 효율적으로 동작하기 위한 방법들을 찾아보았습니다.
아래 링크에 좋은 의견들이 많았습니다.
그 중 깔끔하게 사용하는 방법을 옮겨 포스팅합니다.




WinForm.cs (아래처럼 활용하시면 됩니다.)
-----------------------------------------------------------
//메인쓰레드가 아닌 다른 쓰레드에서 UI 변경 호출시
label1.RunOnUIThread(control =>
{

     control.Text = $"{progressCount}/{totalCount}";;

});





다음 확장메소드를 선언합니다.


ControlExtension.cs

----------------------------------------------------------------------------


using System.ComponentModel;

namespace RxTestWinForm
{
    public static class ControlExtension
    {
        /// <summary>
        /// T Type의 Delegate  선언
        /// </summary>
        /// <typeparam name="T">T타입</typeparam>
        /// <param name="obj">Invoke 할 컨트롤 </param>
	public delegate void RunOnUIThreadDelegate<T>(T obj) where T : ISynchronizeInvoke;
        /// <summary>
        /// ISynchoronizeInvoke 인터페이스 구현체 대한 RunOnUIThread확장 메소드
        /// </summary>
        /// <typeparam name="T">T타입, 캐스팅을 피하기 위해 사용</typeparam>
        /// <param name="obj">메소드 확장할 컨트롤</param>
        /// <param name="action">수행할 Action</param>
        public static void RunOnUIThread<T>(this T obj, RunOnUIThreadDelegate<T> action)
            where T : ISynchronizeInvoke
        {
            if (obj.InvokeRequired)
            {
                obj.Invoke(action, new object[] { obj });
            }
            else
            {
                action(obj);
            }
        }
    }
}








'C#' 카테고리의 다른 글

WPF MVVM 샘플코드  (0) 2018.05.28
doxygen 설치 및 설정  (0) 2018.05.14
간단한 한글 단어 세기 프로그램 공개  (6) 2018.03.02
IIS7 환경에서 WEBAPI 프로젝트 구동 오류시  (0) 2017.11.17
닷넷으로 CNTK 돌려보기  (0) 2017.10.24

닌텐도 스위치가 한국에서 정식 발매된지도 벌써 한달 반정도 된 것 같습니다.

wiiU를 건너띄고 발매되어 더욱 기대를 많이 하게 되었는데요.


기본 조이콘의 그립감이 똥망이라, 프로콘을 구입하는 유저들도 많은 것 같습니다.


프로콘이 USB-C타입으로 연결되는데, PC에서도 잘 안식되고 좋더군요.

PC에서 무선 블루투스로 연결이 가능해 에뮬레이터등에서도 이용이 가능합니다.


근데 PC에서 블루투스 설정 후, 다시 닌텐도 스위치에 연결하려니까 잘 안되더군요.


해서 해결한 방법을 좀 남겨두려합니다.


방법은 본체랑 패드를 USB로 연결하면 자동으로 인식됩니다. (참 쉽죠;;;)


그런데 패드 및 본체모두 USB-C타입 작은모양이라 케이블이 없으면 연결이 불가능합니다.


다행히 독에 일반 USB 잭이 있습니다. 이쪽으로 연결하시면 됩니다.





본체화면에서 설정화면 들어가기.

메뉴에서 Controllers를 들어갑니다.

Find Controllers 메뉴를 선택합니다.

연결을 확인합니다.







다시 재밌게 즐기시면 됩니다.



애플 앱스토어의 리젝은 워낙 유명하기 때문에, 애플 리젝은 원,투 당해도 멘탈에 타격이 거의 없습니다만, 플레이스토어에서는 앱스토어보다 상대적으로 승인 요건이 덜 빡빡하기 때문에, 리젝당하면 역으로 받는 멘탈 충격이 큽니다.


그렇기 때문에, 최소한 앱을 개발한다면, 이러이러한 이유때문에 리젝될수 있다는 정도는 확인해두고 첨부터 기획을 하는게 좋을것 같습니다.

아래 개발자 정책센터의 내용을 꼭 한번은 일독할 필요가 있습니다.


https://play.google.com/intl/ko/about/developer-content-policy/#!?modal_active=none







참 힘든게 구글에서 딱 찝어서 뭐가 문제다라고 알려주지도 않습니다. 정책보고 이 분류에 대해서 위반했으니 확인하라 정도입니다.

웹앱의 경우 좀 조심해야할 것 같습니다. 실제 도메인의 소유자인지를 입증해야합니다. 또한 스크린샷이나 앱에다가 타사의 로고를 절대로 넣지 않도록합니다. 

제휴관계라면 제휴했다는 입증서류를 제출해야합니다. 별로 중요한게 아니라면 차라리 TEXT로 대체하는 것이 좋습니다.


다음카카오에 다니는 게임 퍼블리싱 관련일을 하는 친구녀석에 말로는, 앱에 유명캐릭터(예, 원피스)가 표시될 경우 설사 반다이남코사랑 제휴했더라도. 구글쪽에 별도의 입증서류가 들어가지 않으면 무조건 리젝이랍니다. 주의해야겠습니다.


복원을 위한 이의제기를 통해, 제휴 관련 서류, 사업자등록증등을 제출하여 해결을 할 수 있습니다. 이번 경우에는 관련 서류를 제출하여, 정지상태에서 삭제 상태로 (복원?)처리되었으며, 설명에 해당 로고등을 빼고 재 심사 신청을 하여 무사히 등록할 수 있었습니다.


확실히 영업시간기준 72내에 처리를 해주는군요.

'앱개발' 카테고리의 다른 글

PouchDB에 관해서...  (0) 2019.02.22
예쁜 패턴 만들어주는 사이트  (0) 2018.09.28
GPG 1~8권 목차  (0) 2018.07.17
카카오 챗봇 NGINX+PHP 서버 구성  (0) 2017.11.28
앱이 설치되지 않았습니다. 디버그하기.  (0) 2017.11.19

카카오챗봇기능을 통해 간단하게 챗에 응답하는 챗봇을 제작할 수 있습니다.





기본적인 구성방법은 아래 링크를 참조하시면됩니다.

http://kjcoder.tistory.com/505


위 링크는 서버가 C#기준으로 되어있기 때문에 PHP로 구성하는 방법을 알려드립니다.


 운영 환경 

PHP 5.6 / NGINX 12.2 

 디렉토리

 [웹루트]/index.php





NGINX와 PHP-FPM 구성은 생략합니다. 

https://launchdog.wordpress.com/2016/04/22/centos7-nginx-php7-mariadb-%EC%84%A4%EC%B9%98-1/


위 링크에 설명을 잘해 놓았으니 참고하도록합니다. 

위 링크는 PHP7기준입니다. 참고로 저는 호환성을 위해 PHP5.6을 선택하였습니다.



kakao 챗봇 서비스를 위한 nginx 서버 설정

콘피그파일에 아래와 같이 구성합니다. (/etc/nginx/conf.d/default.conf 수정)


   location ~ /kakao   {

        try_files $uri $uri/ /index.php?/$request_uri;

    }



카카오에서 요청되는 주소는 http://[도메인]/kakao/keyboard 형식으로 호출되도록하기위해 위와 같이 구성합니다.

실제 실행파일은 웹루트/index.php 입니다. 

route를 rewrite시키는 효과를 냅니다.





참고로 PHP 스크립트 설정은 아래와 같이 하였습니다.(php-fpm/nginx 설정시 미리 하기도 합니다.)



  location ~ \.php$ {

        root           /var/www/html;

        fastcgi_pass   127.0.0.1:9000;

        fastcgi_index  index.php;

        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

        include        fastcgi_params;

    }





    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

    #

    location ~ \.php/([a-zA-Z0-9_]+)/([0-9]+)$ {

        root           /var/www/html;

        fastcgi_pass   127.0.0.1:9000;

        fastcgi_index  index.php;

        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

        include        fastcgi_params;

    }



static 파일 서비스는 아래와 같구요..

    location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
        expires 12M;
        access_log off;
        add_header Cache-Control "public";
    }

    location ~* \.(?:css|js)$ {
        expires 1y;
        access_log off;
        add_header Cache-Control "public";
    }



그 다음 index.php 파일 내용입니다.

단촐합니다.



<?php

header('Content-Type: application/json');

$uri = $_SERVER["REQUEST_URI"];


if($uri=='/kakao/keyboard') {

//if(!is_kakao_server()) return; #호출 서버가 카카오서버가 아니면 실행안되도록 함.

$data = array();

$data['type'] = 'text';

echo json_encode($data);

return;

}


if($uri=='/kakao/message') {

//if(!is_kakao_server()) return;  #호출 서버가 카카오서버가 아니면 실행안되도록 함.

$postdata = file_get_contents("php://input");

$message = json_decode($postdata);

//$message->content

//$message->user_key

//$message->type  

// 위 변수로 접근 가능하다. 적절하게 처리.


###  적절한 처리..


$data = array('message'=>array('text'=>'잘 처리되었어요.~등등등'));   //메시지 응답을 한다.

echo json_encode($data);

return;

}



#끝~

아 참고로 is_kakao_server()는 카카오서버의 요청만 처리하도록 확인하는 함수입니다.

function is_kakao_server()
{
$kakao_server = array('110.76.143.234','110.76.143.235','110.76.143.236');
return in_array($_SERVER['REMOTE_ADDR'], $kakao_server);
}

요렇게 구성하시면 됩니다.




+ Recent posts