カテゴリー: 未分類

  • [C#]バージョンに*を使う

     コンパイルするたびに異なるバージョンにしたいとき、ワイルドカード(アスタリスク *)を使うことができます (.NET 9 SDK で試しています)

    *.csproj

    ワルイドカードを使えるように *.csproj ファイルを設定します
    次のように Deterministic 行を追加し、false を設定します

    <Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
    (省略)
    <Deterministic>false</Deterministic>
    </PropertyGroup>
    </Project>

    *.AssemblyInfo.cs

     いちどコンパイルすると .\obj\Release\net9.0-windows\win-x64\*.AssemblyInfo.cs ファイルがつくられますが、そのファイルにある AssemblyVersionAttribute を 1.0.* などワルイドカード付きに変更します
     バージョンを設定する行が複数ありますが、他の AssemblyFileVersionAttribute, AssemblyInformationalVersionAttribute などは削除して構いません

     バージョンなどよく変更するものは *.AssemblyInfo.cs から削除して、Main 関数がある Program.cs ファイルなどへ移すことができます

  • .NET SDK インストールとコンパイル

    ダウンロード

    .NET SDK をダウンロードします

    .NET ダウンロード

    .NET と C# バージョンの組み合わせ

    .NETC#
    .NET 10C# 14
    .NET 9C# 13
    .NET 8C# 12
    .NET 7C# 11

    C# の歴史 C# の新機能の各バージョンに .NET と C# バージョンの組み合わせが書かれています

    インストール

    アンインストール

    既にはいっているバージョンを確認します

    dotnet --list-runtimes

    『プログラムの追加と削除』から『.net』で検索してアンインストールできます

    インストール

    ダウンロードした『dotnet-sdk-***.exe』を実行します

    最初のアプリ作成

    コンソールアプリ

    テンプレート作成

    インストール済みのテンプレートを確認します

    dotnet new list

    コンソールのテンプレートを作成します

    cd /d "テンプレートを作成するフォルダの場所"
    dotnet new console -o 新しいアプリ名

    コンパイル

    cd /d "テンプレートを作成するフォルダの場所\新しいアプリ名"
    dotnet publish -c Release -r win-x64 -p:PublishSingleFile=true -p:PublishReadyToRun=true

    コンパイルした *.exe ファイルは次の場所に作成されます

    テンプレートを作成するフォルダの場所\新しいアプリ名\bin\Release\netバージョン\win-x64\publish

    Win Forms アプリ

    画面がある Win Forms アプリをつくる方法はこのようになります exeファイルの場所はコンソールアプリと同じです

    cd /d "テンプレートを作成するフォルダの場所"
    dotnet new winforms -o 新しいアプリ名
    cd 新しいアプリ名
    dotnet publish -c Release -r win-x64 -p:PublishSingleFile=true -p:PublishReadyToRun=true

    アプリのアイコン

    アプリにアイコンを追加するには、アイコンファイル (*.ico) を用意します

    「アプリケーション名.csproj」ファイルをメモ帳で開きます

    「<PropertyGroup>」から「</PropertyGroup>」のあいだに次の行を挿入します
    <ApplicationIcon>アイコンファイル名</ApplicationIcon>

    詳細情報

    exeファイルに詳細情報を埋め込むには、「テンプレートを作成するフォルダの場所\新しいアプリ名\obj\Release\netバージョン\win-x64」フォルダにある「アプリケーション名.AssemblyInfo.cs」ファイルをメモ帳で開きます

    著作権
    (挿入)[assembly: System.Reflection.AssemblyCopyrightAttribute(著作権表示)")]
    
    製品名
    [assembly: System.Reflection.AssemblyProductAttribute("製品名")]
    
    説明・ファイルの説明
    [assembly: System.Reflection.AssemblyTitleAttribute("説明")]
    
    製品バージョン
    [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.3")]
    
    ファイルバージョン
    [assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.3.4")]
    

    その他

    .NET 9 では、画面のハードコピーを取得するときは拡大率を考えずに普通にできます .NET 4 のときは面倒でした

    dotnet での開発を説明した記事

    自動でスクリーンショットを取得 (.NET C#)

    dotnet で開発したアプリ

  • [WordPress]テーマを自作する

    [WordPress]テーマを自作する

    新しいテーマのファイルを配置

     WordPressをインストールしたフォルダのwp-content/themesフォルダに、テーマのフォルダを作成します
     テーマのフォルダ名はWordPressの管理画面に表示されます
     レンタルサーバの簡単インストールで作成されたWordPressでも大丈夫です

    作成したテーマのフォルダに次のファイルを新規作成します
    FTPが必要です

    functions.php : 中身は不要です

    readme.txt : 中身は不要です

    style.css : UTF-8で次のように記載します

    /*
    Theme Name: カミュプリィのテーマ
    Author: Commuply Inc.
    Description: 自作テーマです
    Version: 0.0
    */

    index.php : UTF-8で次のように記載します
    (投稿を表示するために必要ですが、templates/index.html を置く方法もあります)

    <?php get_header(); ?>
      <div>
        <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
          <h2>
            <a href="<?php the_permalink(); ?>">
              <?php the_title(); ?>
            </a>
          </h2>
          <?php the_content(); ?>
          <?php endwhile; endif; ?>
      </div>
    <?php get_footer(); ?>

    screenshot.png : テーマを表示する画像を横880 x 縦660 または 横1200 x 縦900 で配置します

    自作テーマに切り替え

    WordPressの管理画面で 外観 > テーマ で切り替えます

    自作テーマのチェック

    Theme Check」プラグイン(作者: Themes チーム)を追加します

    外観 > Theme Check、もしくは テーマの画像が大きく表示されているところにある「Theme Check」ボタンからチェックできます

  • パソコン無いけどホームページが欲しい

    パソコン無いけどホームページが欲しい

    商売をしているので、お勧めを紹介したり、休業日をお知らせしたり、アンケートを取ったり、来店(来所)予約を受けたりなど、お客様との接点になるホームページが欲しいです

    今は店内やお店のシャッターに張り紙したり、白板黒板に書いたりしています、 パソコンを持ってないし使えないけど、スマートフォンやタブレットなら使っています

    叶える方法があります

    ご紹介したいことはあるんだけど、パソコンはからっきし苦手なんだよねという皆さまに紹介したいサービスがあります

    いただいた文章と画像を使ってホームページを立ち上げる、ハコページのサービスがあります
    立ち上げたばかりのサービスで、今はモニター価格を提供しています

    サーバー共用・サブドメインとCMSを専用で提供してコストを抑えた上で、月額固定料金で提供します
    ご自身でサーバーを契約したりCMSを用意したりと一通りの環境を整える必要がありません

  • [言語比較]検索される文字値の検索値より右側

    [言語比較]検索される文字値の検索値より右側

    C#

    ○番目の検索値より右側を返すユーザー関数です

    /// <summary>
    /// ○番目の検索値より右側
    /// </summary>
    /// <returns>検索値より右側</returns>
    /// <param name="source">検索される値</param>
    /// <param name="key">検索値</param>
    /// <param name="nth">何番目の検索値?(1-)</param>
    string StrRight(string source, string key, int nth = 1)
    {
    	string result = @"";
    	if(1  >nth)
    	{
    		return result;
    	}
    	int start = 0;
    	int next;
    	for(int i = 1; i <= nth; i++)
    	{
    		next = source.IndexOf(key, start, StringComparison.CurrentCultureIgnoreCase);
    		if(0 > next)
    		{
    			start = 0;
    			break;
    		}
    		start = next + key.Length;
    	}
    	if(0 < start)
    	{
    		result = source.Substring(start);
    	}
    	return result;
    }

    Excel

    最初の検索値より右側を返す式はこちらです

    =LET(VKEY,検索値,VVALUE,検索される値,VERROR,エラー時の値,IFERROR(MID(VVALUE,FIND(VKEY,VVALUE)+LEN(VKEY),LEN(VVALUE)),VERROR))

    最後の検索値より右側を返す式はこちらです(LETでまとめていません)
    検索値を仮の検索値へ置換し、切り出した後に検索値を戻しています

    =IF(ISERROR(FIND(検索値,検索される値)),検索される値,MID(検索される値,FIND(仮の検索値,SUBSTITUTE(検索される値,検索値,仮の検索値,LEN(検索される値)-LEN(SUBSTITUTE(検索される値,検索値,""))))+1,LEN(検索される値)))

    Lotus Script 言語

    左側から検索される値を検索します
    文字値 = StrRight (検索される値,検索値,比較方法,何番目の検索値?)
    文字値 = StrRight (検索される値,検索値,比較方法)
    文字値 = StrRight (検索される値,検索値)

    右側から検索される値を検索します
    文字値 = StrRightBack (検索される値,検索値,比較方法,何番目の検索値?)
    文字値 = StrRightBack (検索される値,検索値,比較方法)
    文字値 = StrRightBack (検索される値,検索値)

    比較方法
    0 = 大文字小文字、全角半角を区別します
    1 = 大文字小文字を区別しません
    4 = 全角半角を区別しません
    5 = 大文字小文字、全角半角を区別しません

    戻り値には検索値を含みません
    例: {ABC} = StrRight ({ABCABC},{c},1,2)

  • [言語比較]検索される文字値の検索値より左側

    [言語比較]検索される文字値の検索値より左側

    C#

    ○番目の検索値より左側を返すユーザー関数です

    /// <summary>
    /// ○番目のキーより左側
    /// </summary>
    /// <returns>さがす文字列より左側</returns>
    /// <param name="source">検索される値</param>
    /// <param name="key">検索値</param>
    /// <param name="nth">何番目の検索値?(1-)</param>
    string StrLeft(string source, string key, int nth = 1)
    {
    	string result = source;
    	if(1 > nth)
    	{
    		result = @"";
    		return result;
    	}
    	int start = 0;
    	int next;
    	for(int i = 1; i < nth; i++)
    	{
    		next = source.IndexOf(key, start, StringComparison.CurrentCultureIgnoreCase);
    		if(0 > next)
    		{
    			break;
    		}
    		result = source.Substring(0, next);
    		start = next + key.Length;
    	}
    	return result;
    }

    Excel

    最初の検索値より左側を返す式はこちらです

    =LET(VVALUE,検索される値,VKEY,検索値,VERROR,エラー時の値,IFERROR(LEFT(VVALUE,FIND(VKEY,VVALUE)-1),VERROR))

    最後の検索値より左側を返す式はこちらです(LETでまとめていません)

    =LEFT(検索される値,FIND(仮の検索値,SUBSTITUTE(検索される値,検索値,仮の検索値,LEN(検索される値)-LEN(SUBSTITUTE(検索される値,検索値,"")))-1)

    Lotus Script 言語

    左側から検索される値を検索します
    文字値 = StrLeft (検索される値,検索値,比較方法,何番目の検索値?)
    文字値 = StrLeft (検索される値,検索値,比較方法)
    文字値 = StrLeft (検索される値,検索値)

    右側から検索される値を検索します
    文字値 = StrLeftBack (検索される値,検索値,比較方法,何番目の検索値?)
    文字値 = StrLeftBack (検索される値,検索値,比較方法)
    文字値 = StrLeftBack (検索される値,検索値)

    比較方法
    0 = 大文字小文字、全角半角を区別します
    1 = 大文字小文字を区別しません
    4 = 全角半角を区別しません
    5 = 大文字小文字、全角半角を区別しません

    戻り値には検索値を含みません
    例: {ABCAB} = Strleft ({ABCABC},{c},1,2)

    Lotus 式言語

    左側から検索される値を検索します
    文字値 = @Left (検索される値,検索値)

    右側から検索される値を検索します
    文字値 = @LeftBack (検索される値,検索値)

    戻り値には検索値を含みません
    例: {AB} = @Left ({ABCABC},{C})

    大文字小文字、全角半角を区別します
    例: {ABCab} = @Left ({ABCabc},{c})

  • [WordPress]投稿を更新日順にする

    [WordPress]投稿を更新日順にする

    ワードブレス(WordPress)の標準テーマ「Twenty Twenty-Five」で、新しい投稿から順に表示されるようにする方法です

    1. WordPressの管理画面へログインします
    2. 左側の「ツール」を選び、右側の「Theme Functions (functions.php)」を選びます
    3. 真ん中のファイルの内容の一番下に次のコードを追加します
    /**
     * 記事の並び順を更新日にする
     */
    function sort_post_asc($query) {
      $query->set( 'orderby', 'modified' );
    }
    add_action( 'pre_get_posts', 'sort_post_asc' );

    テーマ毎のファイルを更新するため、テーマが更新されたり、テーマを変更すると初期化されます

  • [言語比較]値が範囲に納まるか

    [言語比較]値が範囲に納まるか

    値が範囲内に収まるか否かを確認します
    ユーザー関数名をIsRangeやRangeにすることがあります

    C#

    ↓戻り値がTrueなら範囲に収まる、Falseなら収まらないとしています。型はintやdoubleなどにします

    bool 関数名(型 下限, 型 上限, 型 値)
    {
    	if (下限 > 上限)
    	{
    		型 一時的 = 下限;
    		下限 = 上限;
    		上限 = 一時的;
    	}
    	if (下限 > 値)
    	{
    		return false;
    	}
    	if (上限 < 値)
    	{
    		return false;
    	}
    	return true;
    }
    Lotus Script 言語

    ↓戻り値がTrueなら範囲に収まる、Falseなら収まらないとしています。型はLongやDoubleなどにします

    Function 関数名 (下限 As 型, 上限 As 型, 値 As 型) As Boolean
    	関数名 = False
    	If 値 > 上限 Then
    		Exit Function
    	Elseif 値 < 下限 Then
    		Exit Function
    	End If
    	関数名 = True
    End Function

     また Select を使って書くこともできます↓

    Function 関数名 (下限 As 型, 上限 As 型, 値 As 型) As Boolean
    	関数名 = False
    	Select Case 値
    		Case Is > 上限
    			Exit Function
    		Case Is < 下限
    			Exit Function
    	End Select
    	関数名 = True
    End Function
  • [WordPress]サイトアドレスを変更

    [WordPress]サイトアドレスを変更

    既存のWordPressを更改するために、サブフォルダをつくって作成し、最後にURLをドメイン直下へ変更して表示を切り替える方法です

    WordPress >> サイトアドレス (#1)

    WordPress >> 設定 >> 一般 >> サイトアドレス を変更して保存します

    WordPress >> WordPress アドレス (#2)

    WordPress >> 設定 >> 一般 >> WordPress アドレス にある「.htaccess」と「index.php」を取得します

    サイトアドレス (#1) にアクセスしたユーザーを WordPress アドレス (#2) へ

    WordPressは、WordPressが入っている WordPress アドレス (#2) のファイルを更新しますが、その外にある サイトアドレス (#1) を更新しません

    ブラウザーからサイトアドレス (#1) にアクセスしたら、WordPress本体がある WordPress アドレス (#2) を案内する設定が求められます

    index.php

    WordPress アドレス (#2) を案内するファイルです

    サイトアドレス (#1) に index.php がなかったら、WordPress アドレス (#2) からコピペします そして次のところを書き換えます

    (旧)
    require __DIR__ . '/wp-blog-header.php';
     ↓
    (新)
    require __DIR__ . '/サブフォルダ/wp-blog-header.php';

    .htaccess

    優先順位の設定をいれるファイルです

    サイトアドレス (#1) に index.php がなかったら、WordPress アドレス (#2) からコピペします そして DirectoryIndex に続けて index.php を記載して、 index.php が最優先で開かれるようにします

    (旧)
    DirectoryIndex index.html
     ↓
    (新)
    DirectoryIndex index.php index.html

    こちらの記事が参考になるかもしれません:.htaccessファイルの使い方

  • 資本論 (Das Kapital)

    資本論 (Das Kapital)

    著者:カール マルクス (Karl Marx) 1818-1883

    原文:ドイツ語

    資本論 第1巻 (Das Kapital. Erstes Buch) 資本の生産プロセス (Der Produktionsprozeß des Kapitals)

    資本論 第2巻 (Das Kapital. Buch II) 資本の循環過程 (Der Zirkulationsprozeß des Kapitals)

    資本論 第3巻 (Das Kapital. Buch III) 資本主義的生産の全過程 (Der Gesamtprozeß der kapitalistischen Produktion)

    画像は「https://sammlung.staedelmuseum.de/de/werk/portraet-karl-marx」より

    なぜこの投稿をおこなったか

    ブラウザによる機械翻訳がとても優秀だと感じます
    翻訳者を介さないことで、読者に新しい発見があるかもと考えました

  • プログラムをつくれるようになる方法

    プログラムをつくれるようになる方法

    プログラムをつくりませんか?コンピューターの記録やファイルやデータを整理するときに、ちょちょいとプログラムをつくってはお仕事を片付けるのに役立ちます。
     プログラムをつくる能力を身につけるために、具体的にはどんな行動があるでしょうか?…何からはじめたらいいでしょうか?
     プログラムをつくれなくて困っているひとをみかけます。いったい何が最初のプログラムをつくる障害になっているのでしようか。一緒に考えてみましょう。

    プログラムとは?

     プログラムを作れるようになるために、私がおすすめする最初の行動は『プログラムという言葉の意味を調べる』ことです。
     孫子さんがむかし『敵を知り己を知れば百戦あやうからず』と書いています。教科書に長年掲載されているとおもいますので、孫子さんを知っているひとは多いのではないかとおもいます。孫子さんも言っているし…ということで、プログラムという言葉の使用例をネットで検索し、プログラムという言葉の意味を国語辞典や英和辞典などの辞書で調べましょう。

    プログラムという言葉の使用例

     フィギュアスケートのプログラム、運動会のプログラム、海外留学のプログラム、ポイントやマイレージのプログラム、プログラム細胞死、観光立国実現に向けたアクション・プログラム、…コンピューター関連ではない用例がたくさんありますね。

    プログラム(Program)の意味

     番組、予定、計画をたてること、目録、演目、手順を指示したもの、前もって書いたもの、…
     いろいろな意味がでてきました。

    プログラムとはつまり…

     プログラムとは『方法や順番を考えることやその結果できあがったもの』と定義しましょう。何かの記録であって、次の行動に役立てるつもりがないものは、手順を記載してあってもプログラムではないでしょう。
     生活の場でさがしてみると、目的地へ約束の時間に到着するように電車の時間を調べることはプログラムでしょう。持ち物のリストをつくることもプログラムですね。
     料理のレシピもプログラムですが、レシピを読みながら料理をつくることはプログラムを利用しているだけでプログラムではありません。レシピなしにその場で考えながら料理をつくることはプログラムでいいでしょう。

    つくる前の準備

     プログラムを『方法や順番を考えることやその結果できあがったもの』と定義したので、ぢゃあトレーニング…といきたいのですが、そのまえに基礎能力や心身の状態について考えていきましょう。これはとても大切なことで、きちんとやらないと苦労するとおもいます。

    十分な睡眠をとる

     睡眠を十分にとることは最も大切です。私の経験では、睡眠不足のときに書いたプログラムは翌日修正するよりも、破棄して書き直したほうが時間の節約になるくらいです。睡眠は頭脳労働の質に大きな影響を与えます
     睡眠中には記憶の整理がおこなわれるそうなので、効果的に学ぶために十分な睡眠をとりましょう。
     夜の部屋は薄暗い電球色にしたり、パソコンやスマートフォンを使わないようにしたり、眠れないだろうなぁとおもっても毎日同じ時刻に寝る時間を確保しましょう。睡眠に割く時間は今までよりも多めにしましょう。1週間くらい同じような生活をしていると頭がさえてくるとおもいます。

    軽い運動をする

     プログラムをつくることは頭脳労働であると考えます。頭を働かせるための習慣をおこなうことが有効です。お茶やコーヒーなどからカフェインを接種することは有効です。また通勤や昼休みに身体を動かすことも有効です。
     勤務の前に軽い運動を強制するという観点では、公共交通機関を使って通勤することは理にかなっていると感じます。

    辞書をつかう

     この文章は日本語で書いています。ブラウザーの機械翻訳をとおして日本語ではない言語で読むひとがいるかもしれませんが、日本語で読まれることが圧倒的に多いでしょう。
     誰かの知恵を教えてもらうには言葉を使うことが多いとおもいます。言葉を気にかけることはとても大切です。教えるひとは知恵を言葉に変換して伝えます。教わるひとは言葉を知恵に逆変換します。この2回の翻訳の出来によって伝わる知恵の質に影響を与えます。
     教えるひと教わるひとの言葉のひとつひとつの意味が違っていたとしたら知恵が正しく伝わりません。日本語を英語に翻訳したものを日本語に再翻訳するとデタラメな文章になることがあります。これに近いことを日常的な言葉のやりとりでおこなっていたとしたら、知恵を教えてもらうのはとても難しいことです。
     少しでも知恵を正しく受け取るには国語辞典が役に立ちます。よく理解できなかったことや、何で?と感じた言葉をひとつひとつ国語辞典で確認するとよいでしょう。言葉の知らなかった意味を発見することがあるかもしれません。

    シンプルなツールを用意する

     短期間でプログラムをつくれるようになろうとしていますので、あらたに使い方を覚えなければならない高機能なツールは最小限にしましょう。Windowsのメモ帳でプログラムをつくれるならそれでじゅうぶんです。高機能エディターや統合開発環境の使いかたを覚えるのは時間の無駄でしかありません
     ツールを選ぶことができるのなら心にとめておくとよいでしょう。

    評価を聞く耳を持つ

     こっそりプログラムをつくるのでなければ、誰かに見せたり使わせたりするとおもいます。仕事でプログラムをつくるのなら、良い評価を得ることがある反面、安定動作しなければ批判を浴びることもあるでしょう。あなたが全力で創り上げたプログラムは多くのひとから評価・批判されることになります。
     プログラムに限らず、仕事で創作をすると様々な評価を聞くことになります。評価されることを避けながら創作を続けるのは難しいとおもいます。評価・批判されることは、あなたの創作物に興味を持ったということです。前向きに考えて創作に生かしましょう。

    ちからを伸ばす方法あれこれ

     目的を達成する方法はひとつとは限りません。『方法や順番を考えること』はプログラムそのものです。さあプログラムをつくるちからを伸ばすプログラムを一緒に考えましょう。

    テレビをみる

     子ども向けの教育番組は考えるちからを伸ばすためにいろいろなことをやってくれます。おとながみても楽しい番組もあります。例えば次の番組は制作にちからがはいっていて、気づかせてくれるものがあるとおもいます。

    ピタゴラスイッチ - 4~6歳児を対象にした「考え方」を育てる番組

     子ども向けの教育番組で、映像をたくさん使って教えてくれます。おとながみても楽しいTV番組でしょう。

    積み木をする

     小さい子と一緒に積み木で遊びましょう…とは言いません。
     コンピューターのプログラムは積み木と共通するところがあります。コンピューターの回路はごく単純な計算やデータのコピーといった基本的なことしかできません。それらを組み合わせることで複雑なことをやっています。
     実際にプログラムをつくる場面でも、プログラム言語が用意した言葉を使って新しい言葉をつくります。基本的なものを組み合わせて新しいものをつくりあげるところは積み木と共通します。
     いろいろなものを組み合わせる習慣をつけることはプログラムをつくるために役にたつとおもいます。

    イメージトレーニングする

     プログラムをつくることが上達への近道だとおもいますが、つくれないひとに向かって『まずはつくってみたら?』というのはおかしいです。まずはイメージトレーニングをしてみましょう。プログラムをつくっているイメージを膨らませることならできるかもしれませんね。
     とても短いプログラムはお約束の部分を除くと1行から数行になることが多いとおもいます。ハローワールドとメッセージを出力するだけのプログラムを見かけることがあります。いつも同じように書くお約束の部分はコピペできるようにメモっておけばいいでしょう。

     それではハローワールドとメッセージを出力する部分を詳しく見ましましょう。Lotus Scritでは『Print “ハローワールド”』、 Lotus 式言語では『@StatusBar (“ハローワールド”)』、 VBScriptでは『WScript.Echo “ハローワールド”』、 C#では『using System; Console.WriteLine(@”ハローワールド”);』、 C++では『#include <iostream>; using namespace std; cout << “ハローワールド” << endl;』

    のようになります。
     はい、見てわかるとおもいますが言語によってバラバラです。そこはよしとして、注目すべきなのは 命令を使うためのお約束、命令、ハローワールドを囲う記号、ハローワールド、行末のお約束 というようにプログラムは細かいものの組み合わせになっていると気づくことが大切です。細かいものを組み合わせて行をつくり、行を組み合わせてひとまとまりの章になります。その全体がアプリケーションという単体で動くプログラムになります。
     最初からスラスラと作っていけるものではないので、一行つくるのに何時間もかかったり、ひとつの機能をつくるのに何日もかかったとなげく必要はありません。それが普通だとおもってください。

    知識を得る

     インターネット、本やYouTubeなどから知識を得ることができます。でも知識を得ることに熱中しないでください。方法や順番を考えるちからを伸ばすことがもっとも大切なことで、知識を得ることは目的から外れます。

     考えてみてください、知識があればプログラムをつくれるようになるでしょうか?私はそのようにおもいません。
     すでになんらかのプログラムをつくったことがあるひと、すでにプログラムをつくる能力が備わっているひとであれば、別の言語や環境でプログラムをつくるときに言語の特徴やエディターの使い方などの新しい知識を得る必要があるでしょう。こういうときでも言語ひとつひとつの関数を覚えることはしません。使う関数の詳細な仕様は繰り返し調べるようにしています。記憶ってあまり正確ではないと感じています。

    そのほか

     ほかにはどんな方法があるでしょうか?
    皆さんも考えてみてください…

     わたしが教えてきた経験から言わせていただくと。。「プログラムをつくれるようになりたい」という強いおもいから、基本情報技術者試験のような検定試験の勉強をする方向へちからを集中してしまったひとは想いを遂げられない。。。と感じています。 もしかしたら壁が高すぎたから試験勉強に逃げたのかもしれませんが本当のところはわかりません。

     プログラムをつくれるようになるために細部にまで目を向けて繰り返し練習することが大切です。勉強とはちょっと違うと感じています。

     近ごろはブラウザにAIの回答がでてきますね。でもプログラミングに関しては参考にできないと感じます。表面上の文章はきちんとしていますが、論理的思考で推論していない感じが強く感じられてモヤモヤします。 「知識が豊富だけれど経験がないひと」という比喩で伝わりますでしょうか。

  • [言語比較]Err,Erl,Error : エラーを処理

    [言語比較]Err,Erl,Error : エラーを処理

     実行時エラー(ランタイムエラー)が発生したときにどうするのか?というものです。

    Lotus Script 言語

    • Err : エラーが発生すると、エラー番号(数値)が入ります
    • Erl : エラーが発生すると、ソースコードの何行目という場所(数値)が入ります
    • Error : エラーが発生すると、エラーメッセージが入ります

    Err, Erl, Error は常に存在します

    エラーが発生したときにどうするか定義します
    On Error Resume Next
    On Error Goto ラベル

    例:

    On Error Goto ラベル
     処理
     Exit Sub ' または Exit Function や Exit Property
    ラベル:
     エラー処理
     Resume Next ’ エラーの次の行へ戻る

     エラーが発生したときに『何もせず異常終了する』というときは次のようにします。この行より先はエラー対応をしません。

    On Error Goto 0

    似ている命令
    On 番号 Goto ラベル1, ラベル2, ... ’ 番号によって異なるラベルへ制御を移す命令です。番号がゼロのときは何もしません
    例 : On Err Goto ラベル ’ Err 変数の値(初期値は0)によってラベルへ制御を移します
    On 番号 Gosub ラベル, ・・・もあります。

    VBA 言語

    • Err.Number : エラーが発生すると、エラー番号(数値)が入ります
    • Err.Source : エラーが発生した場所の名前が入ります
    • Err.Description : エラーが発生すると、エラーメッセージが入ります

    初期化
    Call Err.Clear ()
     ※ On Error や Exit でも Err が初期化されます

    On Error Resume Next と、On Error Goto が使えます

    On Error Goto ラベル:
    ・・・
    ラベル:
    ・・・
    On Error Resume Next

    注意
    最初の On Error より前は Err オブジェクトが存在しません

    VbScript 言語

    • Err.Number : エラーが発生すると、エラー番号(数値)が入ります
    • Err.Source : エラーが発生した場所の名前が入ります
    • Err.Description : エラーが発生すると、エラーメッセージが入ります

    初期化
    Call Err.Clear ()
     ※ On Error や Exit でも Err が初期化されます

    On Error は Resume Next だけで、On Error Goto は使えません
    On Error Resume Next

    注意
    最初の On Error より前は Err オブジェクトが存在しません

    例:

    On Error Resume Next
    Call Err.Clear ()
     処理
     If 0 <> Err.Number Then
      エラー処理
      Call Err.Clear ()
     End If

    Lotus 式言語

    • @IsError (評価式) : 評価式がエラーを返すと @True になります
    • @IfError : 廃止されました。「何がエラーなのか」というところが @IsError と異なりました

    例 : @If (@IsError (評価式); エラー時の式; 正常時の式);

  • ディレクトリを削除

    ファイルとディレクトリ(フォルダ)を削除します

    Windows コマンドプロンプト

    rmdir /s /q ディレクトリ
  • ファイルをコピー

    Windows コマンドプロンプト

    robocopy

    ファイル名をそのままにコピーします 不足するディレクトリは作られます

    robocopy 元パス 先パス ファイル名 /XL /XO /XX /R:0
    /XL : コピー先にないファイルを除外
    /XX : コピー元にないファイルを除外
    /XO : コピー先が新しいものを除外

    xcopy

    ファイル名を変えてコピーできます

    xcopy コピー元 コピー先

    xcopyから「先は受け側のファイル名ですか、またはディレクトリ名ですか(F=ファイル、D=ディレクトリ)?」とたずねられることがあります 1回応答するだけなら次のように対応することができます

    echo 応答|xcopy コピー元 コピー先
    応答は「F」や「D」

    copy

    ファイル名を変えてコピーできます

    copy コピー元 コピー先

  • [言語比較]プログラムのファイルパス

    [言語比較]プログラムのファイルパス

     今動いているプログラムファイルのパス(ディレクトリとファイル)を取得してみましょう。現在のプログラムファイルであって、カレントディレクトリとは異なります

    Windows コマンドプロンプト

    %~dp0
    末尾に\マークが付きます

    C#

     いくつかの方法があります。プログラムを使用する環境で正しい値が返ってくることを確認しましょう

    // .NET5 以降のばあい(ディレクトリのみ)
    using System;
    string ディレクトリ = System.AppContext.BaseDirectory;

     カミュプリィがつくった次のプログラム↓は、↑この方法を使っています

    // プロセスを使う方法
    using System.Diagnostics;
    string パス = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
    // フォームを使う方法(コンソールアプリ可)
    using System.Windows.Forms;
    パス = Application.ExecutablePath;
    // コマンドラインを使う方法
    // デバッグでは *.dll になり、単一ファイルにまとめると *.exe になる
    using System;
    using System.IO;
    c.IO.FileInfo ファイル = new System.IO.FileInfo(System.Environment.CommandLine.Replace("\"", "")); // パラメータがないと仮定
    string パス = System.IO.Path.Combine(ファイル.DirectoryName, ファイル.Name);
    // 与えられた情報を使う方法
    // デバッグでは *.dll になり、単一ファイルにまとめるとブランクになる
    using System.Reflection;
    パス = System.Reflection.Assembly.GetExecutingAssembly().Location;

    Python

     CGIとCronで共通のパスを取得できませんでした。詳しくは次の記事にまとめてあります↓

    Lotus Script

     ノーツドミノではデータベースにプログラムが含まれますので、データベースのパスを取得します

     データベースのファイル名に日本語を使うと、環境によって問題が起こることがあります。また&記号を使うと、検索で問題が起こることがありますので注意しましょう

    バックエンド

     Lotus Script には普遍的な方法と、ユーザーインターフェース(UI)から取得する方法のふたつがあります。ここでは便宜的に、普遍的な方法をバックエンドといい、ユーザーインターフェースをフロントエンドといいます

     ↓次はバックエンドの方法です。フロントエンドでも動きます

    Dim セッション As New NotesSession()
    パス = セッション.CurrentDatabase.FilePath

    フロントエンド

     ↓こちらはユーザーインターフェース(UI)から取得する方法です

    Dim ユーザーインターフェース As New NotesUIWorkspace()
    パス = ユーザーインターフェース.CurrentDatabase.FilePath

    Lotus 式言語

     式言語では、Lotus Script でいうフロントエンドしかありません

    パス = @Subset(@DbName; -1);

     @DbNameは{サーバー; パス}を複数値で戻します。ここから最後のひとつの値を得るために@Subset(; -1)を使います

  • ディレクトリがある?

    C#

    true/false = System.IO.Directory.Exists(パス);
  • [C#]プログラムを呼び出すときの引数

    次のようにコマンドライン引数を参照できます

    string[] args = System.Environment.GetCommandLineArgs();
    int i = 0;
    foreach (string arg in args)
    {
    	System.IO.File.AppendAllText(ログファイルパス, ++i + @") " + arg + System.Environment.NewLine);
    }
    
    ↓
    
    1) ドライブ:ディレクトリ\ファイル名
  • [言語比較]Call : 関数を呼ぶ

    [言語比較]Call : 関数を呼ぶ

    コマンドプロンプト

    Call ファイル名 : 呼び出すバッチと呼び出されるバッチで変数を共有します

    ファイル名 : 変数を共有しない呼び出しで、制御が戻ってきません

    Start ファイル名 : 呼び出したら待たずに次へ進みます

    Lotus Script 言語

    () は省略できることが多いです
    Call を省略するときは () も省略します
    Call だけ省略し () を付けると、意味が変わります
    次のとおり色々な書き方ができます

    受け渡し値がないとき

    • Call 関数名 ()
    • Call 関数名
    • 戻り値 = 関数名 ()
    • 戻り値 = 関数名
    • 関数名

    受け渡し値があるとき(関数側の ByVal/ByRef 設定どおり)

    • Call 関数名 (受け渡し値)
    • Call 関数名 受け渡し値
    • 戻り値 = 関数名 (受け渡し値)
    • 関数名 受け渡し値

    これはエラーになります

    • 戻り値 = 関数名 受け渡し値

    受け渡し値があるとき(常に ByVal を強制)

    • 関数名 (受け渡し値) ’ Call を省略して () を付けます

    VbScript 言語

    Call を付けるときは () も付けます
    Call を省略するときは () も省略します
    Call だけ省略し () を付けると、意味が変わります
    次のとおり色々な書き方ができます

    受け渡し値がないとき

    • Call 関数名 ()
    • 戻り値 = 関数名 ()
    • 関数名

    受け渡し値があるとき(関数側の ByVal/ByRef 設定どおり)

    • 戻り値 = 関数名 (受け渡し値)
    • Call 関数名 (受け渡し値)
    • 関数名 受け渡し値

    受け渡し値があるとき(常に ByVal を強制)

    • 関数名 (受け渡し値) ’ Call を省略して () を付けます

    クラスの値を受け渡すと動作が変わります(アクセス権がどうの)

    クラス名.パラメータ = 値
    関数名 (クラス名.パラメータ) ’ クラス名.パラメータの値は変化しません
  • [Windows]レジストリを検索

    レジストリエディタ (regedit) の検索機能を使うか、すべてのレジストリを *.reg 形式で書き出したものを type *.reg|find /i”検索値”>ログ.txt とします

  • [Windows]ファイル名を作成日にする

    作業証跡として画面ハードコピーした画像ファイルなど、似たようなファイルか大量にあるときはファイル名がまとめて一括で作成日に変更できたらいいなとおもうことがあります

    そんな要望があったため「ファイル名を作成日にする.exe」をつくってしまいました

    [Windows]画像ファイル名を作成日にする

  • [言語比較]Class : クラスをつくる

    [言語比較]Class : クラスをつくる

     Lotus Scriptのクラスは、VBScriptと異なっているところが多いです。

    Lotus Script 言語

    Class クラス名 As 元クラス ’別のクラスから引き継ぐことができます

     ’最初に実行されます
     Sub New (変数名 As 型).元クラス (変数名 As 型) ’値を受け取ることができます
     End Sub

     ’最後に実行されます
     Sub Delete ()
     End Sub

     Public Sub 戻り値がない関数名 (変数名 As 型)
     End Sub
    ‘使うときは「Call クラスオブジェクト.関数名(値)」です

     Public Function 戻り値がある関数名 (変数名 As 型) As 型
      Me.戻り値がある関数名 = 戻り値 ’値を返します
     End Function
    ‘使うときは「値 = クラスオブジェクト.関数名(値)」です
    ‘または「Set 値 = クラスオブジェクト.関数名(値)」です

     Public Property Set プロパティ名 As 型 ‘ Lotus Script では Let は Set に統合されています
      変数名 = Me.プロパティ名 ’値を受け取ります
      (または) Set 変数名 = Me.プロパティ名 ’値を受け取ります
     End Property
    ‘使うときは「クラスオブジェクト.プロパティ名 = 値」です
    ‘または「Set クラスオブジェクト.プロパティ名 = 値」です

     Public Property Get プロパティ名 As 型
      Me.プロパティ名 = 戻り値 ’値を返します
     End Property
    ‘使うときは「値 = クラスオブジェクト.プロパティ名」です
    ‘または「Set 値 = クラスオブジェクト.プロパティ名」です

    End Class

     何も指定しないと Private、ByRef になります。
     現在のクラスのなかで現在のクラスで定義された関数・プロパティ・変数を使うには、名前の先頭に Me. をつければOKです

    VbScript 言語

    Class クラス名 ’独立したクラスとして作成します

     ’最初に実行されます
     Sub Class_Initialize () ’値を受け取れません
     End Sub

     ’最後に実行されます
     Sub Class_Terminate ()
     End Sub

    Sub 戻り値がない関数名 (変数名)
    End Sub
    ‘使うときは「Call クラスオブジェクト.関数名(値)」です

    Function 戻り値がある関数名 (変数名)
     戻り値がある関数名 = 戻り値 ’値を返します
    End Function
    ‘使うときは「値 = クラスオブジェクト.関数名(値)」です
    ‘または「Set 値 = クラスオブジェクト.関数名(値)」です

    Public Property Set プロパティ名 ’Set はオブジェクトを受け取ります
     Set 変数名 = プロパティ名 ’値を受け取ります
    End Property
    ‘使うときは「Set クラスオブジェクト.プロパティ名 = 値」です

    Public Property Let プロパティ名 ’Let はオブジェクト以外を受け取ります
     変数名 = プロパティ名 ’値を受け取ります
    End Property
    ‘使うときは「クラスオブジェクト.プロパティ名 = 値」です

    Public Property Get プロパティ名
     プロパティ名 = 戻り値 ’値を返します
    End Property
    ‘使うときは「値 = クラスオブジェクト.プロパティ名」です
    ‘または「Set 値 = クラスオブジェクト.プロパティ名」です

    End Class

     なにも指定しないと Public、ByRef になります。
     現在のクラスで定義されたプロパティをつかうときに、名前の先頭に Me. をつけるときがあります

    VBA (for Excel, Word など)

     VBAのクラスは Visual Basic Editor のメニューの挿入からクラスモジュールを選ぶことで作成できます。ひとつのページ(?)に複数のクラスを記述することができません
     クラスをエクスポートすると、次のようなヘッダーが付いてきます
     ここに記述したものすべては単一のクラス内のものとして扱われます

    VERSION 1.0 CLASS
    BEGIN
    MultiUse = -1 'True
    END
    Attribute VB_Name = "クラス名"
    Attribute VB_GlobalNameSpace = False
    Attribute VB_Creatable = False
    Attribute VB_PredeclaredId = False
    Attribute VB_Exposed = True
    
    (ここに関数ほかを記述します)
    ’最初に実行されます
    Private Sub Class_Initialize() ’値を受け取れません
    End Sub
    '使うときは「New クラス名」です
    ’最後に実行されます
    Private Sub Class_Terminate()
    End Sub
    '使うときは「Set クラス変数 = Nothing」です
    Public Sub 戻り値がない関数名(変数名) ' 複数の変数を指定するときはカンマ(,)で区切ります
    End Sub
    '使うときは「Call クラスオブジェクト.関数名(値)」です
    'または「Call クラスオブジェクト.関数名(変数名:=値)」です
    Public Function 戻り値がある関数名(変数名)
    	戻り値がある関数名 = 戻り値 ’値を返します
    End Function
    '使うときは「値 = クラスオブジェクト.関数名(変数名)」です
    'または「Set 値 = クラスオブジェクト.関数名(変数名)」です
    Public Property Get プロパティ名
    	プロパティ名 = 戻り値 ’値を返します
    End Property
    '使うときは「値 = クラスオブジェクト.プロパティ名」です
    Public Property Let プロパティ名(変数名) ’Let はオブジェクト以外を受け取ります
    	変数名 = プロパティ名 ’値を受け取ります
    End Property
    '使うときは「クラスオブジェクト.プロパティ名 = 値」です
    Public Property Set プロパティ名(変数名) ’Set はオブジェクトを受け取ります
    	Set 変数名 = プロパティ名 ’値を受け取ります
    End Property
    '使うときは「Set クラスオブジェクト.プロパティ名 = 値」です

  • [Java]パッケージjakarta.servletは存在しません

     javacでコンパイルするとき『-classpath “%CATALINA_HOME%\lib\servlet-api.jar”』を追加してみましょう。

     なお『import javax.servlet』は『import jakarta.servlet』に変更になっています。

  • [言語比較]切り上げ・切り捨て・四捨五入

    [言語比較]切り上げ・切り捨て・四捨五入

    Excel

     切り上げ

    =ROUNDUP(数値,桁数)
     「数値」:切り上げしたい数値または、セルの位置を指定します。
     「桁数」:切り上げしたい桁数を指定します。

    切り捨て

    =ROUNDDOWN(数値,桁数)
    =TRUNK(数値,桁数)
     「数値」:切り捨てしたい数値またはセルの位置を指定します。
     「桁数」:切り捨てしたい桁数を指定します。※桁数のあつかいに関しては、ROUND 関数と同様です。
    
    =INT(数値)
    =TRUNK(数値)
     小数点以下の数値を切り捨てて整数にするときに使う関数です。

    四捨五入

    =ROUND(数値,桁数)
     「数値」:四捨五入したい数値または、セルの位置を指定します。
     「桁数」:四捨五入したい桁数を整数で指定します。指定した桁数のひとつ下の桁が四捨五入されます。

    Java

    整数除算

    整数 = 整数 / 整数;
     整数(intやlong)同士の割り算(/)の結果は整数になります

    Lotus Script

    切り捨て

    整数 = Fix(数値)
     絶対値が小さい方向に丸めます
     (例)98 = Fix(98.7)
     (例)-98 = Fix(-98.7)
    整数 = Int(数値)
     値が小さいほうに丸めます
     (例)98 = Fix(98.7)
     (例)-99 = Fix(-98.7)

    整数除算

    数値 = 整数 ¥ 整数
     ¥(エンマーク)での割り算は、割り算をする前に値を整数にします
     3÷3.3は、3÷3としてから割り算されます

    Lotus 式言語

    切り捨て

    整数 = @Integer(数値)
  • [C++]今の日時を取得

    はじめに

     今の日付と時刻を知りたいとおもったことはありませんか。いくつか方法を記載します。
     ユーザー定義の変数名は日本語にしています。メリハリがあるとコードが読みやすいかなぁとおもったので。
     サンプルでは『using namespace std;』を省略していますので、コードを試すときはこの行をおぎなってください。

    経過秒』を time_t 形式で取得

     とりあえず time_t 形式にします。これは『1970/01/01 00:00:00 UTC からの経過秒』です。
     32ビットシステムでは 2038/01/19 03:14:07 まで表現できるそうです。もうすぐトラブルが発生しそうな予感がしますね。64ビットシステムへの移行が必要です。

    now()を使う方法

    #include <chrono>
    chrono::system_clock::time_point 日時 = chrono::system_clock::now();
    time_t 経過秒 = chrono::system_clock::to_time_t(日時);

    time(nullptr)を使う方法

    #include <chrono>
    time_t 経過秒 = time(nullptr);

     『nullptr』を使うことが推奨されているようですが、かわりに『NULL』や『0』を使うこともできます。

    構造体 tm 形式へ変換

     先ほど求めた経過秒(time_t)を今の日時 (struct tm) にします。今の日時といっても色々ありますが、協定世界時 (UTC,GMT) へ変換するものと、現地時間(ローカルタイム)へ変換するものを記載します。

    協定世界時へ

    struct tm 今の日時;
    gmtime_s(&今の日時, &経過秒);

    現地時間(日本時間)へ

    struct tm 今の日時;
    localtime_s(&今の日時, &経過秒);

    今の日時 (struct tm) を文字の日時 (char[])へ

     今の日時を文字として整形してみましょう。日付の文字列は国によって異なりますが、今回は日本の形式にします。
     ・日本 : //日
     ・イギリス : 日//
     ・アメリカ : /日/
     国によって日付の並び順が異なりますが、何だか話す順番に通じるものがあるような気がします。

    char型の『年/月/日 時:分:秒』へ

    char 文字の日時[128];
    strftime(文字の日時, 128, "%Y/%m/%d %H:%M:%S", &今の日時);

     char[128] では sizeof(char[128]) が128になります。strftime(文字の日時, sizeof(文字の日時), … としても大丈夫そうです。

    wchar_t型の『年/月/日 時:分:秒』へ

    wchar_t 文字の日時[128];
    wcsftime(文字の日時, 128, L"%Y/%m/%d %H:%M:%S", &今の日時);

     wchar_t[128] では sizeof(wchar_t[128]) が 256 になります。wcsftime(文字の日時, sizeof(文字の日時), … とはできませんね。

    さいごに

     コード全体を書いてみましょう。

    #include <chrono>
    using namespace std;
    time_t 経過秒 = time(nullptr);
    struct tm 今の日時;
    localtime_s(&今の日時, &経過秒);
    char 文字の日時[128];
    strftime(文字の日時, 128, "%Y/%m/%d %H:%M:%S", &今の日時);
    cout << "今は " << 文字の日時 << endl;
    
  • [Windows]UTF-8のファイルを簡単につくる方法

     フォルダの空いているところでマウスの右ボタンをクリックし、[新規作成]-[テキスト ドキュメント]を選びます。

     ちなみにメモ帳を新しく開くと『ANSI』のこともあれば『UTF-8』のこともありました。でも、今みると『UTF-8』でした!パソコンによって異なるのかなぁ?

  • [言語比較]今の日時

    [言語比較]今の日時

     ほとんどの命令はコードを実行しているコンピュータの日時を返します

    Java

    import java.util.Calendar;
    Calendar 日時値 = Calendar.getInstance();

    Java Script

    日時 = New Date();

    Lotus Script

    Dim 日時値 As Variant
    日時値 = Now

    Lotus 式言語

     コードを実行しているコンピュータの日時の他に、サーバーの日時を取得する方法が用意されています

    日時値 = @Now
    Rem {実行環境の日時を取得}
    サーバーの日時値 = @Now([SERVERTIME]:[LOCALTIMEONERROR])
    Rem {サーバーの日時を得られないときはクライアントの日時を取得}

    C++

    #include <chrono>
    time_t 経過秒 = time(nullptr);

     くわしくはこちらの記事に記載しています↓

  • [Domino]ノーツドミノとは

    [Domino]ノーツドミノとは

    ノーツドミノとは

     ノーツドミノとはコンテンツマネジメントシステム(CMS)のひとつです。
     文字コードが異なる複数の国の文字をひとつの文書に表示するためにロータスマルチバイト文字セット (LMBCS) というノーツ固有のユニコードが使われ、文書を保存・検索するためにつくられた付属のデータベースに保存されます。
     機密文書を扱えるように表示・編集などのセキュリティは非常に細かく、やろうとおもえば段落ごとに設定することができます。

     ノーツドミノに付属するデータベースは分散型で、国・企業や言語が異なるサーバにも情報を複製して配置でき、ひとつのサーバが止まってもクライアントがサーバを切り替えて業務を継続できます。

     厳密には『ドミノ(Domino)』がサーバーソフトウエアで、『ノーツ(Notes)』がクライアントソフトウエアになります。クライアントソフトウエアには、ブラウザーやスマートフォンからサーバーにアクセスする『ノマド(Nomad)』があります。

     また、ノーツドミノはアプリケーションを開発・実行するアプリケーションプラットホームでもあります。開発環境は専用ソフトをパソコンにインストールして使います。オブジェクト指向言語によるプロコード開発だけでなく、マウスで選択していくノーコード開発や、関数を使ったローコード開発もできます。
     統合開発環境(IDE)は Eclipse をベースにしたデザイナー(Domino Designer)や、ブラウザーアプリを簡単に開発するためのリープ(Domino Leap)があります。

     ドミノはメールの送受信や中継をするメールサーバでもあります。コンテンツマネジメントシステム(CMS)としてメールをデータベースに蓄積することや、アプリケーション開発プラットホームとしてメールを受信や中継するタイミングで動くアプリケーションを開発することができます。

     ノーツドミノに付属または作ったアプリケーションが、グループウエアとして皆で協力して業務を進めるツールになります。グループウエアといえばノーツと言われた時期があります。

    用途

     ノーツドミノは次の用途で企業や企業グループ向けに使われます。

    • 有用な社内文書を蓄積・分類・共有・検索ができます
    • 少ないコストで業務アプリをつくれます
    • 電子申請(ペーパーレス)ができます
    • 社内外のメールの送受信と蓄積・分類・共有・検索ができます
    • メールのように、文書に添付ファイルを添えて保存できます

    終わったか?

     近ごろもノーツドミノ話題として、『ノーツドミノが終わった』『ノーツドミノのサポートが終わった』というお話を聞くことがあります。これは10年前に発売された古いバージョンのサポートが終わったという意味です。新しいバージョンは出続けていますし、当然にサポートがあります。

    高いか?

     他にも『ノーツドミノのライセンスが高い』というお話しを聞きます。ノーツドミノはIDあたり月950円です。(HCL Dominoの価格(料金・費用) – ITreview
     実際にノーツドミノからシェアポイントやセールスフォースへ移行したお客様のお話しでは『ノーツドミノのライセンスは安かった』と聞いています。ノーツドミノは開発環境やデータベースまで含んだオールインワンのソフトウエアで、追加のライセンスなしで使えます。後付けされたリープやセームタイム(Sametime)には別途ライセンスが必要だったとおもいますが、これが無ければ使えないものではありません。
     ノーツドミノ以外の良く比較されるソフトウエアは単機能であることが多いため複数の製品を組み合わせて使います。(SharePoint Online のオプションの比較 – Microsoft) それぞれにライセンス料がかかるため『トータルではノーツドミノが安い』となります。
     開発や維持管理までお話しを拡げると、ノーツドミノはノーツドミノを知れば使いこなせます。 複数のソフトウエアを組み合わせると、それぞれの製品を知ることはもちろんですが、組み合わせによってできる/できないというところまでわからないと使いこなせないため必要なエンジニアの数が激増します。 エンジニアの人件費合計も『ノーツドミノは安い』となります。

    実際のところノーツはいくらするの?

     ノーツドミノを導入するといくらかかるかコストを試算してみましょう。

    ライセンス料金

     ライセンスは月950円ですから、年11,400円になります。

    サーバー料金

     サーバーはIntel(AMD不可)の2コアCPUと8GBメモリーと3GBの空きディスク容量があればOKです。(システム要件 – HCL Domino

    VPS

     プロバイダのVPSを使えばインターネット経由でアクセスできます。
     例えば、さくらのVPS W8Gプラン(メモリ8GB、SSD400GB)なら要件を満たし、年107,690円になります。(さくらのVPS for Windows Server

    ミニPC

     ミニPCなら10万円で買えるものがありますし、ディスクが少ないモデルでは3万円でも買えそうです。
     社内にミニPCを置くことになるとおもいますが、インターネットからアクセスするばあいは固定IPアドレスが必要になります。

    クラウド

     Amazon・Google・Microsoftなどのクラウドでもノーツドミノは動きますが、金額の試算が難しいためここでは言及しません。

    エンジニアの料金

     最初の導入や、プロコードを使った複雑な業務アプリケーションをつくるのはエンジニアにやってもらったほうがいいと考えます。

     最初の導入でやってもらう内容をギュッと厳選すれば、過去には2日でおこなった実績があります。

     業務アプリケーションの開発では、内容によって幅が広いですが、ひとつ5日くらいでしょうか。

     エンジニアが月120万円くらいなので、1日なら6万円くらいです。週1日でお願いすると年300万円くらいになります。
     アシスタントエンジニアなら半額くらいになるとおもいますが、高度なことができなかったり、エンジニアよりも時間がかかって割高になるため注意しましょう。
     経験では、エンジニアとアシスタントエンジニアを組み合わせると割安になります。

    ノーツの合計金額

     それではノーツドミノを使うといくらかかるか総コストを出してみましょう。

    自力で構築・運用するばあい

     さくらのVPS W8Gプランのばあいでは、ひとりで使うなら年119,090円5人で使うなら年164,690円(ひとりあたり年32,938円)、10人で使うなら年221,690円(ひとりあたり年22,169円)、100人で使うなら年1,247,690円(ひとりあたり年12,477円)になります。

     10万円のミニPC(電気代含まない)を3年間使ったばあいでは、ひとりで使うなら年44,733円5人で使うなら年90,333円(ひとりあたり年18,067円)、10人で使うなら年147,333円(ひとりあたり年14,733円)、100人で使うなら年1,173,333円(ひとりあたり年11,733円)になります。

     これでライセンスとサーバーが用意できましたので、ノーコードやローコードなどを使って一般ユーザーが頑張れば業務アプリケーションをつくることができます。文章の共有は十分できます。
     外部のエンジニアに頼らずに開発と管理をする企業がありますので、十分に現実的です。

    少しだけエンジニアに頼るばあい

     次のように最初の導入と技術支援をエンジニアに依頼したばあいはいくらになるでしょうか。

    • 導入で、エンジニアとアシスタントエンジニアが2日で18万円、5年償却
    • 維持管理と業務アプリケーション開発支援で、エンジニアとアシスタントエンジニアが月1日で月9万円

     さくらのVPS W8Gプランのばあいでは、ひとりで使うなら年1,235,090円5人で使うなら年1,280,690円(ひとりあたり年256,138円)、10人で使うなら年1,337,690円(ひとりあたり年133,769円)、100人で使うなら年2,363,690円(ひとりあたり年23,637円)になります。

     10万円のミニPC(電気代含まない)を3年間使ったばあいでは、ひとりで使うなら年1,160,733円5人で使うなら年1,206,333円(ひとりあたり年241,267円)、10人で使うなら年1,263,333円(ひとりあたり年126,333円)、100人で使うなら年2,289,333円(ひとりあたり年22,893円)になります。

    表にまとめてみました

     これらを次の表にまとめました。

    サーバーエンジニア1人5人10人100人
    さくらのVPS W8Gプラン頼まない年119,090円年164,690円(ひとりあたり年32,938円)年221,690円(ひとりあたり年22,169円)年1,247,690円(ひとりあたり年12,477円)
    さくらのVPS W8Gプラン導入と支援年1,235,090円年1,280,690円(ひとりあたり年256,138円)年1,337,690円(ひとりあたり年133,769円)年2,363,690円(ひとりあたり年23,637円)
    10万円のミニPC 3年償却頼まない年44,733円年90,333円(ひとりあたり年18,067円)年147,333円(ひとりあたり年14,733円)年1,173,333円(ひとりあたり年11,733円)
    10万円のミニPC 3年償却導入と支援年1,160,733円年1,206,333円(ひとりあたり年241,267円)年1,263,333円(ひとりあたり年126,333円)年2,289,333円(ひとりあたり年22,893円)

    関連

    関連する記事はnoteにもあります。

    ノーツのサポートが終わるというけれど。。。

  • [言語比較]Asc,Uni,String,Chr,UChr,UString : 一文字を文字コードへ、またはその反対へ

    [言語比較]Asc,Uni,String,Chr,UChr,UString : 一文字を文字コードへ、またはその反対へ

    Lotus Script 言語

    • 数値 = Asc (プラットフォーム固有の文字値)
    • 数値 = Uni (ユニコード文字値)
    • プラットフォーム固有の一文字値 = Chr (数値)
    • プラットフォーム固有の一文字値 = String (1, 数値)
    • ユニコードの一文字値 = UChr (数値)
    • ユニコードの一文字値 = UString (1, 数値)
      Asc,Chr で扱う数値の範囲は 0 ~ 255
      String は一バイト文字または二バイト文字のコードのどちらでも使用できます
      Uni,UChr,UString で扱う数値の範囲は 0 ~ 65,535

    エラーになる例
    Asc (長さがゼロの文字値)
    Asc (Null値)
    UString (1, -1)
    UString (1, 65536)

    VbScript 言語

    • 数値 = Asc (文字値)
    • 一文字値 = Chr (数値)

    Lotus 式言語

    • 文字値 = @Char (数値)
    • 文字の複数値 = @Char (数の複数値)
    • 改行 = @Char (10)
    • タブ = @Char (9)
      数値の範囲は 0 ~ 255

    注意
    @Ascii は Asc とは異なります
    @Ascii はロータスマルチバイト文字セット (LMBCS) を ASCII文字にする関数です

  • [言語比較]StrCompare : 文字列を比較

    [言語比較]StrCompare : 文字列を比較

    Lotus Script 言語

    • 数値 = StrCompare (文字列1, 文字列2) ‘ 別名として StrComp があります
    • 数値 = StrCompare (文字列1, 文字列2, 比較方法)

    比較方法
    0 = 大文字小文字、全角半角を区別します
    1 = 大文字小文字を区別しません
    2 = プラットフォームの並び順で比較
    4 = 全角半角を区別しません
    5 = 大文字小文字、全角半角を区別しません
     ※規定は 0 ですが、規定を Option Compare で変更することができます

    戻り値
    -1 = 文字列1 < 文字列2 0 = 文字列1 = 文字列2 1 = 文字列1 > 文字列2
    Null値 = 文字列1または文字列2がNull値

    VBScript 言語

    • 数値 = StrComp (文字列1, 文字列2)
    • 数値 = StrComp (文字列1, 文字列2, 比較方法)

    比較方法
    0 = バイナリモードで比較します
    1 = テキストモードで比較します
     ※規定は 0 です

    戻り値
    -1 = 文字列1 < 文字列2 0 = 文字列1 = 文字列2 1 = 文字列1 > 文字列2
    Null値 = 文字列1または文字列2がNull値

    Lotus 式言語

    • 数値 = @Compare (文字列1, 文字列2)
    • 数値 = @Compare (文字列1, 文字列2, 比較方法)
       ※文字列に複数値を設定できます
       ※文字列1と文字列2の値の数をそろえてから比較します

    比較方法
    [CASESENSITIVE]/[CASEINSENSITIVE] = 大文字小文字を区別/区別しないで比較します
    [ACCENTSENSITIVE]/[ACCENTINSENSITIVE] = アクセントを区別/区別しないで比較します
    [PITCHSENSITIVE]/[PITCHINSENSITIVE] = 全角半角を区別/区別しないで比較します
     ※規定は [CASESENSITIVE] : [ACCENTSENSITIVE] : [PITCHSENSITIVE] です
     ※Unicodeスタンダードソートを設定しているときは使えない比較方法があります

    戻り値
    -1 = 文字列1 < 文字列2 0 = 文字列1 = 文字列2 1 = 文字列1 > 文字列2

  • [言語比較]Boolean,True,False : 論理型

    [言語比較]Boolean,True,False : 論理型

    Lotus Script 言語

    • False は 数値の 0 と表すこともできます
    • True は 数値の -1 と表すこともできます
    • True と False を反転させるには Not を使います
    • Boolean型は False に初期化されます

    注意
    論理型を数値に置き換えると紛らわしいです
    True や False を数値に置き換えることはできますが控えたほうが無難です

    等しい

    等しくない
    <>, ><

    VbScript 言語

    • False は 数値の 0 と表すこともできます
    • True は 数値の -1 と表すこともできます
    • True と False を反転させるには Not を使います

    等しい

    等しくない
    <>

    Lotus 式言語

    • @False は 数値の 0 と表すこともできます
    • @True は 数値の 1 と表すこともできます (Lotus Script 言語と異なります)
    • @True と @False を反転させるには !(びっくりマーク) を使います

    反転(Not, !, ~しない, ~ではない)
    重ねて使うと、否定の否定って何!?って、何だかわからなくなりそうです

    等しい

    等しくない
    <>, ><, !=, =!