パソコン・インターネット

2014年5月20日 (火)

ボタン押したときに目的の位置までスクロールさせたい

なんかの一覧で、ボタン押すとそれに対応したセクションが表示されるんだけど、いちいちぶつ切りではなくて1ページ内でスクロールすれば別ボタンに対応している章も見られるようにしたいという場合。




単純なHTMLなら <A NAME="hoge"> の <A HREF="#hoge"> でやるんですけど、あ、古い、そうですか、僕はHTML 3.2あたりで育っててCSS嫌いな人間なもので、なんですか、id属性使えば<A>タグ以外でも自由自在に飛べるってことですか。じゃあまぁ <div ID="hoge"> とかでも。

で、 ASP.NET の C# でもって .NET Framework 上のWebアプリを作っていて、 GridView とか DataList とか使ってるんだけどその中のどっかへスクロールしたい、という話。




JavaScriptでやります。

とは言ってもC#から、HTMLにJavaScriptを出力するメソッド Page.ClientScript.RegisterStartupScript() を使って、こんな感じ。





System.Text.StringBuilder script = new System.Text.StringBuilder();
script.Append("<script language=\"javascript\">");
script.Append("window.attachEvent('onload',ScrollDiv);");
script.Append("function ScrollDiv(){");
script.Append(" var elemMasterDiv=document.getElementById('");
script.Append(this.div1.ClientID);
script.Append("');");
script.Append(" var elemTarget=document.getElementById('");
script.Append(this.DataList1.Items[10].FindControl("label1").ClientID);
script.Append("');");
script.Append(" elemMasterDiv.scrollTop = elemTarget.getBoundingClientRect().top - elemMasterDiv.getBoundingClientRect().top;");
script.Append("};");
script.Append("</script>");
this.ClientScript.RegisterStartupScript(this.GetType(), "ScrollDiv", script.ToString());



.aspxの方は例えばこんな。





<div id="div1" runat="server" style="overflow:auto; height:100px">
    <asp:DataList ID="DataList1" runat="server">
        <ItemTemplate>
            <asp:Label id="label1" runat="server" Text='<%# Eval("COL1") %>'></asp:Label>
        </ItemTemplate>
    </asp:DataList>
</div>



.aspx.cs の方でとりあえず初期表示します。





protected void Page_Load(object sender, EventArgs e)
{
DataTable inDt = new DataTable();
inDt.Columns.Add("COL1");
for (int i = 0; i < 90; i++)
{
inDt.Rows.Add(inDt.NewRow());
inDt.Rows[inDt.Rows.Count - 1]["COL1"] = i.ToString();
}
this.DataList1.DataSource = inDt;
this.DataList1.DataBind();
}



んでなんかのボタンのイベントハンドラに上記一連の RegisterStartupScript() を書いておけば、それを押した時点でこの例だと DataList の10行目へ飛びます。

this.DataList1.Items[10] って指定してるから。




要点は elemMasterDiv.scrollTop = elemTarget.getBoundingClientRect().top - elemMasterDiv.getBoundingClientRect().top; でしょうね。

getBoundingClientRect().top だとページ全体に対しての自分の絶対位置が返ってくるっぽいのに対し、<div>では自分の中でのスクロール量がほしいので、目的コントロールの getBoundingClientRect().top から<div>の getBoundingClientRect().top を引いてます。

あとは getElementById() に渡すIDを ClientID プロパティで取ってきてるくらいかなー。目的に合わせるにはそこの取得方法工夫してくださいね。




これdivタグでスクロールさせる場合の話なんで、ウインドウ全体をスクロールさせたい場合は、まぁなんか調べてやってください。






ブラウザのことはよく考えてません。手元の環境でうまくいったのでそれ書いてるだけです。IE8。

会社内のものだから統一された環境と考えていいのだ。

あー子会社も含むから本当に大丈夫かどうかは、どうかな。






2015/05/25に書きました。

2014年4月18日 (金)

ココログでソースコードを見やすくする

SyntaxHighlighter を入れたりました。


プログラムのソースコードを見やすくするやつです。
ココログは使いにくいなー書いてもパッとしないし、と思ってたけどこういうのやるだけでモチベぐっとあがりますね。
一時的にですけど。


ここ http://trivia.cocolog-nifty.com/blog/2013/04/post-0fcc.html に従って。


