UWSC 掲 示 板
投稿時に「証明書が不正です」と出る場合には、JavaScriptをオンにしてください
動作不具合での質問の場合には環境(OS,IEのバージョン等)の表記もしてください
タイトルは質問内容を表したものにしてください
ネットゲーム関係の質問はご遠慮ください

縛りありfizzbuzz / stuncloud
12月なのでちょっとしたお遊び投稿します

・数値、文字リテラル禁止
・組み込み定数も禁止

one = val(! length(balloon()))
two = one + one
three = one + two
four = two + two
five = one + two + two
eight = four + four
nine = three * three
hundred = five * five * four
f = hundred + two
i = hundred + five
b = hundred - two
u = hundred + five * two + five + two
z = hundred + five * four + two
fizz = chr(f) + chr(i) + chr(z) + chr(z)
buzz = chr(b) + chr(u) + chr(z) + chr(z)

for i = one to hundred
 j = i mod three
 k = i mod five
 print copy(fizz + buzz + i, nine - !j * eight - !k * four, four + !j * !k * four)
next


出力部分は以前しゅんさんが考案したものそのままです、いいですよねこの何してるのかわかんない感じ
one = 1 さえ作れてしまえばいいので最初は
one = DOWN
にしていたんですが、ここ以外定数が使われてないのでいっその事これも禁止にしました
やってることは
one = val(TRUE)
です

実際書いてみると縛りがあるというほどでもなかったのと、あまりきれいな感じでもなかったのが残念ですね
今はなんかもっとどぎつい縛りができないかなーって考えてる最中です

No.4848 2017/12/15(Fri) 18:06:07

Re: 縛りありfizzbuzz / satocha
「わりと短めでいいんじゃないだろうか」とネットで評判のプログラムを拝借しました。
FIZZBUZZなのに「15」という数値を使わないところがさすがですね。

※zeroは不要ですが、後々のため(?)出力しています。

※万一、タイムマシン等で2000年にいらっしゃることがあれば、このスクリプトは動作しない可能性があります。あらかじめ、ご承知置きください。

//mkFizzbuzz.uws
sendstr( exec("notepad"), powershell(trim(_fiz_ps1)) )

textblock _fiz_ps1
$BINARY=@(@{b0="!(!gettime())"})
for( $i=0;$i-lt7;$i++){
$BINARY+=,@{("b"+[string]($i+1))="b${i}+b${i}"}
}
#$BINARY.getEnumerator()
$ZERO="!gettime()"
function getNumber($num){
if ( $num -eq "0" ){
return $ZERO
}
$bin =[convert]::Tostring($num,2).padleft(8,"0")
$idx=7
$res=""
[char[]]$bin|%{
if ($_-eq"1"){
$res+="b${idx}+"
}
$idx--
}
return $res -replace "[+]$",""
}

$src="1..100|%{@('Fizz')[`$_%3]+@('Buzz')[`$_%5]-replace`"^$`",`$_}"
$idx=0
$fig_code=@{}
$code_val=@{}
[char[]]$src|sort|gu|%{
$code ="c"+[string]($idx++)
$fig =$_
$val =[string][text.encoding]::ascii.getbytes($_)
#"$code`t$fig`t$val"
$fig_code.$fig =$code
$code_val.$code =getnumber $val
}

$pssrc=""
[char[]]$src|%{
$pssrc+="chr(" + $code_val.($fig_code.$_)+ ")+"
}
$pssrc=$pssrc -replace "[+]$",""
"zero=$ZERO"
$BINARY|%{
foreach( $ky in $_.keys ){
"$ky="+$_.$ky
}
}
"msgbox(powershell(${pssrc}))"|write-host
endtextblock


//上記スクリプトが生成したfizzbuzz.uws
//…を貼り付けたら長大な行のせいで掲示板のレイアウトが崩れそう。
//なので、最後の行を省略しました。
//実際に生成して確かめてください。
zero=!gettime()
b0=!(!gettime())
b1=b0+b0
b2=b1+b1
b3=b2+b2
b4=b3+b3
b5=b4+b4
b6=b5+b5
b7=b6+b6
msgbox(powershell(chr(b5+b4+b0)+chr(b5+b3+b2+b1)+…+chr(b6+b5+b4+b3+b2+b0)))

No.4852 2017/12/17(Sun) 12:42:14

Re: 縛りありfizzbuzz / しゅん
一時、強烈な縛りも考えたんですけど、UWSCだと難しいんですよね、、、。
jjencodeの場合、Javascriptの特殊構文を利用して関数が実行できたり文字列の切り出しが可能なので、関数(ステートメントを除く)はEVALとCOPYのみ許して他禁止とか考えてたんですけど、、、文字、作れないんですよね。
特に、CHRを禁止したいところ。

No.4853 2017/12/18(Mon) 08:59:57

Re: 縛りありfizzbuzz / stuncloud
そうか…gettime()という手があったか…!
> 万一、タイムマシン等で2000年にいらっしゃることがあれば
なるほど2000年1月1日0時0分0秒だとまずいんですね

