読者です 読者をやめる 読者になる 読者になる

kickstamp

きりんさんメモと、しゃちくんノート。ときどきウサギちゃんのらくがき

DRMフリーの電子書籍ストアまとめ

目的

毎回電子書籍の話題が出るたびに「DRMフリーの電子書籍買え!」と言っているのですが、「どこで」という事を言ってなかったことに気づきました。そこで今回、私の普段利用している電子書籍ストアを紹介してみます。

基本的に技術系(プログラミング系)の出版社ばかりなので、その分野に興味が無い人にはあんま意味ないです。 また、海外の出版社と日本の出版社は一応分けて記載してます。

英語本が売ってるところ

O'Reilly

特徴:

本の種類がとにかく多いです。大概の言語の本は売ってます。時々全品半額セールをしていたり、毎日変わる半額セール対象本があったりするので毎日見るとよいです。

URL: http://shop.oreilly.com/home.do

PacktPub

特徴:

こちらもO'Reillyと比肩できるくらい本の種類が多いです。特にUnity/CryEngine/UnRealEngineなどゲーム系の書籍や、Web系の書籍が充実している印象ですが、それ以外が弱いということもありません。。

URL: http://www.packtpub.com/

Manning Publication

特徴:

TypeSafe(Scala作ってるとこ)と仲が良いのか、TypeSafeの人が書いた本が売ってたりします。また、記述が平均的に丁寧なのでわかりやすいかと思います。あとJVM、.net、データサイエンスにも強いです。

URL: http://manning.com/

pragmatic bookshelf

特徴:

わかりやすい本が多いです。個人的にはここが一番好きなので、人によくおすすめしています。翻訳された本で言うと、「7つの言語、7つの世界」シリーズや、「メタプログラミングRuby」が有名ですかね。

URL: http://pragprog.com/

informit

特徴:

ピアソン系なためか学術的な本が割と多いような気がします。有名どころで言うとクヌース先生の「The Art of Computer Programming」など、またC++に強い印象もあります。

URL: http://www.informit.com/

Lean Pub

特徴:

個人出版プラットフォームのようなところなので、質はばらつきがありますが、その分宝探しのような面白さがあります。

URL: https://leanpub.com/

Apress

特徴:

Microsoft系に強い印象です。.net関連の本が欲しければとりあえずのぞいてみるとよいかも。

URL: http://www.apress.com/

日本語の本が売ってるところ

達人出版会

特徴:

色々な出版社の本が売っています。出版記念セールがあったりするのでウォッチしておくとよいかと。

URL: http://tatsu-zine.com/books/

オーム社

特徴

オーム社電子書籍ストアです。

URL: http://estore.ohmsha.co.jp/titles

技術評論社

特徴

技術評論社電子書籍ストアです。

URL: https://gihyo.jp/dp

オライリージャパン

特徴

オライリージャンパンの電子書籍ストアです。

URL: http://www.oreilly.co.jp/ebook/

まとめ

個人的にはPragmatic BookshelfとManning Publicationsが特に好きです。また日本語の方の説明がことさらやる気が無いのは反省してます。

JavaScriptのFunctionに関してあれこれ(Applyとか部分適用とか)

部分適用

基本

// add :: Number -> Number -> Number
var add = function (a){
            return (function(b){return a + b;});
        }
add(5)(4); // => 9
var add5 = add(5);
add5(4);; // => 9

bindを使うパターン

// add :: Number -> Number -> Number
var add = function (a, b){
            return a + b;
            }
add(5, 4); // => 9
// bind :: object -> a -> function
var add5 = add.bind(null, 5);
add5(4);; // => 9

Apply

可変長引数関数に配列を渡せるように出来る

// display_log :: [a] -> undefined
var display_log =
    function(){
        for(i = 0; i < arguments.length; i++){
            console.log(arguments[i]);
        }};
// 普通の呼び出し
display_log('ねこ', 'いぬ', 'うさぎ');
/*
   ねこ
   いぬ
   うさぎ
=> undefined
*/

