2020. 9. 22. 14:33

aws s3를 붙였는데...

 

처음에는 작동하다가, 패키지 업데이트 하고, 갑자기

aws s3 default is not a constructor 에러가 뜨더라....

 

아....진짜 웃긴건, 이전 소스로 커밋 되돌리기하면 되고....  

원복해서 패키지 업데이트한거 롤백해도..안되고....

 

그래서 결국 에러를 잡기로함...

 

위 에러를 찾아보니, app에서 여러군데에서 써서 그런거라고, 로컬변수를 글로벌 변수로 바꾸라는거다.

 

그래서  constructor(___) 안에 있는 private변수를 class로 올리고, public으로 바꾸니까 에러는 안뜨는데...

 

undefined 에러가 뜨더라.(ERROR TypeError: this.awsService is undefined) 

 

awsService를 만들어서, 불러와서 써는데, 거기에서 config 세팅하는 부분이 불러올때마다 setting이 되서,

 

벌써 aws가 세팅이 되어 있는데, 중복으로 하는거 같더라...

 

처음에 constructor 안에 S3세팅을 했는데,  아에 void클래스를 따로 만들어서, constructor에서는 

불러왔다.

 

    constructor() {
        this.setS3();
    }

    private setS3():void{
        const config = {
            bucketName: env.aws.bucketName,
            region: env.aws.region,
            accessKeyId: env.aws.accessKeyId,
            secretAccessKey: env.aws.secretAccessKey,
        };
        this.S3Client = new S3(config);
    }

 

이런식으로 했더니, 에러도 안뜨고, 잘 올라간다.

Posted by Tyson
2020. 9. 18. 12:53

맥에서 Xcode 시뮬레이터 작업시, 

 

캐쉬가 남아있어서, 변경사항이 반영이 안될때가 있어서.. 캐쉬를 지우고 재빌드를 해야한다.

 

먼저 finder에서 "사용자이름" 폴더로 간다. 

 

키보드에서 Shift + Command + .  (점) 을 누른다.

 

그러면, 숨김폴더들도 목로에 보인다.

 

/사용자이름명폴더/Library/Developer/Xcode/DerivedData 폴더로 간다.

        (또는 한글로 라이브러리폴더)

 

그 하위 폴더에 ModuleCache, App-블라블라 등등 폴더가 있는데, 다 삭제해준다.

 

그리고, Xcode를 새로 열어서, 빌드를 다시해주면, 이전에 했던 캐쉬들이 다 삭제되고, 새롭게 뜬다.

 

 

'컴퓨터 > App' 카테고리의 다른 글

Ionic React 발표  (0) 2020.07.15
Posted by Tyson
2020. 8. 31. 17:32

테이블에서 값이 길어져서, 너무 길면, 값뒤에  "..." 으로 표시하고 싶을때..

 

나 같은 경우는 이메일 주소를 보여주는데, 너무 길면, 표가 길어져서...잘라서 보여주려고 한다.

위처럼 이메일은 @ 다음을 ... 으로 표시하고, @ 없을때는 다 보여주려고 한다.

 

아래처럼 하면 된다.

                <ng-container matColumnDef="createdBy">
                    <th class="text-sm" mat-header-cell *matHeaderCellDef>createdBy</th>
                    <td class="text-sm" mat-cell *matCellDef="let data"> {{ (data.createdBy.length>10)?(data.createdBy|slice:0:data.createdBy.indexOf('@')+1)+'...':data.createdBy}}</td>
                </ng-container>

 

 

 

값을 불러오는 부분에서

{{ (data.createdBy.length>10)?(data.createdBy|slice:0:data.createdBy.indexOf('@')+1)+'...':data.createdBy}}

       값 길이가 10보다 클때, (data.createdBy|slice:0:data.createdBy.indexOf('@')+1)+'...'

        아닐때는          data.createdBy 

이렇게 했다.

 

10보다 클때는

(data.createdBy | slice:0:data.createdBy.indexOf('@')+1)+'...'

