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





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

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);
}

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




개발시, 오류수정은, 오류를 찾는것이 90%요. 나머지 고치는것이 10%입니다.

로그는 한 줄기의 빛...!


안드로이드 앱 개발시 APK패키징 이후, APK 수동 배포시 알 수 없게도. 아래와 같이 오류메시지를 뱉고는 더이상 진행 불가했습니다.



이렇게 될 경우, 안드로이드 스튜디오와 같은 개발툴에 연결된 상태도 아니기 때문에 딱히 왜 그런지에 대한 이유도 얻기 힘듭니다.

구글링 해보니, manifest 파일이 잘 못되었거나, 패키지명이 잘못되었거나. 지웠던파일이 지워지지 않고 남아있었다. 라던가.. 

다양한 이유가 있다고합니다.

저의 경우는 모두 아니였습니다.


결론 부터 이야기하자면, 제 경우는 앱 패키징할 때, 

아래와 사이닝 옵션창에서 V2만 체크되어서 그러한 문제가 발생했던 것이었습니다.


V1, V2모두 체크해야 한다.

V1, V2모두 체크해야 한다.


안드로이드 7.0에서는 APK설치시 문제없었으나, 6.0에서 설치시 말썽을 일으키더군요.

아래는 Gradle 빌드 설정 정보입니다.




build.gradle 파일 내용 -------------


