のにっき

【C#】フォルダの高速コピー

今回は、フォルダの高速コピーをご紹介します。
フォルダのコピーとは、
サブフォルダも含めたすべてのファイルをコピーする
やり方になります。
再帰処理と並列処理を同関数で行っているので、
勉強中の方は処理の動きをご参考いただければ嬉しいです!

参考サイト

基本的な構文はこのサイトを参考にしました。
並列処理を追加したら高速になるなーの考えでちょっとだけ改造してます。
dobon.net

ソースコード

        /// <summary>
        /// サブフォルダを含むフォルダのコピー
        /// </summary>
        /// <param name="CopyFldName">コピーするフォルダパス</param>
        /// <param name="PasteFldName">コピー先のフォルダパス</param>
        public static void Set_CopyDirectory(string CopyFldName, string PasteFldName)
        {
            //コピー先のディレクトリがないときは作成
            if (!Directory.Exists(PasteFldName))
            {
                Directory.CreateDirectory(PasteFldName);              
                File.SetAttributes(PasteFldName, File.GetAttributes(CopyFldName));
            }
            //コピー先のディレクトリ名の末尾に"\"をつける
            if (PasteFldName[PasteFldName.Length - 1] != Path.DirectorySeparatorChar)
            {
                PasteFldName = PasteFldName + Path.DirectorySeparatorChar;
            }
            //コピー元のディレクトリにあるファイルをコピー ※ここで並列処理
            string[] files = Directory.GetFiles(CopyFldName);
            Parallel.ForEach(files, (file) =>
            {
                File.Copy(file, PasteFldName + Path.GetFileName(file), true);
            });
            //コピー元のディレクトリにあるディレクトリについて、再帰的に呼び出す
            string[] dirs = Directory.GetDirectories(CopyFldName);
            foreach (string dir in dirs)
            {
                Set_CopyDirectory(dir, PasteFldName + Path.GetFileName(dir));
            }
        }

以上がコピー処理を行う関数になります。
サブフォルダを考慮して再帰処理を行っている点と、
ファイルのコピーに並列処理を行っている点です。

以上、フォルダの高速コピーでした。 

【C#】自作アプリの自動アップデート機能

社内用にアプリを作成して配布するとき、
配布後にアップデートするのがとても面倒だったりしませんか?
作って終わりじゃないのが業務改善のメンドクサイ所ですよね。。。
今回は、自作アプリの自動アップデート機能の組み方をご紹介します。

前提条件

配布された人たちが全員アクセスできる共有フォルダがあることが条件
※このフォルダを配布先にしておくと便利

組み込み方法

アプリ内定数

まずは、作成するアプリ内に以下の定数を定義します

// バージョン情報
public const string Df_BasePath = @"アプリを置くフォルダのパス";
public const string Df_Version= "01_000";

Df_BasePath
最新バージョンのアプリを配布するフォルダのパスを記入します。
Df_Version
今、作成中のバージョンを記入します。
※このバージョンが「 Df_BasePath 」のパス内にあるファイルと一致していなかったら
 バージョンアップ処理を行う仕様になります。

アプリ起動時の処理

アプリ起動時に以下の処理を行います
①.「 Df_BasePath 」フォルダ存在判定
②.自分のバージョンと配布先のバージョンの一致判定
③.バージョンアップ処理

/*************************************************************************
    【例】フォーム起動時イベント
**************************************************************************/
private void Form1_Load(object sender, EventArgs e)
{
    // ①.フォルダ存在判定  
    if (IsFolderSonzai_Out(Df_BasePath))
    {
        // ②.自分のバージョンと配布先のバージョンの一致判定  
        string basePath = GetAllFileInFolder(Df_BasePath, "exe")[0];
        if (GetFileNameInPath(basePath, true).Split('v')[1] != Df_Version)
        {
            // ③.バージョンアップ処理
            Set_AutoUpdate(Df_BasePath);
            this.Close();
        }
    }
}

以上がイベントの内容です。細かく見ていきましょう。

