変奏現実

パソコンやMMORPGのことなどを思いつくまま・・・記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

この画面は、簡易表示です

【.Net手抜きの氾濫】スクロールバーの位置や操作の最大値は手抜き仕様

スクロールバーの位置がおかしい?

スクロールバーの位置 = コントロールの大きさ(Width,Height) - スクロールバーの大きさ

で計算していたので

スクロールバーの位置 = コントロールのクライアント領域の大きさ(ClientSize) - スクロールバーの大きさ

に変更した。
本来なら、デスクトップのデザインが変更になったら、クライアント領域の大きさが変わるので、全コントロールに通知しなければいけないのだが、

Windows 32APIで新設されたデスクトップのデザイン通知メッセージが.Netには無い。

ま、気にしなければいらないかな。(大笑
それでも、まだ最大までスクロールしてもバーの大きさの半分ぐらいスライドできない。
ググって見ると、

.NET FrameworkのSystem.Windows.Forms.ScrollBar.Valueプロパティの値はマウス操作ではMaximum-LargeChange+1までしか行かない

という大笑いネタを発見。
その通りにするとピッタリ。
//但し、スクロールバーを操作時の最大値はMaximum-LargeChange+1までなので・・・
sbH.Maximum = this.Image.Size.Width – sbH.Width + (sbH.LargeChange + 1);
なぜ、そうなのかと云えば、
このLargeChangeを丁度良い感じにすると最後まで増やした時に、最大値を超える問題が発生するので安易な補正をかけたとした思えない。
しかも、ドット単位でスクロールをするか画面上のGridのセルコントロールの配置サイズでスクロールするかで、また考え方を変えなくてはいけない。
気持ちよくスクロールするには、
どうすればよいのか色々

考えて使って直して考えて使って直して考えて使って直して

の繰り返し。
しかもそれは画面の内容次第でコロコロ変わる。

iPhoneの気持ちの良さは

『頑固で偏屈な石頭だらけのプレゼンテーション』を一発で通る内容に終始しているから、

使ってみると「さくっと気持ちの良さが伝わる」が・・・

それは副作用でしかなく、本当に使いやすいかどうかは別腹なのだ。

もちろん、「第一印象」は重要なことだが・・・

閑話休題。
確かに鉄板のGUIなんて存在しない。
しかし、MSやスクエニが云うと
『俺ん家には無理!』
と云っているだけでしかないのもまた事実である。(大笑
【修正後のソース】
using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace Custom.Control
{
class ccPictureBox : PictureBox
{
//画像が大きい時に表示する
VScrollBar sbV;
HScrollBar sbH;
float dx = 0;
float dy = 0;
///
/// コンストラクター
///
public ccPictureBox()
{
sbV = new VScrollBar();
sbV.Parent = this;
sbV.Scroll += sbV_Scroll;
sbV.Visible = false;
sbH = new HScrollBar();
sbH.Parent = this;
sbH.Scroll += sbH_Scroll;
sbH.Visible = false;
this.DragDrop += new System.Windows.Forms.DragEventHandler(myDragDrop);
this.DragEnter += new System.Windows.Forms.DragEventHandler(myDragEnter);
ChkScrollBar();
}
///
/// 横スクロール時
///
//////void sbH_Scroll(object sender, ScrollEventArgs e)
{
dx = e.NewValue;
this.Invalidate();
}
///
/// 縦スクロール時
///
//////void sbV_Scroll(object sender, ScrollEventArgs e)
{
dy = e.NewValue;
this.Invalidate();
}
///
/// 描画時
///
///protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
g.TranslateTransform(-dx, -dy);
GraphicsState bk = g.Save();
base.OnPaint(e);
g.Restore(bk);
}
///
///
///
[Bindable(true)]
[Localizable(true)]
public new Image Image
{
get
{
return base.Image;
}
set
{
base.Image = value;
ChkScrollBar();
}
}
///
///
///
[Bindable(true)]
[Localizable(true)]
public new Size Size
{
get
{
return base.Size;
}
set
{
base.Size = value;
ChkScrollBar();
}
}
[DefaultValue(false), Browsable(true), Description(“コントロールが、ユーザがドラッグしたデータを受け入れできるかを示します。”), Category(“動作”)]
public override bool AllowDrop { get; set; }
///
/// ドラッグ処理のイベントハンドラー
///
//////private void myDragEnter(object sender, DragEventArgs e)
{
//ファイルならOKにしておく。
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effect = DragDropEffects.Copy;
}
}
///
/// ドラッグ処理のイベントハンドラー
///
//////private void myDragDrop(object sender, DragEventArgs e)
{
//ファイルなら
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
// ドラッグ中のファイルなどを取得
string[] drags = (string[])e.Data.GetData(DataFormats.FileDrop);
string fileName = null;
foreach (string d in drags)
{
if (!System.IO.File.Exists(d))
{
// ファイル以外であれば読み飛ばす。
continue;
}
fileName = d;
}
if (fileName != null)
{
try
{
this.Image = Image.FromFile(fileName);
}
catch (Exception ex)
{
MessageBox.Show(“【” + fileName + “】” + ex.Message);
}
e.Effect = DragDropEffects.Copy;
ChkScrollBar();
}
}
}
///
/// スクロールバーを表示するかどうかチェックし
/// 表示する際には位置や設定範囲を調整する
///
///
private bool ChkScrollBar()
{
bool rc = false;
if (this.Image != null)
{
bool showV = (this.Height < this.Image.Size.Height);
bool showH = (this.Width < this.Image.Size.Width);
rc = showH | showH;
//
if (showV)
{
sbV.Top = 0;
sbV.Left = this.ClientSize.Width – sbV.Width;
//両方表示する場合、横スクロールバーの高さ分小さくする
sbV.Height = this.ClientSize.Height – (showH ? sbH.Height : 0);
//大雑把な操作はスクロールバーの高さ分
sbV.LargeChange = sbV.Height;
//範囲の補正
//最大値=(画像の高さ)-(縦スクロールバーの高さ)
//但し、スクロールバーを操作時の最大値はMaximum-LargeChange+1までなので・・・
sbV.Maximum = this.Image.Size.Height – sbV.Height + (sbV.LargeChange + 1);
sbV.Visible = true;
}
else
{
sbV.Visible = false;
}
if (showH)
{
sbH.Top = this.ClientSize.Height – sbH.Height;
sbH.Left = 0;
//両方表示する場合、縦スクロールバーの幅分小さくする
sbH.Width = this.ClientSize.Width – (showV ? sbV.Width : 0);
//大雑把な操作はスクロールバーの幅分
sbH.LargeChange = sbH.Width;
//範囲の補正
//最大値=(画像の幅)-(横スクロールバーの幅)
//但し、スクロールバーを操作時の最大値はMaximum-LargeChange+1までなので・・・
sbH.Maximum = this.Image.Size.Width – sbH.Width + (sbH.LargeChange + 1);
//
sbH.Visible = true;
}
else
{
sbH.Visible = false;
}
}
return rc;
}
}
}
// EOF.