簡単に書くと、SyntaxHighlighter を落としてきて http://alexgorbatchev.com/SyntaxHighlighter/ 解凍します。ココログの「コントロールパネル」の「ファイル」で、適当にフォルダ作って、そこにJavaScriptとCSSを全部アップロードします。で「ブログ」の「設定」で、「ブログのサブタイトル」に使うJavaScriptとCSSを書いておく。

ブログのサブタイトル
<script src="http://自分のサイトのアドレス-nifty.com/作ったフォルダ/shCore.js" type="text/javascript"></script>
<script src="http://自分のサイトのアドレス-nifty.com/作ったフォルダ/shBrushAS3.js" type="text/javascript"></script>
<script src="http://自分のサイトのアドレス-nifty.com/作ったフォルダ/shBrushCpp.js" type="text/javascript"></script>
<script src="http://自分のサイトのアドレス-nifty.com/作ったフォルダ/shBrushCss.js" type="text/javascript"></script>
<script src="http://自分のサイトのアドレス-nifty.com/作ったフォルダ/shBrushCSharp.js" type="text/javascript"></script>
<script src="http://自分のサイトのアドレス-nifty.com/作ったフォルダ/shBrushJScript.js" type="text/javascript"></script>
<script src="http://自分のサイトのアドレス-nifty.com/作ったフォルダ/shBrushPlain.js" type="text/javascript"></script>
<script src="http://自分のサイトのアドレス-nifty.com/作ったフォルダ/shBrushXml.js" type="text/javascript"></script>
<link href="http://自分のサイトのアドレス-nifty.com/作ったフォルダ/shCore.css" rel="stylesheet" type="text/css" />
<link href="http://自分のサイトのアドレス-nifty.com/作ったフォルダ/shThemeDefault.css" rel="stylesheet" type="text/css" />
<script type="text/javascript">
SyntaxHighlighter.config.stripBrs = true;
SyntaxHighlighter.all();
</script>

なお、上記だと今時点で配布されているすべてが載っているわけではないので注意を。具体的に言うと上記別サイトのをコピって入れて、僕はC#が多いのでパッと書いてみたらエラーダイアログばっか出やがりまして。
上記のは減らし済みです、PerlやPythonは僕はきっと使わない。自分が使うものだけ書いておけばいいのではないかと思います。


書くときはpreタグの class に、こんな感じに指定する。

<pre class="brush: c#;">
C#のソースコード
</pre>

たとえばC#の場合、c#、csharp、c-sharp の3つの書き方ができるようなので、ちらっとでもジャバスクリプトのソース見ておくといいですよ。

2014年4月17日 (木)

ある文字列のうち、nバイト以内に収まるのは何文字か

英字かな交じりの文字列が100字くらいあるんだけど、30バイト以内ずつに分けたい、とかいう場合。文字数で切るのではなく。データベースに書き込むような時とかさ、カラムサイズに合わせて分割しないといけないときあるじゃん。


「abcあいうdefえおか」
って文字列があって5バイトずつだ、とか。


文字コードによっても変わるし。
シフトJISの場合は "abcあ"、"いうd"、"efえ"、"おか" になりますよね。
UTF-8なら約日本語3バイトだと思ってるんで "abc"、"あ"、"い"、"うde"、"fえ"、"お"、"か" ですかね。


「abあいcdうえefおか」を5バイトずつだと
Shift-JISは "abあ"、"いcd"、"うえe"、"fおか" 、
UTF8だと "abあ"、"いcd"、"う"、"えef"、"お"、"か" 。


つーことで、「nバイトに収まるのはm文字だ」というのを求めたい。
.NET Framework 3.5、C#。
ちなみに今の問題では UTF-8 な Oracle DBに入れたいので、その辺をターゲットに。


「この文字列はnバイトだ」というのは Encoding クラスの GetByteCount() が使えますよね。
UTF-8 とかなら static なメンバがあるそうなので

Encoding utf8Enc = Encoding.UTF8;
int byteCount = utf8Enc.GetByteCount("文字列");

いろんな文字コードに対応できるように作りたいなら、

Encoding.GetEncoding("UTF8");

を使って "UTF8" の部分書き換えてって感じですかね。


さて、もちろんいろいろと可変なので、文字列の長さを変えながら、nバイト以上にならないかどうかとかで調べていきます。
でも単純に、頭から順番に一文字ずつ増やして、納まるかオーバーするか見ていくと、各種短いものだったらいいんですが、例えば10万文字を8万バイトでとかいう場合にかなり時間を食うと思われる。


