投稿者「baw」のアーカイブ

baw について

常時睡魔と格闘を繰り広げる暇人。

XREAでMainに独自ドメインでWordPressをインストールしていて無料SSLを適用できなかったのでSubに移動する

XREAで無料SSLが使用できるようになりました。昨今、GoogleChromeを皮切りに、入力フォームのあるウェブサイトでSSL/TLS(https)通信が有効になっていない場合、画面に警告が出るようになるらしいですね。この流行には乗るしかない! ということで、早速、調べてみたのですが……なんと、XREAで言う所のMainには無料SSLが適用できない制約事項があるではないですか。Mainとは、public_html直下にWordPressをインストールしている状態を指します。これを、何とかサブディレクトリ(Sub)に移設してみようと思います。因みに、私はMainに独自ドメインを設定しています。

公式Wikiに似たような手順はあるのですが、実際にはもっと単純です。手順では、サブディレクトリを手で作ることになっていますが、XREAではサブディレクトリ=ドメインとなるので、実質、WordPress自体の設定変更は不要です。(URL自体は変わらないため)

XREAのコンパネから、Mainを空白にして、SubへMainに設定されていた独自ドメインを設定して、反映してやります。そのあと、同じくコンパネから無料SSLを有効にしてやります。

ドメイン設定が反映されて、public_html/jikkenjo.netディレクトリが作成されたら、public_html直下にあったWordPressファイルをコピーしてやります。ftpでやると、1ファイルずつコピーする動きになるので、ssh接続してからcp -rで実施すると一瞬で終わって良いです。[cp -r wp-* jikkenjo.net/][cp index.php jikkenjo.net/][cp .htaccess jikkenjo.net/]で取り合えずOKだと思います。気になるファイルは個別に移動させてください。

後は、Really Simple SSLをインストールして終わりです。独自ドメインが変更差異を吸収してくれたので、意外に楽だった……。

と、忘れてた。GoogleAnalytics側の設定をhttp→httpsに変更しておかなければなりません。

プロジェクトマネージャ午後Ⅱ質問項目文字起こし

IPAのプロジェクトマネージャの午後Ⅱで記入することになる質問項目を文字起こししたので、何かの役に立つかと思い張り付けておきます。

◆プロジェクトの名称
①名称(30字以内で、分かりやすく簡潔に表してください。)
 例)1.小売業販売管理システムにおける売上統計サブシステムの開発
   2.ソフトウェアパッケージ適用による分散型生産管理システムの構築
   3.クライアントサーバシステム向け運用支援システムの開発

◆システムが対象とする企業・機関
②企業・機関などの種類・業種
 1.建設業 2.製造業 3.電気・ガス・熱供給・水道業 4.運輸・通信業
 5.卸売・小売業・飲食店 6.金融・保険・不動産業 7.サービス業
 8.情報サービス業 9.調査業・広告業 10.医療・福祉業
 11.農業・林業・漁業・鉱業 12.教官(学校・研究機関)
 13.官公庁・公営団体 14.特定業種なし 15.その他(___)
③企業・機関などの規模
 1.100人以下 2.101~300人 3.301~1,000 4.1,001~5,000人 5.5,001人以上
 6.特定しない 7.分からない
④対象業務の領域
 1.経営・企画 2.会計・経理 3.営業・販売 4.生産 5.物流 6.人事
 7.管理一般 8.研究・開発 9.技術・制御 10.その他(___)

