より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

読書感想「手づくりビール読本」

手づくりビール読本

ビールに使うホップの育て方から、自宅でビールの作り方、ビールサーバーの作り方まで紹介した本です。

全て白黒で二段組の本なので、やや読みづらいですね。

ただ、ビールって鍋で作れるという話は聞いていたので、本当に作れるんだなあと思いました。

Directory.CreateDirectoryでPathTooExceptionのはずが、DirectoryNotFoundExceptionが発生する

Windowsのファイルパスは標準では260文字未満、ディレクトリ名は248文字未満となっているため、それをオーバーすると以下のようなエラーが発生します。

System.IO.PathTooLongException: 指定されたパス、ファイル名、またはその両方が長すぎます。完全限定型名は 260 文字未満で指定し、ディレクトリ名は 248 未満で指定してください。
   場所 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   場所 System.IO.Directory.InternalCreateDirectory(String fullPath, String path, Object dirSecurityObj, Boolean checkHost)
   場所 System.IO.Directory.InternalCreateDirectoryHelper(String path, Boolean checkHost)
   場所 System.IO.Directory.CreateDirectory(String path)
   場所 CreateDirectory.Program.Main(String[] args) 

しかし、PathTooLongExceptionではなく、 DirectoryNotFoundExceptionが発生してしまうことがあるのです。

using System;
using System.IO;

namespace CreateDirectory
{
    internal class Program
    {
        public static void Main(string[] args)
        {
            var path = @"C:\bbbb\";
            for (int i = 0; i < 270; i++)
            {
                try
                {
                    path += "a";
                    Directory.CreateDirectory(path);
                    Directory.Delete(path);
                }
                catch (Exception e)
                {
                    Console.WriteLine($"Path Length={path.Length}:{e.GetType()}");
                }
                
            }
        }
    }
}

以下のような結果になり、なぜか、260文字〜260文字+サブディレクトリの文字数までは DirectoryNotFoundExceptionになってしまうのです。

Path Length=252:System.IO.PathTooLongException
Path Length=253:System.IO.PathTooLongException
Path Length=254:System.IO.PathTooLongException
Path Length=255:System.IO.PathTooLongException
Path Length=256:System.IO.PathTooLongException
Path Length=257:System.IO.PathTooLongException
Path Length=258:System.IO.PathTooLongException
Path Length=259:System.IO.PathTooLongException
Path Length=260:System.IO.DirectoryNotFoundException
Path Length=261:System.IO.DirectoryNotFoundException
Path Length=262:System.IO.DirectoryNotFoundException
Path Length=263:System.IO.DirectoryNotFoundException
Path Length=264:System.IO.PathTooLongException
Path Length=265:System.IO.PathTooLongException
Path Length=266:System.IO.PathTooLongException
Path Length=267:System.IO.PathTooLongException
Path Length=268:System.IO.PathTooLongException
Path Length=269:System.IO.PathTooLongException
Path Length=270:System.IO.PathTooLongException

PathTooLongExceptionであればパスが長すぎますというメッセージを出せばいいのですが、 DirectoryNotFoundExceptionでは扱いが困ります。

これはDirectory.CreateDirectory関数によるものではないようで、DirectoryInfo.Createを使ってフォルダを生成しても同様の現象になります。

読書感想「肩甲骨はがしストレッチ 首、肩、腰の痛み、体の不調が消える!」

肩甲骨はがしストレッチ 首、肩、腰の痛み、体の不調が消える!

整体師さんに肩甲骨がまったく動かないと言われました。

これでは将来的に肩こりがひどくなると

冒頭で、背中で両手を合わせるのが紹介されていますが、私は全く出来ません。

合わせるように手首を返すのも難しいくらい。

で、ストレッチなのですが、いやいや、こんなに本格的にいっぱい紹介されてもやらないでしょ、出来ても続かないでしょ。と。

良さそうだったのは腕を伸ばして上げて開いた両手にタオルを持って、後ろに動かすストレッチ。

これを軽く2、3回やっただけで、大分体が楽になりました。座ったまま出来ますし。これはいいですね。

それと、立って両手を伸ばして後ろで手を組んで、体を前に倒す。これも良さそうです。

股関節のストレッチも紹介されており、座って両足を開いて前屈。

この辺りですかね。棒やダンベルを使ったストレッチも紹介されてますが、私はまあ、やることはないでしょう。

そして、奥の手として接骨院ではがしてもらうという方法があります。

Slackの0名チャンネルについて思うこと

Slackは便利です。

しかし、思うのがチャンネルが乱立しがちです。

チャンネルを見ていると0名で全く使われないチャンネルがあります。

自社の設定では、一般メンバーはチャンネルを作成することはできてもアーカイブや削除をすることができません

slack.com

使おうと作成しては見たが、やっぱりいらなかった。

