고래의 뱃속으로 들어가는 꿈 해몽
 -> 만사가 소원대로 이루어지며, 출세를 하거나 많은 부동산을 소유하게 될 길몽이다.
 
고래가 날아 다니는 꿈 해몽
 -> 자신이나 소속되어 있는 조직이 크게 성공할 징조이다.
 
고래 등에 올라타고 달리는 꿈 해몽
 -> 진행하고 있는 일을 위해 교통수단을 이용하거나, 단체의 지도자가 되어 일을 주도하게 된다.
 
뱃길을 고래가 인도해주는 꿈 해몽
 -> 타인의 조력으로 일을 성사시켜 사업이 크게 번성할 징조가 보인다.
 
큰 고래에게 쫓기는 꿈 해몽
 -> 어느 누구에게 협박당하거나 감시를 받을 수 있다.
 
고래떼가 몰려와 배를 뒤집는 꿈 해몽
 -> 진행중인 일이 위험을 당하거나 실패하게 된다.

 


몰려오는 상어 떼를 본 꿈 해몽
 -> 괴한들이 방해를 놓거나 여러 사람의 시비를 받는다. 

상어떼가 몰려오는 꿈 해몽
 -> 방해자가 있어서 큰 손해를 입거나 시비를 가릴 일이 생긴다.

상어가 다리를 무는 꿈 해몽
 -> 소망하던 일이 이루어지고 권세나 명예를 취득하게 된다.

상어에게 물려 다리가 잘리는 꿈 해몽
 -> 아주 가까운 사람을 잃게 될 조짐이다.
 
상어가 이빨을 드러내고 있는 꿈 해몽
 -> 친구 때문에 위기에 처할 것이며, 특히 돈이 얽힌 문제를 주의해야 한다.

낙지나 문어 등이 몸을 감는 꿈 해몽
 -> 입학이나 취직 등이 쉽게 이루어져 기쁨을 누릴 징조이다.

문어 꿈 해몽
 -> 일반적으로 모험심이 풍부하다는 뜻이다.
 
문어가 살해당하는 꿈 해몽
 -> 어떤 일에 대해 매우 도덕적인 생각을 가지고 있다.
 
문어에게 습격 당하는 꿈 해몽
 -> 성가시고 귀찮은 문제에 휘말린다.
 
방게 한 보따리를 방으로 가지고 들어가는 꿈 해몽
 -> 세일즈맨이 자기를 찾아온다.
 
방게가 해변가에서 기어 다니는 꿈 해몽
 -> 사업상의 거래처를 많이 확보할 수 있다.

강변에 있는 방게가 깜짝 놀라 숨어 버리는 꿈 해몽
 -> 일은 크게 벌리지만 실속이 없다.

논두렁에서 게를 잡는 꿈 해몽
 -> 생각지도 않았던 재물이 생긴다.
 
게를 보는 꿈 해몽
 -> 하는 일마다 어려움에 부딪혀 일을 망치게 된다.
 
갈대숲에서 게를 보는 꿈 해몽
 -> 방해자가 나타나 일이 뒤틀리거나 경쟁자로 인해 곤란을 겪게 된다.또는 이웃이나 식구와 이별할 수가 있다.
 
잉어는 놓치고 송사리만 잡는 꿈 해몽
 -> 큰 것은 잃고 작은 소망만 성사되며, 수사기관에 근무하는 사람은 주범을 놓치고 잡범은 잡는다.
 
잉어를 사 가지고 오다가 땅에 떨어뜨리는 꿈 해몽
 -> 임신한 부인은 낙태를 하고, 처녀는 애인과 이별하는 불상사가 있다.
 
연어가 알을 낳는 꿈 해몽
 -> 생산, 유통, 식품, 수산업 등에 투자하여 성과를 올리고 재미를 보며, 임신, 교육, 양육, 생산, 수출입, 재테크, 학업성적 향상 등이 있다.
 
연어가 오색 빛깔로 화려한 꿈 해몽
 -> 귀한 문학작품을 창작하거나 새로운 물질을 발명하여 세상에 발표한다.
 