①.フォルダ存在判定
/// <summary>
/// フォルダ存在判定【タイムアウト付き】
/// </summary>
/// <param name="path">検索されるフォルダパス</param>
/// <returns>検索結果( True = 存在する )</returns>
public static bool IsFolderSonzai_Out(string path)
{
    int i_Wait = 1000;   // この値【ms】だけ処理待ち
    bool exists = true;
    Thread t = new Thread
    (
        new ThreadStart(delegate ()
        {
            exists = Directory.Exists(path);
        })
    );
    t.Start();
    bool completed = t.Join(i_Wait);
    if (!completed)
    {
        exists = false;
        t.Abort();
    }
    return exists;
}

こちらが関数の中身です。
Df_BasePath 」フォルダが存在しない場合はバージョンアップを行いません。
配布先は共有フォルダとなるので、タイムアウト対策は必須です。

②.自分のバージョンと配布先のバージョンの一致判定

バージョンの比較方法ですが、配布先のファイル名にはバージョンを追記しておきます。
【例】ファイル名_v01_001.exe
現バージョンは定数で取得し、最新バージョンはファイル名から取得して比較します。

③.バージョンアップ処理
/// <summary>
/// 自動アップデート処理 ※これ実行した後、自分は閉じないとダメだよ
/// </summary>
/// <param name="PathBase">配布してるフォルダのパス</param>
public static void Set_AutoUpdate(string PathBase)
{
    //ベースパス取得して現階層にコピペ
    string basePath = GetAllFileInFolder(PathBase, "exe")[0];
    string pathAft;
    pathAft = GetFileNameInPath(basePath, false);
    pathAft = GetNowFolderPath() + "\\" + pathAft;
    File.Copy(basePath, pathAft, true);
    // Batファイル出力
    string text = "";
    text += @"@echo バージョンアップ中..." + "\r\n";
    text += @"@echo off" + "\r\n";
    text += @"timeout /t 5 /nobreak > nul" + "\r\n";
    text += @"del " + System.Reflection.Assembly.GetExecutingAssembly().Location + " > nul" + "\r\n";
    text += @"start " + pathAft + "\r\n";
    text += @"del Patch.bat > nul" + "\r\n";
    text += @"exit" + "\r\n";
    StreamWriter sw = new StreamWriter("Patch.bat", false, Encoding.GetEncoding("Shift_JIS"));
    sw.Write(text);
    sw.Close();
    // exe更新
    System.Diagnostics.Process p = new System.Diagnostics.Process();
    p.StartInfo.FileName = "Patch.bat";
    p.StartInfo.CreateNoWindow = true;
    p.Start();
    p.Close();
    p = null;
}
/// <summary>
/// ファイルのパスからファイル名を取得
/// </summary>
/// <param name="str_Path">パス</param>
/// <param name="IsKillKaku">拡張子を除くか?</param>
/// <returns></returns>
public static string GetFileNameInPath(string str_Path, bool IsKillKaku)
{
    // 「\」で分解してファイル名を取得
    string str_Ret = "";
    string[] str_Sepalate;
    str_Sepalate = str_Path.Split('\\');
    str_Ret = str_Sepalate[str_Sepalate.Length - 1];
    // 拡張子が不要なら除く
    if (IsKillKaku)
    {
        str_Sepalate = str_Ret.Split('.');
        str_Ret = str_Sepalate[0];
    }
    return str_Ret;
}
/// <summary>
/// 実行ファイルのパスを文字列で取得
/// </summary>
/// <returns>実行ファイルのパス ※ファイル名は含まない</returns>
public static string GetNowFolderPath()
{
    string str_Ret = "";
    str_Ret = System.Reflection.Assembly.GetExecutingAssembly().Location;
    str_Ret = GetFilePathFolder(str_Ret);
    return str_Ret;
}

少し長くなりましたがやっていることは簡単です。
・最新バージョンのファイルを起動ファイルと同じ階層にコピペ
・Batファイルを作成→起動
 ▼Batの内容
 ・5秒後に古いバージョンのファイル(起動ファイル)を削除
 ・自分(Batファイル)を削除
