作成者別アーカイブ: ジジイ

CRONが動かない!Error: bad username; while reading /etc/crontabと吐いた。SSLの更新設定のときにやらかしていた。

ある日の朝、クライアントから「サイトが見れませんよ」と連絡がきた。アクセスしてみるとたしかにダウンしている。どうやらDNSが切れたようだ。IPを辿っていってもそれがわかった。DNSを更新したら復旧した。
原因は不明なので、クライアントのサイトは別の環境に移して対応。とりあえず事態は収まった。

原因究明
DNSがなぜ落ちたのかを辿る。DNSの変更ログを見てみると、ここ1週間まるで更新されていない。1週間前にSSLの設定とPostfixの設定をやりまくったばかり。DNSとSSLとPostfixの接点があるとすれば、、、

・SPF、DKIM、DMARC、Google postmasterの設定をDNSに行った。
・SSLの更新をCronに記述した。

そう、CronでDNSサーバーに更新通知をやらせていたのだけれど、それが滞れば、今回のようにDNSサーバーが落ちるわな。ちょうど1週間だ。まったくもって理屈は適う。
1週間前にこのサイトを参照してSSLを設定した。とても参考になりました。レムシステムさん、ありがとうございます!!

https://www.rem-system.com/mail-postfix03/
00 3 * * * certbot renew -q --deploy-hook "systemctl restart postfix dovecot"
00 5 * * * certbot renew -q --deploy-hook "systemctl restart postfix dovecot"

これをまんまコピペしていたんだけれど、なにがいけないのか。この記述自体がいけないのではなくて、自分の環境にあっていなかったというのが結果だ。

・UBUNTUサーバーを使用という条件で

Cronがちゃんと動いているのか調べてみた。

sudo systemctl status cron

結果が出てきてもとくにわからん…。とにかくCronを再起動してみっか。

sudo systemctl restart cron

cron[20467]: Error: bad username; while reading /etc/crontab

うおおー、赤い字でエラーが!「bad username」とも出ている!「悪ガキの名前」とでも言うのか!とにかく実行するユーザー名が間違っているっていうことかな?
たしかにCronで他に設定したものには「root」で実行するように記述してある。

00 3 * * * root certbot renew -q --deploy-hook "systemctl restart postfix dovecot"
00 5 * * * root certbot renew -q --deploy-hook "systemctl restart postfix dovecot"

とrootを追記して、Cronを再起動。

sudo systemctl restart cron

エラーが解消された!ということはUbuntuのCronでは、実行するユーザーを明示した記述でないといけないってことかな。よし、わかった!
このエラーによって、Cronが全体的に実行されていなかった、ってことだね。それでDNSも落ちちゃったってわけ。
これで全て完了、と言いたいところだが、これが実際にうまく動くかどうかは1日経ってみないとわからない。ログがメールに出力されるように、

00 3 * * * root certbot renew -q --deploy-hook "systemctl restart postfix dovecot" | mail -s 'SSL Check 3:00' username
00 5 * * * root certbot renew -q --deploy-hook "systemctl restart postfix dovecot" | mail -s 'SSL Check 5:00' username

と追記。これで明日の午前3時まで待てばOK。

SPF設定(Postfix)Gmailで警告と鍵マーク。asahiネットのrelayhost使用時にはちょっと注意。

Gmailの人へメールをすると「フィッシングじゃないか?とGmailに言われるよ」などと最近言われ始めた。
自分のGmailに送っても特にならなかったが、いつぞや警告が出るようになってしまった。

このメールにはご注意ください
Gmail では、このメールが本当に webteq.site から送信されたものであることを確認できませんでした。メールに含まれるリンクのクリックや添付ファイルのダウンロード、または返信に個人情報を記載することは避けてください。
迷惑メールとして報告
フィッシングを報告

悪いことしてなくても、正しいことを主張していない限りは疑われるのがインターネットの世界なんでしょう。
そこでSPFを設定しようといろいろ試しましたが、全然だめ。
なんとかこぎつけたのがこのサイト。
https://blog.kamata-net.com/archives/5651.html

v=spf1 mx include:spf-01.asahi-net.or.jp -all

これが効いた。ありがとうございます!kamata-netさん!実際のDNSでの設定は

@
txt
v=spf1 mx include:spf-01.asahi-net.or.jp -all

としました。(あとでダメになるのだけれど)

