반응형

vhost.conf 파일은 Apache HTTP 서버의 별도의 가상 호스트 설정을 정의하는 파일입니다. 가상 호스트란, 하나의 IP 주소에서 여러 개의 웹 사이트를 운영하는 것을 의미합니다. vhost.conf 파일을 사용하면 각 가상 호스트마다 별도의 설정을 적용할 수 있습니다.

vhost.conf 파일은 Apache 설정 디렉토리에 있는 httpd.conf 파일에서 Include 명령을 통해 호출됩니다.

 

Include conf/extra/httpd-vhosts.conf

vhost.conf 파일에서 가상 호스트를 정의할 때는 <VirtualHost> 태그를 사용합니다. 각 가상 호스트마다 ServerName과 DocumentRoot 등의 설정을 정의할 수 있습니다.

 

 

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/example.com
    <Directory /var/www/example.com>
        ...
    </Directory>
</VirtualHost>

가상 호스트를 사용하면 하나의 서버에서 다수의 웹사이트를 운영할 수 있어 효율적인 웹서버 관리가 가능합니다.

반응형
반응형

express 환경에 multer 라이브러리를 이용해 간단히 구성 가능하다.

 

 

interface Multer {
        /**
         * Returns middleware that processes a single file associated with the
         * given form field.
         *
         * The `Request` object will be populated with a `file` object containing
         * information about the processed file.
         *
         * @param fieldName Name of the multipart form field to process.
         */
        single(fieldName: string): RequestHandler;
        /**
         * Returns middleware that processes multiple files sharing the same field
         * name.
         *
         * The `Request` object will be populated with a `files` array containing
         * an information object for each processed file.
         *
         * @param fieldName Shared name of the multipart form fields to process.
         * @param maxCount Optional. Maximum number of files to process. (default: Infinity)
         * @throws `MulterError('LIMIT_UNEXPECTED_FILE')` if more than `maxCount` files are associated with `fieldName`
         */
        array(fieldName: string, maxCount?: number): RequestHandler;
        /**
         * Returns middleware that processes multiple files associated with the
         * given form fields.
         *
         * The `Request` object will be populated with a `files` object which
         * maps each field name to an array of the associated file information
         * objects.
         *
         * @param fields Array of `Field` objects describing multipart form fields to process.
         * @throws `MulterError('LIMIT_UNEXPECTED_FILE')` if more than `maxCount` files are associated with `fieldName` for any field.
         */
        fields(fields: ReadonlyArray<Field>): RequestHandler;
        /**
         * Returns middleware that processes all files contained in the multipart
         * request.
         *
         * The `Request` object will be populated with a `files` array containing
         * an information object for each processed file.
         */
        any(): RequestHandler;
        /**
         * Returns middleware that accepts only non-file multipart form fields.
         *
         * @throws `MulterError('LIMIT_UNEXPECTED_FILE')` if any file is encountered.
         */
        none(): RequestHandler;
    }

아래 3가지 함수를 주로쓴다.

 

single

- 한개의 파라미터에 대해서만 파싱해준다.

 

array

- array단위로 파라미터를 파싱해준다.

 

fields

- 파라미터명은 files 라는 이름이고, array형태로 값이 들어온다.

 

const app = express();
const storage = multer.memoryStorage();
const upload = multer({ 
    storage: storage,
    limits: {
        fileSize: 500 * 1024 * 1024, // Allow files up to 5MB
    }
});

app.post('/', upload.fields([{name: 'file'},{name: 'cover'}]), async (req, res) => {

})

 

cover와 file 파라미터 명으로 지정한값으로 파라미터를 받을 수있다.

반응형
반응형

사용자 식별을 위한 방법

 

키로 고유한 값 지정

 

https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor

 

 

Apple Developer Documentation

 

developer.apple.com

 

UIDevice.current.identifierForVendor?.uuidString

iOS 장치에 설치되어 있는 동안 동일하게 유지됩니다. 사용자가 장치에서 해당 공급업체의 앱을 모두 삭제한 후 그 중 하나 이상을 다시 설치하면 값이 변경됩니다. Xcode를 사용하여 테스트 빌드를 설치하거나 애드혹 배포를 사용하여 기기에 앱을 설치할 때도 값이 변경될 수 있습니다. 따라서 앱이 이 속성의 값을 어디에나 저장하는 경우 식별자가 변경되는 상황을 적절하게 처리해야 합니다.

 

삭제 케이스 => 공급업체 앱을 전부 제거, xcode test build, adhoc 

 

 

shared keychain으로 키체인 값 공유

 

