AWS Lambda試したログ

2016/08/06 23:40:39

ボイラープレートあったのでcloneした

https://github.com/whatupdave/lambda-boilerplate

$ git clone https://github.com/whatupdave/lambda-boilerplate.git try-lambda
$ cd try-lambda
$ npm i

~/.aws/credentialsの設定は以下を参照した

http://dev.classmethod.jp/cloud/aws-cli-credential-config/

$ pip install awscli
$ aws configure
$ gulp deploy
(node:4285) fs: re-evaluating native module sources is not supported. If you are using the graceful-fs module, please update it to a more recent version.
[09:39:39] Using gulpfile ~/dev/try-lambda/gulpfile.js
[09:39:40] Starting 'deploy'...
[09:39:40] Starting 'lambda-zip'...
[09:39:40] Starting 'clean'...
[09:39:40] Finished 'clean' after 12 ms
[09:39:40] Starting 'compile'...
[09:39:40] Starting 'node-mods'...
[09:39:40] Starting 'env'...
[09:39:40] Finished 'env' after 1.92 ms
[09:39:40] Finished 'compile' after 171 ms
npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue

> fsevents@1.0.14 install /Users/user/dev/try-lambda/dist/node_modules/fsevents
> node-pre-gyp install --fallback-to-build

[fsevents] Success: "/Users/user/dev/try-lambda/dist/node_modules/fsevents/lib/binding/Release/node-v48-darwin-x64/fse.node" is installed via remote
lambda-boilerplate@1.0.0 /Users/user/dev/try-lambda/dist
├─┬ babel@5.8.38 
│ ├─┬ babel-core@5.8.38 
│ │ ├── babel-plugin-constant-folding@1.0.1 
│ │ ├── babel-plugin-dead-code-elimination@1.0.2 
│ │ ├── babel-plugin-eval@1.0.1 
│ │ ├── babel-plugin-inline-environment-variables@1.0.1 
│ │ ├── babel-plugin-jscript@1.0.4 
│ │ ├── babel-plugin-member-expression-literals@1.0.1 
│ │ ├── babel-plugin-property-literals@1.0.1 
│ │ ├── babel-plugin-proto-to-assign@1.0.4 
│ │ ├── babel-plugin-react-constant-elements@1.0.3 
│ │ ├── babel-plugin-react-display-name@1.0.3 
│ │ ├── babel-plugin-remove-console@1.0.1 
│ │ ├── babel-plugin-remove-debugger@1.0.1 
│ │ ├── babel-plugin-runtime@1.0.7 
│ │ ├─┬ babel-plugin-undeclared-variables-check@1.0.2 
│ │ │ └── leven@1.0.2 
│ │ ├── babel-plugin-undefined-to-void@1.1.6 
│ │ ├── babylon@5.8.38 
│ │ ├── bluebird@2.10.2 
│ │ ├─┬ chalk@1.1.3 
│ │ │ ├── ansi-styles@2.2.1 
│ │ │ ├── escape-string-regexp@1.0.5 
│ │ │ ├─┬ has-ansi@2.0.0 
│ │ │ │ └── ansi-regex@2.0.0 
│ │ │ ├── strip-ansi@3.0.1 
│ │ │ └── supports-color@2.0.0 
│ │ ├── core-js@1.2.7 
│ │ ├─┬ debug@2.2.0 
│ │ │ └── ms@0.7.1 
│ │ ├─┬ detect-indent@3.0.1 
│ │ │ ├── get-stdin@4.0.1 
│ │ │ └── minimist@1.2.0 
│ │ ├── esutils@2.0.2 
│ │ ├── globals@6.4.1 
│ │ ├─┬ home-or-tmp@1.0.0 
│ │ │ ├── os-tmpdir@1.0.1 
│ │ │ └── user-home@1.1.1 
│ │ ├─┬ is-integer@1.0.6 
│ │ │ └─┬ is-finite@1.0.1 
│ │ │   └── number-is-nan@1.0.0 
│ │ ├── js-tokens@1.0.1 
│ │ ├── json5@0.4.0 
│ │ ├─┬ minimatch@2.0.10 
│ │ │ └─┬ brace-expansion@1.1.6 
│ │ │   ├── balanced-match@0.4.2 
│ │ │   └── concat-map@0.0.1 
│ │ ├── private@0.1.6 
│ │ ├─┬ regenerator@0.8.40 
│ │ │ ├─┬ commoner@0.10.4 
│ │ │ │ ├─┬ detective@4.3.1 
│ │ │ │ │ ├── acorn@1.2.2 
│ │ │ │ │ └── defined@1.0.0 
│ │ │ │ ├── iconv-lite@0.4.13 
│ │ │ │ └── q@1.4.1 
│ │ │ ├─┬ defs@1.1.1 
│ │ │ │ ├─┬ alter@0.2.0 
│ │ │ │ │ └── stable@0.1.5 
│ │ │ │ ├── ast-traverse@0.1.1 
│ │ │ │ ├── breakable@1.0.0 
│ │ │ │ ├── simple-fmt@0.1.0 
│ │ │ │ ├── simple-is@0.2.0 
│ │ │ │ ├── stringmap@0.2.2 
│ │ │ │ ├── stringset@0.2.1 
│ │ │ │ ├── tryor@0.1.2 
│ │ │ │ └─┬ yargs@3.27.0 
│ │ │ │   ├── camelcase@1.2.1 
│ │ │ │   ├─┬ cliui@2.1.0 
│ │ │ │   │ ├─┬ center-align@0.1.3 
│ │ │ │   │ │ ├─┬ align-text@0.1.4 
│ │ │ │   │ │ │ └── longest@1.0.1 
│ │ │ │   │ │ └── lazy-cache@1.0.4 
│ │ │ │   │ ├── right-align@0.1.3 
│ │ │ │   │ └── wordwrap@0.0.2 
│ │ │ │   ├── decamelize@1.2.0 
│ │ │ │   ├─┬ os-locale@1.4.0 
│ │ │ │   │ └─┬ lcid@1.0.0 
│ │ │ │   │   └── invert-kv@1.0.0 
│ │ │ │   ├── window-size@0.1.4 
│ │ │ │   └── y18n@3.2.1 
│ │ │ ├── esprima-fb@15001.1001.0-dev-harmony-fb 
│ │ │ ├─┬ recast@0.10.33 
│ │ │ │ └── ast-types@0.8.12 
│ │ │ └── through@2.3.8 
│ │ ├─┬ regexpu@1.3.0 
│ │ │ ├── esprima@2.7.2 
│ │ │ ├── regenerate@1.3.1 
│ │ │ ├── regjsgen@0.2.0 
│ │ │ └─┬ regjsparser@0.1.5 
│ │ │   └── jsesc@0.5.0 
│ │ ├── repeating@1.1.3 
│ │ ├── resolve@1.1.7 
│ │ ├── shebang-regex@1.0.0 
│ │ ├─┬ source-map-support@0.2.10 
│ │ │ └─┬ source-map@0.1.32 
│ │ │   └── amdefine@1.0.0 
│ │ ├── to-fast-properties@1.0.2 
│ │ ├── trim-right@1.0.1 
│ │ └── try-resolve@1.0.1 
│ ├─┬ chokidar@1.6.0 
│ │ ├─┬ anymatch@1.3.0 
│ │ │ ├── arrify@1.0.1 
│ │ │ └─┬ micromatch@2.3.11 
│ │ │   ├─┬ arr-diff@2.0.0 
│ │ │   │ └── arr-flatten@1.0.1 
│ │ │   ├── array-unique@0.2.1 
│ │ │   ├─┬ braces@1.8.5 
│ │ │   │ ├─┬ expand-range@1.8.2 
│ │ │   │ │ └─┬ fill-range@2.2.3 
│ │ │   │ │   ├── is-number@2.1.0 
│ │ │   │ │   ├── isobject@2.1.0 
│ │ │   │ │   ├── randomatic@1.1.5 
│ │ │   │ │   └── repeat-string@1.5.4 
│ │ │   │ ├── preserve@0.2.0 
│ │ │   │ └── repeat-element@1.1.2 
│ │ │   ├─┬ expand-brackets@0.1.5 
│ │ │   │ └── is-posix-bracket@0.1.1 
│ │ │   ├── extglob@0.3.2 
│ │ │   ├── filename-regex@2.0.0 
│ │ │   ├─┬ kind-of@3.0.4 
│ │ │   │ └── is-buffer@1.1.4 
│ │ │   ├── normalize-path@2.0.1 
│ │ │   ├─┬ object.omit@2.0.0 
│ │ │   │ ├─┬ for-own@0.1.4 
│ │ │   │ │ └── for-in@0.1.5 
│ │ │   │ └── is-extendable@0.1.1 
│ │ │   ├─┬ parse-glob@3.0.4 
│ │ │   │ ├── glob-base@0.3.0 
│ │ │   │ └── is-dotfile@1.0.2 
│ │ │   └─┬ regex-cache@0.4.3 
│ │ │     ├── is-equal-shallow@0.1.3 
│ │ │     └── is-primitive@2.0.0 
│ │ ├── async-each@1.0.0 
│ │ ├─┬ fsevents@1.0.14 
│ │ │ ├── nan@2.4.0 
│ │ │ └─┬ node-pre-gyp@0.6.29 
│ │ │   ├─┬ mkdirp@0.5.1 
│ │ │   │ └── minimist@0.0.8 
│ │ │   ├─┬ nopt@3.0.6 
│ │ │   │ └── abbrev@1.0.9 
│ │ │   ├─┬ npmlog@3.1.2 
│ │ │   │ ├─┬ are-we-there-yet@1.1.2 
│ │ │   │ │ └── delegates@1.0.0 
│ │ │   │ ├── console-control-strings@1.1.0 
│ │ │   │ ├─┬ gauge@2.6.0 
│ │ │   │ │ ├── aproba@1.0.4 
│ │ │   │ │ ├── has-color@0.1.7 
│ │ │   │ │ ├── has-unicode@2.0.1 
│ │ │   │ │ ├── object-assign@4.1.0 
│ │ │   │ │ ├── signal-exit@3.0.0 
│ │ │   │ │ ├─┬ string-width@1.0.1 
│ │ │   │ │ │ ├─┬ code-point-at@1.0.0 
│ │ │   │ │ │ │ └── number-is-nan@1.0.0 
│ │ │   │ │ │ └── is-fullwidth-code-point@1.0.0 
│ │ │   │ │ ├─┬ strip-ansi@3.0.1 
│ │ │   │ │ │ └── ansi-regex@2.0.0 
│ │ │   │ │ └── wide-align@1.1.0 
│ │ │   │ └── set-blocking@2.0.0 
│ │ │   ├─┬ rc@1.1.6 
│ │ │   │ ├── deep-extend@0.4.1 
│ │ │   │ ├── ini@1.3.4 
│ │ │   │ ├── minimist@1.2.0 
│ │ │   │ └── strip-json-comments@1.0.4 
│ │ │   ├─┬ request@2.73.0 
│ │ │   │ ├── aws-sign2@0.6.0 
│ │ │   │ ├── aws4@1.4.1 
│ │ │   │ ├─┬ bl@1.1.2 
│ │ │   │ │ └── readable-stream@2.0.6 
│ │ │   │ ├── caseless@0.11.0 
│ │ │   │ ├─┬ combined-stream@1.0.5 
│ │ │   │ │ └── delayed-stream@1.0.0 
│ │ │   │ ├── extend@3.0.0 
│ │ │   │ ├── forever-agent@0.6.1 
│ │ │   │ ├─┬ form-data@1.0.0-rc4 
│ │ │   │ │ └── async@1.5.2 
│ │ │   │ ├─┬ har-validator@2.0.6 
│ │ │   │ │ ├─┬ chalk@1.1.3 
│ │ │   │ │ │ ├── ansi-styles@2.2.1 
│ │ │   │ │ │ ├── escape-string-regexp@1.0.5 
│ │ │   │ │ │ ├── has-ansi@2.0.0 
│ │ │   │ │ │ └── supports-color@2.0.0 
│ │ │   │ │ ├─┬ commander@2.9.0 
│ │ │   │ │ │ └── graceful-readlink@1.0.1 
│ │ │   │ │ ├─┬ is-my-json-valid@2.13.1 
│ │ │   │ │ │ ├── generate-function@2.0.0 
│ │ │   │ │ │ ├─┬ generate-object-property@1.2.0 
│ │ │   │ │ │ │ └── is-property@1.0.2 
│ │ │   │ │ │ ├── jsonpointer@2.0.0 
│ │ │   │ │ │ └── xtend@4.0.1 
│ │ │   │ │ └─┬ pinkie-promise@2.0.1 
│ │ │   │ │   └── pinkie@2.0.4 
│ │ │   │ ├─┬ hawk@3.1.3 
│ │ │   │ │ ├── boom@2.10.1 
│ │ │   │ │ ├── cryptiles@2.0.5 
│ │ │   │ │ ├── hoek@2.16.3 
│ │ │   │ │ └── sntp@1.0.9 
│ │ │   │ ├─┬ http-signature@1.1.1 
│ │ │   │ │ ├── assert-plus@0.2.0 
│ │ │   │ │ ├─┬ jsprim@1.3.0 
│ │ │   │ │ │ ├── extsprintf@1.0.2 
│ │ │   │ │ │ ├── json-schema@0.2.2 
│ │ │   │ │ │ └── verror@1.3.6 
│ │ │   │ │ └─┬ sshpk@1.8.3 
│ │ │   │ │   ├── asn1@0.2.3 
│ │ │   │ │   ├── assert-plus@1.0.0 
│ │ │   │ │   ├─┬ dashdash@1.14.0 
│ │ │   │ │   │ └── assert-plus@1.0.0 
│ │ │   │ │   ├── ecc-jsbn@0.1.1 
│ │ │   │ │   ├─┬ getpass@0.1.6 
│ │ │   │ │   │ └── assert-plus@1.0.0 
│ │ │   │ │   ├── jodid25519@1.0.2 
│ │ │   │ │   ├── jsbn@0.1.0 
│ │ │   │ │   └── tweetnacl@0.13.3 
│ │ │   │ ├── is-typedarray@1.0.0 
│ │ │   │ ├── isstream@0.1.2 
│ │ │   │ ├── json-stringify-safe@5.0.1 
│ │ │   │ ├─┬ mime-types@2.1.11 
│ │ │   │ │ └── mime-db@1.23.0 
│ │ │   │ ├── node-uuid@1.4.7 
│ │ │   │ ├── oauth-sign@0.8.2 
│ │ │   │ ├── qs@6.2.0 
│ │ │   │ ├── stringstream@0.0.5 
│ │ │   │ ├── tough-cookie@2.2.2 
│ │ │   │ └── tunnel-agent@0.4.3 
│ │ │   ├─┬ rimraf@2.5.3 
│ │ │   │ └─┬ glob@7.0.5 
│ │ │   │   ├── fs.realpath@1.0.0 
│ │ │   │   ├── inflight@1.0.5 
│ │ │   │   ├─┬ minimatch@3.0.2 
│ │ │   │   │ └─┬ brace-expansion@1.1.5 
│ │ │   │   │   ├── balanced-match@0.4.2 
│ │ │   │   │   └── concat-map@0.0.1 
│ │ │   │   └── path-is-absolute@1.0.0 
│ │ │   ├── semver@5.2.0 
│ │ │   ├─┬ tar@2.2.1 
│ │ │   │ ├── block-stream@0.0.9 
│ │ │   │ ├─┬ fstream@1.0.10 
│ │ │   │ │ └── graceful-fs@4.1.4 
│ │ │   │ └── inherits@2.0.1 
│ │ │   └─┬ tar-pack@3.1.4 
│ │ │     ├─┬ debug@2.2.0 
│ │ │     │ └── ms@0.7.1 
│ │ │     ├── fstream-ignore@1.0.5 
│ │ │     ├─┬ once@1.3.3 
│ │ │     │ └── wrappy@1.0.2 
│ │ │     ├─┬ readable-stream@2.1.4 
│ │ │     │ ├── buffer-shims@1.0.0 
│ │ │     │ ├── core-util-is@1.0.2 
│ │ │     │ ├── isarray@1.0.0 
│ │ │     │ ├── process-nextick-args@1.0.7 
│ │ │     │ ├── string_decoder@0.10.31 
│ │ │     │ └── util-deprecate@1.0.2 
│ │ │     └── uid-number@0.0.6 
│ │ ├── glob-parent@2.0.0 
│ │ ├── inherits@2.0.1 
│ │ ├─┬ is-binary-path@1.0.1 
│ │ │ └── binary-extensions@1.5.0 
│ │ ├─┬ is-glob@2.0.1 
│ │ │ └── is-extglob@1.0.0 
│ │ └─┬ readdirp@2.1.0 
│ │   ├── minimatch@3.0.2 
│ │   ├─┬ readable-stream@2.1.4 
│ │   │ ├── buffer-shims@1.0.0 
│ │   │ ├── core-util-is@1.0.2 
│ │   │ ├── isarray@1.0.0 
│ │   │ ├── process-nextick-args@1.0.7 
│ │   │ ├── string_decoder@0.10.31 
│ │   │ └── util-deprecate@1.0.2 
│ │   └── set-immediate-shim@1.0.1 
│ ├─┬ commander@2.9.0 
│ │ └── graceful-readlink@1.0.1 
│ ├── convert-source-map@1.3.0 
│ ├── fs-readdir-recursive@0.1.2 
│ ├─┬ glob@5.0.15 
│ │ ├─┬ inflight@1.0.5 
│ │ │ └── wrappy@1.0.2 
│ │ └── once@1.3.3 
│ ├── lodash@3.10.1 
│ ├─┬ output-file-sync@1.1.2 
│ │ ├── graceful-fs@4.1.5 
│ │ ├─┬ mkdirp@0.5.1 
│ │ │ └── minimist@0.0.8 
│ │ └── object-assign@4.1.0 
│ ├── path-exists@1.0.0 
│ ├── path-is-absolute@1.0.0 
│ ├── slash@1.0.0 
│ └── source-map@0.5.6 
└── dotenv@1.2.0 