ので、二分探索をします。バイナリサーチ or バイナリーサーチ。
今回やるのは二分探索って名前じゃないかもしれないけど、なんかそれっぽい感じの動きの。二分法?一緒か。 http://ja.wikipedia.org/wiki/%E4%BA%8C%E5%88%86%E6%B3%95
しかしきちっとした二分探索も面倒くさいなーと思ったんで、てきとーにやります。
でもそれだけだとやっぱまずいので、目星をつけた後で補正します。

/// <summary>
/// 指定バイト以下になる文字数を返す
/// </summary>
/// <param name="strOrg">調査対象文字列</param>
/// <param name="start">何文字目から開始か(0始まり)</param>
/// <param name="getbyte">制限したいバイト数</param>
/// <returns>getbyteより少なくなる文字数</returns>
protected int GetByteCount(string strOrg, int start, int getbyte)
{
    //--収まるなら全文字数でOKと返す
    Encoding utf8Enc = Encoding.UTF8;
    int orgByte = utf8Enc.GetByteCount(strOrg.Substring(start));
    if (getbyte >= orgByte)
    {
        return strOrg.Substring(start).Length;
    }
 
    #region 適当な二分探索
    int y = (strOrg.Length - start) / 2;    //--着目点
    int delta = y / 2;    //--着目点の変化量
 
    while (delta > 0)    //--1以上の間ループ
    {
        if (getbyte > utf8Enc.GetByteCount(strOrg.Substring(start, y)))
        {
            y += delta;
        }
        else if (getbyte < utf8Enc.GetByteCount(strOrg.Substring(start, y)))
        {
            y -= delta;
        }
        //--getbyteと一致したら
        else
        {
            //--終わる
            break;
        }
 
        delta /= 2;    //--半分にする
    }
    #endregion
 
    #region 適当さを補正
    //--目標より少なければ
    if (getbyte >= utf8Enc.GetByteCount(strOrg.Substring(start, y)))
    {
        //--1文字足しても大丈夫かどうか
        while (getbyte >= utf8Enc.GetByteCount(strOrg.Substring(start, y + 1)))
        {
            y++;
        }
    }
    //--多ければ
    else
    {
        do
        {
            y--;    //--1つ減らして
        } while (getbyte < utf8Enc.GetByteCount(strOrg.Substring(start, y)));    //--まだ多いかどうか
    }
    #endregion
 
    return y;
}

呼び出すときに strOrg と start を指定するのは、同じ文字列を使って500バイト分1回目は1~300文字まで、500バイト2回目は301~725文字まで、とかいう使い方を想定しているからです。

こんな。

string message = "元のmessageフガフガ";
int limitByte = 5;
int next;
for (int i = 0; i < message.Length; i += next)
{
    next = GetByteCount(message, i, limitByte);
    //--message.Substring(i, next); を使ってどこかに出力
}

そりゃあ引数に Substring(i) を使って726文字目から終わりまでを渡す、でもいいかとは思いますけど。
オーバーロードでそっちを呼び出すべきか。


きちんと二分探索をやって、後の補正なんか汚いからやめたいって人は、こういうところがすごいしっかりしてるんで参考にするといいですよ。
その他ググれ。


404 Blog Not Found 「アルゴリズム百選 - 二分探索(binary search)」 http://blog.livedoor.jp/dankogai/archives/50961989.html


「二分探索の古典的実装にオーバーフローのバグがある」という話も発見しましたが、上のものだと足し算してるところはほとんどないから大丈夫かしら。足してても 1/2 単位だから Length へ向けての左極限だし。intをバリバリ使ってるから全然ダメという視点はあるでしょうがそこだけならlongかInt64なんか適切なのに置き換えてやってください。stringクラスの文字数制限ってあるのかしら、もし無かったら上記はダメね。制限あるならstringクラスに準じるって言えるから楽です。


ホットコーナーの舞台裏 「古典的バイナリサーチアルゴリズムにバグ」 http://iiyu.asablo.jp/blog/2006/06/05/393464

404 Blog Not Found 「(a+a)/2 == -a /* 半世紀もののバグ */ 」 http://blog.livedoor.jp/dankogai/archives/50522708.html


