社会人5年目がこっそり教える、本当に使えるビジネスツールたち

目次

はじめに

こんにちは、oguriです。
今日は、社会人1年目になったら一番最初に教えておいて欲しかった、
ビジネスで利用するのにお勧めするツールを紹介します。

ビジネスツール一覧

シューズ

[テクシーリュクス] ビジネスシューズ

私は入社当初、「ビジネスシューズは何としても革靴!歩くときに、コツコツとかかとを鳴らしながら歩くのがカッコいい!」
と思っていました。
でも歩いていると想像以上につかれる。雨が続くとすぐにカビる。蒸れる。

といった感じで、2,3足革靴を利用しましたが、革靴は断念し、新しい靴をネットで探し、評価が高かったこちらの商品を購入しました。

まず履き心地がスニーカーチック。履きやすい。そして手入れがかなり楽。クリーム等もほぼ塗らなくていい。
雨も防水設計だからしみてこないし、カビも生えにくい。
。。。うん、これコスパ最強。
ってことで、ずっとこれを使ってます。
今はいている革靴がダメになったら、是非次はテクシーリュクスのビジネスシューズを検討してみてください。

靴下

www.muji.net

靴下はスーツを売っているところで一緒に買うか、3足~円みたいなところで購入していました。
それなりに手ごろで、ビジネスで利用できる感じのものならできる限り安ければいい、という基準で選んでいました。
ユニクロで買うことが多かったかな。。。)

ただ、実際に履いていて、夕方ぐらいになると、なんだか靴下の締め付けがキツい。
一日中座っている自分のようなシステムエンジニアは、どうしてもだんだんと足がむくんできて、夕方になると締め付けがきつくなってきます。

このままでは絶対に足に良くないと考え、ビジネスで使えて、ゆるく履ける靴下を探した結果が直角靴下でした。
実際に履いてみると、夕方に靴下の締め付けを感じることが皆無(!)になり、靴下をめくった時の靴下跡がほぼなくなりました。
緩すぎて脱げてくるのではないかと心配される方もいるかもしれませんが、全く脱げる心配はありませんのでご安心ください。
今の靴下を履いていて靴下跡がきついと感じていたり、穴が開いたら購入を検討してみてください。
あと、靴下はできるだけ同じものを購入したほうがいいです。穴が開いたときに他の靴下で補てんできます。

ワイシャツ

ワイシャツは普通、洗濯するとすぐシワになります。
社会人になりたての頃は、ワイシャツを毎日、または毎週アイロンするのが普通だと思っていました。
でも、アイシャツに出会ってからは、アイロンする必要が全くなくなりました。
ドライ運転の洗濯機にネットの中に入れたシャツを放り込み、ハンガーにかけて、終わり。
次の日にはそのまま着ていけます。

その他

ここからは、私もまだ「これだ!」と思える商品に出会えてないツールを紹介します。
参考程度に見てもらえればと思います。

スーツ

今まで買ったことがあるのが、
www.suit-select.com
スーツ・ビジネススーツ・紳士服のP.S.FA【公式通販】
などです。

スーツセレクトは歩いている姿はカッコいいですが、
座ると膝がキツかったりして、長時間座って作業する人はあまり向かないかもしれないです。

時計

私的にはスカーゲンをおすすめしておきます。
腕周りの小さい人に特におすすめです。

めがね

システムエンジニアなど、長時間仕事でパソコンを利用する人はブルーライトカットメガネをすると、めちゃ楽です。
ただ、メガネ自体の重さでメガネ跡ができたり、メガネ自体が鬱陶しく感じたりする人にはお勧めできません。

可能なら、ブルーライトカットを防止できる液晶保護フィルムを貼ったり、画面の明るさを落としたり等、
他の手立てを考えたほうがいいかもしれません。

おわりに

長々と書いてしまいましたが以上です。
新人の頃はとにかく安いものに目が行きがちですが、安いものをつくるには、何かを削る必要があります。
削られたものが許容できない場合、ある程度お金を払ってでも、良い商品を買えばいいと思います。
より良い仕事をする環境づくりの一環、投資だと思ってください。

皆さんのビジネスライフがより快適に、より効率的に送れるようになることを願っております。

また、こんないいものがあるよ!などがあればどんどん共有していきましょう。

ソース整形2

  • 目的:

ソースコードのインデントを変更し、見やすくする。

  • 実現方法:

ソースファイルのデータを一行ずつ取得し、
中かっこの有無でインデントを進めるか判断するようにした。

  • 成果物:
