cronで作成日時から一定期間過ぎたファイルを削除
メモ:
cronで作成日時から一定期間過ぎたファイルを削除
MAILTO="" # delete files older than 3 days # 1 3,15 * * * find /var/www/app1/shared/docs/ -maxdepth 2 -type f -ctime +3 -delete 1 3,15 * * * find /var/www/app1/shared/docs/input/ -maxdepth 1 -type f -ctime +3 -delete 5 3,15 * * * find /var/www/app1/shared/docs/output/ -maxdepth 1 -type f -cmin +720 -delete
ansistranoのafter_symlinkでsudo(become)を実行する
ansible の YAML
ansible ansistrano の after_symlink hook で
/etc/init.d/
にシンボリックリンクを作る。
- name: initd symlink become: true file: state: link src: /var/www/app1/current/deploy/initd/app1_uwsgi #dest: /home/user1/app1_uwsgi dest: /etc/init.d/app1_uwsgi mode: "u=rwx,g=rx,o=rx"
sudoをするにはbecomeを使うと書いてあったけど、
指定の方法が分からなかった。
“配列の中にハッシュをネスト” という方法で書かないといけないっぽい。
http://docs.ansible.com/ansible/become.html
http://www.task-notes.com/entry/20150922/1442890800
ansible-playbook -i inventory/hosts/localvm playbook/deploy.yml -K
ansible-playbook コマンドの最後に -K を付けると最初にsudo passwordを聞かれる。
Ansible, sudoパスワード要求を忘れただけでめんどくなる - Goldstine研究所
エラーメッセージ
その1
fatal: [192.168.3.43]: FAILED! => {"failed": true, "reason": "no action detected in task. This often indicates a misspelled module name, or incorrect module path.\n\nThe error appears to have been in '/Users/aaa/PycharmProjects/app1/deploy/playbook/ansistrano/after_symlink.yml': line 2, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- tasks:\n ^ here\n\n\nThe error appears to have been in '/Users/aaa/PycharmProjects/app1/deploy/playbook/ansistrano/after_symlink.yml': line 2, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- tasks:\n ^ here\n"}
その2
fatal: [192.168.3.43]: FAILED! => {"failed": true, "reason": "Syntax Error while loading YAML.\n\n\nThe error appears to have been in '/Users/aaa/PycharmProjects/app1/deploy/playbook/ansistrano/after_symlink.yml': line 4, column 18, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n- name: create django static files\n django_manage:\n ^ here\n"}
完成品
PycharmProjects/app1/deploy/playbook/ansistrano/after_symlink.yml
- name: create django static files django_manage: command: collectstatic app_path: "{{ ansistrano_deploy_to }}/current/" virtualenv: "/home/user1/.pyenv/versions/app1/" - name: init.d app1_uwsgi symlink become: true file: state: link src: /var/www/app1/current/deploy/initd/app1_uwsgi #dest: /home/user1/app1_uwsgi dest: /etc/init.d/app1_uwsgi mode: "u=rwx,g=rx,o=rx" - name: init.d app1_celeryd symlink become: true file: state: link src: /var/www/app1/current/deploy/initd/app1_celeryd dest: /etc/init.d/app1_celeryd mode: "u=rwx,g=rx,o=rx" - name: restart app1_uwsgi become: true service: name: app1_uwsgi state: restarted - name: restart app1_celeryd become: true service: name: app1_celeryd state: restarted
lsのソースコードを読む 2017
lsのソースコードを読んでみたくなったのでメモ。
lsコマンドをハックしてみよう - Yahoo! JAPAN Tech Blog
https://svnweb.freebsd.org/base/head/bin/ls/
当初の目標
- Visual Studio Codeでステップ実行
- ソースを書き換えてファイル名がabc.txtのファイルは表示しないようにする
色々試してMacOS Sierra 10.12.2 とxcodeでビルドとステップ実行ができたので、
Visual Studio Codeじゃなくてxcodeにした。
ファイルの取得
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から無料ダウンロード。
ls ビルド設定 (Build Settings)
Project navigator トップ(root)の file_cmds をクリック。
2段目のfile_cmdsをクリックしてlsを選択。
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 SDKをmacOS 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にしないと表示されない。
メニューの
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コマンドができた。
以上、終了。
(メモ)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
コマンドが長すぎてめんどくさい。