・最後に、「 this.Close(); 」で起動アプリを閉じる

以上です。
アプリのアップデート対策は必須なので、
自動アップデートで無駄な管理ヘイトをためないようにしましょう!

【VBA】ADOを利用したExcelアクセス時のエラー対応

Excelの解析にADOを利用したマクロを組んで配布したのですが、
私のPCではちゃんと動くのに、一部の方のPCでは動かない。。。
エラーの内容も三者三葉という気が狂うことがありました。
解決方法が結構斬新な物でしたのでご紹介します。

エラーが起きた環境

PC環境

・Windows10 64bit
Excel 2013 32bit

エラー発生ソース

Function GetFileRead_ADO(s_FilePath As String) As Variant
    ' 変数定義
    Dim strSQL As String
    Dim var_Ret() As Variant
    Dim dbCon As ADODB.Connection
    Dim dbRes As ADODB.Recordset
    ' ADO形式でシート内容取得
    Set dbCon = New ADODB.Connection
    dbCon.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                   "Data Source=" & s_FilePath & ";" & _
                   "Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1;Readonly=False"""
    strSQL = "SELECT * FROM [_ValueManage$]"

    ' 以下割愛・・・
End Function

上記ソースの「 dbCon.Open 」の部分でエラーになっていました。
エラーの内容はバラバラでしたが、エラー発生場所は共通でした。

エラー内容

・オートメーションエラー
・プロバイダーが見つかりません。正しくインストールされていない可能性があります。
・'Open'メソッドは失敗しました

エラー対応内容

CreateObjectを使用しない

参照設定を必要としなくなるのでとても便利なのですが、
ADO利用時にCreateObjectを使用するとエラーが一生直りませんでした。。。
こればっかりは原因が分かりませんでした。
以下は、「エラー発生ソース」のように
CreateObjectを使用しないソースを前提としています。

参照追加しているか確認

とりあえず参照設定を確認しましょう。
下図のチェック項目にチェックが入っているか確認!

f:id:apuridasuo:20200626144339p:plain
図:参照追加する項目

Accsessのインストール

これが驚きだったのですが、エラーの大きな原因が
Accsessがインストールされていない」でした!!
知らないよ!エラーで言え!!!と怒ったのはいい思い出です。
たまたま社内でOfficeのライセンス話があったので各人のインストール状況が
確認出来て「え!?」となって気づけたのですが、神ひらめきだったと自負してます。
という事で、社内に配布した簡単Access導入方法を紹介します。

f:id:apuridasuo:20200626145048p:plain
図:Access導入手順

Officeの修復

Accessの導入でほぼエラー問題は解決しました。
しかし、急にエラーが再発する方がちらほら。
原因は不明なのですが、解決方法は見つかりました。

www.saka-en.com

こちらのサイト様で紹介されている 「 Officeの修復をおこなう
の項目を実行すると、エラーは直りました。
エラーになった方々は直近にVisioをアンインストールした方々ばっかりでした。
おそらくですが、Officeのアプリは色々つながっていて、
一つのアプリをアンインストールすると別のアプリにも影響するのだと思います。

以上、
ADOを利用したExcelアクセス時のトラブルシューティングでした。

P.S.
オートメーションエラー考えたやつ滅びろ!
諦めずに原因教えなさいよ!!!

【Unity】AddListnerに引数が必要な場合の対処法

Unityでコンポーネントにイベントを設定するとき、AddListner()をよく使用します。
このAddListnerですが、
イベントの種類によっては引数が必要になる場面があるのをご存知でしょうか?
今回は、ラムダ式でイベント設定する時の注意をまとめたいと思います。

ボタンにイベントを設定する

/***********************************************************************
【メイン】ボタンにイベントを設定する関数
***********************************************************************/
public void SetBtnPushEventListner()
{
    // 【引数なし】ボタンイベント設定
    Button btn_Set;
    btn_Set = this.transform.Find("設定するオブジェクト名").GetComponent<Button>();
    btn_Set.onClick.AddListener(() => { SetBtnPushEvent_NoHikisuu(); });
    // 【引数あり】ボタンイベント設定
    Button btn_Set02;
    btn_Set02 = this.transform.Find("設定するオブジェクト名").GetComponent<Button>();
    btn_Set02.onClick.AddListener(() => { SetBtnPushEvent_Hikisuu("引数"); });
}