using System;
using System.IO;
using System.Linq;
using EnvDTE; //Add Reference to EnvDTE,EnvDTE80
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string data = "";
            StringBuilder result = new StringBuilder();
            List<string> indexIncreaseData = new List<string> { "{", "if" };
            List<string> indexDecreaseData = new List<string> { "}"};
            int indentCount = 0;

            StreamReader sr = new StreamReader(@"C:\test\src.txt");
            while (!sr.EndOfStream)
            {
                data = sr.ReadLine();

                // 先頭の空白を除去
                data = Regex.Replace(data, "^ +", "");

                if (data.Split(new char[] { ' ' }).Where(n => indexDecreaseData.Contains(n)).Count() == 0)
                {
                    data = new String(' ', (indentCount * 4)) + data;
                }

                if (data.Split(new char[] { ' ' }).Where(n => indexIncreaseData.Contains(n)).Count() > 0)
                {
                    // indent proceed
                    indentCount++;
                }

                if (data.Split(new char[] { ' ' }).Where(n => indexDecreaseData.Contains(n)).Count() > 0)
                {
                    // indent back
                    data = new String(' ', (--indentCount * 4)) + data;
                }

                result.AppendLine(data);
            }

            StreamWriter sw = new StreamWriter(@"C:\test\src1.cs");

            sw.Write(result.ToString());

            sw.Close();

        }
    }
}
  • ナレッジ:
  1. using EnvDTE; //Add Reference to EnvDTE,EnvDTE80

 DTE:"Development Tools Extensibility" の略語
 →Visual Studioコアオートメーションのオブジェクトとメンバを含むアセンブリラップCOMライブラリです。
  →Visual Studioからアクティブなウインドウやアプリケーションを制御可能。

  1. COM:Component Object Modelの略語

 →特定のプログラミングに依存せず利用できる、バイナリコード単位のインターフェース。
 

  1. List indexIncreaseData = new List { "{", "if" };

 Listの初期化でいつも間違える。new Listの後に()は不要。

  1. 同じ文字列を指定回数繰り返した文字の作成方法

  一文字の場合:new String('a', 10)
 複数文字の場合:(new string('a', 10)).Replace("a", "hoge");

  • お世話になったサイト:
  1. DTEの意味

ttps://stackoverflow.com/questions/17239760/what-is-the-visual-studio-dte
ttps://docs.microsoft.com/en-us/dotnet/api/envdte.document?view=visualstudiosdk-2017

  1. 正規表現による置換

ttps://dobon.net/vb/dotnet/string/replace.html

  1. 同じ文字列を指定回数繰り返した文字の作成方法

ttps://dobon.net/vb/dotnet/string/repeat.html

ソース整形

using System;
using System.IO;
using EnvDTE; //Add Reference to EnvDTE,EnvDTE80

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            EnvDTE.Solution soln = System.Activator.CreateInstance(
                Type.GetTypeFromProgID("VisualStudio.Solution.14.0")) as EnvDTE.Solution;
            soln.DTE.MainWindow.Visible = true;
            FormatFile(@"C:\test\src.cs", soln);
            //Set ProgID of your VS
            //Visual Studio 2008 -> 10.0
            //Visual Studio 2010 -> 11.0
            //Visual Studio 2013 -> 12.0
            //Visual Studio 2015 -> 14.0
            //var files = Directory.GetFiles(@"C:\test", "*src.cs", SearchOption.AllDirectories).ToList();
            //files.ForEach(file => {
            //    FormatFile(file, soln);
            //    Console.WriteLine($"format {file}"); //C#6.0
            //});
        }

        static void FormatFile(string file, EnvDTE.Solution soln)
        {
            soln.DTE.ItemOperations.OpenFile(file);
            TextSelection selection = soln.DTE.ActiveDocument.Selection as TextSelection;
            selection.SelectAll();
            selection.SmartFormat();
            soln.DTE.ActiveDocument.Save();
            soln.DTE.ActiveWindow.Close();
        }
    }
}

Accessから抽出したCSVデータ処理用関数メモ

*まだ実際のCSVで作業してないので、作業後に更新する予定。

 

Accessから抽出したCSVデータを、フォルダ階層をきれいに抽出したいときに使える関数をメモしておきます。

 

やりたいこと:

・第三階層までのフォルダ一覧を抽出したい。

・重複フォルダは削除したい。

(C:\aaaのデータがあっても、以降にC:\aaa\bbbがあればC:\aaaは抽出しない)