> 特に、CHRを禁止したいところ。
で、decode()でごまかす… (あんまり変わらない

No.4854 2017/12/18(Mon) 10:25:53

Re: 縛りありfizzbuzz / satocha
次の記号禁止
+ - * /
mod演算子禁止
=は代入のみ(比較での使用禁止)

if文禁止
while~endwhile禁止
repeat~until禁止

ってルールで書いてみました。UWSCだからできるので、他言語への移植はほぼ不可能。
Windows10非対応です。めちゃくちゃ遅いです。

https://plaza.rakuten.co.jp/satocchia/diary/201712180000/

No.4855 2017/12/18(Mon) 13:55:09

Re: 縛りありfizzbuzz / satocha
追加です。
比較演算子は=だけでなく不等号も使っていません。
組み込みの数学関数も不使用です。

定数の縛りには従っていません。No4852の方法でできそうだけど。

現状、1箇所だけ、select~selendの分岐構文を使っていますが、なんとかしたいところです。
無理かな。

あと、1から100までだと
print 1
print 2
print "Fizz"

のような自明の回答を排除しにくいため、任意の始点と終点を設定できる条件を加えたほうがいいと思います。

No.4856 2017/12/18(Mon) 14:43:05

Re: 縛りありfizzbuzz / stuncloud
電卓!一気にUWSCっぽくなりましたね!
いやぁ…こういう発想出てこないですね…
頭の柔軟性がうらやましい

> select~selendの分岐構文を使っていますが、なんとかしたいところ
out = split(replace("n Fizz Buzz FizzBuzz","n",i))[q]
これなら条件に抵触しない…ですよね?
配列の添字って文字列のままでもいけちゃうんですね (val()いらなかった

> 自明の回答を排除しにくい
ちゃんとした競技っぽくやるならたしかにそうですね
とは言え、さすがにここで遊びに付き合ってくれる方は大丈夫でしょう!

No.4858 2017/12/18(Mon) 16:42:42

Re: 縛りありfizzbuzz / satocha
>out = split(replace("n Fizz Buzz FizzBuzz","n",i))[q]
さすがですね。行数もたった1行だし。勉強になりました。

>頭の柔軟性
は、特にないです。

なんか、No.4199以下のスレッドを思い出し、これならいけると思ってスクリプトを書きました。書いてみたら、四則演算を使っていなかったりしてたんで、「できっこないだろ」感満載のルールにしました。

そういうわけで、ルールは後付です。

No.4859 2017/12/18(Mon) 19:56:42

Re: 縛りありfizzbuzz / stuncloud
> 次の記号禁止
> + - * /
> mod演算子禁止
> =は代入のみ(比較での使用禁止)
>
> if文禁止
> while~endwhile禁止
> repeat~until禁止


を満たすmod関数できました
n mod m を返します

print %(100, 3) // 1

function %(n, m)
 n = subtract(n, m)
 dim [] = n, m
 select ! subtract(calcarray([], CALC_MAX), m) and !(! subtract(calcarray([], CALC_AVR), m))
  case TRUE
   result = n
   exit
  default
   result = %(n, m)
 selend
fend

// n + m
function add(n, m)
 dim [] = n, m
 result = calcarray([], CALC_ADD)
fend

// n - m
function subtract(n, m)
 dim [] = n, add(m xor $FFFFFFFFFFFFFFFF, 1)
 result = calcarray([], CALC_ADD)
fend


なんとなくcalcarray使えばできそうな気がしたのでやってみました
再帰を抜けるのに条件分岐が必要になってしまうのでselectせざるを得なかったのが残念

※ 致命的なバグがあったので直しました、足すのにorしちゃだめだった
  ついでにきもちわるい配列変数を使った

No.4860 2017/12/19(Tue) 15:22:12

Re: 縛りありfizzbuzz / satocha
+*-/禁止にしておけば計算できまい、と思っていた私が愚かでした。
calcarrayはよく考えると、すごい機能ですね。
引き算はビット演算で補数を足すというのは、なるほどですが(そういえば昔Z80でそんなことやってたかも)、
互除法も最後の判定をそう書くのかと、驚いています。

一言、まいりました。

No.4874 2017/12/20(Wed) 16:47:38

Re: 縛りありfizzbuzz / 森
ご無沙汰しております。
分りやすいロジックだけど王道ではないものが書けたらなあと。
せめて IF文は無しにしたかったのですが、すぐには思い付かなかったです(´;ω;`)ウゥゥ
追加の縛りはありません。

2017/12/21 16:40
IF文無しでいける方法を思いついたので一部修正しました!

// fizzbuzz .uws
// ---------------------------------------
public one = getid("fizzbuzz .uws")
public flag , counter , num , fizz , buzz

thread sub_fizz()
thread sub_buzz()
thread sub_num()

while one
 repeat
  sleep(one)
 until flag = "num_ok"
 print fizz + buzz + num
 flag = ""
wend

// 3ごとに"fizz"を出力
procedure sub_fizz()
 while one
  for i = one to (one + one)
   repeat
    sleep(one)
   until flag = ""
   fizz = ""
   flag = "fizz_ok"
  next
  repeat
   sleep(one)
  until flag = ""
  fizz = "fizz"
  flag = "fizz_ok"
 wend
fend

// 5ごとに"buzz"を出力
procedure sub_buzz()
 while one
  for i = one to (one + one + one + one)
   repeat
    sleep(one)
   until flag = "fizz_ok"
   buzz = ""
   flag = "buzz_ok"
  next
  repeat
   sleep(one)
  until flag = "fizz_ok"
  buzz = "buzz"
  flag = "buzz_ok"
 wend
fend

// "fizz"でも"buzz"でもないときに数字を出力
procedure sub_num()
 while one
  repeat
   sleep(one)
  until flag = "buzz_ok"
  counter = counter + one
  num = val(fizz + buzz + counter , "")
  flag = "num_ok"
 wend
fend

No.4878 2017/12/21(Thu) 15:19:03

Re: 縛りありfizzbuzz / stuncloud
thread…!?
コードをじっくり見てみましたけどわかったようなわからないような!
しかしそうかこれで3と5が数えられるのか…なるほどなー

脱帽です!

No.4880 2017/12/21(Thu) 18:30:22

Re: 縛りありfizzbuzz / satocha
>森様
コードを眺めるだけではさっぱり分かりませんでしたが、動かしてみて分かりました。

スレッド間の同期を取るだけで、個々のスレッドの処理内容を大幅に縮約できるのですね。
オートマトン理論とか関係あるのかな。
大掛かりなスクリプトを組むときなど使えそうです。勉強になりました。

No.4881 2017/12/22(Fri) 07:05:32

Re: 縛りありfizzbuzz / しゅん
森さん、素晴らしい。
sleep sort的なものですね。

まあでも、これが有用なのは限られたケースですね。
でも素晴らしい。
計算処理を電卓に投げるのもUWSCらしくて良いアイデアですが、個人的にはSleepで解決するのはツボですね。
最小単位をGETIDの動作特性を使うというのも密かなポイントですね。

No.4882 2017/12/22(Fri) 09:18:21

Re: 縛りありfizzbuzz / 森
stuncloudさん、しゅんさん
お二人から褒めていただけるとは!
ちょっと早いけど、最高のクリスマスプレゼントになりました(*´∀`*)
ありがとうございます!

satochaさん
独学だけのなんちゃってプログラマなので、理論なんてのはさっぱり分りませんが、
このロジックを閃いたときには、思わずニンマリしちゃいました!


初回投稿を見ていなかった方のために、IFをどうやって回避したのか書いておきます。

[修正前]
if fizz + buzz = ""
 num = counter
else
 num = ""
endif

[修正後]
num = val(fizz + buzz + counter , "")

No.4883 2017/12/22(Fri) 13:30:27
exeの実行期限 / uwsc勉強中
exe化したプログラムに実行期限をつけることは可能でしょうか?
例えば、2018年1月31日の23:59以降は実行できないようにしたい。
gettime()で時間を取得すればできますが、pcの時間を誤魔化すと、期限以降も実行できてしまう。
何か良い方法はありませんでしょうか?

No.4875 2017/12/21(Thu) 00:38:05

Re: exeの実行期限 / satocha
端末のインターネット接続を配布の条件とすれば、次の方法で日本標準時が取得できます。
ネットワークの速度やマシンの性能で差があるので、1秒未満は不正確ですが。
URLの最後のtimeをJSTに変えれば、posix時刻が取得できます。

hreq =createoleobj( "MSXML2.XMLHTTP" )
document =CreateOleOBj( "htmlfile" )
hreq.open( "GET", "https://ntp-a1.nict.go.jp/cgi-bin/time" );
hreq.send()
repeat
sleep(0.5)
until hreq.readystate = 4
document.write( hreq.responseText )
JSTstr =document.body.innerText
msgbox( JSTstr )

No.4877 2017/12/21(Thu) 07:40:25
http://schemas.microsoft.com/cdo/configuration/ / おぐらあゆむ
お世話になっております。
いつもUWSCを利用させていただいてます。
以前、メール配信に
http://schemas.microsoft.com/cdo/configuration/ +sendusing/smtpserver/smtpserverport
を使用してUWSCで取得した結果をメールでレポートを送ってましたが、最近使用したらメールがちゃんと届かなくなってしまいました。

上記URLを見るとサービスが終了してしまったみたいですが、他に代用できる物はないでしょうか?

レポートなどを送れてすごく便利でしたので可能であればもう一度使用したいと思っております。

よろしくお願いいたします。

No.4871 2017/12/20(Wed) 11:27:04

Re: http://schemas.microsoft.com/cdo/configuration/ / satocha
"http://schemas.microsoft.com/cdo/configuration/"というのはただの識別記号で、URLでもなんでもありません。アドレスっぽいですが、もともと、そこにアクセスしても無意味です。

メールが送信できなくなったのには別の理由があると思います。

参考:
http://www.atmarkit.co.jp/ait/articles/0405/22/news017.html
以下引用
Configurationプロパティは、プログラムIDが“CDO.Configuration”のCOMオブジェクトになっており、このFieldsプロパティからそれぞれの設定にアクセスできる。各設定項目は「http://schemas.microsoft.com/」で始まるURIで識別される。これらのURIは、設定項目を表すキーワードでしかなく、ブラウザでアクセスしてもページが存在するわけではない。

No.4876 2017/12/21(Thu) 03:11:44
CREATEFORMで作成したフォームでボタンを押したら指定のuwscを起動させる方法 / せきしんご
CREATEFORMで作成したフォームでtesutoというリンクしたらMozilla Thunderbird.exeのスクリプトを起動するようにしたいのですがダウンロードというウィンドウで下記のような表示でます。これを出さずに純粋にスクリプトを起動するだけにできないでしょうか?最終的にしたい事がCREATEFORMで表示したボタンをクリックしたら指定のUWSCで作成したスクリプト(.uwsで終わるファイル)を起動するようにしたいです。OleEventの関数を使えばできるような気がするんですがOleEventの使い方がまったく分かりません。
アドバイス頂けないでしょうか?

(ダウンロードというウィンドウ)
https://gyazo.com/deeeaed6145c23b05e7173829eaa738c
---------------------
入力フォーム.html

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<head>

<body style="overflow:hidden;">
<div id="block">
<form method="POST">
<font size="+2"><marquee>てすとふぉーむ</marquee></font>

<!--ボタン -->
<input type="button" value="ボタン" onClick='Javascript:alert("めっせーじ")'>
<!--ボタン -->


<!--submit実行、キャンセルボタン-->
<p><input type="submit" name="OK" value=" 実行 "> | <input type="submit" value="キャンセル" name="CancelBtn"></p>
<!--submit-->


<!--リンク-->
<a href="C:\Users\Desktop\Mozilla Thunderbird.exe">tesuto</a>
<!--リンク-->

</form>
</div>
</body>
</html>
---------------------

//---フォーム生成
obj = CREATEFORM("C:\Users\Desktop\入力フォーム.html", "サンプル", TRUE,FOM_MINIMIZE,500,300)//---フォーム作成

while obj.Visible
 sleep(0.2)
 ifb GETFORMDATA("OK") //---OKボタンが押されたら
  Text1 = GETFORMDATA("Text1")
  ifb Text1 = "" then
   MsgBox("カテゴリを入力してください。")
   continue
  endif
 elseif GETFORMDATA("CancelBtn") //---キャンセルボタンが押されたら
  ExitExit
 endif
wend

//---結果確認
print Text1

No.4861 2017/12/19(Tue) 15:47:54

Re: CREATEFORMで作成したフォームでボタンを押したら指定のuwscを起動させる方法 / stuncloud
aタグに適当なidを付けてください
※ ここでは exelink とします

exelink = f.document.getElementById("exelink")
oleevent(exelink, "HTMLAnchorEvents2", "onclick", "RunExe") // while obj.Visible のループに入る前に呼んでください

// oleeventで呼び出すプロシージャ
procedure RunExe()
 EVENT_PRM[0].returnValue = FALSE // リンク先へ遷移するなど、リンク本来の動きを抑制する
 href = EVENT_PRM[0].srcElement.href // hrefを取得
 exe = replace(replace(href, "file:///", ""), "/", "\") // uriになってるのでローカルファイルパスに戻す
 print exe // 確認
 exec(exe) // 実行
fend


イベントインターフェイスについてはこちらを参照
https://msdn.microsoft.com/en-us/library/hh801967(v=vs.85).aspx

No.4862 2017/12/19(Tue) 17:04:12

Re: CREATEFORMで作成したフォームでボタンを押したら指定のuwscを起動させる方法 / せきしんご
stuncloud様、回答ありがとうございます。これはすごいですね。色々可能性が広がりそうです。
exec("<#DBL>" + GET_UWSC_DIR + "\uwsc.exe<#DBL> <#DBL>" + exe + "<#DBL>")ようなコードを使用でexeだけでなく、.uwsファイルも起動できるんですね。

リンクから起動する方法は分かったのですが、ボタンをクリックする事で指定のスクリプトを起動する方法は探してみたのですが期待通りの処理になるのはなかったです。
下記のようなコードで試したのですがうまくいきません。
<input type="button" id="exelink" value="ボタン" onClick="window.open('C:\Users\Desktop\facebook.exe')">

No.4863 2017/12/19(Tue) 21:22:16

Re: CREATEFORMで作成したフォームでボタンを押したら指定のuwscを起動させる方法 / satocha
>せきしんご様
横入り失礼します。
No.4862はボタンについても解答されています。
リンク先は読みましたでしょうか。

No.4864 2017/12/20(Wed) 08:47:56

Re: CREATEFORMで作成したフォームでボタンを押したら指定のuwscを起動させる方法 / stuncloud
input[type="button"] の場合はちょっとわかりにくいんですよね
インターフェースは HTMLInputTextElementEvents2 になります (type="text" 用だけど動く)
buttonタグなら HTMLButtonElementEvents2 です

ついでにもちょっと解説を加えます
oleevent()に渡すインターフェイス名は上記リンク先にある「HTML(エレメント名)ElementEvents(番号)」になります
エレメント名はイベントを取りたいタグの種類から類推してください (aならアンカータグなのでanchor
番号はなるべく大きいので使えるやつを使えばたぶん大丈夫です
(というのも番号なしのだと後述するイベントオブジェクトが取れないとかいうことがある)
インターフェイス名のリンクをクリックすると出てくるイベント一覧がoleevent()で指定できるイベント名になります

oleevent()で指定したprocedure内では EVENT_PRM[0] に発生したイベントのオブジェクトが入ってます
EVENT_PRM[0].srcElement でイベント発生元のエレメントのオブジェクトが取れます (なのでaタグならhrefが取れる)
イベントオブジェクトが持つプロパティについては以下に書かれています
https://msdn.microsoft.com/en-us/library/aa703876(v=vs.85).aspx

No.4866 2017/12/20(Wed) 10:50:15

Re: CREATEFORMで作成したフォームでボタンを押したら指定のuwscを起動させる方法 / stuncloud
( のせいでリンクが途切れてしまうの困る
No.4867 2017/12/20(Wed) 10:50:53

Re: CREATEFORMで作成したフォームでボタンを押したら指定のuwscを起動させる方法 / せきしんご
satocha様、下記を読んでみたのですが英語で書かれていて読み解く事ができませんでした。翻訳機能を使ってもう一度読んでみたいと思います。

イベントインターフェイスについてはこちらを参照
https://msdn.microsoft.com/en-us/library/hh801967(v=vs.85).aspx

No.4870 2017/12/20(Wed) 11:20:28

Re: CREATEFORMで作成したフォームでボタンを押したら指定のuwscを起動させる方法 / せきしんご
stuncloud様、解説ありがとうございます。
https://msdn.microsoft.com/en-us/library/aa703876(v=vs.85).aspxのサイトも英語ですし、oleeventを使うの難しいですね。
じっくり学んでみたいと思います。

No.4872 2017/12/20(Wed) 11:49:21
2つのマスターデータの差異を抽出したい。 / sen
いつもお世話になっております。
ふたつのマスターデータの登録間違いを調べたいのですが、うまくいきません。
"^"と"$"を除くとうまくいくような気がするのですが、A1WとAA1Wみたいに、
途中が同じデータがあるので、"^"と"$"は付けたいのです。
実際は、20万行くらいあります。
何がおかしいのでしょうか?
何卒、ご教授頂けますようお願い致します。


id1 = fopen("1.csv")
id2 = fopen("2.csv")
id3 = fopen("差分.csv",F_WRITE)
正規 = CREATEOLEOBJ("VBScript.RegExp")
dim 比較 = fget(id2,F_ALLTEXT)
FOR i = 1 to fget(id1,-1)
正規.Pattern = "^"+fget(id1,i,1)+"$"
切出 = 正規.Execute(比較)
ifb 切出.count > 0 then
else
fput(id3,fget(id1,i,1))
endif
next
fclose(id1)
fclose(id2)
fclose(id3)

1.csv
A1W
AA1W
B2W1
C2W2

2.csv
A1W
B2W1

差分.csv
AA1W
C2W2

No.4811 2017/12/12(Tue) 00:20:50

Re: 2つのマスターデータの差異を抽出したい。 / satocha
2ファイルの比較は簡単そうに見えて一筋縄では行きません。
先頭から比較していき、途中で違いがみつかったとしましょう。
1.csv    2.csv
A1W     A1W
AA1W     B2W1 ←ここ

このとき、普通にやったのでは1.csvに新たな要素が追加されたのか、逆に削除されたのか
簡単に判別することはできません。言い換えれば「ここ」に違いがあるのはわかりますが、このあとどこから比較すればいいか決定できないからです。

しかし、このような差分を発見するアルゴリズムは先人が考え出してくれており、検索するとhttp://hp.vector.co.jp/authors/VA007799/viviProg/doc5.htm
http://susisu.hatenablog.com/entry/2017/10/09/134032
などが見つかります。
2ファイルの「最長一致文字列」と「最短編集距離」を計算していけばいいのです。
ただ、これに従ってUWSCでコーディングするのはかなりの力技になりそうです。

そこで、既存の差分ツールとしてdosコマンドのfc、powershellコマンドレットのCompare-Objectなどを使ってみてはどうでしょう。

あるいはフリーソフトでdiffツールを探したほうが早いかも。
https://freesoft-100.com/pasokon/diff.html

No.4812 2017/12/12(Tue) 02:30:17

Re: 2つのマスターデータの差異を抽出したい。 / sen
難しいんですね。
詳しく説明、ありがとうございます。
他の方法でやってみます。

No.4840 2017/12/13(Wed) 18:28:17

Re: 2つのマスターデータの差異を抽出したい。 / satocha
compare-objectでやってみた例です。

src =replace(psssrc,"<CSV1>",CSV1)
src =replace(src,"<CSV2>",CSV2)
msgbox(powershell(src))
textblock psssrc
$csv1=@"
<CSV1>
"@
$csv2=@"
<CSV2>
"@
compare-object ($csv1 -split"`r`n") ($csv2 -split"`r`n")|%{if($_.SideIndicator -eq "<="){$_.InputObject}}
endtextblock
textblock csv1
A1W
AA1W
B2W1
C2W2
endtextblock
textblock csv2
A1W
B2W1
endtextblock

No.4844 2017/12/14(Thu) 08:05:03

Re: 2つのマスターデータの差異を抽出したい。 / sen
おー、ありがとうございます。
ちょっと恥ずかしいのですが、比較するファイルを別ファイルにすると、
下記であってますでしょうか?

src=replace(psssrc,"<CSV1>",fget(fopen("1.csv"),f_alltext))
src=replace(src,"<CSV2>",fget(fopen("2.csv"),f_alltext))

id3 = fopen("3.csv",F_WRITE)
fput(id3,powershell(src),F_ALLTEXT)
fclose(id3)

textblock psssrc
$csv1=@"
<CSV1>
"@
$csv2=@"
<CSV2>
"@
compare-object ($csv1 -split"`r`n") ($csv2 -split"`r`n")|%{if($_.SideIndicator -eq "<="){$_.InputObject}}
endtextblock

No.4846 2017/12/14(Thu) 20:30:29

Re: 2つのマスターデータの差異を抽出したい。 / sen
うまくいきました。

ちょっと、応用は厳しそうなんですが、
深い世界が垣間見られて良かったです。

ありがとうございました。

No.4849 2017/12/15(Fri) 22:15:33
画像の設定 / jamrestaurant
// -------------------------------------
// 初期データ設定
// -------------------------------------
CONST gnaviID = "jamrestaurant" // ログイン ID
CONST gnaviPASS = "Mizusawa1" // PASSWORD
CONST radio_NO = "1" // 0:注目! 1:お得! 2:イチオシ 3:期間限定 4:駅近! 5:おすすめコース

// -------------------------------------
// Internet Explorerの起動
// -------------------------------------
IE = CreateOLEObj("InternetExplorer.Application")
IE.Visible = True
IE.Navigate("http://pro.gnavi.co.jp/")
REPEAT
sleep(0.5)
UNTIL !IE.busy AND IE.readystate = 4

// -------------------------------------
// ログイン
// -------------------------------------
IELink(IE, "ログイン")
REPEAT
sleep(0.5)
UNTIL !IE.busy AND IE.readystate = 4
IESetData(IE, gnaviID, "jamrestaurant")
IESetData(IE, gnaviPASS, "Mizusawa1")
IE.document.forms[1].submit
REPEAT
sleep(0.5)
UNTIL !IE.busy AND IE.readystate = 4

// -------------------------------------
// ページ移動
// -------------------------------------

IE.Navigate("https://manage.gnavi.co.jp/SP/ShopAdmin/top/index.php")
REPEAT
sleep(0.5)
UNTIL !IE.busy AND IE.readystate = 4
IE.Navigate("https://manage.gnavi.co.jp/SP/ShopAdmin/boxEdit/standard_box.php")
REPEAT
sleep(0.5)
UNTIL !IE.busy AND IE.readystate = 4
IE.Navigate("javascript:m_action_boxList('edit', '../boxEdit/standard_box.php', 1)")
REPEAT
sleep(0.5)
UNTIL !IE.busy AND IE.readystate = 4
IESetData(IE,True,"catchi_cd",radio_NO)      // ラジオボタン選択
IESetData(IE,True,"","確認")
REPEAT
sleep(0.5)
UNTIL !IE.busy AND IE.readystate = 4
IESetData(IE,True,"once","登録")
REPEAT
sleep(0.5)
UNTIL !IE.busy AND IE.readystate = 4

IE.quit()

No.4845 2017/12/14(Thu) 18:51:32

Re: 画像の設定 / stuncloud
idとパスワードは書くべきではないです
あと用件を書かれたほうが良いです

No.4847 2017/12/15(Fri) 10:25:52
DEF_DLLの使い方について / じゅん
いつもお世話になっております。
自作したDLLの使用方法についてご教授頂きたく投稿させていただきます。

例えば、Windowsのログインユーザー名を取得するDLLを以下の内容で作成しました。
*----------------------------------------------------------*
using System;
namespace UserInfo
{
 public class GetData
 {
  public string UserName()
  {
   return Environment.UserName;
  }
 }
}
*----------------------------------------------------------*

上記内容のDLLをUWSC側で呼び出す際の記載は、
*----------------------------------------------------------*
DEF_DLL UserName(): string: C:\Users\LoginUser\Source\Repos\DLLTest\DLLTest\bin\Debug\UserInfo.dll
print UserName()
*----------------------------------------------------------*
とすれば、ログにユーザー名が取得できそうなものですが、NULLと表示されます。
フォームアプリ等でDLLを読み込んだ場合はこの関数は問題なく使えました。
それ以前に、return "aaa";としたものですらUWSC側ではNULLとしか表示されないので、根本的に使い方が間違っているのでしょうか?
それともDLLを作成した言語に依存するものでしょうか?
DLLのパス名の指定方法が間違っているのかでしょうか?(存在しないパスを指定するとNot DLLと出るので問題はなさそうですが、、、)
ご回答頂けると助かります。

以上、宜しくお願い致します。

No.4799 2017/12/09(Sat) 22:13:48

Re: DEF_DLLの使い方について / しゅん
はい、誠に言い難いですが、根本的に間違っています。
C#のDLLかと思いますが、UWSCから呼べるのは、レガシーなC呼び出しのDLLだけです。
UWSCが作られたとき、主流のDLLはC呼び出しだったのです。

DLLには、他にWindows標準呼び出しのものやC++ I/F、そして随分後に、.NETの様々なDLLができました。
.NETの開発者がとるべき道は、
・レガシーなC呼び出しのDLLをC++またはCで作成する(.NETは使えない)
・.NETのアンマネージドC++ DLLを作成し、c呼び出しのI/Fを用意して、UWSCから使う
・C#等のDLLを、.NETのアンマネージドC++ DLLでラップし、ラッパーにc呼び出しI/Fを用意する
・UWSCのPowerShell関数を使い、.NETのマネージドDLLを呼び出す(遅いのがネック。CLRバージョンをあわせる必要がある)
あたりになります。(UWSCはx86なので、全てx86の必要があります)

PowerShell関数を使ったサンプルは以下の通り。


TEXTBLOCK _script
Add-Type -Path 'C:\Users\LoginUser\Source\Repos\DLLTest\DLLTest\bin\Debug\UserInfo.dll'
(New-Object UserInfo.GetData).UserName()
ENDTEXTBLOCK

MSGBOX(POWERSHELL(_script))

No.4806 2017/12/11(Mon) 09:39:40

Re: DEF_DLLの使い方について / じゅん
ご回答ありがとうございます。
おかげ様で望んだ機能の実装を行うことが出来ました。

やはり、使い方を間違えていましたか。
C#やVBしか触ってこなかったので、CやC++とDLLの作りが違うことを恥ずかしながら知りませんでした。
これを機会にC++も勉強してみようと思います。

PowerShellでC#やVBのDLL・ソースコードを読み込ませて関数を実行させることができるんですね。
私にはない発想でしたので、大変勉強になりました。

また、わからない点があればご質問させてください。
重ねて御礼申し上げます。

No.4809 2017/12/11(Mon) 19:43:40

Re: DEF_DLLの使い方について / stuncloud
dllをCOMコンポーネントとして登録しておいてcreateoleobj()から使うという手もありますね

・DLL
------------------------------------
using System;
using System.Runtime.InteropServices;
namespace UserInfo
{
 [Guid("0B9F558A-9F1D-2A43-8FA0-AB4AE11A4418")]
 [InterfaceType(ComInterfaceType.InterfaceIsDual)]
 public interface IGetData
 {
  string UserName();
 }

 [Guid("F2F07D47-83D5-754A-A3FD-8963469A570E")]
 [ComVisible(true)]
 [ClassInterface(ClassInterfaceType.None)]
 [ComDefaultInterface(typeof(IGetData))]
 public class GetData : IGetData
 {
  public string UserName()
  {
   return Environment.UserName;
  }
 }
}
------------------------------------

・管理者シェルで登録
------------------------------------
RegAsm /codebase .\UserInfo.dll
------------------------------------

・スクリプト
------------------------------------
GetData = createoleobj("UserInfo.GetData")
username = GetData.UserName()
msgbox(username)
------------------------------------

ただ僕もあまり詳しくないので正しくやれてるかはちょっと自信ないです

No.4820 2017/12/12(Tue) 17:22:28

Re: DEF_DLLの使い方について / しゅん
フォロー、ありがとうございます。

私も一応気付いたのですが、RegAsmするのもどうだろう、と思って追記はしなかった次第です。(負け惜しみ)

No.4823 2017/12/12(Tue) 20:13:40

Re: DEF_DLLの使い方について / じゅん
CreateObjectを使う発想もなかったです。
DEF_DLLを使うことしか考えていませんでしたが、視野を広げれば色々やりようはあるものですね。

ありがとうございます。

No.4843 2017/12/13(Wed) 21:32:31
Getdirでマウスのロックが解除されてしまいます / yamada
lockhardex(0,LOCK_MOUSE)
:
X=Getdir("XXXX",false)
Y=Getdir("YYYY",false)
Z=Getdir("ZZZZ",false)
:

上のようなスクリプトで、X=Getdir("XXXX",false)やY=Getdir("YYYY",false)
のところでは大丈夫なのにZ=Getdir("ZZZZ",false)のところにくると
マウスのロックが解除されてしまうという現象が起きています。
"ZZZZ"に禁止文字のようなものが含まれているからでしょうか?

(フォルダ名は仮です。)

No.4762 2017/12/02(Sat) 02:49:18

Re: Getdirでマウスのロックが解除されてしまいます / routa
単にスクリプトが終了して解放されただけでしょう。
もう少し確認作業をしましょう。

No.4766 2017/12/03(Sun) 01:04:31

Re: Getdirでマウスのロックが解除されてしまいます / yamada
Z=Getdir("ZZZZ",false)以降のスクリプトは実行されているので
単にスクリプトが終了したのではないと思います。

もう少し正確に書くとループの中に以下のスクリプトがあり、
4回目にこの記述に差し掛かったところでマウスのロックが外れます。

3回目までは正常に通過するので、4回目にこのwntfolder1かwntfolder2に
禁止文字が入ったからではないかと考え、お尋ねした次第です。

n1 = GETDIR(wntfolder1,"\",FALSE,2)
Dim box_list1[n1-1]
For i=0 to n1-1
box_list1[i] = wntfolder1 + "\" + GETDIR_FILES[i]
Next
n2 = GETDIR(wntfolder2,"\",FALSE,2)
Dim box_list2[n2-1]
For i=0 to n2-1
box_list2[i] = wntfolder2 + "\" + GETDIR_FILES[i]
Next

No.4767 2017/12/03(Sun) 17:49:23

Re: Getdirでマウスのロックが解除されてしまいます / yamada
表題の件、少し状況がわかってきました。

wntfolder1 or 2 の中に
100件程度のフォルダが含まれる場合はロックは外れない。
500件程度のフォルダが含まれる場合はロックは一瞬外れるが再度ロックされる。
1000件程度のフォルダが含まれる場合はロックは外れたままになる。

Getdirの対象のwntfolder1,2はネットワークドライブの中のフォルダなので
アクセスに時間がかかっています。フォルダ名の問題ではなく、
応答時間が影響しているようです。

No.4769 2017/12/04(Mon) 09:58:16

Re: Getdirでマウスのロックが解除されてしまいます / yamada
この現象、確実に起きています。

lockhardex(0,LOCK_MOUSE)
n1 = GETDIR(wntfolder1,"\",FALSE,2)
lockhardex(0,LOCK_MOUSE)

のようにしても
Getdirの動作中(5秒程)はロックが外れた状態になります。
何か良い方法はないでしょうか。

No.4835 2017/12/13(Wed) 14:39:05

Re: Getdirでマウスのロックが解除されてしまいます / satocha
NAS上に膨大な数のファイルがある環境で試してみましたが、再現しませんでした。

ですので、動くかどうかチェックできないのですが、lockhardexを行うだけの別スクリプトを作り、exec、doscmdなどで起動するというのはどうでしょう。

別スクリプトは、lockhardexのあと無限ループで待機し、何らかのプロセス間通信を受け取って終了するような作りになると思いますが。

No.4837 2017/12/13(Wed) 15:38:20

Re: Getdirでマウスのロックが解除されてしまいます / yamada
>再現しませんでした。

問題のフォルダには70000程のファイルが1000程のフォルダに分かれて入っています。
膨大というほどでもないので、何かこちらの環境に問題がありそうです。


>何らかのプロセス間通信を受け取って...

プロセス間通信は私の力量では難しそうですが、UWSCのGETDIRを使わないで
自作のソフトで代用すればうまくいくかもしれません。

「別のスクリプトを作り...」がヒントになりました。
ありがとうございました。

No.4838 2017/12/13(Wed) 17:10:29

Re: Getdirでマウスのロックが解除されてしまいます / miles
これでどうでしょうか?

id = EXEC(GET_UWSC_DIR+"\UWSC.exe " + "lockhardexして無限ループするスクリプト.uws")
n1 = GETDIR(wntfolder1,"\",FALSE,2)
CTRLWIN(id,CLOSE)

No.4839 2017/12/13(Wed) 17:43:50

Re: Getdirでマウスのロックが解除されてしまいます / yamada
>これでどうでしょうか?

うまくいきました!
感激です!!

ありがとうございました。

No.4841 2017/12/13(Wed) 19:02:58

Re: Getdirでマウスのロックが解除されてしまいます / satocha
>プロセス間通信は私の力量では難しそう

確かに共有メモリやらソケットやらのAPIをいじくるのは大変ですが、あらかじめファイル名を決めておき、そのパスにファイルがあるかどうかでサブプログラムが動作を変える、なんてのも立派にプロセス間通信です。

ただし、milesさんの解決策がエレガントで、今回はプロセス間通信の必要はなかったようです。
勉強になりました。

No.4842 2017/12/13(Wed) 21:12:58
uwscとみくみくまうすをつなげる / マロン
お忙しいところしつれいします。

uwscとみくみくまうすをつかって音声合成をしたいと考えているのですが
このようなことは可能なのでしょうか?
みくみくまうすには公開APIがありそこから音声認識でみくみくまうすのキャラがしゃべる
みたいな感じです。使えるのであれば棒読みちゃんも使おうかと考えています
ご指摘よろしくお願いします!

No.4814 2017/12/12(Tue) 11:26:18

Re: uwscとみくみくまうすをつなげる / stuncloud
http://mikumikumouth.net/developer.html

を見るとREST APIが用意されているようなので、UWSCから利用するならそれが一番実装しやすいでしょう
REST APIを叩くにはMsxml2.XMLHTTPを使います

No.4819 2017/12/12(Tue) 16:20:14

Re: uwscとみくみくまうすをつなげる / マロン
ご指摘ありがとうございます。
Msxml2.XMLHTTPを使うとのことですが
どのようなコードを打ち込めばよいのでしょうか?
初心者ですみません…何かしら例があると嬉しいです。

No.4826 2017/12/13(Wed) 09:44:12

Re: uwscとみくみくまうすをつなげる / stuncloud
「No.4827 翻訳について」のスレッドでも使ってますね

uri = "http://mikumikumouth.net/developer.html"

XMLHTTP = createoleobj("Msxml2.XMLHTTP")
XMLHTTP.open("GET", uri, FALSE)
XMLHTTP.send()
print XMLHTTP.responseText

1) オブジェクトを作って
2) open()でURIやメソッドを指定して
3) send()でリクエストを送る
というのが大まかな流れです
より詳細な使い方は「Msxml2.XMLHTTP」で検索して調べてみてください
(uwsc以外の言語のサンプルが出てきますが使い方は同じなので参考にしてみてください)

おまけ
みくみくまうすというのを使ったことがないので、以下はこんな感じになるんじゃないかなという予想で書いています
このまま動く保証は全くありませんが、なにかしら参考になるのではないかと思います
初心者ということでちんぷんかんぷんかもしれませんが、ヘルプを見たり検索するなどで少しずつコードを読み解いてみてください


// みくみくまうすに情報を送信
MikuMikuMouth.Talk("ゆかり", "こんにちはみなさん", "greeting", "white", FALSE)

module MikuMikuMouth
 dim baseuri = "http://localhost:3939" // でいいのかな?わからん

 function Talk(name, text, emotion, tag, isInterrupt)
  hashtbl hash
  hash["name"] = name
  hash["text"] = text
  hash["emotion"] = emotion
  hash["tag"] = tag
  hash["isInterrupt"] = isInterrupt
  body = hashToJson(hash)
  uri = baseuri + "/talk"
  result = request("POST", uri, body)
 fend

 function request(method, uri, body)
  with createoleobj("Msxml2.XMLHTTP")
   .open(method, uri, FALSE)
   .setRequestHeader("Content-Type", "application/json")
   .send(body)
   result = .status = 200
   if ! result then
    msgbox(.statusText)
   endif
  endwith
 fend

 // json構成: http://mikumikumouth.net/json.html
 function hashToJson(hash[])
  for key in hash
   value = hash[key]
   if vartype(value) = VAR_BOOLEAN then
    value = strconv("" + value, SC_LOWERCASE)
   else
    value = "<#DBL>" + value + "<#DBL>"
   endif
   hash[key] = "<#DBL>" + key + "<#DBL>: " + value
  next
  json = "{" + join(hash, ", ") + "}"
  result = encode(json, CODE_UTF8)
 fend
endmodule

No.4834 2017/12/13(Wed) 14:09:44

Re: uwscとみくみくまうすをつなげる / ばっしゅ
お返事ありがとうございます。
stuncloudさんのコードで作らさせていただきましたが
uwscの方で結果がCreatedとでるだけでみくみくマウスはしゃべりませんでした。
なのでコードを調べながら1つ1つ見ていきたいと思います!

No.4836 2017/12/13(Wed) 14:55:29
翻訳について / ばっしゅ
ネット上にあった翻訳機能で日本語→英語ができるのですがこれに英語→日本語に翻訳する機能を実装しようと考えているのですがいまいち案が浮かばないので何か意見をくださると嬉しいです。

OPTION EXPLICIT

IFB LENGTH(PARAM_STR) THEN
// Test
DIM res = "NG"
SELECT PARAM_STR[0]
CASE "TEST"
res = Trancelate.Do("私はUWSCが好きです。")
IF res = "I like UWSC." THEN res = "OK"
DEFAULT
res = Trancelate.Do(PARAM_STR[0])
SELEND
MSGBOX(res)
ELSE
IFB GET_UWSC_NAME = "trancelate.uws" THEN
// DEMO
DIM msg = "test"
WHILE LENGTH(msg) > 0
msg = INPUT("翻訳したい日本語を入力してください。")
IF LENGTH(msg) > 0 THEN MSGBOX(Trancelate.Do(msg))
WEND
ENDIF
ENDIF



MODULE Trancelate

CONST DEF_URL = "https://translate.googleapis.com/translate_a/single?"
CONST JA_EN_PARAM = "client=gtx&sl=ja&tl=en&dt=t&q="
CONST EN_JA_PARAM = "client=gtx&sl=ec&tl=ja&dt=t&q="

DIM _sc

PROCEDURE Trancelate()
_sc = CREATEOLEOBJ("ScriptControl")
_sc.Language = "JScript"
_sc.ExecuteStatement("Array.prototype.Get = function(i) { return this[i]; }")
FEND

FUNCTION Do(msg, async=FALSE, method="GET")
DIM http = CREATEOLEOBJ("MSXML2.XMLhttp")
http.open(method, DEF_URL + JA_EN_PARAM + ENCODE(ENCODE(msg, CODE_UTF8), CODE_URL), FALSE)
http.send()
RESULT = http.statusText
IFB http.status = 200 THEN
DIM res = _sc.Eval(http.responseText)
RESULT = res.Get(0).Get(0).Get(0)
ENDIF
FEND

ENDMODULE

No.4827 2017/12/13(Wed) 10:45:19

Re: 翻訳について / しゅん
JA_EN_PARAMを変更すれば良いだけです。
ちなみに、追加されたEN_JA_PARAMはだいたいあってるんですけど、一字だけ違います。
なお言うまでもないですが、CONSTを定義しただけでは、もちろん動きません。
ファイル丸ごとコピーしてJA_EN_PARAMを直接変更するか、Do関数を別名でコピーしてJA_EN_PARAM参照箇所を修正したEN_JA_PARAMにすれば良いのではないでしょうか。

、、、どっかで見たことあるなー、と思ったら私が書いたスクリプトですね。
ブログから拾ったスクリプトなら、ブログで質問すれば良いのではないでしょうか。
(まあ、結果的にはブログの管理者が回答しているわけですが)

No.4830 2017/12/13(Wed) 12:02:36

Re: 翻訳について / ばっしゅ
お返事ありがとうございました!
ブログで質問をしていなくてすみません…
一文字だけ違うところが分からなくて悩んでいるのですが
おしえていただいてもよろしいでしょうか?

No.4832 2017/12/13(Wed) 13:34:35

Re: 翻訳について / ばっしゅ
すみません自己解決しました!
ec→enでしたね…お手数おかけしてすみません

No.4833 2017/12/13(Wed) 13:38:34


 過去ログ(〜2017/08/24)・検索ツール


以下のフォームに記事No.と投稿時のパスワードを入力すれば
投稿後に記事の編集や削除が行えます。
200/200件 [ ページ : << 1 ... 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 >> | 過去ログ ]