The Nameless City

何故か製薬やSAS関連のブログ、の予定。

レコード件数を取り出す「if 0 then set <dataset name> NOBS=<variable>」は、特定条件下で想定外の結果を返すので注意。

「if 0 then set 」って昔調べた時には情報ホント無かったんだけど、今SASプログラマの人がボチボチネットに書いてますね。
で、見てた時に、そういや某所でやってた時に、ここら辺で面倒臭い話あったなと思い出して調べてみた所、やっぱりこのコードは特定条件下でバグになります。まあ普通はならんのですけど。

参考までに、関係しそうな所に対してリンク貼っときます。TB打てないんだよなはてなブログ
データステップ100万回      SAS新手一生: 【訂正追補】SASデータセットのオブザベーション数をマクロ変数に格納する方法_call symput
SAS忘備録: データステップ内で、色々なデータセットのオブザベーション数を取得する
SAS忘備録: 行削除の落とし穴

通常の使い方。

プログラムは↓

data _NULL_ ;
	if 0 then set SASHELP.CLASS nobs=_SYS_OBS ;
	put 'トータルの物理オブザベーション数->' _SYS_OBS ;
	stop ;
run ;

で、ログが↓

66   data _NULL_ ;
67       if 0 then set SASHELP.CLASS nobs=_SYS_OBS ;
68       put 'トータルの物理オブザベーション数->' _SYS_OBS ;
69       stop ;
70   run ;

トータルの物理オブザベーション数->19
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.00 秒
      CPU時間            0.00 秒

簡単に説明すると、最初、定義とかは取りに行くんですが、実行部分で「if 0 then」となっているので、レコード自体は読み込まれません。
この場合に、通常はdataステップはオブザベーション数分実行されるんですが、1行も読み込まない設定の場合には、1回だけ実行されます。
データの定義部に、オブザベーション数が書き込まれてるんですね。
で、「トータルの」と但し書きを入れたのは、例えば「set SASHELP.CLASS SASHELP.CLASS」とかにすると、この合算のオブザベーション数(38)が書き込まれます。


本題にも関わってくるのですが、このデータの定義部に書かれているオブザベーション数は、「物理オブザベーション数」であり、「論理オブザベーション数」ではないという事を頭に入れておいて下さい。

特殊条件下で想定外の結果を返す例。

プログラムは以下です。

proc sql ;
	create table CLASSDEL as select * from SASHELP.CLASS ;
	delete * from CLASSDEL where AGE=15 ;
quit ;

data _NULL_ ;
	if 0 then set CLASSDEL nobs=_SYS_OBS ;
	put 'トータルの物理オブザベーション数->' _SYS_OBS ;
	stop ;
run ;

SASHELP.CLASSを複写したCLASSDELというデータセットを作成します。
そして、「SQLプロシージャで」DELETE文を発行しています。この場合、AGE=15(4オブザベーション)を削除します(ホントどうでもいい事ですが、CLASSデータセットは日本語版、UTF-8英語版などでNAMEやSEXの中の値が変わるためAGEにしてます)
その結果は?

71   proc sql ;
72       create table CLASSDEL as select * from SASHELP.CLASS ;
NOTE: テーブルWORK.CLASSDEL(行数19、列数5)が作成されました。

73       delete * from CLASSDEL where AGE=15 ;
NOTE: 4行がWORK.CLASSDELから削除されました。

74   quit ;
NOTE: PROCEDURE SQL処理(合計処理時間):
      処理時間           0.01 秒
      CPU時間            0.01 秒


75
76   data _NULL_ ;
77       if 0 then set CLASSDEL nobs=_SYS_OBS ;
78       put 'トータルの物理オブザベーション数->' _SYS_OBS ;
79       stop ;
80   run ;

トータルの物理オブザベーション数->19
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.01 秒
      CPU時間            0.00 秒

さてと。
「このデータの定義部に書かれているオブザベーション数は、「物理オブザベーション数」であり、「論理オブザベーション数」ではない」と言っていた事に繋がるのですが、SQLプロシージャでDELETE文を発行した場合、オブザベーションがまるっと消されるのではなく、単にDELフラグが立つだけです。
そしてこの際定義部は書き換えられないです。
その為、こうなります。

