ようこそゲストさん

色々日記(ざ・めも)

2018/12/08(土) Windowsエクスプローラで文字化けしないFTPサーバ

2018/12/08 23:55 PC(Linux)
■前提
クライアント: Windows10
サーバ: Linux

当初vsftpdでFTPサーバを運用していたが、Windowsからアップロードした際に日本語ファイル名が文字化けしたと連絡が来た。自分でも確認してみたが、確かにWindowsのエクスプローラからアップロードすると文字化けする。

文字化けの挙動が不可解。全文字化けではなさそう。
でもダメ文字ではなく、特定の文字位置が化けているような…

今回時間がなかったので細かい調査は実施せず、とりあえず解消方法だけ模索した。

原因として一番怪しいのは、Windowsの下記仕様変更だ。

Winows10でのFTPコマンド実行時の振る舞いについて

FTP接続の頭で、
OPTS UTF8 ON
する。その事自体は問題ない。
のだが、この後の「Windows側でファイル名をUTF-8にエンコード」のときにバグって化けてるとしか思えない。
つまり、OPTSが通ってしまうとUTF-8転送になってバグルートに落ちるので、OPTSを拒否させた上でSJISで転送してもらわないといけない。

vsftpdだとOPTSを無視することはできるが、クライアントとサーバで文字コードを変換させる設定が見つからなかった。

変換無しで考えた場合……
サーバ側UTF-8ファイル名だとWindowsからだと文字化けしていそう。
サーバ側SJISファイル名だと多分UTF-8解釈させると思うので、ちゃんとしたFTPクライアントから文字化けしていそう。

仕方ないので、vsftpdからproftpdに切り替えた。
proftpdにはエンコーディングをサーバ・クライアントで変換する設定がある。
proftpd.confに下記設定で、とりあえずWindowsエクスプローラからのFTPで文字化けがなくなった。
UseEncoding UTF-8 CP932 strict
LangDefault en_US
LangDefault en_US入れないとメッセージが文字化け。
クライアントがFFFTP、WinSCPあたりでも問題なさそう。とりあえずこれで。

[参考]
IEからProFTPdにアクセスするとファイル名が文字化けする - ブログ - ワルブリックス株式会社

あと恒例の文字化けファイルをLinux上でいじる方法。
Linuxでファイルが文字化けした際の対処法 | OXY NOTES

バッドノウハウ的なので追求しない。

2018/11/23(金) PinterestでPINした画像をGoogleドライブに保存できるようにする

2018/11/23 27:57 PC(プログラミング)
■やりたいこと
PinterestでPINした画像をローカルで閲覧したい。おおむね、お絵描きの参考用途。
・ブラウザ窓だと参考画像として扱いづらい
・貧弱な通信環境でも閲覧できる
・いちいちブラウザ開くのが面倒

やっぱりローカルでアクセスできた方が便利だよね。

■調査と課題
直接Pinterestからデータを引っ張ってくることもできるが、定期実行なり待受の仕組みを立てる必要がある。可用性を高く、一方でできるだけ手間や予算がかからない方法を検討したい。自前サーバがあるのでこれを使ってももちろん良いのだが、可用性であればやはりクラウドに軍配が上がる。(半ば興味本位で)極力クラウドサービスだけで構成することを目指す。

ストレージサービスは一般にローカル同期の仕組みを持っているため、Pinterestからストレージサービスに連携できれば要求が満たせそう。

Pinterestとローカルサービスを繋ぐ方法として、IFTTTなどの連携機能構築サービスが有る。まずはこれを調査した。おおむね、パーソナル用途で機能と使いやすさを両立しているのは2018/10現在下記3つくらい。

・IFTTT(Maker)
・Microsoft Flow
・Integromat

これら全てに、Pinterestインプット・Googleドライブアウトプットアダプタがあった。
なのでこれらを繋げばいいだけに思える。

しかし、いざ使ってみると画像ではなくhtmlファイルが連携される。
どれもPinterestが公式で提供したアダプタらしく、画像そのものを外部サービスに渡さない意図的な作りと思われる。