npm WARN lambda-boilerplate@1.0.0 No repository field.
[09:40:19] Finished 'node-mods' after 39 s
[09:40:19] Starting 'zip'...
[09:40:22] Finished 'zip' after 3.33 s
[09:40:22] Finished 'lambda-zip' after 43 s
[09:40:22] Starting 'upload'...
[09:40:22] Uploading Lambda function "my-lambda-func"...
[09:40:28] 'upload' errored after 5.36 s
[09:40:28] Error in plugin 'gulp-awslambda'
Message:
    1 validation error detected: Value 'arn:aws:iam::123456789:role/lambda_execution_role' at 'role' failed to satisfy constraint: Member must satisfy regular expression pattern: arn:aws:iam::\d{12}:role/?[a-zA-Z_0-9+=,.@\-_/]+
[09:40:28] 'deploy' errored after 48 s
[09:40:28] Error in plugin 'run-sequence(upload)'
Message:
    1 validation error detected: Value 'arn:aws:iam::123456789:role/lambda_execution_role' at 'role' failed to satisfy constraint: Member must satisfy regular expression pattern: arn:aws:iam::\d{12}:role/?[a-zA-Z_0-9+=,.@\-_/]+
Stack:
    at finish (/Users/user/dev/try-lambda/node_modules/run-sequence/index.js:56:13)
    at Gulp.onError (/Users/user/dev/try-lambda/node_modules/run-sequence/index.js:67:4)
    at emitOne (events.js:101:20)
    at Gulp.emit (events.js:188:7)
    at Gulp.Orchestrator._emitTaskDone (/Users/user/dev/try-lambda/node_modules/orchestrator/index.js:264:8)
    at /Users/user/dev/try-lambda/node_modules/orchestrator/index.js:275:23
    at finish (/Users/user/dev/try-lambda/node_modules/orchestrator/lib/runTask.js:21:8)
    at DestroyableTransform.<anonymous> (/Users/user/dev/try-lambda/node_modules/orchestrator/lib/runTask.js:52:4)
    at DestroyableTransform.f (/Users/user/dev/try-lambda/node_modules/once/once.js:17:25)
    at emitOne (events.js:101:20)