同様の操作をdataステップで実行する事は可能です。但し、MODIFYなんて、まあ滅多に使わないと思いますが。

data CLASSDEL ;
	set SASHELP.CLASS ;
run ;
data CLASSDEL ;
	modify CLASSDEL ;
	if AGE=15 then remove ;
run ;
data _NULL_ ;
	if 0 then set CLASSDEL nobs=_SYS_OBS ;
	put 'トータルの物理オブザベーション数->' _SYS_OBS ;
	stop ;
run ;
308  data CLASSDEL ;
309      set SASHELP.CLASS ;
310  run ;

NOTE: データセットSASHELP.CLASSから19オブザベーションを読み込みました。
NOTE: データセットWORK.CLASSDELは19オブザベーション、5変数です。
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.01 秒
      CPU時間            0.01 秒


311  data CLASSDEL ;
312      modify CLASSDEL ;
313      if AGE=15 then remove ;
314  run ;

NOTE: データセットWORK.CLASSDELから19オブザベーションを読み込みました。
NOTE: データセットWORK.CLASSDELを更新しました。
 オブザベーションの再書き込み0、追加0、削除4
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.00 秒
      CPU時間            0.01 秒


315  data _NULL_ ;
316      if 0 then set CLASSDEL nobs=_SYS_OBS ;
317      put 'トータルの物理オブザベーション数->' _SYS_OBS ;
318      stop ;
319  run ;

トータルの物理オブザベーション数->19
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.00 秒
      CPU時間            0.00 秒


現在、「SQLプロシージャでDELETEステートメントを発行する」「DATAステップでREMOVEステートメントを発行する(MODYFYステートメントでデータセットを取り込む場合)」場合に、「物理オブザベーション数が論理オブザベーション数から乖離する」事がわかっています。

この時他の方法でデータを取得するとどうなっているか?

他に、オブザベーション数を取得する方法は、ざっと考えて二つあります。
CONTENTSプロシージャを利用する方法と、SQLプロシージャでSASHELP.VTABLE(あるいはDICTIONARY.TABLES)を利用する方法です。

proc sql ;
	create table CLASSDEL as select * from SASHELP.CLASS ;
	delete * from CLASSDEL where AGE=15 ;
quit ;
data _NULL_ ;
	if 0 then set CLASSDEL nobs=_SYS_OBS ;
	put 'トータルの物理オブザベーション数->' _SYS_OBS ;
	stop ;
run ;

proc contents data=CLASSDEL out=INFODEL noprint ;
quit ;
proc print data=INFODEL ;
	var MEMNAME NOBS DELOBS ;
quit ;

proc sql ;
	create table INFODEL2 as
	select MEMNAME,NOBS,DELOBS,NLOBS from SASHELP.VTABLE
	where LIBNAME='WORK' and MEMNAME='CLASSDEL' ;
quit ;
proc print data=INFODEL2 ;
	var MEMNAME NOBS DELOBS NLOBS ;
quit ;

今度は、アウトプット(LISTINGで出力)を。

OBS    MEMNAME     NOBS    DELOBS

 1     CLASSDEL     15        4
 2     CLASSDEL     15        4
 3     CLASSDEL     15        4
 4     CLASSDEL     15        4
 5     CLASSDEL     15        4
OBS    memname     nobs    delobs    nlobs

 1     CLASSDEL     19        4        15

CONTENTSプロシージャの出力には変数の情報も入ってくる為その分オブザベーションが増えてしまっているのですが、NOBSは想定のものに「書き換えられている」イメージです。
SQLプロシージャで、SASHELP.VTABLEを利用すると(これは裏でせっせと情報集めに行っているので注意が必要です--対象になるテーブルだけ参照しに行きますが、WHEREの書き方やハンドリング次第ではかなり時間がかかります)、書き換わっていない「NOBS」が表示されます。
DELOBSという変数を表示させていますが、こちらが「削除された(が物理的には残っている)オブザベーション数」になります。
NLOBSはVTABLEにしかありませんが、こちら「論理オブザベーション数」です。

余談