android {
compileSdkVersion 27
buildToolsVersion "27.0.0"
defaultConfig {
applicationId "com.myapp"
minSdkVersion 17
targetSdkVersion 27
versionCode 1
versionName "1.0"
vectorDrawables.useSupportLibrary = true
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
ext {
supportLibraryVersion = '27.0.0'
playServicesVersion = '11.0.4'
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}

# 이하 중략 #

2017.11.19 기준.최신 SDK입니다.



포스팅 하려는 이유는 이 같은 문제로만 한정하지 않고, 설치 오류가 보다 더 다양한 문제가 있을 수 있다고 생각이 들었습니다.

그 경우, 원인을 찾아야 해결 할 수 있으므로 원인 찾는 법에 대해서 이야기하고자 합니다.


우선 테스트 기기를 PC에 꽂아 주고, CMD창에서 adb shell logcat 명령어로 기기의 상태를 볼 수 있습니다.

물론 Android SDK가 path 걸려 있어야지요.

거기다가 필터를 걸어 볼 수 있는데 대략 이런 식입니다.

adb shell logcat [보고자하는TAG:디버그이상은 D, (E,I,W.등등)] *:S    #*:S 를 넣어줘야 그외는 다 제외시켜주고 보여줍니다.


자세한 설명은 https://developer.android.com/studio/command-line/logcat.html?hl=ko 에 있습니다.

설치와 관련된 경우 PackageManager 태그를 통해 정보를 보여주니까 이렇게 필터를 걸면 되겠습니다.





아래는 필터를 걸지 않고 그냥 봤는데, 아무튼 설치오류와 관련된 정보를 알 수 있었습니다.


재미있는 것이. 어찌 E(Error) 표시가 아니고 W(Warning)으로 표시됩니다.


오류메시지를 확인했으니, 해결방법은 금방 찾죠.

https://stackoverflow.com/questions/44386464/android-app-installation-failed-package-com-my-app-has-no-certificates-at-entry



두어번 했는데도, 과정이 나한테는 너무 복잡하고 한방에 잘 되지 않아서, 트러블 슈팅했던 것들은 남겨주고자한다.

opendkim까지 잘 설정해야 지메일에서 스팸으로 안빠지고 메일이 잘 도착한다.





확인사항,


1.도메인 TXT에는

v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7L41itYZtbf9aAUNFVhau17jg6LnPKWFCj8inG13jgj0bLULd31y7qjtN8YddnUzZqN+dtDoXKg/c2t1Wq6HQFi6I7DNv1ipJOmAPbs05zRwprXClgb/aj2bzhHUm5NzCNwsyvRT8CSLagH2FpSNMXIKVTCIeKdLhkzAAt68j2QIDAQAB

형식으로 입력하면 된다.


2. opendkim 파일에 수정할 것 좀 있다.

특히 Mode    v --> sv로 바꾸고

나머지 설명은 아래 링크 참조해서 읽어서 잘 확인한다.


3. 에러는 /var/log/maillog 에 보이므로,  tail -f 해서 보도록 하자. 에러로그를 봐야 원인을 알 수 있다. 권한문제등등.


4. 메일서버 호스트를 굳이 mail.domain.com 형식으로 할필요는 없다.

호스트이름도 domain.com으로 다 통일해서 설정하였다.


5. socket형식으로 해서는 제대로 되지 않았다.

opendkim.conf  설정


/etc/postfix/main.cf

smtpd_milters           = inet:localhost:12301



6. 보내는 메일주소 맞추기

/etc/postfix/main.cf 파일 수정


smtpd_milters           = inet:localhost:12301

# mtpd_milters           =  /var/run/opendkim/opendkim.sock

non_smtpd_milters       = $smtpd_milters

milter_default_action   = accept

milter_protocol         = 2

virtual_alias_maps = hash:/etc/postfix/virtual


vi /etc/postfix/virtual 

p@domain    user2031

형식으로 작성하고난뒤


sudo postmap /etc/postfix/virtual

service postfix restart #centos 6.6 


한다. 이걸해야 p@domain 으로 서버에서 메일을 보낼 수있다.






메일의 원본내용을 봤을때 DKIM이 PASS가 떠야한다!








참고.

https://takeshiyako.blogspot.kr/2016/01/spf-dkim-postfix-centos.html

https://kr.minibrary.com/278/

https://serverfault.com/questions/640316/milter-service-needs-transportendpoint-instead-of-var-run-opendkim-opendkim-s

개발환경 : windows10 pro 64bit / Visual Studio 2015 Community / .net 4.7 / WebApi

운영환경 : windows7 pro 64bit / IIS 7


환경셋팅하고 게시하니 아래와 같은 오류가 났다.

'/' 응용 프로그램에 서버 오류가 있습니다.

파일이나 어셈블리 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 또는 여기에 종속되어 있는 파일이나 어셈블리 중 하나를 로드할 수 없습니다. 액세스가 거부되었습니다.

설명: 현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 발생했습니다. 스택 추적을 검토하여 발생한 오류 및 코드에서 오류가 발생한 위치에 대한 자세한 정보를 확인하십시오. 

예외 정보: System.IO.FileLoadException: 파일이나 어셈블리 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 또는 여기에 종속되어 있는 파일이나 어셈블리 중 하나를 로드할 수 없습니다. 액세스가 거부되었습니다.

소스 오류: 

현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 생성되었습니다. 아래의 예외 스택 추적을 사용하여 예외의 원인 및 위치 정보를 확인할 수 있습니다.


어셈블리 로드 추적: 다음 정보는 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 어셈블리를 로드할 수 없는 이유를 알아내는 데 도움이 됩니다.

경고: 어셈블리 바인딩 로깅이 꺼져 있습니다.
어셈블리 바인딩 오류 로깅 기능을 사용하려면 레지스트리 값 [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD)를 1로 설정하십시오.
참고: 어셈블리 바인딩 오류 로깅 기능을 사용하도록 설정하면 그렇지 않은 경우보다 성능이 약간 떨어집니다.
이 기능을 끄려면 레지스트리 값 [HKLM\Software\Microsoft\Fusion!EnableLog]를 제거하십시오.


스택 추적: 

[FileLoadException: 파일이나 어셈블리 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 또는 여기에 종속되어 있는 파일이나 어셈블리 중 하나를 로드할 수 없습니다. 액세스가 거부되었습니다.]
   System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMarkHandle stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName, ObjectHandleOnStack type) +0
   System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName) +95
   System.RuntimeType.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark) +53
   System.Type.GetType(String typeName) +42
   System.CodeDom.Compiler.CompilerInfo.get_IsCodeDomProviderTypeValid() +14
   System.Web.Compilation.CompilationUtil.GetRecompilationHash(CompilationSection ps) +2528
   System.Web.Configuration.CompilationSection.get_RecompilationHash() +109
   System.Web.Compilation.BuildManager.CheckTopLevelFilesUpToDateInternal(Int64 cachedHash) +526
   System.Web.Compilation.BuildManager.CheckTopLevelFilesUpToDate(Int64 cachedHash) +57
   System.Web.Compilation.BuildManager.ExecutePreAppStart() +148
   System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +878