あとstring型の内部構造と文字コードに起因するこういう話もありますので、当然ですけど自己責任で検証/お使いください。


「C#プログラムでサロゲート・ペアの動作を検証する」 http://itpro.nikkeibp.co.jp/article/COLUMN/20080109/290600/?k2


魚へんに花のホッケの字をばしばし入れて確かめた結果なんとなく大丈夫じゃねーかなーと、か、思いつつ、半文字ズレ、が、怖く、なって、きた、ので、1バイトずつ増やしながら試してたらズレキター
どうすっかなこれ。最後の1文字が「そういうの」じゃないかどうか確認する?サロゲートペアだけでええんか?組み合わせ文字・結合文字?
͛꒰ू ऀ•̥́ꈊ͒ੁ•ૅू॰˳ऀ꒱ ͟͟͞ ̊ ̥ ̥” とかo͡͡͡͡͡͡͡͡͡͡͡͡͡͡╮( ꒪⌓꒪)╭o͡͡͡͡͡͡͡͡͡͡͡͡͡͡とか入れてきたらどこで切るのが正しいんだろ。おぉ難題だ。ややこしい時代になってきた気がする。


DOBON.NET プログラミング道 「サロゲートペアや結合文字が含まれているか調べる」 http://dobon.net/vb/dotnet/string/issurrogatepair.html


車輪の再発明ならぜひ教えてください!

2013年8月29日 (木)

Oracleで三者間の権限設定をする話

Oracle で、あるユーザ/スキーマで見える他のユーザ/スキーマのオブジェクトを制限したい。 権限いろいろ付けたり消したりでやりますが、ビューが絡むと単純なやり方ではダメな場合がある。 制限したいっつーより一部だけ許可したいという場合ですな。


二者間の場合についてはここ http://www50.tok2.com/home/oppama/oramemo.html の「元表の持ち主にビューをGRANTしてもORA-01720が発生する」に書いてあるんですが、三者間でどうなるのかがいまいち理解できてなかった。ので一応メモ。


スキーマA に テーブルa が、スキーマB に ビューb があって テーブルa を参照しています。
スキーマC は テーブルa を直にも見るし、 ビューb も見たい。
その他 テーブルx や ビューy が存在してますが、スキーマC からは ab だけ見えて xy は見えない状態にしないといけない。



初期状態よくわかんないんだけど、スキーマCは自分のもの以外何も見えないように設定しておきます。
スキーマAで入って、スキーマCにテーブルaのSELECT権限を与えます。


GRANT select ON scheme_A.table_a TO scheme_C


ビューbのSELECT権限も与えます、


GRANT select ON scheme_B.view_b TO scheme_C


としようとすると、ORA-01720 のエラーを出されます。
ので、まずスキーマBに、テーブルaのSELECT権限を、WITH GRANT OPTION 付きで与える必要があります。


GRANT select ON scheme_A.table_a TO scheme_B WITH GRANT OPTION


その後、スキーマCにビューbのSELECT権限をつけると大丈夫です。


GRANT select ON scheme_B.view_b TO scheme_C


A ← B ← C
↑←←←↓


Cに付けたいのにA-B間の権限にオプションを付けてやらなければならないという話でした。



ちょっと厳しいところだと、すでに使われている権限に対して操作をくわえるなんてとんでもない、もしなんかあったらどうすんだ、ということで拒否されそうな状況ですね。
結局ウチでもこれは採用されず、スキーマBのビューbと同じ定義文でスキーマCにもビューbを作ったっぽい。


世の中そういう、既存のものに手を加えるのははばかられる状況ばっかりですから、そんなことしなくても新しく作るものへの設定だけで何とかなるようにしてほしいなー。



2016/06/09 に書きました。

2013年5月31日 (金)

文字列の分解

文字列を分解したい。C#、ASP.NET。.NET Framework 3.5。
しかしstringクラスのsplit()では、区切り文字が失われてしまう。
分解したものを単純に再度くっつけると元の文字列が得られるような分解をしたい。

ごく簡単に調べたけど見当たらなかった。ので作った。
もし車輪の再発明ならぜひ教えてください。すでにあるやつのほうが絶対にいろいろよさそう。
ぎっとはぶにはそういうの置いてあるのかなぁ。

