[펄 (Perl)] 특정 디렉토리 내의 모든 파일 리스트 출력하기


특정 디렉토리 내의 모든 파일 리스트를 재귀적으로(recursive) 출력하는 펄 함수는 다음과 같습니다.


sub process_files

{

    my $path = shift;

    opendir (DIR, $path) or die;


    my @files = map { $path . '/' . $_ } grep { !/^\.{1,2}$/ } readdir (DIR);

    my @result;

    closedir (DIR);


    for (@files)

    {

        if (-d $_) { push @result, process_files ($_); }

        else { push @result, $_; }

    }

    return @result;

}


[펄 (Perl)] 배열에 특정 값이 있는지 검사하기


~~ 연산자를 사용하면 배열에 특정 값이 있는지를 쉽게 검사할 수 있습니다.

단 펄 버전 5.10 ('오 점 일영'이 아니라 '오 점 십' 버전입니다) 이상에서만 사용 가능합니다.

코드는 다음과 같습니다.


#!/usr/bin/perl

use 5.012;

use strict;

use warnings;


my @array;

my $check = 3;


if($check ~~ @array) { say "$check is found!!"; }


물론 위 코드의 경우 @array가 비어있는 배열이므로 "$check is found!!"가 출력되지 않을 것입니다.


[리눅스] 특정 디렉토리 내 파일 개수 보기


ls -l | grep ^- | wc -l


라고 치시면 현재 디렉토리 내에 있는 파일의 개수를 보실 수 있습니다.

[펄 (Perl)] HTML Entity(문자 참조)를 일반 문자로 변환하기


HTML 파일 안에는 HTML Entity라고 불리는(우리말로는 '문자 참조') 구조가 있습니다. 예를 들어 &이라는 문자는 HTML 파일 안에서 &로 씁니다. HTML 파일 안에 &라고 적혀 있으면 웹브라우저가 &라고 표시해주는 것입니다.


문제는 그러한 HTML 파일을 펄에서 바로 읽어버리면 &로 표시되지 않고 &라고 있는 그대로 표시되어버린다는 데에 있습니다. 이를 해결하려면 다음과 같이 하면 됩니다.


#!/usr/bin/perl

use 5.012;

use strict;

use warnings;

use HTML::Entities;


my $test = '&';

say $test; # &라고 출력됩니다.

say decode_entities($test); # &라고 변환되어 출력됩니다.



[펄 (Perl)] 웹사이트 긁어오기


펄을 이용해서 웹사이트를 긁어오려면 LWP::Simple 모듈을 사용하면 됩니다. 코드는 다음과 같습니다.


#!/usr/bin/perl

use 5.012;

use strict;

use warnings;

use LWP::Simple;


my $url = 'http://www.naver.com';

my $webPage = get($url);


if(defined $webPage)

{

    open my $output, '>', 'C:\webpage.html';

    print $output $webPage;

    close $output;

}

else { say "There's no such website!: $url"; }


이렇게 하면 $url 변수에 지정된 웹사이트의 내용을 문자열로 $webPage로 읽어온 뒤 $output 변수에 연결된 파일로 출력하게 됩니다. 만약 웹사이트 주소가 잘못되었다면 오류 메시지가 출력됩니다.


영문이 아닌 문자가 들어있는 웹사이트를 긁어올 경우 Wide character in print at xxx.pl line xx. 라는 경고 메시지가 출력될 수 있습니다. 이것은 오류가 아니라 경고 메시지이며, 이 경우도 정상적으로 파일로 출력됩니다. 하지만 경고 메시지때문에 뭔가 찜찜하다면 binmode $output, ':utf8'; 이라고 한 줄을 더 넣어주시면 됩니다. 아래 코드에 주석으로 강조해 놓았습니다. 엄밀히 말하자면 웹사이트의 인코딩에 따라 근본 문제는 해결되지 않고 오류 메시지만 안 나타나게 되기도 합니다만, 대부분의 경우에는 문제가 없습니다.


#!/usr/bin/perl


use 5.012;

use strict;

use warnings;

use LWP::Simple;


my $url = 'http://www.naver.com';

my $webPage = get($url);


if(defined $webPage)

{

    open my $output, '>', 'C:\webpage.html';

    binmode $output, ':utf8';    # 이부분입니다.

    print $output $webPage;

    close $output;

}

else { say "There's no such website!: $url"; }


[안드로이드] no original dex files found for dex location


개발중이던 앱 소스 코드를 다른 컴퓨터로 옮기자 앱이 갑자기 안 돌아가서 조금 고생을 했습니다. 로그에는 java.io.IOException: No original dex files found for dex location 이 계속 찍히더라고요. 해결방법은 조금 엉뚱하게도 인스턴트 런 기능을 끄는 것이었습니다.


메뉴에서 차례대로 File -> Settings -> Build, Execution, Deployment -> Instant Run 을 찾아가셔서 Enable Instant Run to hot swap code/resource changes on deploy (default enabled) 라고 되어 있는 부분의 체크를 해제하시면 됩니다.


참조: https://stackoverflow.com/a/34784823/1125721

[안드로이드] undefined reference to `cv::imwrite(cv::String const&, cv::_InputArray const&, std::__ndk1::vector<int, std::__ndk1::allocator<int> > const&)'


안드로이드에서 CMake를 사용해서 OpenCV를 사용한 JNI 함수를 만들다 보면 imwrite 부분이 컴파일이 안 되는 경우가 있습니다. 이 때에는 gradle 파일에 다음과 같이 arguments '-DANDROID_STL=gnustl_shared' 을 추가해 주면 됩니다.


android {

    // ...

    defaultConfig {

        // ...

        externalNativeBuild {

            cmake {

                arguments '-DANDROID_STL=gnustl_shared' // needed to enable imwrite                

            }

        }

    }

}


[자바] 배열 내용 출력하기 (Arrays.toString())


자바에서 배열 내용을 출력해보려고 배열 자체에서 toString()을 사용하면 배열의 내용이 아니라 배열의 주소값이 출력됩니다. 배열의 내용을 출력하려면 Arrays.toString()을 사용해야 합니다. 예제 코드는 아래와 같습니다.


double[] values = {1.0, 1.1, 1.2};

System.out.println(values.toString()); // 이렇게 하면 [D@46a49e6 같은 값이 나옵니다.

System.out.println(Arrays.toString(values)); // 이렇게 하면 [1.0, 1.1, 1.2] 이 출력됩니다.


[안드로이드] error: package R does not exist


error: package R does not exist 는 매니페스트 파일에 액티비티를 적어 주지 않았을 때에 발생합니다.

아래와 같은 식으로 AndroidManifest.xml 파일 안에 액티비티를 적어 주셔야 합니다.


<application>

    ...

    <activity android:name=".MyLovelyActivity"></activity>    

</application>


[Git] fatal: The remote end hung up unexpectedly


git push를 했는데 fatal: The remote end hung up unexpectedly 이라는 에러 메시지가 뜰 때가 있습니다. 크기가 1MB 보다 큰 파일이 있을 경우 이 에러가 발생합니다. 이럴 때에는 git 설정에서 개별 파일의 최고 크기를 늘려주면 됩니다. 예를 들어 20MB 짜리 파일이 있다면 20MB = 20 * 1024 * 1024 = 20971520 bytes 이므로,


git config --global http.postBuffer 20971520


이라고 해 준 뒤에 다시 git push를 하시면 됩니다.


( 참고한 사이트: https://confluence.atlassian.com/bitbucketserverkb/git-push-fails-fatal-the-remote-end-hung-up-unexpectedly-779171796.html )

+ Recent posts