연어가 폭포수나 물줄기를 타고 올라가는 꿈 해몽
 -> 현재의 자리에서 승진하여 입신출세하고 자리의 변동이 생기며, 승진, 당선, 합격, 입학, 자격취득, 승리, 정복, 재물, 성공 등이 있고 밝은 서광이 비친다.
 
연어를 잡아 음식으로 만들어 먹는 꿈 해몽
 -> 집안에 질병과 우환이 발생하고, 싸움과 소송에 휩싸인다.
 
조기 눈알이 뻘겋게 보이는 꿈 해몽
 -> 집안에 유행성 질환이 생기고 우환이 발생하거나, 답답한 일이 생겨서 고생한다.
 
조기가 험한 파도를 타는 꿈 해몽
 -> 집을 떠나 타향에서 산전수전을 경험하거나, 기도, 여행, 수도, 고행 등을 한다.
 
바닷가로 조기 떼가 몰려오는 꿈 해몽
 -> 예상 밖에 좋은 운을 맞아 일확천금을 만지거나, 횡재, 경제적 호황을 맞는다.
 
제사상에 큰 조기를 올려놓고 절을 하는 꿈 해몽
 -> 매사를 소망대로 소원성취하거나, 신의 뜻으로 어떤 목표를 달성한다.
 
뱀장어 꿈 해몽
 -> 직장을 이동할 생각을 가지고 있다.
 
죽은 뱀장어 꿈 해몽
 -> 방해하는 사람을 가볍게 상대해도 문제는 쉽게 해결된다.

뱀장어를 보는 꿈 해몽
 -> 몸과 마음이 생기를 띠어 생활에 활기를 찾게 된다.
 
장어 등 미끄러운 고기를 잡는 꿈 해몽
 -> 입학이나 취직, 이사 또는 결혼을 하는 등 새로운 생활이 시작될 징조이다.

인어를 잡는 꿈 해몽
 -> 장차 이색적인 직업을 갖게 될 인물이 태어날 태몽이다.
 
멸치 꿈 해몽
 -> 연애, 도박, 경마 등 모든 일에 운이 따를 징조이다.

 

 

App에서 주기적이며 반복적인 작업이 필요한 경우가 있습니다.  화면을 주기적으로 갱신 하던가 서버와 데이터를 일정시간마다 반복적으로 보내고 받아야 하는 경우등에는 Timer를 사용하는것이 소스가 간단해서 무척 편합니다.  한가지 단점은 중지 시켰다 다시 시작하는 기능이 없기 때문에 만일 화면에서 버튼으로 제어 하려면 제어를 한다기 보다는 Timer를 매번 새로 생성을 해야 합니다. 두가지 경우를 샘플을 만들어 테스트 해보겠습니다

.

 

1. 타이머 생성 및 종료

 

먼저 타이머를 사용하기 위해 Activity에 선언을 합니다.

 

private Timer timerCall;
private int nCnt;

 

그리고 반복적으로 사용할 TimerTaskonCreate()에 생성합니다.

생성된 TimerTask Timer3초에 한번씩 호출 하도록 schedule 합니다.

 

TimerTask timerTask = new TimerTask() {
   
@Override
   
public void run() {
        someWork();
    }

);

nCnt = 0;

timerCall = new Timer();
timerCall.schedule(timerTask,0,3000);

 

3초에 한번씩 someWork()을 호출 하는 함수는 단순 로그 출력 입니다.

 

private void someWork() {

    Log.d("Test==>", nCnt + " work!!!");
   
if(nCnt >= 10) {
        timerCall.cancel();
    }


    nCnt++;
}

 

앱이 종료 할때까지 타이머가 작동하며 잘 출력 됩니다.

 

D/Test==>: 1 work!!!
D/Test==>: 2 work!!!
D/Test==>: 3 work!!!
D/Test==>: 4 work!!!
D/Test==>: 5 work!!!
D/Test==>: 6 work!!!
D/Test==>: 7 work!!!
D/Test==>: 8 work!!!
D/Test==>: 9 work!!!
D/Test==>: 10 work!!!

 