ちなみに、各サービスの比較としては、
▼機能性
Microsoft Flow > Integromat > IFTTT

▼簡便性
IFTTT > Integromat > Microsoft Flow

高機能な方が一見良さそうだが、この手のクリックアンドポイントロジック構築は高機能にするほど最終的にフローチャート作成サービスになってしまい見通しやメンテナンス性が怪しくなるという特性がある。
複雑なものを作ろうとするほど、どこかの境界でコードを自分で書いたほうが俯瞰性が良くなる。

IFTTTはINPUT(THIS)とOUTPUT(THAT)の接続だけしか選べないが、これくらいがちょうど良いように思う。見通しが悪くならない範囲で足すなら、出力を多数化(3つまでとか)、フィルタを一段、データ加工を簡単なもので1段くらいだろうか(その場合IFTTT以外のサービスないしMakerを選ぶことになる)。

いずれのサービスもコール回数に制限がある。
今回用途では1日10枚以内が目処。
上記に挙げた3つのフリープランでいずれも問題なさそうだった。

将来増えるか減るかなどの見通しは不明。

さて、結局以下のように構成した。

■実装
IFTTT⇒Google Apps Script(GAS)⇒Googleドライブ⇒ローカル(Googleドライブの連携機能)

・IFTTTからpinterestのurlをGASに渡す
・GAS内で、FetchしてPinterestのhtmlを取得
・簡単な正規表現マッチで画像URLおよび属性情報を取得
・画像をFetchしてGoogleドライブへ保存
・ファイル名はID+PINの詳細があればそれをファイル名とする
・第一階層のボード名をフォルダとしてそこに保存する

1) GASで下記スクリプトを作成。作成時に各種認証を要求されるので設定してやる。
function doPost(e) {
  // パラメータの取得
  var jsonString = e.postData.getDataAsString();
  var data = JSON.parse(jsonString);
  var pinUrl = data.pinUrl;
  var boardName = data.boardName;
  
  // フォルダ無ければ作成  
  var rootFolder = DriveApp.getRootFolder();
  var pinterestFolder = null;
  var targetFolder = null;
  var folderIterator = rootFolder.getFoldersByName('pinterest');

  if (folderIterator.hasNext()) {
    pinterestFolder = folderIterator.next();
  } else {
    pinterestFolder = rootDir.createFolder('pinterest');
  }

  targetFolder = pinterestFolder;

  // ボード名が取れていればサブフォルダとしてボードフォルダを作成
  if (boardName) {
    folderIterator = pinterestFolder.getFoldersByName(boardName);
    
    if (folderIterator.hasNext()) {
      targetFolder = folderIterator.next();
    } else {
      targetFolder = pinterestFolder.createFolder(boardName);
    }
  }
  
  // html解析処理
  var pinResponseText = UrlFetchApp.fetch(pinUrl).getContentText();
  var imageUrl = pinResponseText.match(/property="og:image".*content="([^"]*)"/)[1];
  // 128文字まで
  var description = pinResponseText.match(/img alt="([^"]*)"/)[1].substring(0, 128);
  
  var imageFilename = pinUrl.match(/[^\/]*$/)[0];
  
  // 画像取得処理
  var imageResponse = UrlFetchApp.fetch(imageUrl);

  // 拡張子は画像本体のContent-Typeから作成  
  var imageFilenameExt = imageResponse.getHeaders()["Content-Type"].match(/image\/([a-zA-Z]*)/)[1];
  if (imageFilenameExt == 'jpeg') {
    imageFilenameExt = 'jpg';
  }
  
  var imageBlob = imageResponse.getBlob().setName(imageFilename + ' - ' + description + '.' + imageFilenameExt);
  
  targetFolder.createFile(imageBlob);
  
}
IFTTTから呼び出せるようにWebアプリケーションとして公開してやる。


2) IFTTTで、Pinterestのオフィシャルアダプタを使いWebHookでGASに連携する。設定は以下。

