Redis Flush가 안 될 경우 전체 캐시 비우기
FLUSH 명령어는 보안상 empty 값으로 대체되어있는 경우가 많은데, 이 경우 전체를 비우는 명령어가 없어서 편법을 써야한다.
해결
redis-cli -a '비밀번호' KEYS "*" | xargs redis-cli -a '비밀번호' DEL
이 명령은 모든 키 리스트를 가져와 하나씩 지워준다.
FLUSH 명령어는 보안상 empty 값으로 대체되어있는 경우가 많은데, 이 경우 전체를 비우는 명령어가 없어서 편법을 써야한다.
redis-cli -a '비밀번호' KEYS "*" | xargs redis-cli -a '비밀번호' DEL
이 명령은 모든 키 리스트를 가져와 하나씩 지워준다.
뷰에 데이터가 바인딩 되기전 {{태그}}
구문이 보일 때 다음과 같이 하면 된다.
v-cloak api에 자세하게 나와있다.
<!-- vue가 바인딩 될 영역에 v-cloak attribute를 추가한다 -->
<div id="vue_area" v-cloak></div>
[v-cloak] {
display: none;
}
로딩시에 content 영역에 loading...이라는 문구를 찍어주는 방법으로 여기에 자세히 설명되어있다.
[v-cloak] > * {
display: none;
}
[v-cloak]::before {
content: "loading...";
}
검색해 나온 포스트들은 5.4버전에 대해서만 나와있어서, 5.5에서는 아무짝에 쓸모가 없었다. 라라벨에서 좃인증을 시작해보자.
171103 기준으로 dev-develop 버전의 패키지를 설치해야한다.
composer require tymon/jwt-auth:1.0.0-rc.1
<?php
'providers' => [
...
Tymon\JWTAuth\Providers\LaravelServiceProvider::class,
],
'alias' => [
...
'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class
],
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider" --force
php artisan jwt:secret
API 가드와 유저 모델을 설정하다.
<?php
return [
'defaults' => [
'guard' => 'api', // 기본 가드를 api로 변경
'passwords' => 'users',
],
'guards' => [
...
'api' => [
'driver' => 'jwt', // api 가드를 jwt 인증을 사용
'provider' => 'users',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\Member::class, // 유저 모델을 해당 모델로 변경
],
],
...
];
<?php
...
// jwt를 모델에서 사용하기 위해 추가한다.
use Illuminate\Foundation\Auth\User as Authenticatable;
use Tymon\JWTAuth\Contracts\JWTSubject;
...
class Member extends Authenticatable implements JWTSubject
{
// 아래 두 메소드가 구현되어야 실행된다.
public function getJWTIdentifier() {
return $this->getKey();
}
public function getJWTCustomClaims() {
return [];
}
}
<?php
public function login(Request $request) {
$credentials = $this->validate($request, [
'id' => 'required|string',
'password' => 'required|string'
]);
if ($token = $this->guard()->attempt($credentials)) {
return $this->respondWithToken($token);
}
return response()->json(['message' => 'Unauthorized'], 401);
}
protected function respondWithToken($token) {
return response()->json([
'access_token' => $token,
'token_type' => 'bearer',
'expires_in' => $this->guard()->factory()->getTTL() * 60
]);
}
public function guard() {
return Auth::guard();
}
application/json 로 설정해야 오류가 예쁘게 반환된다.
## header 이용한 방법
Authorization: Bearer yourtokens...
## Querystring으로도 인증 가능
https://gracefullight.github.io/me?token=yourtokens...
Route::group(['middleware' => 'auth:api'], function() {
Route::get('member/logout', 'MemberController@logout');
Route::get('member/me', 'MemberController@me');
});
<?php
public function logout(Request $request) {
$this->guard()->logout();
return response(null, 204);
}
refresh는 auth:api 미들웨어 없이 처리되어야한다.
<?php
public function refresh() {
return $this->respondWithToken($this->guard()->refresh());
}
Expired거나 Unauthoriezed경우 status code로 체크하면 된다. 5.5버전 메뉴얼이 부족하다.
run시에 젠킨스가 올라가지 않고 /var/jenkins/home
에 파일 퍼미션 오류가 발생할 때 다음과 같이 해결하면 된다.
마운트한 볼륨에 1000 유저 권한을 준다. (jenkins의 uid는 1000) docker hub에 나와있는 내용이긴 한다.
chown 1000 {볼륨 경로}
웹 상에서 파일을 업로드할 때 md5 checksum 오류가 발생해 파일이 전체가 다 안 올라가는 경우도 있고, 세션이 만료되 올라가는 도중에 끊기기도 하는 것 같다.
업로드 할 bucket 의 이름을 조회한다.
aws s3 ls
앞이 복사할 폴더이고 뒤가 파일이 복사될 s3 bucket 경로이다.
aws s3 cp ./ s3://{bucket_name}/{path}/ --recursive --exclude "*.mp4" --acl public-read
mp4 를 제외한 폴더의 모든 하위 파일들을 public-read 권한으로 업로드했다.
cli docs에서 디테일한 옵션은 확인 가능하다.
폴링은 주변장치의 상태보존을 하지 않음, 프로그램 제어하의 직접 입출력 방식
바인딩
- 프로그램 내에서 변수 등을 실제 값으로 배정하는 것
- 명령문과 데이터를 주기억장치에 특정 위치로 옮기는 것
페이지 사상테이블 항목
- 페이지 존재 비트
- 보조 기억장치 주소
- 페이지 프레임 번호
상호 배제
- 공유자원을 어느 시점에서 단지 한 개의 프로세스만이 사용할 수 있도록 하며 다른 프로세스가 공유자원에 대해 접근하지 못하게 하는 기법
UNIX 시스템의 3가지 구성요소
- 쉘
- 커널
- 어플리케이션
프로그램 입출력의 횟수나 크기와 관계없는 공간 요구
f(n) <= cg(n)
인 조건을 만족하는 두 양의 정수 c와 n0이 존재하기만 하면 f(n) = O(g(n))이다.순서 리스트의 문제점
- 삽입 삭제시 많은 이동
- 할당 공간 부족시 재할당
- 표현방법과 기억 공간의 크기가 달라지면 컴파일부터 다시 실행
원형 연결 리스트에서 헤드 노드를 사용하는 이유 모든 원소가 환형으로 연결되어 있기 때문에 무한 루프에 빠질 수 있어 헤드 노드를 두어 리스트의 시작을 알린다.
- 이진트리에서 루트 레벨이 1로 시작할 때 레벨 i에서 최대 노드의 수는 2^(i-1) 개 이다.
- 이진트리에서 깊이가 i라면 최대 노드 수는 2^i-1개다.
interval = n/2
에서 시작해 매번 interval = interval / 2
로 interval 값이 0보다 큰 경우에 반복 수행한다.커스텀 validation을 추가해야할 때가 있다. created에 $validator 인스턴스를 확장해주면 된다.
const option = {
created: function () {
this.$validator.extend("customRule", {
getMessage: function (field, args) {
return "오류 메세지";
},
validate: function (value, args) {
// 체크 로직
return true;
},
});
},
};
모듈형태거나 전역설정이면 import { Validator } from 'vee-validate';
후에 Validator.extend
로 접근하면 된다.
추가한 룰 이름으로 v-validate 속성에 넣어주면 끝이다.
<input type="text" name="help" v-validate="'required|customRule'" />
attach 메소드로 붙히면 된다.
this.$validator.attach("help", "customRule");
다른 사용법은 공식문서를 참조하자
참조할 테이블의 PK가 increment로 정의되어 있고, 연결할 테이블의 FK가 integer로 되어있는데, SQL Syntax ERROR가 날 경우에 다음과 같이 처리하면 된다.
increment가 기본적으로 unsigned이기 때문에 외래키를 걸 컬럼이 unsigned인지 확인해보자. (컬럼 타입이 완전히 같은지 확인해보자.)
<?php
...
// FK
$table->integer('pk_id')->unsigned();
// PK
$table->increment('id');
...
ALTER TABLE CONSTRAINT FORIEN KEY
구문에 문제가 있는 줄 알고 한참 삽질