/// <summary>
/// 文字列を分解する、区切り文字も保持する
/// </summary>
/// <param name="s">分解対象文字列</param>
/// <param name="pat" />区切り文字のパターン(正規表現)</param>
/// <returns>分解された文字列配列</returns>
public string[] splitPerfect(string s, string pat)
{
	ArrayList arrList = new ArrayList();
	Regex r;
	Match m;

	r = new Regex(pat);

	while (s.Length > 0)
	{
		m = r.Match(s);
		if (!m.Success)	//--見つからなかったら抜ける
		{
			arrList.Add(s);
			break;
		}
		arrList.Add(m.Value.Substring(0, (m.Value.Length >= 2) ? m.Value.Length - 1 : m.Value.Length));
		s = s.Substring((arrList[arrList.Count-1] as string).Length);
	}
	return (string[])arrList.ToArray(typeof(string));
}

くっそ遅そう。実際にはどうかわかんないですけど。測定するつもりもない。

本体としては以上なんですが、目的としてはちょっとばかしSQL文を分解したいというものなので、こういうのをくっつけまして。

/// <summary>
/// SQLを分解するための区切り文字パターン(正規表現)
/// </summary>
/// <remarks>()[]+*-/><=(半角スペース),.(タブ)"':; のどれかと一致するように記述</remarks>
public string strSqlSplitPattern = ".*?[\\(\\)\\[\\]\\+\\*-/><= ,\\.\\t\"\':;]";

/// <summary>
/// 文字列を分解する、区切り文字も保持する
/// </summary>
/// <remarks>区切り文字のパターンとしてstrSqlSplitPatternを使う</remarks>
/// <param name="s">分解対象文字列</param>
/// <returns>分解された文字列配列</returns>
public string[] splitPerfect(string s)
{
	return splitPerfect(s, strSqlSplitPattern);
}

SELECT COL1, COL2 FROM EMPLOYEE WHERE COL3 = 'hogehoge' AND (0=1 OR 1>= 0)

というSQL文があったとして、

SELECT

COL1
,

COL2

FROM

EMPLOYEE

WHERE

COL3

=

'
hogehoge
'

AND

(
0
=
1

OR

1
>
=

0
)

という組に分けてくれるよ。

テストコード。

string example = 好きなSQL文を入れてね!

string[] tmppp= fugaClass.splitPerfect(example);

System.Text.StringBuilder sb = new System.Text.StringBuilder();
for (int i = 0; i < tmppp.Length; i++)
{
	sb.Append(tmppp[i]);
}
if (sb.ToString().Equals(example))
{
	string result = "Match!";
}

当然ながらすべからく適当なのでうまいことやってくださいね。
上に載せたSQLの区切り文字パターン strSqlSplitPattern も、こっちの要件で適当に作ってあるので、自分の用途に合うように考えてから使ってください。
' クオテーションの中に書かれた文字列とかも考慮しないでぶった切っちゃうからね。
‥‥えっそれ大丈夫なんかいな。うーんもうちょっと考えないといかんのかな。

OracleだとかSQL Serverだとかの差も考えてくださいね。
正規表現勉強してね。僕も全然詳しくなくて好きじゃないんだけど仕方ない。

この辺を参考にしてコピペった部分もあります。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1394207798
http://freelancer.yoka-yoka.jp/e337117.html

2013年5月16日 (木)

Webアプリで謎のエラー 0x80070057

最初に言っておこう。この 0x80070057 というエラーコード自体はいろんなもので使われているっぽいので、ちゃんと目的のものを探さないとダメっぽいですよ。
http://support.microsoft.com/kb/982736/ja
http://d.hatena.ne.jp/babydaemons/20080408/1207656965
http://blogs.msdn.com/b/d99/archive/2012/04/06/10291428.aspx


今回以下と同様に VisualStudio / .NET Framework / IIS でのエラーだとしても、また違う原因の場合もあるということですね。


で、Visual Studio 2008 でASP.NET Webアプリケーションの開発をしていて、突然アセンブリが読み込めないとかいうエラーが出るようになったという話です。


僕じゃないんですけど。
なんかいない間に建物で突然の停電があったそうで。20分くらい。
停電復旧後に、デバッグ実行したら次のようなエラーが出るようになったらしい。


「ファイルまたはアセンブリ 'hogehoge'、またはその依存関係の1つが読み込めませんでした。パラメーターが間違っています。(HRESULTからの例外: 0x80070057(E_INVALIDARG))」


画面イメージからの手打ちなんで、全角半角やスペースありなしの違いはあると思います。検索で来れた人おめでとう。