▼THIS(INPUT)
Pinterest公式の"New Pin on your board"
Pick a board: "Any Board"

▼THAT(OUTPUT)
IFTTT公式の"Make a web request"
URL: https://script.google.com/macros/s/****/exec
Method: POST
Content Type (optional): application/json
Body (optional):
{"pinUrl":"{{PinURL}}", "boardName": "{{Board}}"}
以上で完成。かなりお手軽。

■まとめと使い勝手について
クラウド、フリープラン、更には認証情報をOAuthの世界で完結させたPinterest画像のローカル保存サービスが構築できた。
目標は達成でき、そこそこ便利に使っている。
ただ、PinterestからIFTTTへの発火に少しラグが有り、Googleドライブへの連携にもラグがあるためあまり即時連携という感じにはならない。

特性を理解して使用しつつ、どうしても即時で必要な場合はChromeの拡張などを利用してダウンロードすることにする。

■IFTTTについて
便利。機能を絞っているところが良い。
もちろん絞ってる分できないことがでてくる。
直感的に苦手なことはわかるので、あとは自分が使う上でどういったところでIFTTTで完結できないのか何を組み合わせればよいのかを今後確認していく。

■Google App Script(GAS)について
ロジックを作り、アウトプットがGoogle関係であればこれ一択。
Javascriptで大体何でもできるし、ドキュメントの必要十分さ、特に開発環境の素晴らしさはワンダフル。

現状無料で使えてるが、将来的に有料化or閉鎖しないかはちょっと心配。あとは制限。
作るときはフェッチの制限を忘れていたがやっぱりあるよね。
Google_Apps_Scriptの無料制限メモ
今回の内容だとURL Fetch 100MBが制限になりそう。
この仕組に限定すれば数百枚くらいは耐えるだろう。

AWSで相当するのは、Amazon API Gateway + Lambdaだろうか。
こいつらは本番運用には良いが、作って動かすまでのハードルが低くない。
こういったミニサービスや、使い捨てのテストAPIなどを作りたい場合GASのほうが向くように思う。


■今後の課題
サービスの選択・組み合わせを継続的に知識アプデするのと、GASがかなりawesomeだったのでできることを覚えたい。


■結論
最近のグルーサービスすげえね

2018/11/02(金) しょぼいカレンダーのチャンネル名変更

2018/11/02 16:24 PC(全般)
2018/10/01で変更されていた模様。

https://jbbs.shitaraba.net/bbs/read.cgi/anime/3083/1317273356/61-63
「BS Japan」→「BSテレ東」
「BS11デジタル」→「BS11イレブン」
「TwellV」→「BS12トゥエルビ」
「FRESH!」→「FRESH LIVE」
チャンネル名縛りで動くサービス・ソフトが動かなくなっていたので注意。

自作のtwitter連携は大丈夫だったっぽい。

2017/09/13(水) Wordの表で結合したセルの文字列が消える

2017/09/13 15:45 PC(全般)
今回のMSふざけんな案件。

環境は、
OS: Windows7 Pro 64bit
Word ver: Office Pro 2016

Wordの印刷レイアウト表示および印刷結果において、結合セル内の文字列が非表示となる。

・印刷レイアウト表示ではマウスでダブルクリックしても結合セルにカーソルが入れない
・下書きやアウトラインではたしかに文字が存在しており編集可能
・保存時にデータは飛ばない

とにかく、印刷に出てこないのが致命的。
この事象は2017/9/7以降に発生した。

原因はKB4011039の更新。
「プログラムと機能」からこれを削除すると直る。

私の環境ではKB4011039は5つ表示されたが一番上を消したら直った。
どれがどれだかよくわからないので、とりあえず全部消してみるが一次対応になりそうだ。

多分次月なりのパッチで直ると思うが、流石にこれが見過ごされるのは品質を軽視しすぎているように思う。

