echo("備忘録");

IT技術やプログラミング関連など、技術系の事を備忘録的にまとめています。

【Visual Studio Code】Settings Syncで環境を同期する

前回のブログで、最後に「環境の再現なら、Settings Syncを使えば...」という記載をしたのですが、VS Codeでの環境を同期する拡張機能「Settings Sync」が使いやすかったので、それを使用した環境の同期方法を書きました。

前提

前提として、下記が必要になります。

Githubの「個人アクセストークン」の取得方法

  1. Githubにログインして、右上のメニューから「Settings」を選択
  2. 左のメニューから「Developer Settings」を選択
  3. 左のメニューから「Personal Access Tokens」を選択する。
  4. 「Token description」には任意の文字列(「Settings Sync Token」とか)を入力し、チェックボックスは「gist」のみチェックを付ける。
  5. 1~4を終えると、トークンが表示されるので、メモなりコピーなりしておく。
    • このトークンは一度画面を閉じると、再度表示できないので注意。
    • トークンを忘れたら、「Generate New Token」で別のトークンを生成する。

f:id:Makky12:20190503195003p:plain f:id:Makky12:20190503195017p:plain f:id:Makky12:20190503195028p:plain

インストール&VSCode設定のアップロード方法

  • インストールは、VS Codeの「拡張機能」から「Settings Sync」で検索すれば見つかるので、インストールすればOK。
  • インストール完了後、コマンドパレットの「Sync:設定をアップロード」(またはshift+alt+「u」)を実行。
  • Github の個人アクセストークンを入力してください」と表示されるので、先程取得したトークンを入力する。

f:id:Makky12:20190503195509p:plain f:id:Makky12:20190503195047p:plain

「Gist ID」の確認方法

  1. アップロードを完了後、Github右上のメニューから「Your Gists」を選択
  2. 「cloudSettings」という項目があるので、選択。
  3. 「cloudSettings」のURLを見ると、「https:// gist.github.com/(ユーザー名)/(文字列)」となっており、最後の(文字列)の部分がGist IDになる。

設定のダウンロード方法

  1. コマンドパレットの「Sync:設定をダウンロード」(またはshift+alt+「d」)を実行。
  2. Github の個人アクセストークンを入力してください」と表示されるので、最初に取得したトークンを入力する。
  3. 「Gist Id を入力してください」と表示されるので、先程確認した「Gist ID」を入力する。
  4. すると、設定のダウンロードが始まる。(「出力」にダウンロード状況が表示される。)

トークンとGist IDの順番を間違えないように注意!!
※設定をダウンロードすると、元々ローカルPCにインストールした拡張機能はなくなってしまう(「マージ」ではなく「上書き」)。
なのでダウンロード前に、あらかじめアップロードしておくこと!!

f:id:Makky12:20190503195055p:plain

トークンやGist IDを間違えてしまったら?

  • コマンドパレットの「Sync:拡張機能の設定をリセット」を実行すれば、トークンやGist IDの設定が消去される。
  • その後、アップロードやダウンロードを実行すると、再度聞かれるので、正しい値を入力すればOK。

未確認事項(確認したいけどできない)

  • 複数台のPCで、それぞれ設定をアップロードすると、複数の「cloudSettings」ができる。
  • Gist側で、各*.jsonファイルの内容をマージしたら、一つに統合できるのか?
  • 下記「対処法が不明な現象」のせいで、確認ができない...

対処法が不明な現象

  • VS Codeの最新版(1.33.1)をインストール後、Settings Syncでアップロードやダウンロードを行おうとすると、下記エラーが発生する。
    • DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.
  • 「Buffer()」が脆弱性の関係で非推奨なので別の記載をしろ、というエラーだが、いろいろネットで調べても、有効な回避法が見つかっていない。
  • 対処方法をご存知の方がいれば、Twitterなどでご連絡をお願いします。

最後、尻切れトンボみたいな感じになってしまいましたが、だいたいこんな感じで、環境の同期ができます。

【Visual Studio Code】「ERRO Bad arguments:」で更新ができない場合の対策

現象

Visual Studio Codeで「更新の確認」などを行い、アップデートを行った際、

  • 下の画像のようなエラーが表示され、更新に失敗する。
  • エラーメッセージに記載されているログを確認すると、「ERRO Bad arguments: Code path doesn't seem to exist: (Code.exeの絶対パス)」というログが記載されている。

f:id:Makky12:20190426201106p:plain