// applyを使った呼び出し
// apply :: object -> [a] -> b
var animals = ['にゃんにゃん', 'わんわん', 'うさうさ']
display_log.apply(null, animals);
/*
   にゃんにゃん
   わんわん
   うさうさ
=> undefined
*/

再帰

// factorial :: Number -> Number
// 変数に束縛する形式の関数宣言でも内部の関数に名前をつけると、再帰できる
var factorial = function fac(num){
                    if (num > 0){
                        return num * fac (num -1 );
                    } else{
                        return 1;
                    }
    }
factorial(5); // => 120
// 外側からは参照できない
fac(5); // => ReferenceError: fac is not defined

はてブのツイッター連携がウザくなったので設定を変更した話

僕ははてブで偉そうな事書くのが趣味でツイッターと連携させて使っているのですが、 最近仕様変更ではてブのコメントページへのリンクが着くようになってしまいました

f:id:theatrical:20130920231307p:plain

今日

f:id:theatrical:20130920231344p:plain

これの部分がものすっごい邪魔です。

というわけでこいつを消す方法が下記です。

1.はてブの設定ページに行く
2.twitterの設定タブをクリックする
3.「Twitterへの投稿にコメント一覧ページのURLを含める 」をアンチェックする
4.ページ一番したの「変更する」ボタンをクリックする
5.終わり

3の設定の場所は画像を参考にしてください

f:id:theatrical:20130920232344p:plain

とまぁこんな感じです

SQLの予約語を大文字化するVimコマンド書いた

Vim

久しぶりにVimScriptを書きました。