0부터 @이를 찾아서, @까지 보여주고, 뒤에 '...'를 추가하겠끔 했다.

 

slice는 값을 자르는 거고, 

slice 앞에는 파이프라인이다 '|'

indexOf는 문자열 찾는 거다.

 

-------------------------------------

여기에 툴팁을 추가하고 싶으면, 

                <ng-container matColumnDef="createdBy">
                    <th class="text-sm" mat-header-cell *matHeaderCellDef>createdBy</th>
                    <td class="text-sm" mat-cell *matCellDef="let data"  [matTooltip]=data.createdBy> {{ (data.createdBy.length>10)?(data.createdBy|slice:0:data.createdBy.indexOf('@')+1)+'...':data.createdBy}}</td>
                </ng-container>

 

[matTooltip]=data.createdBy

이거를 추가하면 된다.

[] 괄호가 없으면, data.createdBy를 출력하니까..

데이터 값을 보여줄때는 [] 괄호를 꼭 쓰자.

Posted by Tyson
2020. 8. 31. 15:12

angular Date값이 UTC값으로 등록되어 있는데, 

Front단에서 보여줄때는 YYYY-MM-DD로 보여주고 싶을때,

 

                <ng-container matColumnDef="createdDate">
                    <th class="text-sm" mat-header-cell *matHeaderCellDef>createdDate</th>
                    <td class="text-sm" mat-cell *matCellDef="let data"> {{ data.createdDate | date:'yyyy-MM-dd' }} </td>
                </ng-container>

 

createdDate값이 

2001-10-31T15:00:00.000Z 

로 되어 있는것을 프론트에서 보여주는 방법은,

{{ data.createdDate}}

위 부분을 아래처럼 바꿔주면 된다.

{{ data.createdDate | date:'yyyy-MM-dd' }}

원하는 포멧으로  yyyy년도, MM월, dd 일 이렇게 표시하면 된다.

Posted by Tyson
2020. 8. 31. 14:04

달력을 사용하기 전에, module에 아래 4개를 추가해 줘야한다.

MatInputModule,

MatDatepickerModule,
MatNativeDateModule,
MatMomentDateModule,

@NgModule({
    declarations: [
        testComponent
    ],
    imports     : [

        MatInputModule,
        MatDatepickerModule,
        MatNativeDateModule,
        MatMomentDateModule,
    ],
    providers: [
        { provide: MAT_DATE_LOCALE, useValue: 'ko-KR' },
        { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS },
    ]
    
})

 

 

 Angular Meterial 사이트 에 가면, 데이트 피커 사용법이 아래처럼 되어있다.

 

<mat-form-field appearance="fill">
  <mat-label>Choose a date</mat-label>
  <input matInput [matDatepicker]="picker">
  <mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
  <mat-datepicker #picker></mat-datepicker>
</mat-form-field>

<https://material.angular.io/components/datepicker/overview>

근데, 나는 보통 달력들처럼 input 박스  클릭하면, 달력을 뜨게하고, 

MM/DD/YYYY 방식이 아닌, 

YYYY/MM/DD로 하고 싶고... input 누르면 바로 달력이 떴으면 좋겠고..

가져온 Date값이 달력에 뜨면 좋을거 같은데...너무 복잡하더라...

ㅠㅠㅠ

 

1. 내 Data로 달력부분에 보이게 하기

2. 숫자 부분(input) 눌렀을때, 달력 뜨게...

3. MM/DD/YYYY를 YYYY/MM/DD로 바꾸기

 

위 3개가 달력을 적용하는데 필요했다.

 

먼저 위 코드를 이해해야하는데....

input, mat-datepicker-toggle, mat-datepicker에 사용하는, "picker"라는게...먼지 몰라서...바꿨다가..안되는거였다.

저거는 ID값으로, 위 3개가 같은거라는것을 표시해 주는거다.

그래서 같은 값을 적어줘야한다. 나는 datepicker라는 id값으로 지정했다.

그리고,  2번 클릭했을때, 달력뜨게는 input 태그 부분에 (click)="datepicker.open()" 를 넣었다.