전체 소스

 

package copycoding.tistory.timertest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;

import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends AppCompatActivity {

   
private Timer timerCall;
   
private int nCnt;

   
@Override
   
protected void onCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);
        setContentView(R.layout.
activity_main);

       
nCnt = 0;

        TimerTask timerTask = new TimerTask() {
           
@Override
           
public void run() {
                someWork();
            }
        };

       
timerCall = new Timer();
       
timerCall.schedule(timerTask,0,1000);
    }

   
private void someWork() {

        Log.d(
"Test==>", nCnt + " work!!!");
       
if(nCnt >= 10) {
           
timerCall.cancel();
        }

       
nCnt++;
    }
}

 

 

2. 타이머 버튼 제어

 

이번에는 타이머를 버튼으로 제어를 해봅니다.   먼저 선언을 하고

 

private Timer timerCall;
private int nCnt;
TimerTask
timerTask;

 

onCreate()에 초기 값을 생성합니다.

 

nCnt = 0;

timerCall = new Timer();

 

start button을 클릭 하면 기존에 TimerTask가 있다면 삭제하고 다시 생성을 하여 타이머를 가동시켜주면 됩니다.

 

public void btnStart(View view) {
    Log.d(
"BTN Start==>", nCnt + " work!!!");
   
if(timerTask != null) {
       
timerTask.cancel();
    }
   
timerTask = new TimerTask() {
       
@Override
       
public void run() {
            someWork();
        }
    };
   
timerCall.schedule(timerTask,0,3000);
}

 

TimerTask를 삭제하지 않고 계속 생성 하면 기존 타이머가 죽지 않은 상황에서 계속 새로운 프로세스의 타이머가 만들어져 타이머로서의 기능을 할 수 없게 됩니다.

 

stop button을 클릭 하면 TimerTask가 작동중인지 확인하고 삭제를 하게 됩니다.

 

public void btnStop(View view) {
    Log.d(
"BTN Stop==>", nCnt + " work!!!");
   
if(timerTask != null) {
       
timerTask.cancel();
    }
}

 

타이머가 호출하는 작업 메소드는 단순히 증가하는 숫자를 로그로 남겨줍니다.

 

private void someWork() {

    Log.d(
"Test some work ==>", nCnt + " work!!!");

   
nCnt++;
}

 

화면은 그냥 버튼 2개만 추가 하였습니다.

 

 

로그에 남겨진 텍스트를 보면 어떻게 작동하는지 알 수 있습니다.  start 버튼에 cancel 로직을 주석처리해서 비교해 보면서 자신에 맞는 로직으로 수정하면 됩니다.

  

D/BTN Start==>: 0 work!!!
D/Test some work ==>: 0 work!!!
D/Test some work ==>: 1 work!!!
D/Test some work ==>: 2 work!!!
D/Test some work ==>: 3 work!!!
D/BTN Stop==>: 4 work!!!
D/BTN Start==>: 4 work!!!
D/Test some work ==>: 4 work!!!
D/Test some work ==>: 5 work!!!
D/Test some work ==>: 6 work!!!
D/BTN Stop==>: 7 work!!!

 

 

 

전체 소스

 

package copycoding.tistory.timertest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;

import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends AppCompatActivity {

   
private Timer timerCall;
   
private int nCnt;
    TimerTask
timerTask;

   
@Override
   
protected void onCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);
        setContentView(R.layout.
activity_main);

       
nCnt = 0;

       
timerCall = new Timer();

    }

   
private void someWork() {

        Log.d(
"Test some work ==>", nCnt + " work!!!");

       
nCnt++;
    }

   
public void btnStart(View view) {
        Log.d(
"BTN Start==>", nCnt + " work!!!");
       
if(timerTask != null) {
           
timerTask.cancel();
        }
       
timerTask = new TimerTask() {
           
@Override
           
public void run() {
                someWork();
            }
        };
       
timerCall.schedule(timerTask,0,3000);
    }

   