/***********************************************************************
【Ev】ボタン押下イベント ※引数なし
***********************************************************************/
public void SetBtnPushEvent_NoHikisuu()
{
    Debug.Log("押されたよ, 引数なし");
}
/***********************************************************************
【Ev】ボタン押下イベント ※引数あり
***********************************************************************/
public void SetBtnPushEvent_Hikisuu(string SetHikisu)
{
    Debug.Log("押されたよ, 引数あり:"+SetHikisu);
}

上記の書き方で、ボタンコンポーネントにクリックイベントを設定できます。

btn_Set02.onClick.AddListener(() => { SetBtnPushEvent_Hikisuu("引数"); });

この部分がイベントを設定する部分なのですが、
設定するコンポーネントの変数.イベント名.AddListener(() => { 関数名; });
という書き方で、ボタンに限らず大体のコンポーネントのイベントを設定できます。

イベント自体に引数がある場合

onClickイベントはイベント自体に引数が無いので、
イベントの引数を意識せずにAddListenerで設定することが出来ます。
しかし、イベント自体に引数がある場合は関数設定時にイベント引数を設定する必要があります。
Sliderのイベントを例に設定方法を記入します。

/***********************************************************************
【メイン】スライダーにイベントを設定する関数
***********************************************************************/
public void SetSliderChangeEventListner()
{
    // 【引数なし】ボタンイベント設定
    Slider setSlider;
    setSlider= this.transform.Find("オブジェクト名").GetComponent<Slider>();
    setSlider.onValueChanged.AddListener((value) => { SetChangeSlider_Vol((int)value); });
}

/***********************************************************************
【Ev】スライダー更新
***********************************************************************/
public static void SetChangeSlider(int SetVal)
{
    Debug.Log("スライダーの値が変更されたよ:" + SetVal.tostring());
}

上記の書き方で、スライダーコンポーネントにクリックイベントを設定できます。
onClickイベントとの違いは、AddListener((value) => { SetChangeSlider_Vol((int)value); });
この「value」の部分ですね。 これは、「 onValueChanged 」イベント自体の引数です。
value=変更されたスライダーのvalueになります。
このように、イベント自体の引数が存在する場合は、
ラムダ式の左辺に任意の変数名(例の場合はvalue部分)を記述する必要があります。

イベント名から引数があるか判定する方法

①.実際に記入してエラーで判別

イベント自体に引数があるかないかの判定は簡単です。
onClickイベントの記法で、引数が無いものとして記述してみる。
この方法で記述して、
・ビルドエラーなし・・・イベント引数ない
・ビルドエラーある・・・イベント引数あり

これで一発です。
引数がある場合は、以下の方法で引数の内容を確認しましょう。

②.Googleで検索

後はインターネッツにおまかせ! 「 Unity イベント名.AddListener
で検索しましょう。
これで大体のイベントの引数は検索できます。
私がSliderの引数の内容で詰まった時は、「 Unity onValueChanged.AddListener 」で検索しました。

ラムダ式でイベント追加を行うと、 イベント引数を簡単に持ってこれるのでとても便利です。

【C#】色々な型の複数要素を1つの文字列に「1行で」変換する方法まとめ

色々な場面で必要になる文字列変換ですが、
まとめたい型ごとにやり方は異なってきます。
今回は、色々な型のやり方をこのページにまとめたいと思います。
※なるべく1行で完結できる方法をまとめてます

様々な型の文字列化

配列、リスト

string setValue = "";
//配列を文字列に結合
string[] a_Get = new string[10];
setValue = String.Join("\r\n", a_Get);
//リストを文字列に結合
List<string> l_Get = new List<string>();
setValue = String.Join("\r\n", l_Get);

配列やリストは、「 String.Join( "区切り文字", "まとめるリストや配列" )
の関数を使えば1行で完結できます。

