1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Security.Cryptography; using System.Data.OleDb; namespace PersonalManager { public partial class Form1 : Form { private string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Application.StartupPath + @"\dat.accdb;" + "Jet OLEDB:Database Password=xxx"; public Form1() { InitializeComponent(); button1.Click += (s, e) => { ExecuteNonQuery("create table employee(" + "id autoincrement primary key," + "name text" + ")"); ExecuteNonQuery("insert into employee (name) values ('taro')"); DataTable dt = ExecuteQuery("select * from employee"); List<Model> models = new List<Model>(); for (int r = 0; r < dt.Rows.Count; r++) { models.Add(new Model() { id = dt.Rows[r]["id"].ToString(), name = dt.Rows[r]["name"].ToString() }); } dataGridView1.DataSource = models; }; } private void ExecuteNonQuery(string commandText) { using (OleDbConnection con = new OleDbConnection(connectionString)) { con.Open(); using (OleDbCommand cmd = new OleDbCommand()) { try { cmd.Connection = con; cmd.CommandText = commandText; cmd.ExecuteNonQuery(); } catch (Exception e) { MessageBox.Show(e.Message); } } } } private void ExecuteNonQuery(List<string> commandTextList) { using (OleDbConnection con = new OleDbConnection(connectionString)) { con.Open(); using (OleDbCommand cmd = new OleDbCommand()) { cmd.Transaction = con.BeginTransaction(); try { foreach (string sql in commandTextList) { cmd.Connection = con; cmd.CommandText = sql; cmd.ExecuteNonQuery(); } cmd.Transaction.Commit(); } catch (Exception e) { MessageBox.Show(e.Message); cmd.Transaction.Rollback(); } } } } private DataTable ExecuteQuery(string commandText) { using (OleDbConnection con = new OleDbConnection(connectionString)) { try { con.Open(); using (OleDbCommand cmd = new OleDbCommand()) { cmd.Connection = con; cmd.CommandText = commandText; using (OleDbDataReader reader = cmd.ExecuteReader()) { DataTable dt = new DataTable(); dt.Load(reader); return dt; } } } catch (Exception e) { MessageBox.Show(e.Message); return new DataTable(); } } } } class Model { public string id { get; set; } public string name { get; set; } } } |
フォルダ整理 メモ
フォルダ分けはファイルを入れるときに迷うことがないぐらいのざっくりで、ファイルの探し方は更新日でソートか、通常検索か、自作検索で見つけるという感じで運用している。
1人の場合はこれで問題ないけど、複数人で利用する共有フォルダの場合、ある程度ルール化する必要がある。業務の種類によって作成するファイルに違いがあり色々な意見がある。
フォルダの命名規則を決める
・固有名詞(仕入先名、客先名、担当者名など)
・業務名(在庫管理、支払管理など)
・部署名(経理部、製造部など)
・インデックス(ABC…、あ行か行…など)
基本的に命名規則以外のフォルダを作らない。
フォルダの構造を考える
例)
業務>インデックス>名称
支払管理
├ あ行
│ └ あいうえお株式会社
├ か行
例)
部署名>業務名
部署名>固有名詞
全社共通
└ 申請書類
部門別
├ 製造部
│ └ 工程管理
└ 経理部
├ 支払管理
└ Aさん(個人フォルダ)
フォルダの階層構造は変更禁止
一度決めたフォルダ構造は部門長(あるいは担当者)のみ変更可能とする。
より厳格に運用する場合(堅苦しいが)フォルダ構造を台帳化する。
ファイルを置いていいフォルダを決める
部門名フォルダにはファイルを置かない、○階層目まではファイルを置かないなど決め、禁止フォルダの中にファイルを作ると自動で削除するなどする。
フォルダの中身を整理する責任者を決める
個々に決めると大変なので、あるフォルダ以下の中身はAさんが整理するなど決め、定期的に部門長が、整理の目標(ファイル数を減らすなど)を指示する。
ファイルの命名規則を決める
版があがるファイルには必ず、日付やVER/REVを入れる。
(新、新々のようなファイルを作らない)
***
(2022年1月)電子帳簿保存法 電子取引データ保存
電子取引(メールやサイトからダウンロード)のデータは送受信ともに電子保存が義務。対象は取引情報(見積書、注文書、請求書、納品書、領収書など)
真実性の確保、可視性の確保が必要。
https://www.nta.go.jp/law/joho-zeikaishaku/sonota/jirei/05.htm
・真実性の確保
方法として、
1.タイムスタンプ付与
2.訂正、削除の履歴が残るシステム
3.事務処理要件を定める
https://www.nta.go.jp/law/joho-zeikaishaku/sonota/jirei/0021006-031.htm
がある。
・可視性の確保
1.日付、金額、取引先を検索条件として設定できること。
2.日付、金額は範囲指定できること。
3.任意の項目の組合せで検索できること。
税務職員による質問検査権に基づく電磁的記録のダウンロードの求めに応じることができるようにしている場合2,3は不要。
https://www.nta.go.jp/law/joho-zeikaishaku/sonota/jirei/pdf/0021005-038.pdf
※P4
実際、ある程度高度な検索ができないと適切な管理ができないので注意。
Chrome拡張機能 右クリックから検索
選択した文字列をブログ検索
1 2 3 4 5 6 7 8 9 10 11 12 |
{ "manifest_version": 3, "name": "RightClick", "version": "0.0.2", "background": { "service_worker": "script.js" }, "permissions": [ "tabs", "contextMenus" ] } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
chrome.runtime.onInstalled.addListener(function () { chrome.contextMenus.create({ id: "parent", title: "ブログ検索", contexts: ["selection"] }); }); chrome.contextMenus.onClicked.addListener((info) => { if (info.menuItemId == "parent"){ let u = "https://www.google.co.jp/search?hl=ja&as_sitesearch=http://okamurax.com/&q=" + info.selectionText; chrome.tabs.create({url:u}); } }); |
chrome.contextMenus.createはonInstalled.addListenerで追加しないとエラーになる。chrome.contextMenus.onClicked.addListenerは入れるとダメ。
C# 文字列からハッシュ値を計算
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
textBox1.TextChanged += (s, e) => { string plainText = textBox1.Text; using (SHA256 sha256 = SHA256.Create()) { var encoded = Encoding.UTF8.GetBytes(plainText); var hash = sha256.ComputeHash(encoded); // ハッシュ値を16進数に変換(いくつか方法) textBox2.Text = String.Join("", hash.Select(x => x.ToString("x2")).ToArray()); textBox3.Text = BitConverter.ToString(hash).Replace("-", "").ToLower(); textBox4.Text = string.Concat(hash.Select(x => $"{x:x2}")); // ハッシュ値をBase64に変換の場合 textBox5.Text = Convert.ToBase64String(hash); } }; |
C# 文字列をAES暗号化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
private string Encrypt(string plainText) { // 半角16文字(128bit)、24文字(192bit)、32文字(256bit)から選ぶ。 byte[] key = Encoding.UTF8.GetBytes(@"u5vwged9ky6y6vii"); // Block Sizeと同じにする。半角16文字(128bit) byte[] iv = Encoding.UTF8.GetBytes(@"8knshgxqy4uf89gq"); byte[] byteValue = Encoding.UTF8.GetBytes(plainText); var byteLength = byteValue.Length; using (var aes = Aes.Create()) using (var encryptor = aes.CreateEncryptor(key, iv)) { var encryptValue = encryptor.TransformFinalBlock(byteValue, 0, byteLength); var base64Value = Convert.ToBase64String(encryptValue); return base64Value; } } public static string Decrypt(string encryptText) { byte[] key = Encoding.UTF8.GetBytes(@"u5vwged9ky6y6vii"); byte[] iv = Encoding.UTF8.GetBytes(@"8knshgxqy4uf89gq"); var byteValue = Convert.FromBase64String(encryptText); var byteLength = byteValue.Length; using (var aes = Aes.Create()) using (var decryptor = aes.CreateDecryptor(key, iv)) { var decryptValue = decryptor.TransformFinalBlock(byteValue, 0, byteLength); var stringValue = Encoding.UTF8.GetString(decryptValue); return stringValue; } } |
Outlook データファイル 最大サイズ対応
受信トレイのフォルダ構造をそのままにしたい。
ファイル>アカウント設定>データファイル>ファイルの場所を開く
エクスプローラでファイルの場所が開いたら、現在利用しているpstファイルを別名にてコピーする。
コピーしたpstファイルを
ファイル>アカウント設定>データファイル>追加
から追加し、設定から名前を変える。
元の受信トレイのメールを削除する。
最大サイズに達していて削除できない場合、Shiftを押しながら削除する。
削除したら、
ファイル>アカウント設定>データファイル>設定>今すぐ圧縮
を実施すると直ぐにファイルサイズが小さくなる。
VBA Worksheet_Change/SelectionChange
クリックしたセルの値を取得
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Private Sub Worksheet_SelectionChange(ByVal Target As Range) On Error Resume Next ' クリックセルの値チェック If Target.Value <> "[削除]" Then Exit Sub ' クリックセルの範囲チェック If Target.Row < 2 Then Exit Sub If Target.Column <> 8 Then Exit Sub ' クリック行の値を取得 id = ActiveSheet.Cells(Target.Row, 1).Value End Sub |
セルの値の変更をチェック
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Dim beforeValue As Variant Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next If Target.Column <> 6 Then Exit Sub If beforeValue <> Target.Value Then MsgBox "変更されました" & Chr(13) & Target.Value End If End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) On Error Resume Next If Target.Column <> 6 Then Exit Sub beforeValue = Target.Value End Sub |
UserFormからシートのSelectionChangeを拾う場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Private WithEvents e As Application Sub e_SheetSelectionChange(ByVal w As Object, ByVal Target As Range) If ToggleButton1.Value = False Then Exit Sub ' w.Parent.Name ' ブック名 ' w.Name ' シート名 ' Target.Address ' 選択範囲 ' Target.Item(1).Address ' 選択範囲の左上 Debug.Print Target.Item(1).Value r = Target.Item(1).Row TextBox19.Text = w.Cells(r, 1).Value End Sub Sub UserForm_Initialize() Set e = Application End Sub |
KING OF TIME、サテライトオフィス、LINE WORKS連携
KING OF TIME
・LINE/DeveloperConsole
https://developers.worksmobile.com/jp/console/
API1.0>API ID>発行
Service API Consumer Key(下段)>発行
トークBotすべてにチェック>発行
トークンの有効期限と自動延長について設定する。
(自動延長を有効)
Server List(ID登録タイプ)>追加
サーバー名:任意
Keyの選択:Server API Consumer Keyで作成したもの
・KoT/勤怠管理画面
設定>その他>オプション
LINE WORKS連携を使用するに変更
設定>その他>オプション
LINE WORKS連携をクリック。
>Developerアカウント:管理者アカウント
>ドメインID:メニュー下にあるDomain ID
>API ID:
>Server API Consumer Key:
>サーバーID:Server ListのID
>サーバー認証キー:Server Listの認証キーでダウンロードするファイル
設定>その他>LINE WORKS連携設定>アカウント設定
対象の人にLINE WORKSのアカウントを登録
初回メッセージ送信を実行。(打刻メッセージの編集が必要な場合実行)
***
基本、出退勤+休憩+外出のみ打刻可能のよう。
サテライトオフィス・ワークフロー
・サテライトオフィスセットアップ画面
https://workflow.sateraito.jp/sateraito/worksmobile/contract/request?hl=ja
必要な情報を入力
>LINE WORKSのドメイン/グループ名
を入力。
・LINE/DeveloperConsole
https://developers.worksmobile.com/jp/console/
SAML Apps>追加
>Application Name:任意
>Description:
>Logo:
>ACS URL:セットアップ画面に記載有り
>SP Issuer(Entity Id):セットアップ画面に記載有り
>Name ID:
>Name ID Format:
次へを実行。
SAML Apps>変更>有効
保存。
SAML Apps>LINE WORKS Identity Provider情報>Certificate>ダウンロード
・サテライトオフィスセットアップ画面
X.509証明書 (Certificate)
にダウンロードしたファイルを開いて貼り付け。
会社名以降必要な情報を入力し、
確認する>お申し込みをする
***
メールが来るので確認する。
C# マウス座標 取得方法の比較
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
using System; using System.Drawing; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form1 : Form { // 関数が存在するDLLを指定する。 [System.Runtime.InteropServices.DllImport("user32.dll")] // extern // 関数の実体が外部にあることを示す。 static extern int GetCursorPos(out LPPOINT lppoint); public Form1() { InitializeComponent(); MouseMove += (s, e) => { // スクリーン座標(Form上しか拾わない) label1.Text = "X / Y : " + Cursor.Position.X.ToString() + " / " + Cursor.Position.Y.ToString(); // クライアント座標 label2.Text = "X / Y : " + e.X.ToString() + " / " + e.Y.ToString(); }; Timer timer = new Timer(); timer.Interval = 1; timer.Tick += (s, e) => { // スクリーン座標 GetCursorPos() var p = new LPPOINT(); GetCursorPos(out p); label3.Text = "X / Y : " + p.X.ToString() + " / " + p.Y.ToString(); }; timer.Start(); } // StructLayout(LayoutKind.Sequential) // API/DLLとやりとりする構造体の場合、メンバのメモリ上の位置をAPI/DLLと一致させる必要がある。 // LayoutKind.Sequentialと指定すると宣言通りとなる。 [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)] struct LPPOINT { public int X { get; set; } public int Y { get; set; } // implicit operator xxx // implicit operatorを定義しているクラス自身が // xxx型にキャストされたときに動作するコンストラクタ public static implicit operator Point(LPPOINT point) { return new Point(point.X, point.Y); } } } } |
フレッツ光 契約回線認証失敗
フレッツ光メンバーズクラブ内で必要となる契約回線認証が失敗してしまう。
利用しているAterm WF1200CRでは、
ホーム>基本設定>IPv6ブリッジ
を有効にすれば認証成功する。
その他の方法として以下。
・初回設定
Win10設定>ネットワークとインターネット>ダイヤルアップ
を開き、
新しい接続を設定する>インターネットに接続します>次へ>新しい接続をセットアップします>ブロードバンド(PPPoE)
を順番にクリックする。
ユーザー名:guest@v4flets-east.jp
パスワード:guest (パスワードを記憶する)
を入力したら接続をクリックする。
(処理が始まったらスキップして閉じてしまってOK)
・接続方法
Win10設定>ネットワークとインターネット>ダイヤルアップ
を開き、
ブロードバンド接続>接続
を順番にクリックし接続する。
https://www.v4flets-east.jp/wso_point/point_Auth.jsp
にアクセスする。
会員ID、パスワードを入力>確認するを押してタイムアウトまで待つ。
ダイヤルアップを切断する。
タイムアウトしたウィンドウがリロードされ遷移中と表示されたら、https://members-club.flets.com/
にアクセスする。
サービス情報サイトにアクセスする場合、
ダイアルアップに接続したまま
http://www.flets/
にアクセス。