datepicker를 열어라는 거다.

 

1번 내 data부분 보이게 하려면, 

[(ngModel)]="noticeDoc.expiredDate"

ngModel 부분에 noticeDoc의 expiredDate값을 가져오라고 되어있다. 

내 date 값은 utc값으로 2020-11-03T00:00:00.000Z  처럼 들어가있다.

datepicker가 알아서 날짜 변환해서 달력으로 보여준다.

            <mat-form-field class="treo-mat-no-subscript w-full" >
              <mat-label>expiredDate</mat-label>
                  <input matInput [matDatepicker]="datepicker" formControlName="expiredDate" (click)="datepicker.open()" [(ngModel)]="noticeDoc.expiredDate" >
                  <mat-datepicker-toggle matSuffix [for]="datepicker"></mat-datepicker-toggle>
                  <mat-datepicker #datepicker ></mat-datepicker>
            </mat-form-field>

 

그리고, formControlName부분은 저장할때 form값 넘길때 이름이다.

 

그 다음 3번 date 포멧이다...이부분이 좀 복잡한데..

 

module.ts 파일에 넣어줘야한다.

export const MY_FORMATS = {
    display:{
        dateInput: 'YYYY/MM/DD',
        monthYearLabel : 'MMM YYYY',
    }
}

@NgModule({
    imports: [
        MatDatepickerModule,
    ],
  declarations: [DetailDialogComponent],
  providers: [
    DetailDialogService,
      {provide:MAT_DATE_LOCALE, useValue:'ko-KR'},
      {provide:MAT_DATE_FORMATS, useValue:MY_FORMATS}
  ],
  exports: [DetailDialogComponent],
  entryComponents: [DetailDialogComponent],
})
export class DetailDialogModule {}

Providers에 

{provide:MAT_DATE_LOCALE, useValue:'ko-KR'} 를 

넣으면, 포멧이 YYYY.MM.DD.로 바뀐다. 

하지만 내가 원한건, YYYY/MM/DD로 보이는거였다. 

그래서 월, 요일은  한글로 나오기를 원해서, ko-KR 그대로 두고,

혹시, 영어로 나오길 원하면, 그냥 지우던지(default 영어임), 아니면, en-US 로 바꾸면 된다.

또는 en-KR로 먹힌다.

 

여튼, locale부분은 그냥 두고, 위에 FORMAT const를 새로 만들었었다.

MY_FORMATS = {
    display:{
        dateInput: 'YYYY/MM/DD',
        monthYearLabel : 'MMM YYYY',
     }
}

여기서 dateInput은 내가 원하는 포멧이고,

monthYearLabel은 지정안하면, 아래처럼 date 데이터값 그대로 보인다.

monthYearLabel은 달력에서 달,연도가 보이는 양식이다. MMM은 lacale에 맞게 달이 보이는거다.

한글은 11월, 영어는 NOV 이렇게...

위 방법을 보고 싶으면 아래 링크 참조,

https://momentjs.com/docs/#/displaying/format/

 

M 1개만 쓰면 숫자만, 

MMM은 Jan, 줄임말

MMMM은 January 처럼 전체로 나오게 할 수 있다.

 

이정도만 되면, 내가 원하는 달력 이용법은 가능하다.

 

추가적으로 Input입력이 안되게 하려면,

https://material.angular.io/components/datepicker/overview

위 링크에서 disabling part 부분을 보면, input 입력 안되게 하는법이 있다.

 

 

Posted by Tyson
2020. 8. 20. 16:15

LG폰 V50S를 맥에서 연결해서 파일 복사하려고,  Android File Transfer를 이용해서, 내부sdcard에 접속했는데...

갑자기 안되는거다.

 

"안드로이드 기기를 찾을 수 없음" 이라고 계속뜨고......

 

다른  안드로이드 폰은 되는데, LG폰만 안되는거다.

 

이게...백업해본다고, LG Bridge 라는 프로그램을 설치했는데, 이게 문제였다.

 