削除されたオブザベーションは、内部的にはデータを保持していますのでバイナリエディタとかで確認出来たりします。
あと、当然ながらパフォーマンス劣化につながります(以前SASサーバのレポジトリ肥大とかあったのはそのせいだろうなあ。今のバージョンでは確認してませんが)。
その場合には、

data <dataset> ;
	set <dataset> ;
run ;

とか書ければ良いのですが。
あと、普段のSAS使いの人はあまり影響ないとは思いますが、Data Integration Studioで、SQLのDELETE文はわりと発行しているので注意です。


ただ、この削除方法等はRDBMSでは見かけるものです。その目的は、マルチアクセスという事にあるわけで、そういや、SAS/SHARE辺りは特に考えてなかったなあ・・・・・・面倒臭い。

1ファイルのサイズは1GB以下にした方が良いのは、コンピュータ・システムという事を使っている要件による。

SDTMの1ファイルが1GB制限であるというのは、OSや各種ファイルシステム、アプリの要件であり、この規制は無意味ではなく通信の物理制約も含めて「担保出来る範囲」という事です。
現在はだいぶ通信も安定している環境が多いのであんまり気にならないのかと思いますが、1GBではなく2GBではファイルシステムやアプリで制限が出て来ます。
例えば、ZIPの元の規約では、1ファイルのサイズが2GBを超えられず、圧縮ファイル全体のファイルサイズも2GBを超えられません。


ファイルというものが、そもそもサイズ制限が「必ず」存在し、そこを超えられないという事を認識した方が良いです。


で、これらを解決する方法は、当たり前に「ファイルの分割しかない」んです。
圧縮などのアルゴリズムも、送り手と受け手側に同じ認識がないとダメですし。これをXMLフォーマットにした所で、「物理的ファイルのサイズは制限された方がいい」のは普通です。
例えばインターネットを介したファイルの転送では、社内だとネットワークドライブとか、「仮想的にローカルディスクっぽくして扱う」のが当たり前になっているでしょうが、本来「転送はしばしば失敗し、分割して送信されているパケットは順不同になったりもする」ものです。
1ファイル辺りのサイズが大きくなればなるほど、転送に失敗する確率も増えていきます。まあ、レジューム機能つきでの転送とかもない訳じゃないですが、あまりに長い時間転送しようとすると、その通路上でのトラブルが増えます。FWでのヘッダの改造が原因だったり、長時間のダウンロードの強制停止であったり、原因は様々ですが。
てか、まず、「分割するのが基本」と思った方が良いです。


ただ、この話、「SDTMのガイドラインとして考えるべきか」というと、それとは違うレイヤなんですけどね。
ODMとかそこら辺の話です。SDTMに付随する情報として扱うべきで、本来、ファイル名+ナンバリングで逃げるのは厳しい所なんですがね。
ただ、CDISCの各種規約、骨組みはともかくとして実装が進んでいるのがSDTMな為、歪な発展するのは仕方ないですけどね。まあ結局SDTMが越境してくるような形で各標準書き換えるんだとは思いますが。

SAS9.4のサービス起動順序。

よく忘れるので。

SAS(R) 9.4 Intelligence Platform: System Administration Guide, Fourth Edition/Starting, Stopping, and Checking the Status of Servers/Operating Your Servers/Overview of Server Operation/Starting Servers in the Correct Order
以下の所を引用。

Start Order Server or Service Tier Dependencies
1 SAS Metadata Server*1*2 Server tier
2 SAS Web Infrastructure Platform Data Server Server tier
3 SAS OLAP Server Server tier SAS Metadata Server
4 SAS object spawner Server tier SAS Metadata Server
5 SAS/SHARE server Server tier SAS Metadata Server
6 SAS/CONNECT spawner Server tier SAS Metadata Server
7 SAS Deployment Tester server Server tier SAS Metadata Server
8 SAS Distributed In-Process Scheduler Job Runner Server tier SAS Metadata Server
9 JMS Broker Middle tier
10 Cache Locator Middle tier
11 SAS Web Server*3 Middle tier
12 SAS Web Application Server Middle tier Cache Locator
13 SAS Environment Manager server Middle tier SAS Web Infrastructure Platform Data Server
SAS Web Application Server*4
14 SAS Environment Manager Agent Server and middle tier
15 SAS Deployment Agent Server and middle tier