でまぁいろいろ調べたんですが、結論としてはここ(英語) http://blkarwasara.blogspot.jp/2011/07/hresult-0x80070057-einvalidarg-on-debug.html のような感じで C:\Users\[username]\AppData\Local\Temp\Temporary ASP.NET Files\ (Windows 7の場合)以下のファイルを消したら直った。


実際、エラー画面の下部には
「ログ: 新しい URL file:///c:/Users/xxxxxxxx/AppData/Local/Temp/Temporary ASP.NET Files/root/nnnnnnnn/mmmmmmmm/hogehoge.DLL をダウンロードしようとしています。」
的なメッセージも出ている。
しかしこれに従って、該当ファイルを探しても実際にはなかった。
微妙に違うフォルダにそれっぽいDLLがあったので、それを単発で消した。
すると hogehoge 部分が別DLLになったので、そっちも探して消してみた。
でもまだダメ。
なので調べて、上記英語サイトを見つけて、今回対象のPCには Temporary ASP.NET Files 以下にいろんなフォルダが作られていたので、上記メッセージで指定されている root 以下だけ削除しました。
テンポラリなんで全部消しても問題ないはずですけど、root の下も今回関連のものやその他明らかに消していいものだけだなというのを、ファイル名で判断してから消しました。


あーなんか前後しますけど、まずは当該DLLが壊れたのかなと思ったので、ネットワーク上に置いてあったDLLをbinフォルダにコピーしてきて、参照設定やり直して、ということもやってみてました。
でもそれではダメだったので、上記単発消しを試し、それでもいまいちダメなので調べて全消し、という流れでした。


停電でなんかテンポラリフォルダがおかしくなったんだろう。
スキャンディスクやった方がいいですよと言っておこう。

2012年7月26日 (木)

かな入力で間違えて記号を入れてしまった時の動き

記号のいろいろがクッソMS-IMEでしたね。


「:@\]」と打って確定し再変換のため Ctrl+BackSpaceキー を押すと、「ころんたんかえん]」。
ksg。


試そう。
!"#$%&'()=~|    -^\@[;:],./\    `{+*}<>?_
  ↓ ↓ ↓
!”#$パーセント&’()=~|    -^円単価[点コロン],./円    `{+*}<>・_

うぉう書いてる最中に何を学習したのか漢字になりやがったぞ。
ksg。


まぁATOKはF11キーでひらがな⇔英字の相互変換ができるけど、MS-IMEはいろいろ設定見たんですがひらがな→英字の一方向にしか変換できないグズっぽいので、どうでもいいといえばどうでもいいんだけどなぁ。
ATOKなら最初のように「:@\]」と打ってしまっても、未確定状態でF11キーを押せば「げーむ」とひらがなへ変換できるという話です。もう一度F11押せばまた「:@\]」に戻る。


2014/01/13に書きました。

2012年5月22日 (火)

IMEで変換未確定や確定状態から入力状態に戻す機能について

MS-IME はホントに我慢ならんよね。


僕はJISキーボードのかな打ちなので、
間違えて「ん゛」とか打って変換し、まだ確定していない状態で BackSpace で未確定・入力中の状態に戻すと、「ん”」という風に勝手に全角ダブルクオテーションを入力したことにされちゃうの。
しかも。確定させ、再変換ということで Ctrl+BackSpaceキー を押すと、「ん"」となって「”」と「"」で違いがあるとかいうわけのわからなさ。どっちにしろふざけた結果なので削除するし一緒なんですけど。


続いて。「ん゜」とでも打って同様にすると「んまる」になるの。アホかと。ひらがな展開とか何がしたいのか意味わからん。文字数増えてるし。
1キー間違えたのに削除に2キー必要なの。ひどい。なんの仕打ちか。
かな打ちだと「か゜゛」とかままあるよ?「かまる”」になるの。「が」に直すためにバックスペース3回押させられるの。
お前のキー入力が精度悪いせいだってか。はいその通りですなにもいうことはありません。


「ひらいている」を変換→「開いている」確定→ Ctrl+BackSpaceキーで再度未確定へ戻す→「あいている」。
アホ。アホとしか言いようがない。なんでやねん。
なんで前の状態に戻せる機能が付いてんのにその前の状態を覚えてへんねん。
アホや。