LG Bridge 프로그램 절대 설치하지 말시길.....

 

이런 쓰레기 프로그램을.....아니면, uninstall 기능이라도 제대로 만들던가.....

 

LG Bridge 프로그램과, Android File Transfer는 같이 사용할 수가 없단다.

 

LG Bridge 프로그램을 설치하면서, 엘지폰 USB Driver를 설치하는데, 이게 앞으로 이 폰이 연결되면, LG Bridge만 쓰게 해놓은거다.

 

그래서 프로그램을 지우면 되야되는데... 지울때도, LG Bridge.pkg 설치 옆에 있는 Uninstall로 지우라고 한다.

근데, 저걸로 지워도, 여전히 Android Transfer에서는 연결이 안되다.

 

그래서 진짜, 라이브러리 뒤져서 다 지우고, 캐쉬지우고 별짓을 해도 안된다.

 

여기서 하는 법을 알려주겠다.

 

먼저 "Spotlight" 검색에서 터미널을 검색해서 실행한다. 

명령어 라인에 아래꺼를 쳐라.

cd /Library/Extensions
open . 

cd Library/Extensions 는 폴더로 이동한거고, 

open . 는 파인더로 폴더를 열어준다.

 

그리고, 파일 목록을 보면, 

아래처럼 "lgandroid_" 로 시작하는 파일들이 보일거다. 

그냥 싹 다 지워버리면 된다.

다 필요없다.

 

그리고, 꼭 재부팅 해야된다.

 

진짜..이거 때문에 몇시간 버린거 생각하면...

 

좀 더 까자면....폴더형으로 보는게 편한데....

 

LG Bridge라는 프로그램은 주소록,사진,메모, 이런거 클릭해서 백업할 수 있게 해주는데...

 

이게.. 도큐멘트 폴더에 ../LG Bridge/Backup/LGBackup_200000_000000.lbf 란 한 파일로 저장된다.

 

복구할때도 꼭 Bridge 프로그램을 써야된다.

 

그냥 쓰레기.... 이거 만든 사람은... 좀 더 고민해봐야한다...

 

Mac 전문 개발자가 아니고, 윈도우 개발자가 대충 공부해서 만든듯....ㅠㅠ

 

여튼, 절대 LG Bridge 프로그램은 깔지마라...

 

백업할거면....클라우드로 백업하는게 제일 낫다...

Posted by Tyson
2020. 8. 19. 11:05

저번주에 택배업 종사자들의 근로 개선을 위해 택배없는 날을 시행했다.

 

하지만, 진짜.. 계획없는 정책이였다는 생각이 든다.

 

이날 쉰다고 택배 물량이 줄어 드는것은 아니다..

 

택배업 종사자들이 쉬지않고, 힘든 이유는 한사람이 감당해야 되는 물량이 많아서 그런건데,

 

그냥 강제로 쉬게한다... ㅠㅠ 하지만, 밀린 물량을 소화하려면 그 다음주에는 더 많은 일을해야하고, 늦게까지 일을 해야한다.

 

이게 과연 맞는걸까?

 

억지로 전체를 다 쉬게 하는것보다.. 물량을 소화할 수 있는 인력을 늘리고, 그들의 일을 분산시켜줘야한다.

 

여기의 전제는 그들이 받던 보수는 유지해주면서이다...

 

택배사 임원, 대표들이 조금 덜 가져가고.. 택배 배달하는 사람들의 건당 보수를 조금 더 올려주는게 어떨까?

 

그리고, 인력을 더 늘려줘서, 한사람이 소화하는 물량을 줄여줘야한다.

 

왜 굳이 같은 날 쉬게하는가.. 본일들마다 한달에 한번 원하는날 쉬게 해주고, 그날 다른 사람이 대체해주면 되는데..

 

사람들이 쿠팡을 사용하는 이유가 멀까?

 

쿠팡이 당일 배송이 가능한 이유가 멀까? 쿠팡은 본사에서 비용을 써서라도 많은 알바생들을 고용한다.

 