https://developer.apple.com/documentation/security/keychain_services/keychain_items/sharing_access_to_keychain_items_among_a_collection_of_apps

반응형
반응형

 

개요

하나의 프로젝트로 비슷한 서비스를 만들시 기존앱을 복사해서 패키지명을 변경하는 작업은 번거롭기 때문에

BuildFlavor로 구분해 gradle설정만으로 앱을 만들려할때 용이하다.

 

Gradle 작성

    flavorDimensions "office"
    productFlavors {
        sdm { // flavor 1
            dimension "office"
            buildConfigField 'int', 'PASEQ', 'qasdgag a'
            buildConfigField 'String', 'PAID', '"12rweㅁㄷㄴㅇㅎㅁㄴㅇㄹㅁㄴㅇㄹ"'
        }
        sb { // flavor 2
            dimension "office"
            applicationId "com.audien.b2btablet_110"
            versionCode 22101701
            versionName "1.0.0"
            buildConfigField 'int', 'PASEQ', 'asdadad'
            buildConfigField 'String', 'PAID', '"123112124124214"'
        }
    }
BuildConfig.PAID

-> 빌드 구분에 따라 buildConfigField를 통해 실제 소스에서 BuildConfig.PAID 이런식으로 변수로 활용가능

     서비스로직 , manifest 등.. 에서 변수가될 값을 코드상에서 제어 가능하다. 

 

android {
  ...
  buildTypes {
    debug {...}
    release {...}
  }

  // Specifies the flavor dimensions you want to use. The order in which you
  // list each dimension determines its priority, from highest to lowest,
  // when Gradle merges variant sources and configurations. You must assign
  // each product flavor you configure to one of the flavor dimensions.
  flavorDimensions "api", "mode"

  productFlavors {
    demo {
      // Assigns this product flavor to the "mode" flavor dimension.
      dimension "mode"
      ...
    }

    full {
      dimension "mode"
      ...
    }

    // Configurations in the "api" product flavors override those in "mode"
    // flavors and the defaultConfig block. Gradle determines the priority
    // between flavor dimensions based on the order in which they appear next
    // to the flavorDimensions property above--the first dimension has a higher
    // priority than the second, and so on.
    minApi24 {
      dimension "api"
      minSdkVersion 24
      // To ensure the target device receives the version of the app with
      // the highest compatible API level, assign version codes in increasing
      // value with API level. To learn more about assigning version codes to
      // support app updates and uploading to Google Play, read Multiple APK Support
      versionCode 30000 + android.defaultConfig.versionCode
      versionNameSuffix "-minApi24"
      ...
    }

    minApi23 {
      dimension "api"
      minSdkVersion 23
      versionCode 20000  + android.defaultConfig.versionCode
      versionNameSuffix "-minApi23"
      ...
    }

    minApi21 {
      dimension "api"
      minSdkVersion 21
      versionCode 10000  + android.defaultConfig.versionCode
      versionNameSuffix "-minApi21"
      ...
    }
  }
}
...

flavorDimensions 속성을 사용하여 'full' 및 'demo' 제품 버전을 그룹화하는 'mode' 버전 차원과 API 수준을 기반으로 제품 버전 구성을 그룹화하는 'api' 버전 차원을 생성합니다.

 

ProductFlavor  |  Android Developers

com.android.build.api.component Interfaces

developer.android.com

-> 빌드 flavor로 커스텀 이름에 따른 빌드구분 , API 버전에따른 빌드 구분 둘다 가능함을 보여준다.

 

빌드

- 빌드한후 왼쪽 build variants를 보면 build 방식이 내가 작성한 gradle에 따라 분리 되있는걸 볼 수 있다.

 

 

리소스

-> 기존 main 디렉토리가 존재, sb 라는 커스텀 디렉토리 생성으로 buildFlavor이름과 맞는 파일 생성후

기존에 사용하던 리소스 이름과 동일하게 명명하면 빌드시 해당 res를 찾아간다.

ic_launcher.jpg로 동일한 명을 사용하면 아이콘이 저 jpg를 찾아간다.

반응형
반응형

base ui class

       function BDBUI(){
            this.templete, 
            this._popup, 
            this.popup, 
            this.callback = null
        }
        BDBUI.prototype.init = function(){
            this._popup = this._stringToHTML(this.templete)
        }
        BDBUI.prototype.show = function(){
            this.hide()
            this.popup = this._popup.cloneNode(true)
            document.body.appendChild(this.popup)
        }
        BDBUI.prototype.has = function(){
            return this.popup
        }
        BDBUI.prototype.hide = function(){
            if (this.has()){
                while(this.popup.firstChild){
                    this.popup.firstChild.remove()
                }
                this.popup.remove()
                this.popup = null
                return true
            } else {
                return false
            }
        }
        BDBUI.prototype._stringToHTML = function (str) {
            var parser = new DOMParser();
            var doc = parser.parseFromString(str, 'text/html');
            return doc.body.firstChild;
        }
        BDBUI.prototype.copy = function(obj){
            return Object.assign({}, obj);
        }

