2018年6月16日土曜日

ASUS ZenBook UX31Eのキーボードの入力がおかしくなったので、キーボードごと入れ替えた

購入したキーボードは、1600円ほどでした。
ドライバは「変換名人」のT5を使用しました。

背面を取って

全てのネジを外して裏返して

キーボードのネジが多い。非常に多い。なんで??

とにかくすべての小さなネジをひとつずつ外す。

そして、最後まで外してキーボードを取り外すと、、

「フイタ」モニターの電源が入っている!!!

仕方ない。入れ替えて組み立てる前に、新型の黒いキーボードを差し込んで電源OFFにする。。。このタイミングでです。

キーボードをチェックして、ケーブルのテープを外して折り込みます。

ここで、ネジ穴とキーボードのくぼみのサイズが少し合っていなくて、調整を行い、逆の手順で最後まで組み立てます。

タッチパットのケーブルが分解時に考慮漏れていたので接続しなおして、
最後に、タッチパッド、USB、イヤホン、モニタ、キーボード、WiFi、ボタン電池、、など各種ケーブルの接続がうまく行っていることを確認して完成です。

完成後は、PCを徹底的に磨いて終了です。シールがWindows 7ですが、手書きでWindows8になっています。
キーボードのWindowsキーは、Windows10のロゴに変わっています。

最後に三ツ矢サンダーを飲んで終わりです。

ThinkPadT420sが熱暴走でブラックアウト(画面が突然真っ黒になって電源が落ちる)するので、ファンを入れ替えてグリスを塗り直した

キーボードを外して
 液晶を外して
 もろもろを外して
 チップセットを取り出してファンをはずしました
取り外したファンです。
グリスを塗って 新しいファンをつけて組み直しました。
 マスキングテープはポケモンのものを使用する。
 裏側のはWiFiの配線もしっかりと這わせる。

完成して、無事に起動しました。
一日、2~5回程度、シャットダウンしていたのが落ちなくなりました。
ファンの温度も修理前は、90~98℃だったのが、60℃台を見る機会が増えて安定して動作しています。
ThinkPadは分解して組み立てやすいですね。
ThinkPadT420sであと五年は戦えそうです。

ブラウザで.NETのILを動作させたときに「SCRIPT5022: SCRIPT5022: null 」が発生した。

エラーについては非常に悩んでしまったので、顛末と調べ方を記載


エラーログ

調べかたは、エラーが出ていなかったときのソースと出ている場合の「g.cs」ファイルをを比較すると動作しない方は、
            builder.OpenComponent<BlazorTest.Client.Pages.Input>(3);
の記載があって、ComponetのInputが差し込まれていることがわかる。

cshtmlのファイル名でComponentと扱われるため、作成したInput.cshtmlが、Componentと解釈され、<input>タグが上書きされてしまいエラーが発生していました。


2018年4月3日火曜日

メッセージ 217、レベル 16、状態 1、プロシージャ tri_SetB、行 5 [バッチ開始行 24] ストアド プロシージャ、関数、トリガー、またはビューの入れ子のレベルが最大値を超えました (制限 32)。メッセージ 195、レベル 15、状態 5、行 33 'RECURSIVE_TRIGGERS' は SET オプション として認識されません。

create table TriggerTest(id int, a int, b int)

drop trigger if exists tri_SetA
go
create trigger tri_SetA on TriggerTest after update as
begin
if update(a)
begin
update TriggerTest set b = a + 10000
where id in (select id from inserted)
end
end
go
drop trigger if exists tri_SetB
go
create trigger tri_SetB on TriggerTest after update as
begin
if update(b)
begin
update TriggerTest set a = b + 100000000
where id in (select id from inserted)
end
end
go

delete from TriggerTest
insert TriggerTest values(1,2,3),(2,3,4)

/*
メッセージ 217、レベル 16、状態 1、プロシージャ tri_SetB、行 5 [バッチ開始行 24]
ストアド プロシージャ、関数、トリガー、またはビューの入れ子のレベルが最大値を超えました (制限 32)。
*/

--これが全く使えない
SET RECURSIVE_TRIGGERS ON
/*
メッセージ 195、レベル 15、状態 5、行 33
'RECURSIVE_TRIGGERS' は SET オプション として認識されません。
*/
exec sp_configure 'show advanced options', 1
go
reconfigure --sp_configureの設定内容を反映させる
go

exec sp_configure 'nested triggers', 1
go
reconfigure
go

begin tran
select * from TriggerTest
update TriggerTest set a = a + 10 where id = 1
select * from TriggerTest
rollback tran

begin tran
select * from TriggerTest
update TriggerTest set b = b + 10 where id = 2
select * from TriggerTest
rollback tran