그렇기 때문에 쿠팡맨들이 물량을 소화하면서 그들의 복지도 유지해 줄수있는거다.

 

대기업들이 직원들에 대한 복지를 원한다면, 그들에게 조금 더 나눠줘야할것이다.

 

 

Posted by Tyson
2020. 8. 4. 15:18

아.....

WebStorm를 무료로 쓰다가, 결국 결제해버렸다.

VSCode만 쓸때는 걔도 괜찮았는데, WebStorm를 한번쓰니...VSCode에서 안되는 몇개가 불편하드라..

 

그래서 결국 결제.....ㅠㅠ

https://www.jetbrains.com/ko-kr/webstorm/buy/#personal?billing=yearly

위 링크에서 사면 된다.

 

 연간청구는 세금빼고, $60불이다..

 

매달 결제하면, $6불이다..

아....

근데, 12개월 중단없이 구독하면, 

Perpetual Fallback License 취득 자격이 부여된다는데, 

그게 먼지 몰라서...찾아봤다.

 

연간 구독을 구매하면 해당 시점에 사용 가능한 정확한 버전에 대한 영구 대체 라이센스가 즉시 제공됩니다.

월 단위로 지불하는 경우 연속 12 개월 동안 지불하면 12 개월 연속 구독이 시작된 정확한 제품 버전에 액세스 할 수있는이 영구 대체 라이센스가 제공됩니다. 12 개월 연속으로 지불 한 모든 버전에 대해 영구 대체 라이센스가 제공됩니다.

위처럼 쓰여져 있다.

 

이 말은 구독형이긴 하지만, 

내가 산 시점의 버젼은 영구적으로 사용할 수 있다는 말이다.

 

예로, 내가 내년에는 구독을 안하면, 사용 못하는게 아니라... 업데이트 안하고, 올해 버젼까지는 평생 사용할 수 있다는 말이다.

 

결국 업데이트를 원하면, 구독 결제를 하고, 필요없으면, 그냥 한번만 사고 계속써라~ 이말인데,

 

우와...신박하다....

 

구독 같지만, 사는거고, 사는거 같지만..계속 지원 받을 수 있는 구독형인 거다.

 

진짜 머리 잘 쓴듯... 

그리고, 맨 앞에 써 있듯이 

2년차때는 $47

3년차때는 $35 

처럼 매년 20%로씩 깍아주는거다.

 

그니까, 계속 구독하라고....

JetBrains이 IDE종류별로 만들때, 비지니스 잘한다고 생각했는데,

이거를 보니..진짜 소프트웨어 비지니스 마케팅은 최고인거 같다.

 

 

그리고, 결제후, 내 어카운트에 가면,

아래처럼 볼 수 있다. 

 

여기에 Fallback ver : 2020.2 면, 나는 2020.2 버젼은 평생 쓸 수 있다는 말이다...

 

그리고 오른쪽 보면, Switch to 리스트들이 있는데, 

저거를 누르면, 지금 WebStorm에서 얼마는 더 내면, 업그레이드 할수있는지 뜬다.

"Switch to PhpStorm"를 눌러 봤다.

 

아래처럼 PhpStorm으로 업그레이드시 추가 가격이다.

이야...이거 진짜 잘한다.

첫번째 줄은, WebStorm에서 PhpStorm 1년권으로 업그레이드할때, $30불 더 필요하다는거고,

2번째 줄은 나중에 다시 설명

3번째 줄은 월정액으로 바꿨을때, 현재 나가야 되는 돈이고, 242days라고 써 있는거는,

어제 결제한, WebStorm 금액으로 PhpStorm 을 1년이 아닌, 그 금액에 맞는 일수만큼 사용하게 계산해 놓은거다.

다시, 2번째 줄로 가서... 어제 내가 하루 이용했기 때문에 그 금액에 대한 차액의 금액이다.

지금 1년권을 다시 사야되면, 앞에 이용한 금액을 빼야하기 때문이다.

 

 

어쨌든, JetBrains의 영구폴백라이선스 시스템은 사람들의 구매를 촉진시키는 좋은 마케팅인거 같다.

