月別アーカイブ 9月 2019

asaba 著者:asaba

【android】mavenCentralとjcenterの関係性

gradleでライブラリを取得するには、jcenter若しくはmavenCentralをgradle

に登録する必要があります。これらが何の役割を持っているかというと

両社とも自由にライブラリを取り出すことができるリポジトリで、androidのライブラリ

やプラグインはほとんどここから取ってきて使うことができます。

少し前まではmavenCentralを使ってライブラリを持ってくることが

普通だったのですが、後から出てきたjcenterはmavenCentralの

持っているライブラリを含めたリポジトリという位置づけになっています。

つまりこれからライブラリと上手く付き合っていくには

mavenCentralをそつぎょうしてjcenterに切り替えておいたほうが後々困らない

ということですね。

 

そうでなくても、targetSdkVersionが28の場合は

Could not find org.jetbrains.trove4j:trove4j:20160824のエラー

でjcenterに切り替えろというエラーが出てくるので、これから

アプリを開発したい・アプリに新機能を追加したい場合は

mavenCentralからjcenterに切り替えておいたほうがライブラリ関係

のエラー処理が少なくて楽そうですね。

 

</pre>
<pre>buildscript {
    repositories {
        jcenter()
        google()
    }


allprojectsのところも同じように修正↓

</pre>
<pre>allprojects {
    repositories {
        jcenter()
        google()
    }
}</pre>
<pre>
  • この記事いいね! (0)
著者:杉浦

NaNの比較

 NaNはNot a Numberの略であり、その名の通り数字でない値を表します。主に数字として解釈できないものを数字と解釈しようとしたときに現れます。web系の言語で出会うことは稀です。
 NaNは歴史的経緯なのか厳密に数学を取り扱っているからかなのかプログラミング領域から見ると少々直感的でない動作をすることが多いです。よくあるのがNaNの比較です。

const a == NaN
a == NaN // false
NaN == NaN // false

 NaNであること調べようとした時、NaNオブジェクトとイコールである、と式で書くとfalseが返ってきます。例はJavaScriptですが他言語でも同様です。これはNaNが数字で表せない値、転じて不明な値を表現しているためです。不明同士を比較しても結果は不明です。
 NaNであることを調べるためには特定の関数を使います。大体isNaNとかそんな感じの名前で用意されているのでそちらで調べます。

$nan = acos(8);

var_dump($nan); // float(NAN)
var_dump(is_nan($nan)); // bool(true)
  • この記事いいね! (1)
著者:ym

いよいよ消費税率10%

8%最終日となりました。明日に備えて、事前に10%へ書き換える作業を行っていました。

家電やさんも駆け込み需要で大忙しだった様ですね。宅配便のシステムもトラブったようですね。

結局我が家は、突然壊れた 32 インチテレビを先月分割で購入したので、その家電だけでした。

あと、勝ちましたね。白いという理由だけでラグビーワールドカップなナンバーを取り付けましたが、日本が勝ってつけてよかったと思います。記念になります。

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

さくらのクラウドで停止させたくないインスタンスを停止時に自動で再起動させる方法

さくらのクラウド上の仮想サーバーにおいて、何かの拍子にシャットダウンしてしまったり、といったトラブルは、実稼働中のサーバーインスタンスでは避けたいものです。

ただ、何か問題が発生してシャットダウンしてしまった場合、止まってしまったOS自身からはもちろん制御することができないため、外部から何らかの操作を行わない限りは自動で復旧できません。

さくらのクラウドには”タグ”という、各リソースにタグ付けをしてグループ分けをする機能があります。

実はこのタグ機能に、@から始まる特定のタグを入れておくと、単に分類だけではなく、特定の動作をさせることができるような仕組みがあります。

例えば、今回のようにサーバーを停止させたくない場合は

@auto-reboot

というタグを追加しておくと、ダッシュボードから操作を行わない限りインスタンスが電源off状態になっても自動的に再起動されます。

ちょっと隠し機能感満載の仕組みですが、別で監視用のインスタンスやサービスなどを利用することなく再起動してくれるのはありがたいですね。

自動再起動以外にもいくつかオプションがあるようですので、さくらのクラウドでサーバーを動かしている方はぜひ確認してみてください。

特殊タグ一覧 – さくらのクラウド ドキュメント

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

【PhpStorm】Redis連携用プラグインRedisの紹介

 PhpStormは主にWeb開発を主眼としたIDEです。データベース回りとの連携は便利なのですが、Redisとの連携は組み込みでありませんでした。プラグインの追加が必要になりますが、一択に絞れるような選択肢はありませんでした。いくつか試して最もおすすめなのはRedisです。
Redis – Plugins | JetBrains
 Redis(プラグイン)の特に良い点は二点、一つは画像の様なデータベースのGUIと同じように扱える程よく簡素なGUIです。


 熟達いらずに何となく分からない場所を触って確かめるだけで機能の多くを把握できます。
 もう一つは無料という点です。PhpStormのRedisプラグインの競合相手の大手には有料であるIedisがあります。
Iedis – Plugins | JetBrains
 こちらはRedisの外(Json、XMLなど)へ出力、Redisサーバ自体の設定などが詳細にできます。この辺り、プラグイン自体をソフトウェアに扱うならIedisに軍配が上がります。一方でRedisサーバとの読み書き機能自体はRedis(プラグイン)とそう変わりません。自分はデバッグ回りが主な使い道なのでRedisサーバとの読み書きこそが主になるので、無料である点の方が重要でした。

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

【androidjava】intentで欲しい値をbundleでまとめる方法

フォームなどで確認画面に移る時にはintentで複数値をもって遷移する

必要があります。

特に特殊な方法で送る必要はなく、intent.putExtraを何回も呼び出すことで可能

です。ですが冗長になってしまう・前のputExtraが上書きされるなどバグのもとを

生みかねないのでbundleを使って遷移する必要があります。

まず、Bundleを定義した後にputStringやputIntなどを使い分けて格納

をしていきます。

<pre class="prettyprint">Intent intent = new Intent(this, MyActivity.class);
Bundle extras = new Bundle();
extras.putString("EXTRA_NAME",name);
extras.putInt("EXTRA_AGE",age);
intent.putExtras(extras);
startActivity(intent);</pre>

 

受取先ではこんな感じで書いていきます。


Intent intent = getIntent();
Bundle extras = intent.getExtras();
String username_string = extras.getString("EXTRA_NAME");
int age = extras.getInt("EXTRA_AGE");

データベースやsharedPreferencesを使って保存したものを次ページで

復元することもできますが、戻る時に値を再度使いたい時は

こっちのほうが分かりやすいかなと思いました。

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

【PHP】「PCDATA invalid Char value XX」エラーの対処法

PHP で生成した XML で「PCDATA invalid Char value 15」というエラーが発生したのでその対処法について。
特に大きな変更を加えてはいなかったので、急に発生してちょっと心臓に悪かった…。

 

で、エラーメッセージで検索し、今回は下記の記事を参考にさせていただきました。

PHPエラー対処方法「RSSをXML取得時に不正文字が存在する場合」
https://deaimobi.com/mbnk-264/

いくつかコードがありましたが、今回は不正文字列を正規表現で削除する方法を選択しました。
こちらのコードは、CData section not finished エラーや、今回の PCDATA invalid Char value XX in エラーの場合に解決できるかも、とのことでした。
コードは下記のとおりです。

$str = preg_replace('/[\x00-\x1f]/','',$str);

実際にコードに実装したところ、パースエラーが発生しなくなりました!
ただ、上記の方法だと改行も削除されてしまうようですので、場合によっては別の方法を使うほうが良さそうです。

 

以上、PHP で発生したパースエラー「PCDATA invalid Char value XX」の対処法でした。
不正文字列だけ削除し、改行は残す方法があればまたまとめたいと思います。
ご参考になれば幸いです。

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

Certbotで証明書の更新後に自動で特定の処理をさせる方法

無料でSSL証明書を発行してもらえるサービスであるLet’s Encryptですが、同時に更新とSSL証明書の設定の自動化を行うCertbotという仕組みを提供しているのも特徴です。

このCertbotですが、いくつかプラグインがあり、ワイルドカード(任意のサブドメインに適用できる)SSL証明書を取得しない場合、メインで使用しているWebサーバー向けのCertbotプラグインを使用すると、自分の方で細工しなくても、Webサーバーを停止することなく自動で取得時の認証や証明書の適用を行ってくれます。

ただ、ワイルドカード証明書の場合はDNS-01という、ドメインを登録しているDNSサーバーを使用した認証方法に限定されてしまうため、上記のようなWebサーバー向けのプラグインを使用することができません。

この場合、ワイルドカード証明書を取得時、もしくは更新時にSSL証明書のインストールや差し替えは行われますが、Webサーバーへの自動適用は行われません。

この状態のままだと、せっかくSSL証明書を自動で更新できても、自動でWebサーバーに読み込まれないため、”いつの間にか期限切れになってた…”なんて状況が発生してしまうことになります。

そこで、僕の場合はSSL更新時に合わせてWebサーバーを自動的に再起動できるように、スクリプトを次のようにしていました。

/usr/bin/certbot renew --force-renew >> /var/log/letsencrypt/ssl-renew.log 2>&amp;1 &amp;&amp; service webサーバーのサービス名 restart >> /var/log/letsencrypt/ssl-renew.log 2>&amp;1

ただこの方法では、まれにSSL更新とWebサーバーの再起動のタイミングが悪く、Webサーバーの再起動が失敗してしまうことがありました。

SSL更新からWebサーバー再起動の間で数秒間マージンを置くことで一応はちゃんと動作するようになったのですが、あくまで固定した秒数待つだけで、SSLの更新状態のチェックなどは行っていないため、必ずしも対策できているとはいいがたい状況でした。

さてどうやればうまくできるかなーと考えていたところ、実はCertbot自体に、処理完了後に特定のコマンドを実行させることができる機能があることを知りました。

例えば、証明書取得時のコマンドに

sudo certbot certonly --manual \
-d example.com -d *.example.com -d ...  \
-m mail@example.com \
--agree-tos \
--manual-public-ip-logging-ok \
--preferred-challenges dns-01 \
--server https://acme-v02.api.letsencrypt.org/directory

のようにするかと思いますが、このコマンドに

--post-hook="実行したいコマンド"

のようなオプションを付加することで、SSL取得処理終了後に指定したコマンドを実行してくれます。

例えば、証明書取得終了後にnginxを再起動させたい場合は

sudo certbot certonly --manual \
-d example.com -d *.example.com -d ...  \
-m mail@example.com \
--agree-tos \
--manual-public-ip-logging-ok \
--preferred-challenges dns-01 \
--server https://acme-v02.api.letsencrypt.org/directory
--post-hook="service nginx restart"

のようにすると、SSL取得処理が終了した時点でnginxを再起動させることができます。

取得時に指定したオプションはcertbotの設定ファイルに記録されるため、2回目以降の更新時では

sudo certbot renew

とするだけでpost-hookも含めて処理してくれるようになります。

なお、このpost-hookはssl証明書の処理が完了したら、失敗・成功にかかわらず実行する、という指定になってますが、処理前に実行させたり、証明書更新が行われた後のみ実行、といった指定も可能となっているようです。

Let’s EncryptのSSL証明書更新時にサービスを再起動する – Qiita

このあたりの設定をうまく使えば、運用がより楽になりそうですね。

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

DMARC report の policy_evaluated

レポートを見ていると、auth_results については DKIM も SPF も pass となるのだが、policy_evaluated については adkim, aspf ともに fail となる症状。

Dmarc: Why do I have dkim=fail, spf=fail and result=pass

https://security.stackovernet.com/ja/q/38420

少しにた症状を見つけたけど、ちょっと違う様子。

内部から外部への送信の際は、2段階MTAを経由した後、外部とつながるMTAから送信となる為、外部とつながるMTAでDKIM署名をしている状況だけど、どうやら source_ip は一番末端の IP アドレスで検証している?レポートを見る限りそのような感じがするのだが、どの IP を見ているのだろうか。

adkim、 aspf パラメータは、いずれも relaxed mode を示す r か strict mode を示す s のいずれかの値を設定します。relaxed mode とは、DKIM あるいは SPF で認証したドメイン (認証識別子) と、ヘッダ上の送信者情報 (From:ヘッダ, RFC5322.From) との組織ドメインが同じであれば良い場合を示します。

https://www.naritai.jp/guidance_record.html

次に DKIM に要求されるアライメントは、以下の通りです。
strict(adkim=s)
署名ドメイン(d=) = ヘッダ From ドメイン 完全に一致
relaxed(adkim=r)
署名ドメイン(d=)の組織ドメイン = ヘッダ From の組織ドメイン 一致

そして、DMARC の認証が成功(dmarc=pass)となるには、
SPF の認証成功(spf=pass) & アライメント一致
または
DKIM の認証成功(dkim=pass) & アライメント一致
であることが必要です。

https://eng-blog.iij.ad.jp/archives/3273
  • この記事いいね! (0)
著者:ym

CentOS 8 rel.

先日9月24日に CentOS 8 の正式リリースの案内がありましたね。

[CentOS-announce] Release for CentOS Linux 8 and CentOS Streams

https://lists.centos.org/pipermail/centos-announce/2019-September/023449.html

CentOS-8 (1905) リリースノート

主な変更点

ネットワーカーな部分としては iptables → nftables と変化しているあたりは見ておこうと思います。

CentOS 7 自体はあまり触る機会がないまま CentOS 8 を使う事になりそうです。

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