2018年3月28日水曜日

SQL Server テーブルをViewにしたけど一部の項目を更新したいという要望に答えるサンプル

drop table if exists sdemp
create table sdemp (empid int, name nvarchar(200));
drop table if exists emppoint
create table emppoint (empid int, point int);
drop view if exists emp
create view emp as
select se.empid empid, se.[name] [name], isnull(ep.point,0) point
from sdemp se left outer join emppoint ep on ep.empid = se.empid
go
create trigger triggerupdeteemp on emp
instead of update as begin
set nocount on
merge into emppoint using inserted on emppoint.empid = inserted.empid
when matched then update set point = inserted.point
when not matched then insert values(inserted.empid, inserted.point);
end
--sdのテーブル
insert sdemp values(1,'abe')
insert sdemp values(2,'kiyo')
select * from emp
/*
empid name point
1 abe 0
2 kiyo 0
*/
begin tran
update  emp set point = point + 10 where empid = 1
update  emp set point = point + 10 where empid = 1
select * from emp
/*
empid name point
1 abe 10
2 kiyo 0
*/
rollback tran

2018年3月20日火曜日

Enumの名称で使用できない文字がある場合にCustomAttributeを作成して名前付けしてあげてそれを汎用的に取得する拡張メソッドを作るサンプルです。

Enumの名称で使用できない文字がある場合にCustomAttributeを作成して名前付けしてあげてそれを汎用的に取得する拡張メソッドを作るサンプルです。

------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EnumReflectionConsoleApp
{
class Program
{
static void Main(string[] args)
{
foreach (var e in Enum.GetValues(typeof(HogeEnum)) as IEnumerable<HogeEnum>)
{
Console.Out.WriteLine(e.EnumName());
}
Console.In.ReadLine();
}
}

[EnumName("ほげ")]
enum HogeEnum
{
[EnumName("HogeHoge")]
A = 1,
B = 2
}

static class EnumExrentions
{
public static string EnumName(this System.Enum value)
{
var fieldInfo = value.GetType().GetField(value.ToString());
var descriptionAttributes = fieldInfo.GetCustomAttributes(
typeof(EnumNameAttribute), false) as EnumNameAttribute[];
if (descriptionAttributes != null && descriptionAttributes.Length > 0)
return descriptionAttributes[0].Name;
else
return value.ToString();
}

}

[AttributeUsage(AttributeTargets.Enum | AttributeTargets.Field)]
public class EnumNameAttribute : Attribute
{
public EnumNameAttribute(string name)
{
this.Name = name;
}

public string Name { get; }
}
}

---取得処理を汎化させてさせてみました。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EnumReflectionConsoleApp
{
class Program
{
static void Main(string[] args)
{
ShowEnumName<HogeEnum>().All(s => { Console.Out.WriteLine(s); return true; });
//HogeHoge
//B
//が出力される
Console.In.ReadLine();
}

static IEnumerable<string> ShowEnumName<T>() where T : struct {
foreach (var e in Enum.GetValues(typeof(T)) as IEnumerable<T>)
{
yield return (e as System.Enum).EnumName();
}
}

}

[EnumName("ほげ")]
enum HogeEnum
{
[EnumName("HogeHoge")]
A = 1,
B = 2
}

static class EnumExrentions
{
public static string EnumName(this System.Enum value)
{
var fieldInfo = value.GetType().GetField(value.ToString());
var descriptionAttributes = fieldInfo.GetCustomAttributes(
typeof(EnumNameAttribute), false) as EnumNameAttribute[];
if (descriptionAttributes != null && descriptionAttributes.Length > 0)
return descriptionAttributes[0].Name;
else
return value.ToString();
}

}

[AttributeUsage(AttributeTargets.Enum | AttributeTargets.Field)]
public class EnumNameAttribute : Attribute
{
public EnumNameAttribute(string name)
{
this.Name = name;
}

public string Name { get; }
}
}


2018年3月17日土曜日

Azure:VPN Gatewayで設定できるIPアドレスが動的なIPアドレス(Dynamic IP)だけの問題は、実は問題じゃなかった。ただし、、、

Azure VPNのゲートウェイのPublic IPアドレスですが、ドキュメントの通り「動的なIP」のみが指定可能で、静的なIPアドレスは指定できません。


出展
https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-vpn-faq


とある要件で、vpn関連の再構築をすることとなり、パブリックIPを消さずに下記の内容を実施した所、、、、IPアドレスが変わってしまうという事象に出くわし、焦りました。
よく見ると「ゲートウェイが削除され、再作成された時のみ」との記載があるので、注意が必要です。

・・・静的なIPが割り当てられれば気軽にVPN Gatewayを再作成することが出来るんですけどね。。。