변수 두개 붙여서 하나의 변수명으로 사용할 경우

프로그래밍/BASH SHELL|2016. 11. 29. 07:57
반응형

# vi test.sh


#!/bin/bash


size[1]="10G"

size[2]="10G"

size[3]="0G"

size[4]="0G"


for ((i=1; i<=4; i++)) ;do

    if [ ${size[$i]} == "0G" ]; then

        echo "no order ($i/4)"

    else

        echo ${size[$i]}

    fi

done 



# sh test.sh




반응형

댓글()

지연 실행 (delay)

프로그래밍/Android (Java)|2016. 11. 14. 08:08
반응형

import android.os.Handler;



                        new Handler().postDelayed(new Runnable() {

                            @Override

                            public void run() {

                                // 이곳에 실행코드 입력

                            }

                        }, 3000);  // 3초 지연후 실행코드 실행



반응형

댓글()

php 로 소켓 프로그램 만들기 (다중 처리, 멀티스레드)

프로그래밍/PHP|2016. 10. 28. 17:17
반응형

- 본 예제는 client 의 연결을 자식 프로세스(thread) 로 구동시켜 여러 client 의 요청을 다중 처리하도록 하는 코드 입니다.

- 본 예제는 client 와 서버가 메세지를 한 번씩 주고 받는 예제 입니다.



1. 서버에서 데몬 생성


# vi server.php


#!/usr/local/php/bin/php -q

<?php

set_time_limit(0);


define("_IP",    "0.0.0.0");    // 접속 허용할 IP. 모든 IP 에 대하여 오픈할 경우 0.0.0.0 으로 설정

define("_PORT",  "81");


$sSock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);


socket_bind($sSock, _IP, _PORT);

socket_listen($sSock);


pcntl_signal(SIGCHLD, SIG_IGN);


while($sock = socket_accept($sSock))

{

    socket_getpeername($sock, $sockIp, $sockPort);

    msg("\nclient connect : ".$sockIp.":".$sockPort."\n");


    $pid = pcntl_fork();

    if($pid == -1)

    {

        msg("fork failed\n");

        exit;

    }

    // 자식 프로세스 일때 

    if($pid == 0)

    {

        $buf = socket_read($sock, 4096);


        // 클라이언트에서 받은 데이타 처리하는 부분

        msg("recive data : ".$buf."\n");    // 클라이언트에게 받은 메세지

        msg("client(".$sockPort.") time data request\n");

        $re = "Complete launching server";    // 클라이언트에게 응답할 메세지

        socket_write($sock, $re);

        msg("client disconnect : ".$sockIp.":".$sockPort."\n");

        socket_close($sock);

        exit;

    }

}


function msg($msg)

{

    echo "SERVER >> ".$msg;

}

?>


실행 권한 부여 및 작성후 데몬 구동


# chmod 700 server.php

# ./server.php &




2. 클라이언트에서 접속 파일 생성


# vi client.php


#!/usr/local/php/bin/php -q

<?php

define("_IP",    "192.168.10.2");    // 접속할 서버 IP

define("_PORT",  "81");                // 접속할 서버 PORT


$sock      = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_connect($sock, _IP, _PORT);

msg("socket connect to "._IP.":"._PORT."\n");


// 서버로 보낼 데이타

$stdin = "time";

socket_write($sock, $stdin);

$sMsg  = socket_read($sock, 4096);


msg("result : ".$sMsg."\n");


socket_close($sock);

exit;


// 로그를 출력합니다. 디버그용

function msg($msg)

{

    echo "CLIENT >> ".$msg;

}

?>




3. 테스트


client 에서 생성한 client.php 파일을 실행합니다.


# ./client.php

# ./client_multi.php

CLIENT >> socket connect to 192.168.30.20:444

CLIENT >> result : Complete launching server


* 참고로 (client 접속 당시) 서버 콘솔에 출력된 메세지 입니다.


# SERVER >> client connect : 192.168.30.40:32966

SERVER >> recive data : time

SERVER >> client(32966) time data request



[참조하여 작성함] http://www.phpschool.com/class/php_multi_socket_server3.html

반응형

댓글()