明確な依存関係は意外なほど薄いのであるが。
薄いのであるが。
しかし、サービスのスタートアップで、レスポンスタイムアウトとか結構あるっぽいんだよなー。
ちなみに、確認用にするつもりで、サービス登録でなくシェル起動で設定しようとすると、インストールでコケるのでとりあえずサービスで突っ込んだ後にサービスを手動構成にするという荒業を行っている。自己責任でどうぞ。
あと、最小構成でも8GB程度のメモリだと起動後で既にほぼメモリを使い切ってるような状況になる(実際には6GBくらいなんだが・・・・・・)。
厄介なのはMiddle Tier(Webサービスとかが起動してる所)なので、こっち側は必要な時に上げ下げするつもりで良いのかも知れん。
各サービスの機能については、また別エントリで。

余談。
手動のサービスを上げ下げするには、管理者実行の必要がある。「net start~」もあるが、個人的には最近は「sc start~」を使っている。

*1:In clustered configurations, make sure that all metadata server nodes are running before you start dependent components.

*2:In the third maintenance release for SAS 9.4, the documentation was changed to recommend starting the SAS Metadata Server first, followed by the SAS Web Infrastructure Platform Data Server (instead of the reverse). This order is easier and more logical for deployments in which the metadata server is installed on a separate machine from the other server-tier components.

*3:In the first maintenance release for SAS 9.4, the documentation was changed to recommend that the SAS Web Server be started before the SAS Web Application Server. This start-up order helps ensure optimum performance when web applications are initialized. The sas.servers script has also been changed to incorporate the new order.

*4:The SAS Environment Manager server can start without these components. However, the SAS Environment Manager application requires them in order to provide full functionality.

Windowsで特定のフォルダをドライブとしてマウントする方法

Windowsで特定のフォルダを仮想ドライブとしてマウントする方法
SUBST - Wikipedia, the free encyclopedia


SUBSTパターンでは満足しない人(私だが)の為に。
DOSデバイスとして「(ドライブレター):」とレジストリに書く方法があるのでまあそれもオススメだが、英語版Wikipediaにあるように起動時スクリプトとして仕込んでしまうのも一つ。Windowsの起動時のスクリプトはスタートアップで仕込むべき、では別にないので。


DOSデバイスとして設定した場合には、便利な事もあるが不便もあり、まあ、レジストリからしかタッチできんしなあ。

Windowsのレジストリを弄ることでメニューを作る。

最近もまたWindowsでSAS9.4TS1M2とかインストールしてんだけど。
うっかりUnicodeでの構成とかをデフォルトにした御蔭でちと面倒なことに。
f:id:houyhnhm:20160127164735p:plain
拡張子「.sas」に関連付けて幾つかメニューが作られるんだけど(この画像は既に仕込んだ後なんだけど)、バッチ実行をする際にあるメニュー

  • SAS9.4でバッチサブミット
  • SAS9.4(UTF-8)でバッチサブミット

どちらで実行してもUTF-8モードで動いてしまうようになった。


ので、急遽、「SAS9.4(S-JIS)でバッチサブミット」というメニューを作った。

レジストリエディタを起動して設定する。

まあ、個人端末なので簡単とは言え、この領域はアプリインストール出来る人、まあAdministratorsに所属してないと多分いじってはいけないけど。
いけないんだけど、そんなに怯えることはないです。レジストリエディタでレジストリいじる時には、必ず最初に元のレジストリをエディタからエクスポートしておいたら、最悪元に戻せる。
特にこれからいじる箇所は、そう他のアプリに影響することはない。

HKEY_CLASSES_ROOT

この下に、拡張子の設定、ファイルの設定色々が混じっている。.sasの場合、以下のようになっている。
f:id:houyhnhm:20160127165738p:plain
「.sasの場合には、既定のSAS.Program.701を見てね」ということなので、この.sasの下ではないSAS.Program.701を見る。f:id:houyhnhm:20160127170331p:plain
このSAS.Program.701の下にshellという枝が見えると思う。その下に、右クリックメニューで設定するような内容がある。
例えば、Batch940という枝は、
f:id:houyhnhm:20160127170522p:plain
f:id:houyhnhm:20160127170625p:plain
こういう構成になっている。
Batch940とかの名称はまあ重複しないようにして、何らかの新しいメニューを追加することが出来る訳です。
commandの内容は、
「"C:\Program Files\SASHome\SASFoundation\9.4\sas.exe" "%1" -nologo -config "C:\Program Files\SASHome\SASFoundation\9.4\SASV9.CFG"」
になっていて、Unicodeで構成するようにすると、ここのCFGの内容が、

