X



トップページ独身男性
660コメント436KB

System.out.println("またJavaの季節がやってきた!" + 2);

■ このスレッドは過去ログ倉庫に格納されています
0001おれさま ◆6CTEZS59O00a
垢版 |
2018/09/13(木) 10:42:14.49
去年の今頃Java学習開始するも挫折
しかし不屈の闘志をめらめらと燃やしながら
そびえ立つ岩壁にいどむため、再びこの地にやってきたのだ!

プログラミング歴は独学Cチョビッツ+独学VBA少々


きょうかしょ
https://www.amazon.co.jp/dp/484433638X
スッキリわかるJava入門 第2版 (スッキリシリーズ)
0545おれさま ◆6CTEZS59O00a
垢版 |
2019/04/11(木) 15:42:43.04
今日の学習は終わり!
4章の途中まで復習した
switch-case文、
VBAだとSelect Case-Case文
これがたまに混同する
If文の条件式みたいにC#だと丸括弧を使うので注意だな
すぐ忘れる
0547おれさま ◆6CTEZS59O00a
垢版 |
2019/04/14(日) 07:40:29.88
ローカル変数の整数型、初期化しないと
VBAのIntegerだとゼロ
C#のintだとコンパイルエラー

フィールドだとC#はゼロ埋めのようだ
配列も同様

この辺VBAの方が易しい
0549おれさま ◆6CTEZS59O00a
垢版 |
2019/04/16(火) 14:35:25.16
delegateをごちゃごちゃいじってる
簡単なプログラムを何個も作ってテストしてる
いろいろ分かってきたわい
0550おれさま ◆6CTEZS59O00a
垢版 |
2019/04/18(木) 14:13:49.97
ラムダ式をごちゃごちゃいじってる
独習のラムダ式の説明はいまいちだな
理解はできたんだけど、これじゃ挫折する人いると思う
デリゲートを用いる最も簡単な例、つまり、メソッドの引数としてメソッドを引き渡すケースではなく
メソッドを変数に代入して使うだけの簡単なケースを
ラムダ式の紹介の一番最初に出してくれないと。
おそらく紙面を節約しないといけない都合でこうなったんだろうけど
0551おれさま ◆6CTEZS59O00a
垢版 |
2019/04/18(木) 15:10:18.74
配列とかコレクションとかで、全ての要素を順に操作する目的で
ラムダ式が多用されるのな
これ便利だわ

ちなみに独習の標準ライブラリの章で配列にAnyメソッドを使ってる場面があるんだけど
これはListでも使えて、たぶんListにあるExistsメソッドと機能は同じだ
Anyはusing System.Linqが必要

この辺の知識はForの代用として使えるから、すっきりとしたコードをかけるようになれそう
0553おれさま ◆6CTEZS59O00a
垢版 |
2019/04/20(土) 04:30:11.10
ラムダ式の構文でこんなのが独習に書いてある

TResult Func<T, TResult>(T arg)

こういうのをこれまで半ば無視しつつも、時に参考にしてきた
厳密な使い方を理解したいなら、この「構文」とやらをちゃんと理解しておいたほうがいいんだろうなとは思ってる

この構文の形式に近いものがコードに現れてくるのは
ラムダ式で表現されたメソッドを受けとるメソッドの定義部分
例えば
void DoMethod(Func<int, string> output) { Console.WriteLine(output(10)) }
みたいな。

TResult Func<T, TResult>(T arg) において、

<T, TResult> は、T型を引数とし、TResult型を戻り値とする、の意味。ジェネリックだ
頭のTResultは、TResult型の戻り値をおけ、の意味
(T arg)は、T型の引数argをおけ、の意味

argは、argument 引数 の意味
引数というのはparameterじゃなかったっけと思って調べてみたんだけど

argument 実引数
parameter 仮引数

みたいな違いがあるという記述があるという一方
それほど厳密な定義でもないという話も。

エントリーポイントのメインメソッドの引数、つまりコマンドライン引数でも
args として複数の引数を示している
argとかargsが構文に書かれていたら、実際にここに引数を書けということだと理解すれば足りるということだな
少し違和感を感じるのは、なぜ引数だけargという記述を用いて、
戻り値の方はTResultという型しか書いてないのかという点だけど、
まぁこれはよく考えたら、例えば仮引数に変数を使うけど、
戻り値にあらためて変数を使う事はないし、戻り値はメソッド名を書くことで取得できるわけで
そういう意味では、引数にargの記述があり、戻り値にはこういう記述がないのは当たり前か
戻り値を
0554おれさま ◆6CTEZS59O00a
垢版 |
2019/04/20(土) 04:43:07.46
そう考えると、こう書くのが正確なのか

TResult Func<T, TResult>(T arg) において、

Func<T, TResult> は、Func<>の<>の中に2つの型を書けということを示す。そして、
(T arg)の記述により、一つ目のTが引数の型として使われることを説明
構文の冒頭に記述されるTResultの記述により、2つ目のTResultが戻り値の型として使われることを説明

みたいな感じか
まずFunc<T, TResult>という風に書け
そして、TおよびTResultが何なのかを説明するために
TResult Func<T, TResult>(T arg)
というようにFunc<T, TResult>の前後に追加して記述されていると。