Dictionary

//Dictionaryを文字列に結合
Dictionary<string, string> dic_Get = new Dictionary<string, string>();
setValue = String.Join("\r\n", dic_Get.Keys);   //全てのKeyを文字列に
setValue = String.Join("\r\n", dic_Get.Values); //全てのValueを文字列に

Dictionaryは、キーと値は「 Dic変数名.Keys 」「 Dic変数名.Values
で配列としてまとめて取得することが出来ます。あとは、配列と同じく
Join関数を使えば1行で完結できます。

自作クラス等のクラス内変数

/*******************************************
   コピー対象の自作クラス
********************************************/
public class TestClass
{
    public int _Id;
    public string _Name;
    public string[] _Array01;
}

/*******************************************
   文字列化方法
********************************************/
List<TestClass> lcls_Get;
string setValue = "";
//string型メンバ変数を取得
setValue = String.Join("\r\n", lcls_Get.Select(x => x._Name));
//int型メンバ変数を取得
setValue = String.Join("\r\n", lcls_Get.Select(x => x._Id.ToString()));
//配列メンバ変数を取得
setValue = String.Join("\r\n", lcls_Get.Select(x => String.Join("\r\n", x._Array01)));

自作クラスのリストから変数を抜き取る場合は、
結構For文を使いがちですが、LINQを使えば1行で完結できます。
細かな条件分岐もWhereでできますので、LINQをお勧めします。

記入欄とかに次々追加する時

List<string> l_Get = new List<string>();
for (int iRow = 0; iRow < l_Get.Count; iRow++)
{
    TextBox.text += l_Get[iRow] + "\r\n";
}

上記の感じで、for文で1つの文字列化する時にありがちな書き方です。
この書き方だと大きな問題が!?
末尾に要らない改行文字が残っちゃいます。。。

これを取り除くために判定を書くのもいいですが、1行でスマートに行きましょう!

List<string> l_Get = new List<string>();
for (int iRow = 0; iRow < l_Get.Count; iRow++)
{
    TextBox.text = (TextBox.text + l_Get[iRow] + "\r\n").Trim();
}

これで解決!手順は簡単。
毎回 Trim() したら先頭・末尾に余計な文字は無くなるで!
の法則です。長年のモヤモヤだったのですが、最近発見して驚愕しました。。。

以上です。
文字列化は常に付きまとう事なので、
なるべく少ないコードで見やすく組み込みたいですね。

アプリ開発向け素材サイト紹介 ※個人でアプリ開発するプログラマー必見

個人開発の罠を紹介

今回はプログラミングとは全く関係ない話です。
ですが、個人でアプリ開発をやってみよう!と思う方は必ず通る挫折ポイントです
私の実体験ですので、これから始めようと思っている方は見て損はないと思います。

プログラミングができても絵は描けない

タイトルの通りです。私たちはプログラミングができる、または学びたい。
その成果としてアプリを作りたい!と思っている人が多いと思います。
※なので、プログラマーの挫折点です。
組み込み後術やプラットフォーム操作等は、
勉強して成長する事が出来るので挫折にはならないです。
しかし、問題なのはデザインサウンドです。
どんなにソースが綺麗で多機能なアプリを作っても、
見た目がきちんとしてないものはアプリになりません。
しかし絵なんて上手に書けないし、勉強する気にもなりません。
わしゃわしゃソース書いて色んなライブラリ使いこなしてぇんです!
だったらどうするか。。。フリー素材様のお力を借りましょう!
以下で、私が挫折した時に大変助かった
アプリ制作者向け!商用利用可能な素材サイトをご紹介します。もちろん無料です

※. 紹介するサイトによってはクレジット等の細かな規約がたまにあります。
 サイトごとの利用規約をよく読んで注意してください。
※. 2020/06現在の利用規約では商用利用可能なサイトのまとめになります。
 今後、規約が変わるかもしれませんのでご注意を!

【音系】素材サイト紹介

まずは音系の素材サイトから。
BGM,SE,ボイスとアプリには欠かせない音素材を使用させていただけるサイトをご紹介