-config "C:\Program Files\SASHome\SASFoundation\9.4\nls\u8\sasv9.cfg"

になってて、UTF-8の設定を見るようになってるのね(ちなみにここバージョンやOSによって設定のやり方が異なるので注意)。

ここをいじるのでも後先考えないなら別にいいけど、後でSASの構成変えたりする時にどうにかなるのも面倒なので、自分はメニューを追加した。

[HKEY_CLASSES_ROOT\SAS.Program.701\shell\Batch940SJIS]
@="SAS 9.4 (S-JIS) でバッチサブミット(&B)"

[HKEY_CLASSES_ROOT\SAS.Program.701\shell\Batch940SJIS\command]
@="\"C:\\Program Files\\SASHome\\SASFoundation\\9.4\\sas.exe\" \"%1\" -nologo -config \"C:\\Program Files\\SASHome\\SASFoundation\\9.4\\nls\\ja\\SASV9.CFG\""

余談だけど、ここでは文字は二重引用符で囲む。で、その中の特殊文字は\でエスケープしてます。

設定後は特に再起動とか必要ないので適当に試してみたらいいと思います。

Non-parametricな手法とParametricな手法の分岐パターンって、本当に必要なの?

正直な所、そう思っている。


Non-parametricな手法であるべきかParametricな手法であるべきか、なーんてのは、実施する測定値や前提で決まってるんじゃないの?
ってねえ。
その分岐に使われるのが、ひたすら等分散性の検定での判定だったりすることもあって、なーんかモヤモヤする。
利用したくなる気持ちも分かりはする。機械的に判断出来るのは自動的にしたい所だし。
でもそれって、設定のデフォルトとかですべき話じゃない?


例えば、ある検査機器で行うある測定値が、普通はパラメトリック検定になるんだけど、たまたま測定値の打ち切りみたいなのが発生しましたーじゃノンパラで、ってのは、何かおかしいよね。
普通、その測定値の原因調査が必要だよね。
打ち切りが発生するようなら、その検査機器で測定すべきじゃない値なのかもしれないし。
無論、そういう値が沢山出て来て仕方がないのでノンパラで、とかはいいよ?でも、等分散性の検定の結果だけでホントに判断出来るもんなんかなあ?あと、それならそれで、等分散性の検定結果、だけではなく、分散とかも必要な情報になるしねー。プロットの必要もあるんじゃないかなあ。


何というか、実験計画に組み込まれてるべきなんだよそこってーと思うんだけど。何でだろうねえ。


あと、面倒だっつっても、検定統計量とその変換形であるP値以外にも、ふつーの平均値/標準偏差/標準誤差ペアみたいなのはほしいよね。ノンパラだと中央値/四分位点だし。確率プロットみたいなのいるんじゃないかなあと。


道具作る職人なんでどう使おうが知らんとは言え、なんだかなあ。

Windowsでレジストリをいじって右クリックメニューに適当にS-JISでのバッチ実行用メニューを追加する。

こんな感じ。
改造元は、SAS9.4かで出て来ている、UTF-8でのバッチ実行のを見てです。まあ、要は拡張子連動の所で、明示的にコマンドを書いて上げるのです。
一応レジストリをなぶるので自己責任でどうぞ、とはいうけど、これぐらいはいじれるようになってた方が、Windowsユーザとしては幸せになれると思います。

[HKEY_CLASSES_ROOT\SAS.Program.701\shell\Batch940SJIS]
@="SAS 9.4 (S-JIS) でバッチサブミット(&B)"