값이 배열 안에 존재하는지 확인하는 in_array함수

프로그래밍/PHP|2016. 10. 17. 12:28
반응형

<?php 

 $os = array("Mac", "NT", "Irix", "Linux"); 


 if (in_array("NT", $os)) { 

      echo "NT가 존재합니다."; 

 } 

 // 결과: NT가 존재합니다. 


 // 이 함수는 대소문자를 구분하므로 false입니다. 

 if (in_array("mac", $os)) { 

      echo "찾는 문자가 존재합니다."; 

 } 

 // 결과: 

 ?>



[출처] http://habony.tistory.com/82

반응형

댓글()

php 로 소켓 프로그램 만들기 (다중 처리 불가, queue 진행 방식)

프로그래밍/PHP|2016. 10. 14. 13:32
반응형

- 본 예제는 client 의 다중 접속 처리가 되지 않는 1 client 를 위한 코드 입니다.

  동시에 두개의 요청이 들어오게 되면 먼저 들어온 요청 처리 후, 대기 되었던 두번째 요청을 처리하게 됩니다.


- 본 예제는 server 에서 보내주는 메세지를 client 에서 확인하는 예제입니다.




1. 서버에서 데몬 생성


# vi server.php


#!/usr/local/php/bin/php -q    // php 실행 파일

<?php

set_time_limit(0);    // 작업을 마칠때까지 세션을 끊지 않음

define("_IP",    "192.168.10.2");    // 서버 IP

define("_PORT",  "443");                // 서버에서 사용할 PORT


$sSock      = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_bind($sSock, _IP, _PORT);

socket_listen($sSock);

while($cSock = socket_accept($sSock))

{

    socket_getpeername($cSock, $addr, $port);

    echo "SERVER >> client connected $addr:$port \n";

    $date = date("Y/m/d H:i:s");

    socket_write($cSock, $date);

    socket_close($cSock);

    echo "SERVER >> client Close.\n";

}

?>


실행 권한 부여 및 작성후 데몬 구동


# chmod 700 server.php

# ./server.php &




2. 클라이언트에서 접속 파일 생성


# vi client.php


#!/usr/bin/php -q    // php 실행 파일

<?php

set_time_limit(0);    // 작업을 마칠때까지 세션을 끊지 않음

define("_IP",    "192.168.10.2");    // 서버 IP

define("_PORT",  "443");               // 서버에서 사용하는 PORT


$sock      = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_connect($sock, _IP, _PORT);

echo "CLIENT >> socket connect to "._IP.":"._PORT."\n";

$date = socket_read($sock, 4096);

echo "CLIENT >> this time is $date \n";

socket_close($sock);

echo "CLIENT >> socket closed.\n";

?>




3. 테스트


client 에서 생성한 client.php 파일을 실행합니다.


# ./client.php

CLIENT >> socket connect to 192.168.10.2:443

CLIENT >> this time is 2016/10/14 13:27:49 

CLIENT >> socket closed.


* 참고로 (client 접속 당시) 서버 콘솔에 출력된 메세지 입니다.


SERVER >> client connected 192.168.10.3:44450 

SERVER >> client Close.




* 내용 추가


client 에서 server 로 메세지를 보내기 위해서는 각각의 파일에 아래 내용을 추가해줍니다.


# vi client.php


$message="Hero";

socket_write($sock, $message, strlen($message)) or die("Could not send data to server\n"); 


# vi server.php


$input = socket_read($cSock, 4096) or die("Could not read input\n");

echo "$input";


반응형

댓글()

스크립트 실행시 변수 뒤에 \013. 이 붙을 경우

프로그래밍/BASH SHELL|2016. 10. 4. 11:37
반응형

[증상]

프롬프트상에서 명령줄을 직접 입력하면 실행되고,

쉘스크립트를 통해서는 명령이 실행되지 않을때


[원인]

while 사용시 발생하는 부분으로 변수에 줄바꿈(\r) 태그가 포함되어있는지 확인해야 함


[해결]

이렇게 하면 되지 않고

for i in `cat a.txt`


이렇게 해야함

for i in `cat a.txt | tr -d '\r'`