public void btnStop(View view) {
        Log.d(
"BTN Stop==>", nCnt + " work!!!");
       
if(timerTask != null) {
           
timerTask.cancel();
        }
    }
}

 

 

App을 새로 생성해서 테스트 하려고 하니 오류가 나옵니다.

 

Installed Build Tools revision 31.0.0 is corrupted. Remove and install again using the SDK Manager.

 

 

Gradle을 살펴보고

 

android {
   
compileSdkVersion
31
   
buildToolsVersion "31.0.0"

   
defaultConfig {
       
applicationId
"copycoding.tistory.sample"
       
minSdkVersion 16
       
targetSdkVersion 31
       
versionCode 1
       
versionName "1.0"

       
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
   
}

 

설치된 SDK Tool도 살펴봐도

 

 

 

별 문제 없는것 같은데..

 

 

1. 버전 낮추기

 

다시 설치하긴 귀찮고 전체적으로 버전을 30으로 낮추어 봅니다. 

 

android {
   
compileSdkVersion
30
   
buildToolsVersion "30.0.3"

   
defaultConfig {
       
applicationId
"copycoding.tistory.sample"
       
minSdkVersion 16
       
targetSdkVersion 30
       
versionCode 1
       
versionName "1.0"

       
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

dependencies {
    implementation 'androidx.appcompat:appcompat:1.3.1'
    implementation 'com.google.android.material:material:1.5.0'

 

 

이런.  새로운 오류가 발생 합니다.

 

 

ERROR:C:\Users\will\.gradle\caches\transforms-2\files-2.1\4eb2fc21ccc2dce4da190845bc3482ac\material-1.5.0\res\values-v31\values-v31.xml:3:5-94: AAPT: error: resource android:color/system_neutral1_1000 not found.

 

Material Component Library 버전이 업데이트 되어서 31을 사용해야 한다고 합니다.

답을 찾았네요.  material 버전을 낮추면 되는거군요.

 

android {
   
compileSdkVersion 30
   
buildToolsVersion "30.0.3"

    
defaultConfig {
       
applicationId
"copycoding.tistory.sample"
       
minSdkVersion 16
       
targetSdkVersion 30
       
versionCode 1
       
versionName "1.0"

       
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
   
}

   
buildTypes {
       
release {
           
minifyEnabled
false
           
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
       
}
    }
   
compileOptions {
       
sourceCompatibility JavaVersion.
VERSION_1_8
       
targetCompatibility JavaVersion.VERSION_1_8
   
}
}



dependencies {

   
implementation 'androidx.appcompat:appcompat:1.3.1'
   
implementation 'com.google.android.material:material:1.2.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
   
testImplementation 'junit:junit:4.+'
   
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
   
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

  

material 버전을 1.5.0에서 1.2.0으로 변경 하나 잘 됩니다.  물론 1.4.0로 낮추어도 됩니다.

 

 

 

 

2. buildToolsVersion 낮추기

 

다른건 그대로 두고 buildToolsVersion만 낮추어서 해결해 봅니다.

Android Studio에서 Gradle을 열고 오른쪽 상단을 보면 Open (Ctrl+Alt+Shift+S)가 있는데

 

 

이걸 누르면 창이 하나 뜨고

 

 

여기서 Build Tools Version을 확장하여 31.0.0 대신 하나 낮은걸 선택 합니다.

  

android {
   
compileSdkVersion
31
   
buildToolsVersion '30.0.3'

   
defaultConfig {
       
applicationId
"copycoding.tistory.test"
       
minSdkVersion 16
       
targetSdkVersion 31
       
versionCode 1
        
versionName "1.0"

 

 

 

그리고 실행하면 다른 오류가 발생 합니다.

 

Manifest merger failed : Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details.

 

 

android:exported 이게 문제라는 군요.  참조하라는 링크를 따라가보면 설명이 있습니다.

https://developer.android.com/guide/topics/manifest/activity-element#exported

 

어째든 android:exportedManifest에 추가하고 값을 넣으면 됩니다.  만일 false를 넣으면 앱이 생성은 되는데 실행하려고 하면 app is’nt installed라는 토스트만 나오니 true를 적어 줍니다.

값을 설정하는 위치는 activity에 해주어야 합니다.

  

<activity android:name=".MainActivity"
   
android:exported="true"
>
    <
intent-filter>
        <
action android:name="android.intent.action.MAIN" />

        <
category android:name="android.intent.category.LAUNCHER" />
    </
intent-filter>
</
activity>

 

이렇게 하면 앱을 잘 테스트할 수 있습니다.

 

 

이건 제가 간단한 테스트를 하려고 한것이고 실제로는 높은 버전으로 컴파일 해야 최신 핸드폰에서도 잘 돌아가는 앱을 만들 수 있겠죠.

 

- copy coding -

 

지난번에 Windows 10docker를 설치 하였고 오늘은 도커에 centos를 설치해 보려고 합니다.

작업 순서는

1. CentOS 설치 버전 확인

2. CentOS Docker로 가져오기

3. CentOS Container 설치

4. CentOS start와 접속

입니다.

 

 

1. CentOS 설치 버전 확인

 

 

제일 중요한 문제는 docker에 설치 가능한 CentOS 버전이 무엇무엇이 있는가 알아야 하는데 저는 cmd 창에서 [docker search centos] 명령어로 찾아보는 건 직관적이지 않아서 docker 사이트에서 검색 해보기로 했습니다.

 

https://hub.docker.com/

 

사이트에 접속해서 docker hub 글씨 옆의 입력 칸에 원하는 검색 키워드를 입력하고 엔터를 누르면 결과 리스트를 확인 할 수 있습니다.

 

 

검색 결과에서 CentOS를 다시 한번 클릭 해주면 새 창에서 좀더 자세한 내용을 볼 수 있습니다.

 

 

최신 버전을 받을 수 있는 스크립트가 제공되고 그외에 설치 가능한 공식적인 버전 정보들도 리스트 되어있는 것을 볼 수 있습니다.  저는 최신 버전을 설치하려는게 아니기 때문에 원하는 버전 정보를 추가해서 CentOS를 제 컴퓨터에 가지고 오도록 했습니다.

 

 

2. CentOS Docker로 가져오기

 

명령은 간단하게 docker pull centos:7.9.2009  이런 형태가 됩니다.

 

C:\>docker pull centos:7.9.2009
7.9.2009: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987
Status: Downloaded newer image for centos:7.9.2009
docker.io/library/centos:7.9.2009
 
C:\>

 

 

3. CentOS Container 설치

 

그리고 Container를 생성해 줍니다.

 

docker create -i -t --name centos centos:7.9.2009

 

C:\>docker create -i -t --name centos centos:7.9.2009
6cdda13ce533857880df029cfbd36f3adc46bf849ef028491568c734bf00cefa
 
C:\>

 

여기까지가 CentOS 설치 과정입니다.  pull로 가져오고 create로 생성하면 됩니다.

 

 

4. CentOS start와 접속

 

생성된 CentOS 컨테이너를 실행하고 접속하는 명령어도 간단 합니다.

 

docker start [컨테이너 이름]

docker attach [컨테이너 이름]

 

C:\>docker start centos
centos
 
C:\>docker attach centos
[root@6cdda13ce533 /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@6cdda13ce533 /]#

 

ls 명령을 테스트 해보았는데 잘 되는군요.

 

새로운 CentOS 컨테이너가 생성된 후에는 Docker에 어떻게 보이는지 확인해 봅니다.

 

 

컨테이너를 create 할때 name 속성을 centos라고 해서 centos 입니다.  마음에 들지 않으면 생성할 때 다른 이름으로 만드시면 됩니다.  아니면 다른 이름으로 여러개 만들어서 사용해도 되겠군요.

웹서버 테스트를 해야 하는데 이제 슬슬 시작해 봐야겠습니다.

 

도커 설치는 아래 링크를 참고하세요.
Docker 4.3.2 WSL 2 설치 (Windows 10)  https://copycoding.tistory.com/399

 

- copy coding -


1···16171819202122···118

+ Recent posts