[HKEY_CLASSES_ROOT\SAS.Program.701\shell\Batch940SJIS\command]
@="\"C:\\Program Files\\SASHome\\SASFoundation\\9.4\\sas.exe\" \"%1\" -nologo -config \"C:\\Program Files\\SASHome\\SASFoundation\\9.4\\nls\\ja\\SASV9.CFG\""

多分ググったら出てきたんだろうなあ・・・・・・

職場の人と話してた時に「その話ネットで見た」みたいに言われたんですが。
それ多分私のブログです。
職場ではイチイチ言ってませんが。


ま、そんなものです。


先代の人からそんなんでしたが(会社の人には知られていないが外部からは見える、みたいな)、
今ウチの会社の人ってあんまり外部発信なりネットヲチなりしてないんですよねー。
会社からは多分「役に立ってないけど売上も上がらない人」みたいな感じに見えてると思います。
まあいいけど。


システム開発の会社なのに、技術とか全く評価されない会社なんでまあもうどうしようもないですねえ。本気で転職活動でもするか・・・・・・でも転職しちゃうと上司も先輩もやっちゃったので、残された人が悲惨になりますからねえ・・・・・・

SASの最新環境への対応の遅さがそろそろキツイ。

SAS on Linuxを色々試しているのだけど、今の時代において
UTF-8はフルサポート出来てません」
というのはホント如何なものかとは思う。


プロセス自体は対応出来ていても、DMSの対応が遅れているだとか、ホント困るんだが。
コアプロセスのイメージが更新出来ていないのよな、今でも。個々のクライアントモジュールは最初からUTFだぜなJavaとかなんでいいけど。


あと、XPTファイルでの対応が地味に首が絞まっている。
XPTファイルはASCII前提の時代に作られたフォーマットなので、DBCSに厳密には対応していない。
ゆえにエンコーディング情報も持ってないし、もう少しマシなトランスポート形式を作ってほしいものである。作らなくてもそのうちCDISCがXML対応を完了する、のかも知れないが、すでにもうXMLでデータを表現するというのに問題も多くあるし。


もう、今時、ロケールとかフォントの設定で悩む時代じゃないと思うんだよなあ・・・・・・

LinuxでのPython環境構築について

Win7/VboxでFedoraPythonでも、とかやっていると、悲しいことに、Windowsに最適化されてんだなあ社内LANは、と思うことに度々遭遇する。
しかし、もともと多分Linuxが抱えている闇として、Proxy設定がどーも一筋縄ではいかないというだけなのねということかも知れない。

pythonzを使おうとして挫折。

pythonz+virtualenv+direnvとかで環境を作ろうとしてみたものの、pythonzでのインストールで、どうしてもProxyに阻まれているとしか思えない事象に何度も遭遇した。
そもそも、どんな開発言語でも使える統一したやり方としてのdirenvだけではどうしようもない気がしていたのだけど、そこら辺、pyenvだととにかくproxy通すことができるので、pyenvにする。
pyenvは先行して「zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel」のインストールが必要ではあるが、そこはdnfで入れた。github.com

まだdefaultではないものの、Fedora23ではpython3も入っている。

そのうちdefaultがpython3になるとは思うが。

やたらChromeのページが落ちるから何だと思ったら、メモリが壊れてた。

しかもどーも一枚目がやられてたからっぽい。


結論を知ってしまうと、「なんだこんなことか」と思うのですが、原因究明には割と苦労しました。
障害分析って、ハード層からOS、アプリ層まで広くあるのでホントフックかけるだけの知識がいるなあ・・・・・・


余談ですが、近年のGoogleのこの手の技術情報検索能力が低下している気がします。
時事ネタにヒットしやすいんですが、技術情報にはヒットしづらいという。
考えようによったら、知識共有サービスがおいしい状況ではあるんですが、うーん、Google検索エンジンにその手のオプションがほしいだけなんですがねえ。
日本語の技術情報は、正直、「よく分からんが何となくクリアしてます」みたいな情報が多く、結論的にはかなり使えない情報にはなってます。
知識共有サービスも、基本的にはWiki形式の方が多分いいと思うんですよね。技術情報のWikipediaみたいな試みがなされるとよいと思います。
多分Adwordsとかじゃなくてスポット広告みたいなので食えます。ランダム表示で雰囲気で表示させるような広告に比べて、どストレートにリンクを張る事もできるし、広告営業もしやすいんじゃないかなあ・・・・・・まあここは運営コストとかをペイできる、程度であり、爆発的にそれだけで儲けられる訳じゃないでしょうが、技術情報もストリーム的に流れてくとかITが売りの所がタブロイド化してWebの時事ネタひろう浅ましい状況にもなっているので、ここら辺ジャンル壊すような何かは出来そうとは思ってます。自分はやらないけど。余談の余談ですが、そろそろWebマガジンのクオリティペーパーを考えてもいい頃。