・ファイル名までは今回抽出しない。

 

期待結果:

第一階層フォルダ,第二階層フォルダ,第三階層フォルダ

C,eee

,aaa

,bbb,ccc

 

Accessから抽出したCSVデータ:

フォルダパス,フォルダ名,ファイル名,拡張子,....

C:\,,hogehoge,txt,....

C:\,aaa,,,....

C:\,bbb,,,....

C:\,eee,,,....

C:\aaa\,,test,xlsx,....

C:\bbb\,,hoge,word,....

C:\bbb\,ccc,,,....

C:\bbb\ccc\,,data,dwg,....

※ちなみにファイル名欄にもフォルダ名欄にもデータがないことはあり得ない前提。

 

マクロ動作イメージ:

1.フォルダ名欄にデータが

 あるとき→2へ

 ないとき→3へ

2.以降のフォルダパス欄にファイルパス+フォルダ名が

 あるとき→重複する為不要なデータ

 ないとき→フォルダのみでファイルが入ってない状態。ファイルパス+フォルダ名の状態で取得。

3.ファイル名欄にデータが

 あるとき→4へ

 ないとき→ありえない

4.以降のファイルパス欄にさらに深い階層が

 あるとき→重複するので不要

 ないとき→取得。

 

実際の計算式:

=IF(E12<>"",IF(ISERROR(VLOOKUP(D12&E12&"\",D13:D19,1,FALSE))=FALSE,"",D12&E12&"\"),IF(F12<>"",IF(ISERROR(VLOOKUP(D12&"?*",D13:D19,1,FALSE))=FALSE,"",D12),"ありえない"))

※凡例:

D11:フォルダパス欄

E11:フォルダ名欄

F11:ファイル名欄

 

②重複データの削除

 データタブ-データツールの重複の削除

 

③円マークがあるごとにセルを区切り

 データタブ-区切り位置

 

④重複する項目(C:\eeeのあとにC:\aaaがきたときに、後者C:\部分の削除)

 ③の第一階層、第二階層に、それぞれ上と同じデータがあったら削除するマクロを実行する。

 Sub Sample2()
Dim c As Range, i As Long, d As String
For Each c In Selection
i = i + 1
If i = 1 Then
d = c.Value
Else
If d <> c.Value Then
d = c.Value
Else
c.Value = ""
End If
End If
Next c
End Sub

// list.add(new DbTransactionInitializer());
MockupFacade 
public final boolean mockupFlg = true;



TestformFormBeanーTestformFormBean
        this.M1.newRow();


info.M1.setDisplayRowCount(10);

// 大事な奴
// src/app
// src/skeleton
// WebContent/WEB-INF/classes

sqlserver 2014 express をインストール時にssmsが一覧に表示されないと嘆いている方

別ダウンロードだったのね。。。よくみてなかった。。。

f:id:oguri0220:20161120005342p:plain

'*******************************************************************************
'   フォルダを指定すると、フォルダ内のエクセルファイルを開いて、
'  任意のシートをコピーして集約用ファイルにコピーするマクロ
'   (集約用ファイルはダイアログで指定したフォルダの1階層上に作成されます)
'*******************************************************************************
Option Explicit

''
'取得したい内容に応じて随時変更して欲しい項目たち
''
    'SHEETNAME_NG_WORD-データを取得したく無いシート名に含まれる名前を逐次追加
    
    'それぞれのシートのコピーを集約用ファイル名
    Public Const PASTEFILENAME = "AllReports"

''
'変更不要
''
    'データを取得したく無いシート名に含まれる名前を指定
    Public SHEETNAME_NG_WORD As Variant
    
    '現在のシート数
    Public NOWSHEETCOUNT As Integer

    Public Enum CellBound
        RightBound = 0
        Leftbound = 1
        UpBound = 2
        DownBound = 3
    End Enum

    Public Type SearchRequirement
        Bound As CellBound
        OffsetValue As Integer
        CellName As String
    End Type

    Public Type SearchCellType
        TargetCellName As String
        TargetSheetName As String
        EndOfData As String
        Requirements() As SearchRequirement
    End Type



'*******************************************************************************
'   フォルダ選択ダイアログにて、コピーしたいEXCELファイルが入っているフォルダを
'  取得する
'*******************************************************************************
Function FolderSelect()
    Dim dlg As FileDialog
    Dim fold_path As String
    
    Set dlg = Application.FileDialog(msoFileDialogFolderPicker)
    
    'キャンセルボタンクリック時にマクロを終了
    If dlg.Show = False Then Exit Function
    
    'フォルダーのフルパスを変数に格納
    fold_path = dlg.SelectedItems(1)
    
    '関数名に対して値を設定すると、戻り値を設定したことになる
    FolderSelect = fold_path
End Function


'*******************************************************************************
'   Main
'*******************************************************************************
Sub CopyExcelSheet()
    Dim CPath As String
    Dim F As Object
    Dim i As Integer
    Dim dWB As Workbook
    Dim strNewFileName As String
    
    SHEETNAME_NG_WORD = Array("参考", "old_")
    
    NOWSHEETCOUNT = 0
       
    '集約用ブックを作成
    Set dWB = Workbooks.Add
    
    CPath = FolderSelect()
    
    If CPath = "" Then Exit Sub
    
    'フォルダが同じだと2回目以降に前に作ったシートの中もコピーしてくるため、
    '一つ上の階層のフォルダに作成
    strNewFileName = ".\" & PASTEFILENAME
    
    Application.ScreenUpdating = False
       
    'フォルダ内のファイルを一つずつ取得
    For Each F In CreateObject("Scripting.FileSystemObject").GetFolder(CPath).Files
        If Right(F.Name, 4) = ".xls" Or Right(F.Name, 5) = ".xlsx" Then
            
            'EXCELファイルの場合は情報取得処理
            'Call CopyExcelSheets(dWB, CPath, F.Name)
            Call GetExcelData(dWB, CPath, F.Name)
        End If
    Next
        
    'Excelバージョンによって、ファイルの保存方法を変更
    Application.DisplayAlerts = False
    If Val(Application.Version) < 12 Then
        dWB.SaveAs Filename:=strNewFileName
    Else
        dWB.SaveAs Filename:=strNewFileName, FileFormat:=XlFileFormat.xlExcel8
    End If
    dWB.Close
    
    Application.ScreenUpdating = True
    
    MsgBox "終了"
End Sub


'*******************************************************************************
'   エクセルシートコピー用関数
'*******************************************************************************
Function CopyExcelSheets(dWB As Workbook, xPath As String, xName As String)
    Dim xlsWkb As Object
    Dim isExcelCopy As Boolean
    Dim i As Integer
    Dim Sht As Worksheet

    
    'ファイルを開く
    Set xlsWkb = Workbooks.Open(xPath & "\" & xName)
    
    'ファイルからシートを抽出
    For Each Sht In xlsWkb.Worksheets
    
        isExcelCopy = True
        
        For i = 0 To UBound(SHEETNAME_NG_WORD) - LBound(SHEETNAME_NG_WORD)
            If InStr(Sht.Name, SHEETNAME_NG_WORD(i)) > 0 Then
                'シート名にNGワードが合ったらコピーしない
                isExcelCopy = False
            End If
        Next
        
        If isExcelCopy = True Then
            NOWSHEETCOUNT = NOWSHEETCOUNT + 1
            
            'シートをコピー
            Sht.Copy After:=dWB.Worksheets(dWB.Worksheets.Count)
            
            'ActiveSheet.Cells(1).PasteSpecial Paste:=xlValues
            
            'シート名を重複しない...ハズの値に変更
            ActiveSheet.Name = NOWSHEETCOUNT & Sht.Name
            
            Application.CutCopyMode = False
        End If
        
        
    Next Sht
    
    xlsWkb.Close:
    Set xlsWkb = Nothing
End Function

'*******************************************************************************
'   データ取得用関数
'*******************************************************************************
Function GetExcelData(dWB As Workbook, xPath As String, xName As String)
    Dim xlsWkb As Object
    Dim isExcelCopy As Boolean
    Dim i As Integer
    Dim Sht As Worksheet
    
    Dim jyoken As SearchCellType
    Dim Target As Range
    
    jyoken.TargetCellName = "機能"
    jyoken.TargetSheetName = ""
    jyoken.EndOfData = ""
    ReDim jyoken.Requirements(1)
    
    jyoken.Requirements(0).CellName = "aa"
    jyoken.Requirements(0).Bound = RightBound
    jyoken.Requirements(0).OffsetValue = 4
    
    
    'ファイルを開く
    Set xlsWkb = Workbooks.Open(xPath & "\" & xName)
    Dim FoundCell As Range, FirstCell As Range
    'ファイルからシートを抽出
    For Each Sht In xlsWkb.Worksheets
    
        isExcelCopy = True
        
        If jyoken.TargetSheetName <> "" And Sht.Name <> jyoken.TargetSheetName Then
        
        Else
            Target = SearchMatchCell(Sht, jyoken)
        End If
        
        'For i = 0 To UBound(SHEETNAME_NG_WORD) - LBound(SHEETNAME_NG_WORD)
        '    If InStr(Sht.Name, SHEETNAME_NG_WORD(i)) > 0 Then
        '        'シート名にNGワードが合ったらコピーしない
        '        isExcelCopy = False
       '     End If
        'Next
        
        If Not Target Is Nothing Then
            Do
                Set FoundCell = Cells.FindNext(Target)
        
                If FoundCell.Address = Target.Address Then
                    Exit Function
                Else
                    Target.Copy Destination:=dWB.Worksheets("Sheet2").Range("A1")
                End If
            Loop
        End If
        
        'If isExcelCopy = True Then
        '    NOWSHEETCOUNT = NOWSHEETCOUNT + 1
            
            
        '    dWB.Worksheets("Sheet2").Value = ""
            
            'シートをコピー
            'Sht.Copy After:=dWB.Worksheets(dWB.Worksheets.Count)
            
            'ActiveSheet.Cells(1).PasteSpecial Paste:=xlValues
            
            'シート名を重複しない...ハズの値に変更
            'ActiveSheet.Name = NOWSHEETCOUNT & Sht.Name
            
            'Application.CutCopyMode = False
        'End If
        
        
    Next Sht
    
    xlsWkb.Close:
    Set xlsWkb = Nothing
End Function


Function SearchMatchCell(sheet As Worksheet, searchName As SearchCellType) As Range
    Dim Rng As Range
    Dim FoundCell As Range, FirstCell As Range, Target As Range
    
    Set FoundCell = sheet.Cells.Find(What:=searchName.TargetCellName, LookIn:=xlValues, LookAt:=xlWhole)
    If FoundCell Is Nothing Then
        '条件に見合うセルがない
        Exit Function
    ElseIf Not FoundCell Is Nothing And Sgn(searchName.Requirements) = 0 Then
        '追加条件なし
        SearchMatchCell = FoundCell
        Exit Function
    Else
        '追加条件あり
        Set FirstCell = FoundCell
        Set Target = FoundCell
    End If
    
    Do
        Dim j As Long
        Dim isMatchCell As Boolean
        
        For j = LBound(searchName.Requirements) To UBound(searchName.Requirements)
        
            isMatchCell = True
'If FoundCell.MergeCells Then
            '    If searchName.Requirements(j).Bound = CellBound.RightBound Then
            '        offset = FoundCell.MergeArea.Columns.Count
            '    ElseIf searchName.Requirements(j).Bound = CellBound.DownBound Then
            '        offset = FoundCell.MergeArea.Rows.Count
            '    End If
            'End If
            
            
            Select Case searchName.Requirements(j).Bound
                Case CellBound.RightBound
                    If sheet.Cells(FoundCell.Row, FoundCell.Column + searchName.Requirements(j).OffsetValue).Value <> _
                        searchName.Requirements(j).CellName Then
                            isMatchCell = False
                            Exit For
                    End If
                Case CellBound.Leftbound
                    If sheet.Cells(FoundCell.Row, FoundCell.Column - searchName.Requirements(j).OffsetValue).Value <> _
                        searchName.Requirements(j).CellName Then
                            isMatchCell = False
                            Exit For
                    End If
                Case CellBound.UpBound
                    If sheet.Cells(FoundCell.Row - searchName.Requirements(j).OffsetValue, FoundCell.Column).Value <> _
                        searchName.Requirements(j).CellName Then
                            isMatchCell = False
                            Exit For
                    End If
                Case CellBound.DownBound
                    If sheet.Cells(FoundCell.Row + searchName.Requirements(j).OffsetValue, FoundCell.Column + searchName.Requirements(j).OffsetValue).Value <> _
                        searchName.Requirements(j).CellName Then
                            isMatchCell = False
                            Exit For
                    End If
            End Select
'Msg = Msg & searchName(j).TargetCellName & vbCrLf
        Next j
        
        If isMatchCell Then
            '合致したセルとして返却
            SearchMatchCell = FoundCell
            Exit Function
        Else
            Set FoundCell = sheet.Cells.FindNext(FoundCell)
    
            If FoundCell.Address = FirstCell.Address Then
                Exit Function
            End If
        End If
    Loop
End Function