[참고] http://stackoverflow.com/questions/1118058/unix-scripting-trying-to-hosts-getting-013-not-found-3nxdomain

반응형

댓글()

문자열 자르기

프로그래밍/Android (Java)|2015. 12. 14. 08:21
반응형

String url = "http://sysdocu.tistory.com/name.txt";

 

String newurl = url.substring(6);    // http:// 부분 제외하고 newurl 에 다시 입력

 

String protocol = url.substring(0,4);    // 프로토콜만 protocol 에 입력
 

String[] split = newurl.split("/");   // / 를 기준으로 자르기. split[0] : sysdocu.com, split[1] : name.txt

 

String type = split[1].substring(split[1].length() - 3);    // 확장자(.txt)만 type 에 입력

반응형

댓글()

한글 및 공백이 포함된 URL 주소를 UTF-8 로 변환 (urlencode)

프로그래밍/PHP|2015. 12. 10. 10:36
반응형

한글 및 공백이 포함된 URL 주소로 접근하기 위해서는 urlencode 함수를 이용하면 됩니다.

웹문서가 euckr 로 만들어진 경우는 utf-8 로 문자를 변환한 뒤에, urlencode 를 사용해야 합니다.

 

아래 예제 참조..

 

<?
if(mb_detect_encoding($str) != "UTF-8") {
$str = iconv("EUC-KR", "UTF-8", $str);    // 웹문서가 euckr 일 경우 utf-8 로 변환 합니다.
}

$str = urlencode($str);                          // urlencode 로 변환
echo $str;
?>
<form method="post">
<input name="str" type="text">
<input value="submit" type="submit">
</form>


반응형

댓글()

MX플레이어를 띄워 URL 동영상 재생하기 (외부앱 구동)

프로그래밍/Android (Java)|2015. 12. 4. 13:44
반응형

Intent i = new Intent(Intent.ACTION_VIEW);
Uri videoUri = Uri.parse("http://sysdocu.com/movie.mp4");

i.setPackage("com.mxtech.videoplayer.ad");    <- 패키지명으로 외부앱 구동

i.setDataAndType(videoUri, "video/*");
startActivity(i);
 

참고 문서 : https://sites.google.com/site/mxvpen/api

 

=======================================================

 

연속 재생을 갯수에 맞게 하기

 

Parcelable[]uris = new Parcelable[3];    <- 여기 '3' 이 총 길이인데.. 자동으로 하려고 split.length 등과 같이 변수로 넣으려니까 잘 안됌. 나머지는 OK.
for (int j=1; j<split.length; j++) {
uris[j-1] = Uri.parse(split[j] + "");
}

=======================================================

 

연속 재생 (참고용)

import android.os.Parcelable;

 

Intent intent = new Intent(Intent.ACTION_VIEW);
Parcelable[]uris = new Parcelable[]{Uri.parse("http://.../channel0/stream.m3u8"),
Uri.parse( "http://.../channel1/stream.m3u8"),
Uri.parse("http://.../channel2/stream.m3u8"),
Uri.parse("http://.../channel3/stream.m3u8")};

Uri videoUri = Uri.parse("http://.../channel0/stream.m3u8");
intent.setDataAndType( videoUri, "application/x-mpegURL" );
intent.setPackage( "com.mxtech.videoplayer.pro" );
intent.putExtra("video_list", uris);
startActivity( intent );

 

 

위 예제와 같이 처음 URL 이 리스트에 반드시 포함되어 있어야, 순차적으로 재생이 됩니다.

 

[출처] https://groups.google.com/forum/#!topic/mx-videoplayer/FXo3qm-u6zw

 

 

 

 

 

 


반응형

'프로그래밍 > Android (Java)' 카테고리의 다른 글

지연 실행 (delay)  (0) 2016.11.14
문자열 자르기  (0) 2015.12.14
Dialog의 각종 속성들 정리  (0) 2015.12.01
Fragment에서 화면 회전시 강제종료 해결  (0) 2015.11.30
안드로이드 for 문  (0) 2015.11.27

댓글()

Dialog의 각종 속성들 정리

프로그래밍/Android (Java)|2015. 12. 1. 11:38
반응형

Dialog의 각종 속성들 정리 입니다.