【注】

  • 下の画像では消しましたが、実際には一番下に、詳細情報が記載されたログファイルの保存先が表示されています。
  • 「ERRO」は記載ミスではなく、本当にそう書いてあります。(おそらく4文字にしたので、最後の「R」が削られたのかと。)

原因

(Code.exeの絶対パス)の場所に、「Code.exe」がない。

  • インストールした際のユーザーアカウントと、実際に使用しているユーザーアカウントが違う...などの際に起こる場合がある。
  • 使用アカウントを1つに固定していれば起こらないが、1人で複数アカウントを使用していると、まれに起こる。(僕みたいに...)

対策

VS Codeのアンインストール→再インストールする。

【調べたこと】

  • 「設定」にはCode.exeの保存先パスを定義しているような場所はなかった。
  • Code.exeのショートカットを「Code.exe」という名前で(Code.exeの絶対パス)に保存しても、現象変わらず。
  • レジストリエディタ」でそれらしいパスを定義してる場所があったが、変更→再起動しても、症状は改善しなかった。
    • これについては、もう少し突っ込んで調べてもよかったかも...

※個人的には、下記の理由から、リスクを負ってまでレジストリを触るくらいなら、正直再インストールしたほうが良いと思う。

  • Visual Stuidioと違って、言っても「エディタ」なので、ダウンロード&インストール自体はすぐ終わる。
  • 環境(設定や拡張機能)自体は、Settings Syncの様な便利な拡張機能を使えば、すぐ元にに戻せる。

【Docker】ベースイメージ取得時のトラブル対応

今回もDockerネタ。
ベースイメージ取得時(docker buildコマンド実行時など)に発生するトラブルと、その原因など。
ただし今回は本当に備忘録程度に。

ベースイメージ取得時のエラー(その1)

現象

ベースイメージ取得時に下記メッセージが表示され、取得に失敗する。
request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).

原因

DNSサーバーの自動解決がうまくいっていない。

対策

DNSサーバーを自動解決させるのではなく、自分で指定する。
Docker for Windowsの場合、[Settings] - [Network] - [DNS Server]の設定を「Fixed/8.8.8.8」にするとうまくいった。(僕の場合)

ベースイメージ取得時のエラー(その2)

現象

ベースイメージ取得時に下記メッセージが表示され、取得に失敗する。
unauthorized: authentication required

原因

  • 起動時にログインができていない。
  • メールアドレスでログインしている。

対策

  • 前者は事前に正しくログインが出来ていることを確認する。
  • 後者はメールアドレスではなく、ユーザ名でログインする。

※Docker起動時のログインはメールアドレスでもOKだが、(ベースイメージ取得時など)一部データ取得時の認証が、メールアドレスだと失敗する模様。

以上、今回は本当に備忘録程度に。

【Docker】起動やドライブのマウントができない場合の対処法

※2019/3/12追記:タイトル少し変えました。

最近Laravelの動作環境としてDocker + LaraDockを導入したのですが、Dockerの[Settings] - [Shared Drives]でドライブのマウントに失敗する事例があったので、その対処法のメモ。

Windows版での内容になります。
※「個人のPCにインストールする」前提で書いてます。

Firewall Detected」メッセージが表示される

現象

ドライブのマウント時に、下記メッセージが表示され、マウントができない。
A firewall is blocking file sharing between Windows and containers. See documantation for more info.

原因

セキュリティソフトのファイアウォールが原因で、ブロックされている。

対策

セキュリティソフトのファイアウォールの設定を変更し、Dockerを許可する
※設定方法はセキュリティソフトにより異なる。

【参考】カスペルスキー インターネットセキュリティの場合

  • [設定] - [プロテクション] - [ファイアウォール]を選択
  • [ネットワーク]をクリック
  • 「(DockerNat)」と記載のあるネットワークを[編集]
  • 「ネットワークの種別」を「許可するネットワーク」にする。

Microsoft 365 Businessでログインしている場合に、マウントのチェックが消える

現象

Microsoft 365 Businessアカウント(xxx@onmicorsoft.com)でログインしているユーザーでドライブのマウントを実行すると、

  • 正しいユーザー名・パスワードを入力しても、該当ドライブにチェックが付かず、マウントできない。
  • エラーメッセージは表示されない

原因

アカウント名とセキュリティ ID の間のマッピングに失敗している。
※詳細は下記サイトの「AzureAD の場合」を参照

対策

