カテゴリーアーカイブ 未分類

takahashi 著者:takahashi

rc.localにSSHトンネルを張るコマンドを書いたらrc.localがこけるようになった話

先日、紆余曲折あってRaspberry Piに、起動時に特定のサーバーに対してリモートトンネルを掘るように、/etc/rc.localに

autossh user@example.com -R <待ち受けIPアドレス>:<源ポート>:<送り先IPアドレス>:<送り先ポート> -i /path/to/.ssh/id_rsa &amp;
# https://www2.filewo.net/wordpress/2014/08/05/ssh%E3%83%9D%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%AF%E3%83%BC%E3%83%89%EF%BC%88ssh%E3%83%88%E3%83%B3%E3%83%8D%E3%83%AB%EF%BC%89%E3%80%90%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%83%BB%E3%83%AA/#i-21 を参考

のように記述していたのですが、OSの起動ログを確認してみると、

Failed to start /etc/rc.local Compatibility.

というエラーメッセージが発生。

起動後journalctlで調べてみると

ssh exited prematurely with status 0

というメッセージが出ていました。

調べたところ、こちらのサイトに答えが乗っていました。

Autossh error with upstart script: ssh exited prematurely with status 0 [closed] – serverfault

どうやら、rc.localでsshコマンドを動かしてしまうと、sshコマンドが出力する対話メッセージが原因で問題が起きてしまうようです。

ということで、ssh(autossh)コマンドに “-N”オプションを付けて、非対話モードにします。

autossh user@example.com -N -R <待ち受けIPアドレス>:<源ポート>:<送り先IPアドレス>:<送り先ポート> -i /path/to/.ssh/id_rsa &amp;

これで/etc/rc.localが起動で失敗することはなくなりました。

ちなみに、autosshは完全にkillされるまで動き続けるため、コマンドの最後に”&”をつけてバックグラウンドにしないといつまでたっても起動が終わらないという状態になりますので注意が必要です。