◆ 魔王魂...BGM、SE

言わずと知れたBGM素材を大量に置いてくださっているサイトです。

◆ 効果音ラボ...SE、ボイス

こちらも言わずと知れたSE素材を大量に置いてくださっているサイトです。
汎用性のあるボイスも使用できるので、ゲームで使用できるボイスもたくさんあります。

◆ DOVA-SYNDROME...BGM、SE

こちらのサイトは、楽曲を公開しているだけではなく、
楽曲の作成依頼やボイス収録依頼を出すこともできます。
もちろん素材も大量にあるので音ゲーを作るときにとても助けていただきました。

【画像系】素材サイト紹介

次に、画像系のサイトです。
基本的にGoogleで「○○○ イラスト フリー 商用利用可」で検索します。
いいのが無かったら下記のサイトを参考にしてみてください。
※アプリに関連する画像を扱うサイトのみに厳選しました。

◆ ICOOON MONO...アイコン、UI用

このサイトは、豊富な種類のピクトグラムのような画像を扱っているサイトです。
UI用の素材としてはピッタリの画像が見つかると思います
▼【使用例】ボタン画像は全て、ICOOON MONO様の画像を組み合わせて作ったものです
メニュー下部_パネル.png

◆ イラストAC...何でもそろう

人の画像から物の画像から背景から何でもそろうのがこのサイトです。
欲しい画像を検索すればピッタリな画像が見つかると思います。
▼【使用例】イラストAC様の画像を組み合わせて作ったものです
背景_Clear.png

◆ ぴぽやブログ...エフェクト、RPG用

エフェクトというのは、複数の画像を連続で表示することで、
1つのアニメーションのように見せる素材のことです。
その中でも、なんかぶわっとしたものがエフェクトです。
▼【使用例】閃光が飛び出すエフェクト
エフェクト例.gif
例えば、上記のエフェクトをキャラの右手から出して「ロッ●バスター!」とか言うと、
ゲームにものすごくカッコよさが付加されます。
エフェクトを使うようになると、一気にゲームっぽくなるのでぜひご活用ください。

【3D系】素材サイト紹介

3Dモデルは素材だけでは使えない要素があるのですが、
絶対に知っていて損はないサイトをご紹介。(多分みんな知ってる)

◆ ユニティちゃん...キャラモデル、2Dキャラ画像、ドット絵

このサイトには本当にいつもお世話になっております。
ユニティちゃんというキャラクターに始まり、様々な3Dモデルや立ち絵、ドット絵等
どのジャンルのゲーム製作にも対応できる豊富な素材があります。
リズムゲーからスロットシュミレータからシューティングまで、
私が作成したアプリには大体出演頂いてます。

【ツール系】見た目改善サポートアプリ紹介

Illustratorなんていらんのですよ!高いのですよ!!!
という方にお勧めする、画像編集や3Dオブジェクト作成ツールをご紹介。
もちろん無料です

◆ パワーポイント(Office)

はい。パワポです!私はアプリ用の画像はほとんどパワポで編集しています。
画像を細かく編集するのではなく、素材を合体させたりするだけなら
パワポはとても使い勝手がいいです。
もう一つの利点は、
自然とパワポの扱いに慣れるので会社のプレゼン資料作成の効率も上がっちゃいます。

◆ GIMP(ギンプ)...画像編集

こちらは、細かい画像編集を行う際に非常に使いやすいツールです。
よく使う機能は、取ってきた素材の背景を切り抜くことが出来ます。
しかも、クリック一発で切り抜いちゃうので簡単で便利!
GIMPで素材を編集してパワポで組み合わせる。というやり方で画像編集することで、
難しいことを覚えなくてもそこそこのクオリティの画像が出来上がります。

◆ blender...3Dオブジェクト編集