なんかさっきは逆に「あいている」変換→「開いている」確定(「空いている」にしたかった)→未確定へ戻す→「ひらいている」だったような気がして辟易してこの文章を書き始めたので、変な部分で学習しとるんかもしらん。
しかし単純に前の状態を覚えるだけであるべきなのに(ですよね?違いますか?)、なんでわざわざ逆変換なんて高度なことしようとしてアホな結果になっているんでしょう。ああ救いようがない。


家ではATOKなんですが、会社では当然有料ソフトを勝手に入れることができないのでしぶしぶ、指定されている MS-IME を使わざるを得ない。本当にやめてほしい。

二番目のなんかATOKなら間の「゜」一個消せば後ろの濁点も判別して「が」に直してくれるのになー。


2014/01/13に書きました。

2012年5月 7日 (月)

日本に無いハンディターミナルの話

海外拠点にいます(東アジア)。
ハンディターミナルでバーコードを読み込んでPC側のシステムに流し込みたいんだけどできないという話があったのでいろいろ調べた。
対象は、Datalogicという会社 http://www.adc.datalogic.com/ のSkorpioというシリーズ。スコーピオ。Mobile Computerに分類されるようです。イタリアの会社のようですね。

いろいろ調べた結果、IDEC DATALOGICという日本代理店がある http://www.idljp.com/jpja/ ようだけどSkorpioは扱っていないっぽい。なので日本語資料がない。
そこのニュースリリースを読むだに、Datalogicが用途別というか分類して分社したそれぞれが売っていて、MobileComputer担当の会社とは日本は取引自体がないっぽい。
データロジックADC株式会社 http://www.datalogicscan.jp/ ってのはなにやってんでしょうかね。日本法人ですかね。あっURLが datalogicscan だからさっき言った分社の部分名乗ってんじゃん。

とりあえずUSBの接続ケーブルはあるんで、バーコードリーダーって普通突っ込めばピッと読み込んでパッとPC画面に表示できるだろうから、ということでUSBでつないでバーコード読む。
なにも反応なし。
やっぱハンディターミナルとバーコードリーダーでは違うんですね。