__GooglePrettify__

    let s:keyword = {}
    let s:keyword.keywords = [
    \           "ABS"
    \           , "ABSOLUTE"
    \           , "ACCESS"
    \           , "ACTION"
    \           , "ADD"
    \           , "ADMIN"
    \           , "AFTER"
    \           , "AGGREGATE"
    \           , "ALIAS"
    \           , "ALL"
    \           , "ALLOCATE"
    \           , "ALTER"
    \           , "AMOUNT"
    \           , "AND"
    \           , "ANDNOT"
    \           , "ANSI"
    \           , "ANY"
    \           , "ARE"
    \           , "ARRAY"
    \           , "AS"
    \           , "ASC"
    \           , "ASSERTION"
    \           , "ASSIGN"
    \           , "ASYNC"
    \           , "AT"
    \           , "AUTHORIZATION"
    \           , "AUTO"
    \           , "AVG"
    \           , "BASE"
    \           , "BEFORE"
    \           , "BEGIN"
    \           , "BETWEEN"
    \           , "BINARY"
    \           , "BIT"
    \           , "BIT_AND_TEST"
    \           , "BIT_LENGTH"
    \           , "BLOB"
    \           , "BOOLEAN"
    \           , "BOTH"
    \           , "BREADTH"
    \           , "BTREE"
    \           , "BUFFER"
    \           , "BY"
    \           , "BYTE"
    \           , "CALL"
    \           , "CASCADE"
    \           , "CASCADED"
    \           , "CASE"
    \           , "CAST"
    \           , "CATALOG"
    \           , "CHANGE"
    \           , "CHAR"
    \           , "CHARACTER"
    \           , "CHAR_LENGTH"
    \           , "CHARACTER_LENGTH"
    \           , "CHECK"
    \           , "CLASS"
    \           , "CLOB"
    \           , "CLOSE"
    \           , "CLUSTER"
    \           , "COALESCE"
    \           , "COLLATE"
    \           , "COLLATION"
    \           , "COLUMN"
    \           , "COLUMNS"
    \           , "COMMENT"
    \           , "COMMIT"
    \           , "COMPLETION"
    \           , "COMPRESSED"
    \           , "CONDITION"
    \           , "CONFIGURATION"
    \           , "CONNECT"
    \           , "CONNECTION"
    \           , "CONST"
    \           , "CONSTRAINT"
    \           , "CONSTRAINTS"
    \           , "CONSTRUCTOR"
    \           , "CONTIGUOUS"
    \           , "CONTINUE"
    \           , "CONVERT"
    \           , "CORR"
    \           , "CORRESPONDING"
    \           , "COUNT"
    \           , "COUNT_FLOAT"
    \           , "COVAR_POP"
    \           , "COVAR_SAMP"
    \           , "CREATE"
    \           , "CROSS"
    \           , "CUBE"
    \           , "CUME_DIST"
    \           , "CURAID"
    \           , "CURRENT"
    \           , "CURRENT_DATE"
    \           , "CURRENT_DEFAULT_TRANSFORM_GROUP"
    \           , "CURRENT_PATH"
    \           , "CURRENT_ROLL"
    \           , "CURRENT_TIME"
    \           , "CURRENT_TIMESTAMP"
    \           , "CURRENT_TRANSFORM_GROUP_FOR_TYPE"
    \           , "CURRENT_USER"
    \           , "CURSOR"
    \           , "CYCLE"
    \           , "DATA"
    \           , "DATABASE"
    \           , "DATE"
    \           , "DAY"
    \           , "DAYS"
    \           , "DBA"
    \           , "DEALLOCATE"
    \           , "DEC"
    \           , "DECIMAL"
    \           , "DECLARE"
    \           , "DEFAULT"
    \           , "DEFER"
    \           , "DEFERRABLE"
    \           , "DEFERRED"
    \           , "DELETE"
    \           , "DEMOTING"
    \           , "DENSE_RANK"
    \           , "DEPTH"
    \           , "DEREF"
    \           , "DESC"
    \           , "DESCRIBE"
    \           , "DESCRIPTION"
    \           , "DESCRIPTOR"
    \           , "DESTROY"
    \           , "DESTRUCTOR"
    \           , "DETERMINISTIC"
    \           , "DEVICE"
    \           , "DIAGNOSTICS"
    \           , "DICTIONARY"
    \           , "DIGITS"
    \           , "DIRECT"
    \           , "DISCONNECT"
    \           , "DISPLAY"
    \           , "DISTINCT"
    \           , "DO"
    \           , "DOMAIN"
    \           , "DOUBLE"
    \           , "DOUBLE_PRECISION"
    \           , "DROP"
    \           , "DYNAMIC"
    \           , "EACH"
    \           , "EDIT"
    \           , "ELSE"
    \           , "ELSEIF"
    \           , "ENCRYPT"
    \           , "END"
    \           , "END"
    \           , "EQUALS"
    \           , "ESCAPE"
    \           , "ESTIMATED"
    \           , "EVERY"
    \           , "EXCEPT"
    \           , "EXCEPTION"
    \           , "EXCLUSIVE"
    \           , "EXEC"
    \           , "EXECUTE"
    \           , "EXISTS"
    \           , "EXIT"
    \           , "EXTERN"
    \           , "EXTERNAL"
    \           , "EXTRACT"
    \           , "FALSE"
    \           , "FETCH"
    \           , "FILE"
    \           , "FILTER"
    \           , "FIRST"
    \           , "FIX"
    \           , "FIXED"
    \           , "FLAT"
    \           , "FLOAT"
    \           , "FOR"
    \           , "FORCE"
    \           , "FOREIGN"
    \           , "FOUND"
    \           , "FREE"
    \           , "FROM"
    \           , "FULL"
    \           , "FUNCTION"
    \           , "GENERAL"
    \           , "GET"
    \           , "GET_JAVA_STORED_ROUTINE_SOURCE"
    \           , "GLOBAL"
    \           , "GO"
    \           , "GOTO"
    \           , "GRANT"
    \           , "GROUP"
    \           , "GROUPING"
    \           , "HANDLER"
    \           , "HASH"
    \           , "HAVING"
    \           , "HELP"
    \           , "HEX"
    \           , "HOST"
    \           , "HOUR"
    \           , "HOURS"
    \           , "HUGE"
    \           , "IDENTIFIED"
    \           , "IDENTITY"
    \           , "IF"
    \           , "IGNORE"
    \           , "IMMEDIATE"
    \           , "IN"
    \           , "INDEX"
    \           , "INDICATOR"
    \           , "INITIALIZE"
    \           , "INITIALLY"
    \           , "INNER"
    \           , "INOUT"
    \           , "INPUT"
    \           , "INSENSITIVE"
    \           , "INSERT"
    \           , "INT"
    \           , "INTEGER"
    \           , "INTERSECT"
    \           , "INTERVAL"
    \           , "INTO"
    \           , "IS"
    \           , "ISOLATION"
    \           , "IS_USER_CONTAINED_IN_HDS_GROUP"
    \           , "ITERATE"
    \           , "JOIN"
    \           , "KEY"
    \           , "LABEL"
    \           , "LANGUAGE"
    \           , "LARGE"
    \           , "LAST"
    \           , "LATERAL"
    \           , "LEADING"
    \           , "LEAVE"
    \           , "LEFT"
    \           , "LENGTH"
    \           , "LESS"
    \           , "LEVEL"
    \           , "LIKE"
    \           , "LIMIT"
    \           , "LINES"
    \           , "LINK"
    \           , "LIST"
    \           , "LOCAL"
    \           , "LOCALTIME"
    \           , "LOCALTIMESTAMP"
    \           , "LOCATOR"
    \           , "LOCK"
    \           , "LOCKS"
    \           , "LOGID"
    \           , "LOGNAME"
    \           , "LONG"
    \           , "LOOP"
    \           , "LOWER"
    \           , "MAP"
    \           , "MATCH"
    \           , "MAX"
    \           , "MAXUSAGES"
    \           , "MCHAR"
    \           , "MICROSECOND"
    \           , "MICROSECONDS"
    \           , "MIN"
    \           , "MINUTE"
    \           , "MINUTES"
    \           , "MOD"
    \           , "MODE"
    \           , "MODIFIES"
    \           , "MODIFY"
    \           , "MODULE"
    \           , "MONTH"
    \           , "MONTHS"
    \           , "MOVE"
    \           , "MVARCHAR"
    \           , "NAMES"
    \           , "NATIONAL"
    \           , "NATURAL"
    \           , "NCHAR"
    \           , "NCLOB"
    \           , "NESTING"
    \           , "NEW"
    \           , "NEXT"
    \           , "NO"
    \           , "NONE"
    \           , "NONLOCAL"
    \           , "NOT"
    \           , "NOWAIT"
    \           , "NULL"
    \           , "NULLABLE"
    \           , "NULLIF"
    \           , "NUMERIC"
    \           , "NVARCHAR"
    \           , "OBJECT"
    \           , "OCTET_LENGTH"
    \           , "OF"
    \           , "OFF"
    \           , "OFFSET"
    \           , "OID"
    \           , "OLD"
    \           , "ON"
    \           , "ONLY"
    \           , "OPEN"
    \           , "OPERATION"
    \           , "OPERATORS"
    \           , "OPTION"
    \           , "OPTIMIZE"
    \           , "OR"
    \           , "ORDER"
    \           , "ORDINALITY"
    \           , "OTHERS"
    \           , "OUT"
    \           , "OUTER"
    \           , "OUTPUT"
    \           , "OVER"
    \           , "OVERFLOW"
    \           , "OVERLAPS"
    \           , "OVERWRITE"
    \           , "OWN"
    \           , "OWNER"
    \           , "PAD"
    \           , "PAGE"
    \           , "PARAMETER"
    \           , "PARAMETERS"
    \           , "PARTIAL"
    \           , "PARTITION"
    \           , "PARTITIONED"
    \           , "PATH"
    \           , "PCTFREE"
    \           , "PENDANT"
    \           , "PERCENT_RANK"
    \           , "PERCENTILE_CONT"
    \           , "PERCENTILE_DISC"
    \           , "PIC"
    \           , "PICTURE"
    \           , "POSITION"
    \           , "POSTFIX"
    \           , "PREALLOCATED"
    \           , "PRECISION"
    \           , "PREFERRED"
    \           , "PREFIX"
    \           , "PREORDER"
    \           , "PREPARE"
    \           , "PRESERVE"
    \           , "PRIMARY"
    \           , "PRIMLEGES"
    \           , "PRIOR"
    \           , "PRIVATE"
    \           , "PRIVILEGES"
    \           , "PROCEDURE"
    \           , "PROGRAM"
    \           , "PROTECTED"
    \           , "PUBLIC"
    \           , "PURGE"
    \           , "RANDOM"
    \           , "RANGE"
    \           , "RANK"
    \           , "RD"
    \           , "RDAREA"
    \           , "RDNODE"
    \           , "READ"
    \           , "READS"
    \           , "REAL"
    \           , "RECOMPILE"
    \           , "RECOVERABLE"
    \           , "RECOVERY"
    \           , "RECURSIVE"
    \           , "REDO"
    \           , "REF"
    \           , "REFERENCES"
    \           , "REFERENCING"
    \           , "REGLIKE"
    \           , "REGR_AVGX"
    \           , "REGR_AVGY"
    \           , "REGR_COUNT"
    \           , "REGR_INTERCEPT"
    \           , "REGR_R2"
    \           , "REGR_SLOPE"
    \           , "REGR_SXX"
    \           , "REGR_SXY"
    \           , "REGR_SYY"
    \           , "RELATIVE"
    \           , "RELEASE"
    \           , "RELEASING"
    \           , "RENAME"
    \           , "REPEAT"
    \           , "RESERVED"
    \           , "RESIGNAL"
    \           , "RESTART"
    \           , "RESTRICT"
    \           , "RESULT"
    \           , "RETURN"
    \           , "RETURNS"
    \           , "REVOKE"
    \           , "RIGHT"
    \           , "ROLE"
    \           , "ROLLBACK"
    \           , "ROLLUP"
    \           , "ROOT"
    \           , "ROUTINE"
    \           , "ROW"
    \           , "ROW_NUMBER"
    \           , "ROWID"
    \           , "ROWS"
    \           , "SAVEPOINT"
    \           , "SCALE"
    \           , "SCAN"
    \           , "SCATTERED"
    \           , "SCHEMA"
    \           , "SCHEMAS"
    \           , "SCOPE"
    \           , "SCROLL"
    \           , "SD"
    \           , "SEARCH"
    \           , "SECOND"
    \           , "SECONDS"
    \           , "SECTION"
    \           , "SEGMENT"
    \           , "SELECT"
    \           , "SENSITIVE"
    \           , "SEPARATE"
    \           , "SEPARATOR"
    \           , "SEQUENCE"
    \           , "SESSION"
    \           , "SESSION_USER"
    \           , "SET"
    \           , "SETS"
    \           , "SFLIKE"
    \           , "SHARE"
    \           , "SHLIKE"
    \           , "SHORT"
    \           , "SIGN"
    \           , "SIGNAL"
    \           , "SIMILAR"
    \           , "SIZE"
    \           , "SLOCK"
    \           , "SMALLFLT"
    \           , "SMALLINT"
    \           , "SOME"
    \           , "SPACE"
    \           , "SPECIFIC"
    \           , "SPECIFICTYPE"
    \           , "SPLIT"
    \           , "SQL"
    \           , "SQL_STANDARD"
    \           , "SQLCODE"
    \           , "SQLCODE_OF_LAST_CONDITION"
    \           , "SQLCODE_TYPE"
    \           , "SQLCOUNT"
    \           , "SQLDA"
    \           , "SQLERRM"
    \           , "SQLERRM_OF_LAST_CONDITION"
    \           , "SQLERRMC"
    \           , "SQLERRML"
    \           , "SQLERROR"
    \           , "SQLEXCEPTION"
    \           , "SQLNAME"
    \           , "SQLSTATE"
    \           , "SQLWARN"
    \           , "SQLWARNING"
    \           , "START"
    \           , "STATE"
    \           , "STATEMENT"
    \           , "STATIC"
    \           , "STDDEV_POP"
    \           , "STOP"
    \           , "STOPPING"
    \           , "STRUCTURE"
    \           , "SUBSTR"
    \           , "SUBSTRING"
    \           , "SUM"
    \           , "SUPPRESS"
    \           , "SYNONYM"
    \           , "SYSTEM_USER"
    \           , "TABLE"
    \           , "TABLES"
    \           , "TEMPORARY"
    \           , "TERMINATE"
    \           , "TEST"
    \           , "TEXT"
    \           , "THAN"
    \           , "THEN"
    \           , "THERE"
    \           , "TIME"
    \           , "TIMESTAMP"
    \           , "TIMESTAMP_FORMAT"
    \           , "TIMEZONE_HOUR"
    \           , "TIMEZONE_MINUTE"
    \           , "TO"
    \           , "TRAILING"
    \           , "TRANSACTION"
    \           , "TRANSLATE"
    \           , "TRANSLATION"
    \           , "TREAT"
    \           , "TRIGGER"
    \           , "TRIM"
    \           , "TRUE"
    \           , "TYPE"
    \           , "UAMT"
    \           , "UBINBUF"
    \           , "UCHAR"
    \           , "UDATE"
    \           , "UHAMT"
    \           , "UHANT"
    \           , "UHDATE"
    \           , "UNBOUNDED"
    \           , "UNDER"
    \           , "UNDO"
    \           , "UNIFY_2000"
    \           , "UNION"
    \           , "UNIONALL"
    \           , "UNIQUE"
    \           , "UNKNOWN"
    \           , "UNLIMITED"
    \           , "UNLOCK"
    \           , "UNTIL"
    \           , "UNNEST"
    \           , "UPDATE"
    \           , "UPPER"
    \           , "USAGE"
    \           , "USE"
    \           , "USER"
    \           , "USER_GROUP"
    \           , "USER_LEVEL"
    \           , "USING"
    \           , "UTIME"
    \           , "UTXTBUF"
    \           , "VALUE"
    \           , "VALUES"
    \           , "VAR_POP"
    \           , "VAR_SAMP"
    \           , "VARCHAR"
    \           , "VARCHAR_FORMAT"
    \           , "VARIABLE"
    \           , "VARYING"
    \           , "VIEW"
    \           , "VIRTUAL"
    \           , "VISIBLE"
    \           , "VOLATILE"
    \           , "VOLUME"
    \           , "VOLUMES"
    \           , "WAIT"
    \           , "WHEN"
    \           , "WHENEVER"
    \           , "WHERE"
    \           , "WHILE"
    \           , "WINDOW"
    \           , "WITH"
    \           , "WITHIN"
    \           , "WITHOUT"
    \           , "WORK"
    \           , "WRITE"
    \           , "XLIKE"
    \           , "XLOCK"
    \           , "XML"
    \           , "XMLAGG"
    \           , "XMLEXISTS"
    \           , "XMLPARSE"
    \           , "XMLQUERY"
    \           , "XMLSERIALIZE"
    \           , "YEAR"
    \           , "YEARS"
    \           , "ZONE"
    \         ]
    
    function! s:keyword.capitalize(first_line, last_line) dict
        let default_foldenable = &l:foldenable
        let &l:foldenable = 0
        let curretn_win_set = winsaveview()
    
        for l:keyword in self.keywords
            execute a:first_line . ', ' . a:last_line .
            \     's/\v(^|\s|\()\zs' . l:keyword . '\ze(\)|\s|$)/\U&/gice'
        endfor
    
        call winrestview(curretn_win_set)
        let &l:foldenable = default_foldenable
    endfunction
    
    command! -range=% CapitalizeSQLKeyword call s:keyword.capitalize(, )