Proxy設定が案外悩ましい。

企業内認証つきProxy(ただし基本的には自動構成スクリプトでプロキシを決定)での事。

SELinux適用などを考えると、細々とした所で設定が必要になる。

よく考えるとそりゃそうで、プロキシ設定を環境変数でやり切ると、そこへ影響させると通信に対して攻撃者がプロキシかませるという事にもなる訳で。

DNFでの設定

Fedora22からDNFになってる。yumより便利になったのかは正直分からん。ただひたすらプラグイン出てたのが整理されたのはいいことだなと。
yumと同じ書き方だけど、/etc/dnf/dnf.confに記述。
但し、ここでは、自動構成スクリプトでの設定方法は見つからず。dnfにプラグインあったら知らんけど。

MATEの「ネットワークのプロキシ設定」

自動構成スクリプトの設定には出来るが、当然ながらユーザやパスワードを記録する所はない。まあそうだろ。

以前は環境変数として設定してたけどさ・・・・・・

ローカルでのVM内とは言え、SELinuxをdisabledにしてかつ/etc/profile.dにシェル組み込む、みたいなのが超絶面倒臭かったし。
あと、よく「企業内LAN」→「テザリングでのProxy見えない環境」とかでも対応出来るようにとシェル化するのも考えてたんだけど。
どちらにしろあんまり上手くないのであれば、SELinuxを活かす方向で考えようとは思っている。
仕事に活かす為には多分そっちの方がいいし。

SAS関連の仕事辞めたい。

色々な理由があるが。

所詮米国製品、日本語対応が微妙だという事

もう何年目なんでしょうか。
UTF-8対応ですらロクなもんではないというか、文字操作下手なままだよね。

設計思想が昔のものなのでUTF-8にまだ対応しきってないし、対応予定も不明な事

昔の素のSASがよい、という人にとってもUTF-8だと地獄なのですよこれが。
LinuxSAS入れるとかあるんだけど、DMSがUTF-8をフルサポートしてないんだよなあ・・・・・・正直ツライ。

周りのモジュールが、怪しげなPrivate JREに依存している事

まあ、とりあえず1.7ベースなんでもうマズいだろと思うわけだけど、Oracleと提携して今後もサポートしていく予定っちゃ予定らしい。
らしいんだが、それってSAS全体でのコンポーネントがそれに縛られるという罠。

日本でのサポートがとりあえずかなり薄い事

元々マニュアルすらナカナカ日本語化が遅い、んだけど、技術情報すらもあんまり見ずに提供してくれたりする。
多分技術資源も枯渇してる。
元々頓珍漢な回答をしてくる事もあったんだけど、SAS Note検索で終わってしまっている所がなんとも頼りない。

細々としたトラブルがあり過ぎる事

デグレも起こすし、製品としての質も上がらんし、ビジュアライゼーションには微妙だし、サーバ製品ばかり売りつけようとするし。
まあ、あと、統計解析のアプリは、各種データを引っ張りだした後に「手元で」解析したい事が多い訳で、ここら辺、客のニーズに答えてない感じがスゴイんだよなー。
あと、確かに出来るとスキルにはなるよ。なるんだけどさ、スキルが必要過ぎる言語ってのもちと違うんじゃないかとは思う。

ビッグデータ分析の幻想に付き合うのもうんざりする事

要求されてんのは、「簡単にデータ加工出来る事」だったりするのよね。まず。統計用に綺麗にした後のデータが大きかろうが小さかろうかどうでもいい。というか、案外大きなデータは必要ない。
一番の問題は、その手のビッグデータを作る場合に、「全件洗い替え」みたいな事が全く出来ずに「差分更新」という所でだいたい地獄に行くんだわ。溜めたデータが問題ないかどうかの検証とかねえ。

