月別アーカイブ 8月 2019

asaba 著者:asaba

【css】縦長のページで画像が一緒にスクロールしてしまう時の対処法

divタグにくっつけたimgソースが、下にスクロールした時に一緒に移動してしまったときの対処法です。

今回は他のページで使われているアイコンを流用することにしたのですが

cssで設定した要素は絶対に一緒のはずなのになぜかスクロールと同時に画像もおりてくる事態に。。。

仕方がないのであわてず騒がず要素を触りながら確かめることにしました。

どうやら原因はpositionに何も設定していなかったのが原因

だったみたいで、ralativeだのabsoluteだのfixedだの何かしらの設定をする必要があったみたいです。


top: {
    height: "40px",
    position: 'relative'
  },

↑このように高さが設定してあるタグに対しては何らかのpositionの値を与える必要があります。

 

この中で一番無難なのがralativeで、同じタグに要素をぶち込まない限りは機能してくれるので

何も制約がない場合はこいつをおすすめします。

ちなみにabsoluteはブラウザによっては反映されないものもあるので個人的にはあまり推奨しません。

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

【Python】対話型アプリケーション自動化ツールPexpectの紹介

 Linux端末などにアクセスしてコマンドライン上で操作を行うことはよくあります。何かの作業で定型化した操作を行うこともままあります。Pexpeectでコードを組むと自動化処理を作れます。PexpectはLinuxコマンドのexpectの様なことをするPythonモジュールです。
Pexpect version 4.7 — Pexpect 4.7 documentation
 接続コードはシンプルです。ただ使うだけなら次のコードで大丈夫ですが、gitやら何やらに上げると大惨事です。そういう時はid, passwordは設定ファイルなり実行時の引数なりで渡すようにしましょう。

child = pexpect.spawn('ssh user@example.com')
child.expect('password')
child.sendline('mypassword')

 Common problems — Pexpect 4.7 documentation
 とりあえずの作りなら対話は次の様になります。コマンドを送る、入力可能状態になるまで待つ、の繰り返しです。