【SAS】PROC FCMPプロシージャーでの可変長引数の利用について

SAS

PROC FCMPでは下記のように、引数名[*]と定義し、引数リストの外にvarargsと記述することで可変長引数を扱えます。

__GooglePrettify__
    > options cmplib=sasuser.funcs;
    > 
    > proc fcmp outlib=sasuser.funcs.temp;
    > function summation (b[*]) varargs;
    >     total = 0;
    >     do i = 1 to dim(b);
    >         total = total + b[i];
    >     end;
    > return(total);
    > endsub;
    > sum=summation(1,2,3,4,5);
    >    put sum=;
    > run;

    http://support.sas.com/documentation/cdl/en/proc/61895/HTML/default/viewer.htm#a002975331.htm

ただ一点問題がありdata stepで上記のfunctionを使用する場合は上記のサンプルにあるようにsummation(1, 2, 3, 4, 5)のような記載では使えません。 その理由はdata stepで可変長引数を要求するユーザー定義関数を使用する場合には、引数としてarrray(正確にはtemporary array)を必要とするからです。ただtemporary配列を作成し、変数をそのtemporary配列に格納するのは面倒くさいという問題があります。具体的には下記コード(使用例1)のような作業を必要とします。

__GooglePrettify__
    /* 使用例1 */
    data test;
        numeric1 = 1;
        numeric2 = 2;
        numeric3 = 3;
        numeric4 = 4;
        numeric5 = 5;
        
        array temp[5] _temporary_;              /* temporary配列 */
        array physical[5] numeric1-numeric5;    /* numeric1からnumeric5までを格納した実配列 */
    
        
        do i = 1 to dim(temp);
            /* 実配列からtemporary配列への格納処理 */
            temp[i] = physical[i];
        end;
        result = summation(temp);
        /* result = summation(physical); -> 実配列のためエラーとなる */
        /* result = summation(numeric1, numeric2, numeric3, numeric4, numeric5); -> 配列ではないためエラーとなる */
        put result=;
    run;