1) Back키 눌렀을 경우 Dialog Cancle 여부 설정

 
  mDialog.setCancelable(false); // true : cancle , false : no cancle


2) Dialog 호출시 배경화면이 검정색으로 바뀌는 것 막기 !

 
  mDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);


3) Dialog 밖을 터치 했을 경우 Dialog 사라지게 하기

 
  mDialog.setCanceledOnTouchOutside(true);


4) Dialog 밖의 View를 터치할 수 있게 하기 (다른 View를 터치시 Dialog Dismiss)

 
  mDialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,

             WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
 


5) Dialog 자체 배경을 투명하게 하기

 
  mDialog.getWindow().setBackgroundDrawable

             (new ColorDrawable(android.graphics.Color.TRANSPARENT));
 



6) Dialog Cancle시 Event 받기 

 
  mDialog.setOnCancelListener(OnCancelListener listener) 




7) Dialog Show시 Event 받기 

 
  mDialog.setOnShowListener(OnShowListener listener) 




8) Dialog Dismiss시 Event 받기 

 
  mDialog.setOnDismissListener(OnDismissListener listener) 







예제코드 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package arabiannight.tistory.com.dialogattribute;
 
import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnDismissListener;
import android.content.DialogInterface.OnShowListener;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.widget.Toast;
 
public class MainActivity extends Activity {
 
    private Dialog mDialog = null;
     
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         
        createDialog();
         
    }
     
    public void onClick(View v) {
        switch (v.getId()) {
         
        case R.id.btn_click:
             
            Toast.makeText(MainActivity.this, "Activity Button 입니다.",
                    Toast.LENGTH_SHORT).show();
         
        case R.id.btn_ok:
             
            dismissDialog();
             
            break;
             
        case R.id.btn_cancle:
             
            dismissDialog();
             
            break;
 
        default:
            break;
        }
    }
     
    private void createDialog() {
        final View innerView = getLayoutInflater().inflate(R.layout.dialog, null);
         
        mDialog = new Dialog(this);
        mDialog.setTitle("Title");
        mDialog.setContentView(innerView);
         
        // Back키 눌렀을 경우 Dialog Cancle 여부 설정
        mDialog.setCancelable(true);
         
        // Dialog 생성시 배경화면 어둡게 하지 않기
        mDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
         
        // Dialog 밖을 터치 했을 경우 Dialog 사라지게 하기
//      mDialog.setCanceledOnTouchOutside(true);
         
        // Dialog 밖의 View를 터치할 수 있게 하기 (다른 View를 터치시 Dialog Dismiss)
        mDialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
                WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
         
        // Dialog 자체 배경을 투명하게 하기
//      mDialog.getWindow().setBackgroundDrawable
//              (new ColorDrawable(android.graphics.Color.TRANSPARENT));
         
        // Dialog Cancle시 Event 받기
        mDialog.setOnCancelListener(new OnCancelListener() {
             
            @Override
            public void onCancel(DialogInterface dialog) {
                Toast.makeText(MainActivity.this, "cancle listener",
                        Toast.LENGTH_SHORT).show();
            }
        });
         
        // Dialog Show시 Event 받기
        mDialog.setOnShowListener(new OnShowListener() {
             
            @Override
            public void onShow(DialogInterface dialog) {
                Toast.makeText(MainActivity.this, "show listener",
                        Toast.LENGTH_SHORT).show();
            }
        });
         
        // Dialog Dismiss시 Event 받기
        mDialog.setOnDismissListener(new OnDismissListener() {
             
            @Override
            public void onDismiss(DialogInterface dialog) {
                Toast.makeText(MainActivity.this, "dismiss listener",
                        Toast.LENGTH_SHORT).show();
            }
        });
         
        mDialog.show();
         
    }
     
    private void dismissDialog() {
        if(mDialog != null && mDialog.isShowing()) {
            mDialog.dismiss();
        }
    }
 
}





파일첨부 : 

 TestDialogAttribute.zip



스크린샷 : 




감사합니다.


[출처] http://arabiannight.tistory.com/360


TestDialogAttribute.zip





반응형

댓글()