SASの移行問題アレコレ。

メモ書き。

クロスプラットフォームなのは、「データセット」だけ。

大変残念なお話ではある。
本質的に単なるテキストファイルなのでどうしようもないSASプログラムの問題はおいておくとしても。
非互換なのが、SASカタログ形式も含まれるのが地味に痛い。
FORMATやMACROなどをふっつーにぶち込んだのが悪いと言えば悪い。たまにPNGなどの画像ファイルも入る訳だが。

プラットフォームの境目は、OSもだがbit数も問題になる。

これ、大変出来が悪いというか何というか。非互換の壁が単に32bitと64bitで壁になってしまう。何で?とは真剣に思う。

UTF-8エンコード下でのSASプログラミングは本当に心臓に悪い。

元々バイト長指定での定義っつーのも悪いんだが(悪い事バッカリだなあ)、想定文字数×3倍を想定する必要があるのが、S-JISの場合の2倍に比べてイメージもしにくいし大変。
無駄に長いしなあ。32767バイト→おおよそ一万字が最大長というのも、正直どうなんだという気はする。

変換で問題になるのは、「データセット名」も「変数名」も「ラベル」も。

データセット名も変数名もSASNameでお願いします。だが、ここら辺の区切りを勝手にSASが拡張し、SAS謹製のものでは平気でぶち込んでくるのが仕方ないのは仕方ないが。
治験関連では一切見たことないが、BIでの分析では平気でその手のデータセットを作って来る。
使い勝手も悪かろうに、とは思うのだが、それ以上に問題になるのが、「この手の非ASCII文字も移行の壁になる」という所。
化けますしラベルはよく切れます。はい。

移行に際してSASのライセンスの二重持ち期間が発生するパターンがががが。

これも大変厄介で、単にバージョンを上げたい・bit数を変えたプラットフォームで、というような話でも、移行期間が契約上の期間に縛られる。無論、32bit環境がなくなれば、非互換のものをどうにかテキスト抜く(フォーマットカタログならデータセットに抜ける)事が出来なくなる。

中途半端なSASの「サポート」が問題。

テクニカルサポートの話じゃなくて。
クロスプラットフォームと言いながら非互換がかなりあるとか、資産移行に関して元の環境から抽出することが必要とか、まあ、結構コアな次元からコンピュータ知っていて初めてピンと来るような話が沢山ある。
これ、2000年代に遭遇してたら、まだ客に理解してもらいやすかったんだが、今だとIT化第一世代の人が退職してたりする為、顧客企業にノウハウ持ってる人も減ってる。
説明するのがホント面倒なんだよね。「当たり前に出来るでしょ?」みたいに思われてるから。

Officeのbit数とSASのbit数をあわせたりあわせなかったりの問題。

ちっと前まではOSがx64化してもOfficeは32bit版というのが結構あったのよ。Officeの64bit版でいくつも障害があったりして。
あ、Officeも32bitと64bitではコンパイル済みのVBAがbitに影響されたりして最悪だったなあ。
この、bit数の違いを対応するのに、「bit数の違いがある場合には、PC File Server経由アクセスで」「そうでない場合には今までどおり」という風にコードが分かれた(機能的にも分割された)という所がまた厄介。
何かxlsxエンジンとかも追加されたけどねえ。


コード側で細かく条件つけて連携したりインポートしたりエクスポートシたり出来ないので(ここの機能制限が本当に腹立たしいのだけど、変数の自動作成+自動判定をACEエンジンに任せている都合もあって、SASのバグではなくOfficeの機能制限だったりする)、SAS/ACCESS Interface to PC Filesはナカナカ簡単な機能ではなくなってしまってる。
ま、EGに実装されているExcelインポートも、実際の所.net側で特殊区切り文字のテキストファイルにしてからサーバ側で読み書き実行しているので、最早SASから直接Excel読み書きする「べきでない」のかも知れない。


ああ、もう、64bitでも互換性の為に32bitエンジン積んでいるとかでもいいのでそうしておいてほしいなあとは思う。ライセンス料2倍とかは要らんでしょ?