上記サンプルの通りdata stepで可変長引数を使用するユーザー定義関数を使用するのはとても面倒くさいです。そのため私は下記のmacroを作成し対処しています。

__GooglePrettify__
    **マクロサンプル;
    /*  summary : 値の入ったtemporary配列を作成する
        args    :
            temporarry_array_name   : temporary配列名称
            length                  : 配列長
            vars                    : 変数(スペース区切りで複数定義)
        example  :
            %create_temporary_array(japanese, 2, word1 word2);
            -> temporary配列であるjapaneseにword1とword2が格納された状態になる
        primary use case :
            可変長引数を求めるユーザー定義関数使用時にtemporary配列を作成する際に使用する
        TODO    :
            lengthをvarsから自動敵に設定したい
                問題点  :
                    1.事前に%count_varsなどで計算した値をmacro変数に格納しても文字列として扱われ、&length.のように扱えない。
    */
    %macro create_temporary_array(temporary_array_name, length, vars);
        %let _local_array_name = __local_&temporary_array_name.;
    
    
        array &temporary_array_name.    [&length.] _temporary_;
        array &_local_array_name.       [&length.] &vars;
    
        %let counter = insert_vars_to_temporary;
        do &counter. = 1 to dim(&_local_array_name.);
            &temporary_array_name.[&counter.] = &_local_array_name.[&counter.];
        end;
    
        drop &counter.;
    %mend;