Fragment에서 화면 회전시 강제종료 해결

프로그래밍/Android (Java)|2015. 11. 30. 13:08
반응형

이 글을 작성하기에 큰 도움을 주신 네타냥(liar1938)님께 감사드립니다!

저번 강좌 

2013/07/29 - [미르의 개발 이야기/어플 개발 강좌] - 안드로이드 탭을 구현해 보자, Fragment

의 문제점을 보면 화면을 회전할경우 어플리케이션이 강제종료된다는 점이었습니다


이번에 네타냥님의 도움으로 이 문제를 해결하게 되어 한번 글을 올려볼까 하는대요 ㅎ

제 글실력이 부족하여 못알아 들으신경우 http://blog.naver.com/liar1938/30173022348으로 가시면 더욱 자세하게 아실수 있으실겁니다 ㅎㅎ


으아아아아아 컴이 렉걸렸어요 ;;


왜 문제가 발생하느냐...

기기의 화면을 전환할때는 onDestroy()와 onCreate()가 호출되면서 바뀐 화면이 화면에 나타납니다

그런대 이때 모든 Activity의 필드, 변수가 초기화 되는대요

화면이 다시 만들어 지면서 강제종료가 발생하는 겁니다


그럼 해결해 봅시다

AndroidManifest.xml에서 모든 Activity부분에

android:configChanges="keyboardHidden|orientation|"

또는

android:configChanges="keyboardHidden|orientation|screenSize"

을 추가해 주세요


만약 안드로이드 3.2 허니콤(APU 13)이상이라면

android:configChanges="keyboardHidden|orientation|screenSize"

을 추가해 주셔야만 합니다


관련 API입니다 (출처: http://developer.android.com/guide/topics/manifest/activity-element.html, http://blog.naver.com/liar1938/30173022348)

직역하자면 target API 버전이 13이상이라면 android:configChanges에 screenSize도 추가해 주라네요..


아오... 제 머리가 안돌아가서 글 인용하겠습니다...


 'android:configChanges' 속성은 화면전환시 자동으로 onDstroy()와 onCreate()를 호출하지 않고 onConfigurationChanged()  메소드 호출하여 내가 원하는 내용으로 환경 설정을 하겠다고 안드로이드에게 알려줍니다. 네, 이렇게되면 Activity를 재생성하지 않아도 되는거죠. ^^ 화면회전이 생길 때, 안드로이드 시스템이 아니라 액티비티 내부에서 직접 이벤트를 관리하게 됩니다. 

 

그런데 orientation 환경 변화는 이해가 가는데 keyboardHidden 값은 왜 주는 걸까요? 

keyboardHidden이란 키보드가 보여지거나 숨겨지는 변경사항인데, 키보드 히든 구성을  

주는 것은 기존에 물리적 키보드가 장착되어 있는 모바일 기기와의 호환성 때문 

입니다. 특정 기기의 경우 키보드를 열면 자동으로 화면이 회전된다고 하더라구요ㅎ 

 

한가지 주의해야 할 것은 android:configChanges 속성이 각 액티비티 마다

하나씩 들어가야 한다는 것입니다. 물런 액티비티가 하나라면 한번만 사용해도 됩니다.
 

매니페스트 파일에 속성을 추가했다면 이제 자바 코드내에서 onConfigurationChanged()

메소드를 작성해야합니다. 이 메소드가 화면 회전시 onCreate() 메소드 대신 호출되게 되는거죠.

 


http://blog.naver.com/liar1938/30173022348


그럼 이제 MainActivity에 아래 메소드를 추가해 줍시다


public void onConfigurationChanged(Configuration newConfig) {

            

        super.onConfigurationChanged(newConfig);


        (이곳에 작업 내용을 적습니다, 생략 가능)

}


만약 화면 전환시 알림을 뜨게 하고 싶다면


if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)

{

// 기기가 가로로 회전할때 할 작업

} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)

{

// 기기가 세로로 회전할때 할 작업

}


이런식으로 작성해 주시면 됩니다



확인결과 잘 작동하는군요 ㅎㅎ

 

[출처] 미르의 IT 정복기 (http://itmir.tistory.com/288)

반응형

댓글()