ロールがなんかおかしいということで、gulpfileを確認したらlambda-config.jsを読み込んでいた。 さらにlambda-config.jsを確認したところ、role値がアップロード用の設定らしきファイルだった。

module.exports = {
  FunctionName: 'my-lambda-func',
  Handler: 'index.handler',
  Role: 'arn:aws:iam::972469208440:role/service-role/myRoleName',
  Timeout: 60,
}

IAMからロールを作成し、lambda-config.jsのrole値を変更してもう一度実行。

$ gulp deploy
(node:4992) fs: re-evaluating native module sources is not supported. If you are using the graceful-fs module, please update it to a more recent version.
[23:15:23] Using gulpfile ~/dev/try-lambda/gulpfile.js
[23:15:23] Starting 'deploy'...
[23:15:23] Starting 'lambda-zip'...
[23:15:23] Starting 'clean'...
[23:15:24] Finished 'clean' after 637 ms
[23:15:24] Starting 'compile'...
[23:15:24] Starting 'node-mods'...
[23:15:24] Starting 'env'...
[23:15:24] Finished 'env' after 3.66 ms
[23:15:24] Finished 'compile' after 158 ms
npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue

> fsevents@1.0.14 install /Users/user/dev/try-lambda/dist/node_modules/fsevents
> node-pre-gyp install --fallback-to-build