上記マクロを利用すると先ほどの使用例1のコードがずいぶん省略できたかと思います。

__GooglePrettify__
    data test;
        numeric1 = 1;
        numeric2 = 2;
        numeric3 = 3;
        numeric4 = 4;
        numeric5 = 5;
        
        %create_temporary_array(temp, 5, numeric1-numeric5);
        result = summation(temp);
        put result=;
    run;

ただ、私自身このマクロがいまいち納得のいかない部分もありますので、ユーザー定義関数での可変長引数の使用に対して他にいい方法があったら教えてください。

【SAS】boolean(審議値)として利用できる値

SAS

SASでは0または欠損値("", .)がfalseとして判定され、それ以外はtrueとして判定される

http://support.sas.com/documentation/cdl/en/lrcon/62955/HTML/default/viewer.htm#a000780367.htm

if条件として利用

__GooglePrettify__
    if 0 then do;
        /* 通らない      */
    end;        
    else do;
        /* 通る          */
    end;


    if . then do;
        /* 通らない      */
    end;    
    else do;
        /* 通る          */
    end;


    if "" then do;
        /* 通らない      */
    end;
    else do;
        /* 通る          */
    end;




    if (not 0かつ欠損値以外の値) then do;
        /* 通る          */
    end;
    else do;
        /* 通らない      */
    end;

式としての利用

__GooglePrettify__
    bool = 5 > 3;   -> 1
    bool = 5 < 3;   -> 0