詳細を以下に。
Postfixを使用していて、かつ、asahi-netを使用している場合の設定です。
asahi-netからだと送信ポートが決められているんだかなんだかで、Postfixのリレーホストをこのように設定しています。

/etc/postfix/main.cf
relayhost = [mail.asahi-net.or.jp]:587

つまり、自前のサーバーが最終的な送信者じゃなくて、asahi-netが送信者になるってわけね。これがわからなくて、自分のドメインを設定したり、自分の固定IPを設定したりしてたってわけ。
kamata-netさんの言うこれがその通りなんでしょう。

mxかspf-01.asahi-net.or.jpで指定された202.224.39.192/27か202.224.39.40からしかメールは送りません、と宣言していることと等価となります。

これで見事、Gmailの受信メールのソースに「spf=Pass...」が出た。
一安心したところで、友人にも送ってテストしてみよーなどと思っているのだが…まだ問題はある。

Gmailの画面をよく見ると、自分のメアドの横に「開いた鍵マーク」がついている。これは暗号化されていないよ、という意味だ。
たしか、SSLの設定をしてあるはずなんだけれどな、と思っていたのだが、そう、まさに「asahi-netが送信者になるってわけね。」ということなのだ。

サーバー →→暗号化→→ asahi-net →→丸裸(やんべ。)→→ 相手

という流れで届いているというわけなのだ。つまり

/etc/postfix/main.cf
relayhost = [mail.asahi-net.or.jp]:587

これの「587」が問題になるわけかなあ。ためしにSSL用の465にしてみた。

/etc/postfix/main.cf
relayhost = [mail.asahi-net.or.jp]:465

送信してから5分くらいかかってやっと届いたが、鍵マークは開いたまんま。
どうすりゃいいんだろ。

これの続きはまた週末で。

…と週末進めたのですが、結果的には大どんでん返しとなってしまいました。リレーホストを使うのはやめたからです。。。その顛末は次のページで。

同じメールが何度も届いて、他のメールが届かなくなる。Postfix+Ubuntu+Dovecot

夕方にメールマガジンが送られてくる。見やしないのだが「ああ夕方になったんだな」と時報代わりに受信し続けている。
ところがそのメールと全く同じメールが10分置きくらいに届くようになった。「配信元がヘマをやらかして多重に配信でもしたんだな」などと思って、届くたびに削除していた。
次の日になってもそれが続いたので「配信元は今頃大騒ぎでメルマガ大量配信のクレームが殺到していることだろう」と配信元のサイトに訪れてみるとやっぱり

サポートに連絡しづらくなっています

と出ていたので鬼の首でも取ったかのような気分になって「やっちまったな」などと思った。
どうにもできないので、事態の収拾を待つことにした。
ところが、夕方近くになって、他のメールも一切届いてないことに気が付き始める。
「ちょっと待て、配信元が送り続けているんじゃない!メールサーバーに届けられたメルマガがなぜか引っ掛かって、それ以降のメールが受け取れていない!」と気が付いた。
「このクソ忙しい年度末になんてことだ!」

やっと事態に気がつけたので、さっそくSSHを開き、すぐにメールのキューを確認

# postqueue -p

これで普通はどんだけ貯まっているか見られるのだが、emptyと出てくる。つまり空ってことだが、それはおかしい。実際に届いていないメールがいくつもあるはずなのだ。そんな静かなクライアントじゃない。
mail.logを確認するのがスジだろうが、めんどくさい。logを解読しようとするだけで肩が重くなる。それよりも先に

# ls -l /home/****/Maildir/cur

でメールボックスがどうなっているか見てみた。
メールの一覧が出てくる。時間も表示されているので、あの問題のメルマガもだいたいで検討がつく。
その検討をつけたメールを削除することにした。logも確認せずに、ね。

ファイル名がやたらと長いのでコピー。時間とかの後に書かれている部分。こんな感じ。

16480486541.Vfc00I5c00e5********.hoge\:2\,S

そいつをrmで問答無用に削除。

# rm /home/*****/Maildir/cur/16480486541.Vfc00I5c00e5********.hoge\:2\,S

