読者です 読者をやめる 読者になる 読者になる

ごらくらいふ

プログラミングしたりゲームしたり

ニコニコマイリストRSSをSlackに吸い上げて貰うようにした

yajamon.hatenablog.com

feedlyで受けるの止めました。

記事の末尾にあるけど、通知先にSlackを選択したのなら、RSSインテグレーションで十分なのよね。

基本的にfeedlyRSSを登録するのは以下を目的にしている。

  • 新着を素早く受信するため
  • 加えて、読むか読まないかの仕分けをするため
    • 読む記事はPocketに送る(IFTTT経由
      • Pocketを使うのは、RSSフィード以外にも後で読む記事があり、それと統合するため

で、マイリストの新着なんて基本全部観たいし、通知先プラットフォームをSlackにしてるし、feedlyを外した。

Windows10でヘルプ(.hlp)が見れないので.chmを介してhtml化した

TSXBINのマクロヘルプが見たかったんだけれど、windowsお前ええ加減にしいや。

環境

  • Windows 10
  • Universal Extractor 2 Beta 4
  • HTML Help Workshop 4.74.8702.0
  • chmdecoder 2.2 (13.03.2014)

手順

chromeだかセキュリティソフトだかが「こんな得体の知れんしクソ広告塗れのサイトなんぞセキュリティリスクじゃ!あかんあかん!」って言うもんだから有志がforkしたっつーUniversal Extractor 2を使った。

「いやそいつヤバイよ。こっち使いな」とあったら教えて。

.hlpを.chmに変換する

  1. Universal Extractor 2を入手、インストール
  2. 対象の.HLPファイルを選択し、OKで展開する
  3. HTML Help Workshopを入手、インストールする
  4. HTML Help Workshopを起動する
  5. [File]->[New]、ダイアログでは「Project」を選択してOK
  6. 「Convert WinHelp project」にチェックを入れ、次へ
    • f:id:yajamon:20170214142952p:plain
  7. さきほど展開したディレクトリ内に.HPJファイルがあるので、それを選択するし、次へ
    • f:id:yajamon:20170214143014p:plain
  8. 下部の入力欄には適当なプロジェクト名を入力し、次へ。(例: macro.hhp
  9. 完了ボタンをクリック
  10. [File]->[Compile]。.hhpファイルが指定されているので、そのままCompile。
    • 「Indexに使う"なんとか.hhk"がないぞ!」とか言われる場合がある
    • それでもとりあえず.chmファイルは生成されている

.chmを.htmlに変換する

  1. chmdecoderをインストール
  2. chmdecoderにて、「Open…」から生成した.chmファイルを選択する
  3. Output folderを変更する(しなくてもいい)
  4. 「Generate Menu」にチェックを入れる
  5. 「Go」ボタンをクリックする

.htmlに変換してから

いろいろおかしいので直す。

左メニューのリンクが機能しない

{OutputFolder指定先}\プロジェクト名\__left.htmを修正する

  • バックスラッシュを出力できていない点を修正する
  • d.add(1,0,"macr04j4.htm","html\macr04j4.htm");などと、エスケープになっている
文字コードUTF-8に変換する

せっかくブラウザで開くので

  1. 文字コード一括変換ソフトのインストール
  2. 対象htmlをすべて変換する
  3. htm内のメタタグを修正する
    • before: <META HTTP-EQUIV="Content-Type" Content="text/html; charset=Windows-1252">
    • after: <META HTTP-EQUIV="Content-Type" Content="text/html; charset=UTF-8">

とりあえず読めるようになった

めんどくさすぎる。

残課題

  • .htm -> .html
  • ファイル名の修正

ps axで出るTIMEの書式はMMM:SS

結論

ps axコマンドで出力される書式にて、TIMEの書式はMMM:SS

経緯

「めっきり使ってないマイクラ鯖どうなってるかな」

「あれ?再起動できてなくない?」

# ps ax | head -1 && ps ax | grep forge
  PID TTY      STAT   TIME COMMAND
 1046 ?        Ss     0:00 SCREEN -h 1024 -dmS minecraft java -Xmx768M -Xms512M -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalPacing -XX:ParallelGCThreads=1 -XX:+AggressiveOpts -jar forge_1.7.2_universal.jar nogui
 1048 pts/1    Ssl+ 37791:54 java -Xmx768M -Xms512M -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalPacing -XX:ParallelGCThreads=1 -XX:+AggressiveOpts -jar forge_1.7.2_universal.jar nogui
32227 pts/0    S+     0:00 grep forge

TIME長すぎてドン引き

調べた

BSD 書式を使ってシステム上の全てのプロセスを表示する:
ps ax

Man page of PS より

bsdtime TIME ユーザーとシステムの cpu 時間の合計。 表示フォーマットは通常は “MMM:SS” であるが、 プロセスが cpu 時間を 999 分より多く使っている場合は、右側へシフトする。

Man page of PS より

つまり、37791/60/24=26.24375。なんだ1ヶ月くらいか。焦った焦った。

てっきり4年位稼働してるのかと思っちゃった。

参考URL

Swiftトレーニングとしてストップウォッチ書いた

標準アプリを模倣するのも良いものだ

f:id:yajamon:20170122010257p:plain

得たもの

  • Timerの使い方
  • Dateの使い方
  • DateFormatterの使い方を少し
    • 結局String(format:)で済ませた
  • guard節の使い方

cron実行時のPATHがどこで決められるのか調査した

経緯

  • CentOS鯖が2本ある
  • Let's encryptの自動更新をしたくてシェルスクリプトを書き、cronに食わせた
  • 2本の内1本から「コマンドが見つかりません」とエラーメールが飛んできた

環境

原因

両方とも失敗していたが片方しかrootメールアドレスを設定していなかった。

結論

PATHMAILTOcrontab -eで一緒に書いちゃった方がいい。

デフォルト値はCronのコード内で定義されていた。

PATHはどんな値?

cron実行中の環境変数

crontabの環境変数PATHについて調べてみた · DQNEO起業日記

# crontab -e
*/1 * * * * printenv > /tmp/printenv.txt
# cat /tmp/printenv.txt
SHELL=/bin/sh
USER=root
PATH=/usr/bin:/bin
PWD=/root
LANG=ja_JP.UTF-8
SHLVL=1
HOME=/root
LOGNAME=root

出た

ユーザの環境変数

Q.ユーザー環境変数は引き継がれるの? A.されない

Crontabの環境変数はどうなっているのか、調べる - それマグで!

まぁカスタムしたPATHとか.bash_profileに書いてあるし、cronが使えるとは思ってない。

ただ、/root/binも放り出されているなんて…

システム的な初期値は何?

# grep PATH /etc/init.d/functions
PATH="/sbin:/usr/sbin:/bin:/usr/bin"
export PATH

CentOS でデフォルトで設定される環境変数について − Linux Square − @IT

まったく一致しない……。

もはや答えはソースを見るしかない

# whereis -b crontab | cut -d' ' -f2 | xargs rpm -qf
cronie-1.4.4-15.el6_7.1.x86_64
# git clone https://git.fedorahosted.org/git/cronie.git
# cd cronie
# git tag | grep 1.4.4 | git checkout -
# find . -type d | grep -v '.git'
.
./anacron
./contrib
./man
./pam
./src

cron の意外な落とし穴! - もろず blog

問題のPATHを探す

# grep '/usr/bin:/bin' src/*
src/pathnames.h:# define _PATH_DEFPATH "/usr/bin:/bin"

幸運なことにあからさまな要素がHit。 この値が利用される箇所を確認する。

# grep -n '_PATH_DEFPATH' src/*
src/cron.c:177: if (putenv("PATH=" _PATH_DEFPATH) < 0) {
src/entry.c:299:                if (glue_strings(envstr, sizeof envstr, "PATH", _PATH_DEFPATH, '=')) {
src/pathnames.h:61:#ifndef _PATH_DEFPATH
src/pathnames.h:62:# define _PATH_DEFPATH "/usr/bin:/bin"
cron.c 134行目から
int main(int argc, char *argv[]) {

    /* 省略 */

    if (putenv("PATH=" _PATH_DEFPATH) < 0) {
        log_it("CRON", pid, "DEATH", "can't putenv PATH", errno);
        exit(1);
    }

    /* 省略 */

}

大当たりだ。

C言語なんてめっきり触っておらず("PATH=" _PATH_DEFPATH)なる記法にウッときた。 (業務でC言語に振れたのはせいぜいがObjective-Csqlite直接使ったときくらい)

参考リンク

起動デーモン(rc.d)

cron

C言語

rootメールアドレス設定

検索に使った正規表現はMarkdownにでも書いて残すと良い

気がする。

特定のリポジトリでしか使わない検索内容だったので、同じリポジトリの中にregexps.mdを作って書いた。 使い方も一緒に書いておけば忘れても大丈夫だ。

こんな感じで。


Match parameter name for obj-c

(:\([^()]+?\))[^:\s]+?(?= [a-zA-z]+?:|$)
Example
// Base
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;

// Erase matched-word
- (BOOL)application didFinishLaunchingWithOptions

// Use $1 when replace.
- (BOOL)application:(UIApplication *) didFinishLaunchingWithOptions:(NSDictionary *)

手元の録画データをバックアップするときに選ぶAmazonのクラウドストレージサービスはGlacier? Unlimited Drive?

Mac Book Airを買ってから最近放置気味のデスクトップPC。

1TBもあったストレージがいつの間にか残り100GBと少し。 ところがインストールしたプログラムもホームフォルダ以下も大して消費していない。なぜか。

f:id:yajamon:20161103140735p:plain

答え) C:/直下にあるプレイ動画の録画ファイルが犯人だから。

録画はちょちょいとエンコードしたら実質不要。でも消すのはもったいない。

→そうだクラウド環境に保存しよう

頻繁に取り出すわけでもないし、Amazon GlacierとAmazon Unlimited Driveを比較してみた。

Amazon Unlimited Drive

料金

  • 13800円/年
    • 1150円/月

Amazon Glacier

料金

ストレージ使用量
  • $0.0114 : GB/月
    • 100GBで約1$ => 約100円
    • 1TBで約1$ => 約1000円

結論

1TBを超える予定ならAmazon Unlimited Drive。 (使い勝手の面からもこっちでいいやという気持ち)

ファイル数や解凍関係で料金の変動はあれど、ひとまず月額の容量単価基準で答えは出た感ある。