何で無料なのか分からないほど多機能らしい3Dオブジェクト作成(編集)ツールです。
正直扱いはとても難しいです。
そもそもオブジェクトを作るというのは難しいことだから仕方ないのですが。。。
私はこのツールで行っていることは、
キャラ用ステージや背景など、簡単なオブジェクトを作成するほか、
キャラ用にアニメーションを作ることも行っています。
オブジェクトに関する操作は大体何でもできる奥深なツールですが、
やりたい事だけやり方を調べればそこまで難しくは無かったのでお勧めします。
※0知識の自分でもがんばればSDキャラを作れるぐらいにはなれましたのでご安心を!

【作成例】無料神サイトにおんぶにだっこでここまでできた

こちらは、
全て上記サイトの画像・音・3Dオブジェクトを使って作成したアプリの広告用動画です。
特化プレーヤー
→ 特化PLAYER...よかったらプレイしてみてね

全部無料でデザイン技術が無くても、頑張ればゲームっぽく見せることはできます。
アプリ開発する上で、デザイン面の負担は大きいものがありますが、
素材サイト様のご加護を受けて楽しく開発していきましょう。
皆様の知る穴場オススメ素材サイトとかあったら
コメント等で教えていただけると泣いて喜びます!

最後にCM

◆ ライムまにあ

リズムゲーとクイズを融合させた新感覚リズムゲームです。
こないだ公開して誰もプレイしてくれないので寂しいです。
良かったら見てみてください。
広告1.png

Windowsの右クリックとタスクバーを侮るな

 最近、社内で流行ってきている問題があります。

デスクトップ汚い問題です。

この問題はPCが生まれた時からの永遠の問題だと思います。

皆さんはどのように対応しているでしょうか?

やれランチャーアプリだ、やれフォルダに押し込めだなんだと騒いでいませんか?

違うんです!そもそも

開きたい物へアクセスする手段の知識が少ない

これが大きな問題でもあるんです。

Windowsはまだまだ皆さんの知らない便利機能があるんです。

今回は、簡単に開きたいものを開くための小技をご紹介します。

Windowsのお話ですのでMaccerの方はお帰りください

※誰でも知っている系のお話ですので、過度な期待はしないでください 

タスクバーはただのショートカット機能じゃないぞ

 画面下に黒いバーがあると思います。名を「タスクバー」といいます。

こいつにフォルダやアプリをドラッグ&ドロップすると

アイコンが保存され、クリックすると開ける。という

ショートカット機能があるのは皆さんご存知のはず。

しかし、このタスクバーのアイコンに他の機能があるのをご存知でしょうか?

まずはアイコンを右クリック!

f:id:apuridasuo:20200613202052p:plain

図:アイコン右クリック時の挙動

上図のようにアイコンから表示が出ると思います。

表示をよく見ると「ピン留め・最近」の2つの項目があります。

・ピン留め・・・自分で設定できる。右クリックで必ず表示される項目

・最近・・・直近でアクセスした項目が表示される

この右クリック機能があれば、

常によく使うフォルダをピン留めする。

一時的によく使う項目はピン留めしなくても「最近」でまかなえます。

しかもこの機能、

フォルダだけじゃなく大体のアプリに使えます。

VisualStudioはもちろん。Windowsアプリは必ず利用可能ですし、

他社アプリも有名なものは基本的に対応しています。

ですので、

エクセルでアクセスしたいものはエクセルのアイコンで右クリック。

メモ帳でアクセスしたいものはメモ帳のアイコンで右クリック。

この運用方法で大体のファイルに一発でアクセスできます。

 

どうでしょうか?

この右クリックの機能は使用アプリごとに簡単に管理できる。

というものが大きな利点です。

そこらのランチャー機能と違って、アクセスしたいファイルのリンクが

登録等の手順が必要なく、かつ一発で実行できるので超便利な機能だと思います。

 

自分の仕事のやり方と他人のやり方を見ていると、

業務改善だなんだと言う前に、意外と知らない便利な機能を教えあったほうが

絶対業務が早くなるだろ!と心の底から思うのですが、

「じゃあまとめてなー ※まとめても見ないけど」

の一言で終了するのが目に見えているのでブログにかいちゃいました。

 

アクセス方法の知識を深めて、無駄なリンクをデスクトップに置かない

スッキリPCを目指してみてください!