lsのソースコードを読む 2017

lsのソースコードを読んでみたくなったのでメモ。
lsコマンドをハックしてみよう - Yahoo! JAPAN Tech Blog

lsのソースを読みました - mfumiの日記

https://svnweb.freebsd.org/base/head/bin/ls/

当初の目標
- Visual Studio Codeでステップ実行
- ソースを書き換えてファイル名がabc.txtのファイルは表示しないようにする

色々試してMacOS Sierra 10.12.2 とxcodeでビルドとステップ実行ができたので、
Visual Studio Codeじゃなくてxcodeにした。

https://opensource.apple.com/

ファイルの取得

MacOSのlsコマンドのソースコードを取得する。
自分のMac(Sierra 10.12.2)
file_cmds-242.tar.gz
をダウンロード。
https://opensource.apple.com/tarballs/file_cmds/file_cmds-264.30.2.tar.gz

後で、
libutil-47.30.1 と Libinfo-503.30.1
も必要になった。

xcode

AppStoreから無料ダウンロード。

cocoa - Unable to build using Xcode 4 - The selected run destination is not valid for this action - Stack Overflow

ls ビルド設定 (Build Settings)

Project navigator トップ(root)の file_cmds をクリック。
2段目のfile_cmdsをクリックしてlsを選択。
f:id:kubotti:20170120153242p:plain

Debug構成

Project navigator トップ(root)の file_cmds をクリック。 2段目でfile_cmdsを選択。
Info > Configurations
で + をクリックして、Duplicate
Debugという構成を作成。
optimization
 

エラー

何回かやっていたら以下のエラーが出た。

The run destination My Mac is not valid for Running

Build Settings
Base SDKmacOS 10.12
に変更。

ClipStudioPluginSDKのビルドが出来ない[mac] - Qiita

membershipPriv.h not found

ビルドしたらエラーが出た。

/Users/kubotad/codes/ls/file_cmds-264.30.2/ls/print.c:56:10: 'membershipPriv.h' file not found

EI Capitanでsudo付けているOperation not permittedが出た時の対処法 - いつかエンジニアになりたい

https://opensource.apple.com/release/macos-10122.html
libutil-47.30.1 と Libinfo-503.30.1
をダウンロード。
解凍
http://www.ict-fractal.com/blog/2012/07/xcode.html

Search Pathsに追記

2.Build Settingsの一覧が表示されますので、Search PathsカテゴリのHeader Search Pathsという項目を見つけて下さい。

3. Header Search Pathsをダブルクリックすると項目の編集画面が開きます。
 編集画面で+ボタンをクリックすると項目が追加されますので、そこにパスを入力して下さい。
 ※パスはダブルクォーテーションで括りましょう。

Header Search Path
"../Libinfo-503.30.1/membership.subproj"
"../libutil-47.30.1"

How do I use a relative path in Xcode project settings? - Stack Overflow

実行ファイル出力先

Project navigator
に Products というディレクトリ的なものが表示されているけど実物はない。
詳細の Full Pathに以下のPathと書いてあった。

~/Library/Developer/Xcode/DerivedData/file_cmds-bocccevvdifphpdyuxszwxcbgtxo/Build/Products/Release

実行時引数

http://stackoverflow.com/questions/1698830/giving-command-line-arguments-in-xcode-in-c-program

Keyboard shortcut is 
command  shift <

メニューの
Product > Scheme > Edit Scheme...

ステップ実行のためのoptimization変更

ls was compiled with optimization - stepping may behave oddly; variables may not be available.

Optimization Level
BasicじゃなくてAllにしないと表示されない。

f:id:kubotti:20170120170909p:plain

メニューの
Product > Scheme > Edit Scheme...
で Run > Info > Build Configuration
をDebugに変更。

ls was compiled with optimization
のメッセージが消えた。

ソースコード書き換え

Linked lists - Learn C - Free Interactive C Tutorial

 // kubotti customize
    FTSENT *cur_temp = NULL;
    for (cur = list; cur; cur = cur->fts_link) {
        if (!strcmp(cur->fts_name, "kubotti.txt")){
            if(cur_temp == NULL){
                list = cur->fts_link;
                //free(cur);
            }else{
                cur_temp->fts_link = cur->fts_link;
            }
        }
        cur_temp = cur;
    }