[fsevents] Success: "/Users/user/dev/try-lambda/dist/node_modules/fsevents/lib/binding/Release/node-v48-darwin-x64/fse.node" is installed via remote
lambda-boilerplate@1.0.0 /Users/user/dev/try-lambda/dist
├─┬ babel@5.8.38 
│ ├─┬ babel-core@5.8.38 
│ │ ├── babel-plugin-constant-folding@1.0.1 
│ │ ├── babel-plugin-dead-code-elimination@1.0.2 
│ │ ├── babel-plugin-eval@1.0.1 
│ │ ├── babel-plugin-inline-environment-variables@1.0.1 
│ │ ├── babel-plugin-jscript@1.0.4 
│ │ ├── babel-plugin-member-expression-literals@1.0.1 
│ │ ├── babel-plugin-property-literals@1.0.1 
│ │ ├── babel-plugin-proto-to-assign@1.0.4 
│ │ ├── babel-plugin-react-constant-elements@1.0.3 
│ │ ├── babel-plugin-react-display-name@1.0.3 
│ │ ├── babel-plugin-remove-console@1.0.1 
│ │ ├── babel-plugin-remove-debugger@1.0.1 
│ │ ├── babel-plugin-runtime@1.0.7 
│ │ ├─┬ babel-plugin-undeclared-variables-check@1.0.2 
│ │ │ └── leven@1.0.2 
│ │ ├── babel-plugin-undefined-to-void@1.1.6 
│ │ ├── babylon@5.8.38 
│ │ ├── bluebird@2.10.2 
│ │ ├─┬ chalk@1.1.3 
│ │ │ ├── ansi-styles@2.2.1 
│ │ │ ├── escape-string-regexp@1.0.5 
│ │ │ ├─┬ has-ansi@2.0.0 
│ │ │ │ └── ansi-regex@2.0.0 
│ │ │ ├── strip-ansi@3.0.1 
│ │ │ └── supports-color@2.0.0 
│ │ ├── core-js@1.2.7 
│ │ ├─┬ debug@2.2.0 
│ │ │ └── ms@0.7.1 
│ │ ├─┬ detect-indent@3.0.1 
│ │ │ ├── get-stdin@4.0.1 
│ │ │ └── minimist@1.2.0 
│ │ ├── esutils@2.0.2 
│ │ ├── globals@6.4.1 
│ │ ├─┬ home-or-tmp@1.0.0 
│ │ │ ├── os-tmpdir@1.0.1 
│ │ │ └── user-home@1.1.1 
│ │ ├─┬ is-integer@1.0.6 
│ │ │ └─┬ is-finite@1.0.1 
│ │ │   └── number-is-nan@1.0.0 
│ │ ├── js-tokens@1.0.1 
│ │ ├── json5@0.4.0 
│ │ ├─┬ minimatch@2.0.10 
│ │ │ └─┬ brace-expansion@1.1.6 
│ │ │   ├── balanced-match@0.4.2 
│ │ │   └── concat-map@0.0.1 
│ │ ├── private@0.1.6 
│ │ ├─┬ regenerator@0.8.40 
│ │ │ ├─┬ commoner@0.10.4 
│ │ │ │ ├─┬ detective@4.3.1 
│ │ │ │ │ ├── acorn@1.2.2 
│ │ │ │ │ └── defined@1.0.0 
│ │ │ │ ├── iconv-lite@0.4.13 
│ │ │ │ └── q@1.4.1 
│ │ │ ├─┬ defs@1.1.1 
│ │ │ │ ├─┬ alter@0.2.0 
│ │ │ │ │ └── stable@0.1.5 
│ │ │ │ ├── ast-traverse@0.1.1 
│ │ │ │ ├── breakable@1.0.0 
│ │ │ │ ├── simple-fmt@0.1.0 
│ │ │ │ ├── simple-is@0.2.0 
│ │ │ │ ├── stringmap@0.2.2 
│ │ │ │ ├── stringset@0.2.1 
│ │ │ │ ├── tryor@0.1.2 
│ │ │ │ └─┬ yargs@3.27.0 
│ │ │ │   ├── camelcase@1.2.1 
│ │ │ │   ├─┬ cliui@2.1.0 
│ │ │ │   │ ├─┬ center-align@0.1.3 
│ │ │ │   │ │ ├─┬ align-text@0.1.4 
│ │ │ │   │ │ │ └── longest@1.0.1 
│ │ │ │   │ │ └── lazy-cache@1.0.4 
│ │ │ │   │ ├── right-align@0.1.3 
│ │ │ │   │ └── wordwrap@0.0.2 
│ │ │ │   ├── decamelize@1.2.0 
│ │ │ │   ├─┬ os-locale@1.4.0 
│ │ │ │   │ └─┬ lcid@1.0.0 
│ │ │ │   │   └── invert-kv@1.0.0 
│ │ │ │   ├── window-size@0.1.4 
│ │ │ │   └── y18n@3.2.1 
│ │ │ ├── esprima-fb@15001.1001.0-dev-harmony-fb 
│ │ │ ├─┬ recast@0.10.33 
│ │ │ │ └── ast-types@0.8.12 
│ │ │ └── through@2.3.8 
│ │ ├─┬ regexpu@1.3.0 
│ │ │ ├── esprima@2.7.2 
│ │ │ ├── regenerate@1.3.1 
│ │ │ ├── regjsgen@0.2.0 
│ │ │ └─┬ regjsparser@0.1.5 
│ │ │   └── jsesc@0.5.0 
│ │ ├── repeating@1.1.3 
│ │ ├── resolve@1.1.7 
│ │ ├── shebang-regex@1.0.0 
│ │ ├─┬ source-map-support@0.2.10 
│ │ │ └─┬ source-map@0.1.32 
│ │ │   └── amdefine@1.0.0 
│ │ ├── to-fast-properties@1.0.2 
│ │ ├── trim-right@1.0.1 
│ │ └── try-resolve@1.0.1 
│ ├─┬ chokidar@1.6.0 
│ │ ├─┬ anymatch@1.3.0 
│ │ │ ├── arrify@1.0.1 
│ │ │ └─┬ micromatch@2.3.11 
│ │ │   ├─┬ arr-diff@2.0.0 
│ │ │   │ └── arr-flatten@1.0.1 
│ │ │   ├── array-unique@0.2.1 
│ │ │   ├─┬ braces@1.8.5 
│ │ │   │ ├─┬ expand-range@1.8.2 
│ │ │   │ │ └─┬ fill-range@2.2.3 
│ │ │   │ │   ├── is-number@2.1.0 
│ │ │   │ │   ├── isobject@2.1.0 
│ │ │   │ │   ├── randomatic@1.1.5 
│ │ │   │ │   └── repeat-string@1.5.4 
│ │ │   │ ├── preserve@0.2.0 
│ │ │   │ └── repeat-element@1.1.2 
│ │ │   ├─┬ expand-brackets@0.1.5 
│ │ │   │ └── is-posix-bracket@0.1.1 
│ │ │   ├── extglob@0.3.2 
│ │ │   ├── filename-regex@2.0.0 
│ │ │   ├─┬ kind-of@3.0.4 
│ │ │   │ └── is-buffer@1.1.4 
│ │ │   ├── normalize-path@2.0.1 
│ │ │   ├─┬ object.omit@2.0.0 
│ │ │   │ ├─┬ for-own@0.1.4 
│ │ │   │ │ └── for-in@0.1.5 
│ │ │   │ └── is-extendable@0.1.1 
│ │ │   ├─┬ parse-glob@3.0.4 
│ │ │   │ ├── glob-base@0.3.0 
│ │ │   │ └── is-dotfile@1.0.2 
│ │ │   └─┬ regex-cache@0.4.3 
│ │ │     ├── is-equal-shallow@0.1.3 
│ │ │     └── is-primitive@2.0.0 
│ │ ├── async-each@1.0.0 
│ │ ├─┬ fsevents@1.0.14 
│ │ │ ├── nan@2.4.0 
│ │ │ └─┬ node-pre-gyp@0.6.29 
│ │ │   ├─┬ mkdirp@0.5.1 
│ │ │   │ └── minimist@0.0.8 
│ │ │   ├─┬ nopt@3.0.6 
│ │ │   │ └── abbrev@1.0.9 
│ │ │   ├─┬ npmlog@3.1.2 
│ │ │   │ ├─┬ are-we-there-yet@1.1.2 
│ │ │   │ │ └── delegates@1.0.0 
│ │ │   │ ├── console-control-strings@1.1.0 
│ │ │   │ ├─┬ gauge@2.6.0 
│ │ │   │ │ ├── aproba@1.0.4 
│ │ │   │ │ ├── has-color@0.1.7 
│ │ │   │ │ ├── has-unicode@2.0.1 
│ │ │   │ │ ├── object-assign@4.1.0 
│ │ │   │ │ ├── signal-exit@3.0.0 
│ │ │   │ │ ├─┬ string-width@1.0.1 
│ │ │   │ │ │ ├─┬ code-point-at@1.0.0 
│ │ │   │ │ │ │ └── number-is-nan@1.0.0 
│ │ │   │ │ │ └── is-fullwidth-code-point@1.0.0 
│ │ │   │ │ ├─┬ strip-ansi@3.0.1 
│ │ │   │ │ │ └── ansi-regex@2.0.0 
│ │ │   │ │ └── wide-align@1.1.0 
│ │ │   │ └── set-blocking@2.0.0 
│ │ │   ├─┬ rc@1.1.6 
│ │ │   │ ├── deep-extend@0.4.1 
│ │ │   │ ├── ini@1.3.4 
│ │ │   │ ├── minimist@1.2.0 
│ │ │   │ └── strip-json-comments@1.0.4 
│ │ │   ├─┬ request@2.73.0 
│ │ │   │ ├── aws-sign2@0.6.0 
│ │ │   │ ├── aws4@1.4.1 
│ │ │   │ ├─┬ bl@1.1.2 
│ │ │   │ │ └── readable-stream@2.0.6 
│ │ │   │ ├── caseless@0.11.0 
│ │ │   │ ├─┬ combined-stream@1.0.5 
│ │ │   │ │ └── delayed-stream@1.0.0 
│ │ │   │ ├── extend@3.0.0 
│ │ │   │ ├── forever-agent@0.6.1 
│ │ │   │ ├─┬ form-data@1.0.0-rc4 
│ │ │   │ │ └── async@1.5.2 
│ │ │   │ ├─┬ har-validator@2.0.6 
│ │ │   │ │ ├─┬ chalk@1.1.3 
│ │ │   │ │ │ ├── ansi-styles@2.2.1 
│ │ │   │ │ │ ├── escape-string-regexp@1.0.5 
│ │ │   │ │ │ ├── has-ansi@2.0.0 
│ │ │   │ │ │ └── supports-color@2.0.0 
│ │ │   │ │ ├─┬ commander@2.9.0 
│ │ │   │ │ │ └── graceful-readlink@1.0.1 
│ │ │   │ │ ├─┬ is-my-json-valid@2.13.1 
│ │ │   │ │ │ ├── generate-function@2.0.0 
│ │ │   │ │ │ ├─┬ generate-object-property@1.2.0 
│ │ │   │ │ │ │ └── is-property@1.0.2 
│ │ │   │ │ │ ├── jsonpointer@2.0.0 
│ │ │   │ │ │ └── xtend@4.0.1 
│ │ │   │ │ └─┬ pinkie-promise@2.0.1 
│ │ │   │ │   └── pinkie@2.0.4 
│ │ │   │ ├─┬ hawk@3.1.3 
│ │ │   │ │ ├── boom@2.10.1 
│ │ │   │ │ ├── cryptiles@2.0.5 
│ │ │   │ │ ├── hoek@2.16.3 
│ │ │   │ │ └── sntp@1.0.9 
│ │ │   │ ├─┬ http-signature@1.1.1 
│ │ │   │ │ ├── assert-plus@0.2.0 
│ │ │   │ │ ├─┬ jsprim@1.3.0 
│ │ │   │ │ │ ├── extsprintf@1.0.2 
│ │ │   │ │ │ ├── json-schema@0.2.2 
│ │ │   │ │ │ └── verror@1.3.6 
│ │ │   │ │ └─┬ sshpk@1.8.3 
│ │ │   │ │   ├── asn1@0.2.3 
│ │ │   │ │   ├── assert-plus@1.0.0 
│ │ │   │ │   ├─┬ dashdash@1.14.0 
│ │ │   │ │   │ └── assert-plus@1.0.0 
│ │ │   │ │   ├── ecc-jsbn@0.1.1 
│ │ │   │ │   ├─┬ getpass@0.1.6 
│ │ │   │ │   │ └── assert-plus@1.0.0 
│ │ │   │ │   ├── jodid25519@1.0.2 
│ │ │   │ │   ├── jsbn@0.1.0 
│ │ │   │ │   └── tweetnacl@0.13.3 
│ │ │   │ ├── is-typedarray@1.0.0 
│ │ │   │ ├── isstream@0.1.2 
│ │ │   │ ├── json-stringify-safe@5.0.1 
│ │ │   │ ├─┬ mime-types@2.1.11 
│ │ │   │ │ └── mime-db@1.23.0 
│ │ │   │ ├── node-uuid@1.4.7 
│ │ │   │ ├── oauth-sign@0.8.2 
│ │ │   │ ├── qs@6.2.0 
│ │ │   │ ├── stringstream@0.0.5 
│ │ │   │ ├── tough-cookie@2.2.2 
│ │ │   │ └── tunnel-agent@0.4.3 
│ │ │   ├─┬ rimraf@2.5.3 
│ │ │   │ └─┬ glob@7.0.5 
│ │ │   │   ├── fs.realpath@1.0.0 
│ │ │   │   ├── inflight@1.0.5 
│ │ │   │   ├─┬ minimatch@3.0.2 
│ │ │   │   │ └─┬ brace-expansion@1.1.5 
│ │ │   │   │   ├── balanced-match@0.4.2 
│ │ │   │   │   └── concat-map@0.0.1 
│ │ │   │   └── path-is-absolute@1.0.0 
│ │ │   ├── semver@5.2.0 
│ │ │   ├─┬ tar@2.2.1 
│ │ │   │ ├── block-stream@0.0.9 
│ │ │   │ ├─┬ fstream@1.0.10 
│ │ │   │ │ └── graceful-fs@4.1.4 
│ │ │   │ └── inherits@2.0.1 
│ │ │   └─┬ tar-pack@3.1.4 
│ │ │     ├─┬ debug@2.2.0 
│ │ │     │ └── ms@0.7.1 
│ │ │     ├── fstream-ignore@1.0.5 
│ │ │     ├─┬ once@1.3.3 
│ │ │     │ └── wrappy@1.0.2 
│ │ │     ├─┬ readable-stream@2.1.4 
│ │ │     │ ├── buffer-shims@1.0.0 
│ │ │     │ ├── core-util-is@1.0.2 
│ │ │     │ ├── isarray@1.0.0 
│ │ │     │ ├── process-nextick-args@1.0.7 
│ │ │     │ ├── string_decoder@0.10.31 
│ │ │     │ └── util-deprecate@1.0.2 
│ │ │     └── uid-number@0.0.6 
│ │ ├── glob-parent@2.0.0 
│ │ ├── inherits@2.0.1 
│ │ ├─┬ is-binary-path@1.0.1 
│ │ │ └── binary-extensions@1.5.0 
│ │ ├─┬ is-glob@2.0.1 
│ │ │ └── is-extglob@1.0.0 
│ │ └─┬ readdirp@2.1.0 
│ │   ├── minimatch@3.0.2 
│ │   ├─┬ readable-stream@2.1.4 
│ │   │ ├── buffer-shims@1.0.0 
│ │   │ ├── core-util-is@1.0.2 
│ │   │ ├── isarray@1.0.0 
│ │   │ ├── process-nextick-args@1.0.7 
│ │   │ ├── string_decoder@0.10.31 
│ │   │ └── util-deprecate@1.0.2 
│ │   └── set-immediate-shim@1.0.1 
│ ├─┬ commander@2.9.0 
│ │ └── graceful-readlink@1.0.1 
│ ├── convert-source-map@1.3.0 
│ ├── fs-readdir-recursive@0.1.2 
│ ├─┬ glob@5.0.15 
│ │ ├─┬ inflight@1.0.5 
│ │ │ └── wrappy@1.0.2 
│ │ └── once@1.3.3 
│ ├── lodash@3.10.1 
│ ├─┬ output-file-sync@1.1.2 
│ │ ├── graceful-fs@4.1.5 
│ │ ├─┬ mkdirp@0.5.1 
│ │ │ └── minimist@0.0.8 
│ │ └── object-assign@4.1.0 
│ ├── path-exists@1.0.0 
│ ├── path-is-absolute@1.0.0 
│ ├── slash@1.0.0 
│ └── source-map@0.5.6 
└── dotenv@1.2.0 

