Tip/Android2020. 10. 27. 23:45

Termux 에서 web server를 실행하는 방법

1. Apache2 설치

apt install apache2

2. httpd.conf 수정

/data/data/com.termux/files/usr/etc/apache2/httpd.conf

DocumentRoot "/data/data/com.termux/files/usr/share/apache2/default-site/htdocs"
<Directory "/data/data/com.termux/files/usr/share/apache2/default-site/htdocs">

↓↓↓↓↓

DocumentRoot "/data/data/com.termux/files/home/storage/downloads/localhost/myweb"
<Directory "/data/data/com.termux/files/home/storage/downloads/localhost/myweb">

저의 localhost의 위치는 폰의 downloads 폴더의 /localhost/myweb 입니다.

3. Html 파일 복사

저는 아래의 tetris.html 과 스크립트를 복사했습니다.
https://github.com/chobocho/JsTetris/tree/master/src/app/src/main/assets

4. Apache 웹서버 실행

apachectl start

'Tip > Android' 카테고리의 다른 글

[Termux] SSH port forwarding  (0) 2020.10.28
[Termux] ssh 사용하기  (0) 2020.10.26
[Gradle] Version 명 자동 업데이트  (0) 2020.04.11
Posted by chobocho
Tip/Android2020. 10. 26. 23:31

1. ".bashrc" 파일에 아래와 같이 sshd를 추가한다.

2. termux를 재실행 한다.

3. ssh 192.168.35.12 -p 8022 와 같이 port 8022번으로 접속한다.

Posted by chobocho
Tip/Windows2020. 9. 22. 23:41

탐색기로 많은 파일을 지울 때 생각보다 시간이 오래 걸린다.

이럴 때에는 command 창을 열고 아래 명령어를 실행 하면 빠르게 지울 수 있다.

del /F /S /Q  [삭제할 폴더] 
rd /S /Q  [삭제할 폴더]

* 주의: 조심해서 사용 해야 함.

Posted by chobocho
Tip/Life2020. 5. 11. 23:41

사무실에서 나의 느린 문제해결 속도에 답답해 하면서,

문득 내가 신입 때 이런 걸 알고 준비했면 지금 더 좋지 않았을까 하는 것들이 무엇일까 생각해 보았다.

 

1) 문제해결 방법

몇 달 전 친구와 이야기를 하다가, 네가 면접관이면 새로운 멤버를 구할 때, 어떤 질문을 할 것인가 하고 물어 본적이 있었다. 친구 曰 "문제가 주어졌을 때, 어떻게 해결 할 것인가?"를 물어보겠다고 했다. 그 답을 듣고, 내가 문제를 받고 어떻게 처리하는가를 되돌아 보았다. 그리고 주위에 일을 잘하는 분들을 보면, 일을 잘하는 분들은 차이점이 있었다.

첫째, 문제를 받으면 문제를 명확하게 정의 한다.

문제가 주어지면, 문제의 해결 방향을 정의 한다.

이 문제가 컨셉에 따른 올바른 동작인지,

단순 버그여서, 프로그래밍으로 수정하면 되는지,

과거에 이력에 있는 문제이어서, 수정을 하려면 관계된 다른 부서와 협의가 필요한 것인지,

단순 협의로 정리 할 수 있는 문제인지 등등 문제를 보고 진행 방향을 빠르고 정확하게 판단을 한다.

물론 올바른 판단능력을 가지기 까지는 많은 시행 착오와, 좋은 기억력이 있어야 하고, 자주 선임자들에게 물어서 이력을 파악하고 있어야 하는것도 중요하다.

둘째, 문제 진행 사항 보고

문제의 진행사항을 자주 윗 사람에게 보고하여서, 호미로 막을 일을 가래로 막는 일을 방지한다.

알지 못하는 숨은 이력이 있을 수 있기 때문에, 문제의 진행 상황 보고는 중요하다

셋째, "이 일은 내꺼" 라는 마인드

일을 잘하는 분들은, 모든 일이 자기 일이라는 마인드로 임한다. 문제의 주인 의식이 있다.