下記手順を実行する。

  • アカウント名(AzureAD\(ユーザー名))の「ユーザー名」の部分のみのローカルアカウントを[コントロールパネル] - [ユーザーアカウント]から作成する。
  • 再起動後、Microsoft 365 Businessアカウントでログインする(ローカルアカウントではない)。
  • 作成したローカルアカウントの権限を「管理者」にする。(2019/3/12追記)
  • ドライブマウント時に聞かれるユーザー名では、「ユーザー名」の部分のみ入力する。(「AzureAD\」は不要。なおパスワードは変更なし)

起動時に「Access Denied」メッセージが表示される(2019/3/12追記)

現象

Docker起動時に下記メッセージが表示され、Dockerを起動できない。
You are not allowed to Use Docker.
You must be in the "docker-users" group

原因

該当ユーザーがPC内での「docker-users」グループに所属していない。
(インストールユーザーと別ユーザーでログインした、など)

対策

下記手順で、該当ユーザーを「docker-users」に追加する。(管理者権限ユーザーで実行する)

  • Windwosの[コンピュータの管理]を実行。([プログラム] - [管理ツール])
  • 左ツリーから[ローカルユーザーとグループ] - [グループ]をクリック
  • 右側の[docker-users]を右クリック - [プロパティ]を選択
  • [追加]をクリックして、[ユーザーの追加]画面で該当ユーザーを選択して[OK]
  • PCを再起動

ただ、dockerグループのユーザー追加は、セキュリティ上のリスクがある。
(下記サイト参照)
Windows版は上記対策しないとそもそも起動自体が出来ないのであれだけど、
今後は権限(実行可能なコマンド)設定なども可能になる?

僕の場合はこれで解決できたが、もちろん上記では解決できない現象はあるかも。

というか、Docker(やLaraDock)は便利な半面、いろいろあるみたいですね。次回は環境構築や上記以外のトラブルについてのブログを書く予定です。

【Excella】Excella Repotsで、結合セルの値の取得・設定を行う方法

前回、「単一セルのExcella Reports上で書式・スタイルの設定を行う」方法を書きました。

しかし、結合セルの場合、前回記載した

Row row = sheet.getRow(0);
Cell cell = row.getCell(0);
cell.setCellStyle(style);

のように、単純に(結合セルの一番左上の)行・列のインデックスを指定する方法では、対象の結合セルを取得できません。

そこで、結合セルの場合どうするか、というのが今回の内容です。

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.CellRangeAddress;
import org.apache.poi.ss.usermodel.Workbook;
import org.bbreak.excella.core.SheetData;
import org.bbreak.excella.core.SheetParser;
import org.bbreak.excella.core.exception.ParseException;
import org.bbreak.excella.reports.listener.ReportProcessListener;
import org.bbreak.excella.reports.model.ReportBook;
import org.bbreak.excella.reports.model.ReportSheet;

public class SheetFormatSetter implements ReportProcessListener {
    
    public SheetFormatSetter() {
    }
    
    @Override
    public void postParse(Sheet sheet, SheetParser sheetParser, SheetData sheetData) throws ParseException {

        // sheetは、処理対象のシート。
        final int mergedCellCount = sheet.getNumMergedRegions();
        
        for(int i = 0; i < mergedCellCount; i++) {

            // シート内の各結合セルについて、左上のセルの行・列のインデックスを取得する。
            final CellRangeAddress range = sheet.GetMergedRegion(i);
            final int firstRow = range.getFirstRow();
            final int firstCol = range.getFirstColumn();

            // 結合セルの一番左上のセルを取得する。(値は一番左上のセルに設定されてるから)
            Row row = sheet.getRow(firstRow);
            Cell cell = row.getCell(firstCol);

            // セルの値の取得&設定。(ここまでくれば、あとは前回の内容と同じ)
            String value = cell.getStringCellValue();
            cell.setCellValue("new Value");
        }

        return;
    }

説明

ソースを見て、なんとなくわかった人も多いと思いますが、

  • (行・列のインデックス指定による結合セルの直接取得はでき)ないです。
  • (煩雑ですが、シート内の全ての結合セルを取得後、各結合セルの左上のセルを取得するという方法しか)ないです。
  • 結合セルの数は、SheetのgetNumMergedRegions()メソッドで取得できます。

という、ちょっと残念な結果になってしまいました。

注意点