ここでWebを探して上記会社のサイト見つけて、マニュアルはダウンロードできた(「Support」→「Manuals」→「Search by product」のドロップダウンリストから「Skorpio(TM)」を選択して「Search」ボタン→「DL-Skorpio user's manual (.pdf, 2797949 byte)」のリンク)のでざっと英語読む。
前提として、このSkorpioにはWindowsCEが入ってて、CE型のメニューとWindowsMobile型のメニューが使えるらしいんだけど、ここでは渡された状態がWinCE型だったんで、以降はそのタイプのメニューの話です。

さて、目次をあさると「CONNECTIONS」とかあるんだけどロクな事書いてない。
「USE AND FUNCTIONING」には、「DATA CAPTURE」とか「DATA CAPTURE CONFIGURATION」とかがあったのでその辺を。
しかしDATA CAPTUREはレーザー発射の仕方なのでわかるわそんなもんって感じだし、DATA CAPTURE CONFIGURATIONは本当に設定話で、一応確認したけど変なところはなかった。
その次に「Capture」っていう項目があって、それを見るとデータ読み込みアプレットがあるよって書いてある。載っている画面キャプチャ通り、タスクバー部分の、緑色orグレーのなんとなくバーコードっぽいアイコンからこれらConfigureとかCaptureへ行けますよ。
バーコード用意して読み込んでみると、おぉ確かに表示される。しかし表示だけよのう‥‥ 「Save Data To LogFile」にファイル名がんばって入れてみると、確かにそっちに保存されたりする。しかしそれまで。

Skorpioの中のExplorerとかでその保存されたファイルを探して(保存場所変更していなければ C:\Windows 以下かも)、テキストファイルなのでそのまま開く。
ここでバーコード読み込んでみると、おぉアプレット通してでなくても直接入力できるのね、テキストファイルには。というところ。

できない場合は Configure の SCAN PARAMETERS の KeyboardEmulation を Enabled にするとよいかと。Clipboardだとクリップボード行きで貼り付け動作が必要なんでしょう。
あとタスクバーアイコンからポップアップメニュー出して「Wedge」というところにチェック付いているかどうか。何の意味だかよくわかりませんが、チェック付いてないとアイコンもグレーの色になりますよ。

つまりPCに入れるには転送動作が必要ということで。ここまで単にUSBいきなりぶっ挿してただけなので、単純につないだだけではやはり認識してくれないっつーことでドライバをインストールする。
Webサイトの「Support」→「Software」→「Search by product」のドロップダウンリストから「Skorpio(TM)」を選択して「Search」ボタン→使ってるのはWindowsXPの32bit版なので Windows 32 Bit Usb Driver for devices Windows Ce 4.2 & Windows CE 5.0 23/09/2008 のところ。その下に「Windows Usb Driver for MC Devices (.zip, 3590045 byte) 」ってリンクがある。
解凍してインストール。

したんだけど、WinXP側のマイコンピュータにドライブ増えたりもしてないし、なんだかあんまり変わらない。
スタートメニューにプログラムグループできたんで見てみると、HTMLファイルが一個あるだけ。
中を見ると「ActiveSyncを入れよ」というご神託であった。
その他にも実体はWindowsCEということで、「WindowsCE 接続」あたりでGoogle先生にお伺いを立てると、先達の(ハンドヘルドPCなどの)ActiveSyncインストール事例な古文書が得られたので、Microsoftのサイトから落としてきて入れる。今はActiveSync4.5というバージョンなようで、時代違うだろうけどええんかいな、と思いつつWikipedia様で調べた http://ja.wikipedia.org/wiki/Microsoft_ActiveSync ところ、このSkorpioに入っているのはWindowsCE5.0なのでActiveSyncは4.5でもいいっぽい感じ。

すると、ケーブル接続すればActiveSyncが立ち上がるようになって、ファイルの取り出しも可能になった。
しかしテキストファイルが取り出せるにすぎない。
バーコード読み取りでPC側に反映されるかやってみたけどやはりダメ。
つまり、ハンディ側で読み込んだらUSB経由でそのデータ転送する、という簡単なアプリを作らなきゃいけないっぽい。
というのが結論。
以上、ありがとうございました。

ちぇー、そんな機能くらい標準で付いてたっていいじゃないのさ。バーコードリーダーエミュレートモード。


よっぽど、SoftwareのページにあるSDKをインストールしてやろうかと思いましたけど、さすがにそこまで時間ないし、ちょっとやってみてくれという指示もないのでここまで。
あと日本語の開発事例が無いのでどうアプリ組んでいいのかわからず。CEの開発経験もないし。
仕様としては、テキストボックスが一個あって、Enterキー押されたらUSBでつながったPC側のキー入力となるようにデータ転送する、というだけでいいと思うんですが。バーコード→ハンディ上のキー入力 は上記で見てきたように自動でやってくれてるわけだから、そこからPCへの転送だけをやる。
そういうソフトすでにどっかで転がってたりしないかな。

「MCL-Collection for Datalogic Mobile Computers 30/11/2005」っていうのがSoftwareのところに載ってるけど、うたってる通り「enables even non-skilled programmers to quickly develop data collection applications」なら試してみたくもあり。「data collection applications」が想像と違ってたらアレなんですが。



すんげーどーでもいいんですが、Skorpioの製品情報に「Laser scanner with "Green spot", providing good read feedback (Datalogic patent) 」って書いてあった。その通り、バーコード読み込みの赤い横線レーザーが出てて読み込み成功すると緑の丸のレーザーが出るんですが、データロジック社の特許なのかそうなのかー。


なんか5/9の午後になったら、ピッピピッピ音がするので何かと思ったらバーコードリーダーが導入されていた。リーダー機能だけのやつ。それで正しい。


2012/09/12に書きました。

2010年12月 3日 (金)

Windows7のfindはちょっとだけ仕様が違うけどやっぱダメ

Windows7 の find ならば大丈夫かなと思っていろいろやってたら、1行の文字数が4096バイト以上だと、発見はできるけど表示はしてくれないw
2個以上の検索結果がある場合は、1個目が4096バイトで切れることによって改行コードがなくなって、その後ろに続けて表示されているので、コマンドプロンプトの問題ではない。

まぁ検索ではヒットするので、行数さえわかればあとはエディタで見てという流れなのでいいんですけどー。

findstr なら大丈夫かな。検索もできるし表示もされる。
findstr /N "検索文字列" 対象ファイル名 とか。 findstr /? ってすれ。


2012/10/01に書きました。

より以前の記事一覧

AmazonSearch


最近のトラックバック

無料ブログはココログ