child.expect('user@example.com.*') # 入力可能状態(左側にユーザ名とディレクトリが見えるアレ)であることを期待する
child.sendline('telnet localhost %d\r' % telnet_port# コマンドを送る

 あくまで対話なので対話先で改めて対話先のローカル線用対話プログラムを開始することもできます。というかかなり広範囲のことができます。Linuxを深く知らない自分の範囲では何でもできるぐらいの感じです。Pexpectはコマンドライン上のプログラムのテスト、サーバやマイコン設定のデプロイ、ncとか使ってペネトレーションテストなど様々な使い道があります。
 公式ドキュメントのExamples — Pexpect 4.7 documentationにはプログラムとしてほぼ完成の状態の例があるのでそれを改造すると理解が早まり、すぐ実践ができます。

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

【Cordova】端末のプラットフォームやバージョン情報を取得できるプラグイン「cordova-plugin-device」

Cordova アプリを開発中に、Android と iOS で処理を分けるなど、端末の情報を取得する必要があるときに便利なプラグイン「cordova-plugin-device」についてのご紹介です。
主に、プラグインによっては、Android でしか動作しないものがあったり、逆に iOS でのみ動作するものもあったりするのでそれの処理をかき分けたい時などに使っています。

GitHub のページはこちらから。

GitHub – apache/cordova-plugin-device: Apache Cordova Plugin device
https://github.com/apache/cordova-plugin-device

 

インストールは下記のコマンドで行います。

cordova plugin add cordova-plugin-device --save

準備は以上で完了です。
あとは、任意の場所でプラットフォームの種類などのデバイス情報を取得できます。

私が主に使うのは下記のコードです。

const device = window.device.platform;

switch (device) {
    case 'Android':
        // 端末が Android だった時の処理
        break;
    case 'iOS':
        // 端末が iOS だった時の処理
        break;
    default:
        // その他の処理
}

上記では、アプリを実行している端末が Android なのか iOS なのか、それ以外のものなのかを判定して、それぞれの処理を実行できます。

他にも、UUID を取得したり、バージョン情報を取得したりすることもできます。
取得できる情報は下記のとおりです。

  • device.model
  • device.platform
  • device.uuid
  • device.version
  • device.manufacturer
  • device.isVirtual
  • device.serial

また、端末の製造元や、現在の実行環境が実機なのかシュミレータなのかを判断することもできます。
使い方は下記のとおりです。

// 製造元を取得
const manufacturer = window.device.manufacturer;
// シュミレータかどうかを取得
const isSimulator = window.device.isVirtual;

なお、シュミレータかどうかの判定については、OS Xブラウザの場合は常に false を返すようです。

 

以上、アプリを実行している端末の情報を取得できるプラグイン「cordova-plugin-device」のご紹介でした。
プラットフォームの取得以外はまだ使ったことはありませんが、それだけでもかなり使えますので、是非ご活用ください。

  • この記事いいね! (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>&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)
著者:杉浦

【Linux】複数ディレクトリにまたがって特定の正規表現に当てはまるの最新のファイル一つのパスを得るコマンド

 Linuxのコマンドはかなり機械語に近いところで最適化されており高速です。PHPのファイルシステムを介していては遅いと言わざるを得ないような場面でもコマンドをexecすれば高速です(プログラム実行関数を扱う際は文字列のエスケープなど対策を忘れないようにする必要があります。任意コード実行のセキュリティホールに繋がるので細心の注意が必要です)。
 とある単一のディレクトリの中で最新をとってくるのは簡単です。

ls -lt ./* | grep -e \.ほしいファイルの拡張子$ | head -n 1| awk '{print $NF}'

lsコマンドのtオプションはファイルを最終更新日時順に表示します. grepでほしいファイル種別に表示を絞り込みます。headコマンドの-n 1で最初の一行のみの表示を取得します。awkの$NFには区切られた文字の内の最後が入ります。結果次の様にファイルのパスが出力されます。

複数ディレクトリはちょっと手間です。ls dirA/* dirB/*とするとディレクトリごとの結果が出てくるのでまとめてソートする必要があります。

ls -l --full-time dirA/* dirB/* dirC/* | grep -e \.ほしいファイルの拡張子$ | sort -k 6,7 -r | head -n 1| awk '{print $NF}'

lsの–full-timeオプションで日時表示をソートしやすい形(なしだと月日で手間)にして出力。sortで6,7列目(-k 6,7)の日時を降順(-r)でソートします。最後はディレクトリ一つの時同様にhead -n 1| awk ‘{print $NF}で完成です。

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

【PowerPoint】入力した英字がすべて大文字になる時の対処法

頻繁に使うものではありませんが、たまに遭遇した時に覚えておくと便利なので備忘録としてまとめます。
PowerPoint でスライド資料を作成中、入力した英字が大文字になってしまう時の対処法です。
例えば、「Power Point」と入力したはずが、実際には「POWER POINT」となってしまうときにお試しください。

今回参考にさせていただいた記事はこちらから。

なんで全部大文字になるの?というときに|クリエアナブキのちょこテク
https://www.crie.co.jp/chokotech/detail/156/

 

対処法としては簡単で、まずリボンメニューのホームの「フォント」の設定を開きます。
フォントの設定エリアの右下隅にある、四角と矢印のアイコンをクリックしてください。
すると、下記のようなウィンドウが開くと思いますので、「文字飾り」の項目の「すべて大文字」のチェックを外します。

あとは OK ボタンをクリックすれば、設定が反映されるはずです。

設定としては以上ですが、場合によってはある程度スライドを作ってしまってからこの設定を反映させたい場合があるかもしれません。
その際に、いちいち入力エリアを選択して、フォントメニューを開いて設定…とやるのは面倒なので、そんな時は「スライドマスター」から一括変更を行います。
下の画像のように、リボンメニューの「表示」を選択すると、「スライドマスター」という項目があるのでこちらをクリックします。

すると、現在使用しているスライドのテンプレートがすべて表示されるので、ここからフォントの設定を変更したい項目を選択し、上記で紹介した方法で「すべて大文字」を解除します。
例えば、変更したいスライドのテンプレートの見出しを選択して設定を変更すれば、すべてのスライドにこの変更が反映されます。
あとは、スライドマスターを閉じれば、元の画面に戻ります。

 

以上、PowerPoint で英字がすべて大文字になってしまう時の対処法でした。
特に一括変更は他の設定でも使えますので、覚えておいて損はないかと思います。
参考になれば幸いです。

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

【zendframework】行の要素を一行ずつ巡回する方法

ここ最近phpでsqlに触れる機会が少しあったので、せっかくなので配列に一行ずつアクセスする

処理を勉強がてらブログに残していきます。

まずテーブルを指定して、行を配列の要素として返すにはtoArray()メソッドを使います。

toArray()メソッドは、テーブルにある一つの行を配列の要素として持たせることができるメソッドで

カラムと値はkey=>valueの形で連想配列として扱われます。

 

</pre>
$Tables = new Tables();
$rowset = $Tables->fetchAll();

$rowsetArray = $rowset->toArray();

$rowCount = 1;
foreach ($rowsetArray as $rowArray) {
echo "row #$rowCount:\n";
foreach ($rowArray as $column => $value) {
echo "\t$column => $value\n";
}
++$rowCount;
echo "\n";
}
<pre>

 

一つ目のforeachで行を一つずつ見ていき、ネストされたforeachでは行のカラムの要素を一つずつ

見て一つずつ出力しているのが分かります。

 

これを上手く使えば、全列にアクセスして該当した値に対して指定した数値以下の値を書き換える・削除する

といった柔軟な動きを降り入れることができるのでキホンとして覚えておきたいですね。

 

もう少しフレームワークの動きとsqlの基礎が分かってきたらもう少し掘り下げていじってみたいと思います。

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

【Android】「java.lang.ClassNotFoundException: Didn’t find class “android.support.v4.animation.AnimatorCompatHelper” on path: DexPathList」エラーの対処法

長々しいタイトルですが、今回は Cordova アプリを開発中に遭遇したエラーについて。
なお、プラットフォームは Android です。
Android 9 で、Adobe の画像加工機能がクラッシュする不具合が発生しており、それを修正している最中に遭遇しました。
一部のみ抜粋ですが「java.lang.ClassNotFoundException: Didn’t find class “android.support.v4.animation.AnimatorCompatHelper” on path: DexPathList」とのことでしたので、そのまま「“android.support.v4.animation.AnimatorCompatHelper”ファイルが見つかりません」という意味のようです。

 

そして今回参考にさせていただいた記事はこちらから。

AnimatorCompatHelper Class Not Found Exception using AppCompat 26.0.0 · Issue #396 · h6ah4i/android-advancedrecyclerview · GitHub
https://github.com/h6ah4i/android-advancedrecyclerview/issues/396

compile 'com.github.h6ah4i:android-advancedrecyclerview:feature~support_libraries_v26-SNAPSHOT'

記事内には上記コードを追加するという方法もありましたが、私の環境ではエラーが発生してうまくいきませんでした。

そのため、下記のコードを build.gradle の最後に下記を追加する方法を採用しました。

configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        def requested = details.requested
        if (requested.group == 'com.android.support') {
            if (!requested.name.startsWith("multidex")) {
                details.useVersion '25.4.0'
            }
        }
    }
}

あとは、Sync Now を実行します。
なお、以前の投稿記事で紹介したように、AsyncTaskCompat.javaAsyncTaskCompatHoneycomb.java を手動で追加していたのですが、ファイルが既に存在しているとのエラーが発生したので、こちらの 2ファイルは削除しました。
で、エラーが発生したので Try Again を実行後、Build → Run したところ、問題なく動作しました。
「効果」のオプションを選択するとそこでクラッシュしていたのですが、再現しなくなりました。
一通り、追加したオプションを使ってみましたがそちらも問題なしでした。

 

以上、Android アプリで「java.lang.ClassNotFoundException: Didn’t find class “android.support.v4.animation.AnimatorCompatHelper” on path: DexPathList」エラーが発生した時の対処法でした。
どなたかの参考になれば幸いです。

  • この記事いいね! (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)