Views: 2
「第78回カンヌ国際映画祭」停電騒ぎのなか閉幕 最高賞はジャファール・パナヒ監督作が受賞 早川千絵監督作は受賞を逃す
フランスで開催されていた「第78回カンヌ国際映画祭」が現地時間24日、閉幕。この日、カンヌ市内で大規模な停電が発生し、映画祭の一部の会場では、作品の上映が一時中断されたが、授賞式は無事開催された。 今回の最高賞パルムドールを受賞したのは、イランの体制批判の作品で知られるジャファール・パナヒ監督の新作『シンプル・アクシデント』。パナヒ監督はこれまで、テヘランでの拘束や20年間の渡航禁止処分を受けながらも創作を続けてきた。本作は釈放後初の作品で、「小さな事故から次々に事件が起こる」という一見シンプルな物語の中で、パナヒ監督は、イランの人々が自由を求めてどのように声を上げ、政権の抑圧に立ち向かうのかを、真っ向から描いた作品。イラン体制への鋭い批判が込められている。
編集部の感想:
カンヌ国際映画祭が停電騒ぎの中で閉幕したとは驚きですね。ジャファール・パナヒ監督の作品が最高賞を受賞したことは、彼の勇気を称賛する意味でも重要です。早川千絵監督が受賞を逃したのは残念ですが、今後の活躍に期待しています。
Views: 3
「土浦亀城邸で女性建築家トーク」6/18開催!
📌 内容
株式会社ピーオーリアルエステートは、東京都指定有形文化財である土浦亀城邸に関するトークイベントを発表しました。このイベントは2023年6月18日に開催されます。場所は東京都の土浦亀城邸で、一般公開が続いており、好評を得ています。代表取締役社長の福田泰博が関与しており、地域の文化遺産を広める取り組みとなっています。
📊 詳細データ
- イベント日:2023年6月18日
- 開催場所:東京都指定有形文化財(土浦亀城邸)
- 料金:無料
- 対象ユーザー:一般市民および文化財に興味のある方
- 主催者:株式会社ピーオーリアルエステート
公式リンク:株式会社ピーオーリアルエステート
💬 編集部コメント:
株式会社ピーオーリアルエステートが行っている土浦亀城邸のトークイベント、すごく興味深いですね!最近、文化財や歴史的建物への関心が高まっている中で、こうした一般公開イベントが好評を得ているのは、とても意義があります。
社会的な視点からの注目点
-
地域コミュニティの活性化
こういったイベントは、地元の人々が文化財に触れる機会を提供し、地域のアイデンティティを再確認する手助けになります。 -
文化財の普及
昔からの建物をただ保存するのではなく、トークイベントで新しい視点から語ることで、広く一般の人に文化財への理解を深められるのがいいですね。 -
文化的交流の促進
多様な参加者が集まることで、文化的な対話が生まれ、異なるバックグラウンドを持つ人々が交流できる場となることも期待できます。 - 観光資源としての活用
こうしたイベントは、観光資源としても重要で、地域経済にプラスの影響を与える可能性があります。
このように、ピーオーリアルエステートの取り組みは、単なる文化財の保全がなく、地域に深く根ざした活動として多方面に寄与している点が魅力的だと思います。今後の展開にも期待大ですね!
※以下、出典元
▶ 元記事を読む
Views: 3
「キタニタツヤ、初冠番組『聞き耳キタニ』6月放送決定!」
📌 内容
キタニタツヤの初の冠番組「聞き耳キタニ」が、テレビ朝日のバラバラバマンスリー枠で放送されることが発表されました。放送開始日は2023年6月4日(水)26時55分で、毎週同じ時間に放送される予定です。番組は、キタニが様々な現場に潜入し、そこでしか聞けない会話に耳を傾ける内容です。キタニタツヤはシンガーソングライターやラジオパーソナリティとして多岐にわたる活動をしているアーティストです。さらに、番組は全4回の連続放送が決まっており、業界最大手企業への潜入も計画されています。
📊 詳細データ
- イベント日:2025年6月4日(水)26時55分放送開始、毎週水曜同時刻放送
- 番組名:「聞き耳キタニ」
- 連携企業:テレビ朝日
- 価格:指定席8,000円(税込)
- ターゲットユーザー:幅広いジャンルの音楽ファンやエンタメ好き
詳細はキタニタツヤ オフィシャルホームページをご覧ください。
💬 編集部コメント:
キタニタツヤの初冠番組「聞き耳キタニ」が6月から始まるという発表は、音楽界の新たな展開として注目されています。番組のコンセプトは「あらゆる現場に潜入してその場でしか聞けない会話に耳を傾ける」というユニークなもので、視聴者にとって新鮮な体験を提供しそうです。
社会的な視点からの注目ポイント
-
新しいメディアの形:
キタニタツヤが音楽だけでなく、テレビ業界に進出することで、アーティストがメディアの枠を超えて多様な活動をする時代を象徴しています。これにより、ファンとの距離が縮まり、多くの人に親しまれる新しいアプローチが期待されます。 -
潜入調査というスタイル:
「潜入」というテーマは、視聴者に好奇心を抱かせ、リアルな会話を通じた新たな発見をもたらす可能性があります。特に業界の裏側を知ることで、観客はより深い理解と興味を持つことができるでしょう。 -
キタニタツヤの成長の新たな章:
彼自身が「この番組をきっかけにもっと売れたい」と語っていることから、単なる音楽活動にとどまらない新しい挑戦の象徴として、一人のアーティストの成長を見せる良い機会になっています。 - 継続的な視聴体験:
4週連続放送が決まっていることも、定期的な見所を提供し、視聴者を引き込む工夫が感じられます。これにより、単発の企画ではなく、長期的なファンの獲得を狙っている点が興味深いです。
このように、「聞き耳キタニ」は、キタニタツヤの新たな一歩を示すだけでなく、音楽界やテレビ業界の新しいトレンドの象徴ともいえるでしょう。ファンや視聴者がどのような反応を示すか、ぜひ注目したいですね!
※以下、出典元
▶ 元記事を読む
Views: 4
「ウマ娘」に「ステイゴールド」登場!夏にメインストーリー続編も!
📌 ニュース:
『ウマ娘』に、ついに「ステイゴールド」が登場!
ファン待望のウマ娘化が実現しました。
さらに、メインストーリーの第2部後編も今夏に実装予定です。
この新展開に期待が高まります!
詳細は公式サイトでお楽しみに。
-
『ウマ娘』に関する重要ポイントを以下のようにまとめました!✨
-
ステイゴールドのウマ娘化🏇
大人気キャラクター「ステイゴールド」が遂にウマ娘として登場します!ファンの期待が高まっていますね。 -
メインストーリー第2部後編の実装🌟
メインストーリーの第2部後編が今夏に実装されることが決定しました。新たなストーリー展開に期待が寄せられています! - 楽しみなイベントが目白押し🎉
ステイゴールドの登場に加え、ストーリー更新で新たなイベントやキャラクターとの出会いが楽しめる予定です。ワクワクが止まりません!
ぜひお楽しみに!😊
-
※以下、出典元
▶ 元記事を読む
Views: 2
「生卵食べ放題!濃厚豚骨ラーメン」
📌 ニュース:
「ラーメン東大」で、徳島ラーメンを楽しんできました。特徴は濃厚な豚骨醤油スープと、多彩なトッピング。生卵とご飯が食べ放題です!
店舗は徳島市大道にあり、券売機はタッチ式で、クレジットカードも使えます。メニューは「東大ラーメン」や「豚スラ肉増し」など、いずれも並か大を選べます。
「豚スラ肉増し」を大盛りで注文。甘口スープと硬めの麺が絶妙に絡み、フレッシュなにんにくが新鮮な味わいを加えています。生卵を絡めると、すき焼き風の風味が楽しめます。
ぜひ、徳島ラーメンを試してみてください!
-
徳島ラーメン「ラーメン東大」の魅力を3つご紹介します!🍜
-
食べ放題のご飯&生卵 🍚🥚
「ラーメン東大」では、ご飯と生卵が食べ放題です!ラーメンのトッピングに加えて、自分好みにアレンジできますよ。 -
濃厚な豚骨醤油スープ 🐖🍲
スープは甘口の醤油豚骨。豚骨の香りは抑えめですが、醤油の味がしっかりと感じられて絶品です! - 豊富なメニューとカスタマイズ 📋✨
メニューは「東大ラーメン」から「こってり豚スラ肉増し」まで多彩。ニンニクやご飯の有無も選べ、自分の好みに合わせられます。
ぜひ一度、味わってみてくださいね!
-
※以下、出典元
▶ 元記事を読む
Views: 2
Elden Ring Nightreign -Nightfarers、Nightfarersの呼びかけに注意してください。
公式 Elden Ring Nightregnのリリーススケジュール これが利用可能になりました:
シャドウは寒い その破滅的な翼からこぼれた死。
https://store.steampowered.com/app/2622380/elden_ring_nightreign/
続きを見る
🧠 編集部の感想:
「Elden Ring Nightreign」のリリースが近づいているとのこと、ファンとして心が高鳴ります。暗い雰囲気や神秘的な要素が前作の魅力を引き続き引き立てそうです。新たな冒険が待ち受けるこの世界に、早く飛び込みたいです。
Views: 2
2025 業務アプリ向け WinForms 入力チェックはデータモデルに任せよう #C#
データアノテーションに連動させて、テキストボックスの入力チェックコードをもう一度書くことをやめる話
注意:本記事での用語
本記事での表現 | 他の呼び方 |
---|---|
データモデル | 業務モデル/モデルクラス |
データアノテーション | モデルに定義されたバリデーション属性(DataAnnotations属性) |
Model.cs
public class 顧客Model
{
// --- 以下の2行がデータアノテーション -----------------------------
[Required(ErrorMessage = "氏名漢字は必須です")]
[MaxLength(10)]
// --------------------------------------------------------------
public string 氏名漢字 { get; set; } = string.Empty;
1.はじめに
WinForms で業務アプリを開発していると毎回やってくる「入力チェック」処理。
せっかくデータモデルに記述したデータアノテーションによる Required(必須)、MaxLength(最大長)、書式チェックなど。
チェック処理をModelとForm側の2カ所に書くのはもうやめませんか?
モデルの要件に連動させたカスタムコントロールでバリデーションを実現しました。
2.やりたいこと
以下のような要件を、カスタムTextBoxコントロール側に実装します:
✅ データチェック要件
1) モデルのデータアノテーションを読み取って自動バリデーション
Model.cs
[Range(0, 999999999999, ErrorMessage = "0〜999999999999 の範囲で入力してください。")]
public decimal 年収 { get; set; }
Form.cs
NVTextBox年収.BindValidationToModelProperty(typeof(顧客Model), nameof(顧客Model.年収));
2) 追加で個別のチェック関数(Validator)も設定できる
データアノテーションには書き切れないチェック処理は、個別に追加可能
Form.cs
VTextBox氏名カナ.InputValidator = s =>
{
foreach (char c in s)
{
if (!((c >= '\u30A0' && c '\u30FF') || c == '\u3000'))
return (false, "全角カタカナまたは全角スペースのみを入力してください。");
}
return (true, string.Empty);
};
✅ 業務アプリで TextBox へ良く求められる要件も併せて実装
1) Enterで次の入力欄へ移動(ビープ音なし)
2) フォーカスを受けたことを強調(外枠が青く太くなる)
3) フォーカスを外すと外枠がグレーに戻る
4) エラーなら外枠が赤くなる(エラープロバイダーの❌マークも自動表示)
5) エラープロバイダー❌をマウスオーバーでエラーメッセージを表示
3.前提条件
- Visual studio 2022 Version 17.14.1
- .Net 9
なお、すべてのソースコードを公開しています。
4.実装ポイント
- バリデーションは「モデルと連携」+「個別Validator」
Model.cs
public class 顧客Model
{
[Required(ErrorMessage = "氏名漢字は必須です")]
[MaxLength(10)]
public string 氏名漢字 { get; set; } = string.Empty;
[Required(ErrorMessage = "氏名カナは必須です")]
[MaxLength(10)]
public string 氏名カナ { get; set; } = string.Empty;
[Required(ErrorMessage = "メールアドレスは必須です")]
[EmailAddress(ErrorMessage = "メールアドレスの形式が正しくありません")]
[MaxLength(100)]
public string メールアドレス { get; set; } = string.Empty;
[Required(ErrorMessage = "生年月日は必須です")]
[Range(typeof(DateTime), "1900-01-01", "2025-12-31", ErrorMessage = "生年月日は1900年~2025年の間で指定してください")]
public DateTime 生年月日 { get; set; }
[Range(0, 999999999999, ErrorMessage = "0〜999999999999 の範囲で入力してください。")]
public decimal 年収 { get; set; }
}
Form側のコードを見ると、ほとんどモデルのアノテーションだけでチェック処理が終わっていることがわかります
Form.cs
private void SetValidators()
{
// 氏名(漢字)
VTextBox氏名漢字.ErrorProvider = this.ErrorProvider;
VTextBox氏名漢字.BindValidationToModelProperty(typeof(顧客Model), nameof(顧客Model.氏名漢字));
// 氏名(カナ)
VTextBox氏名カナ.ErrorProvider = this.ErrorProvider;
VTextBox氏名カナ.BindValidationToModelProperty(typeof(顧客Model), nameof(顧客Model.氏名カナ));
VTextBox氏名カナ.InputValidator = s =>
{
foreach (char c in s)
{
if (!((c >= '\u30A0' && c '\u30FF') || c == '\u3000'))
return (false, "全角カタカナまたは全角スペースのみを入力してください。");
}
return (true, string.Empty);
};
// メールアドレス
VTextBoxメールアドレス.ErrorProvider = this.ErrorProvider;
VTextBoxメールアドレス.BindValidationToModelProperty(typeof(顧客Model), nameof(顧客Model.メールアドレス));
// 生年月日
VDateTimePicker生年月日.ErrorProvider = this.ErrorProvider;
VDateTimePicker生年月日.Format = DateTimePickerFormat.Custom;
VDateTimePicker生年月日.CustomFormat = "yyyy/MM/dd";
VDateTimePicker生年月日.BindValidationToModelProperty(typeof(顧客Model), nameof(顧客Model.生年月日));
// 年収
NVTextBox年収.ErrorProvider = this.ErrorProvider;
NVTextBox年収.BindValidationToModelProperty(typeof(顧客Model), nameof(顧客Model.年収));
NVTextBox年収.NumberFormat = "#,##0";
}
氏名カナの「全角カナチェック」のみ追加実装してます
1) 必須入力チェック
データアノテーションの Required が自動で反映されます。
[Required(ErrorMessage = "氏名漢字は必須です")]
2) 文字列長
データアノテーションの MaxLength が自動で反映されます。
MaxLength を自動的に反映し、指定の文字列長までしか入力できません
3) 値の範囲
[Range(typeof(DateTime), "1900-01-01", "2025-12-31", ErrorMessage = "生年月日は1900年~2025年の間で指定してください")]
5.TextBox以外のコントロール
ついでに、数値用の NumericValidatingTextBox
や
日付用の ValidatingDateTimePicker
も作りました。
1) 数値入力に対応:NumericValidatingTextBox
- 最小値/最大値
- 負の数許可/ゼロ許可
- 小数点以下の桁数制限
- 書式指定(例:”#,##0″)
2) 日付入力に対応:ValidatingDateTimePicker
- DateTimePicker を拡張し、RequiredやRangeをモデルから読み取る
- 枠線制御や Enter移動も統一
※ 全選択は不安定なのでオミット(理由もコード内に記載)
6.最後に
業務アプリの現場で、
2回同じことを書くことで発生する 非同期、メンテナンス漏れを 防ぎたくて
このようなコントロールにしてみました。
「各画面で毎回同じようなバリデーションコードを書く」のをやめて
モデルへ任せる設計にすると、コードも綺麗で再利用性も高まりますよね✨
7.参考
GitHubへソースは全てアップしてますが参考までに。
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Reflection;
namespace CustomTextbox.Contols
{
///
/// 基本仕様:
/// 1.フォーカスを受けたときボーダーラインを強調し青い太枠へ変える
/// 2.フォーカスを失った時にボーダーラインを元に戻す
/// 3.フォーカスを受けたとき、文字が入力されていたら全選択する
/// 4.エンターキーで次のタブインデックスへ遷移する
/// 5.Modelのプロパティのデータアノテーションから、チェック内容を受け取れる。
/// 6.そのテキストボックスの入力値のチェックメソッドを受け取れる。また、文字列の最大長をプロパティに持つ。
/// 7.チェックメソッドや文字列長に違反した場合、フォーカスを失った時にボーダーラインを太い赤色にする
///
public class ValidatingTextBox : TextBox
{
[Category("データ")]
[Description("必須項目はTrueにしてください")]
[DefaultValue(false)]
public bool Required { get; set; } = false;
[Category("外観")]
[Description("外枠の通常色です")]
[DefaultValue(typeof(Color), "Gray")]
public Color 通常色 { get; set; } = Color.Gray;
[Category("外観")]
[Description("フォーカスを受けた時の外枠の色です")]
[DefaultValue(typeof(Color), "DeepSkyBlue")]
public Color フォーカス色 { get; set; } = Color.DeepSkyBlue;
[Category("外観")]
[Description("エラー時の外枠の色です")]
[DefaultValue(typeof(Color), "Red")]
public Color エラー色 { get; set; } = Color.Red;
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public ErrorProvider? ErrorProvider { get; set; }
//バインドするModleのプロパティから自動生成するValidator
private Funcstring, (bool isValid, string errorMessage)>? _modelValidator;
// 個別に追加指定するValidator
private Funcstring, (bool isValid, string errorMessage)>? _customValidator;
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public Funcstring, (bool isValid, string errorMessage)>? InputValidator
{
get => _combinedValidator;
set
{
_customValidator = value;
UpdateCombinedValidator();
}
}
// モデルからのValidatorと、個別追加Validator 2つを合成した最終的なValidator
private Funcstring, (bool isValid, string errorMessage)>? _combinedValidator;
private void UpdateCombinedValidator()
{
_combinedValidator = CombineValidators();
}
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public bool IsValid => _isValid;
internal bool _hasFocus = false;
private bool _isValid = true;
private RequiredAttribute? _requiredAttr;
public ValidatingTextBox()
{
BorderStyle = BorderStyle.FixedSingle;
}
protected override void OnEnter(EventArgs e)
{
_hasFocus = true;
Invalidate();
if (!string.IsNullOrEmpty(Text))
{
// 3.フォーカスを受けたとき、文字が入力されていたら全選択する
SelectAll(); // 全選択
}
base.OnEnter(e);
}
protected override void OnLeave(EventArgs e)
{
_hasFocus = false;
_isValid = ValidateInput();
Invalidate();
base.OnLeave(e);
}
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
// 4.エンターキーで次のタブインデックスへ遷移する
Parent?.SelectNextControl(this, true, true, true, true);
e.Handled = true;
e.SuppressKeyPress = true; // ← ★これでビープ音防止!
}
base.OnKeyDown(e);
}
// フォーカスあり/なし/エラー状態で外枠の色を変える
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
const int WM_PAINT = 0x000F;
if (m.Msg == WM_PAINT)
{
using Graphics g = CreateGraphics();
// 1.フォーカスを受けたときボーダーラインを強調し青い太枠へ変える
Color borderColor = 通常色;
// 2.フォーカスを失った時にボーダーラインを元に戻す
if (_hasFocus)
borderColor = フォーカス色;
// 7.チェックメソッドや文字列長に違反した場合、フォーカスを失った時にボーダーラインを太い赤色にする
else if (!_isValid)
borderColor = エラー色;
using Pen pen = new Pen(borderColor, borderColor != 通常色 ? 2 : 1);
Rectangle rect = new Rectangle(1, 1, this.Width - 3, this.Height - 3);
g.DrawRectangle(pen, rect);
}
}
// 5.Modelのプロパティのデータアノテーションから、チェック内容を受け取れる。
public void BindValidationToModelProperty(Type modelType, string propertyName)
{
var prop = modelType.GetProperty(propertyName);
if (prop == null) return;
// Requiredの有無
_requiredAttr = prop.GetCustomAttributeRequiredAttribute>();
this.Required = _requiredAttr != null;
// 最大長
var maxLengthAttr = prop.GetCustomAttributeMaxLengthAttribute>();
if (maxLengthAttr != null)
{
MaxLength = maxLengthAttr.Length;
}
// その他のValidation
_modelValidator = s =>
{
// 空文字は Validator に流さず、Required で判定
if (string.IsNullOrWhiteSpace(s)) return (true, string.Empty);
// 型変換チェック
var prop = modelType.GetProperty(propertyName);
if (prop == null) return (true, string.Empty);
var targetType = prop.PropertyType;
// TryParse 相当の安全な型変換
object? typedValue;
try
{
typedValue = TypeDescriptor.GetConverter(targetType).ConvertFromString(s);
}
catch (Exception ex)
{
return (false, $"形式が正しくありません: {ex.Message}");
}
var dummyInstance = Activator.CreateInstance(modelType) ??
throw new InvalidOperationException("モデルのインスタンス生成に失敗しました");
var validationContext = new ValidationContext(dummyInstance)
{
MemberName = propertyName
};
var results = new ListValidationResult>();
bool isValid = System.ComponentModel.DataAnnotations.Validator.TryValidateProperty(typedValue, validationContext, results);
if (isValid)
return (true, string.Empty);
else
return (false, results[0].ErrorMessage ?? "無効な入力です");
};
}
// モデルからの属性チェックと個別チェックを組み合わせる
// (両方のチェックを有効にする)
private Funcstring, (bool isValid, string errorMessage)>? CombineValidators()
{
if (_customValidator == null && _modelValidator == null)
return null;
return s =>
{
if (_modelValidator != null)
{
var result = _modelValidator(s);
if (!result.isValid) return result;
}
if (_customValidator != null)
{
var result = _customValidator(s);
if (!result.isValid) return result;
}
return (true, string.Empty);
};
}
// Validation実行
private bool ValidateInput()
{
// 6.そのテキストボックスの入力値のチェックメソッドを受け取れる。また、文字列の最大長をプロパティに持つ。
var errorMessage = string.Empty;
// 検証ロジック
if (Required && string.IsNullOrWhiteSpace(Text))
{
errorMessage = _requiredAttr?.ErrorMessage ?? "必須入力です。";
ErrorProvider?.SetError(this, errorMessage);
return false;
}
if (InputValidator != null)
{
var result = InputValidator(Text);
if (!result.isValid)
{
errorMessage = result.errorMessage;
ErrorProvider?.SetError(this, errorMessage);
return false;
}
}
ErrorProvider?.SetError(this, string.Empty);
return true;
}
}
}
Views: 2
心の声が届かない?「無内言症」の真実とは
📌 ニュース:
無内言症とその影響
私たちは日常的に自分と会話をする「内なる声」を持っています。最近の研究で、人口の5〜10%がこの内なる声を持たない「無内言症」という状態にあることがわかりました。
デンマークの研究では、無内言症の人は語彙記憶能力が低く、タスクの切り替えに独自の方法を取ることが示されています。例えば、言葉でなく視覚的なイメージを重視して説明することが多いです。
この研究は、心の中での言語処理がいかに重要であるかを示しています。内なる声が不足することで、認知行動療法や問題解決プロセスに影響が出る可能性があるため、さらなる研究が期待されています。
-
この記事のポイントをまとめましたので、ぜひご覧ください!✨
-
無内言症とは?
約5〜10%の人が持たない「内なる声」、これが「無内言症」と呼ばれる状態です。🧠 -
記憶力への影響
無内言症の人は、内なる声を持つ人に比べて単語の記憶力が低く、情報を処理する方法が異なることが研究で示されています。📚 - 日常生活や問題解決
内なる声を持たない人々がどのように生活し、問題を解決しているかに関する研究が進行中です。内なる声の有無が行動や感情調整に影響を与える可能性があります。🔍
これらのポイントを踏まえて、内なる声の重要性や、無内言症について理解を深めていただければと思います!
-
※以下、出典元
▶ 元記事を読む
Views: 2