code modification. not display if the name is kubotti.txt · kubotti/ls_cmd_mod@816e9a6 · GitHub

動作確認

~/Library/Developer/Xcode/DerivedData/file_cmds-boccc ....
にできたlsの実行ファイルを適当なディレクトリにコピー。

./ls /tmp/dir1

で実行。

kubotti.txt というファイルは表示しないlsコマンドができた。

f:id:kubotti:20170120231443p:plain

以上、終了。

(メモ)Visual Studio Code

最初にVisual Studio Codeを試した時のメモ。

.tar.gzを解凍して、Visual Studio Codeで開いた。
C/C++ extensionをインストールすることを推奨 と出たので、インストール。
ms-vscode.cpptools publisher:"Microsoft"

launch.json
"program": "enter program name, for example ${workspaceRoot}/a.out",

ソースの取得

https://opensource.apple.com/release/os-x-10105.html

file_cmds-242.tar.gz (Yosemite 10.10.5)
を解凍したけど、 にMakefileがない。

https://opensource.apple.com/source/file_cmds/file_cmds-188/ls/Makefile にはあるけど。

https://opensource.apple.com/source/file_cmds/file_cmds-212/Makefileがある中で一番数字が大きい。

ls/mac212% make
Makefile:16: /Library/Developer/CommandLineTools/Makefiles/CoreOS/ReleaseControl/BSDCommon.make: No such file or directory
make: *** No rule to make target `/Library/Developer/CommandLineTools/Makefiles/CoreOS/ReleaseControl/BSDCommon.make'.  Stop.

AWS Lambda エラーメモ1

作成したLambda + API Gatewayにアクセスしたら以下のエラー。

{"message":"Missing Authentication Token"}

Lambda管理画面のTriggers で、
既存のものを削除して作り直したら、エラーが出ずに正常に実行された。

エラー2

Lambda > Functions > funcName
Triggers
Add trigger

API Gatewayを選んで作成しようとしたら、以下のエラー。

There was an error creating the trigger: An integration is already present on this method

API nameは、プルダウンから選べるけど、そのままSubmitするとこのエラーが出るっぽい。
新しい名前で作ると、API Gatewayの管理画面で一覧に表示される。

とりあえずserverlessでpythonを試してみる

npmのインストール

なんかインストール方法が複数あるっぽいけど、
nodebrewというのを入れるのがよさげだったのでそれにしてみる。
(会社のmacにはanyenvというのが入っていた)

http://www.hirooooo-lab.com/entry/development/install-node

brew install nodebrew

nodebrew ls-remote
nodebrew install-binary v6.9.4

インストールに失敗した。

% nodebrew install-binary v6.9.4
Fetching: https://nodejs.org/dist/v6.9.4/node-v6.9.4-darwin-x64.tar.gz
Warning: Failed to create the file 
Warning: /Users/kubotad/.nodebrew/src/v6.9.4/node-v6.9.4-darwin-x64.tar.gz: No 
Warning: such file or directory

curl: (23) Failed writing body (0 != 941)
download failed: https://nodejs.org/dist/v6.9.4/node-v6.9.4-darwin-x64.tar.gz

ディレクトリを作ったらうまく行った。おかしい。

mkdir -p ~/.nodebrew/src

% nodebrew install-binary v6.9.4
Fetching: https://nodejs.org/dist/v6.9.4/node-v6.9.4-darwin-x64.tar.gz
######################################################################## 100.0%
Installed successfully

パスを通す。

echo 'export PATH=$PATH:~/.nodebrew/current/bin' >> ~/.zshrc
% source ~/.zshrc

% nodebrew use v6.9.4                                         
use v6.9.4

バージョン確認

% node -v
v6.9.4
% npm -v
3.10.10

https://nodejs.org/
から.pkgをダウンロードしてインストールでもいいような気がする。

anyenvのndenvの場合

インストール可能バージョンの一覧

ndenv install -l
# install
ndenv install v6.9.4
# installed list
ndenv versions
# switch
ndenv global v6.9.4

serverlessのインストール

# Install serverless globally
npm install serverless -g
% npm install serverless -g
/Users/kubotad/.nodebrew/node/v6.9.4/bin/serverless -> /Users/kubotad/.nodebrew/node/v6.9.4/lib/node_modules/serverless/bin/serverless
/Users/kubotad/.nodebrew/node/v6.9.4/bin/sls -> /Users/kubotad/.nodebrew/node/v6.9.4/lib/node_modules/serverless/bin/serverless
/Users/kubotad/.nodebrew/node/v6.9.4/bin/slss -> /Users/kubotad/.nodebrew/node/v6.9.4/lib/node_modules/serverless/bin/serverless

> serverless@1.5.0 postinstall /Users/kubotad/.nodebrew/node/v6.9.4/lib/node_modules/serverless
> node ./scripts/postinstall.js

/Users/kubotad/.nodebrew/node/v6.9.4/lib
└─┬ serverless@1.5.0 
  ├─┬ agent-base@2.0.1 
  │ └── semver@5.0.3 
  ├── ansi-regex@2.0.0 
  ├── ansi-styles@2.2.1 
  ├─┬ archiver@1.2.0 
  │ └── async@2.1.4 
  ├── archiver-utils@1.3.0 
  ├── argparse@1.0.9 
  ├── async@1.5.2 
  ├─┬ aws-sdk@2.7.13 
  │ └── uuid@3.0.0 
  ├── balanced-match@0.4.2 
  ├── base64-js@1.2.0 
  ├─┬ bl@1.1.2 
  │ └── readable-stream@2.0.6 
  ├── bluebird@3.4.6 
  ├── brace-expansion@1.1.6 
  ├── buffer@4.9.1 
  ├── buffer-crc32@0.2.13 
  ├── buffer-shims@1.0.0 
  ├── capture-stack-trace@1.0.0 
  ├── caw@2.0.0 
  ├── chalk@1.1.3 
  ├── combined-stream@1.0.5 
  ├── commander@2.8.1 
  ├── component-emitter@1.2.1 
  ├── compress-commons@1.1.0 
  ├── concat-map@0.0.1 
  ├── cookiejar@2.0.6 
  ├── core-util-is@1.0.2 
  ├── crc32-stream@1.0.0 
  ├── create-error-class@3.0.2 
  ├── crypto-browserify@1.0.9 
  ├── debug@2.3.3 
  ├── decompress@4.0.0 
  ├── decompress-tar@4.1.0 
  ├── decompress-tarbz2@4.1.0 
  ├── decompress-targz@4.0.0 
  ├── decompress-unzip@4.0.1 
  ├── deep-extend@0.4.1 
  ├── delayed-stream@1.0.0 
  ├── download@5.0.2 
  ├── duplexer3@0.1.4 
  ├── encoding@0.1.12 
  ├─┬ end-of-stream@1.1.0 
  │ └── once@1.3.3 
  ├── escape-string-regexp@1.0.5 
  ├── esprima@2.7.3 
  ├── extend@3.0.0 
  ├── fd-slicer@1.0.1 
  ├── file-type@3.9.0 
  ├── filename-reserved-regex@1.0.0 
  ├── filenamify@1.2.1 
  ├── filesize@3.3.0 
  ├── form-data@1.0.0-rc3 
  ├── formidable@1.0.17 
  ├── fs-extra@0.26.7 
  ├── fs.realpath@1.0.0 
  ├── get-proxy@1.1.0 
  ├── get-stdin@5.0.1 
  ├── get-stream@2.3.1 
  ├── glob@7.1.1 
  ├── glob-all@3.1.0 
  ├── got@6.6.3 
  ├── graceful-fs@4.1.11 
  ├── graceful-readlink@1.0.1 
  ├── has-ansi@2.0.0 
  ├── https-proxy-agent@1.0.0 
  ├── iconv-lite@0.4.15 
  ├── ieee754@1.1.8 
  ├── inflight@1.0.6 
  ├── inherits@2.0.3 
  ├── ini@1.3.4 
  ├── is-absolute@0.1.7 
  ├── is-natural-number@2.1.1 
  ├── is-redirect@1.0.0 
  ├── is-relative@0.1.3 
  ├── is-retry-allowed@1.1.0 
  ├── is-stream@1.1.0 
  ├── isarray@1.0.0 
  ├── jmespath@0.15.0 
  ├── js-yaml@3.7.0 
  ├─┬ json-refs@2.1.6 
  │ └── commander@2.9.0 
  ├── jsonfile@2.4.0 
  ├── klaw@1.3.1 
  ├── lazystream@1.0.0 
  ├── lodash@4.17.2 
  ├── lowercase-keys@1.0.0 
  ├── methods@1.1.2 
  ├── mime@1.3.4 
  ├── mime-db@1.25.0 
  ├── mime-types@2.1.13 
  ├── minimatch@3.0.3 
  ├── minimist@1.2.0 
  ├─┬ mkdirp@0.5.1 
  │ └── minimist@0.0.8 
  ├── moment@2.17.0 
  ├── ms@0.7.2 
  ├── native-promise-only@0.8.1 
  ├── node-fetch@1.6.3 
  ├── node-status-codes@2.0.1 
  ├── normalize-path@2.0.1 
  ├── object-assign@4.1.0 
  ├── once@1.4.0 
  ├── path-is-absolute@1.0.1 
  ├── path-loader@1.0.1 
  ├── pend@1.2.0 
  ├── pify@2.3.0 
  ├── pinkie@2.0.4 
  ├── pinkie-promise@2.0.1 
  ├── prepend-http@1.0.4 
  ├── process-nextick-args@1.0.7 
  ├── punycode@1.3.2 
  ├── qs@2.3.3 
  ├── querystring@0.2.0 
  ├── rc@1.1.6 
  ├── readable-stream@2.2.2 
  ├── reduce-component@1.0.1 
  ├── replaceall@0.1.6 
  ├── rimraf@2.5.4 
  ├── sax@1.1.5 
  ├── seek-bzip@1.0.5 
  ├── semver@5.3.0 
  ├── semver-regex@1.0.0 
  ├── shelljs@0.6.1 
  ├── slash@1.0.0 
  ├── sprintf-js@1.0.3 
  ├── string_decoder@0.10.31 
  ├── strip-ansi@3.0.1 
  ├─┬ strip-dirs@1.1.1 
  │ └── get-stdin@4.0.1 
  ├── strip-json-comments@1.0.4 
  ├── strip-outer@1.0.0 
  ├── sum-up@1.0.3 
  ├─┬ superagent@1.8.4 
  │ ├── isarray@0.0.1 
  │ └── readable-stream@1.0.27-1 
  ├── supports-color@2.0.0 
  ├── tar-stream@1.5.2 
  ├── through@2.3.8 
  ├── timed-out@3.0.0 
  ├── traverse@0.6.6 
  ├── trim-repeated@1.0.0 
  ├── tunnel-agent@0.4.3 
  ├─┬ unbzip2-stream@1.0.10 
  │ ├── base64-js@0.0.8 
  │ └── buffer@3.6.0 
  ├── unzip-response@2.0.1 
  ├── uri-js@2.1.1 
  ├── url@0.10.3 
  ├── url-parse-lax@1.0.0 
  ├── util-deprecate@1.0.2 
  ├── uuid@2.0.3 
  ├── wrappy@1.0.2 
  ├── xml2js@0.4.15 
  ├─┬ xmlbuilder@2.6.2 
  │ └── lodash@3.5.0 
  ├── xtend@4.0.1 
  ├─┬ yargs@1.2.6 
  │ └── minimist@0.1.0 
  ├── yauzl@2.7.0 
  └── zip-stream@1.1.0 

https://serverless.com/
のトップページに載っていたコマンドを入力してみる。

serverless create --template aws-nodejs

% ll
total 24
drwxr-xr-x   5 kubotad  staff   170  1 12 14:47 ./
drwx------@ 10 kubotad  staff   340  1 12 01:10 ../
-rw-r--r--   1 kubotad  staff    86  1 12 01:10 .npmignore
-rw-r--r--   1 kubotad  staff   466  1 12 01:10 handler.js
-rw-r--r--   1 kubotad  staff  2410  1 12 01:10 serverless.yml

とりあえずインストールできた。

デプロイ

AWS IAMでアクセスキーを作成。

https://serverless.com/framework/docs/providers/aws/guide/credentials/

serverless config credentials --provider aws --key AKIAIOSFODNN7EXAMPLE --secret wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
% serverless deploy

 Error --------------------------------------------------
 
     ServerlessError: ServerlessError: User: arn:aws:iam
     is not authorized to perform: cloudformation:DescribeStackResources

https://github.com/serverless/serverless/issues/588

  Serverless Error ---------------------------------------
 
     An error occurred while provisioning your stack: ServerlessDeploymentBucket
     - API: s3:CreateBucket Access Denied.

kubotad_lambda_inline_policy - Inline policy

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cloudformation:Describe*",
                "cloudformation:List*",
                "cloudformation:Get*",
                "cloudformation:PreviewStackUpdate"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "cloudformation:CreateStack",
                "cloudformation:UpdateStack",
                "cloudformation:DeleteStack"
            ],
            "Resource": "arn:aws:cloudformation:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "lambda:Get*",
                "lambda:List*",
                "lambda:CreateFunction"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "lambda:AddPermission",
                "lambda:CreateAlias",
                "lambda:DeleteFunction",
                "lambda:InvokeFunction",
                "lambda:PublishVersion",
                "lambda:RemovePermission",
                "lambda:Update*"
            ],
            "Resource": "arn:aws:lambda:*:*:function:${project}*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:PassRole"
            ],
            "Resource": "arn:aws:iam::*:role/${project}*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "apigateway:GET"
            ],
            "Resource": "arn:aws:apigateway:*::/restapis"
        },
        {
            "Effect": "Allow",
            "Action": [
                "apigateway:*"
            ],
            "Resource": "arn:aws:apigateway:*::/restapis/GATEWAY_ID/*"
        }
    ]
}
  Serverless Error ---------------------------------------
 
     An error occurred while provisioning your stack: IamRoleLambdaExecution


     is not authorized to perform: iam:GetRole on resource:

IAM権限の設定でエラーが出て直らなかったので、
AdministratorAccess
にして
% serverless deploy を実行したら、エラーが出ずにデプロイできた。

↓のIAM設定にしたらデプロイできた。

AWSLambdaFullAccess - AWS Managed policy
IAMFullAccess - AWS Managed policy
AmazonS3FullAccess - AWS Managed policy
AmazonAPIGatewayInvokeFullAccess - AWS Managed policy
AmazonAPIGatewayAdministrator - AWS Managed policy
AWSLambdaExecute - AWS Managed policy
AWSCloudFormationReadOnlyAccess - AWS Managed policy
kubotad_lambda_inline_policy - Inline policy 

Python

chalice

chaliceというのを試してみる。

http://dev.classmethod.jp/cloud/aws/preview-the-python-serverless-microframework-for-aws/

GitHub - awslabs/chalice: Python Serverless Microframework for AWS

pyenv install 2.7.11
pyenv local 2.7.11
pyenv virtualenv 2.7.11 chalice_dev

pyenv version
pyenv local chalice_dev
pyenv version

pip install chalice
chalice new-project helloworld && cd helloworld
cat app.py

chalice deploy
is not authorized to perform: lambda:AddPermission on resource: arn:aws:lambda:us-west-2:

IAM設定が分からないので、Admin権限のを作成した。

% chalice deploy
Updating IAM policy.
Updating lambda function...
Regen deployment package...
Sending changes to lambda.
Lambda deploy done.
API Gateway rest API already found.
Deleting root resource id
Done deleting existing resources.
Deploying to: dev
https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/dev/

動いた。

Docker TensorFlow

pythonによるスクレイピング&機械学習 開発テクニック』
の5章 (5-2)だけ試してみた。

docker run -it b.gcr.io/tensorflow/tensorflow:latest-devel

本の通りにpython3で試したらエラー。

root@ac3b891d06fd:~# python3
Python 3.4.3 (default, Oct 14 2015, 20:28:29) 
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> import tensorflow as tf
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'tensorflow'

python 2系だといけた。

root@ac3b891d06fd:~# python
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> 
>>> import tensorflow as tf
>>> sess = tf.Session()
>>> hello = tf.constant('Hello')
>>> sess.run(hello)
'Hello'
>>> 
>>> 
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> sess.run(a+b)
42

rmする時、ワイルドカードでマッチするファイルの内、一つだけ除外したい場合

~/Documents/ に
FileZilla_ で始まる消したいファイルがあったけど、
最新の1個だけ残しておきたかった時のメモ。

rm FileZilla_*
で全部消せたけど、マッチするファイルの内1個だけ残したい。
同じディレクトリに消したくないファイルが他にある。

find . -type f -name 'FileZilla*' -not -name 'FileZilla_3.23.0.2_macosx-x86.app.tar.bz2' -print0 | xargs -0 rm

bash - rm all files except some - Stack Overflow

コマンドが長すぎてめんどくさい。

macOSにpipが入っていない

macOS Sierra
Version 10.12.2

% brew install pip
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> Updated Formulae
antlr                                              youtube-dl

Error: No available formula with the name "pip" 
Homebrew provides pip via: `brew install python`. However you will then
have two Pythons installed on your Mac, so alternatively you can install
pip via the instructions at:
  https://pip.readthedocs.io/en/stable/installing/
% curl -kL https://bootstrap.pypa.io/get-pip.py | python
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 1558k  100 1558k    0     0  3886k      0 --:--:-- --:--:-- --:--:-- 3895k
Collecting pip
  Downloading pip-9.0.1-py2.py3-none-any.whl (1.3MB)
    100% |████████████████████████████████| 1.3MB 912kB/s 
Collecting wheel
  Downloading wheel-0.29.0-py2.py3-none-any.whl (66kB)
    100% |████████████████████████████████| 71kB 4.8MB/s 
Installing collected packages: pip, wheel
Exception:
Traceback (most recent call last):
  File "/var/folders/t_/1c8g5tlj7y70t3s4f3pvsqkm0000gn/T/tmpdpNht1/pip.zip/pip/basecommand.py", line 215, in main
    status = self.run(options, args)
  File "/var/folders/t_/1c8g5tlj7y70t3s4f3pvsqkm0000gn/T/tmpdpNht1/pip.zip/pip/commands/install.py", line 342, in run
    prefix=options.prefix_path,
  File "/var/folders/t_/1c8g5tlj7y70t3s4f3pvsqkm0000gn/T/tmpdpNht1/pip.zip/pip/req/req_set.py", line 784, in install
    **kwargs
  File "/var/folders/t_/1c8g5tlj7y70t3s4f3pvsqkm0000gn/T/tmpdpNht1/pip.zip/pip/req/req_install.py", line 851, in install
    self.move_wheel_files(self.source_dir, root=root, prefix=prefix)
  File "/var/folders/t_/1c8g5tlj7y70t3s4f3pvsqkm0000gn/T/tmpdpNht1/pip.zip/pip/req/req_install.py", line 1064, in move_wheel_files
    isolated=self.isolated,
  File "/var/folders/t_/1c8g5tlj7y70t3s4f3pvsqkm0000gn/T/tmpdpNht1/pip.zip/pip/wheel.py", line 345, in move_wheel_files
    clobber(source, lib_dir, True)
  File "/var/folders/t_/1c8g5tlj7y70t3s4f3pvsqkm0000gn/T/tmpdpNht1/pip.zip/pip/wheel.py", line 316, in clobber
    ensure_dir(destdir)
  File "/var/folders/t_/1c8g5tlj7y70t3s4f3pvsqkm0000gn/T/tmpdpNht1/pip.zip/pip/utils/__init__.py", line 83, in ensure_dir
    os.makedirs(path)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.py", line 157, in makedirs
    mkdir(name, mode)
OSError: [Errno 13] Permission denied: '/Library/Python/2.7/site-packages/pip'

sudo を付けるらしい

curl -kL https://bootstrap.pypa.io/get-pip.py | sudo python

インストールできた。

Visual Studio CodeでPython

MacBookProを買ったので環境設定。

Visual Studio CodeでPythonの開発環境構築を構築してみた。 | Developers.IO

Python - Visual Studio Marketplace

Visual Studio Codeで
Command + P
ext install python

donjayamanne.python

If using a custom Python Version or a Virtual Environment, use the command Select Workspace Interpreter)

pyenvとvirtualenvの設定
pyenvのメモ - kubotti’s memo

pyenv virtualenv anaconda3-4.2.0 pydev3

Visual Studio Codeで
Command + P

shell