  • 「特定のセル」を取得する際は、getFirstRow()やgetFirstColumn()の値に対して、ifなどでチェックをする必要があります。
  • GetMergedRegion(index)で取得できるセルは、indexを0, 1, 2...のように指定しても、「行の昇順、列の昇順」のように決まった順序で取得できるわけではないので注意です。*1

ということで、今回もExcella Reportsの記事でした。


実は、3月は完全にお休み...なので、1ヶ月まるまる休みです。でもいざ休みとなると、嬉しい反面、やっぱり不安もあったり。

...まあ、3月どころか、4月以降も全く未定なんですけどね...(お仕事のお話がありましたら、TwitterのDMなどで連絡をお願いします。)

*1:実際、ログにgetFirstRow()やgetFirstColumn()の値を記載してみましたが、てんでバラバラでした

【Excella】Excella Reportsで書式・スタイル設定を行う方法

現在、仕事で「Excella Reports」という、JavaからExcel/PDFを出力するライブラリを使用してます。

Excella Reports

便利なのですが、中の人(?)も言っている通り、書式やスタイル設定はちょっと弱いところのようです。

なので、分かる範囲で書式・スタイル設定についてまとめてみました

ソースコード

import org.bbreak.excella.core.SheetData;
import org.bbreak.excella.core.SheetParser;
import org.bbreak.excella.core.exception.ParseException;
import org.bbreak.excella.reports.listener.ReportProcessListener;
import org.bbreak.excella.reports.model.ReportBook;
import org.bbreak.excella.reports.model.ReportSheet;

public class Main {

    public static void main(String[] args) throws Exception {

        // テンプレートファイルの指定
        String templateFilePath = "SampleTemplate.xls";
        String outputFileName = "Sample";
        String outputFileDir = "Sample/Temp";
        String outputFilePath = outputFileDir.concat(outputFileName);

       // ReportBookの作成
        ReportBook outputBook = new ReportBook(templateFilePath,
                outputFilePath, ExcelExporter.FORMAT_TYPE);

        // シートの作成
        ReportSheet outputSheet = new ReportSheet("TemplateSheet", "Sheet1");
        outputBook.addReportSheet(outputSheet);

        // シートのセルに値を設定する。
        int data = 1.23;
        outputSheet.addParam(SingleParamParser.DEFAULT_TAG, "DATA1", data1);

        // ReportProcessListenerの定義&ブックの出力
        ReportProcessor reportProcessor = new ReportProcessor();
        reportProcessor.addReportProcessListener(new SheetFormatSetter());
        reportProcessor.process(outputBook);
    }
}
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.bbreak.excella.core.SheetData;
import org.bbreak.excella.core.SheetParser;
import org.bbreak.excella.core.exception.ParseException;
import org.bbreak.excella.reports.listener.ReportProcessListener;
import org.bbreak.excella.reports.model.ReportBook;
import org.bbreak.excella.reports.model.ReportSheet;

public class SheetFormatSetterimplements ReportProcessListener {

    public SheetFormatSetter() {
    }

    @Override
    public void postParse(Sheet sheet, SheetParser sheetParser, SheetData sheetData) throws ParseException {
        
        // WorkbookはsheetのgetWorkBook()メソッドから取得。
        Workbook wb = sheet.getWorkBook();

        CellStyle style = wb.createCellStyle();

        // 表示形式、フォントの設定
        DataFormat format = wb.createDataFormat();
        style.setDataFormat(format.getFormat("#,##0.###");       
       
        Font font = wb.createFont();
        font.setFontName("MS 明朝");
        font.setFontHeightInPoints((short)10);
        style.setFont(font);

        // 縦横位置&上枠線の設定
        style.setAlignment(Cellstyle.ALIGN_RIGHT);
        style.setVerticalAlignment(Cellstyle.VERTICAL_CENTER); 
        style.setBorderTop(CellStyle.BORDER_THICK);
       
        // 対象セル(A1)を取得し、スタイルを設定
        Row row = sheet.getRow(0);
        Cell cell = row.getCell(0);

        cell.setCellStyle(style);
    
        return;
    }
}

基本的にはリファレンスにも書いてある通り、ReportProcessListenerのメソッド(preXX(), postXX())から、Apache POIのAPIを直接呼び出すことになります。

ブック&スタイルの作成