例えば、xxx-tecというチャンネルを作成してみたが、同様のxxx-techというチャンネルが既に存在していたことに気づいた。とか。

アーカイブも削除も出来ないので、放置となってしまいがちです。

なんでかんでもアーカイブ出来るのも問題なので、悩ましいところです。

私としては、管理者権限があるので、もう気づいたら0名チャンネルについてはアーカイブしてます。

JIRAで特定のユーザーを課題のウォッチャーに追加できない

職場で、特定のユーザーを課題のウォッチャーに追加できないという相談が。

私もわかりませんでした。そこで同僚に聞いてみると、課題の閲覧権限がないからとのこと。

しかし、その課題は、特定グループ+ウォッチャーのみ参照可能というセキュリティレベルでした。

特定グループに属していないが、参照できるようにするため+ウォッチャーのみ参照可能じゃないの?

参照するにはウォッチャーに追加が必要、ウォッチャー追加するには参照が必要の卵が先か鶏が先か状態。

と少し考えてみると以下の手順になるようです。

  1. 一旦、セキュリティレベルを該当ユーザーが参照できるように変更
  2. 該当ユーザーをウォッチャーに追加
  3. セキュリティレベルを戻す

Cloud FunctionsへのアクセスをVPCネットワークで制御する

Cloud FunctionsへのアクセスをVPCネットワークで制御することを行ってみることにしました。

今回行うのは外部からのアクセスは禁止として、内部のCompute Engineからのアクセスを可能にするというシナリオで構成してみました。

Compute Engine

AppEngineは静的IPが持たせられないため、Compute Engineからであれば制限可能なようです。

cloud.google.com

Compute Engineは以下の記事を参照に構築します。

cloud.google.com

ただ、うまく、git cloneが動かないので

git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples

cd nodejs-docs-samples/appengine/hello-world/flexible

npm install

npm install axios

const express = require('express');
const axios = require('axios');
const app = express();
app.get('/', (req, res) => {
  //res.status(200).send('Hello, world!').end();
        var url = "https://us-central1-trial-rimever0911.cloudfunctions.net/function-2"  // "https://api.github.com"
        axios.get(url).then(function(response) {
            console.log(response.data);
        res.status(200).send(response.data).end();
});
});
// Start the server
const PORT = process.env.PORT || 8080;
app.listen(PORT, () => {
  console.log(`App listening on port ${PORT}`);
  console.log('Press Ctrl+C to quit.');
});
module.exports = app;

npm start

とします。

8080ポートもファイアウォールでallowとしておきました。http://IPアドレス:8080でGCEのnodejsアプリにアクセスします。

gcloud compute firewall-rules create default-allow-http-8080 \ --allow tcp:8080 \ --source-ranges 0.0.0.0/0 \ --target-tags http-server \ --description "Allow port 8080 access to http-server"

次はCloud Functionsの設定です

f:id:rimever:20200913183345p:plain
Cloud Functionsの設定

VPCはまずVPCネットワークを作成しておき、サーバレスVPCアクセスを作成し、これをCloud Functionsに割り当てることになります。

f:id:rimever:20200913183507p:plain
作成したVPC

あとは適当な関数を作成します。

動作確認

f:id:rimever:20200913183256p:plain
GCEでは

f:id:rimever:20200913183415p:plain
直接URLアクセスすると

読書感想「はじめて書く人のためのミステリー入門」

はじめて書く人のためのミステリー入門 ストーリータイプコレクション抜粋版 (「物語が書きたいッ!」文庫)

ドラマ半沢直樹が終わりましたね。面白かったです。

会社でも見ている人が多いので共通の話題になります。今の時代、こういう番組ってなかなかないのではないでしょうか。

そういえば、よく考えてみると半沢直樹もジャンルとしてはミステリーですね。

この本はミステリーを体系的に学べる、骨組みを理解するのにうってつけの本です。

物語は主人公の取る行動

  1. 「戦う、争う、問題を解決する」
  2. 「旅をする」  
  3. 「段階的に熟達、発展する」
  4. 「不思議な体験をする」  
  5. 「恐ろしいものに襲われる」  
  6. 「とんでもないことに巻き込まれる」  
  7. 「謎を解き明かす」

ミステリーでは以下の要素を

  • 「謎を解く主人公」  
  • 「解決すべき事件」  
  • 「事件解決を妨げる謎と、その驚くべき真相」  
  • 「事件を引き起こし、謎を生み出す犯人」

6人の主要人物

  • 「探偵役」
  • 「助手(ワトソン役)」
  • 「真犯人」
  • 「ニセ犯人」
  • 「容疑者たち」
  • 「依頼者」

意外なのは助手ですね。

ワトソン役というから助手といえばシャーロックホームズの専売特許かと思っていたのですが、主人公の名推理の引き立て役には欠かせない存在なのです。