再度、メーラーで受信してみると一気にクライアントからのメールが流れてきた。ヤバい!
夜の11時頃まで対応するはめになってしまったが、なんとか事なきを得た。
だがふと考え直してみると、rmじゃなくて、mvで移動して、問題のメールを取っておけばよかったな、なんてふうにも思った。
何が引っ掛かったのか?要はDovecotが、あるメールを受信させるときに、途中で断念するようなふるまいをするわけだ。そのメールのどの部分が原因なのかがわかったら、対策も練られたろうに。ちょっと惜しいな。

MW WP FORMの送信時に遅延。問い合わせデータが大量すぎるのが原因。問題解消。

MW WP FORMはWordpressのフォームプラグインでは逸材で、いまや欠かせないプラグインになっています。
ですが、問い合わせデータが大量になってくると、フォームの送信時に遅延が発生して、数分もの時間を要するようになってしまうことも。
原因はこちらの「お問い合わせ内容データベース保存時にslug生成処理の時間が掛かってしまう」にある通り。
https://github.com/inc2734/mw-wp-form/issues/72
問い合わせデータを書き込むときに、wp_insert_postという関数内で、スラッグをユニークなものにしようと、全問い合わせデータを見に行って、確かめるみたいなことをしてから生成しているようだ。
大切な作業なのかもしれないが、フォーム送信時には必要がないのでやらなくていい作業。
あらかじめ生成しておいてあげればよいということなので、上記の記事にあるようにpost_nameを指定してあげればいいのだけれど、プラグインを直に編集するのは野暮というもの。

そこでフィルターの登場だ。
こんな感じでfunctions.phpに記載すれば遅延を回避できる。

function org_mw_wp_form_create_slug( $override_slug, $slug, $post_ID, $post_status, $post_type ){
if($post_type == "mwf_xxx"){//mwf_のあとにフォームIDを記入
$override_slug = uniqid("mw_wp_form_");// 送信遅延防止のため、Post_nameをランダムで作成;
}
return $override_slug;
}
add_filter( 'pre_wp_unique_post_slug', 'org_mw_wp_form_create_slug', 10, 5 );

xxxのところをフォームのIDへ書き換えるのを忘れないように。
それか、もうめんどくさいときには、MW WP FORMの問い合わせデータだったらなんでもslugを適当に作る、ってことであればこれでもOK。

function org_mw_wp_form_create_slug( $override_slug, $slug, $post_ID, $post_status, $post_type ){
if(strpos($post_type,"mwf_") == 0){
$override_slug = uniqid("mw_wp_form_");// 送信遅延防止のため、Post_nameをランダムで作成;
}
return $override_slug;
}
add_filter( 'pre_wp_unique_post_slug', 'org_mw_wp_form_create_slug', 10, 5 );

Search Everything WordPressの検索機能をカスタムフィールドなども含めて強化できる。

WordPressの検索機能をカスタムフィールドなども含めて強化するためのプラグインがあります。

Search Everything
配布先:http://wppluginsj.sourceforge.jp/i18n-ja_jp/search-everything/

・タグ名を検索
・カテゴリー名と説明を検索 ←これ結構やりたいのではないでしょうか。
・コメントを検索
・コメント投稿者を検索
・承認済みコメントのみを検索
・抜粋を検索
・下書きを検索 ←これ実用的じゃないけど、どんな使い方できるんでしょ。
・メディア (アップロードファイル) を検索
・カスタムフィールドを検索 ←これ結構やりたいのではないでしょうか。
・投稿者を検索
・検索キーワードをハイライト ←これ結構やりたいのではないでしょうか。
・指定した ID の投稿・固定ページ・カテゴリーを検索しない

すごい使えるので、一応メモ。

BEDROCK SERVER にiPadのワールドをコピー、移行できないときの設定。MINE CRAFT

MINECRAFTのBEDROCK SERVERを立てて、楽しんでおられる方も多いはず。
さらに慣れ親しんだワールドをサーバーに移行してみんなと楽しみたい!などなど思う人もいると思います。
あたしの場合、iPadにMINECRAFTをインストールして遊んでいたので、ワールドはiPadの中。
「ファイル」アプリでWorldをフォルダごと取り出すところまではできたのだけれど、それをBEDROCK SERVERに移して、フォルダ名とワールド名を編集して、さあ接続しようとしても、つながらない。
「サーバーに接続できませんでした」
となってしまうのだ。
悪戦苦闘した結果を以下にiPadのワールドをコピー、移行できたときの設定をメモしておきます。