 Workbook wb = sheet.getWorkBook();
 CellStyle style = wb.createCellStyle();

Apache POIだと、CellStyleをHSSFWorkBookクラスのcreateCellStyle()メソッドで作成しますが、Excella ReportsのReportBookクラスには、それに該当するメソッドはありません。

ただし、ReportProcessListenerのメソッドの引数sheetのgetWorkBook()メソッドでWorkBookが取得できますので、そのcreateCellStyle()メソッドからCellStyleを取得できます。

スタイルの各書式の設定

// 上から順に、位置揃え(横)、位置揃え(縦)、セルの上枠線
style.setAlignment(Cellstyle.ALIGN_RIGHT);
style.setVerticalAlignment(Cellstyle.VERTICAL_CENTER); 
style.setBorderTop(CellStyle.BORDER_THICK);

スタイルの各プロパティの設定は、プロパティごとに設定用のメソッドが用意されているので、それを使用します。

上記のように、あらかじめ用意されている定数をそのまま使用する場合は、該当の定数を引数に指定します。

// 表示形式、およびフォント
DataFormat format = wb.createDataFormat();
style.setDataFormat(format.getFormat("#,##0.###");       
       
Font font = wb.createFont();
font.setFontName("MS 明朝");
font.setFontHeightInPoints((short)10);
style.setFont(font);

定数をそのまま使用するのではなく、自分で色々カスタマイズする場合、上記のようにWorkBookのcreateXX()メソッドで該当のインターフェースを取得後、

そのsetXX()メソッドで各種プロパティを設定し、最後にCellStyleの設定用メソッドの引数として該当のインターフェースのインスタンスを渡します。

実際にセルに設定する

Row row = sheet.getRow(0);
Cell cell = row.getCell(0);

cell.setCellStyle(style);

最後に、SheetのgetRow()メソッド、及びRowのgetCell()メソッドで対象のセルを取得し、そのsetCellStyle()メソッドの引数に先程のCellStyleのインスタンスを渡し、実際に書式・スタイルを適用します。

なお、長くなるので省略していますが、実際にはrowやcellのnullチェックを忘れないようにしてください。(値が設定されていない場合、nullが返ります。)

また、今回は値を決め打ちしたので不要でしたが、実際に表示形式など、値の内容に依存する書式を設定する際は、事前にCellのgetCellType()メソッドで、セルの値の型を調べるのを忘れないようにしてください。

参考サイト


前回の投稿から2ヶ月...確かに新年入ってから、すごくメンタルの調子が悪かったのです。

...でも、もう少し更新頻度は上げていきたいです。

愛知県知多半島に住むフリーランスエンジニアのお話

これは「IT地方エンジニア Advent Calendar 2018」 12/24日分の記事です。

知多半島」ってどこよ?

愛知県南西部、2つある半島のうち、「く」の字型の方の半島です。

f:id:Makky12:20181223192936p:plain
知多半島半田市

  • 夏はマリンレジャーや花火大会で盛り上がります。
  • 「知多娘」という萌えキャラで、半島一丸で町(?)おこしをしています。

知多娘。公式WEBサイト

また僕が住んでいるのは「半田市」という、知多半島の中心というべき市で、

  • 「蔵」や「山車」が有名。 また「ごんぎつね」の作者、新見南吉の出身地。
  • 山車が市内だけで31台もあり、5年に1回「はんだ山車まつり」という、市内31台の山車が一堂に集まる祭りがある。
  • 「酢」で有名な「ミツカン酢」の本社があるのが、この半田市

ただ実際に僕が住んでる区域は、半田市でもかなり西の場所なので、むしろ常滑焼や中部国際空港(セントレア)で有名な、常滑市のほうが近いんですけどね。(セントレアまで車で20分)

何やってる人なの?

そんな「都会」とは対極の場所に住んでいながら、(10年間のうつ病パニック障害との闘病を経て)現在はフリーランスエンジニアをしています。

主に業務用のWebシステム開発プロジェクトに参画しております。
それ以外にも、ECサイト開発、スマホゲームアプリ、デスクトップアプリ開発などもこなす、 割と「オールラウンダー」なフリーランスです。
またプログラミング以外にも、要件定義~運用まで、一通り全てこなせます。

言語としては

  • サーバー:Java(Springとか)、およびPHP(Laravel, Cake, Fuel)
  • クライアント:Javascript、TypeScript、Vue.js
  • その他:.net、WPF、Xamarin、Kotlin、swift

などが中心です。

あと、サーバー・クライアントなどに関係なく、C#大好き人間です。
それ以外にも、シェルスクリプト(bash)なんかも扱ったりします。

またOSは、WindowsLinuxが中心です。(次点がAndroid, Macあたり)
DBは、SQL ServerOracleMySQLPostgreSQLなんかを扱えます。

ちなみに、未経験の分野でも機会があれば、ガンガン挑戦していくタイプのエンジニアです。
(近方・遠方限らず、お仕事の連絡、お待ちしてます。リモートワーク可能だと、すごく嬉しいです。)

地方ならではの問題

中心地まで遠い

愛知県といえば、やはり大半の就業先は名古屋になります。
(一部三河地方にもありますが、少なくとも知多半島にはほぼ皆無です)

ドアツードアで30分」とか、そういう恵まれた環境なら良いですが、電車の乗車時間だけで40分、ドアツードアなら余裕で1時間オーバーです。

その結果、以下のような「時間の弊害」が発生します。

  • 定時終業でも、家に帰ったら結構遅い時間なので、なかなかスキルアップの時間(どころか、プライベートな時間すら)が取れない。
  • 勉強会や懇親会などに参加しても、生活サイクルや終電の関係で、不参加 or 早めに切り上げざるを得ないので、人脈形成や情報収集が十分にできない。

(昔ながらの)保守的な考えの企業(SI屋?)が多い

愛知県は、冗談で「ト〇タ県」と言われるほど、製造業(自動車関連)が盛んです。
自動車業界は、特にセキュリティには敏感な業界ですが、その影響か「リモートワーク不可」「フレックス勤務不可」の企業が多いです。 (もちろん例外もあります)

なにが嫌かって、「わざわざ生活時間帯を合わせなきゃいけない」点。

リモートワーク可能ならば全て解決なのですが、せめてフレックスぐらい可能にして、帰宅後の時間を増やしてくれ、と。
ただでさえ、通勤時間でかなり時間を無駄にしてますから。
少しでも時間を有効に使えるようにしたいです。

てか、TwitterのTLで流れてくる東京の情報を見ると、ちょっとうらやましくなります。

解決策

解決策ですが、下記のようなものでしょうか。

  • 東京の人とつながりを持ち、その人経由で案件をもらう
  • 時間を確保できる働き方ができる案件を、自分で(営業して)見つける。
  • 東京に移住する

東京の人とつながりを持つ

個人的に、興味のある技術の勉強会などで、わりと東京に行っています。(ほぼ品川か渋谷ですが...)

少しずつ活動はしていますが、まだまだ成果が出るのは先でしょうね...
そもそも、お金の関係もあり、ホイホイと気軽に行けるわけでもないですし。

それでも、今後もそういう活動を続けないと、と思います。
だって、単価も案件も一番魅力的なのは、やはり東京ですし。

自分で営業する

これが出来ると良いんですが。
てか自分でも「いずれは出来るようにならないと」と思ってます。

そのためにも、

  • 地元の人(技術者やIT業界の関係者)とつながりを持つ
  • ポートフォリオサイトなど、営業ツールを作成する。
  • いろんな会合に、積極的に参加し、人脈&交流を広める。

をしなくては、と思ってます。

そして「リモート可」「週4可能」のような、自分に時間のゆとりが持てる働き方を手に入れなければ、と思ってます。
そして、その時間を、さらに自分のスキルアップや営業力アップに充てられれば、いい正のスパイラルができるなあ、と。

てか友人の女性にも「行動しないと、仕事も奥さんも手に入らないよ!」と言われましたし...)

東京に移住する

これが出来れば、一番問題ないんでしょうけどね。

ただ残念ながら、最初に少し書いた「うつ病パニック障害」の関係で、移住(てか、それ以前に一人暮らしが)NGなのです...

※通常勤務自体は問題ないんですが、先述の病気の関係で、周囲の生活音の影響が大きい一人暮らしは、医師や相談医から「絶対NG!」と強く言われております。
そのため、未だに実家住まい(実家から出られない)です...

※てか、「東京に移住」が出来るなら、こんな長文ブログ、書く必要ないもんな...

最後に

来年以降、こんなことやりたいなあ、なんて思ってます。

  • 上に書いたことを、少しずつでよいから、続けていく
  • LT登壇
  • フリーエンジニアの人と、もっと交流を持って、いろんな情報を共有する(分野、地方問わず)
  • 懇親会にも出来るだけ参加して、いろいろな人と関わっていく
  • ITイベントの運営(特に地方の市町村で行われるような「地元密着型」イベント)
    ※今年「ブイアールサンダー」という、豊橋市二川で行われたイベントに参加させて頂いたのですが、あんな感じのイベントの運営に携わりたいなあ、と。

以上、ものすごい長文になってしまいましたが、最後まで読んでいただき、本当にありがとうございました。

それでは、よいクリスマスイブを!

明日12/25、大トリの日記は、taikiixさんです。