PHP에서는 기본적으로 생성자 오버로딩이 되지 않는다. 다른 방법으로는 func_get_args()를 이용한 방법과 팩토리 패턴을 이용한 방법이 있는데, func_get_args()를 이용하게 되면 인수를 검사기 위해 코드가 지저분해 질 수 있다. 때문에 팩토리 패턴을 이용하는 방법을 추천한다.
팩토리 패턴을 이용
class Poo
{
protected $name;
public function __construct()
{
}
public static function withName($name)
{
$instance = new self();
$instance->setName($name);
return $instance;
}
public function setName($name)
{
$this->name = $name;
}
public function getName()
{
return $this->name;
}
}
$poo = Poo::withName('홍길동');
경험이 없기 때문에, 상황에 상관 없이 적용할 수 있는, 다시 말하면, 상황에 따라 적절하지 않을 수 있는, 조리법(recipes) 즉, context-free 한 규칙이 주어졌을 때 효과적으로 과업을 수행할 수 있다.
디버깅 기술 부족하다.
동일한 유형의 결함을 자주 반복한다.
계획을 따르지 않고 프로그램을 우연히 디버그한다.
디버깅에 상당한 시간을 소비합니다.
쉽게 포기하고 다른 도움에 의존합니다.
2 단계 : Advanced Beginners
여러 가지 상황에서 의미를 가지는 요소에 대해 인지하게 되고, 이러한 요소를 context-free 한 규칙에 더해서 활용하게 된다.
이전에 경험한 결함의 증상을 인식하고, 경험을 통해 디버깅 기술을 개발합니다.
때때로 프로그램 전체에 동일한 유형의 결함을 반복합니다.
이전의 성공과 실패를 기반으로 디버깅에 대한 접근 방식을 시작합니다.
최후의 수단으로서 익숙하지 않은 디버깅 기술을 시도합니다.
도움을 얻기 위해 다른 사람에게도 같은 정도로 의존합니다.
3 단계 : Competent
경험이 쌓이면서, 고려해야 할 요소들이 폭발적으로 증가한다. 불가피하게, 상황 하에서 어떤 요소를 중요하게 고려해야 할 지를 선택한다. 이러한 상황에 대한 모델 하에서, 상황을 분석하고 규칙에 따라 행동을 선택한다. 자신이 선택한 결과 – 성공이나 실패에 대해 책임감을 느낀다.
결과적으로 스스로 문제를 해결(troubleshoot)할 수 있다.
다양한 디버깅 기술을 알고 있습니다.
체계적으로 디버깅에 접근합니다. 상황을 평가하여 사용할 기술을 결정하십시오.
특정 기술이 효과적이지 않을 때 기술을 번갈아 사용합니다.
대부분의 결함을 독립적으로 식별합니다.
4 단계 : Proficient
Competent 단계에서 경험한 성공과 실패를 바탕으로, 상황에 따라 어떤 요소를 중요하게 고려해야 할 지를 결정한다.
어떤 요소들이 더 중요하고, 어떤 요소들이 무시해도 되는가는 경험이 추가됨에 따라 직관적으로 변화한다. 반면에, 실제로 어떤 행동을 해야 할 것인가에 대해서는 분석적인 사고를 필요로 한다.
전체적으로 프로그램 개발의 일부로 디버깅을 봅니다.
디버깅을 용이하게하기 위해 프로그램 개발의 다른 영역에서 기술을 개발합니다.
의사 결정 능력과 디버깅 접근 방식을 최적화합니다.
다른 사람들에게 도움을 요청하지 않으며 다른 사람들을 돕습니다.
5 단계 : Expert
의식적인 사고나 규칙의 필요 없이, 직관적으로 어떤 요소를 중요하게 고려해야 할 지와 어떤 행동을 해야 할 것인가를 안다.
docker build -t friendlyhello . # Create image using this directory's Dockerfile
docker run -p 4000:80 friendlyhello # Run "friendlyname" mapping port 4000 to 80
docker run -d -p 4000:80 friendlyhello # Same thing, but in detached mode
docker container ls # List all running containers
docker container ls -a # List all containers, even those not running
docker container stop <hash> # Gracefully stop the specified container
docker container kill <hash> # Force shutdown of the specified container
docker container rm <hash> # Remove specified container from this machine
docker container rm $(docker container ls -a -q) # Remove all containers
docker image ls -a # List all images on this machine
docker image rm <image id> # Remove specified image from this machine
docker image rm $(docker image ls -a -q) # Remove all images from this machine
docker login # Log in this CLI session using your Docker credentials
docker tag <image> username/repository:tag # Tag <image> for upload to registry
docker push username/repository:tag # Upload tagged image to registry
docker run username/repository:tag # Run image from a registry
Services
docker stack ls # List stacks or apps
docker stack deploy -c <composefile> <appname> # Run the specified Compose file
docker service ls # List running services associated with an app
docker service ps <service> # List tasks associated with an app
docker inspect <task or container> # Inspect task or container
docker container ls -q # List container IDs
docker stack rm <appname> # Tear down an application
docker swarm leave --force # Take down a single node swarm from the manager
Visual Studio 2017 및 Visual Studio 2015 Update 3에는 기본적으로 TypeScript가 포함되어 있습니다. Visual Studio와 함께 TypeScript를 설치하지 않았다면 다운로드 할 수 있습니다.
NPM 사용자의 경우 :
npm install -g typescript
첫 번째 TypeScript 파일 만들기
편집기에서 다음 JavaScript 코드를 입력하십시오 greeter.ts.
function greeter(person) {
return "Hello, " + person;
}
var user = "Jane User";
document.body.innerHTML = greeter(user);
코드 컴파일하기
.ts확장 기능을 사용 했지만, 이 코드는 자바스크립트입니다. 기존 자바 스크립트 앱에서 바로 복사/붙여 넣기를 할 수 있습니다.
명령 줄에서 TypeScript 컴파일러를 실행합니다.
tsc greeter.ts
실행 결과인 greeter.js 파일은 동일한 코드를 가지고 있습니다. 우리는 JavaScript 응용 프로그램에서 TypeScript를 사용하여 실행하고 있습니다!
이제 TypeScript가 제공하는 새로운 도구를 활용할 수 있습니다. 다음 : string과 같이 ‘person’함수 인수에 유형 주석을 추가 하십시오.
function greeter(person: string) {
return "Hello, " + person;
}
var user = "Jane User";
document.body.innerHTML = greeter(user);
주석 입력
TypeScript의 형식 주석은 함수 또는 변수의 의도 된 계약을 기록하는 간단한 방법입니다. 이 경우 greeter 함수를 단일 문자열 매개 변수로 호출 할 예정입니다. 대신 콜 그리터를 변경하여 배열을 전달할 수 있습니다.
function greeter(person: string) {
return "Hello, " + person;
}
var user = [0, 1, 2];
document.body.innerHTML = greeter(user);
다시 컴파일하면 오류가 표시됩니다.
error TS2345: Argument of type 'number[]' is not assignable to parameter of type 'string'.
마찬가지로 greeter 호출에 대한 모든 인수를 제거하십시오. TypeScript는 예상치 못한 수의 매개 변수로이 함수를 호출했다는 것을 알려줍니다. 두 경우 모두 TypeScript는 코드 구조와 사용자가 제공 한 형식 주석을 기반으로 정적 분석을 제공 할 수 있습니다.
에러가 있었지만 greeter.js파일은 여전히 생성됩니다. 코드에 오류가 있어도 TypeScript를 사용할 수 있습니다. 그러나이 경우 TypeScript는 코드가 예상대로 실행되지 않을 것이라고 경고합니다.
인터페이스
우리의 견본을 더 발전 시키자. 여기서는 firstName 및 lastName 필드가있는 객체를 설명하는 인터페이스를 사용합니다. TypeScript에서는 두 가지 유형이 내부 구조가 호환되면 호환됩니다. 이것은 우리가 명시 적 implements절이 없이 인터페이스가 요구하는 모양을 가짐으로써 인터페이스를 구현할 수있게 해줍니다 .
interface Person {
firstName: string;
lastName: string;
}
function greeter(person: Person) {
return "Hello, " + person.firstName + " " + person.lastName;
}
var user = { firstName: "Jane", lastName: "User" };
document.body.innerHTML = greeter(user);
수업
마지막으로 클래스를 사용하여 예제를 마지막으로 확장 해 보겠습니다. TypeScript는 클래스 기반 객체 지향 프로그래밍과 같은 JavaScript의 새로운 기능을 지원합니다.
여기 Student에서는 생성자와 몇 개의 공개 필드가 있는 클래스 를 만듭니다 . 클래스와 인터페이스가 잘 작동하여 프로그래머가 올바른 수준의 추상화를 결정할 수 있습니다.
또한 주목할 public것은 생성자 에 on 인수를 사용한다는 것은 그 이름을 가진 속성을 자동으로 만들 수있는 단축형이라는 점입니다.
class Student {
fullName: string;
constructor(public firstName: string, public middleInitial: string, public lastName: string) {
this.fullName = firstName + " " + middleInitial + " " + lastName;
}
}
interface Person {
firstName: string;
lastName: string;
}
function greeter(person : Person) {
return "Hello, " + person.firstName + " " + person.lastName;
}
var user = new Student("Jane", "M.", "User");
document.body.innerHTML = greeter(user);
재실행 tsc greeter.ts하면 생성 된 JavaScript가 이전 코드와 동일하다는 것을 알 수 있습니다. TypeScript의 클래스는 JavaScript에서 자주 사용되는 것과 동일한 프로토타입 기반 OO의 줄임말입니다.
greeter.html첫 번째 간단한 TypeScript 웹 응용 프로그램을 실행하려면 브라우저에서 엽니다 .
옵션 : greeter.tsVisual Studio에서 열거나 코드를 TypeScript 놀이터로 복사하십시오. 식별자 위로 마우스를 가져가면 유형을 볼 수 있습니다. 경우에 따라 이러한 유형이 자동으로 추론됩니다. 마지막 줄을 다시 입력하고 DOM 요소의 유형에 따라 완료 목록 및 매개 변수 도움말을 확인하십시오. greeter 함수에 대한 참조에 커서를 놓고 F12 키를 눌러 해당 정의로 이동하십시오. 기호를 마우스 오른쪽 버튼으로 클릭하고 리팩토링을 사용하여 심볼의 이름을 바꿀 수 있습니다.
제공된 유형 정보는 애플리케이션 규모에서 JavaScript로 작업 할 수있는 도구와 함께 작동합니다. TypeScript에서 가능한 모든 예제는 웹 사이트의 샘플 섹션을 참조하십시오.
If you can’t use Libsodium or defuse/php-encryption, use OpenSSL – A lot of servers will already have this installed. If not, it can be compiled with –with-openssl[=DIR]
# Stop MySQL
sudo service mysql stop
# Make MySQL service directory.
sudo mkdir /var/run/mysqld
# Give MySQL user permission to write to the service directory.
sudo chown mysql: /var/run/mysqld
# Start MySQL manually, without permission checks or networking.
sudo mysqld_safe --skip-grant-tables --skip-networking &
# Log in without a password.
mysql -uroot mysql
Update the password for the root user.
UPDATE mysql.user SET authentication_string=PASSWORD('YOURNEWPASSWORD'), plugin='mysql_native_password' WHERE User='root' AND Host='%';
EXIT;
mysql 재시작
# Turn off MySQL.
sudo mysqladmin -S /var/run/mysqld/mysqld.sock shutdown
# Start the MySQL service normally.
sudo service mysql start