[HttpException (0x80004005): 파일이나 어셈블리 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 또는 여기에 종속되어 있는 파일이나 어셈블리 중 하나를 로드할 수 없습니다. 액세스가 거부되었습니다.]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +525
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +124
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +700



버전 정보: Microsoft .NET Framework 버전:4.0.30319; ASP.NET 버전:4.7.2117.0




해결:

원인은 Visual Studio 기본 프로젝트 템플릿의 문제. 운영환경 설정에서는 로슬린 컴파일러가 설정안되서 생긴 문제인듯하다.

필요없으니 제거하면된다.


web.config 에서 아래 부분을 주석처리하거나 삭제한다.

  <!--

  <system.codedom>

    <compilers>

      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701"/>

      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>

    </compilers>

  </system.codedom>-->



참고 링크 : https://stackoverflow.com/questions/36338138/file-load-exception-microsoft-codedom-providers-dotnetcompilerplatform




그다음 또 아래와 같은 오류가 났다.

'/' 응용 프로그램에 서버 오류가 있습니다.

'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 어셈블리에서 'System.ServiceModel.Activation.HttpModule' 형식을 로드할 수 없습니다.

설명: 현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 발생했습니다. 스택 추적을 검토하여 발생한 오류 및 코드에서 오류가 발생한 위치에 대한 자세한 정보를 확인하십시오. 

예외 정보: System.TypeLoadException: 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 어셈블리에서 'System.ServiceModel.Activation.HttpModule' 형식을 로드할 수 없습니다.

소스 오류: 

현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 생성되었습니다. 아래의 예외 스택 추적을 사용하여 예외의 원인 및 위치 정보를 확인할 수 있습니다.


스택 추적: 

[TypeLoadException: 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 어셈블리에서 'System.ServiceModel.Activation.HttpModule' 형식을 로드할 수 없습니다.]
   System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMarkHandle stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName, ObjectHandleOnStack type) +0
   System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName) +95
   System.RuntimeType.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark) +53
   System.Type.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase) +44
   System.Web.Compilation.BuildManager.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase) +61
   System.Web.Configuration.ConfigUtil.GetType(String typeName, String propertyName, ConfigurationElement configElement, XmlNode node, Boolean checkAptcaBit, Boolean ignoreCase) +49

