HBase를 통한 HDInsight 터치
나는 나 자신을 바꾸어 이것을 실행하려고 한다튜토리얼.
설치
아까 튜토리얼 에서 ARM 템플릿을 직접 배포할 수 있는 링크가 있기 때문에 클릭하십시오.다음은 현지에 맞게 설치해 보세요.
말해봐. 아주 간단해.참고로 HDInsight의 집단은 비용이 많이 들기 때문에 데이터는 저장 계정에 남겨두고 HDInsight만 삭제할 수 있습니다.
예의 바른 계기판까지 다 만들었다.
얼마나 세심하던지.
HBase
HBase는 Google의 Big Table에서 데이터 모델로 대량의 구조 데이터에 고속으로 접근할 수 있을 것 같다는 아이디어를 얻었다.
HBase Tutorial
Introduction to HBase Schema Design
사용 방법
얼른 써봐.
HBase Shell
hbase shell
에서 기술한 장면은 다음과 같은 절차를 이용하여 명세표를 작성하여 개념 디자인에서 체량의 부피를 분석하도록 한다.
HBase 테이블 만들기
Employee 시계를 만들어 보세요.create 'Employee', 'Personal', 'Work'
Personal, Work는 Column Family라고 불리는 것으로 열을 나누는 데 사용할 수 있습니다.
그나저나 시계를 삭제하고 싶은 상황에서disable 'Person'
drop 'Person'
이것은 방금 HBase Tutorial에서 통속적으로 쉽게 썼다.
어떤 책상이 있습니까? list
hbase(main):013:0> list
TABLE
Contacts
Contacts1
Employee
3 row(s) in 0.0100 seconds
표의 구조는 아까의 Column Family에 이르기 때문에 실제 데이터를 넣을 때 정의됩니다.put 'Employee', '1', 'Personal:Name', 'Tsuyoshi'
put 'Employee', '1', 'Personal:Age', '46'
put 'Employee', '1', 'Work:Title', 'SDE'
put 'Employee', '1', 'Work:Country', 'Japan'
결과 scan
명령hbase(main):019:0> get 'Employee', '1'
COLUMN CELL
Personal:Age timestamp=1501023224880, value=46
Personal:Name timestamp=1501023224668, value=Tsuyoshi
Work:Country timestamp=1501023225871, value=Japan
Work:Title timestamp=1501023224936, value=SDE
4 row(s) in 0.1640 seconds
HBase의 셸에서 벗어나고 싶을 때exit
.
데이터 가져오기
탭 문자로 구분된 데이터를 가져오려고 시도합니다.2 Volker Will 50 SDE Manager Germany
3 Damien Caro 42 Manager France
4 David Teser 35 SDE United States
Azure의 스토리지 계정에서 다음 명령을 실행합니다.참고로 다음 예는 hdclustersample
라는 저장 계정에서 container
라는 용기를 만들고 그 아래에서 employees.tsv
라는 파일을 만드는 예입니다.파일 형식은 hfilie입니다. 잠시 저장합니다.hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns="HBASE_ROW_KEY,Personal:Name,Personal:Age,Work:Title,Work:Country" -Dimporttsv.bulk.output="/example/data/employeesFileOutput7" Employee wasbs://[email protected]/employees.tsv
그런 다음 HBase를 가져옵니다.이것은 대량의 데이터에 유리할 것 같다.(HBase를 직접 입력하는 방법도 있습니다.)hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /example/data/employeesFileOutput7 Employee
이 조작은 나를 매혹시켰다.무슨 의미가 있는지, hbase
명령을 직접 두드리면 도움을 받을 수 있기 때문에 처음에 나는employees였다.서버에 있는 일반 파일 시스템에 tsv 파일을 지정합니다 file:///home/azureuser/employees.tsv
.그래서 FileNotFound 오류가 발생했습니다. 왜 그런지 생각하고 있습니다.
하지만 생각해보면 당연하다.Hadoop 클러스터이기 때문에 각 클러스터의 VM에 해당하는 파일 경로에 파일이 있으면 좋겠지만 그렇게 하는 것은 매우 번거롭다.따라서 집단 공유에서 접근할 수 있는 곳에만 두어야 하기 때문에 저장 계정이 가장 쉽다.hbase(main):002:0> scan 'Employee'
ROW COLUMN+CELL
1 column=Personal:Age, timestamp=1501023224880, value=46
1 column=Personal:Name, timestamp=1501023224668, value=Tsuyoshi
1 column=Work:Country, timestamp=1501023225871, value=Japan
1 column=Work:Title, timestamp=1501023224936, value=SDE
2 column=Personal:Age, timestamp=1501030594528, value=50
2 column=Personal:Name, timestamp=1501030594528, value=Volker Will
2 column=Work:Country, timestamp=1501030594528, value=Germany
2 column=Work:Title, timestamp=1501030594528, value=SDE Manager
3 column=Personal:Age, timestamp=1501030594528, value=42
3 column=Personal:Name, timestamp=1501030594528, value=Damien Caro
3 column=Work:Country, timestamp=1501030594528, value=France
3 column=Work:Title, timestamp=1501030594528, value=Manager
4 column=Personal:Age, timestamp=1501030594528, value=35
4 column=Personal:Name, timestamp=1501030594528, value=David Teser
4 column=Work:Country, timestamp=1501030594528, value=United States
4 column=Work:Title, timestamp=1501030594528, value=SDE
4 row(s) in 0.9880 seconds
숨기기 사용
그럼 Hive부터 HBase 테이블을 사용해 보세요.Beeline이라는 도구로 Hive를 사용해 보세요.beeline -u 'jdbc:hive2://localhost:10001/;transportMode=http' -n admin
다음은 하이브의 표를 작성해 보세요.실제 상황은 HBase의 표를 참조하십시오.SQL에 가까운 구문으로 액세스할 수 있습니다.CREATE EXTERNAL TABLE hbaseemployee(rowkey STRING, name STRING, age STRING, title STRING, country STRING)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ('hbase.columns.mapping' = ':key,Personal:Name,Personal:Age,Work:Title,Work:Country')
TBLPROPERTIES ('hbase.table.name' = 'Employee');
검색해봐.집단 사용을 잊어버렸네. select * from hbaseemployee;
+-----------------------+---------------------+--------------------+----------------------+------------------------+--+
| hbaseemployee.rowkey | hbaseemployee.name | hbaseemployee.age | hbaseemployee.title | hbaseemployee.country |
+-----------------------+---------------------+--------------------+----------------------+------------------------+--+
| 1 | Tsuyoshi | 46 | SDE | Japan |
| 2 | Volker Will | 50 | SDE Manager | Germany |
| 3 | Damien Caro | 42 | Manager | France |
| 4 | David Teser | 35 | SDE | United States |
+-----------------------+---------------------+--------------------+----------------------+------------------------+--+
벨린을 통과한 것은 !exit
.!exit
REST API를 사용하여 클러스터 작업
List
REST API를 통해 HBase 테이블을 조작할 수도 있습니다.가령 hdcluster
은 HDInsight의 클러스터 이름이고 azureuser
는 클러스터를 생성할 때 사용자 이름이며 SomePassW@rd
은 암호입니다.$ curl -u azureuser:SomePassW@rd -G https://hdcluster.azurehdinsight.net/hbaserest/
Contacts
Contacts1
Employee
Create table
시계의 일람표를 얻었다.마찬가지로 제작Employee2
의 표.참고로 Column Family로서 Personal, Work를 지정했습니다.curl -u azureuser:SomePassW@rd \
-X PUT "https://hdcluster.azurehdinsight.net/hbaserest/Employee2/schema" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d "{\"@name\":\"Employee2\",\"ColumnSchema\":[{\"name\":\"Personal\"},{\"name\":\"Work\"}]}" \
-v
Put data
다음은 데이터를 기입하세요.겸사겸사 말씀드리지만 도중에 나타난 것은 다음과 같은 상황입니다.데이터는 Base64로 작성해야 합니다.Introduction to HBase Schema Design 중 하나는 왜 이런 힌트를 줄 수 있는지.RowID 길이가 변경되면 성능 문제가 식별되지 않으므로 키에 산열을 사용하지만 여기에서는 Base64 인코딩이므로 이와 무관합니다.
Base64 는 Base64 Encode Decode 로 변환됩니다.curl -u azureuser:SomePassW@rd \
-X PUT "https://hdcluster.azurehdinsight.net/hbaserest/Employee2/false-row-key" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d "{\"Row\":[{\"key\":\"MTA=\",\"Cell\": [{\"column\":\"UGVyc29uYWw6TmFtZQ==\", \"$\":\"VHN1eW9zaGkgVXNoaW8=\"}]}]}" \
-v
Select data
얻는 것도 간단해!curl -u azureuser:SomePassW@rd \
-X GET "https://hdcluster.azurehdinsight.net/hbaserest/Employee2/10" \
-H "Accept: application/json" \
-v
* Connection #0 to host hdcluster.azurehdinsight.net left intact
{"Row":[{"key":"MTA=","Cell":[{"column":"UGVyc29uYWw6TmFtZQ==","timestamp":1501032073321,"$":"VHN1eW9zaGkgVXNoaW8="}]}]}
HDInsight는 그렇게 많은 것을 알 필요가 없기 때문에 내일부터 다시 평범한 하크로 돌아간다.
Reference
이 문제에 관하여(HBase를 통한 HDInsight 터치), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/TsuyoshiUshio@github/items/97ed85cb2bcde278bd9a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
HBase는 Google의 Big Table에서 데이터 모델로 대량의 구조 데이터에 고속으로 접근할 수 있을 것 같다는 아이디어를 얻었다.
HBase Tutorial
Introduction to HBase Schema Design
사용 방법
얼른 써봐.
HBase Shell
hbase shell
에서 기술한 장면은 다음과 같은 절차를 이용하여 명세표를 작성하여 개념 디자인에서 체량의 부피를 분석하도록 한다.
HBase 테이블 만들기
Employee 시계를 만들어 보세요.create 'Employee', 'Personal', 'Work'
Personal, Work는 Column Family라고 불리는 것으로 열을 나누는 데 사용할 수 있습니다.
그나저나 시계를 삭제하고 싶은 상황에서disable 'Person'
drop 'Person'
이것은 방금 HBase Tutorial에서 통속적으로 쉽게 썼다.
어떤 책상이 있습니까? list
hbase(main):013:0> list
TABLE
Contacts
Contacts1
Employee
3 row(s) in 0.0100 seconds
표의 구조는 아까의 Column Family에 이르기 때문에 실제 데이터를 넣을 때 정의됩니다.put 'Employee', '1', 'Personal:Name', 'Tsuyoshi'
put 'Employee', '1', 'Personal:Age', '46'
put 'Employee', '1', 'Work:Title', 'SDE'
put 'Employee', '1', 'Work:Country', 'Japan'
결과 scan
명령hbase(main):019:0> get 'Employee', '1'
COLUMN CELL
Personal:Age timestamp=1501023224880, value=46
Personal:Name timestamp=1501023224668, value=Tsuyoshi
Work:Country timestamp=1501023225871, value=Japan
Work:Title timestamp=1501023224936, value=SDE
4 row(s) in 0.1640 seconds
HBase의 셸에서 벗어나고 싶을 때exit
.
데이터 가져오기
탭 문자로 구분된 데이터를 가져오려고 시도합니다.2 Volker Will 50 SDE Manager Germany
3 Damien Caro 42 Manager France
4 David Teser 35 SDE United States
Azure의 스토리지 계정에서 다음 명령을 실행합니다.참고로 다음 예는 hdclustersample
라는 저장 계정에서 container
라는 용기를 만들고 그 아래에서 employees.tsv
라는 파일을 만드는 예입니다.파일 형식은 hfilie입니다. 잠시 저장합니다.hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns="HBASE_ROW_KEY,Personal:Name,Personal:Age,Work:Title,Work:Country" -Dimporttsv.bulk.output="/example/data/employeesFileOutput7" Employee wasbs://[email protected]/employees.tsv
그런 다음 HBase를 가져옵니다.이것은 대량의 데이터에 유리할 것 같다.(HBase를 직접 입력하는 방법도 있습니다.)hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /example/data/employeesFileOutput7 Employee
이 조작은 나를 매혹시켰다.무슨 의미가 있는지, hbase
명령을 직접 두드리면 도움을 받을 수 있기 때문에 처음에 나는employees였다.서버에 있는 일반 파일 시스템에 tsv 파일을 지정합니다 file:///home/azureuser/employees.tsv
.그래서 FileNotFound 오류가 발생했습니다. 왜 그런지 생각하고 있습니다.
하지만 생각해보면 당연하다.Hadoop 클러스터이기 때문에 각 클러스터의 VM에 해당하는 파일 경로에 파일이 있으면 좋겠지만 그렇게 하는 것은 매우 번거롭다.따라서 집단 공유에서 접근할 수 있는 곳에만 두어야 하기 때문에 저장 계정이 가장 쉽다.hbase(main):002:0> scan 'Employee'
ROW COLUMN+CELL
1 column=Personal:Age, timestamp=1501023224880, value=46
1 column=Personal:Name, timestamp=1501023224668, value=Tsuyoshi
1 column=Work:Country, timestamp=1501023225871, value=Japan
1 column=Work:Title, timestamp=1501023224936, value=SDE
2 column=Personal:Age, timestamp=1501030594528, value=50
2 column=Personal:Name, timestamp=1501030594528, value=Volker Will
2 column=Work:Country, timestamp=1501030594528, value=Germany
2 column=Work:Title, timestamp=1501030594528, value=SDE Manager
3 column=Personal:Age, timestamp=1501030594528, value=42
3 column=Personal:Name, timestamp=1501030594528, value=Damien Caro
3 column=Work:Country, timestamp=1501030594528, value=France
3 column=Work:Title, timestamp=1501030594528, value=Manager
4 column=Personal:Age, timestamp=1501030594528, value=35
4 column=Personal:Name, timestamp=1501030594528, value=David Teser
4 column=Work:Country, timestamp=1501030594528, value=United States
4 column=Work:Title, timestamp=1501030594528, value=SDE
4 row(s) in 0.9880 seconds
숨기기 사용
그럼 Hive부터 HBase 테이블을 사용해 보세요.Beeline이라는 도구로 Hive를 사용해 보세요.beeline -u 'jdbc:hive2://localhost:10001/;transportMode=http' -n admin
다음은 하이브의 표를 작성해 보세요.실제 상황은 HBase의 표를 참조하십시오.SQL에 가까운 구문으로 액세스할 수 있습니다.CREATE EXTERNAL TABLE hbaseemployee(rowkey STRING, name STRING, age STRING, title STRING, country STRING)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ('hbase.columns.mapping' = ':key,Personal:Name,Personal:Age,Work:Title,Work:Country')
TBLPROPERTIES ('hbase.table.name' = 'Employee');
검색해봐.집단 사용을 잊어버렸네. select * from hbaseemployee;
+-----------------------+---------------------+--------------------+----------------------+------------------------+--+
| hbaseemployee.rowkey | hbaseemployee.name | hbaseemployee.age | hbaseemployee.title | hbaseemployee.country |
+-----------------------+---------------------+--------------------+----------------------+------------------------+--+
| 1 | Tsuyoshi | 46 | SDE | Japan |
| 2 | Volker Will | 50 | SDE Manager | Germany |
| 3 | Damien Caro | 42 | Manager | France |
| 4 | David Teser | 35 | SDE | United States |
+-----------------------+---------------------+--------------------+----------------------+------------------------+--+
벨린을 통과한 것은 !exit
.!exit
REST API를 사용하여 클러스터 작업
List
REST API를 통해 HBase 테이블을 조작할 수도 있습니다.가령 hdcluster
은 HDInsight의 클러스터 이름이고 azureuser
는 클러스터를 생성할 때 사용자 이름이며 SomePassW@rd
은 암호입니다.$ curl -u azureuser:SomePassW@rd -G https://hdcluster.azurehdinsight.net/hbaserest/
Contacts
Contacts1
Employee
Create table
시계의 일람표를 얻었다.마찬가지로 제작Employee2
의 표.참고로 Column Family로서 Personal, Work를 지정했습니다.curl -u azureuser:SomePassW@rd \
-X PUT "https://hdcluster.azurehdinsight.net/hbaserest/Employee2/schema" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d "{\"@name\":\"Employee2\",\"ColumnSchema\":[{\"name\":\"Personal\"},{\"name\":\"Work\"}]}" \
-v
Put data
다음은 데이터를 기입하세요.겸사겸사 말씀드리지만 도중에 나타난 것은 다음과 같은 상황입니다.데이터는 Base64로 작성해야 합니다.Introduction to HBase Schema Design 중 하나는 왜 이런 힌트를 줄 수 있는지.RowID 길이가 변경되면 성능 문제가 식별되지 않으므로 키에 산열을 사용하지만 여기에서는 Base64 인코딩이므로 이와 무관합니다.
Base64 는 Base64 Encode Decode 로 변환됩니다.curl -u azureuser:SomePassW@rd \
-X PUT "https://hdcluster.azurehdinsight.net/hbaserest/Employee2/false-row-key" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d "{\"Row\":[{\"key\":\"MTA=\",\"Cell\": [{\"column\":\"UGVyc29uYWw6TmFtZQ==\", \"$\":\"VHN1eW9zaGkgVXNoaW8=\"}]}]}" \
-v
Select data
얻는 것도 간단해!curl -u azureuser:SomePassW@rd \
-X GET "https://hdcluster.azurehdinsight.net/hbaserest/Employee2/10" \
-H "Accept: application/json" \
-v
* Connection #0 to host hdcluster.azurehdinsight.net left intact
{"Row":[{"key":"MTA=","Cell":[{"column":"UGVyc29uYWw6TmFtZQ==","timestamp":1501032073321,"$":"VHN1eW9zaGkgVXNoaW8="}]}]}
HDInsight는 그렇게 많은 것을 알 필요가 없기 때문에 내일부터 다시 평범한 하크로 돌아간다.
Reference
이 문제에 관하여(HBase를 통한 HDInsight 터치), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/TsuyoshiUshio@github/items/97ed85cb2bcde278bd9a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
hbase shell
create 'Employee', 'Personal', 'Work'
disable 'Person'
drop 'Person'
hbase(main):013:0> list
TABLE
Contacts
Contacts1
Employee
3 row(s) in 0.0100 seconds
put 'Employee', '1', 'Personal:Name', 'Tsuyoshi'
put 'Employee', '1', 'Personal:Age', '46'
put 'Employee', '1', 'Work:Title', 'SDE'
put 'Employee', '1', 'Work:Country', 'Japan'
hbase(main):019:0> get 'Employee', '1'
COLUMN CELL
Personal:Age timestamp=1501023224880, value=46
Personal:Name timestamp=1501023224668, value=Tsuyoshi
Work:Country timestamp=1501023225871, value=Japan
Work:Title timestamp=1501023224936, value=SDE
4 row(s) in 0.1640 seconds
2 Volker Will 50 SDE Manager Germany
3 Damien Caro 42 Manager France
4 David Teser 35 SDE United States
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns="HBASE_ROW_KEY,Personal:Name,Personal:Age,Work:Title,Work:Country" -Dimporttsv.bulk.output="/example/data/employeesFileOutput7" Employee wasbs://[email protected]/employees.tsv
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /example/data/employeesFileOutput7 Employee
hbase(main):002:0> scan 'Employee'
ROW COLUMN+CELL
1 column=Personal:Age, timestamp=1501023224880, value=46
1 column=Personal:Name, timestamp=1501023224668, value=Tsuyoshi
1 column=Work:Country, timestamp=1501023225871, value=Japan
1 column=Work:Title, timestamp=1501023224936, value=SDE
2 column=Personal:Age, timestamp=1501030594528, value=50
2 column=Personal:Name, timestamp=1501030594528, value=Volker Will
2 column=Work:Country, timestamp=1501030594528, value=Germany
2 column=Work:Title, timestamp=1501030594528, value=SDE Manager
3 column=Personal:Age, timestamp=1501030594528, value=42
3 column=Personal:Name, timestamp=1501030594528, value=Damien Caro
3 column=Work:Country, timestamp=1501030594528, value=France
3 column=Work:Title, timestamp=1501030594528, value=Manager
4 column=Personal:Age, timestamp=1501030594528, value=35
4 column=Personal:Name, timestamp=1501030594528, value=David Teser
4 column=Work:Country, timestamp=1501030594528, value=United States
4 column=Work:Title, timestamp=1501030594528, value=SDE
4 row(s) in 0.9880 seconds
beeline -u 'jdbc:hive2://localhost:10001/;transportMode=http' -n admin
CREATE EXTERNAL TABLE hbaseemployee(rowkey STRING, name STRING, age STRING, title STRING, country STRING)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ('hbase.columns.mapping' = ':key,Personal:Name,Personal:Age,Work:Title,Work:Country')
TBLPROPERTIES ('hbase.table.name' = 'Employee');
select * from hbaseemployee;
+-----------------------+---------------------+--------------------+----------------------+------------------------+--+
| hbaseemployee.rowkey | hbaseemployee.name | hbaseemployee.age | hbaseemployee.title | hbaseemployee.country |
+-----------------------+---------------------+--------------------+----------------------+------------------------+--+
| 1 | Tsuyoshi | 46 | SDE | Japan |
| 2 | Volker Will | 50 | SDE Manager | Germany |
| 3 | Damien Caro | 42 | Manager | France |
| 4 | David Teser | 35 | SDE | United States |
+-----------------------+---------------------+--------------------+----------------------+------------------------+--+
!exit
$ curl -u azureuser:SomePassW@rd -G https://hdcluster.azurehdinsight.net/hbaserest/
Contacts
Contacts1
Employee
curl -u azureuser:SomePassW@rd \
-X PUT "https://hdcluster.azurehdinsight.net/hbaserest/Employee2/schema" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d "{\"@name\":\"Employee2\",\"ColumnSchema\":[{\"name\":\"Personal\"},{\"name\":\"Work\"}]}" \
-v
curl -u azureuser:SomePassW@rd \
-X PUT "https://hdcluster.azurehdinsight.net/hbaserest/Employee2/false-row-key" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d "{\"Row\":[{\"key\":\"MTA=\",\"Cell\": [{\"column\":\"UGVyc29uYWw6TmFtZQ==\", \"$\":\"VHN1eW9zaGkgVXNoaW8=\"}]}]}" \
-v
curl -u azureuser:SomePassW@rd \
-X GET "https://hdcluster.azurehdinsight.net/hbaserest/Employee2/10" \
-H "Accept: application/json" \
-v
* Connection #0 to host hdcluster.azurehdinsight.net left intact
{"Row":[{"key":"MTA=","Cell":[{"column":"UGVyc29uYWw6TmFtZQ==","timestamp":1501032073321,"$":"VHN1eW9zaGkgVXNoaW8="}]}]}
Reference
이 문제에 관하여(HBase를 통한 HDInsight 터치), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/TsuyoshiUshio@github/items/97ed85cb2bcde278bd9a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)