【間違った実装方法】 Windows Form(C#)のPictureBoxのカスタムコントロールにスクロールバーを付ける

ググってみると、
1.ユーザ・コントロールを作る。
2.中にPanelを追加する。
3.PanelはAutoScroll = true にする。
4.Panelの中にPictureBoxを置く。
と云う方法ばかり。
この方法の大きな利点は、Panelのプロパティやイベントをほぼそのまま継承し、都合の悪い場所だけoverrideしてるだけで手間がかからないこと。
※あえて言えば、Panelで未実装なのはドラッグ&ドロップと印刷ぐらいしかない。
この方法の大きな欠点は、PictureBoxのプロパティやイベントを泣きながら全部追加しなければいけなことだが、幸いなことにPictureBoxはしょぼいので、全くその心配は無い。
 
と云う訳で誰もやってそうもないので、ごく普通にPictureBoxのカスタムコントロールにスクロールバーを付けてみた。
この方法の大きな利点は、PictureBoxのプロパティやイベントをほぼそのまま継承し、都合の悪い場所だけoverrideしてるので、手間がかからないこと。
この方法の大きな欠点は、Panelのプロパティやイベントを泣きながら全部追加しなければいけなことだが、本当に困ったことにPanelは優秀で色々やってくれてるので非常にヤバイ!
※未実装は多数あります。
下記のカスタムコントロールをフォームに貼り、Anchor に Bottom, Right を追加するだけでも、未実装の場所はすぐバレる。
いや、フォームのデザイナー上でccPictireBox1のサイズを変えるだけでも判るくらいだ。(大笑
とは云え、どっちが楽なのかは、使い方次第。
 
一番大切なことはImageメソッドしか独自の機能が無いも同然のPictureBoxだからこそPanelを使う方が正解なのであって、何でもかんでも、スクロールバーを付けるならPanelという訳にはいかないことだ。
例えば、半端なく大量にメソッドやイベントがワンサカとありそうなSpreadSheetコントロールみたいなものでは、

  1. 大量にメソッドやイベントのプロパティやイベントを渡すだけのコードを泣きながらドンドン追加してしなければいけない。
  2. SpreadSheetコントロールのスクロールバーらしい動き(Excelっぽい動き)を誰もが期待するので、Panelのまんまの実装では誰(自分さえ)も納得しないから、ガリガリ書かないといけない。

ということになる。もちろんユーザコントロールにSpreadSheetメソッドを追加するだけで機能的なカスタムは可能だか、プロパティ・ウインドウで、色々いじることができないので、結局使う時に大変な目に遭ってしまう。
どれくらい大変なことになるかは、そんなSpreadSheetを貼り、色々設定した後のフォームのFormXXXX.Designer.csファイルを見れば、多分大量のコードとご対面するだろう。

※FormXXXX.Designer.csファイルにはこんな手書き厳禁の札がかかっている。
/// <summary>
/// デザイナー サポートに必要なメソッドです。このメソッドの内容を
/// コード エディターで変更しないでください。
/// </summary>
private void InitializeComponent()
{

そんな心配をすることは滅多にないだろう、第一そんなものを手掛ける優秀な方々が、ググって実装方法を検討なーんてする訳もないよね。(笑
だから、ここを見てしまった貴方。
素直に、ユーザ・コントロールにして、PanelコントロールにPictureBoxを載せた方が無難ですよ。
次回は、【正しい実装方法】 Windows Form(C#)のPictureBoxのカスタムコントロールに楽にスクロールバーを付ける
というのを書いてみたいな。
【参考にしてはいけない未完成のPictureBoxのスクロールバー付きカスタム・コントロールのソース】

using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;
namespace Custom.Control
{
 class ccPictureBox : PictureBox {
  //画像が大きい時に表示する
  VScrollBar sbV;
  HScrollBar sbH;
  float dx=0;
  float dy=0;
  /// <summary>
  /// コンストラクター
  /// </summary>
  public ccPictureBox() {
   sbV = new VScrollBar();
   sbV.Parent = this;
   sbV.Scroll += sbV_Scroll;
   sbV.Visible = false;
   sbH = new HScrollBar();
   sbH.Parent = this;
   sbH.Scroll += sbH_Scroll;
   sbH.Visible = false;
   this.DragDrop += new System.Windows.Forms.DragEventHandler(myDragDrop);
   this.DragEnter += new System.Windows.Forms.DragEventHandler(myDragEnter);
   ChkScrollBar();
  }
  /// <summary>
  /// 横スクロール時
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  void sbH_Scroll(object sender, ScrollEventArgs e) {
   dx = e.NewValue;
   this.Invalidate();
  }
  /// <summary>
  /// 縦スクロール時
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  void sbV_Scroll(object sender, ScrollEventArgs e) {
   dy = e.NewValue;
   this.Invalidate();
  }
  /// <summary>
  /// 描画時
  /// </summary>
  /// <param name="e"></param>
  protected override void OnPaint(PaintEventArgs e) {
   Graphics g = e.Graphics;
   g.TranslateTransform(-dx, -dy);
   GraphicsState bk = g.Save();
   base.OnPaint(e);
   g.Restore(bk);
  }
  /// <summary>
  ///
  /// </summary>
[Bindable(true)]
[Localizable(true)]
  public new Image Image {
   get {
    return base.Image;
   }
   set {
    base.Image = value;
    ChkScrollBar();
   }
  }
  /// <summary>
  ///
  /// </summary>
[Bindable(true)]
[Localizable(true)]
  public new Size Size {
   get {
    return base.Size;
   }
   set {
    base.Size = value;
    ChkScrollBar();
   }
  }
[DefaultValue(false), Browsable(true), Description("コントロールが、ユーザがドラッグしたデータを受け入れできるかを示します。"), Category("動作")]
  public override bool AllowDrop { get; set; }
  /// <summary>
  /// ドラッグ処理のイベントハンドラー
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void myDragEnter(object sender, DragEventArgs e) {
   //ファイルならOKにしておく。
   if (e.Data.GetDataPresent(DataFormats.FileDrop)) {
    e.Effect = DragDropEffects.Copy;
   }
  }
  /// <summary>
  /// ドラッグ処理のイベントハンドラー
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void myDragDrop(object sender, DragEventArgs e) {
   //ファイルなら
   if (e.Data.GetDataPresent(DataFormats.FileDrop)) {
    // ドラッグ中のファイルなどを取得
    string[] drags = (string[])e.Data.GetData(DataFormats.FileDrop);
    string fileName = null;
    foreach (string d in drags) {
     if (!System.IO.File.Exists(d)) {
      // ファイル以外であれば読み飛ばす。
      continue;
     }
     fileName = d;
    }
    if (fileName != null) {
     try {
      this.Image = Image.FromFile(fileName);
     } catch(Exception ex) {
      MessageBox.Show("【" + fileName + "】" + ex.Message);
     }
     e.Effect = DragDropEffects.Copy;
     ChkScrollBar();
    }
   }
  }
  /// <summary>
  /// スクロールバーを表示するかどうかチェックする
  /// </summary>
  /// <returns></returns>
  private bool ChkScrollBar() {
   bool rc=false;
   if (this.Image != null) {
    bool showV = (this.Height < this.Image.Size.Height);
    bool showH = (this.Width < this.Image.Size.Width);
    rc = showH | showH;
    //
    if (showV) {
     sbV.Top = 0;
     sbV.Left = this.Width - sbV.Width;
     sbV.Height = this.Height;
     //両方表示
     if (showH) {
      sbV.Height = this.Height - sbH.Height;
     }
     //
     sbV.Visible = true;
    } else {
     sbV.Visible = false;
    }
    if (showH) {
     sbH.Top = this.Height - sbH.Height;
     sbH.Left = 0;
     sbH.Width = this.Width;
     //両方表示
     if (showV) {
      sbH.Width = this.Width - sbV.Width;
     }
     //
     sbH.Visible = true;
     } else {
      sbH.Visible = false;
     }
    }
   return rc;
  }
 }
}
/// EOF.


一々めんどくさいのでカスタムコントロールに埋めておく

PictureBoxに画像をドラッグして貼り付けるには
デザイナーのプロパティウインドウでAllowDrag に true を設定し、DragDropとDragEnterのイベントハンドラをフォームごとに書くことになるけど、
いっぱい画面があると、毎回コピペするのも面倒。
Form.Designer.csを見てみると、

this.ccPictureBox1.AllowDrop = true;
this.ccPictureBox1.Image = ((System.Drawing.Image)(resources.GetObject(“ccPictureBox1.Image”)));
this.ccPictureBox1.Location = new System.Drawing.Point(96, 58);
this.ccPictureBox1.Name = “ccPictureBox1”;
this.ccPictureBox1.Size = new System.Drawing.Size(263, 200);
this.ccPictureBox1.TabIndex = 0;
this.ccPictureBox1.TabStop = false;
this.ccPictureBox1.Click += new System.EventHandler(this.ccPictureBox1_Click);
this.ccPictureBox1.DragDrop += new System.Windows.Forms.DragEventHandler(this.ccPictureBox1_DragDrop);
this.ccPictureBox1.DragEnter += new System.Windows.Forms.DragEventHandler(this.ccPictureBox1_DragEnter);

※ccPictureBox1は、前に作ったカスタムコントロール。

と、やっているだけだったので、コピペするだけのイベントハンドラならカスタムコントロールに埋めれてしまえばいい。
どうせAllowDrop = false になっていれば処理されることもない。

using System.ComponentModel;
using System.Windows.Forms;

namespace Custom.Control
{
class ccPictureBox : PictureBox
{
/// <summary>
/// コンストラクター
/// </summary>

public ccPictureBox()
{
this.DragDrop += new System.Windows.Forms.DragEventHandler(myDragDrop);
this.DragEnter += new System.Windows.Forms.DragEventHandler(myDragEnter);
}

[DefaultValue(false), Browsable(true), Description(“コントロールが、ユーザがドラッグしたデータを受け入れできるかを示します。”), Category(“動作”)]

public override bool AllowDrop { get; set; }

/// <summary>
/// ドラッグ処理のイベントハンドラー
/// </summary>
/// <param name=”sender”></param>
/// <param name=”e”></param>

private void myDragEnter(object sender, DragEventArgs e)
{
//ファイルならOKにしておく。
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effect = DragDropEffects.Copy;
}
}

/// <summary>
/// ドラッグ処理のイベントハンドラー
/// </summary>
/// <param name=”sender”></param>
/// <param name=”e”></param>

private void myDragDrop(object sender, DragEventArgs e)
{
//ファイルなら
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
// ドラッグ中のファイルなどを取得
string[] drags = (string[])e.Data.GetData(DataFormats.FileDrop);

string fileName = null;
foreach (string d in drags)
{
if (!System.IO.File.Exists(d))
{
// ファイル以外であれば読み飛ばす。
continue;
}
fileName = d;
}
if (fileName != null)
{
this.ImageLocation = fileName;
e.Effect = DragDropEffects.Copy;
}
}
}
}
}

※DragDrop、DragEnterがevent型で、いくつもイベントハンドラを登録できるコレクションクラスなのでそのままoverrideできないのでイベントハンドラはmyDragDrop、myDragEnterとしている。

※複数ファイルをドラッグすると最後のファイルが貼り付く。



ペンチ用のメモリ

Pentium G3258のメモリは他のPCのモノだったのでUMAX DDR3-1333の4GBセット(2GB×2)を購入。
UEFI(BIOS)ではなぜかDDR3-1600と判定されるが、Pentium G3258が扱えるのはDDR3-1333までなので、
起動してみればCPU-ZではDDRのクロックは667MHzと表示。
FFXIVベンチ(キャラメイク編)をやってみると、Now Loading…が長い。
途中でメモリが足りなくなり中座。
仮想記憶を0GBから自動に切り替え再起動。
※FFXIVやるなら標準品質でも8GBあった方が良さそうだ。しかし最高品質にすれば8GBでも遅い、後は積める積むしかないね。
再チャレンジするもNow Loading…は長い。
しかし、最後まで到達。
標準品質(1920×1080)スコアは2,228で判定は普通。
コメント:標準的な動作が見込めます。
しかしプレイするのはちょっと厳しそう。
ベンチの画面を最小化し、メモリ使用量やCPUの温度を見て戻すとスコアが14,904と馬鹿みたいに跳ね上がっていたのはご愛嬌。
メモリ使用量は3GB、しかし仮想記憶をONにしてあるので、カクカク。音もたまに途切れる。
CPU温度はコアが60度を超え、システムやCPU付近は40度。
 
ASRockのA-TuningのOC TweakerではDRAM周波数は1600.00MHzなので
Auto Tuningをしてみた。
注意書きを読むと
Kシリーズ専用。開始するとそのうち再起動するハズ(アニバーサリーペンティウムを含む。
と書いてある。
3.4GHz⇒3.7GHz⇒3.9GHz⇒4.1GHz⇒4.3GHzで妥協されてしまった。
Pキーを押しながら起動しても上限は4.2GHz。
結局、UEFIで最適化されたOC設定の4.5GHz(赤文字)を選択し元に戻す。



【今更だけど】WPFでLostFocusのなかでFocusでフォーカスを戻すとループする

XXXX_LostFocus(object sender, System.EventArgs e)
{
if(XXXX.Text == “”)
{
MessageBox.Show(“未入力エラー”);
//フォーカスを戻し、再入力を促す。
XXXX.Focus();
return ;
}
}
とやると、メッセージボックスが消えた後にまた同じメッセージボックスが・・・メッセージボックスが・・・メッセージボックス・・・
となる。
//フォーカスを戻し、再入力を促す。
XXXX.Focus();
の代りに
//処理済とし、以後のイベントのルーティングが起きないようにする。
//⇒結果的にLostFocus()の次のGotFocus()の処理がされず、
//LostFocus()をキャンセルしたのと似たような効果を得られる。
e.Handled = true;
ハズだったけど、ダメだった
例えばボタンを押したのなら、ボタンの処理にも似たようなコード(e.Handled = true;)を入れないとダメだった。
こっちはちゃんとうまく処理してくれるので、そっちに任せた方がいいかもしれない。
ただキーボード操作でLostFocusした場合には
PreviewLostKeyboardFocusイベントで、KeyboardFocusChangedEventArgs e に対して同様な処理を入れるとうまく動くらしい。
もっともLostFocusは低レベルなイベントなので使わないようにってどこかに書いてあった気がする。



【今更だけど】.Net4.5のPictureBoxのプロパティ・ウインドウにAllowDropが無い

WPFではDrop=Trueで何でもDrag & Drop  OK。
※と云うか、WPFはいつもそんな感じの大雑把な作りなので、実用的な実装をしようとすると、ひどい目に遭う。
でもWindows Formでも同様にControl.AllowDrop = Trueにすれば良いんだけど、

なぜかPictureBoxだけプロパティ・ウインドウにAllowDropが無い。

IntelliSenseでもプロパティの候補にあがらない。
なので、
C#のソースに、
picturebox.AllowDrop = true;
と書いて実行してみると
DragEnterに処理が渡ってくるし、e.Effect = DragDropEffects.Copyとか設定しておけば、ちゃんと、DrapDropまでやってくるからOKなのかといえば、
このAllowDropの部分を選択してメニューから「次候補」を選択してもプロパティのドロップダウンリストが出ない。
そう内部でエラーが連発している気がする。
この状況を続けるとVS内部のストレスが溜まって、終いには暴走しそうな気配がする。
 
ま、原因はよく判らないけど、
どこかの国の誰かさんが
何かの都合で、PictureBox のAllowDropをオーバーライトした際に
public class PictureBox
{
・・・
[Browsable(false)]
public overwrite bool AllowDrop { get ; set ; }
・・・
}
とやらかしたらしい。
 
ただ、
PictureBoxのAllowDropを見えなくして、
どこかの会社の(ボクみたいな)そそっかしい奴に、どこかの会社の高価なユーザコントロールを購入させようともくろんでいたのかもしれない。
と思う方が一般的かもしれない。
 
対策としては、不都合を解消するためのカスタム・コントロールを作り、

using System.ComponentModel;
using System.Windows.Forms;

namespace Custom.Control
{
class ccPictureBox : PictureBox
{
[Browsable(true)]
public override bool AllowDrop { get ; set ; }
}
}

※オーバーライドするので他の属性が気になるならデザイナーのボタンのプロパティウインドウの内容を見ながら、 [DefaultValue(false), Browsable(true), Description(“コントロールが、ユーザがドラッグしたデータを受け入れできるかを示します。”), Category(“動作”)] と書いてもいいだろう、でも結果は同じだ。
ツールボックスに追加された、ccPictureBox をフォームに貼り付ければOK。
ただし、IntelliSenseのため作り直したVS2013のパーザー(文法解析)ルーチンは、あからさまに正しくないコードに対して脆弱性が高く、すでにccPictureBoxの名前でコントロールを作っているところにこのソースを追加すると、エラーが出っぱなしになりパーサーがパニックになってしまう。こうなると、クラス名を訂正してもダメ、ファイルを全部保存しVS再起動しないといけない。
ちゃんとしたソースなら問題ないけど、妙なソースだと、上記の様に素直に妙な動きをするので、その点からも IntelliSenseの「次候補」が出ない状態にしておくのは、やっぱり怖い。(大笑
本当にきれいに直したいなら、IntelliSenseの内容はSQL Server-Expressの中に書き込まれているそうなので、
TextBoxのAllowDropのデータを基にPictureBoxのAllowDropデータを作り、入れてしまえば良いのだろうけどね。
ただ、パッチが来たら、綺麗に戻ってしまいそうなので、やる気が起きない。(大笑
 
もしかすると、[Description(“延々と長い・・・・・・・・長い説明”)]で、
OverLength Errorが起きてRollBack!
PictureBox.AllowDrop丸ごとINSERT失敗
なんてオチかもしれないなぁ・・・



危機一髪

このブログをはじめてから最大の危機を迎えました。
 
DiCEのログを見ると
★ 6/29 19:47 にssiscirineが実行されました。
IPアドレスを更新しました
そう 6/29、までは毎日1回自動更新しており、
○ 7/16 3:09 IPアドレスが変わりました ***.***.***.*** -> ***.***.***.***
で止まっていました。
 
そしてDiCEの画面には何も設定がありません。
6/30にDiCEに何かが起こったようです。
 
設定しなおしてみると、
▲ 7/21 10:48 にssiscirineの実行に失敗しました
お約束ですね。
パスワードを忘れてました。
 
そしてDDNSの設定を書いたファイルが見つかりません。
そう書いてなかったのです。
 
んーDDNSの管理人にメールしようかなとも思いましたが、
そんなメールは毎日いっぱい届いているような気がする。
ボクだったらそんなメールを見るだろうか?
絶対に見ない。(確信
。。。
あーでもない、こーでもない。
。。。
★ 7/21 11:41 にssiscirineの更新が実行されました。
やっとのことで思い出し、困難を乗り越えることができました。
。。。
疲れた。
。。。
もし、思い出せなかったら、どうしよう?
それはそれで
フェードアウトできたんだから
いいじゃないか?(笑



Pentium G3258はショッパかった

4.2GHzでSSDを認識できないので、足回りが付いてこないらしい。
4.0GhzはOK。待機状態ならCPU温度は39°で安定してるから、コアはまだ余裕なんだろう。
空冷のデカイのを付けても効果は期待できそうもない。
何か忘れてるのかな。
UEFIでオーバークロック用のデフォルト設定のリストから4.5GHzを選択したらあっさり動いた。
いったい?



スケールダウンの目途が立たない半導体集積回路

一つの技術にこだわると、やがて奥がものすごく深くなっていく。
半導体の集積回路を作るには、光学レジスト材を塗布し、パターン焼き付けと現像を経て、レジスト材が消えた部分に酸性物質を浸透させ表面に刻みを付け(エッチング)、さらに様々な物質を重ねては刻んでいく。
光学式にパターンを焼き付ける方法は、広い面積でも一度の照射で済むし照射時間も一定で回路の規模や複雑さに照射時間は左右されることもないため、色々な集積回路を量産するにはピッタりだった。
しかし、集積度が上がると、色々問題が出てきた。

1.単純に集積度をあげると、絶縁体の厚さが足りず、リーク電流が増大する。

2.パターンによって焼き付けた跡にユガミやボケが目立つようになった。

3.小さいなゴミですら巨大な隕石サイズになってきた。

4.回路同士の電荷が干渉し始めた。

絶縁体の材質を変えたり、歪み補正したパターンを使ったり、24時間掃除機をかけっぱなし(クリーンルーム自体が巨大なパック式掃除機である)にしたり・・・と、限界を超えようと力任せに色々やっているようだ。
何でも度を超せば、最初のメリットなんか吹き飛んでしまう。それが今の現状だ。
では、限界が見えてきたらどうするのか?
チップを縦に積層してみる。HBMでやってみたら結構大変だったし単価もバカにならない。
なので何度も何度もエッチングしてもズレにくいパターンを考えました!現状の10倍も100倍もエッチングの回数を増やしてみたいと思います。と、やってみせたがSAMSUNGのV-NANDだ。今の調子ならワンチップで1T-bit(128GB)も作れそうだと云う。
縦に長い棒状のチャネル(電極)の周囲に輪状のゲートを縦にいくつも積み重ねる方法だ。5円玉の穴に金属棒を通した構造。
これなら

1.チャネル(電極)を1階層分作る。

2.チャネルの材質と親和性の高いゲート材料を塗布すると、チャネルに集約する。

3.ゲート材料と親和性の高い絶縁材を塗布、均一に広がる。※この時にチャネルの天辺は露出しているハズ。

を何度も繰り返すとできそうだが、

4.絶縁材料と親和性が低いチャネル(電極)を1階層分 増築する。

2周目以降では下のチャネルの真上にチャネルを重ねることがとても大変そうだが、いい感じの材料の選別ができたら、最初の最初のチャネル(電極)を1階層分作る段階の精度で何階層まで重ねられるかが決まるだろう。
USBメモリの様に中規模で低速でも良いから安価な方がいい場合にはゲート同士がくっ付いて1枚になったゲート層となり絶縁層と一緒にロール巻きしたものをロールケーキの様に裁断し、さらに縦にカットケーキの様に切り出し、最後にレーザーであけた穴にアルミニウムを圧入しコントーラーの上に盛って完成になるかもしれない。これでは、もはや電子回路とは思えないしろものだ。
※しかし、すでに誰かが特許を出願中な気がする。
やはり電気伝導率の高いアルミや銅などでちゃんとつないだ方がいいだろう。




top