順番を意識したほうがよさそうだ
0555おれさま ◆6CTEZS59O00a
垢版 |
2019/04/20(土) 18:13:08.77
LINQで分からないところがあって、ずっと考えてた
やっと分かった(気がする)んで今日はこれで終わろう
もう少しちゃんと説明が書いてあるといいんだけど、難しかったんだろうな
ぐぐってもなかなかヒットしないしね
0556おれさま ◆6CTEZS59O00a
垢版 |
2019/04/21(日) 09:03:25.23
LINQを使う前に、IEnumerable<T>の理解はしておかなきゃね
ということでその辺の復習してる
0557おれさま ◆6CTEZS59O00a
垢版 |
2019/04/21(日) 09:13:37.09
独習に例示してあるコードは実践的にしたいためか
学習するには要点がぼけてしまってるものがある
なので、自分でぱっとみてポイントが分かるようなコードに書き直して
ちっこくプリントアウトして独習に貼り付けるというアナログなことをしている
なんだかんだいって勉強は紙の方がいいんだよなぁ
検索ができないという点をのぞけばだけどさ

リアル本と電子書籍のハイブリッドなナニカができるといいな
見てくれはリアル本なんだけど、一ページ一ページが電子的な処理が施されていて
印刷内容だけでなくメモった内容も表紙に内蔵されたストレージに保存される
これを使って検索も容易に出来るとか
俺しか需要がないか
0558おれさま ◆6CTEZS59O00a
垢版 |
2019/04/22(月) 14:28:31.25
頭の中で、抽象クラスというものの存在意義と
ポリモーフィズムがしっかりと関連づけられていなかった
ここがちゃんと結びついてるといろんなルールもすんなり頭に入ってくる (ような気がする
0560おれさま ◆6CTEZS59O00a
垢版 |
2019/04/27(土) 16:54:28.86
あるクラスのプロパティAやメソッドAが、別のクラスBのオブジェクトを返す場合
AとBの名前が同じなことが多いのかな
これまで適当に捉えてたから気づかなかったんだけど、正確に捉えて置いた方がよさそうだ

例えば、
正規表現で、RegexクラスのメソッドMatchがMatchクラスのオブジェクトを返すから
Matchメソッドの構文は

Public Match Match(string input [, int beginning [, int length]])

とMatchが2つ連なっている
で、戻り値として得たMatchオブジェクトというかインスタンスのメンバを使っていろいろと
詳細データを引き出すことになる
なので、最低限この2つのMatchが別物だと認識することは必要
0561おれさま ◆6CTEZS59O00a
垢版 |
2019/04/27(土) 17:41:40.08
正規表現で
サブマッチ文字列を取り出しすとする

foreach (Group item in m.Groups)
{
Console.WriteLine(item.Value);
}

みたいにするんだけど、このとき、Groupをvarにすると
Valueプロパティが使えなくなる

foreach (var item in m.Groups)
{
Console.WriteLine(item);
}

ならいける
ん〜なんでだろと思って調べてみたんだけど、varを使うとitemにobject型が入るみたいだ
そのため、Group型であれば使えたはずのメンバーが使えなくなる
単純に表示させるだけなら別に問題ないんだけど。

ここで大事なのはvarを使っても具体的な型を使っても同じだと思っていたけど
そうではないケースがあるということだ
上の例だとGroupを使った時はvarを使った時と比べると、6個も追加のプロパティが使えるようになる
複雑な操作を必要とする場合、影響大きいかも
0562おれさま ◆6CTEZS59O00a
垢版 |
2019/04/27(土) 18:39:44.47
正規表現おもろいなぁと思って
正規表現の聖書と言われているオライリーの「詳説 正規表現」をアマゾンでみたら

\5,184
https://www.amazon.co.jp/dp/4873113598/

ふぇ・・?正規表現だけで5せんえんですか!
しかしそのうち買ってしまう予感がする・・・・
0563おれさま ◆6CTEZS59O00a
垢版 |
2019/04/28(日) 12:57:04.01
public static void Main(string[] args) {
 Console.WriteLine("aaa");
}

みたいなJavaでやってたカッコの付け方に変更できるようだ
Visual Studioの
ツール→オプション→テキストエディタ→C#→書式設定

「始め中カッコ」
という名称があるようだ

変更しようか迷うところだ
0564おれさま ◆6CTEZS59O00a
垢版 |
2019/04/28(日) 13:07:30.18
DateTimeの復習してて令和を含んだ文字列をParseできないか試したけどだめだった
VisualStudioをアプデしたらいけるかなと思ってやってみたら、
これ数ギガ分、つまりファイル全部アプデすんのな
DL待ちで使えなくなってしまった
0565おれさま ◆6CTEZS59O00a
垢版 |
2019/04/29(月) 07:20:46.95
windowsアプデのKB4493453を手動でいれたら、令和認識するようになったわ

var str = "令和1年5月1日";
var d = DateTime.Parse(str);
Console.WriteLine(d);

結果:
2019/05/01(日) 0:00:00
0566おれさま ◆6CTEZS59O00a
垢版 |
2019/04/29(月) 11:57:46.59
IFormatProviderとかいうのがいろんな構文に引数の型として出てくる
引数の型として指定されているにもかかわらず、実際のコードをみると
「IFormatProvider」という文字はどこにも書かれていない
見て見ぬフリしてたがちゃんと調べてみた

通常はIFormatProviderを実装したクラスであるCultureInfoクラスを利用するようだ
日本独自の表現をしなければならないような場合に使うようだ
例えば日付情報なんか
「2019年」というだけで「年」という日本語を使うので、正確に言えばこういうものを表示する場合だって含まれる

IFormatProvider provider
のようにメソッドの引数として指定されている場合、実際のコードではこう書く
・new CultureInfo("ja-JP")
・CultureInfo.CurrentCulture
・CultureInfo.GetCultureInfo("ja-JP")
のどれでも結果は同じだった
要はIFormatProviderを実装するCultureInfoクラスを使って
日本だってことが伝わればいいようだ
0567おれさま ◆6CTEZS59O00a
垢版 |
2019/04/29(月) 12:12:28.99
var dt = DateTime.Now.AddDays(2);
var ci = new CultureInfo("ja-JP");
ci.DateTimeFormat.Calendar = new JapaneseCalendar();
Console.WriteLine(dt.ToString("f", ci));

結果:
令和元年5月1日 12:03



おぉ・・・でたでた

ci.DateTimeFormat.Calendar = new JapaneseCalendar();
が大事
DateTimeFormatプロパティは戻り値がDateTimeFormatInfoオブジェクト
つまりCultureInfoクラスは、DateTimeFormatInfoオブジェクトをフィールドとしてデータ保持していることになる
そんでもってDateTimeFormatInfoクラスはCalendarプロパティを持っている
CalendarプロパティはCalendar型のフィールドに繋がっている
ここにJapaneseCalendarオブジェクトを代入する

継承Object→Calendar→JapaneseCalendar

だから代入可ということか
0568おれさま ◆6CTEZS59O00a
垢版 |
2019/05/01(水) 13:30:45.23
おっしゃ
実際に役立つアプリができた
ランチャー的なものなんだけど練習にはちょうどいいし
自分で使う分には相当便利で満足
令和の初日に完成か
0569おれさま ◆6CTEZS59O00a
垢版 |
2019/05/02(木) 16:24:00.66
もう1個作った
Javaで作ったやつをC#で作り直したんだけどずっと簡単だった
VSの恩恵を受けてるだけなんだけど。
夏時間も反映する海外の時間も表示する時計なんだけど
ついでにこいつをタイムスケジューラ代わりに使っていこうと思う
Windowsのタイムスケジューラはなぜかそのうち機能停止するので役に立たない
0570おれさま ◆6CTEZS59O00a
垢版 |
2019/05/03(金) 00:47:31.36
webスクレイピングまで行かなくてもhtmlもらってくる処理をしたりするときのお手本コードを
調べてるとasync awaitをつかったものがでてくる
この辺は独習で飛ばしてしまったのでやり直すことにしよう
0571おれさま ◆6CTEZS59O00a
垢版 |
2019/05/03(金) 10:56:11.45
async awaitのところ、独習の説明だと分かったのか分かってないのか分からないという
経験から言えば、これはちゃんと理解できてないなという程度

もう一冊買ってある参考書を読むことにする
0572おれさま ◆6CTEZS59O00a
垢版 |
2019/05/03(金) 13:10:12.97
実戦で役立つ C#プログラミングのイディオム/定石&パターン

を読んでるんだけど、わかりやすいわぁ
独習は基本的な所を網羅してる点でいいんだけど、少し難しい所に入ると
紙面節約のためか学習の順序ってのをすっとばして説明するから困る

独習もう一度しっかり読んでから実戦を読もうと思ってたけど、
こっちも読み進めていった方が効率あがりそうだ
0573おれさま ◆6CTEZS59O00a
垢版 |
2019/05/03(金) 15:20:05.79
Javaで作った定期的なグローバルIPアドレス記録を時計アプリに組み込んだ
ローカルIPアドレスもついでに記録するようにしたんだけど、これが案外手間取った

あとTimerのインターバルが100mm秒だとなかなか気づけなかった
1秒だと思い込んでた

タイムスケジューラ的な使い方がうまくいくなら
これからはこいつがwindowsのタイムスケジューラのかわりとして利用できることになるわけだ

今回は基本的な非同期処理も取り入れていろいろ勉強になった
0574おれさま ◆6CTEZS59O00a
垢版 |
2019/05/05(日) 10:54:49.01
タスクスケジューラに登録してたのものをすべて時計アプリから実行するようにした
バッチファイルもいけるかなと思っていろいろ調べてやっと問題なく起動できるようになったんだけど
よくよく考えてみたら、exeにコマンドライン引数を渡すためのバッチファイルだった
つまり、普通にexeを時計アプリから引数付きで起動すればいいだけの話だった

もっと言えばそのexeも自分がプログラミングができないから、ネット上から誰かの作ったフリーソフトをダウンロードしたもので、すでにある程度自分でやれるんだから、自作すればいいだけの話なのだが。

少しずつ自作のプログラムに置換えていこうと思う
0575おれさま ◆6CTEZS59O00a
垢版 |
2019/05/05(日) 14:37:42.91
エスケープシーケンス関連の理解が不正確
もっと厳密に理解することにする
なんとなく適当にやってるとできちゃうからよくない
0576おれさま ◆6CTEZS59O00a
垢版 |
2019/05/05(日) 15:30:50.95
Console.WriteLine("aa\naa");//aa[改行]aa
Console.WriteLine("aa\\naa");//aa\naa
Console.WriteLine(@"aa\naa");//aa\naa
Console.WriteLine("aa\daa");//エラー
Console.WriteLine("aa\\daa");//aa\daa
Console.WriteLine(@"aa\daa");//aa\daa

Console.WriteLine((new Regex("aa\naa").IsMatch("aa\naa")));//true(これは特殊な例か)
Console.WriteLine((new Regex("aa\\naa").IsMatch("aa\naa")));//true
Console.WriteLine((new Regex(@"aa\naa").IsMatch("aa\naa")));//true
Console.WriteLine((new Regex("aa\daa").IsMatch("aa1aa")));//エラー
Console.WriteLine((new Regex("aa\\daa").IsMatch("aa1aa")));//true
Console.WriteLine((new Regex(@"aa\daa").IsMatch("aa1aa")));//true

んー正規表現のパターンの中でエスケープシーケンスを用いる場合
基本的には逐語的な表現をしないといけないと思うんだけど、
\nのようにそうでないものもある
上の単純なConsole.WriteLineでの出力で\nについてエラーがでないことと関連するんだろうなぁとは思うんだけど、まぁそういうことなんだろうな
0577おれさま ◆6CTEZS59O00a
垢版 |
2019/05/05(日) 16:56:26.81
非同期処理async-awaitはC#7.1以降、Mainメソッドでも使えるようになった

しかし、デフォルト設定だと
「最新のメジャーバージョン」を適用することになっているためC# 7.0までしか使えない
そこで、プロジェクトのプロパティ→ビルド→詳細設定から7.1以降を選ぶ


もう一つ

DateTime型は算術演算子を使った比較ができるんだけど
DateTime.Nowを使って取得した現在時と、new DateTime()で取得した固定時間を比較して
イコールになったタイミングで何かをするみたいなことをしようとしてもなぜか一致しない

これは、DateTime型がミリ秒まで格納してるから。
Nowの方はミリ秒が半端なのに対して固定時間はゼロなので、大抵一致しない
そこでミリ秒部分を無視できるように、ToString()でミリ秒がないような文字列に変換して比較するといい


ちなみに、この実験をするときに、VBAでつかったSleepみたいなメソッドがあるといいなと思ったんだけど、
非同期処理をするTask.Delay(1000)を使った方がよいということだ。
これを繰り返し処理と合わせて、1秒おきに処理させて一致させると。
んで、Task.Delayをメインメソッドで使えたら楽できると思って、・・・・最初の話につながる
0578おれさま ◆6CTEZS59O00a
垢版 |
2019/05/05(日) 17:06:54.65
時計アプリでTimerを使ったんだけど
whileとTask.Delayを組み合わせる方法とどちらがいいんだろうか

そういやTimer使った時、非同期処理なんて考えても行かなかったんだけど
https://qiita.com/kenji-yokoi/items/3115dbf876e6ed30ba50
こんな感じにやったほうがいいわけか

結局どちらの方法を使っても非同期処理をうまくやればいいってことかな
0580おれさま ◆6CTEZS59O00a
垢版 |
2019/05/06(月) 13:27:13.36
引き続いてasync-awaitやってるんだけど
自分で適当に練習コード書こうとするといろいろ気づく

Mainメソッドでasyncを使う時
public static async Task Main(string[] args)
みたいにTaskを戻り値の型としないといけない
これをvoidとするとエラー

これは理解できる

C#7.1以前は別にasyncのメソッドを作ってたわけだ
static async Task RunAsync()
みたいなの。
これをMainとかから呼び出す形で使ってたわけだけど
そのままMainに組み込めるようになったということなので
Mainの戻り値がTaskになるのはごく普通

そもそもここをTaskとするのは、そのメソッドを呼び出したメソッドに非同期処理の状況などを
通知するためなんだけど、Mainを呼び出すメソッドに通知するって話になる
ん・・・?ってなるけどここはまぁいいとする

問題は、GUIアプリでつかうイベントハンドラを非同期にした場合
private async void button1_click()
これはなんでvoidなんだ?って話

これがおかしいのかこれは普通でほかがおかしいのか、その辺を突き止めるのがやっかいだったけど
結論としては、イベントハンドラの方が特別で例外的な仕様になっているようだ
ここでvoid Taskとするとエラーがでる
そもそもイベントハンドラを呼び出すのはコードではなくてユーザだから
Taskで通知を返しても意味ないじゃんとかいうことらしい

なるほどね
0581おれさま ◆6CTEZS59O00a
垢版 |
2019/05/06(月) 13:51:12.44
//@
public static async Task Main(string[] args)
{
 await Task.Run(() => DoSomething());
}
//戻り値のない同期メソッド
static void DoSomething()
{
 var str = "aaabccc";
 var result = str.Split('b');
 Console.WriteLine(string.Join(".", result));
}

//A
public static async Task Main(string[] args)
{
 var str = await Task.Run(() => DoSomething());
 Console.WriteLine(str);
}
//戻り値のある同期メソッド
static string DoSomething()
{
 var str = "aaabccc";
 var result = str.Split('b');
 return string.Join(".", result);
}

//B
public static async Task Main(string[] args)
{
 await DoSomethingAsync();
}
//戻り値のない非同期メソッド
static async Task DoSomethingAsync()
{
 await Task.Delay(2000);
}

//C
public static async Task Main(string[] args)
{
 var str = await DoSomethingAsync();
 Console.WriteLine(str);
}
//戻り値のある非同期メソッド
static async Task<string> DoSomethingAsync()
{
 await Task.Delay(2000);
 return "aaa";
}
0582おれさま ◆6CTEZS59O00a
垢版 |
2019/05/06(月) 14:35:50.64
非同期Mainではwaitは使わないでいいってことかな
呼び出し元でwaitを使うわけだけど
そもそも呼び出し元がないような形になっているのでwaitを使いようがない
0583おれさま ◆6CTEZS59O00a
垢版 |
2019/05/06(月) 15:03:41.51
https://www.kekyo.net/2016/12/06/6186
ここにすごく大事な事が書いてあるような気がする

自分なりにまとめると、
非同期Mainでwaitを使わないでよいのと同じような理由で
GUIアプリのイベントハンドラでもwaitを使わなくてもよい、というようなことになるのかな

使っちゃうと「デッドロック」とやらを引き起こしてしまうそうな

waitをつかわなくちゃだめな例としてはコンソールアプリで非同期メインを使ってないケース
メインメソッドから非同期メソッドを呼び出す
すると、呼び出し先の非同期メソッドではawaitで当該非同期処理の終了を待機することになる
その間にメイン「スレッド」はメインメソッドを抜けてしまってプログラムが終了してしまうことになる
つまり、非同期メソッドの終了を待たずしてプログラム全体が終わってしまうことになる
これは呼び出し元がメインメソッドだからこそ起きるとも言える

@非同期メインでwaitを使う必要がない理由
非同期メインではメインメソッドの中で「await」(waitではなく)を使う事になる
これによってawaitに続く非同期処理が終了するまでメインスレッド自体が待機することになる
これによってメインスレッドが勝手に終了してプログラムが終わってしまうなんてことはないということだ
コンソールアプリで非同期メインを使わないケースでは「await」が置かれているのはメインメソッドではなく、メインメソッドから呼び出される非同期メソッドの中であるという点に注目すれば違いが分かる
この場合は、非同期メソッドの流れがそこでawait(待機)状態になるわけだ
非同期メインではメインメソッド内にawaitが置かれるためメインメソッドの流れがそこでawait(待機)状態になる

A
0584おれさま ◆6CTEZS59O00a
垢版 |
2019/05/06(月) 15:10:11.18
AGUIアプリのイベントハンドラでwaitを使っちゃだめな理由
イメージ的な説明なんだけど、
コンソールアプリで非同期メインを使っているときのメインメソッドと
GUIアプリの非同期イベントハンドラは同じような位置づけになるんじゃないかと。
つまり、
非同期のイベントハンドラ内でawaitを使う事になるので、そこで非同期処理が終わるまで待機してもらえるためwaitの必要がない
これは@とまったく同じこと


いまんところはこういう理解をしている
そのうち変るかもしれないが
0585おれさま ◆6CTEZS59O00a
垢版 |
2019/05/07(火) 18:03:21.34
FileInfoとかDirectoryInfo使う時のパス指定で

「 . 」カレントディレクトリ
「 .. 」一つ上のディレクトリ

が使えるんだけど、一般的ではないのか独習にも書いてない
FileInfoのコンストラクタに渡す引数なんだけど

" data.txt "
" . / data.txt "
" . \data.txt "

この3つはどれを渡してもカレントディレクトリのdata.txtの意味になる
(5ch上では判別しにくいので半角スペースをいれてある)
/ と \ が同じ意味で使えるっていうのは・・・・

さらに

" .. /data.txt "
" .. \data.txt "

この2つはどちらも一つ上のディレクトリのdata.txtを意味する

まさかと思ってやってみたんだけど、
これまで出てきたパス指定なんだけど、¥のかわりに/を使っても大丈夫だった
なら逐語的表現を指定する@を使う必要がなくなるのか
なんで独習には書いてないんだろうか

思い出してきたんだけど、スラッシュをフォルダの区切りとして使うのはもともとUNIXでの書き方か
http://www.tohoho-web.com/ex/draft/path.htm
windowsだとバックスラッシュを使うのが基本
HTMLだと/が使える
この辺は混在してるわけか
0586おれさま ◆6CTEZS59O00a
垢版 |
2019/05/09(木) 14:23:31.97
地道に独習の復習

やってて思うんだけど、簡単なコードの使い方ぐらいは調べなくても
さっさと書けるようにしないと、難しいコードの使い方を覚えようとしたときに行き詰まるんだよな
記憶力がいまいちだからしっかり覚えるために工夫していかないといけないなと思ってる
0587おれさま ◆6CTEZS59O00a
垢版 |
2019/05/10(金) 17:47:09.29
VBAのプログラム作ってた
windows API呼び出すものなんだけど
DoEventsを使わないとうまく行かないということにやっと気づいた
うまく作れた
0588おれさま ◆6CTEZS59O00a
垢版 |
2019/05/11(土) 11:20:02.43
VBAのプログラム作ってて思うんだけど
windowsAPIを使いこなすための基本知識が欲しい
なんだかんだこぴぺで足りてしまうんでちゃんと勉強してこなかった
何かいい本ないかと思ってアマゾンで検索して
よさそうなのポチろうとしたら、すでに購入済だって表示されててワロタ
今その本発掘してきた
0589おれさま ◆6CTEZS59O00a
垢版 |
2019/05/11(土) 14:12:48.22
これはVBAだけじゃなくて他の言語もやってないと難しいな
ずっと前に少しだけ読んで結局途中で挫折したの思い出した
今読むとそこそこ理解できる
C言語の知識も使うようだ
ずっと昔に少しだけやったけど忘れてしまっている
0590おれさま ◆6CTEZS59O00a
垢版 |
2019/05/12(日) 08:42:43.67
VBAで引数にカッコつけるかどうかの話は大事なんだけど結構忘れる
細かい仕様を理解してないとどうしてこのバグがおきてるのか理解できない
ここはちゃんと押さえないといけないんだが・・・

括弧()はどんなときに使うの?
http://officetanaka.net/excel/vba/beginner/07.htm

もう一つこれ

VBA 関数に引数を渡す
https://www.tipsfound.com/vba/02002

ここの「ByVal と ByRef の違い」の「注意点」ところ
もう一度読んでおかないといけない
これたぶん知らなかったと思う

「これは引数に括弧 () を付けると、強制的に ByVal (値渡し) にする仕様のためです。」

callをつけない場合にバラエティに富んだ動きをするみたい
いままで経験的にcallをつけた方がエラーが起きにくいと思っていたのは
この辺の仕様を理解出来てなかったからだな
0591おれさま ◆6CTEZS59O00a
垢版 |
2019/05/12(日) 09:15:32.83
http://officetanaka.net/excel/vba/statement/Call.htm
myFunctionが引数を受け取り値を返すユーザー定義関数だった場合の書式は、
次のとおりです。

myFunction 123 正常
myFunction(123) エラー
Call myFunction 123 エラー
Call myFunction(123) 正常
rc = myFunction 123 エラー
rc = myFunction(123) 正常
rc = Call myFunction 123 エラー
rc = Call myFunction(123) エラー

こう書いてあるんだけど、2番目のこれ

myFunction(123) エラー

実際にVBEで書くとこんな感じに半角スペースが自動的に挿入されて表示される

myFunction (123)

でもって、エラーなしで通ってしまう
myFunctionの中身次第で通らないこともあるのかもしれないんだけど、解釈としてはこう

myFunction 123 '戻り値を利用しないからカッコをつけないパターン
myFunction(123) '戻り値を利用しないからカッコをつけるとエラー(しかし実際にはこう書くことはできない)
myFunction (123) '戻り値を利用しないからカッコをつけると本来エラーなのだが、半角スペースが自動ではいることで、このカッコは別の意味を持つ。つまりこのカッコはByValを強制するカッコとなる。
0592おれさま ◆6CTEZS59O00a
垢版 |
2019/05/12(日) 15:55:25.36
Win32APIの知識はVBAだけじゃなくて他でもそのうち役に立つかもしれない
と思ってやってるんだけど、それより
C言語が絡んできたのが面白い
まさかVBAやっててC言語の知識を使うとは思わなかった

ある言語から他言語を使うようなパターンは今まで一度もやったことがなかったから
そういう意味でも面白い

固定長のnull埋めされた文字列を定義して渡したあと
戻ってきた文字列からnullを抜いた残りを取り出すとか
0593おれさま ◆6CTEZS59O00a
垢版 |
2019/05/14(火) 13:39:18.82
またVBAのプログラム作ってた
正規表現盛りだくさんやつ
やっぱ正規表現の本買っちゃおうかなぁ
これ使えるわ
0594おれさま ◆6CTEZS59O00a
垢版 |
2019/05/16(木) 07:54:49.59
あーまたVBAにはまってきた
C#と文法がぐちゃぐちゃになって次第にVBA勢に脳内が支配されて・・・・
うがああああああああ

functionの作り方で、配列とかを引数としてfunctionに渡して適切な値を入れてもらう
んで戻り値をbooleanにして成否を伝えるっていう
Win32APIの勉強しててこのパターンがよく出てきたんで真似てみたんだけど悪くない
0595おれさま ◆6CTEZS59O00a
垢版 |
2019/05/18(土) 09:02:34.44
たくさんプログラム作ってると、以前作ったもののメンテナンスしないと
いけない場面によく出くわすんだけど
共通した処理を関数に切り出したり、共通した値を定数として宣言したりするのってほんと大事だ
昔つくったのはこの辺ができてないから、少しいじるだけでも大変
いろんな所に同じものが散らばってるから全部直さないといけない
メンテナンスまでやると大事さがわかってくるなぁ
0596おれさま ◆6CTEZS59O00a
垢版 |
2019/05/20(月) 14:36:34.46
VBAのプログラムを3つ同時に作ってる

一つは昔作ったやつで、これまでは使われてなかった
でも使う事になったんで見直したらいろいろいじりたくなってきた
マジックナンバーが多すぎるし共通部分の洗い出しが全然できてない
これじゃメンテナンスに苦しむのは目に見えてる
今後変更されそうな部分は簡単に取っ替えられるようにしておかないとね
ほんとはもっと大きくいじってもよさそうなんだけどキリがない

10個ぐらいのデータを並べて1セットとして
このセットを1ページに複数行複数列タイルを貼るかのように
並べていくパターン

この処理が3つのシートそれぞれにあって、それぞれ別個のコードを書いてた
セットの中身も違うし、並べるタイルの数も違うんだけど
これを一般化して関数として作り直した

数列の一般項を求めるのがポイント
関数に渡す引数が多いので構造体を使って一気に引き渡すと同時に
構造体によるインテリセンスによって間違いを減らす

これによって、タイルの中身が変更されたときにもすぐに対応できるし
タイルの並べ方が変更されても与える定数を変更することで簡単に対応できる

ちなみにこれまでのコードでは、
タイルを並べるような概念はなくて、項目のひとつひとつを適切な場所に個別に配置していくパターン
セットの並べ方が変ると、10項目ひとつひとつについて修正が必要になっていた
コードの見通しも悪かった
0597おれさま ◆6CTEZS59O00a
垢版 |
2019/05/21(火) 14:34:27.01
オライリーの詳説正規表現買っちまったぜ・・・・正規表現だけで5せんえんとか・・・
0598おれさま ◆6CTEZS59O00a
垢版 |
2019/05/22(水) 12:35:15.08
VBAのコード書いてると
配列は全部要素番号1からの方が処理しやすくて統一してるんだけど
ほかの言語やるとゼロからだし、VBAだってsplitが返す配列はゼロから始まるし
やぱ配列はゼロからに統一したほうがいいのかなって最近考えてる
どの言語やるにしても必ずゼロから始まると意識して気をつけてれば慣れるものかもしれないし
0602おれさま ◆6CTEZS59O00a
垢版 |
2019/05/30(木) 15:31:53.35
今日はいろいろテクを学んだ
配列関連だから今後使えると思う

Rangeで列や行を一括取得したときに作られてしまう二次元配列を
1次元配列にする方法

とか

あとListBoxにアイテム追加するのにAddItem使ってたけど
これ表示がバグることがあるんで、Rangeや配列から一括代入したほうがよさそう
バグらなくなったんでたぶんこうしたほうがいいんだと思った
0603おれさま ◆6CTEZS59O00a
垢版 |
2019/06/01(土) 08:48:18.36
ん〜まだまだ完成しないな
少しずつやっていくしかない
大分進んで、構造的なものも明確になってきたんで
あとは間違いないように組んでいくだけだ
0605Mr.名無しさん
垢版 |
2019/06/04(火) 11:20:36.28
難しいけど上げとくね
0607おれさま ◆6CTEZS59O00a
垢版 |
2019/06/05(水) 16:00:24.08
俺が以前作った使えなさそうなプログラムが知らない所で意外な活躍をしてた
役にたつことはあまりなさそうなものでも
使う人が用途を見つけた途端にとんでもないものに化けるから面白い
がちがちに固めずふんわり系のインフラ的ソフトは特にね
0609おれさま ◆6CTEZS59O00a
垢版 |
2019/06/09(日) 09:20:06.69
ん〜大体これでいいかな
つけた方がいい機能は全部つけた
やっぱ入力フォームは鬼門だなぁ
各コントロールが複雑に入り組んでて制御が大変だ
特にListBoxがらみ

でもこれで大きなバグは潰したと思うから
これ以上でないことを祈るばかり・・・・
0610わがはい ◆0BMoNHqNlM
垢版 |
2019/06/11(火) 04:19:34.88
まだそんなことしてたんか

ワイのwebアプリはMongoDBからAjaxでデータ抽出してクライアントサイドでD3js使って視覚化できるようになったからひとまず完成かな
AdSense貼って月二万弱くらいの収益は得られるようになったで

次はサーバサイドでTensorFlowの処理結果をブラウザでインタラクティブに操作できるアプリ作れないか考えてる
深層学習を一から勉強せんとあかんから完成はだいぶ先やな
0612おれさま ◆6CTEZS59O00a
垢版 |
2019/06/14(金) 09:53:41.47
とりあえず引き渡してきた
まだバグ見つかるかもしれないけど
ほぼ大丈夫だろー
0613おれさま ◆6CTEZS59O00a
垢版 |
2019/06/14(金) 15:37:39.28
こういう風に変えたいなって思った時に
すんなり変える事ができるようになってきた
新機能を追加する場合も昔と比べたらずっと楽

最初から変更に備えたコードを書いているというのもあるし
いろんな技術も身についてきた感もある

VBAに関して言えば、できる限り設定値を外に出して
コード外で変更に対処できるようにもしてるから
小さな変更はかなり楽
0614おれさま ◆6CTEZS59O00a
垢版 |
2019/06/15(土) 13:00:35.00
VBAのDictionaryだけど
とりだすときの順番は先入先出で保証されてるみたいだな
保証されてないとか書いてあるサイトもあったけど
大丈夫みたいだ
0616わがはい ◆0BMoNHqNlM
垢版 |
2019/06/15(土) 23:27:36.95
知らなかったのかよw
dictionaryは連想配列なんだからやり方次第でスタックとしてもキューとしても使えるやろ

プログラミングは自分の頭と手を使って作らないと身につかんで

ワイもオライリーJavascriptの分厚い本読んで模写したりしたが、自分でアプリ開発するまで依存性の注入とかmvcモデルとかイマイチ本質を理解できんかったな
0617おれさま ◆6CTEZS59O00a
垢版 |
2019/06/16(日) 03:12:42.17
最後に一度だけレスしておくけどさ、
順番保証ってのは当然foreachで回した場合の話でしょ
順序の保証の話は基本書ちゃんと読んでいればforeachとのからみで
幾度となく説明されてるはず
Javaなら拡張For文だっけ?
それぐらい感づいて欲しい
まともに勉強していれば分かったはず

当然Stack Queueの話ではない
後入れ後出しとか先入先出の話は
そもそも配列のように順序保証されたList系のコレクションの特徴
仮に連想配列でそういった使い方をするとしてもそれはキーの自由度を犠牲にした上でのことでしょ

連装配列ってのは基本的には順序保証はされていないと考える
もともとKeyを媒介にしてデータをとりだすことを想定したものだから。
C#で言えばDictionaryが連想配列
これに順序保証の機能が追加されたものとしてSortedDictionaryが用意されている
基本的には、「連装配列は順序は保証されていない」と考えるべき
これは、「基本的」学習事項

Javaでも連想配列の基本となるのがHashMapだが、順序保証されていない
HashMapの順序保証のことを説明するのに、StackとかQueueの話は出てくる余地はない

VBAのDictionaryについて順序保証されていないと想定するのはごく自然な流れで
順序保証されていることが特殊であると考えるべき

たぶんな、金目当てに新しいものにどんどん飛びついているから
基本的な部分が抜けちゃってると思うわ
「プログラミングは自分の頭と手を使って作らないと身につかんで」
0619おれさま ◆6CTEZS59O00a
垢版 |
2019/06/16(日) 06:09:35.21
とりあえず組みおえたVBAプログラムだけど
機能の一つを使えるようにするのに障害があるってことで
急きょ代替案を選択することになった
ちゃっちゃと組み直すか
0620わがはい ◆0BMoNHqNlM
垢版 |
2019/06/16(日) 08:48:52.54
順序が保証されるかどうかなんて勉強始めて1か月目で確認することやんw

それを知らなくて今までどんなプログラム書いてきたん?
0621おれさま ◆6CTEZS59O00a
垢版 |
2019/06/16(日) 09:24:12.01
大体こんなもんか

いくつかの関数でListBoxやら他のコントロールを引数として受けとっているんだけど
これってインテリセンスが働かないからイマイチなんだよなぁ
プロパティ覚えりゃいいんだけどキーボード叩くのが面倒

今組んでるのが安定運用されるようになればしばらくはVBAから離れられそう
これまでいくつかのファイルに分離されていたものを統合したもので
処理上の様々なパラメータもシート上に出して利用者が設定できるようにした
いろんな意味で使う人にとっては便利になるんだけど、コードは複雑化する
バグも出やすいので慎重になってる
シビアな場所で使うようなんで間違いがないといいんだが。
0622わがはい ◆0BMoNHqNlM
垢版 |
2019/06/16(日) 09:51:16.17
ちょっとした便利ツールみたいなもんか
JavaやC#学んでるなら何か作って公開してみたら?
あんま個人開発向きの言語やないけど

ワイもJava勉強したが、結局今はサーバサイドじゃphpとpython、クライアントサイドはJavascriptやな
スマホのネイティブアプリも作ろうかと思ったけどPWAの技術使えばwebアプリをネイティブのように扱えるから辞めにした
0623おれさま ◆6CTEZS59O00a
垢版 |
2019/06/17(月) 12:38:35.08
UserForm上のCommandButton.Font.Bold プロパティだけど
一旦Trueにした後、他の処理でFalseにしようとしても戻らない現象がある
まっさらなファイルで試すと問題ない
何が干渉しているのやら。

内部的には細字に戻っているのに表示上Boldのままになってしまっているのかと思いきや
If .Font.Bold = True then
を入れると反応するので、どうやら内部的にもFalseへの設定を受け付けていないようだ
Fontの他の設定を挟んだりいろいろやってみたが受け付けてくれない

これは後々の課題としておいて、この場は違うフォントに変える事で我慢することにした
0625おれさま ◆6CTEZS59O00a
垢版 |
2019/06/21(金) 17:04:37.70
VBA関連は一段落したんだけど
貯まってるお仕事にも取りかからないといけない
なかなかC#に時間を割けない
0626わがはい ◆0BMoNHqNlM
垢版 |
2019/06/22(土) 12:50:44.51
休みないん?
ワイは土日に開発してるが

趣味がプログラミングみたいなもんやし
それで収入も得られるんだからおいしいもんやな
0630わがはい ◆0BMoNHqNlM
垢版 |
2019/07/02(火) 18:12:01.88
あらら、逃げちゃったw
所詮、お遊びでやってただけか
0634おれさま ◆6CTEZS59O00a
垢版 |
2019/07/09(火) 17:33:15.11
ちょい不安定な動きが報告されたんで修正
ListBoxの背景色変更が原因で
勝手にリストのトップにフォーカスが飛んでしまう
発見に手間取ったわ
こんなんエクセルのバグだよなぁ
0641わがはい ◆0BMoNHqNlM
垢版 |
2019/07/28(日) 14:14:46.67
もう報告せんの?
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況