npm WARN lambda-boilerplate@1.0.0 No repository field.
[23:15:59] Finished 'node-mods' after 35 s
[23:15:59] Starting 'zip'...
[23:16:03] Finished 'zip' after 3.84 s
[23:16:03] Finished 'lambda-zip' after 40 s
[23:16:03] Starting 'upload'...
[23:16:03] Uploading Lambda function "my-lambda-func"...
[23:16:12] Lambda function "my-lambda-func" successfully uploaded
[23:16:12] Finished 'upload' after 8.73 s
[23:16:12] Finished 'deploy' after 49 s

今度は成功した。

AWSマネジメントコンソールから入ってできたか確認したら、ちゃんと作成されていた。

しかし指定されているnodeのバージョンが古いのでその辺は変更していこうと思う。

LockerServiceについての所感

2016/04/19 18:43:42

先日、LightningComponent上でサードパーティ製のライブラリを利用可能にするための仕組みとして、 LockerServiceがSalesforceのブログで発表された。

Introducing The LockerService For Lightning Components - Developer Relations

Lightning Locker Serviceのご紹介 | Salesforce Developers Japan Blog

リリースされていないけど、今回のブログをみたのとauraのソースを少しあさった事による所感。


auraのソースで見つけたLockerServiceで使われそうな各オブジェクトのラッパー実装。

