技術とか戦略とか

証券レガシーシステムを8年いじってから転職した普通の文系SEによるブログ。技術のみではなく趣味の戦略考察についても。

NuGetとは

「NuGetって何ができるの?」と聞かれることが少なくないので、何ができるのか簡単にまとめました。
一言で言うと、Mavenの.Net版のようなものです。
C++C#のプログラムを開発する時によく使います。
 
NuGetでは以下のようなことができます。
 
・パッケージ(ライブラリを所定の形式で圧縮したもの)を取得できる
・パッケージの取得時に、自動的にパスを通すことができる
・パッケージから呼び出しているパッケージ(依存パッケージ)も同時取得できる
・ビルド時に足りないパッケージを自動的に取得することもできる(自動リストア)
Visual Studioの画面から呼び出すことができる
 (CUI操作でも使用できる)
・パッケージは自分で作ることもできる
 (実行ファイル、及びパス・依存関係等を定義するファイルを所定のコマンドで圧縮)
・プライベートのNuGet用サーバを作成し、パッケージを配信することもできる
 
参考までに、Visual Studioの画面でNuGetを使用しパッケージ「ReactiveProperty」を取得する例です。
https://cyzennt.co.jp/blog/2020/06/04/c%ef%bc%9awpf%e3%81%a7%e3%81%aehelloworld/

C#:Visual Studioで作成したプログラムの著作権表示について

C#で作成した実行ファイルについて、プロパティ > 詳細タブ を確認すると、著作権表示が下記のようになっています。
 
コマンドラインからビルドした場合(コマンド:csc.exe hoge.cs)
f:id:akira2kun:20200704231808j:plain
Visual Studioでビルドした場合
f:id:akira2kun:20200704231837j:plain
 
コマンドラインからビルドした場合は何も設定されていないのですが、Visual Studioからビルドした場合はPCメーカ名が表示されてかなりかっこ悪いです。
誰かに提供するプログラムなのであれば、直したいところです。
 
Visual Studioでは、著作権表示を自動的に生成します。
生成された著作権情報は、プロジェクトフォルダ\Properties\AssemblyInfo.cs にて定義されています。
(プログラムのバージョン等の情報も一緒に定義されています。)
定義内容は以下の通りです。
 