sub ui class 

        function SubUI(){
            BDBUI.call(this)
            this.templete = "<div></div>"
        }
        SubUI.prototype = Object.create(BDBUI.prototype)
        SubUI.prototype.constructor = SubUI
        //custom function
        SubUI.prototype.sd = function(){
            console.log(this.templete)
        }

 

sub ui class 호출

        const subui = new SubUI()
        subui.init()
        subui.sd()
        subui.show()
        console.log(subui)

 

반응형
반응형

 

 

 

아래 문자열은 EUC-KR , UTF-8에서 모두다 지원함.

A-Z a-z 0-9 - _ . ! ~ * ' ( )

 

그외 지원하지 않는 문자열은 이스케이프 문자열로 치환해야

 

호환이 가능함

 

encodeURIComponent

 

 URI의 특정한 문자를 UTF-8로 인코딩해 하나, 둘, 셋, 혹은 네 개의 연속된 이스케이프 문자로 나타냅니다. (두 개의 대리 문자로 이루어진 문자만 이스케이프 문자 네 개로 변환됩니다.

        let test1 = '66.6퍼센트는 중국, 브라질, 인도, 러시아, 멕시코 등 5대 개발도상국이 생산했다.• 나머지 개발도상국은 모두 합쳐 6조 3000억'
        cvt(test1)
        function cvt(text){
            let covert = encodeURIComponent(text)
            //텍스트를 이스케이프 문자열로 치환
            console.log(`Encode: ${text} => ${covert}`)
            //이스케이프된 문자열을 텍스트로 치환
            console.log(`Decode: ${covert} => ${decodeURIComponent(covert)}`)
        }

 

 

 

decodeURIComponent()

 encodeURIComponent 나 비슷한 방법으로 생성된 Uniform Resource Identifier(URI) 컴포넌트를 해독합니다.

decodeURIComponent("JavaScript_%D1%88%D0%B5%D0%BB%D0%BB%D1%8B");
// "JavaScript_шеллы"

 

 

 

반응형
반응형

유선디버그

  • 설정->개발자 옵션 -> usb 디버그
  • 크롬 -> 검색창에 chrome://inspect/#devices 입력

 

 

웹디버그

  • 디버깅할 디바이스-> 설정->개발자 옵션 -> 무선 디버그
  • usb연결 
  • adb tcpip <port> => 무선 디버깅할 포트번호 지정
  • 디버깅할 디바이스-> WIFI -> <wifi IP> 주소 확인
  • adb connect <wifi ip>:<port>
  • 연결완료
  • 크롬 -> 검색창에 chrome://inspect/#devices 입력

 

 

반응형
반응형

잔금 지급시 전세권 설정 등기를 요구

전세보증 보험 가입 안될시 계약 무효약관 추가.

 

내 전세 보증금이 1순위로 설정되게 요구

 

권리 말소 약관

근저당,압류 , 기타권리권이 걸려있을시 잔금시 말소 약관을 추가.

 

잔금치르기 전

인감도장,인감증명서 챙기기 두개가 동일해야됨, 소유권 이전을 위함.

 

잔금 지급 방법 (계좌이체)

 

계좌이체 한도 높혀놓기.

 

잔금치른후

 

전입신고 , 이사 , 확정일자

 

전입신고 + 이사 = 대항력( 낙찰자에게 보증금 받을 때 까지 집을 못줄때. )

 

전입신고 + 이사 + 확정일자 = 우선변제권

 

집이 경매로 넘어가기전에 우선 변제권 순위가 높아야

 

경매가격중 내 전세금은 보장받을 수 있다.

 

계약조건 집주인한테 직접 물어보기

이중계약확인을 위함. ( 중계업체가 나한테 전세로 내놧는데 실제 주인이 알고있는건 월세로 알고 있을때 )

 

 

신탁 계약 원부 요구

 

신탁회사 소유인지 확인해야 함

 

 


기타 필요한 지식

등기부 등본

 

갑구 - 건물의 소유가가 적혀있는 곳

 

을구 - 융자가 얼마 있는지 적혀있는곳

 

반응형

+ Recent posts