[ConfigurationErrorsException: 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 어셈블리에서 'System.ServiceModel.Activation.HttpModule' 형식을 로드할 수 없습니다.]
   System.Web.Configuration.ConfigUtil.GetType(String typeName, String propertyName, ConfigurationElement configElement, XmlNode node, Boolean checkAptcaBit, Boolean ignoreCase) +558
   System.Web.Configuration.ConfigUtil.GetType(String typeName, String propertyName, ConfigurationElement configElement, Boolean checkAptcaBit) +30
   System.Web.Configuration.Common.ModulesEntry.SecureGetType(String typeName, String propertyName, ConfigurationElement configElement) +57
   System.Web.Configuration.Common.ModulesEntry..ctor(String name, String typeName, String propertyName, ConfigurationElement configElement) +54
   System.Web.HttpApplication.BuildIntegratedModuleCollection(List`1 moduleList) +191
   System.Web.HttpApplication.GetModuleCollection(IntPtr appContext) +1086
   System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +123
   System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +169
   System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +396
   System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +333

[HttpException (0x80004005): 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 어셈블리에서 'System.ServiceModel.Activation.HttpModule' 형식을 로드할 수 없습니다.]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +525
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +124
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +700



버전 정보: Microsoft .NET Framework 버전:4.0.30319; ASP.NET 버전:4.7.2117.0



이건 iis 재설정해줘야한다. 왜그런지는 몰겠고. 닷넷하고 iis 설정해보면 고질적으로 나타나는 문제다.(요즘은 잘모르겠다만 윈7환경때까진 진짜 많이 나왔다.)


우선 CMD창에서 아래 디렉토리로 이동한다.


cd %windir%\Microsoft.NET\Framework\v4.0.30319

64비트 환경인경우 아래다.

cd %windir%\Microsoft.NET\Framework64\v4.0.30319 

디렉토리를 이동하였으면 아래명령어를 쳐주면..된다.

aspnet_regiis.exe /iru






참고링크:

https://support.microsoft.com/ko-kr/help/2015129/error-message-after-you-install-the--net-framework-4-0-could-not-load


CNTK 돌릴때 파이썬이 꼭 있어야 되는줄 알았는데, 그런건 아니였습니다.

다만 훈련용 이미지를 만들때 파이썬이 필요할 뿐이었습니다.

훈련용 이미지가 이미 있다면 파이썬은 필요없습니다.


1.CNTK 관련 파일 몽땅 받기.


아래 링크로 들어가 Clone or download 해서 zip파일을 받습니다. 


https://github.com/Microsoft/CNTK




그리고 적당한 곳에 압축을 풉니다.



2.샘플용 훈련데이터 및 테스트데이터 생성하기.

(이것을 위해 파이썬이 필요합니다. 기본적으로 파이썬이 설치되었다고 가정합니다.(버전은 크게 상관없음, 제 경우엔 2.7))


2-1. 파이썬 라이브러리 설치. 제 경우 아래 라이브러리들이 없어서 오류났습니다. 아래 커맨드로 설치해주었습니다.


pip install numpy

pip install pillow


2-2. 훈련 및 테스트 이미지 생성


아래 디렉토리로 이동하고,(1번에 zip파일 받은 경로)

cd [압축푼경로]\CNTK-master\Examples\Images\DataSets\CIFAR-10\


아래 명령어로  샘플이미지 생성합니다.

python install_cifar10.py


시간이 좀 걸립니다.




3.[압축푼경로]\ \CNTK-master\Examples\TrainingCSharp 경로로 들어가서 솔루션 파일을 열고, 



nuget 복원을 합니다. 현재 기준으로 2.2.0입니다.


프로젝트가 CPU버전, GPU버전있는데 빌드하면 오류납니다.

LgisticRegression.cs파일에서 오류나는데,

메소드가 바뀐듯 합니다.

아래부분을 찾아서,

                trainer.TrainMinibatch(

                    new Dictionary<Variable, Value>() { { featureVariable, features }, { labelVariable, labels } },  false, device);


아래 코드로 바꿔줍니다. false를 인자로 받는 메서드가 사라졌나보네요.

                trainer.TrainMinibatch(

                    new Dictionary<Variable, Value>() { { featureVariable, features }, { labelVariable, labels } },  device);


같은 이유로 에러나는 파일이 하나 더 있는데 위 처럼 false, 를 없애면 정상적으로 빌드됩니다.


이제 Ctrl+F5해서 디버그로 빌드해보면 잘 돌아가는게 보입니다.



GPU버전은 돌려보니 예외오류가 뜨는데, Flower쪽에 이미지가 없다고 뜨네요. 이미지를 더 만들어야지 되는가 보군요.

일단 체크.


이상입니다.

오랜만에 포스팅입니다.

부지런히 포스팅하기가 정말 쉽지 않군요...

 

그동안 라즈베리파이에 SVN서버를 설치해서 소스 관리서버로 잘 사용해오다가 minipc를 새로 셋팅하면서, 자료를 이관하였습니다.

 

이관할때 사용했던 명령어를 기억해두고자 포스팅을 남깁니다.

 

 

 

예시)

기존 소스저장소는

/home/svn/eha

/home/svn/eha-app

/home/svn/eha-win

 

총 3군데가 있었습니다.

 

 

1. 덤프 뜨기

 

우선 기존 라즈베리파이에 접속하여, /home/dump 에 디렉토리를 만들고 각각 저장소를 svn덤프 떴습니다.

덤프뜰때는 전체를 뜰 수도 있고 특정 리비전 이후버전만 덤프 뜰수도 있습니다.

sudo mkdir /home/dump 

svnadmin dump /home/svn/eha > svn.eha.dump

svnadmin dump /home/svn/eha-win > svn.eha-win.dump

svnadmin dump /home/svn/eha-app > svn.eha-app.dump

 

그리고 각 경로에 환경설정파일도 백업합니다. (참고 아래 파일들)

/home/svn/eha/conf/authz, /home/svn/eha/conf/passwd, /home/svn/eha/conf/svnserve.conf

 

참고로 전 사용하는 계정이 저 혼자라 백업하지않고.. 그냥 내용을 다시 입력해버렸습니다 ㅡㅡ;

 

 

 

 

 

 

 

 

 

2. 원격서버로 덤프파일 복사하기

위 화면 처럼 백업이 완료되면, sftp 명렁어로 이관할 새 서버로 접속합니다.

 

 

그리고 아래 FTP 명령어로 원격서버에 파일을 복사할 수 있습니다, sftp명령어를 잘 모르면 help 치면 나옵니다.

 

put [복사하고자하는 파일명]

 

요렇게 업로드가 잘 됩니다.

 

 

 

 

 

 

3. 복사한 파일 반영하기

이제 덤프한 파일을 반영할 차례입니다. 새 minipc로 접속합니다.

우선 신규서버에 svn이 설치안되어있다면 svn 을 설치해야겠죠.

 

sudo apt-get install subversion

 

그리고 저장소를 우선 생성합니다.(편의상 똑같이 했습니다.)

 

sudo svnadmin create /home/svn/eha

sudo svnadmin create /home/svn/eha-win

sudo svnadmin create /home/svn/eha-app

 

 

이제 덤프한 것을 복원합니다. 경로는 각자의 환경에 따라 다르니 유의해주세요.

sudo svnadmin load /home/svn/eha < /home/erith/svn.eha.dump

sudo svnadmin load /home/svn/eha-win < /home/erith/svn.eha-win.dump

sudo svnadmin load /home/svn/eha-app < /home/erith/svn.eha-app.dump

 

잘되고 있습니다.

 

 

 

이제 각 폴더에 authz, passwd 등을 수정합니다.

 

authz 에는

[/]

계정명 = rw  

passwd 에는[users] 섹션에

계정명 = 비밀번호

 

가 추가하였습니다.

 

 

이제 svn 을 시작하고.

svnserve -d -r /home/svn

시스템 재시작시 자동 시작되도록  /etc/rc.local 에도 추가합니다.

sudo vi /etc/rc.local

 

svnserve -d -r /home/svn 

 

 

 

 

 

 

참고로, 윈도우 개발환경에 Tortoise SVN을 사용하신다면, Relocate 메뉴를 이용하면서 쉽게, 연결된 저장소 주소를 바꿀 수 있습니다.

 

 

 

예전에 사용하던 아이폰, 아이패드 30핀 USB 케이블은 문제점이 좀 사용하다보면, 한쪽 끝이 단선이 잘되는 문제가 있었습니다.

단선된 USB케이블을 활용하여 5V USB전원 케이블로 리폼해보았습니다.

(30핀 단자쪽이 단선되어야 이것도 활용할 수 있겠네요. USB단자쪽이 단선되면 리폼하게 어려울 것 같습니다.)



USB 핀 구성을 아래 그림과 같습니다. 빨간색과, 검은색이 전원용도입니다.




케이블은 아래와 같습니다. 다만, 아이폰 케이블의 경우 GND가 약간 밝은 회색이었고, USB VCC는 핑크색에 가까웠습니다.

USB DATA(-)는 흰색이었구요.



연결이 용이 하도록, 기존 케이블을 니퍼로 잘라내고, 점퍼 케이블과 남땜 작업하였습니다.

이대로 사용한다면 합선 될 수도 있기 때문에 절연 작업을 해줘야합니다. 전기테입을 써도 되겠지만, 

테입의 접착제 때문에 찐덕찐덕해지는게 싫어 수축튜브를 사용하였습니다.

점퍼케이블에 맞는 사이즈는 DRS-1.5mm입니다. 쇼핑몰, 알리등에서 여러사이즈를 모아~ 모아서 저렴하게 팔기 때문에..

한꺼번에 셋트로 사는 것도 좋을 듯 합니다.










수축튜브를 넣기 위해 핀헤더를 임시로 제거합니다.

 커터칼등으로 헤더 안에 걸리는 부분을 살짝 들어올려주면 잘 빠집니다.(사진의 화살표 부분)







수축튜브를 넣고...





드라이기로 열을 가하면,






깔끔하게 되었네요.





케이블 테스트를 위한 전체적인 모습입니다.





멀티미터를 이용해 기존에 사용하던 어댑터의 전류를 측정해보았습니다. 

1.19A 정도가 흐르고 있군요.

잘 된 것 같습니다!.




이번에는, 라즈베리 카메라로 유튜브 라이브 방송을 해보도록 하겠습니다.





송출하는 라이브러리는 ffmpeg으로 하도록 하겠습니다. avconv로도 가능한데, 이럴 경우 접속이 끊키는등 몇몇 문제가 있었습니다.

(저의 경우 그랬습니다.)


먼저 ffmpeg을 설치해야 합니다.

소스 리스트파일에 내용을 추가합니다. vi등 에디터로 source.list파일을 수정합니다. 

vi가 불편하신 분은  sudo nano /etc/apt/sources.list 하셔서 nano 에디터로 수정하셔도 됩니다.


sudo vi /etc/apt/sources.list  


그리고 아래 라인을 추가합니다.


deb http://www.deb-multimedia.org jessie main non-free




요런 모습이 될껍니다.





그리고, 아래 명령어로 패키지 정보를 업데이트하면, NO_PUBKEY 어쩌구 공개키관련 오류가 뜹니다.


sudo apt-get update




이런!!



키정보를 넣도록 합니다.


sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 5C808C2B65558117 


그리고, 다시 update합니다.


sudo apt-get update



이제 잘 되었군요.



ffmpeg을 설치합니다.


sudo apt-get install ffmpeg



다행(?)스럽게도 설치가 잘 끝났습니다.





이제 스트리밍하기만 하면 되는데, 유튜브 채널이 필요합니다.


유튜브 로그인 후, 아래 링크로 접속합니다.(가입이 안되어있다면 가입을 해야합니다.)


https://www.youtube.com/dashboard




오른쪽 상단에 아이콘을 눌러, 크리에이터 스튜디오로 들어가도 됩니다.






왼쪽에 실시간 스트리밍 메뉴를 누릅니다.


시작하기 버튼을 클릭!






계정인증을 시작합니다. (전화번호당 두개의 관리 계정만 생성이 가능하군요.)





문자 인증코드를 입력합니다.





잘 진행되었다면, 아래 메시지를 볼 수 있을 것입니다.






메인화면이 나타날텐데, 아래 인코더 설정부분이 중요합니다. 

아래 스크린 샷 이미지에 화살표가 가르키는 "스트림 이름 및 키" 부분의 키를 복사합니다. 

설명에도 알 수 있듯이 키는 외부에 공개되지 않도록 주의합니다.



다시 라즈베리화면에서 이 키를 다음 명령어와 함께 입력합니다.


raspivid -o - -t 0 -vf -hf -fps 30 -b 5000000 -w 1280 -h 720 | ffmpeg -re -ar 44100 -ac 2 -acodec pcm_s16le -f s16le -ac 2 -i /dev/zero -f h264 -i - -vcodec copy -acodec aac -ab 128k -g 50 -strict experimental -f flv rtmp://a.rtmp.youtube.com/live2/키를입력



이런식으로 입력이 될껍니다..



영상 프레임이 송출되고 있다는게 보입니다..






유튜브에서도 실시간 스트리밍 중이라고 녹색동그라미가 뜹니다.





테스트 중이라면, 비공개로 설정 해놓고 테스트하는 것도 좋은 방법일 것 같습니다. 설정을 바꾸면 바로 저장이 됩니다.




그 외 방송을 위한 유튜브 옵션이여러가지 있으니 천천히 살펴보시길 바랍니다.




영상 송출중입니다. 방열판 없이 대략 51~52도를 오가는군요.




중지하고싶으시면, Ctrl+C를 누르시면 됩니다.





방송 종료후에, 기본설정으로는 방송 영상이 남아있습니다. 찾아서 필요없으면 삭제하도록 합니다.






* 참고 : https://www.digikey.com/en/maker/blogs/streaming-live-to-youtube-and-facebook-using-raspberry-pi-camera/969a7932d47d42a79ba72c81da4d9b66

+ Recent posts