Functionに文字列を渡すとコードとして実行できるが、その時にthisがグローバルオブジェクトになる。

JavaScriptではconsttuctorプロパティでオブジェクトのコンストラクタにアクセスできる。

コンストラクタは関数なのでFunctionのインスタンス。

つまり、あらゆるオブジェクトから.constructor.constructorでFunctionを取得できる。

単にアクセスするオブジェクトの名前でホワイトリスト作っても無駄。

あと根本的な問題として、ブラウザ側は多分そんな用途を想定してない。

試してみたら

with({window:{}, document:{}}){
  //...
}

の中に外部のコードを埋め込むことで一応挿げ替えはできそう。

と思って探したらそれっぽいことやってる部分あった。

https://github.com/forcedotcom/aura/blob/97735919d583080a81b4d0a5734f84559a0f121c/aura-resources/src/main/resources/aura/resources/lockerservice/safeEval.html#L35

上記のURLを返す ConfigAdapterImpl#getLockerWorkerURL() メソッド

https://github.com/forcedotcom/aura/blob/97735919d583080a81b4d0a5734f84559a0f121c/aura-impl/src/main/java/org/auraframework/impl/adapter/ConfigAdapterImpl.java#L455

このメソッドが返す値は以下のファイルでauraInitというMapにsafeEvalWorkerというキーで追加されている。