using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。
// アセンブリに関連付けられている情報を変更するには、
// これらの属性値を変更してください。
[assembly: AssemblyTitle("HelloWorld")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("(PCメーカ名)")]
[assembly: AssemblyProduct("HelloWorld")]
[assembly: AssemblyCopyright("Copyright © (PCメーカ名) 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// ComVisible を false に設定すると、このアセンブリ内の型は COM コンポーネントから
// 参照できなくなります。COM からこのアセンブリ内の型にアクセスする必要がある場合は、
// その型の ComVisible 属性を true に設定してください。
[assembly: ComVisible(false)]

// このプロジェクトが COM に公開される場合、次の GUID が typelib の ID になります
[assembly: Guid("88d5f4be-6143-40d2-b091-4cb6e0e938e7")]

// アセンブリのバージョン情報は次の 4 つの値で構成されています:
//
//      メジャー バージョン
//      マイナー バージョン
//      ビルド番号
//      Revision
//
// すべての値を指定するか、次を使用してビルド番号とリビジョン番号を既定に設定できます
// 既定値にすることができます:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]



 
これらの情報を書き変えて再度ビルドすれば、著作権情報を更新することができます。
 
なお、AssemblyInfo.cs を直接いじらずに、Visual Studio の画面から更新することもできます。
ソリューションエクスプローラー > (任意のプロジェクトを選んで右クリック) > プロパティ > アプリケーション タグ > アセンブリ情報 を選択することで、更新画面を表示できます。

 f:id:akira2kun:20200704231918j:plain
f:id:akira2kun:20200704231948j:plain

html・jsp:submit(ボタン)で画面遷移できない→スペルミスかも

formをfromとタイプミスしただけでボタン押下で画面遷移できなくなりました…。
jspでhtmlコードを生成する場合はEclipse上ではエラーとして検出されず、その上ボタンは表示されてしまうので、原因の特定に時間がかかりました…。
 
【誤】
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.*" %>
<%
String html = "";
html += "<from name=\"form1\" action=\"answer.jsp\" method=\"POST\">";
html += "<input type=\"submit\" value=\"click\">";
html += "</form>";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>sample</title>
</head>
<body>
<p></p><%=html %>
</body>
</html>
 
【正】
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.*" %>
<%
String html = "";
html += "<form name=\"form1\" action=\"answer.jsp\" method=\"POST\">";
html += "<input type=\"submit\" value=\"click\">";
html += "</form>";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>sample</title>
</head>
<body>
<p></p><%=html %>
</body>
</html>

オブジェクト指向言語で良く言われる「委譲」とは

javaC#といったオブジェクト指向言語のプログラミングの話をしている時に、「委譲」という言葉が出てくる時があります。
「委譲」には色々な意味があるのですが、このようなケースでは「具体的な処理が実装されている他のクラスのメソッドを呼び出す」という意味で取れば概ね間違いありません。
(ちなみに、この意味での「委譲」は、正しくは「転送」と呼ばれるそうです)
 
javaのコードで言うと以下のようなコードになります。
 
【サンプルコード】
・Transferred.java
private String message = "procedure transferred!"

public void procedure() {
    System.out.println(message);
}
 
・Transferring.java
public class Transferring {
    private Transferred transferred = new Transferred();

    public void procedure() {
        transferred.procedure();
    }
}
 
・TransferMain.java
public class TransferMain {

    public static void main(String[ ] args){
        Transferring transferring = new Transferring();
        transferring.procedure();
    }

}
 
【実行結果】
procedure transferred!
 
-------------------
 
会話をしていて「あれ、委譲ってなんだっけ」となる場合が(自分に限らず)あるので、備忘のために書いてみました。
委譲はデザインパターンでも多様されているので、言葉の意味だけでなく、手法としても覚えておいた方が良いでしょう。
(「継承」でも似たようなことはできるのですが、「委譲」だと複数のクラスのメソッドを一度に扱えるメリットがあります)

The transaction log for database (Database_name) is full due to 'LOG_BACKUP'が出た場合の対処法

表題のエラーについて、日本語のサイトの対処法がわかりにくかったり、英語のサイトが引っかかったりするので、日本語でわかりやすい対処法を記事に残します。
 
表題のエラーはSQLServerのエラーで、簡単に言うと「ログが一杯になりトランザクションが失敗した」という内容です。
 
対処法としては、以下の3つのクエリを順番に投げれば解消します。
(少なくとも自分の環境では解消しました)
(参考サイト:https://www.xadmin.net/transaction-log-database-due-log_backup/
 
【対処法】
①一時的に設定変更する
ALTER DATABASE Database_name
SET RECOVERY SIMPLE
GO
 
②ログを削除する
DBCC SHRINKFILE (Database_name, 1);
GO
 
③設定を元に戻す
ALTER DATABASE Database_name
SET RECOVERY FULL
GO

Excel・VBA:表のデータの部分のみ選択する

このように、項目名とデータに分かれている表が存在している場合に

f:id:akira2kun:20200621200103j:plain

データの部分だけ選択するマクロの紹介です。

f:id:akira2kun:20200621200113j:plain

データの部分だけ消したいような場合に使えます。
 
マクロの記述は以下の通りです。
記述内容は7行のみですが、内容を理解すれば類似処理(最終行にデータを追加する、特定のデータの個数を数える、等)にも活かせます。
 
【記述内容】
Sub ボタン1_Click()
 Worksheets("Sheet1").Range("A2").Select
 Dim i As Integer
 Do While IsEmpty(ActiveCell.Value) = False
  i = i + 1
  ActiveCell.Offset(1, 0).Select
 Loop
 Range("A2:B" & Format(i + 1)).Select
End Sub
 
【解説】
・データの部分の一番左上を選択
 Worksheets("Sheet1").Range("A2").Select
 
・データの部分が何行あるのかをカウント
 Dim i As Integer
 Do While IsEmpty(ActiveCell.Value) = False
  i = i + 1
  ActiveCell.Offset(1, 0).Select
 Loop
 
 「Dim i As Integer」でInteger型(数値型)の変数iを宣言します。
 Integer型は宣言した時点で0に初期化されるため、
 明示的に初期値を入れる必要はありません。
 
 その後の4行はループ処理です。
 現在選択されているセルは「ActiveCell」、その値は「Value」で取れます。
 「IsEmpty()」は引数のセルが空か否かを返す関数であり、
 この関数の引数に「ActiveCell.Value」を与えることで、
 現在選択されているセルが空ならTrue、空でなければFalseを返すようになります。
 この関数の結果を用いて「Do While」~「Loop」文でループを回しています。
 ループ内で「ActiveCell.Offset(1, 0).Activate」を記述することで、
 「現在選択されているセル(ActiveCell)の1行下(Offset(1, 0))に
  選択セルを移す(Select)」
 ということができるようになり、
 「A2が空でないか→A3が空でないか→A4が空でないか…」
 というループを回すことが可能になります。
 この際、変数iをカウントアップしていくことで、
 何行存在するのかをカウント可能になります。
 
・データを範囲選択
 Range("A2:B" & Format(i + 1)).Select
 
 Range関数の引数の部分を変数iを用いて可変としています。
 &演算子とFormat関数を用いることで、
 このように文字列結合することができます。

Windowsバッチの動きがおかしい場合に見直すポイント(文字コード、改行コード)

Windowsのバッチファイルは、特定の文字コードや改行コードを使用しないと上手く動きません。
具体的には、以下の文字コードや改行コードを用いる必要があります。
 
文字コードは「SJIS」を使用する(chcpコマンドで文字コードを変更しない場合)
・改行コードは「CRLF」を使用する
 
既存のファイルをコピーしてそれをベースにバッチファイルを作成するような時に、文字コードを誤ってしまうことが多いです。
また、FTPFFFTP)やGitを用いてサーバ間でファイルのやりとりをする時に、意図せずに改行コードが変わってしまうことも多いです。
既存のファイルをコピーしたり、サーバからバッチファイルを落としてきたりする場合には注意する必要があります。
 
以下では、文字コードや改行コードを誤るとどのように挙動が変わるのかを見ていきます。
文字コードを誤ると、2バイト文字(日本語等)の部分が文字化けします。フォルダ名やファイル名に2バイト文字が含まれていたり、データに2バイト文字が含まれていたりするような場合は、正常に動作しなくなります。
また、改行コードを誤ると、改行が無視されてコマンドが実行されます。通常のバッチファイルでは改行でコマンドを区切るため、コマンドを上手く区切られなくなり、正常に動作しなくなります。
 
【サンプル】
@echo off
echo こんにちは世界!
pause
 
文字コード・改行コードが正しい場合の動作】
こんにちは世界!
続行するには何かキーを押してください . . .
 
文字コードが「UTF-8」の場合の動作】
縺薙s縺ォ縺。縺ッ荳也阜・・
続行するには何かキーを押してください . . .
 
【改行コードが「LF」の場合の動作】
'ノちは世界!' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
続行するには何かキーを押してください . . .