어려운 문제가 주어지더라도, 대부분의 사람은 해답의 근처까지는 간다.

그런데 거기서 해답을 찾느냐 못찾느냐가 실력이다.

해답의 근처에서 해답을 찾으려는 노력의 차이가 쌓이고 쌓여서, 고수와 하수가 갈린다.

끝까지 포기 하지 않고 답을 찾는 자세 이것이 중요하다.

 

2) 프로그래밍 스킬

초딩 시절, 생활의 길잡이라는 교재에서 성공한 사람들은 10년간 하루 4시간씩 공부한다는 내용의 글이 있었다.

365일 x 4시간 x 10년 = 14600 시간이고, 주말을 제외하고 계산해도 10440 시간, 10000 시간이 넘는다.

아웃라이어에서 이야기한 1만 시간의 법칙을 우린 초딩 시절에 배웠으나 잊고 살고 있었다.

일을 잘하는 분들은 보면, 끊임 없이 배우고, 공부한다. 남들이 짜놓은 코드를 보면서, 공부하고,

왜 그렇게 짰는가를 생각한다. 그리고 최신 트렌드에 뒤쳐지지 않도록 끊임없이 공부한다.

내가 신입때로 돌아간다면...

Design pattern, Refactoring, 알고리즘 공부에 시간을 많이 쏟았어야 하는 아쉬움이 남는다.

 

3) 어학

글로벌 시대에 어학의 중요성은 아무리 강조해도 부족함이 없다.

영어는 RFC 문서는 자유롭게 읽고, 외국인과 전화 회의를 할 정도의 어학 실력은 반드시 갖추어야 한다.

큰 IT 기업에서 외국인과의 협업은 필수 이고, 컴퓨터 관련 최신 기술은 모두 영어로 나오기 때문에,

영어는 생존을 위한 필수이다. 그리고 미래를 위해 중국어도 반드시 공부해야 한다.

 

4) 체력 

미생에 보면 "좋아 하는 일을 발견하면 체력을 길러라" 라는 문구가 있다.  나이가 들면 결국 체력 싸움이다.

본인이 좋아해도 체력이 안되면 할 수 가 없다. 평소에 꾸준히 건강관리를 하는 것이 중요하다.

'Tip > Life' 카테고리의 다른 글

신입 사원을 위한 가이드  (0) 2021.05.17
Posted by chobocho
Tip/Android2020. 4. 11. 15:15

Android로 APK를 생성하면서 자동으로 파일 이름 생성 및 버전 명을 업데이트 하는 스크립트를 구성해 보았다