auraInit.put("safeEvalWorker", Aura.getConfigAdapter().getLockerWorkerURL());

たぶんこのマップがJSに渡るのだろう。safeEvalWorkerというキーがJSで使用されている。

https://github.com/forcedotcom/aura/blob/97735919d583080a81b4d0a5734f84559a0f121c/aura-impl/src/main/resources/aura/Aura.js#L645

Lightningコンポーネントを直接開くURL

2015/10/31 23:48:39

var componentName = 'MyComponent';
var hash = btoa(JSON.stringify({
  componentDef: 'one:auraContainer',
  attributes: {
    values: {
      tag: 'c:' + componentName,
      t: Date.now()
    }
  }
}));
var url = '/one/one.app#' + hash;

LightningはJSで発生したエラーを握りつぶす

2015/03/11 12:10:00

理由はLightning開発者ガイドで紹介されてるログ出力関数で書いたのと同じ。

JSコントローラ内でエラーが発生すると $A.$warning$ にエラーが渡されるが

$A.$warning$ が $A.$logInternal$ を呼び出しているので PROD,PRODDEBUG モードだとなにも出力されない。

開発中にエラーを握りつぶされるためとても不便。

一応下記のJSで $A.$warning$ を上書きすれば見えるようになる。

$A.$warning$ = function (msg, err) {
	console.warn(msg, err);
};

Force.com CLI + peco

2015/03/10 23:00:25

ふと思い立ってやってみた。

force query "select Id, Name from Contact where AccountId='$(force query select Id, Name from Account | peco | cut -c 2-19)'"

pecoで選択した取引先データを親にもつ取引先責任者を表示する。

もっといい使い道はないだろうか。

Lightning開発者ガイドで紹介されてるログ出力関数

2014/12/17 00:26:51

https://developer.salesforce.com/docs/atlas.ja-jp.lightning.meta/lightning/debug_log_messages.htm

$A.log(string, [error]) メソッドを使用して、ログメッセージを JavaScript コンソールに書き出します

とあるが、使用しても出力されなかったので調査した。

まずはページ内で

$A.log.toString()

を実行して関数の中身を参照。

function (value, error) {
  var trace;
  if(this["util"].$isError$(value)) {
    error = value;
    value = error.message
  }
  if(this["util"].$isError$(error)) {
    trace = this.$getStackTrace$(error)
  }else {
    if(error && error.stack) {
      trace = error.stack
    }
  }
  this.$logInternal$("Info", value, error, trace)
}

$A.log は内部で $A.$logInternal$ を呼び出していることが分かる。 で

$A.$logInternal$.toString()

を実行して出てきたのが

function (type, message, error, trace) {
}

ということで $A.$logInternal$ には中身がなかった。

これは一体どういうことかとAuraのドキュメントを見ると、

http://documentation.auraframework.org/auradocs#reference?topic=api:Aura

のlogメソッド(メソッドにリンクできないの不便すぎる)に

This method doesn’t log in PROD or PRODDEBUG modes.

とあった。

Lightningコンポーネントでのモードを調べると、

https://developer.salesforce.com/docs/atlas.ja-jp.lightning.meta/lightning/aura_debug_mode.htm

デフォルトでは、Lightning コンポーネントフレームワークは PROD モードで実行されます。

デバッグモードを有効化すると、フレームワークはデフォルトで PRODDEBUG モードで実行されます。

ということで、つまりLightningだとこの関数意味がない。

ただ「デフォルトで」というのが気になっててきとーに検索したら以下のページが見つかった。

http://www.salesforce.com/us/developer/docs/lightning/Content/request_server_side.htm

どうやら aura の方では aura.mode パラメータでモードを指定できるらしい。

また、どんなモードが存在するかも見つけた。

http://www.salesforce.com/us/developer/docs/lightning/Content/modes_reference.htm

実行モードには以下があるらしい。

さっそくパラメータとして aura.mode=MODE_NAME の形式で各モードを指定してみたがそれでもログは出力されなかったし、 JSTESTとJSTESTDEBUGにいたっては内部サーバーエラーになった。

そもそもPRODDEBUG以外のモードはDEBUG付きでもJSが圧縮されていたので大体のモードはPRODと同じになってる気がする。

あとAuraのドキュメントでも関数の説明が

Logs to the browser’s JavaScript console if it is available.

としかないので、jsのコンソールに出力するだけならばそもそもこの関数の存在する理由が分からない。

最終的にはモードを切り替えが可能になると共に出力有無を切り替えできるようになるんだろうか。

Lightning App Builder

2014/12/14 06:00:00

Salesforce1 Advent Calendar 14日目の記事です。

Lightning App Builder についてデモ動画、

Salesforce World Tour Tokyo(2014年12月) - ~IoTと次世代モバイルアプリの最新事例紹介~アプリの開発スピードを革新するSalesforce1 Lightning~

から得られる情報をまとめます。

ちなみにまだデモで存在するだけなため、リリースまでにいろいろ変更される可能性があります。

まずは App Builder に入る前のビューですが、

ビジュアルアプリケーションビルダーには、Flexible Pagesを使用してSalesforce1 のカスタムアプリケーションページを作成するための使いやすいグラフィカルインターフェースが用意されています。

