C#, C♯, C#相談室 Part95
レス数が1000を超えています。これ以上書き込みはできません。
■Visual Studio 2017 Community(無償の統合開発環境)等はこちら
http://www.visualstudio.com/downloads/
■コードを貼る場合はこちら
http://ideone.com/
■前スレ
C#, C♯, C#相談室 Part94
http://mevius.2ch.net/test/read.cgi/tech/1492843013/
■次スレは>>970が建てる事。
建てられない場合は他を指定する事。
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured >>893
俺はPowerShell知らんから推測文法で勝手に書くと
function apply_filterA(filename){ // (A)
echo CONTROL TextBox filename $finename
echo CONTROL Button file_load Click
echo CONTROL Button filter_A Click
echo CONTROL Button file_save Click
}
ls | foreach apply_filter
とかか? まあ雰囲気は分かるだろ。どうしてもオブジェクト文法で書きたければ、property使える言語なら
ref class OreOreWrapper { // (B)
property String^ Filename {
void set(String^ filename){echo("CONTROL TextBox filename "+finename);}
}
} model;
とかかな。
俺が用意するのは公式UIAutomationでしか無い。
君は逆に何故UIAutomationがああなのか、また、
何故PowerShellなんて全く流行ってないのか、理解した方がいい。
既に言ったがコード戦略的には他にも色々理由はあるのだけど、それ以前に、
そもそも外面仕様的にも、.NET縛りになる糞APIを提供する意味なんて上記の通り、まるでないだろ。
Unixフォーマット(テキストと標準入出力)に揃えるのは、異様なほど自由度を提供する物なんだよ。
だからみんなそこから離れられない。 君が間違えているのは、君が出来ているつもりになっている「レイヤー設計」だ。(>>819)
君の中ではPowerShell(中レベル)/アプリの2層しかないから
中レベルAPIをアプリ自体に求め、それで汎用性が全くなくなっている。
そうではなく、各言語向け中→低レベル変換ライブラリ(上記A,B等)を噛ませば、
各言語(中レベル)/各言語向けレベル変換ライブラリ/アプリ(低レベル)となり、
全ての言語で中レベルでも低レベルでも書ける状況になるだろ。
俺の好きなフォーマットで書かせろ、というのはいいが、それはAPIに直接求めるものではない。
どうせどんなAPI/フォーマットを提供したところで、全員が満足する事なんて無いんだ。
なら、上記のように、単純な関数化/ラップでそれぞれのオレオレ超最高フォーマットが手に入るのなら、
それは素晴らしいAPIってことになるんだよ。
そして本件なんて、文句を言った方が恥ずかしくなるレベルなのは君でも分かるだろ。 >>900
まる一日以上かけてそれかよ
そんな汚いわかりにくいコードをありがたがるのはお前だけだぞ
さて>>895に答えるのに何日かかるかなw >>901
ホント残念なやつだな
アプリの中にさらに層が別れてるに決まってんだろ
それぞれの層をスクリプティング用に公開することもほぼノーコストでできる
薄汚いオレオレラッパーを大量生産する苦痛とは無縁だ
そんなこた言わなくてもわかることなんだがわからなかったか >>900
つうかな自由とハックを混同するな
そういうのは黒魔術的な方向に進化してあっという間にカオス化して行く
そんなものはだれもありがたがらない
製造元が頭の悪いマクロしか提供していないから泣く泣くラップ作業に着手するってんならまあ話はわかるが進んでやりたいことじゃねえわな >>902
まあもう一々答える気はないんだけどな。
本当に問題になることを突かれた場合は改善に繋がるから有用なのだけど、
君のレベルではそれは無理だし、実際に今回も恥ずかしいことになってるだろ。
多分君が根本的に間違っているのは、バグをバグと認識できてないことだ。
既に言ったがUIを噛ませて動作が不安定になるのは、明確にバグなんだよ。
それはCPUが余りまくっている暇人環境なら再現しにくいだけで、
他アプリでCPUを取られている場合においてはユーザー環境でも普通に再現する。
つまりCPUロードが高い状況では不安定になるわけで、これは普通にバグだよ。
だから君はまずそのバグを直さないといけない。
そうすると>>850の認識をだいぶ修正出来るだろうさ。 >>905
答えられませんわかりませんって素直に言ったら?
潔さも時にはたいせつだよ >>905
つか不安定ってとこを拠り所にしてるようだが
仮に完全に安定しててもUI操作ベース貧弱文法のオレオレマクロなんて積極的に使う理由にならんからな
UI非依存のAPIを優先して他に何もなくてどうしてもUI操作せざるを得ないとなったらそこで初めて使うか別のツールに移行するか検討すんだよ
そこんとこはやく理解したほうがいいぞ
同僚や取引先にボタン押すオレオレマクロ機能をドヤ顔で提案して赤っ恥をかく前に気づいたほうがいい
これ本当に君が心配だから言ってる しかもな
もし仮に百万歩譲ってUI操作をサポートしなきゃならんとなったとしてもだ
そんなものはUIA、WinAppDriver、Seleniumに任せときゃいいんだよ
時間と金をかけて赤っ恥マクロを製造する必要はない
もうすでにゴミマクロの億万倍便利なライブラリがあるんだからそれつかいなよ
エンドユーザだってそっち使うよ当たり前だろ >>905
正常系だけ動けばいいマクロだったら人間用のUIを触るでもなんとかなるよ。
異常系もハンドリングしなければならないなら、何が出てくるかの一覧もないような、ダイアログに書かれてることを理解しなくちゃいけないんだから、網羅するのはめちゃくちゃ大変だと思わないかな。
人間用には問題を自然言語で全体的な説明する必要があって、
外部プログラム用には事前定義されたメッセージで問題を端的かつ詳細に伝える必要があって、
両者はプロトコルが大きく異なるんだから、人間用に外部プログラム用の伝え方をしたり、もしくはその逆ってのはどう考えても筋が悪い。
外部プログラムに人間シミュレーターをやらせたり、
人間に外部プログラムシミュレーターをやらせたら、
余計なレイヤーが必要になってバグの温床になるだろ。
「バグはバグだろ」とか言ってたって品質は改善しないので、そもそもバグが生まれにくい構造にしておくのが当たり前。
設計からやったことないのかな? >>909
ではまず、
・君的超最高な異常系ハンドリング方式、>>893と同様にコードで、と
・現状やたらあるタスクランナー等のどれ一つにもそれが採用されてない理由
を聞こうか。 こういう返しをしてくるということは数日かけても本当に思いつかなかったんだなwww >>910
あなたは話を逸らす傾向にあるから、その前に、まず、
「自分のオレオレマクロでは正常系での動作しか考えられていなくて、
正常系で動かないのであれば、バグはバグなんだから修正する必要があると言っていた。
だが、異常系への対応までは考慮することができていなかった」
ということを暗に表明していることを認めてもらえるかな?
異論があるならどこが違うのか指摘してくれ。 正常系と異常系がごちゃまぜで
どこが危なくてどこが危なくないのか全く区別がつかない 毎度毎度スレ違いどころか明後日の方向レスの応酬やっている連中は病院行け 漏れは、スクレイピングに、Ruby, Selenium WebDriver, Nokogiri を使う。
ブラウザの自動操作もできるし
ただ、各サイトの解析が大変。
特に、Ajax で動的に読み込むものは、読み込み前には存在しないから ところでこれ、既存の他アプリを操作するって話なの?
自分の既存アプリを多アプリが操作するって話なの?
多アプリで操作されるアプリを設計するって話なの? こんな感じで
TestDataGridView.Columns.Add("Number", "No.");
TestDataGridView.Columns.Add("Item", "項目");
for (int i = 0; i < Max; i++) {
TestDataGridView.Rows.Add(1);
TestDataGridView["Number", i].Value = (i + 1).ToString();
TestDataGridView["Item", i].Value = "";
}
初期化して、TestDataGridView["Item", i].Valueに何らかを代入して作業を終えて
中身を消そうと
for (int i = 0; i < Max; i++) {
TestDataGridView["Item", i].Value = "";
}
を実行するとGCがバカバカ発生して滅茶遅いのですが、なんでですか? GCがバカバカ発生したってのはどうやって確認したの?
遅い理由がGCにあるってどうやって確認したの? >>919
デバッグで起動して、右側の診断ツールのプロセスメモリのグラフに黄色のマークがどんどん現れたのです。 WinformsならSuspendLayout & ResumeRayout(true)で囲ってみては?
DataGridViewってItemsSourceに代入するとき以外は代入するたびに表示の更新されるよね、確か >>921
やってみましたが変わらずです。
11列×256行で最初の2列はそのままで以降の列に計測値と計算値を代入して、次の測定でクリアするのですが、一回目は瞬時クリアで2回目以降は20秒くらい待たされます。
自動調節などは入れていません。
今まで同様なソフト作っていて初めての事です。 >>922
ミニマムコード作って動かしてみれば
それでそんな動作になるのなら諦めるか改めてそのコード示して質問するか
一回目と2回目の動きが変わるとかGCが頻繁に動くとかちょっとありえないし >>922
ちゃんと
TestDataGridView.SuspendLayout();
TestDataGridView.ResumeRayout(true);
って書いた?
これはコントロール毎にしか聞かないから、Form1のサスペンド呼び出しても子コントロールには効かない TestDataGridView.SuspendLayout();
//ここにTestDataGridViewの処理を書く
TestDataGridView.ResumeRayout(true);
いずれにしても20秒も掛かるとなると他に原因ありそうだな
一応自分はFlowLayoutPanelに自作コントロールをListViewのように並べるというソフト作ってた時、
1000個以上のアイテムを一気に追加すると数秒ラグってたのがこの手法によってほぼ一瞬で表示されるようにはなったが デバッガ表示見てるんだからプロファイラで問題箇所特定が一番早くて確実
その上で最小再現コード作ったり他の設定いじったり試行錯誤してみればいい
なんで便利な標準ツールを使わずに他の手法を進めるのか理解できない >>929
Resumeの()にはtrueじゃなくて空でした。
駄目? trueを渡せば停止中にキューに溜まってたものを一括でレイアウトするから低負荷にレイアウトが出来るって仕組みだったはず
なのでtrue引数入れないとパフォーマンス上の恩恵は得られない >>930
vs プロファイラでググればすぐ出てくる
どの関数がどれくらい処理時間くってるか全部出してくれる
何なら関数内のどの行がどれだけ処理時間かかってるかまでわかる
この点だけを調べるならマジで簡単だから一度試してみるといいよ true入れましたが駄目でした。
プロファイラ使ってみました。
1回目の状態です。
http://imgur.com/QRNwSP5.png
瞬時です。
2回目です。
http://imgur.com/cfzhpIi.png
時間かかってます。
セルに代入している時にGCが一杯発生してます。
http://imgur.com/IEzLFZa.png
使い方間違っているのかな? static な Main() の中で
await を使うと Main() に async が必要と言われ
Main() に async を付けると怒られました>< C#7.1(だっけ?)以降なら書けるから更新する
もしくはstatic async Task AsyncMain()みたいなのを挟む >>934
直接dataGridView触るとやたら遅くなるケースがあるから
データの追加削除等全部mainlistの方でやって、
こんな感じで更新する形に落ち着いたような 全然覚えてないような・・・
SortableBindingList<Model.hoge> sortableList = new SortableBindingList<Model.hoge>(Model.mainlist);
dataGridView1.DataSource = sortableList
C#も話題もよく分かってないから 見当違いだったらすまんね! >>937
ありがとう。
直接アクセスすると良くなさそうなんでlistでバインディング出来るか試そうとしてました。
明日、トライします。
MFCで少し書いていましたがC#だとめちゃくちゃ短いソースになるんで勉強します!
ハード周りはC++のDLLでやれそうで明るい未来になりそうです。 DataGridViwのなんかのイベントで重い処理やってんじゃないのか >>938
SortableBindingListに関しては下記のページより、
https://docs.microsoft.com/ja-jp/previous-versions/dotnet/articles/ms993236(v=msdn.10)?redirectedfrom=MSDN
ぐぐって何番目かに出てくる、動物病院のページが参考になったよ 先生凄い
dataGridViewって利用者多いと思うんだけど、どれがスマートな利用方法かは調べにくいよね 頑張って!
>>939
詳しい解説や dataGridViewこう使うのが一番賢いぜ!って内容凄く聞いてみたい autoScrollをtrueにしたPanel内で例えばcomboboxにフォーカスすると、スクロールバーが自動で上まで移動してしまいます。
それを解決するにはScrollToControlメソッドをoverrideしたPanelを作成すれば良いというところまではわかったのですが、
SplitContainer内のPanelの場合はどのようにすれば良いのかがわかりません。あまり頭が良くないので具体的なコードで教えていただけると助かります。 >>943
SplitContainerのSplitterPanelはsealed classになっているからそっちで何とかしようとするとめんどくさそう
SplitterPanelの上にSizeとAnchor合わせた「ScrollToControlメソッドをoverrideしたPanel」を重ねるのが楽じゃない? >>943
正攻法でやるの面倒そうだから、その魔改造したPanelをSplitterPanelに入れて
Dock = Fillにしたら?
それにしても糞UIだねそれw
見えないComboBoxにフォーカスが当たっててマウスホイールに触っちゃったりしたら
いろいろイライラが募りそうw >>945-945
ありがとうございます。無事に実装できました。 実行モジュールをWindowsサーバーに常駐させてクライアントPCからのリクエストでサーバー上でコマンドを実行する
という仕組みに最適な.NETプロジェクトって何だと思いますか?
IIS建ててWebサービスかなと思うのですが1つのサービスのためにIIS建てるのは何か大袈裟だなと思いまして
よりモダンでイケてる仕組みがあったらお聞かせ頂きたいと 常駐のための設定とか信頼性とか監視とか考えたら結局IISの方が手っ取り早くて楽
モダンでイケてるとか言い出したら今時WinサーバーかよとかオンプレかよとかAWSやGCPでKubernetes使えとかそういうそもそも論にしかならないのでナンセンス 検索してやったぞ
https://qiita.com/0829/items/5518256b348521ac358c
自分なら環境が許せはコンソールアプリ常駐で(リクエスト)ファイル監視で作るかな >>949
embedIOで雑なHTTPサーバ作る。超楽。 >>949
windows 用の sshd をサービスに登録して起動
リモート側から putty とか plink とかで操作 windows 限定でセキュリティ気にしないなら psexec インターネットに公開するのかイントラネット内だけの話なのかで大分変わりそうだが Ruby なら、コマンドプロンプト・PowerShell から、1-liner で、
Rubyで作られた遅いウェブサーバー、WEBrick が起動する
ruby -run -e httpd . -p 8080
そのフォルダに、index.html があれば、これでブラウザからアクセスできる
http://localhost:8080 知らない技術が出てきて勉強になります
C#でさささと書ければ良いので色々試させて頂きます 要件まとめずに実装方法から入ってあとで後悔するパターンだね
個人用途ならいいんだけど >>957
イントラのお気楽サーバーです
AD立ててるので操作ログにログインIDを記録することでセキュリティに替えたいと思います
中国軍のハッキング等は想定しておりません >>960
一部のチーム員が使うサーバ管理ツールです
すでにある実行ファイルを任意のタイミングで実行するのみのもの
DB使ったフラグのやり取りしてもと思ったのですが、実行ファイルをポーリングさせてリクエスト監視するのは効率悪いなと断念しました 利用者がWindowsのサーバー管理をしてるんなら
Powershellが第一候補なんじゃないかな
認証やロギングの要件わからないけど
Invoke-Commandだけでも結構なことができるよ staticな拡張メソッドが作れれば割と便利な気がしないこともない >>949
普通に考えてまずWindowsサービスだろ
プロトコル等に規制がないならIISでもいいけど >>966
それは回答になってないだろ
winサービスを自前で作るんならクライアントから要求を受ける仕組みもセットで示さないと
まあその場合大抵はTCP系だろうが、だったら素直に最初からIISの方が手っ取り早い >>966
windowsサービスも考えたのですがクライアントとのやり取りをどうしようと
データベースでやり取りすればと思いましたがサービス側が周期的にデータベースへアクセスは辛いかなと >>949
.NETでないとダメなの?
> 実行モジュールをWindowsサーバーに常駐させてクライアントPCからのリクエストでサーバー上でコマンドを実行する
要件がこれだけならサーバーにOpenSSH入れてクライアントからログインしてコマンド投げるコード書けばいいだけかと >>971
それ実行モジュールが常駐してないじゃん
>>970
クライアントとのやり取りで悩むレベルならIIS一択 >>972
> それ実行モジュールが常駐してないじゃん
サービスも知らんのか? 次スレは新しく立てずにこっちで
C#, C♯, C#相談室 Part94
https://mevius.5ch.net/test/read.cgi/tech/1553075856/
即死判定無いし削除依頼は機能してないからゴミスレがどんどん増える c#からsql serverにアクセスして、SQLを文字列で作成して問い合わせるときに、「@」が付いている箇所があるんですが、何かわかりますか?
調べるとdeclareで変数を宣言するときに使うみたいなのですが、declare文もないので分からない状況です。 var foo = @"ABC\DEF";
とかなら、'\'等をエスケープシーケンスとして使用せず、そのままの文字として使用する場合に使います。
よくあるのがフルパスでファイルやフォルダを指定するときですね。
SQL文自体に@があるならパラメータでしょう。 >>986
パラメーターってdeclareで宣言しなくても使用できるものなんですか?
パラメーター自体まだわかってはいなんですが… パラメータはインジェクション対策によく使われます。
この辺りを説明すると長くなるので、SQL インジェクションなどのキーワードで検索してみてください。
パラメータをSQL文(declare等)で定義する事はありません。 >>987
とりあえずよくわかってないならその部分のコードを晒した方がいい
>>986が言うように@は複数の意味で使われるからすれ違うと頓珍漢なことになるから >>990
すみません、会社のコードなので晒せないんです。
とりあえず皆さんから出てきたキーワードでもっと調べてみます。 会社のコードなのにまず社内で聞かないでここで聞くとかもう 埋めついでに
全部そのまま晒すのではなくて、コードの一部とを変数名等を変えて(hogeとか、barとか)やれば問題ないよ。
それもダメとかいう会社は、そもそも5chアクセスなんて許してくれないだろw そんな書き換えで晒すとか
人生棒に振るからやめとけ 単純化しただけで人生棒にふるってどういうことよ
イミフすぎるぞ SqlClientとかがどんなsql吐いてるか一回ぐらい確認したほうがいいよ 993です。
SqlClientも見てみるようやってみます。
後は社内のわかる人にタイミング見つけて聞いてみます。 レス数が1000を超えています。これ以上書き込みはできません。