◆システム構成
⑤システムの形態と規模
 1.クライアントサーバシステム ア.(サーバ約___台、クライアント約___台)
                イ.(分からない
 2.Webシステム ア.(サーバ約___台、クライアント約___台) イ.分からない
 3.メインフレーム又はオフコン(約___台)及び端末(約___台)によるシステム
 4.組込みシステム(___)
 5.その他(___)
⑥ネットワークの範囲
 1.他企業・他機関との間 2.同一企業・同一機関などの複数事業所間
 3.単一事業所内 4.単一部署内 5.なし 6.その他(___)
⑦システムの利用者数
 1.1~10人 2.11~30人 3.31~100人 4.101~300人 5.301~1,000人
 6.1,001~3,000人 7.3,001人以上 8.分からない

◆プロジェクトの規模
⑧総工数
 1.(約___人月)
⑨費用総額
 1.(約___)百万円(ハードウェア費用を ア.含む イ.含まない)
⑩期間
 1.(___年___月)~(___年___月) 2.分からない

◆プロジェクトにおけるあなたの立場
⑪あなたが所属する企業・機関など
 1.ソフトウェア業・情報処理・提供サービス業など
 2.コンピュータ製造・販売業など 3.一般企業などのシステム部門
 4.一般企業などのその他の部門 5.その他(___)
⑫あなたの担当したフェーズ
 1.システム企画・計画 2.システム設計 3.プログラム開発 4.システムテスト
 5.移行・運用 6.その他(___)
⑬あなたの役割
 1.プロジェクトの全体責任者 2.プロジェクト管理スタッフ 3.チームリーダ
 4.チームサブリーダ 5.その他(___)
⑭あなたの管理対象人数
 (約___~___人)
⑮あなたの担当期間
 (___年___月)~(___年___月)

Java9ではCMS GCが非推奨らしい

はじめに、当方はJava初心者であります。(これを言っておかないと後で大変なことになるので……)

Java9ではCMS GC(Concurrent Mark Sweep Garbage Collector)が非推奨(Deprecate)になるらしいです。そもそもCMS GCは、「停止できないエンタープライズ・アプリケーション」に向いた、MajorGCにおけるSTW(Stop The World:アプリケーションの停止時間)が短いという特性のあるアルゴリズムです。一方で、コンパクション(HDDで言うところのデフラグみたいなもの)されないという側面もあり、結局はFullGCが選択されることもありました。つまるところ、GC手法としてどれを選択するかはトレードオフの話ではありますが、一般的にはCMS GCが選ばれてきたことと思います。

それが、Java9から非推奨となり、それ以降では廃止も視野に入れられているとのことです。Java9以上へのマイグレーションにより、CMS GCからG1GCに乗り換える場合、大規模かつ長期に亘る性能試験が必要になるでしょう……。正直、頭が痛くなるので、あまり考えたくありません。

そもそも廃止される理由は、G1GCがCMS GCの優位点である「STWの短さ」に追いつきつつあるからという正当な理由1と、CMS GCを廃止することでCMS GCに注いでいた開発体力を他GCに振り分けて開発を加速させるという不当な理由2があるようです。

Dropping support for CMS and then removing the CMS code, or at least more thoroughly segregating it, will reduce the maintenance burden of the GC code base and accelerate new development. The G1 garbage collector is intended, in the long term, to be a replacement for most uses of CMS.

Google翻訳:CMSのサポートを中止し、CMSコードを削除するか、少なくともそれをより完全に分離すると、GCコードベースの保守負担が軽減され、新しい開発が加速されます。 G1ガベージコレクタは、長期的には、CMSのほとんどの用途を置き換えるものです。

http://openjdk.java.net/jeps/291

文書の中では、こうも言及されています。

For some applications CMS is a very good fit and might always outperform G1.

Google翻訳:一部のアプリケーションでは、CMSは非常に適しており、常にG1を上回る可能性があります。

ならさ……。

Java8から導入されたMetaspaceで痛い目を見た身としては、二の舞になりそうな予感がめっちゃしています……。因みに、本件に言及した日本語の記事はググっても殆ど出てこないので、怖がっている人は殆ど居ないっぽいです。

WordPressの更新画面にアクセスするとMySQLのwp_optionsでオーバーヘッドが増大して全画面で500InternalServerErrorになる

前々から非常に困っていた事象がWordPressの手動アップデートで訳も分からず解消したので記しておきます。

発生していた事象

タイトルの通りです。WordPressの管理画面で「ダッシュボード>更新(update-core.php)」にアクセスした瞬間、MySQLのwp_optionsテーブルでオーバーヘッドが増大し、管理画面だけではなく、全画面で500 Internal Server Errorになってしまいます。WordPressのデバッグモード等で確認してみると、どうやら、Apache(PHP)からMySQLへクエリを投げた時にTimeoutに陥ってエラーとなっているようでした。phpMyAdmin等で「最適化」によりwp_optionsのオーバーヘッドを取り除いてやると、対症療法的には解消します。いくら調べても根本原因に辿り着かなかったことと、更新画面にアクセスしなければ発生しないことから、数年もの間(長い!)直視しないでおいた問題でした。

解消方法

冒頭でも触れたように、時代錯誤にもWordPressを手動更新してやれば解消します。自動更新機能が存在しなかった時代のWordPressから、自動更新が存在する時代のWordPressに更新する手順として、WordPressの公式ドキュメントに整理されています。手順の中で、旧ファイルを消すという点がポイントだったようです。

数年続いていた本事象により、全くWordPressが更新できなくなったことで、セキュリティ的に心配だったので、何度か手動での更新はしていました。その際、最新ファイルで上書きすることだけで対応していました。そのような、旧ファイルを消さない手順では解消しませんでした。

解決した今も、相変わらず原因は不明だったわけですが……。

別バージョンのWindowsインストールイメージファイルを取得する

Windowsのイメージファイル(isoファイル)を、Microsoft謹製の「メディア作成ツール(mediacreationtool.exe)」を使用せずに、直接取得する方法がありました。これを利用すると、例えばOSをインストールしたい端末がオフラインであり、インターネットに接続している端末とWindowsのバージョンが異なる場合に便利です。

普通にWindows端末から下記ページにアクセスした場合は、メディア作成ツールのダウンロードしか行うことが出来ませんが、Windows以外(例えばAndroid)で同じページにアクセスすると、有効期限付きのisoファイルへの直リンクを取得できます。

https://www.microsoft.com/ja-jp/software-download/windows8

下記のような時間制限付きのリンクが生成されます。

https://software-download.microsoft.com/db/Win8.1_Japanese_x64.iso?t=xxx&e=yyy&h=zzz

なお、メディア作成ツールは実行された環境によってOSを判別しているようなので、例えば、唯一インターネットに出られる環境が、社内制約によりWindowsServer系だけなので「このプラットフォームはサポートされていません。」というエラーメッセージが出てしまう場合にも上記方法で回避できます。

オーバーロードⅡ #10 自己満足感想(ネタバレ有)

当方、WEB版、小説版、漫画版3巻まで、アニメ1期を読了の状態です。10話は疑問をおぼえる表現が多数あったので、感想を記しておきます。

  1. モモンガ玉が描かれていてよいのか?
    ギルドの総意としてアインズが個人的に所有を認められているワールドアイテムである、通称モモンガ玉(腹部に宿されている赤玉)が、前半の、パンドラズアクターが化けているアインズにも描かれていた。個人的には、オーバーな言動とモモンガ玉の有無で、ニセモノであることを表現して欲しかった。代替品を格納しているのかもしれないが、そこまで考慮したうえでアニメ製作側が考えてくれていたかというと、そうではないと思っていて、ならば衣服で不自然に腹部を覆い隠す表現が最適かなと思った。ただし、作中のニセモノは眼光が意図的に消されており、眼光の有無という謎の表現方法でホンモノと区別できる工夫がされている。眼光は、人間の残滓を表しているというアニメの裏設定があるなら、まぁ納得できなくも無い。
  2. セバスの態度がふてぶてしい
    そもそも、9話最後にソリュシャンがアインズの来訪を伝えた時点で、汗が噴出して絶望に打ちひしがれ、恐怖する表現を入れて欲しかった。10話最初でも、汗が噴出している表現が一度だけあるものの、その後は平然とした顔をしており、むしろ、ふてぶてしいとすら感じざるを得ない。ここは本来、心身ともに動揺・恐怖し切っており、全く心の余裕が無い表現でい続けなければならない。何故なら、対面するアインズが、パンドラズアクターが化けた姿であると気づかないほどに、判断力が低下していなければ説明がつかないからだ。NPCの忠誠心を表現する根幹にも関わってくる内容なので、ここは尺的にも絶対に手を抜いてはならなかった箇所。本当に残念と言わざるを得ない。
  3. ツアレを殺すときの逡巡が無い
    たっち・みーに宿された「正義」に反するとも受け取れる自らの行動に対して、アインズの命とはいえ(再度、聞き返したとはいえ)全く迷う素振りがないのは本当に残念。淡々と拳を振るったように見える。心情表現は難しいにしても、表情や間で表現して欲しかった。
  4. 許しを受け取るセバスが自然すぎる
    コキュートスに拳を受け止められた後、アインズに許されることに対して、セバスが自然に受け取りすぎている。迷いに迷った挙句、アインズの命令、ひいてはナザリックのためという姿勢を見せるために止む無く振るった拳を受け止められ、心身の余裕が無い中、やっと自らが「試されていたのだ」と気付くはずなのだが、むしろ、当然のことのように受け取っている。これは有り得ない話で、本当に残念。全体的に、アインズに対して淡々とし過ぎており、先述したふてぶてしいとも取られかねない態度は、視聴者に対してNPCの忠誠心を疑わせるミスリードになりかけない。
  5. セバスとツアレの会話は良い
    その後、ツアレが自分の過去について語り、ナザリックに来ることを望むシーン。これは良い。ただ、ここに割く尺があるなら、先程のシーンに回して欲しい。セバスに対する愛情表現は、後の回でもフォローは間に合う。
  6. ツアレのメリットを淀みなく答えすぎ
    コキュートスのリザードマン制圧に伴う敗北という失敗で、ナザリックの利益に対して自律的に動くことの大切さを説いたシーンに同席していないセバスは、この回答にたどり着くまで、考えに考え抜いている。アインズを前に表情が一切変わらないというのは、ちょっと無いかなと思い残念。
  7. ザナックの紅茶を通じてメイドの立ち位置を説明したのは良かった。
  8. 王宮でのザナック・レエブン・ラナーの会話シーンは良かった
    気にはなっていた豹変後のラナーの表情も、口元だけとはいえ、アリだと思った。その後、クライムについて話をするときの目も程々で良かった。流石に、これ以上変えすぎても違和感だろう……。
  9. 「モモンガ」を愛するアルベド
    小説版でも、この程度の説明しか無かったので、反目を疑わせるようなミスリードとも見える本シーンは、この程度の表現で丁度良かった。実態は、NPCとしてのアルベドに追記された、フレーバーテキストとしての「モモンガを愛している」に固執しており、アインズ・ウール・ゴウンの名を以って命じられることの感情的な違和感が表現されているのだと解釈している。そのため、アインズ・ウール・ゴウンのギルド旗が打ち捨てられており、更には、花嫁修業と称して、メイドたちにも一切自分の部屋に立ち入らせないのだから。まぁ、アインズを象った人形や抱き枕が大量に転がっていること自体も異様だが……。

オーバーロードⅡ #07 自己満足感想(ネタバレ有)

WEB版、小説版を読んでからアニメに挑むというのは今までの経験に無かったので楽しみにしているオーバーロードについて、完全な自己満足から感想を書き連ねておきます。小説版の再読み直しはしていないので、不正確かもしれませんが。

  1. 金が足りない
    ユグドラシル金貨は大量に持っているものの、転移後世界の金貨を稼ぐ手段が、今のところ冒険者モモンの活躍による収入しかないため、金欠に陥っている。なお、アイテム(転移後世界のアイテムでもOKのようだ)を突っ込めばユグドラシル金貨に変換できるエクスチェンジボックスというアイテムにより、「ユグドラシル金貨を稼ぐ手段がない」という問題は解決された模様。ここで、パンドラズ・アクターを、商人スキルを所有していたかつてのギルド仲間である音改(ねあらた)に化けさせ、エクスチェンジボックスを使用させることで、査定額(恐らく変換後のユグドラシル金貨の金額)が向上している。
  2. 各地の鉄鉱石
    鉄鉱石に含まれる金属等の成分がエクスチェンジボックスの査定に影響するか、実験しようとしている。
  3. 早朝なのでクライム以外に鍛錬を積む兵士はいない。
  4. ガゼフ・ストロノーフがクライムとの鍛錬で鎧を纏っているのは違和感があった。一方のクラインはチェンシャツ程度の装備。
  5. バハルス帝国の化け物
    主席宮廷魔法使いであるフールーダ・パラダインのこと。第6位階魔法まで行使できる。また、彼自身が発明したオリジナルの魔法により寿命の延長に成功しており、200歳を超えている。帝国の現皇帝である鮮血帝・ジルクニフが幼い時の教育係でもあった。
  6. 足蹴り
    ここでクライムが教えられた、楯で防御しつつ足蹴りする技は、後でクライム自身を助けることとなる。
  7. 武技・斬撃
    アダマンタイト級冒険者チーム・蒼の薔薇の一人であるガガーランから受けた「自信を持てる一撃を作れ」との助言をもとに、大上段からの一撃である武技・斬撃を習得した。このときガゼフより武技・斬撃を(程度は低いが)褒められるとともに、「武技・斬撃に続く攻撃を考えてみろ」との助言を受けている。しばらく後、ガガーランからも「次に続く攻撃を」と、同様の助言を受けることになる。上位者の考えることは同じだとクライムは認識する。
  8. ポーション
    ポーション(魔法)による回復では、怪我のみならず壊れた筋繊維まで元通りに修復してしまうため、通常の肉体が行う超回復(筋繊維が壊れる前以上に強化される)の機会を阻害してしまう。わざわざガゼフが「ポーションを使わなければ王女の身辺警護に差し支える怪我(骨折等)」を負わせなかったのはこれが理由。優しさ的な面もあるかもしれないが。
  9. クライムの白いフルプレート
    ラナーの依頼により、蒼の薔薇が分けてくれた素材をもとに作成した物。
  10. 化け物
    言葉通り。知略の化け物。7話で出てくる彼女の表情は全てまがい物であり演技。真の表情はEDにチラっと出てくる。この後、ラキュースと王女の会話するシーンでの照れた表情等も全部作り物。
  11. メイドから馬鹿にされる
    王女の住む城に仕えるようなメイドは、貴族の娘であったりする場合が多い。平民(というか、貧困街のボロ小屋で風雨に晒されて死にそうなところをラナー拾われた)出身のクライムを良く思っていない。逆に、そういう出身であるからこそ、自分を拾ってくれたラナーに、クライムは絶対の忠誠を誓っている。
  12. 王女の部屋に入るときにノックをしていない。クライムはラナーから「ノックをせず入室すること」を強要されている。ただ、夜間等のみノックをすることの権利はクライム側が勝ち取っている模様。(後々の小説版より)
  13. 紅茶を入れているポットは保温効果のあるマジックアイテム。気に入った人間が来た時だけ使用する。(小説版)
  14. ティナ
    小説版では、蒼の薔薇・ティナが部屋の端にうずくまって座っていることに対して気付くのが遅れ、クライムがぎょっとして抜刀しかかっている。アニメではこの描写は省略されているので、最初から椅子に座っておいても良かったのではないかと思った……。この場には居ないが、ティナの姉妹であるティアも同じく蒼の薔薇の一員。6話で黒粉の原料を焼き払う時に出てきている。元は3姉妹で暗殺家業をやっていたが、ある時、標的であるラキュース(蒼の薔薇リーダー、紅茶を啜っている鬼ボス)に返り討ちに遭い、結果的に蒼の薔薇に加入している。ティア・ティナ以外のもう一人の姉妹はまだ明かされていない。
  15. ラキュースは蒼の薔薇リーダーであり、貴族の娘でもあり、魔剣キリネイラムの所有者でもあり、王国で唯一の死者蘇生魔法の使い手でもある、王国きってのチートキャラ。とは言っても、蘇生される側の生命力が十分高くないと、蘇生は失敗する模様。
  16. ラナーの語りは全部演技。変貌後の声優さん頑張れ。
  17. 替字式暗号
    この世界での言語には、ドイツ語と似たような取り決めとして、言葉に性別(男性、女性、中性)がある。単語の先頭には必ずこの言葉が付くルール(小説版で明記)や、使用頻度の高い文字の置換(私の知識)等から、順々に推測していけば、確かにそれほど強度の高い暗号ではない。
  18. ここで話題になった娼館は、セバスがツアレを拾った場所。
  19. 陰口をたたくメイド
    元々、王女のスパイ目的で送り込まれた貴族の娘も居る。陰口をたたくメイドすらラナーは様々な用途に利用している。王国内情の把握、真偽織り交ぜた情報の流布等。末恐ろしい。

とりあえず、7話の感想はこんなところでした。

waitコマンドとLinux/Unixの仕様メモ

バックグラウンドプロセス2個以上をwaitして実行結果を取得する際のメモです。Linux(RHEL7、CentOS7)で確認済みですが、Unixでも同じことが言えるはずです。

まずは間違っている例です。下記の様に、プロセスIDを取得して、waitする際に2個のプロセスIDを指定してしまうと、誤った結果が得られます。(最後に指定したプロセスIDの結果のみが取得できる。)

$ cat parent.sh
#!/bin/sh

./child.sh $1 &
child1p=$!

./child.sh $2 &
child2p=$!

sleep 3

wait $child1p $child2p
childr=$?

echo "child1p:$child1p, child2p:$child2p, childr:$childr"
$ cat child.sh
#!/bin/sh
sleep 1
exit $1

下記が実行結果です。

$ time ./parent.sh 1 1
child1p:10159, child2p:10160, childr:1

real    0m3.005s
user    0m0.005s
sys     0m0.003s
$ time ./parent.sh 0 0
child1p:10165, child2p:10166, childr:0

real    0m3.005s
user    0m0.004s
sys     0m0.003s
$ time ./parent.sh 0 1
child1p:10171, child2p:10172, childr:1

real    0m3.005s
user    0m0.001s
sys     0m0.006s

うまくいくやん! と、思われ方。要注意! 下記を実行すれば誤りに気付きます。

$ time ./parent.sh 1 0
child1p:10152, child2p:10153, childr:0

real    0m3.006s
user    0m0.004s
sys     0m0.004s

引数pidを指定した場合,waitコマンドは最後の完了を待ったプロセスのコマンドの終了コードで終了します。
http://itdoc.hitachi.co.jp/manuals/3021/3021313320/JPAS0399.HTM

正しい実装は下記。それぞれ個別にwaitする必要がある。

$ cat parent2.sh
#!/bin/sh

./child.sh 0 &
child1p=$!

./child.sh 1 &
child2p=$!

sleep 3

wait $child1p
child1r=$?

wait $child2p
child2r=$?

echo "child1p:$child1p, child2p:$child2p, child1r:$child1r, child2r:$child2r"

ん? と思われた方。そう、子プロセスが[sleep 1]しているにも関わらず、親プロセスで[sleep 3]しているため、waitにたどり着くまでに子プロセスは終了しています。「終了したプロセスの実行結果なんて取得できるの?」と。

waitコマンドについて詳しく言及した記事はありませんでしたが、waitシステムコールについて調べると、ありました。

終了したが、wait されていない子プロセスは「ゾンビ」になる。後で親プロセスが wait を実行して子プロセスについての情報を取得できるように、カーネルはゾンビプロセスについて最小限の情報 (PID、終了ステータス、 リソース使用状況) を保持する。ゾンビプロセスは、 wait によってシステムから削除されない限り、カーネルのプロセステーブルの 1 エントリーを消費する。このプロセステーブルが 一杯になると、新たにプロセスを作ることができなくなる。親プロセスが終了すると、その親プロセスの「ゾンビ」の子プロセスは (もしあれば) init(1) の養子となる。 init(1) は wait を自動的に実行し、ゾンビを削除する。
https://linuxjm.osdn.jp/html/LDP_man-pages/man2/wait.2.html

「養子」という表現、かなり好きです。(そこではない) つまり、子プロセスの実行結果は、親プロセスが終了するまでは間違いなく保持されるようです。そのため、上記コードは問題なしです。

$ time ./parent2.sh 1 0
child1p:10185, child2p:10186, child1r:0, child2r:1

real    0m3.006s
user    0m0.004s
sys     0m0.004s

位置100で不正な入力シーケンス(iconv)

「位置xxxで不正な入力シーケンス」は、いわゆるWindowsの機種依存文字である丸付き数字等をiconvでutf8→shift_jisに変換しようとしたときに発生するエラー。丸付き数字は、utf8では規定されているが、厳格なshift_jisには存在しないので、対応する文字無しということでエラーになる。(Windowsにおけるshift_jisは、正確にはshift_jisではなく、暗黙的に拡張文字(丸付き数字等)を含んだもの。)拡張文字も含んだcp932を変換後の文字コードとして指定してやれば解消する。

下記は、Linux上の日本語名ファイルを、zip等に纏めてftpでWindowsに送ったときに文字化けさせない対応のサンプルスクリプト。(utf8→cp932に変換している。)

mv "$filename" "`echo $filename | iconv -f utf8 -t cp932`"

意地でも正規表現を使わずに拡張子とファイル名を分割する

良く使うのに毎回調べている気がする正規表現をあえて意地でも使用せずに、拡張子(.tar.gz)とファイル名を分割する。ファイルのバックアップをアンダースコア+日付でcpして取得する場合が良くあるが、そういったときのアンダースコア分割にも応用できる。特にアンダースコアはファイル名自体にも使用されることがあるので、revで逆さにしてから変換する。(セパレータが何個存在するか分からないので、逆から処理するとうまくいく)

echo test.test.tar.gz | rev | cut -d '.' -f 3- | rev

逆にして、先頭からセパレータを探索、3個目以降を取得、再度逆にする。言われてみるとシンプルだけれど、なかなか出来なかった発想。