【ワールドを移すところからのプロセス】
1.iPadからワールドを取り出す。圧縮してどっかに送ったり、、工夫して取り出してね。
2.解凍してサーバーの「worlds」フォルダに移す。
3.「worlds」内のワールドのフォルダ名(hogeとします)と
server.propertiesファイルのlevel-nameを

level-name=hoge

というように同じくする。
4.levelname.txtも

hoge

にする。
これで出来上がりのはずなんだけれど、これだけではどうしても接続できないので、今度はlevel.datを編集する。
ただ、ダイレクトに編集してしまうと壊れてしまうので、MCC TOOL CHEST PEを使用すると便利。
level.datの項目を以下の数値にする。

baseGameVersions:*
LANBroadcast:1←これだけでもOKかも。
MultiplayerGame:1
XBLBroadcastIntent:0
showcoordinates:1

実はLANBroadcastを1とするだけでもいいのかもしれない?完全には確かめてないので一応のメモです。
それでもできないときは5項目全部合わせてみてくれ。
これで接続できるはず。できなかったり、別の方法でクリアした場合はコメントにでもあげてくれるとみんな助かります。

sassとcompassをさくらのレンタルサーバーで使いたい。しかしRuby1.8。アップグレードはrbenvがカギ。

sass(scssで書いたものをコンパイルしてくれるアプリって言えばいいかな)を前々から使いたかったのだが、なかなか導入できず。
しかし思い立って、そのおざなりにしていたSassにやっと手を出したのだ。だが簡単な道のりではなかったので、ここにその解消した方法を記しておきたい。

基本参考にしたページ
「さくらのレンタルサーバー上でsass&compassをインストールして使う」

さくらのレンタルサーバー上でsass&compassをインストールして使う

だが、このページの例と違って、私がさくらサーバーを契約したのがだいぶ前なので、Rubyが古い。
1.8系がインストールされているのだ。これが大問題。

【さくらのレンタルサーバ】基本仕様
https://help.sakura.ad.jp/206053142/
「※2018年12月5日以降に新規で提供しているスタンダードプランは、2.5.xです。」

Rubyのバージョンが1.8だとSassだのCompassだのがインストールできないのだ。
2018年12月5日以降に借りた人にとってはすごい簡単、すんなり行けるはず。新しい契約で借りた別のサーバーで試したら即できてしまった。めんどくさけりゃ借り換えてしまうというのも一つの手だ。
後から考えりゃそうも思いつくのだけれど、古いサーバーでなんとかしようとしてしまうのが人間の業というもの。なので「Rubyのバージョンをあげて」から、「SassとCompassのインストール」をする、ということになり、これがまた長い長い旅になるのだ…。

準備の準備
・まずはさくらサーバーの「スタンダードプラン」以上であることを確認。「スタンダードプラン」以上でない場合は断念かな。いや、それでもやっている人はいた。
http://hanikami.sblo.jp/article/103892887.html
あきらめずやってみよう。私にはその気力はない…。
・SSHでサーバーに接続。そしてvimの使い方をちょっと覚える。
接続とvimの使い方は、上に挙げたページを参照してほしい。

SSHでサーバーに接続できたら、さて、ここからが大変なところなのだ。とにかく進めてみよう。

コマンドアレルギーの治療のためと思って…
サーバーに接続できると

%

というだけのまっくら画面になってると思う。
もし

[xxxxx@xxxxxx]$

みたいな場合はシェル(操作方法)がbashになっているということだ。なにかの過程でログインシェルをbashに変更したのでしょうけど、記憶にない場合は、cshに変えたほうがいいかもしれない。どちらでもいいのだけれど、さくらサーバーのデフォルトシェルはcshで、bashに切り替える手間が一つ減るので。よくわかっている人はbashで出来るだろうし、そこそこの経験者だろうから迷いもないはず。
「bash csh 変更」みたいなキーワードで調べてみてくれ。

しかしこのコマンドまっくら画面が嫌いな人も多いだろう。たしかに普段サーバーを触っていない人にはわけがわからないはず。サーバーを触っている私でさえも、別のサーバーとなるとわからないことが多い。だが、アレルギーと思い込んでいるだけかもしれない。コマンドを何回も打っているうちに気にしなくなる時がくる。それまでの辛抱だから、ちょっと頑張ってみようぜ。