と書かれています。

要するにLightning App Builder は Flexible Page をGUIで作成できるもの、ということでしょう。

新規ボタンを押した後に立ち上がる App Builder の画面です。

作成する画面の種別を3種類から選ぶようです。

これによって作成したページを割り当てできる箇所が変わるのでしょう。

翻訳後のレイアウト調整がまだなのか少しページが崩れていますが、本リリースまでには直ることでしょう多分。

ページ種別を選択するとページのテンプレートの選択に移行します。

まとめると、最大3つのエリアをもつページを作成することができ、

各エリアはページを参照する端末によって表示される箇所が変わる、ということのようです。

下に「AppExchange上でテンプレートを探す」というリンクがありますので もしかするとこれ以外のレイアウトもテンプレートとして作成・公開できるようになるのでしょうか。

テンプレートを選択すると最後にページの名前を設定してドラッグ&ドロップによるページ作成が始まります。

[標準コンポーネント], [カスタムコンポーネント] の下に [AppExchangeコンポーネント] が並んでいるのが分かります。

いままでは ユーザがD&Dで設定できてAppExchangeで公開できるUIはVisualforceページのみだった (カスタムコンポーネントでコンポーネント単位の公開はできるけど使用するのにコーディングが必要) のが、コンポーネント単位で公開しそこからユーザがD&Dでページに組み込むことができるようになるようです。

ページの設定の一番下に[処理]とありますが、Lightning Process Builderで作成した処理を割り当てたりできるのでしょうか。

プレビューの端末を変更することもできます。

まとめ

いままでの Salesforce は AppExchange で公開されたものをコーディングなしで自組織に組み込むことのできるUIとしてはVisualforceページが最小単位だったと思いますが、テンプレートやコンポーネントなど、より小さな単位でAppExchangeで公開可能にすることを目指しているようです。

ブログを新しくした

2014/12/07 04:00:00

golang製の静的サイトジェネレータである Hugo を使った。

examples/blog がそのまま動いたのでうまくいくかと思いきや、そこそこ面倒くさかった。

そもそも url と生成時のファイル生成のパスの扱いが同じ関数で行われている。

結局、

という修正をやって動かしてる。

後者に関してはissueは挙がってたしそのうち直るだろうたぶん。

あとコードのハイライトは pygments 使おうと思ったけどなぜかpタグがcode内にでてくる

function func() { var v; v = 0; v = ‘string’; v = function () {}; }

ので Hilight.js の monokai sublime テーマにした。

function func() {
    var v;
    v = 0;
    v = 'string';
    v = function () {};
}

追記

静的ファイルの追加が何故か1フォルダしか行われていなかった。 chtimeで権限エラーになっていた。 hugo.go で NewSyncer 後に

syncer.NoTimes = true

を追加することで最終更新日の同期をやめさせて対応した。

diff --git a/commands/hugo.go b/commands/hugo.go
index 6fd7fa2..21dad47 100644
--- a/commands/hugo.go
+++ b/commands/hugo.go
@@ -227,6 +229,7 @@ func copyStatic() error {
    publishDir := helpers.AbsPathify(viper.GetString("PublishDir")) + "/"
 
    syncer := fsync.NewSyncer()
+   syncer.NoTimes = true
    syncer.NoTimes = viper.GetBool("notimes")
    syncer.SrcFs = hugofs.SourceFs
    syncer.DestFs = hugofs.DestinationFS
diff --git a/helpers/url.go b/helpers/url.go
index dd8d750..6b234b4 100644
--- a/helpers/url.go
+++ b/helpers/url.go
@@ -16,7 +16,7 @@ package helpers
 import (
    "fmt"
    "net/url"
-   "path/filepath"
+   "path"
    "strings"
 
    "github.com/PuerkitoBio/purell"
@@ -68,7 +68,7 @@ func MakePermalink(host, plink string) *url.URL {
        panic(fmt.Errorf("Can't make permalink from absolute link %q", plink))
    }
 
-   base.Path = filepath.Join(base.Path, p.Path)
+   base.Path = path.Join(base.Path, p.Path)
 
    // path.Join will strip off the last /, so put it back if it was there.
    if strings.HasSuffix(p.Path, "/") && !strings.HasSuffix(base.Path, "/") {
@@ -84,7 +84,7 @@ func UrlPrep(ugly bool, in string) string {
        return x
    } else {
        x := PrettifyUrl(SanitizeUrl(in))
-       if filepath.Ext(x) == ".xml" {
+       if path.Ext(x) == ".xml" {
            return x
        }
        url, err := purell.NormalizeURLString(x, purell.FlagAddTrailingSlash)
@@ -100,8 +100,8 @@ func UrlPrep(ugly bool, in string) string {
 func PrettifyUrl(in string) string {
    x := PrettifyPath(in)
 
-   if filepath.Base(x) == "index.html" {
-       return filepath.Dir(x)
+   if path.Base(x) == "index.html" {
+       return path.Dir(x)
    }
 
    if in == "" {
@@ -115,17 +115,17 @@ func PrettifyUrl(in string) string {
 // /section/name/  -> /section/name.html
 // /section/name.html -> /section/name.html
 func Uglify(in string) string {
-   if filepath.Ext(in) == "" {
+   if path.Ext(in) == "" {
        if len(in) < 2 {
            return "/"
        }
        // /section/name/  -> /section/name.html
-       return filepath.Clean(in) + ".html"
+       return path.Clean(in) + ".html"
    } else {
        name, ext := FileAndExt(in)
        if name == "index" {
            // /section/name/index.html -> /section/name.html
-           d := filepath.Dir(in)
+           d := path.Dir(in)
            if len(d) > 1 {
                return d + ext
            } else {
@@ -133,7 +133,7 @@ func Uglify(in string) string {
            }
        } else {
            // /section/name.html -> /section/name.html
-           return filepath.Clean(in)
+           return path.Clean(in)
        }
    }
 }
diff --git a/hugolib/permalinks.go b/hugolib/permalinks.go
index 642de83..955401c 100644
--- a/hugolib/permalinks.go
+++ b/hugolib/permalinks.go
@@ -146,7 +146,8 @@ func pageToPermalinkTitle(p *Page, _ string) (string, error) {
 func pageToPermalinkFilename(p *Page, _ string) (string, error) {
    //var extension = p.Source.Ext
    //var name = p.Source.Path()[0 : len(p.Source.Path())-len(extension)]
-   return helpers.Urlize(p.Source.BaseFileName()), nil
+   return p.Source.BaseFileName(), nil
+   // return helpers.Urlize(p.Source.BaseFileName()), nil
 }
 
 // if the page has a slug, return the slug, else return the title