[参考]
Merging Cell in Word Table Issue - Business Applications
https://answers.microsoft.com/en-us/msoffice/forum/msoffice_word-mso_win10/word-not-displaying-table-data-with-merged-cells/88d25b43-8441-4b64-9bcf-4d75b27a30f9?auth=1Word%20not%20displaying%20table%20data%20with%20merged%20cells%20after%20updates%20-%20Microsoft%20Community

2017/07/08(土) CDのリッピング手順を決めたい

2017/07/08 12:35 PC(全般)
CD資産がたくさんあるし、インディーズなどでは、まだまだ
○CD
×ダウンロード
なケースも多々ある。

やっぱりCD->PCへの取り込みは手段を確立しておきたい。

iTunes等で一元的に管理するのが今時だろうが、使用方法が限定されるのがどうしても肌に合わない。
ファイルベースで管理したい。

今まではCDexでmp3化していたが、可逆圧縮でも保持しておきたいとか要求が増えてきたのでやり方を考える。

■前提
資産: CD所有数で500〜1000枚(所謂シングル盤もそれなりにあり)。ほぼ日本の楽曲。

■やりたいこと(必須)
・携帯音楽プレーヤー用に非可逆圧縮(mp3 lame 256kbps)で曲毎に圧縮したい
・PC用に可逆圧縮結合(FLACかWavPack)+CUEで圧縮したい
・上記2つを極力1つのソフトでやりきりたい。理想はワンボタン
・出力ファイル名にアルバム名・アーティスト名を入れ込む。CUESheetの中身含め日本語部分は日本語で出力
・出力はCD毎にフォルダ分けしたい
・可逆圧縮と非可逆圧縮は別フォルダに入れたい
・ファイルフォーマットや出力フォルダ・ファイル名をプロファイル化してリッピング時に呼び出して使いたい
・freedbからCD情報諸々が取得できる
・GUI操作(freedbの候補が1つに定まらないケースがある都合上)

■やりたいこと(できれば)
・永続的に使えそうなものを選ぶ
・エラー検出とかオフセットが正確であれば(ドライブ選びで担保して諦めても良い)
・ワンボタンで出来ない場合は、バッチなりで対応しても良いのでCUIがあると良い
・freedb(JP)が使えると良い

■調査
下記2サイトをベースに色々ソフトを試してやりたいことに合致するものを探した。
Comparison of CD rippers
おすすめの音楽ファイル変換ソフト・エンコーダー - k本的に無料ソフト・フリーソフト
おすすめの CD コピーツール - k本的に無料ソフト・フリーソフト

余談だけど林檎の木なくなっちゃったのね…

■結果
・PC用に可逆圧縮結合(FLACかWavPack)+CUEで圧縮したい
・ファイルフォーマットや出力フォルダ・ファイル名をプロファイル化してリッピング時に呼び出して使いたい
この2項目が出来る物がほとんど無い。

下記2つが残った。

・EZ CD Audio Converter 6.0.9
シェア。多機能かつI/Fが整理されていてXRECODEと比べるとかなり美しい。可逆・非可逆2回取り込み操作が必要。それ以外のやりたいことは全部出来る。

・XRECODE 1.0.0.231
シェア。多機能。ドライブのオフセット調整は手動。可逆・非可逆2回取り込み操作が必要。それ以外のやりたいことは全部出来る。
若干バギーで、同じ設定項目が複数箇所にあるなどちゃんと動いているのか判断がつかない場合がある。