/etc/rc.localは手軽に起動時にスクリプトを実行させるにはいい仕組みですが、上記のようなことを考えるとやはり起動時に実行させる処理は可能な限りデーモン化した方がよいのかもしれませんね…(;´∀`)

  • この記事いいね! (0)
著者:ym

DNS サーバ BIND の TXT レコード長

最近 DKIM の公開鍵をレコードに記述する機会が増えて来たのですが、BIND の TXT レコード長には 255 文字という制限がある様です。

調査したところ SOA レコードの様に複数に分けて記述することで記述するとのこと。しかしこの TXT レコードを必要とする側のアプリケーション実装によっては分割された TXT レコードを解釈出来ずにエラーとなる、アプリケーション次第とのこと。

dkim._domainkey IN TXT ( "v=DKIMv1; " " abcdefg" "opqrstu" )

こんな感じ。
OpenDKIM 等はどうなのだろうか。
そもそも DKIM の TXT レコードが長くなることは想定の内だろうから、問題は無いのだと思うけど。

  • この記事いいね! (0)
takahashi 著者:takahashi

Crontab 設定の罠

Let’s Encryptで月に1回証明書を強制的に更新するようにcronにスクリプトを設定してあったはずなのに、Let’s Encryptから有効期限の警告メールが送られてきました。

あれ…と思い、crontabに登録されているコマンドを手動で実行すると正常に更新ができる状態。

そこでLet’s Encryptの更新ログを確認してみると…

2019-08-01 03:45:46,218:INFO:certbot.main:Could not choose appropriate plugin: The nginx plugin is not working; there may be problems with your existing configuration.
The error was: NoInstallationError("Could not find a usable 'nginx' binary. Ensure nginx exists, the binary is executable, and your PATH is set correctly.",)
2019-08-01 03:45:46,219:WARNING:certbot.renewal:Attempting to renew cert (example.jp) from /etc/letsencrypt/renewal/example.jp.conf produced an unexpected error: The nginx plugin is not working; there may be problems with your existing configuration.
The error was: NoInstallationError("Could not find a usable 'nginx' binary. Ensure nginx exists, the binary is executable, and your PATH is set correctly.",). Skipping.

なにやらNginxのバイナリが見つからないというメッセージが。

このサーバーではWebサーバーにNginxを使用しているため、Let’s Encryptのnginxプラグインを使用しているのですが、勿論Nginxはインストール済みですし、パッケージでインストールしたのでシステム上はパスが通っている状態でした。

ということは、もしかしてCronのパス設定がおかしいのか…と考えて “/etc/crontab”の設定を確認したものの

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

あれ…設定はちゃんと入っている…

念のため、Let’s Encryptの更新に使用しているrootユーザーのcrontabに次の一行を入れて、本当に上記のパス設定が効いているのか確認してみました。

* * * * * echo $PATH > /tmp/cronpath.log 2>&amp;1

すると

/usr/bin:/bin

アレ…

設定してあったはずのパスよりも全然少ない…

その後確認したところ、どうやらユーザーごとのcrontabについては/etc/cronの指定は無効なようで、ユーザーごとのcronでも先頭にPATHを追加する必要があるようです。

ということで、

sudo crontab -e

としてrootのcrontabを開いた後、次の2行を一番最初に追記します。

SHELL=/bin/bash #cronで使用したいシェル
PATH=/sbin:/bin:/usr/sbin:/usr/bin #cron実行時に通しておきたいpath

この状態で再度確認すると

/sbin:/bin:/usr/sbin:/usr/bin

ちゃんとパスが更新されました!

Let’s Encryptもcron経由で試しましたが、無事動作しました。

まさかPathだったとは…

  • この記事いいね! (0)
asaba 著者:asaba

【zend】zendFrameWorkを少し触ってみた感想

今作っているアプリは、ajax通信の際にバックエンドでzendFrameWorkを

使ってデータベースを更新しています。

このフレームワークはSQL文を発行させずにzendFrameWork特有の書き方で

データベースを動かすことができるので、どのsqlサーバーに移っても

同じ動きが期待できるみたいです。

書式もフロントエンドで書いていた時とそこまで変わらないかなという感じです。

すごく簡単に言うととっつきやすい。(sql文を直接発行する時より直感で書ける)

 

例えば、ajax通信をして値を新規にクエリに追加するときはこんな感じでかきます。

</pre>
<pre class="code">
$table = 'hoge';

$id      = trim($_POST["app1"]);
$name    = trim($_POST["app2"]);
$color   = trim($_POST["app3"]);
$params = array (
    'id' => $id,
    'name' => $name,
    'color' => $color,
);

$ret = $db->insert($table, $params);</pre>
<pre>

 

簡単に説明すると、ajaxで受け取った各値をarrayとしてカラムに格納、一つのrowに

見立てています。この一列となったrow($params)を$tebleに格納。

arrayとなっていますが、ここでは$paramsをテーブル、各項目を一つのrowと

考えるとわかりやすいと思います。

最後にinsertで反映させて終了です。

 

これだけなら今の自分でも悩まずにさくっとデータベース操作ができそう。

 

  • この記事いいね! (0)
著者:ym

送信メール認証と DMARC

メールが正しいメールかを判断する仕組みとして、最近では SPF や、DKIM は当たり前になってきています。

ただ、DKIM シグネチャの準備もしっかり対応した上で送信してくる迷惑メールもあるので、どちらもいまいちなんですよねぇ。

DMARC というのも、かなり前から目にすることがあったのですが、そういう状態だとなかなかねぇ

最近どこかの記事でDMARCについての話題が出ていたので少し設定してみようかと思います。

  • この記事いいね! (0)
著者:杉浦

モデルでまとめるかモデルを分割するか

 webページを作るとき、多くはモデル、ビュー、コントローラに分けてコーディングを行えます。ざっくばらんには、ビューは与えられた値を適当な形にあてはめるのみのテンプレート、コントローラはモデルに命令を出し値を要求し結果をビューに渡す仲介者、モデルはそれ以外の画面に依らない部分、といった分類です。
 これは実際優秀なのですが、複雑な問題を取り扱うほどモデルが太っていきます。気が付いたら頭の中のハッシュマップが頼りになり出します。単純なCRUDの様なものを扱う程度ならばフレームワークのORM任せで”モデル”と一言で済ませてもあっさり済みますが、そうならない時もあります。そうなる時はモデルを更に分割していく必要があります。モデルの一言でまとめられた要素をhogeモデル、fugaモデルと分解していきます。
 分解の仕方は様々です。様々なので後や他にコードを触る人のために分解の仕方や指針をドキュメントに残すべきです。部分的に何かを用いた場合など、特殊なパターンならばなおさらです。
 分解の仕方は信頼できる先達のモノが良いでしょう。本や説明書などドキュメントされているものが望ましいです。例えば、エリック・エヴァンスのドメイン駆動設計 | Eric Evans, 和智右桂, 牧野祐子, 今関剛 | 工学 | Kindleストア | Amazonです。ドメイン駆動設計ではドメイン(業務知識)に従ってモデルを定義していくやり方を示しています。フレームワークもあると思ったのですが、ORMは用意したから他で自由に書け、といった具合でした。

  • この記事いいね! (1)
takahashi 著者:takahashi

LPICがややこしいことになっていた件

Linuxまわりの技術力を認定してくれる資格としてLPICというものがあります。

Linux好きとしては是非取っておきたい資格なのですが、このLPICの受験手続周りが最近ごたついているようで…

LPI-Japanでは長期にわたりLinux技術者認定試験として「LPIC」の普及活動を行なってまいりましたが、そのお取り扱いを基本的には停止することになりました。
この度のLPICの取り扱いを基本的には停止することで、皆様に混乱とご迷惑をおかけすることを深くお詫びいたします。
すでにLPICの認定を取得された方へのサポートにつきましては、可能な限り対応をさせて頂きます。
今後のLinux技術者認定試験においては、2018年3月から提供をしておりますLinuC(リナック)をご利用いただけますよう、よろしくお願いいたします。

LPI-Japanからの大切なお知らせ – LPI-Japan

停止の理由

1. 現在配信されているLPICの試験問題は、不正流出に対する対策・対応において脆弱な状況にあります。そこでLPI-Japanは、LPICの公正性・信頼性の回復に向けた改善と、受験者・認定者の皆様に対して継続したサービス提供ができるようLPICの試験開発元であるLPI Inc.(カナダ)と交渉を続けて参りましたが、前向きな対応を得ることができませんでした。
2. 日本ではIT技術者向けの認定資格の取得を就職や昇進・昇格の条件とすることがあり、高い公正性と信頼性が求められます。この公平性および信頼性の確保のためにも、ブレインダンプ等による意図的な試験漏えいへの強い仕組み/運用体制の確保、技術の動向に沿った定期的な試験問題の更新、わかりやすい日本語による試験問題の提供が必要と判断し、LPI-Japanは「LinuC(リナック)」を独自に開発し、2018年3月より配信いたしました。
3. LPICの受験をご案内する上で必要となる受験者情報を管理するデータベースへのアクセスがLPI Inc.より2018年8月17日(金)に切断され、新たにLPICの受験を希望する方へのEDUCO-ID(LPIC専用)の新規発行、ならびにLPICの2018年8月16日(受験日)以降の受験結果のご案内ができなくなりました。

LPI-JapanによるLPICの取り扱い停止に関するお知らせ – LPI-Japan

ということで、LPI-JapanとしてはLinuCという独自の新しい試験への移行を進めているようです。

最初この説明を読んた時、”あーなるほど、LPICはLinuCに変わったのね~”という認識だったのですが、よくよく調べると…

LPICとは、LPIが主催しているLinuxの検定試験となります。全世界9ヵ国で展開されており、非常にグローバルな資格です。さらに日本だけでも、受験者数が31万人を超え、ベンダー資格としてはトップクラスに受験数が多い資格となっています。
 LinuCとはLPI-Japanが主催しているLinuxの検定試験となります。今年新しくできた資格試験であり、まだ日本のみ、及び日本市場に適応した資格を目指していくようです。簡単に言うとマイナー資格になります。

【注意】LPICとLinuC、全く別物です!(改訂版) – BrownCoder

LPI-JapanがLPIの支部となってくれることに関心を持っているならばそれでよかったのです。しかし、相談したところ関心がないことがわかりました。それでは新しい細則を展開するにあたり、自分たちでやるしかない。そうしてLPI日本支部を設立しようという流れになったのです。(一番目の記事から)
「LPI-JapanはLinux Professional Institute日本支部とは何らの関係はなく、LPI-Japanは本計画を含むLinux Professional Institute日本支部の活動に何ら関与を行っておりません」と関係性を否定。「誠に遺憾ながら、「LPIC」の実施に関する独占的権利を保有しているLPI-Japanに無断で行われたもの」であることも表明しつつ、「受験生の皆様には、より良い選択肢をご提供できるように配慮してまいります」と述べている。(三番目の記事から)

【注意】LPICとLinuC、全く別物です!(改訂版) – BrownCoder

えぇ…

ってことは結局は(現時点では)実績のあるLPIC受けた方がいいってことなんでしょうかね…

ちなみに、LPI-Japan経由でLPICを申し込むことはできなくなりましたが、代わりにLPI日本支部(ややこしい)が引き続きLPICの受験を受け付けているようです。

LPIC – LPI日本支部

ただ、公式サイトから申し込み方法ががいまいち分かりづらいです。

より分かりやすい申し込み方法が書かれている記事があったのでご紹介します。

LPICに申し込む方法について走り書き(※Linucではない) – Qiita

事情がどうであれ、資格試験で運営側のごたつきで資格取得したい側が振り回されるのはちょっとつらいですね…

  • この記事いいね! (0)
asaba 著者:asaba

【mapbox】mapboxを使っていてハマったこと

mapboxはアプリケーション向けに開発された地図ライブラリです。地図ライブラリといえばgoogleMapやOpenStreetMapがありま

すがmapboxは高速かつ比較的自由度が高くコードで自分の好きなようにカスタマイズすることができるという点が評価され様々なアプリ

に使われています。

便利なライブラリですが、各osにつき若干期待された動作と違う動きをするみたいです。

例えばandroidで大丈夫だったはずのmapboxがiosで開いた場合ページを画面いっぱいに出してページスクロールをすると、ページごとス

ワイプしてしまいます。目的の場所を探している最中も常にページが監視され続けるのでこのままだと非常に使いにくいです。

このままでは煩わしいので一から疑わしいコードを索敵することに・・・すると意外とすぐに原因を見つけ出すことができました。

どうやら、mapboxを装飾する時に定義したcssに問題があったみたいで、cordovaのようなハイブリッドアプリとmapboxを組み合わせる

場合はcssでpotision:”absolute”と定義しなければ正しく機能してくれないみたいです。

なんだよそんなことかと思いつつもcssの基本を忘れかけていたので手放しには喜べませんでした。

 

&lt;/pre&gt;
※iosでマップ固定するプロパティ

potision:"absolute,"
&lt;pre&gt;

 

次の課題はページの一部に表示されたマップをスワイプ検知を回避して固定するところまでです。ここをabsoluteするとページ自体が

マップより下にいかなくなるのでより捻って対策を模索する必要がありそうですね・・・。

 

 

  • この記事いいね! (0)
著者:ym

clamav と disable-unrar で warning

disable-unrar とすることで、古い ccplus でもコンパイル自体は通りますが、今度は実行じに Warning といった警告メッセージが表示される様になりました。

LibClamAV Warning: Cannot resolve: Undefined symbol "libclamunrar_iface_LTX_unrar_peek_file_header" (version mismatch?) - unrar support unavailable

オプション指定で disable-unrar をしたのですが、どうやらモジュールを作成する、しない、の disable 化の様です。

ワーニングメッセージというのことで、現状では 0.101.2 で稼働している為、問題はないのですが、いずれは消したい。なにか新しい c++ コンパイラを入れる以外に良い方法は無いだろうか。

  • この記事いいね! (0)
takahashi 著者:takahashi

AdobeXDにAlexaのプロトタイピング機能が追加されるらしい!?

AdobeXDは、Webサービスやアプリの開発に入る前に、UIを設計・プレビューする際に大変便利なアプリです。

無料でも利用することができる上、実際にボタンを押したら別のページに飛ぶなどの動作も付けることができる”動くモック”を作ることができます。

そんなXDですが、Alexaなどの音声アシスタント用ツールのモックアップにも対応したようです。

AdobeのプロトタイピングツールXDがAlexaを統合 – TechCrunch

詳細はまだ触っていないのでわかりませんが、記事によると、XDにAlexaが搭載されていて、呼びかけた際の動作のデモや、またAxelaのXDプラグインを使って、XDで作成したスキルのモックを 実際に Alexaで試すこともできるそうです。

ここまでできるプロトタイピングツールってなかなかないと思いますので、AdobeXDがさらに開発者から手放せない存在になっていきそうですね。

Adobe XD

  • この記事いいね! (0)