rubyのバージョン確認
えーっと、まずはrubyのバージョン確認をしよう。

ruby -v

と打って、ENTER。

ruby 1.8.7 (2012-10-12 patchlevel 371) [amd64-freebsd9]

やっぱりruby 1.8.xと出てきてしまったら長旅を覚悟。
ruby 2.x.xと出てきたら新しい契約のサーバーなので、SassとCompassのインストールをそのまま進めてもらってOK。

ここからは長旅覚悟になってしまった方へ。
ではサーバーの設定ファイルとでも言える「.cshrc」ファイルをvimで開いてみよう。
「.cshrc」はログインしたときにcshシェルが走るイニシャルコマンドファイルってとこかな。
開くために次のコマンドを入れる。

vi ~/.cshrc
もしくはログインしたまんまだと$HOMEディレクトリから始まるので、
vi .cshrc
と打ってもOK。とにかく、ユーザールートのディレクトリにある.cshrcを開ければOKってこと。

viって先頭につけると、vimっていうエディタでファイルを開く、ってことなわけだね。vimはLinuxで使いなれているから抵抗はなかったけど、さくらサーバーのvimは使い勝手がちょっと違って困った。なんかvimにもいくつか種類があるんだよね。ま、いいや。使えない人は調べてみてくれ。慣れるまで大変だけれどさ。

で、「.cshrc」を開くとこんなふうになっていると思う。

alias h history 25
alias j jobs -l
alias la ls -a
alias lf ls -FA
alias ll ls -lA

# A righteous umask
umask 22

set path = (/sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin $HOME/bin)

setenv EDITOR vi
setenv PAGER more
setenv BLOCKSIZE K
setenv PKG_DBDIR ~/db/pkg

if ($?prompt) then
# An interactive shell -- set some stuff up
set filec
set history = 100
set savehist = 100
set mail = (/var/mail/$USER)
if ( $?tcsh ) then
bindkey "^W" backward-delete-word
bindkey -k up history-search-backward
bindkey -k down history-search-forward
endif
endif

これに書き足しながら、Rubyバージョンアップを行っていくわけだ。
Rubyはデフォルトでサーバーに準備されているが、共用サーバーなので、みんなでつかうRubyはバージョンアップはできない。やっちゃったら困る人も出てきちゃうだろうね。マンションの共用部分みたいなもんだ。
なのでカスタマイズできるのは自分ちだけってことで、己のディレクトリにRubyをインストールしていく。

ちょっと雑だが、~/ディレクトリにダイレクトにrbenvを置く方法で行ってみる。もちろん/local/フォルダなんかにインストールしてもOK。

cd ~/

念のため、カレントディレクトリをホームディレクトリに移す。
そんで、/tmpフォルダを作る。これはダウンロードするときに必要になるのだ。

mkdir ~/tmp

そんでrbenvっていうのをダウンロードしてインストールする。
rbenvはRubyを管理できるアプリと思っていいかな。
まずはダウンロード。

% git clone https://github.com/rbenv/rbenv.git ~/.rbenv

そしたら

% vi ~/.cshrc

で.cshrcを編集。追記したところは太字の部分。

alias h history 25
alias j jobs -l
alias la ls -a
alias lf ls -FA
alias ll ls -lA

# A righteous umask
umask 22

set path = (/sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin $HOME/bin $HOME/local/bin $HOME/local/rubygems/bin)

setenv EDITOR vi
setenv PAGER more
setenv BLOCKSIZE K
setenv PKG_DBDIR ~/db/pkg
setenv GEM_HOME $HOME/local/rubygems
setenv RB_USER_INSTALL true
setenv TMPDIR ~/tmp
setenv RUBY_CONFIGURE_OPTS --with-openssl-dir=/usr/local/ssl

setenv RBENV_ROOT $HOME/.rbenv
setenv PATH $RBENV_ROOT/shims:$RBENV_ROOT/bin:${PATH}

rbenv init -

if ($?prompt) then
# An interactive shell -- set some stuff up
set filec
set history = 100
set savehist = 100
set mail = (/var/mail/$USER)
if ( $?tcsh ) then
bindkey "^W" backward-delete-word
bindkey -k up history-search-backward
bindkey -k down history-search-forward
endif
endif

と記入。viを使いなれていないと大変かもしれないが頑張ろう。右クリックでペーストできるはず。
保存してviから出たら以下を続ける。(viの使い方は調べてね。)