2017/07/08 現在では購入方法がない? 起動直後の遅延を我慢すれば全機能使うことが出来るが、アップデートを確認する際にハングアップする(https://xrecode.com/php/version2.mirla?〜にアクセスするが301が返ってくる。これが無限ループしてる?)。回避するためには、ファイアウォールでxrecode2.exeのxrecode.com(173.236.187.195)への送信を止める必要がある(全止めだとfreedbへのアクセスが出来ない。また、設定でアップデートの確認を無効にしても私の環境では効果がなかった)。

下記ソフトは次点。
・Exact Audio Copy 1.3
フリー&定番。曲毎エンコでは設定が反映されるが、結合で出力する際は毎度出力先を選ぶ必要がある。プロファイル化が出来ない。UIが少し独特(FLAC+CUEを作る場合は、左の簡易メニューではなくActionメニューからCopy Image & Create CUE Sheetを選ぶ必要がある)。

・XRECODE 1.62
シェア。バギー。一見XRECODE兇茲蠕依されているのだが、結合出力でCUEのINDEX時間に過大なマイナス値が入るケースがある。私の知識上不正に見えるし、再生できるソフトもみつからない。バグだと思うのだが、これさえ直れば購入しても良い?

・CUERipper(CUETools) 2.1.5
フリー。オフセットは取ってこれる。複数ツールの一部で、ツール同士の関係性がわかりづらい。設定UIが独特。プロファイル化できない。前回設定は記憶してくれるしCUIもありそうなので、可逆圧縮で取り込んだ後バッチで非可逆圧縮するなどはこのツール群だけでできそう。

■結論
アップデートもかなり続きそうなので、EZ CD Audio Converterを買うことにした。

仮にこれが使えなくなった場合、XRECODE兇魏燭箸使い続けるかCUERipperでの運用方法を編み出すか。まあ、その頃までによりよい代替手段がでているのでは無かろうか。

2016/01/13(水) 春M(SpringM)からExcel2016が起動しない

2016/01/13 21:18 PC(全般)
インターネットから取得したExcelファイルを春M(SpringM)から起動したExcel2016で開こうとすると、
「メモリまたはディスクの空き容量が不足しているため、ドキュメントを開いたり、保存したりできません。」
と出て開けない問題。

環境はWin7 Pro SP1 64bit+Excel2016。

エクスプローラ→Excel

エクスプローラ→コマンドプロンプト(cmd.exe)→Excel
で起動した場合は問題なく表示できる。

最近のExcelはインターネットから取得したドキュメントは保護ビューで開く。どうもこのときにだけ何かがおかしくなっている模様。セキュリティセンターの設定を変更すれば保護ビューは無効に出来るが、これはやりたくない。

英語で検索すると、Excelでこのメッセージが出る問題はわんさか出てくる。
解決方法も色々(要は原因が特定できない)。原因が特定できるメッセージを出してほしいよなあ。

今回の場合、親プロセスで違いが出ているのは間違いない。UAC周りか環境変数が疑わしい。

表示できる場合と出来ない場合で環境変数等に違いは見られず。
グループポリシーとかアクセス権変更では上手くいかず。

Office 2013 - Word Error (24) - Excel - Not enough memory - Microsoft Community
を見ると、互換性周りで直ったという人がいるので、

SpringMを、
互換性のトラブルシューティング -> 推奨設定を使用する
で起動してみる。するとそのSpringMから起動したExcelでは問題なし。
ただし、SpringMを再起動するとダメ(設定保存してるはずなのに!)。

SpringM起動前に、sc stop "PcaSvc"すると問題なし。
ただし、やはりSpringMを再起動するとダメ。

互換性のフラグ周りで変なことになってる模様。

互換性設定どこかでしていたような気もしたので、
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Persisted
内の、springmの項目を削除。

でも症状変わらず。

これはもうプログラム互換性アシスタントがその仕様レベルでExcel2016とぶつかってるという考えの方が正しいようだ。
プログラム互換性アシスタントを一旦止めることにする。

Windows 8.1ミニTips (100) 「プログラム互換性アシスタント」を制御する●つの方法 | マイナビニュース
を参考に、Program Compatibility Assistant Serviceを無効化。

コマンドラインから、
sc qc "PcaSvc"
で、START_TYPEがAUTO_STARTからDISABLEDになったのを確認。
SpringMを再起動。

無事、SpringM→Excelから保護ビューで開くようになりました。

久々にMicrosoftクソだなと思いました。特にMicrosoftのフォーラムがノイジーすぎるあたりが×。

終わり。

2015/07/27(月) 春M(SpringM)でSusie Plug-inが使用できない

2015/07/27 15:00 PC(全般)
春M(SpringM)で、Susieプラグインが使えなくなった問題。

以下前提。

SpringMの組み込み画像ビューア(pview)は、自動的にSusieプラグインを読み込んで使用してくれる。

プラグインのディレクトリはオプション等で指定出来ない。
SpringM上でハードコーディングされたSusieのレジストリを見にいっているようだ。

で、本題。

現在、Susieのサイトで更新されている最新β版Susie

Susie 0.50 beta3(Jan 15,2013)

は内部的にはSusie2扱いで、レジストリの場所・構造・生成タイミングが旧Susie(〜0.47)と違う。

[〜0.47]
HKEY_CURRENT_USER\Software\takechin\Susie
※起動初回に生成

[0.50〜]
HKEY_CURRENT_USER\Software\takechin\Susie2
※インストール時に生成

SpringMは旧Susie(〜0.47)のレジストリしか見に行かないため、SpringMでSusieプラグインを使用する場合は1度旧Susieを1回起動してやる必要がある。それから新Susie(0.50〜)に更新するか、新Susieとは別に旧Susieを入れっぱなしにしておくかは任意。

幸にして、まだSusie32 ver0.47bが公開されているのでこれを利用すること。

一度旧Susieを起動してしまえば、レジストリには残りっぱなしなのでディレクトリ移動をしない限り問題は起きない。
Windows再インストールの時など、環境作り直し時にはまる可能性があるので注意。

2015/07/09(木) logbackでサイズローテートしない

2015/07/09 14:53 PC(プログラミング)
logbackでログがファイルサイズでローテートしない問題。

Java1.7 + logback-1.1.3

条件は実行時間が短いバッチのようなプログラム。

もともと↓の記述にしていたのだが、ローテートしてくれなかった。
[logback.xml]
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>./logs/hoge.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
      <fileNamePattern>./logs/hoge.%i.log.zip</fileNamePattern>
      <minIndex>1</minIndex>
      <maxIndex>3</maxIndex>
    </rollingPolicy>
    
    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
      <maxFileSize>5MB</maxFileSize>
    </triggeringPolicy>
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger\(%F[%L]\) - %msg %n</pattern>
      <charset>Shift_JIS</charset>
    </encoder>
  </appender>
調べてみると、logbackのSizeBasedTriggeringPolicyはI/O負荷対策のためファイルサイズを毎度チェックしにいかない。デフォルトでは16回に1回であり、16回ログ出力して初めてサイズチェックに行く。ログ出力の頻度が多いと間隔を開け、頻度が少ないと間隔を狭める。

今回のプログラムは16回ログを出すフローがほとんどない。実行時間も短いため、間隔調整の恩恵も受ける暇がない。親切ではあるのだが、プロセス内の初回はチェックするなど対策が必要に思う。

このプログラムごく短時間で起動->終了し、ログの出力回数・起動頻度とも高くない。毎回チェックとしたい。

[logback.xml]
    <triggeringPolicy class="foo.bar.CustomSizeBasedTriggeringPolicy">
[カスタムクラス]
package foo.bar;

import java.io.File;

import ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy;
import ch.qos.logback.core.util.FileSize;

public class CustomSizeBasedTriggeringPolicy<E> extends SizeBasedTriggeringPolicy<E> {

	String maxFileSizeAsString = Long.toString(DEFAULT_MAX_FILE_SIZE);
	FileSize maxFileSize;

	public CustomSizeBasedTriggeringPolicy() {
	}

	public CustomSizeBasedTriggeringPolicy(final String maxFileSize) {
		setMaxFileSize(maxFileSize);
	}

	@Override
	public boolean isTriggeringEvent(final File activeFile, final E event) {
		//オリジナルのisTriggeringEventでは発火しないことがあるため、ログ書き出しごとにチェックする
		return (activeFile.length() >= maxFileSize.getSize());
	}

	@Override
	public String getMaxFileSize() {
		return maxFileSizeAsString;
	}

	@Override
	public void setMaxFileSize(String maxFileSize) {
		this.maxFileSizeAsString = maxFileSize;
		this.maxFileSize = FileSize.valueOf(maxFileSize);
	}
}
isTriggeringEventだけいじったクラスを作成してやって、logback.xmlでそちらを見るようにしてやる。

とりあえずこれで動くことは動く。

2015/07/09(木) LogbackでプロセスIDを出力

2015/07/09 13:25 PC(プログラミング)
logbackでプロセスIDを出す方法。

Java1.7 + logback-1.1.3

あまりいい方法が見つからなかったが、とりあえず出りゃいいやまではできた。

起動コマンドなりスクリプトなりがいじれるのなら、SystemProperty経由で設定・取得する方法が使える。

[起動コマンド]
exec java -Dpid=$$ -jar /foo/bar.jar
[logback.xml]
<pattern>%d{yyyy/MM/dd HH:mm:ss} [${pid}] %level %msg%n</pattern>
-Dpid=$$で、プロパティ:pidにプロセスIDをセット、patternに${pid}と記述してやるとlobackの機能で出力できる。
もちろんUnix環境限定。

なお、シェル側のプロセスIDがほしい場合は、execを外し直接javaコマンドをたたく。
java -Dpid=$$ -jar /foo/bar.jar
Webアプリケーションで動いている場合は、何がしかプロセスIDに相当するものがSystemPropertyにいると思うので${}でそれを拾えばいい(はず)。

本当なら、ManagementFactory.getRuntimeMXBean()で取得するのが正解のようだが、その場合PatternLayoutをカスタムしてコンバータをいじって… とやらなければいけない気がする。規模によってはさすがに大仰か。

[参考]
Igor Minar's Blog: How a Java Application Can Discover its Process ID (PID)

2015/06/28(日) jessieで起動しない

2015/06/28 19:14 PC(Linux)
jessieにアップグレードした際に起動周りで色々問題が起きたのでメモ。

一部解決、かなり未解決。

段階的に修正していくしかなさそう。

grub起動時、コンソールにFile not foundが3回出力される

→解決
#grub-install /dev/sda
#update-grub 
で改善した(他に色々作業していたので、別の処置で改善した可能性も)

systemdで起動しない

→解決

jessieではgrubにsystemdとsysvinitが両方登録される。
wheezy時代には起動していたカーネルのsystemd版は起動しない。sysvinit版だと起動する。

jessieからinit周りがsystemdに切り替わるため、init.dでカスタマイズしたサービスが動かないとは聞いていたが起動しないとは想定外。

原因はfstabにあった。
どうやら、systemdではfstabの記述を厳密に解釈するらしい。usb外付けで繋いでいたドライブ(今は繋いでいない)のoptionsが
defaults
になっていた。
user,noauto
に修正して改善。

3.16.0-4-686-paeで起動しない

未解決解決

wheezyで入っていた3.2.0-4-686-paeは起動するのだが、3.16.0-4-686-paeで起動しない。
gave up waiting for root device 

alert /dev/disk/by-uuid/~~ does not exist
が出る。
busyboxのシェルであれこれ試してみると、
・/dev/disk/by-uuid/が無い
・そもそも/dev/sda1が無い
・cat /proc/modules は空

全くドライバが読めていないっぽい。

起動するカーネル(3.2.0-4-686-pae)のinitrdは12MB
起動しないカーネル(3.16.0-4-686-pae)のinitrdは4MB

lsinitramfsでのぞくと、3.16の方は/lib/modules/3.16.0-4-686-pae/kernel配下がまるごと無い

update-initramfs -uで症状変わらず
起動オプションrootdelay=90等で症状変わらず
depmod -a 3.16.0-4-686-paeでも症状変わらず
ここで今回の調査は断念。

initramfs-toolsのバグだか考慮漏れだかに当たっているような気がしている。

自分でカーネル作り直せば確実なのは分かっているが、そもそも管理コストを下げるためにカーネルもdebian標準にしたいというのが方針なので、しばらく標準でのinitrd正常化方策を探すことにする。といってもかなり色々試してはいるので、調べ方変えるか時間に解決してもらうかじゃないとちょっと無理そう。
[2015/07/28 追記]
時間が取れたので、ひたすら人力で調べてみた。

まずupdate-initramfs内で呼び出しているmkinitramfsを直に叩いてみるが、やはりmodulesが抜ける。
#mkinitramfs -o /boot/initrd.img-3.16.0-4-686-pae.new 3.16.0-4-686-pae
mkinitramfsをたどっていくと、/usr/share/initramfs-tools/hook-functions内のmanual_add_modulesでmodprobeの結果を元にループを回している箇所がある。ここが3.2では動いているのに3.16では動いていない。はて。

スクリプト内で使用しているコマンドをログインシェルで叩いてみるが、いずれのバージョンも問題がない。
#modprobe --all --set-version=3.2.0-4-686-pae --ignore-install --quiet --show-depends eql
insmod /lib/modules/3.2.0-4-686-pae/kernel/drivers/net/eql.ko

#modprobe --all --set-version=3.16.0-4-686-pae --ignore-install --quiet --show-depends eql
insmod /lib/modules/3.16.0-4-686-pae/kernel/drivers/net/eql.ko
とすると、mkinitfamfs内の環境変数が原因か。

で、調べたところ、
#export PATH=/usr/bin:/sbin:/bin
で動きが変わることが分かった。げーっ。実行ファイルゴースト問題だー。

結局のところ、modprobeもdepmodも/sbinと/usr/local/sbinの両方にありログインシェルでは/usr/local/sbinを見ていた。
/usr/local/sbinの方のタイムスタンプは2004年、うぉう。

あとは推測だが、aptでカーネルイメージを入れた際に/usr/local/sbinの古いdepmodを呼んでしまうようだ。古いdepmodは、/lib/modules/<< version >>/modules.dep.binを生成しない。同じく/usr/local/sbinの古いmodprobeはこれで動くのだが、新しい/sbinのmodprobeは
#/sbin/modprobe --all --set-version=3.16.0-4-686-pae --ignore-install --show-depends eql

modprobe: ERROR: ../libkmod/libkmod.c:557 kmod_search_moddep() could not open moddep file '/lib/modules/3.16.0-4-686-pae/modules.dep.bin'
となってしまう(quiet無しだとエラーが出る。ありだと何も出ない)。

3.2は何かのタイミングで新しいmodprobeを発火するタイミングがあった模様で、modules.dep.binがいた。そんな状態で良く動いてたな。

ということで、depmodもmodprobeも新しい方を使ってやればよい。
#/sbin/depmod -v 3.16.0-4-686-pae
これで
/lib/modules/3.16.0-4-686-pae/modules.dep.bin
ができた。

あとはこれでinitrdを作ってやる。
#update-initramfs -u -k 3.16.0-4-686-pae
丸々と太った健康そうな16MBのinitrdができた。

うーん、やっぱりwoodyのアップグレード&アップグレードじゃ限界あるなあ。

grub上でメニューいじったときにunaligned pointer 0x8が出る

→未解決

grub起動時にオプションをeで変えると、
unaligned pointer 0x8
が出る。

GRUBのバグかなあ。

デフォルト起動カーネル切り替え

ということで、しばらくwheezy時代のsysvinitカーネルを使用する。systemdにするためには洗い出しが必要なので3.16が動くようになってからにしたい。

/etc/default/grub
GRUB_DEFAULT="Debian GNU/Linux, with Linux 3.2.0-4-686-pae (sysvinit)"
最初上記形式で書いたが、update-grubしたらwarningが出たので、
/etc/default/grub
GRUB_DEFAULT="gnulinux-advanced-~~>gnulinux-3.2.0-4-686-pae-init-sysvinit-~~"
に変更して、update-grub。

これでとりあえず再起動しても特に操作せずに起動するようになった。
うーん、サーバつぶした方がいいんだろうか。
こういうドハマリは維持意欲を削ぐ。

このサーバはwoodyからの10年選手なので64bit化も含め再インストール時期ではあるのだが……