미래의 나를 위하여 기록을 남긴다

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.3"

    def versionPropsFile = file('versioninfo.properties')
    def Properties versionInfo = new Properties()

    if (versionPropsFile.canRead()) {
        versionInfo.load(new FileInputStream(versionPropsFile))
    } else {
        versionInfo['VERSION_HEADER'] = "0.1105"
        versionInfo['VERSION_NUMBER'] = 0
        versionInfo['VERSION_COUNT'] = 0
        versionInfo['BUILD_COUNT'] = 0
    }

    def versionHeader = versionInfo['VERSION_HEADER']
    def versionNubmer = versionInfo['VERSION_NUMBER'].toInteger()
    def versionCount = versionInfo['VERSION_COUNT'].toInteger()
    def buildCount = versionInfo['BUILD_COUNT'].toInteger()

    def taskName = gradle.startParameter.taskNames
    def addVersion = 1
    def isReleaseVersion = false

    if (":app:bundleRelease" in taskName) {
        println '---[bundleRelease]---'
        versionNubmer += addVersion
        versionCount += addVersion
        isReleaseVersion = true
    }

    buildCount += addVersion

    versionInfo['VERSION_HEADER'] = versionHeader.toString()
    versionInfo['VERSION_NUMBER'] = versionNubmer.toString()
    versionInfo['VERSION_COUNT'] = versionCount.toString()
    versionInfo['BUILD_COUNT'] = isReleaseVersion ? "1" : buildCount.toString()

    versionInfo.store(versionPropsFile.newWriter(), null)

    def date = new Date();
    def alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    def thisYear =  alphabet.charAt(date.getYear() + 1900 - 2001)
    def thisMonth = alphabet.charAt(date.getMonth())
    def monthVersion = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".charAt(versionCount)

    println '-------------------'
    println taskName
    println "${versionHeader}.${thisYear}${thisMonth}${monthVersion}.${buildCount}"
    println '-------------------'

    defaultConfig {
        applicationId "com.chobocho.ColorMatch"
        minSdkVersion 23
        targetSdkVersion 28
        versionCode versionNubmer
        versionName "${versionHeader}.${thisYear}${thisMonth}${monthVersion}.${buildCount}"
        setProperty("archivesBaseName", "imagematch_$versionName")
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

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

미래의 우둔한 나를 위하여, 주석을 남긴다.

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.3"

    // 프로퍼티 파일 이름
    def versionPropsFile = file('versioninfo.properties')
    def Properties versionInfo = new Properties()

    if (versionPropsFile.canRead()) {
        versionInfo.load(new FileInputStream(versionPropsFile))
    } else {
        // 프로퍼티 파일이 없으면 생성을 하기위해 기본 값을 설정한다
        versionInfo['VERSION_HEADER'] = "0.1105"
        versionInfo['VERSION_NUMBER'] = 0
        versionInfo['VERSION_COUNT'] = 0
        versionInfo['BUILD_COUNT'] = 0
    }

    def versionHeader = versionInfo['VERSION_HEADER']
    def versionNubmer = versionInfo['VERSION_NUMBER'].toInteger()
    def versionCount = versionInfo['VERSION_COUNT'].toInteger()
    def buildCount = versionInfo['BUILD_COUNT'].toInteger()

    def taskName = gradle.startParameter.taskNames
    def addVersion = 1
    def isReleaseVersion = false

    // Signed APK 빌드인 경우만 versionCount를 증가 시킨다
    if (":app:bundleRelease" in taskName) {
        println '---[bundleRelease]---'
        versionNubmer += addVersion
        versionCount += addVersion
        isReleaseVersion = true
    }

    buildCount += addVersion

    // 수정된 값을 프로퍼티에 업데이트 한다
    versionInfo['VERSION_HEADER'] = versionHeader.toString()
    versionInfo['VERSION_NUMBER'] = versionNubmer.toString()
    versionInfo['VERSION_COUNT'] = versionCount.toString()
    versionInfo['BUILD_COUNT'] = isReleaseVersion ? "1" : buildCount.toString()

    versionInfo.store(versionPropsFile.newWriter(), null)

    // 빌드한 연도와 월을 남기기 위한 부분
    // 2001년 1월 > AA
    // 2020년 3월 > TC
    def date = new Date();
    def alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    def thisYear =  alphabet.charAt(date.getYear() + 1900 - 2001)
    def thisMonth = alphabet.charAt(date.getMonth())
    def monthVersion = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".charAt(versionCount)

    println '-------------------'
    println taskName
    println "${versionHeader}.${thisYear}${thisMonth}${monthVersion}.${buildCount}"
    println '-------------------'

    defaultConfig {
        applicationId "com.chobocho.ColorMatch"
        minSdkVersion 23
        targetSdkVersion 28
        versionCode versionNubmer
        // 버전명 정보 -> 0.1105.TD1.2
        versionName "${versionHeader}.${thisYear}${thisMonth}${monthVersion}.${buildCount}"
        // 생성 되는 파일이름을 설정한다
        setProperty("archivesBaseName", "imagematch_$versionName")
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

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

'Tip > Android' 카테고리의 다른 글

[Termux] Web server 돌리기  (0) 2020.10.27
[Termux] ssh 사용하기  (0) 2020.10.26
[ChooseOne] 안드로이드 제비뽑기 앱 만들기 (I)  (0) 2019.09.02
Posted by chobocho
Tip/Windows2020. 2. 22. 16:43

'Tip > Windows' 카테고리의 다른 글

대량의 파일 지우기  (0) 2020.09.22
갤럭시 북 이온 - 터치패드 무선 충전  (0) 2020.02.04
Windows10 에서 타임라인 기록 삭제하기  (0) 2019.09.01
Posted by chobocho
Tip/Windows2020. 2. 4. 21:15
갤럭시 북 이온에서 터치패드를 이용 하여 무선 충전하는 방법
 
Fn + F11 을 누르고 터치패드에 무선 충전을 지원하는 휴대폰이나, 무선 이어폰을 올려 두면 된다.
 
 
 
Posted by chobocho
Tip/Android2019. 9. 2. 00:44

Android 제비뽑기 앱 만들기 (I)


결과물
 
 

앱의 목적
 
2명이상의 사용자들 중 한 명을 뽑아 준다 (사다리 타기)
 
  • 사용 예:  커피 쏘기

앱의 기본 동작 설계
 
 
앱의 요구 사항 분석
 
  • 앱을 실행 후 2명 이상이 화면에 손가락을 올리면, 3초 뒤에 한 명을 선택해 준다
  • 손가락을 올려 둔 상태에서 3초 안에 손가락을 떼거나, 추가하면 다시 3초를 센다
  • 손가락을 올려 둔 상태에서 3초 안에 손가락을 모두 떼면, 동작을 멈춘다
  • 60초 동안 아무도 손가락을 올리지 않으면 자동으로 앱이 종료 된다
 
 
기초 설계
 
  • 앱의 동작을 위하여 내부적으로 IDLE, SELECTING, SELECTED 3개의 State를 가지는 State machie 을 구상하였다.
  • State의 변화는 아래와 같다. (편의 상 시간의 변화를 tick이란 단어로 표시했다.)
 
 
 
State pattern
 
 
 
Code 생성
 
IState.java
package com.chobocho.chooseone.state;
 
import com.chobocho.chooseone.manager.ChooseManager;
 
public abstract class IState {
    public static final int IDLE = 0;
    public static final int SELECTING = 1;
    public static final int SELECTED = 2;
 
    ChooseManager manager;
    int mTick;
    int mPointNum;
 
    public IState() {
 
    }
 
    public void Init() {
        mTick = 0;
    }
 
    public void tick() {
        // TODO implement here
    }
 
    public void updatePointList(int point) {
        // TODO implement here
    }
}
 
IdleState.java
package com.chobocho.chooseone.state;
 
import androidx.annotation.NonNull;
import com.chobocho.chooseone.manager.ChooseManager;
 
public class IdleState extends IState {
    public IdleState(ChooseManager manager) {
        this.manager = manager;
        super.Init();
        mPointNum = 0;
    }
 
    @Override
    public void updatePointList(int point) {
        mPointNum = point;
        if (mPointNum >= 2) {
            manager.transit(IState.SELECTING);
        }
    }
 
    @Override
    @NonNull
    public String toString(){
        return "IdleState";
    }
}
 

'Tip > Android' 카테고리의 다른 글

[Termux] Web server 돌리기  (0) 2020.10.27
[Termux] ssh 사용하기  (0) 2020.10.26
[Gradle] Version 명 자동 업데이트  (0) 2020.04.11
Posted by chobocho
Tip/Windows2019. 9. 1. 11:15
Windows10 에서 타임라인 기록 삭제하기

 
Windows 10 업데이트 후 타임라인을 보고 급 당황스러웠습니다.
저와 같은 분들을 위해서,
그래서 타임라인 기록을 삭제 하는 방법을 공유합니다.
 
 
 
 
 
 
 
 

'Tip > Windows' 카테고리의 다른 글

갤럭시 북 이온 - 터치패드 무선 충전  (0) 2020.02.04
노트북 세로 모드로 사용하기  (0) 2019.07.08
윈도우 10 단축키 모음  (0) 2019.05.01
Posted by chobocho
Tip/Windows2019. 7. 8. 22:40
삼성 Always 시리즈와 같이 가벼운 노트북은 위와같이 화면을 돌려서 세로로 긴 화면으로 사용 하면 문서 읽기에 유리하다.
방법은 아래와 같다.
배경 화면 -> 마우스 우측 버튼 -> 디스플레이 설정 -> 방향 -> 세로
 
 
Posted by chobocho