항상 구독제는 먼가 버리는 돈이라는 느낌이 드는데... 그래서 구독형 소프트웨어는 고민하게 되는데...

이거는 내가 업데이트 버젼을 원하지 않으면, 그냥 산거를 쓰면 되고, 

업데이트 버젼을 원하면 구독하면 되는거다~ 

 

그리고, 그 말인즉, 회사도, 매년 새로운 업데이트 버젼을 만들어서 팔겠다라는 의지를 보여주는 거다.

 

이런 방법은 나같이 요즘 구독형을 잘 안믿는 사람들한테도 좋은 선택권인거 같다.

Posted by Tyson
2020. 8. 4. 14:22

서브라임텍스트를 쓰는 이유가, 멀티커서 선택하는게 편해서 였다.

 

한꺼번에 여러 문자열 정리할때 편한데, 

전체 값 리스트에 전체 선택후, 멀티선택 단축기(시프트+커맨드+L)누르면, 

선택된 줄 맨 뒤로 커서가 생긴다. 

그래서 한꺼번에 ' <-이런 콤마같은거 쓸수있어서 좋다.

 

SublimeText 맥에서는 원하는 텍스트 선택하고, 

Shift+Command+L 누르면 됐다.

(⇧++L)

 

근데, WebStorm으로 옮기고, 그 기능이 있을텐데...

아래사진처럼 할수있는데, Option키 + 마우스 클릭 밖에 못찾겠더라...

그래서 Webstorm 설정을 다 뒤졌는데,

다중선택, 멀티커서, 를 여기서는 캐럿이라고 부르더라..

 

WebStorm -> '설정' -> '단축키'로 들어가서,

"캐럿"를 검색하면,

메인메뉴 > 편집 > "선택한 줄 끝에 캐럿 추가" 라고 있다.

여기에 원하는 단축키를 추가하면 된다.

WebStorm에서 기본은 "Option + Shift + G" 인데, 여기에 SublimeText처럼 "Shift + Command + L" 를 추가했다.

 

아....이거 찾으려고, 엄청 해맸다...

 

이제 이거만 되면, 기본적으로 Sublime에서 썼던 기능들 다 WebStorm으로 세팅함.

 

 

Posted by Tyson
2020. 7. 21. 12:50
[ERROR] An error occurred while running subprocess cordova-res.
        
        cordova-res exited with exit code 1.

아이오닉 앵귤러 안드로이드 스튜디오에서 열려고 하는데, 계속 위 같은 에러가 떠서....

찾아봅니..

위에 

[cordova-res] /Users/tyson/.nvm/versions/node/v12.14.0/lib/node_modules/cordova-res/node_modules/sharp/lib/constructor.js:34
[cordova-res]   throw new Error(error);
[cordova-res]   ^
[cordova-res] 
[cordova-res] Error: 
[cordova-res] Something went wrong installing the "sharp" module

 이런 에러가 있다.. sharp가 설치가 안되다고...

아.....yarn install로 다 설치해도 안되다..

 

cordova-res를 삭제하고 다시 실행하니까 된다.

npm uninstall -g cordova-res

npm i -g cordova-res

다시 설치 하니까.

 

/Users/tyson/.nvm/versions/node/v12.14.0/bin/cordova-res -> /Users/tyson/.nvm/versions/node/v12.14.0/lib/node_modules/cordova-res/bin/cordova-res

> sharp@0.25.4 install /Users/tyson/.nvm/versions/node/v12.14.0/lib/node_modules/cordova-res/node_modules/sharp
> (node install/libvips && node install/dll-copy && prebuild-install --runtime=napi) || (node-gyp rebuild && node install/dll-copy)

info sharp Using cached /Users/tyson/.npm/_libvips/libvips-8.9.1-darwin-x64.tar.gz
+ cordova-res@0.15.1
added 96 packages from 173 contributors in 6.514s

위처럼 설치되고, 이제 yarn cap이 먹힌다...ㅠㅠ

Posted by Tyson