% source ~/.cshrc
% mkdir -p ~/.rbenv/plugins
% git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

このページを参照した。ありがとうございます。
https://qiita.com/takemaro/items/7e2b4b7770aff4e0aa93

記述の解説
以下、めんどくせえ時は読み飛ばしてもらってもOK。
この2行は先に紹介したページにある通り。
setenv GEM_HOME $HOME/local/rubygems
setenv RB_USER_INSTALL true

これは
setenv TMPDIR ~/tmp
インストールのテンポラリフォルダを指定する。インストールするときに作業用のフォルダが必要になるのだが、共用サーバーなのでルートのものは使えず、しかたなく自前で作った~/tmpでインストール作業はしていいよ、という意味になる。さっき作ったよね。

長ったらしいこいつは、
setenv RUBY_CONFIGURE_OPTS --with-openssl-dir=/usr/local/ssl
opensslのバージョンが1.0を使われているために、インストールでエラーになったのでRubyの設定を書き換えるために書き足したもの。インストールが終わってしまえばいらない1行か。
このページを参照。

さくらサーバーにはopensslの1.0.2がインストールされているそうなので、そっちを使いますよ、という記述だ。
参考ページのように
RUBY_CONFIGURE_OPTS="--with-openssl-dir=/usr/local/ssl" rbenv install 2.6.1
とコマンドを1行で済ませられればよかったのだが、そうはいかなかったのでこれを書く羽目に。うまくいくならなくていい1行だ。
というように、困ったときにはsetenvでパスを設定しちゃえる、ってことがわかったのは怪我の功名ってやつだよね。

そう、話の途中だが、ときどきこんな感じで

export RBENV_ROOT=$HOME/local/rbenv
export PATH=$RBENV_ROOT/bin:$HOME/local/bin:$PATH

exportから始まる記述を見かけるが、これはbashのやり方で、cshとは違うので注意。
調べていると.bash_profileとか.bashrcみたいなファイルを作ってやる方法があるでしょ。それは別の方法で悪いわけじゃないからわかっていればいいんだけれど。でもまったく参考にならないかというとそうでもなくて、
export RBENV_ROOT=$HOME/local/rbenv
がbashだとしたら、cshでは
setenv RBENV_ROOT $HOME/local/rbenv
などと書き表せる。どちらを使ってもいいけど、さくらサーバーはcshでやった方が手数が少なくて済みそうだ。
混同しやすいのでメモ。

これはこれからインストールするrbenvのパス。
setenv RBENV_ROOT $HOME/.rbenv
setenv PATH $RBENV_ROOT/shims:$RBENV_ROOT/bin:${PATH}

これを記述することで、自前でインストールしたrbenvが働くようになってくれる。
これがない、あるいはうまくいってないと、ルートの/usr/にあるRubyを使用することになってしまうので、自前でインストールするには必要になるわけだ。
そして最後の
rbenv init -
これは、rbenvの再起動だね。bashでやる例にはよく
eval "$(rbenv init -)"
と書かれているやつだね。いろいろありすぎでわからねえや笑

rbenvを使う。
とにかくrbenvが使えるようになっているはず。ならば

rbenv -v

でバージョンを確認してみよう。rbenv 1.1.2-61-g585ed84みたいなのが出ればOK。
rbenv: Command not found.
と出てしまったらパスが通っていないかなにかでrbenvが使えない状態。見直してみよう。
確認するだけなら、rbenvをインストールしてあるところまでのパスを直接書いてコマンドにしてもOKだよ。例えば

~/.rbenv/bin/rbenv -v

でもとりあえずのコマンドは使えてしまうのだ。ただ毎回「~/.rbenv/bin/rbenv」と打つのは大変なので、パスを通してあげて「~/.rbenv/bin/」にあるアプリは「rbenv」みたいな省略形で叩けるようにしてあげるってわけだね。

rbemvのコマンドが使えるようになったら、では1.8系のrubyとおさらばするために、2系のバージョンをインストールする。
その準備体操として、以下を行っておいてくれ。アップデートだ。

cd ~/.rbenv
とディレクトリを移動して、
git pull
と打つ。アップデートが始まるはず。
あともう一個も。
cd ~/.rbenv/plugins/ruby-build
git pull

よし。ではインストールできるrubyのバージョンを探してみる。そういうコマンドがあるのは便利だね。

rbenv install --list

ずらずらっと出てくるが、2.7.0が最新のようなので

rbenv install 2.7.0

とインストールを試したが…だがしかし

BUILD FAILED (FreeBSD 9.1-RELEASE-p24 using ruby-build...

と出てしまいダメ。なんか2.7だとなんかがダメみたいなので欲張らず2.6.1でいってみます。

rbenv install 2.6.1
Downloading ruby-2.6.1.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.1.tar.bz2
Installing ruby-2.6.1...
Installed ruby-2.6.1 to /home/hogehoge/.rbenv/versions/2.6.1

おお、できた!では使えるように反映しよう。しかし…

rbenv global 2.6.1

と打つと反映される、的なことがよく書いてあるのだけれど、反映されない。

ruby -v

と確認するも、ruby 1.8.7 (2012-10-12 patchlevel 371) [amd64-freebsd9]のまま。

rbenv rehash

もよく書かれているので試すも同じ。
そう、それもそのはず。まだ新しいバージョンがインストールされたこと自体がサーバーには認識されていないのだ。

source ~/.cshrc

こいつでシェルを再読み込みしてあげる。中に書かれているrbenv init -がrbenvを再起動するのだ。

ruby -v
と打つと…
ruby 2.6.1p33 (2019-01-30 revision 66950) [x86_64-freebsd9.1]

みごとバージョンがあがった。
これでやっと、SassとCompassのインストール準備が整ったというわけ。準備だけでもくたくただぜ。

エラー
途中にこういうエラーもでた。

BUILD FAILED (FreeBSD 9.1-RELEASE-p24 using ruby-build 20200115-8-g73b926b)

ruby-build: TMPDIR=/tmp cannot hold executables (partition possibly mounted with `noexec`)

なので「.cshrc」に
setenv TMPDIR ~/tmp
setenv RUBY_CONFIGURE_OPTS --with-openssl-dir=/usr/local/ssl

を記述したんですね。/tmpフォルダが使えないのと、OPENSSLのバージョンが低いのが原因なので。
もしエラーが出たら、この2行を見直してみてくれ。あるいはこれをカギに調べてみるといいかもね。とにかくエラー文をコピーしてGoogleにぶっこむ。これが基本だ。

SassとCompassをインストール
そんでは行ってみようか。Sassからインストールだ。

gem install sass

ここでERRORが出たらRubyが古いとか問題がある。

ERROR:While executing gem .....
You don't have write permissions for the /usr/bin directory.
とか
ERROR: Could not find a valid gem 'sass' (>= 0), here is why:
Unable to download data from https://rubygems.org/ - SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: tlsv1 alert protocol version (https://rubygems.org/latest_specs.4.8.gz)とかが出るみたい

エラーはそのままエラー文をGoogleにぶちこんでもらうと解決の早道。それでもなかなかうまくいかないんだけれどね。
SSLを使わないでインストールすると成功する、なんていうのも見かけた。どうやるんだろか。わからないけどなんか方法はあるかもね。
成功しているときはこんなのが出てくるけど、このなかにERRORがあると完了できていないことがあるので注意深くチェックだ。

Successfully installed ffi-1.15.1
Successfully installed rb-inotify-0.10.1
Successfully installed sass-listen-4.0.0
...
4 gems installed

お次はCompassをインストール。Compassっていうのはscssを保存するたんびに、cssに書き出してくれる装置と思えばいいね。マイクラだったらオブザーバーブロックだね。

gem install compass

これもエラーが出まくる。.cshrcの設定をしてあればたぶん大丈夫。みなおしてみてくれ。
成功っぽかったら、.cshrcを読み込みなおしだ。

source ~/.cshrc

確認のため、ヴァージョンを確認する。

sass -v

Ruby Sass 3.7.4とか出てきたらOK。
もしsass: Command not found.が出てしまったら、こいつを確認。
Sassの入っている場所が読み込まれていないので、それを探す。

find ~/ -name sass

これでファイル検索を行う。/www/内も探し始めるのでちょっと時間かかるかも。気長にまとう。
検索結果の中に、この一例のような

/home/hogehoge/local/rubygems/bin/sass

ものが出てきたら、これがアプリの実行ファイルがあるところだ。そこにパスを通してあげよう。この例の場合は、
「.cshrc」のこの部分に

set path = (/sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin $HOME/bin $HOME/local/bin $HOME/local/rubygems/bin)

$HOME/local/rubygems/binというパスの記載があるからsassのコマンドが使える。もし別の場所だったら、その場所にパスを通すためにパス記述してあげてくれ。
ふいー、ではCompassも確認だ。

compass -v
Compass 1.0.3 (Polaris)
Copyright (c) 2008-2021 Chris Eppstein
Released under the MIT License.
Compass is charityware.
Please make a tax deductable donation for a worthy cause: http://umdf.org/compass

こんな感じでバージョン情報が出てくればOK。
ここまで出来たら、やっとコーディングに移れるのだ。長いよ。さくらサーバーがこれをサポートしてくれたら最高なんだけれどな。管理画面からボタン一個でインストールとかバージョン変更とかさ。

SassとCompassを使ってみる。
SassとCompassの使いかたは調べてみてくれ。先に出しているこのページでも十分だ。

さくらのレンタルサーバー上でsass&compassをインストールして使う

Compassの「watch」コマンドは便利だなあ。ただ、毎度シェルログインしないといけないのはめんどくせえ。なんか方法ないのかな。たとえばCGIとかでスイッチつくるとかか。。考えてみよ。

使ってみたらエラーが出たので一応メモ。
「SCSSをコンパイルしようとしたらInvalid US-ASCII character って言われた – SCSS」

SCSSをコンパイルしようとしたらInvalid US-ASCII character って言われた – SCSS


このページにあるように、CSSを書き出してくれる時に、エンコード指定してない場合に出てしまう。CSSファイルの頭にはキャラセットをちゃんとしておこう。もうエラーは嫌だからね。

間違ってたらごめんクサい
作業を追いながら書いたので、追い切れているかわからないです。もしこの手順で出来なかったりしたらコメントください。修正しますー

パソコンのログから出勤時間、退勤時間を知る方法

パソコンのログから出勤時間、退勤時間を知る方法がある。前提は、
・出勤したらパソコンのスイッチを入れ、退勤時にはパソコンのスイッチをオフにしていること
・WINDOWSっていうこと
が条件だ。

1.マイコンピュータのアイコンの上で右クリック
2・管理→システムツール→イベントビューワ→アプリケーション→

「セキュリティーセンターの起ち上がる時間」が電源入れた時間。
「セキュリティーセンターのクローズする時間」が電源切った時間ということになるかな。

1年間程度をさかのぼれることもある。
あの日、電源を何時に切ったっけ?なんていうだけのヒントもゲットできるので、なにかの役には立つかもね。

the_post_navigationで「次へ」や「前へ」が表示されない、もしくは飛ぶ!

the_post_navigationで「次へ」や「前へ」が表示されず、もしくは何記事も飛ばしてページングする!ということがあったらこれが原因かも。

the_post_navigationは「投稿日の時間」で次の投稿を探します。同じ「時間」の記事は飛ばしてしまうという性質があるんです。…です…です…です…です…です…………………

つまり、プラグインなんかで記事を「複製」すると、投稿日の時間が同じ記事が出来上がってしまい、the_post_navigationでは飛ばされてしまうわけですな。
なので1分でもいいから、「投稿日」を変えてやるといいです。

the_posts_paginationで多くページを出力してしまう。WP_queryとか使っているときなんか特に。

the_posts_paginationで多くページを出力してしまう。WP_queryとか使っているときなんか特に起こりやすいね。
そんなときは、$GLOBALS['wp_query']で解決できるそうだ。下のコードを参考にして、$GLOBALS['wp_query']の行を追加してみるといい。$the_queryはおぬしの環境に合わせてね。どっかからコピペしてくると$queryとかになってるときもあるでしょ。なんでもOKなんだけれどさ。

$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
$args = array(
'post_type' => 'xxx',
'posts_per_page' => 10,
'tax_query' => array(
array(
'taxonomy' => 'xxx_cat',
'field' => 'slug',
'terms' => 'common',
),
),
'paged' => $paged
);
$the_query = new WP_Query( $args );
while ( $the_query->have_posts() ):
$the_query->the_post();
get_template_part( 'template-parts/post/content', "xxx" );
endwhile;
$GLOBALS['wp_query']->max_num_pages = $the_query->max_num_pages;
the_posts_pagination();