月別アーカイブ 10月 2019

asaba 著者:asaba

【android】targetSdkVersionを上げてもHttpClientを引き続き使う方法

2018年から、googleplayストアの審査が厳しくなりました。

具体的には、今開発しているアプリのAPI Levelを26にしてリリースする必要が

あり、最低保証の動きができるminSDKVersionに関してはAPI Levelを

21まで上げることが推奨されることになりました。

この変更により全てのサービスしているアプリが大幅なライブラリの見直しを

せざるをえなくなり、かなり骨が折れる作業を強いられてしまいました。

 

当然API Levelがあがれば機種と古くなったライブラリの相性・依存性も変わってくるので

コードを少しリファクタリングしただけでは動かずライブラリに合わせて

activity内のコードを全体的に見直すという荒療治も必要になってきます。

 

自分もこの変更により今使っているアプリを修正しているのですが、

やはり使えなくなったライブラリに手を焼きました。

例えば、ログインやカラム取得など非同期処理をするのに役に立つHttpClient

ですが、こちらはandroid6.0で完全削除されており、そうとは知らずにandroid9.0に対して

targetSdkVersionを設定したのですがログインをしたと同時に落ちてしまう

不具合にはまってしまいました。

 

こちらはHttpURLConnectionで代用できるのですが、今開発しているアプリは

複数のアクティビティでHttpClientを使っているのでさすがに全部書き換えると

ネットワーク側で不都合がおきないかと不安になります。

 

今のHttpClientを引き続き使う方法なないだろうかと考えていたら

マニフェストにレガシーの設定をすれば引き続きHttpClientを使うことが出来る

ことが判明。

さすがに数年前に出来上がったアプリに対しても救済措置は用意してくれたみたい。

 

書き方は、application内に以下のようにuseLibrearyを登録すればいいだけ。

以下の記述で大丈夫です。↓

 

</pre>
<pre><uses-library android:name="org.apache.http.legacy" android:required="false" /></pre>
<pre>

 

いつまでこれでサポートしてくれるかは分からないですが、現状大きな変更を

したくないのであればこちらがおすすめです。

 

参考サイト↓

HttpClientをtargetSdkVersion=28でも使う

 

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

【Cordova】「deviceready has not fired after 5 seconds.」エラーの対処法

昨日まで動作していたアプリで翌日エラーが発生するという状況に遭遇しました。
Cordova で開発していたアプリで、プラットフォームは Android です。

なお、エラー文はこちらです。

deviceready has not fired after 5 seconds.
Channel not fired: onFileSystemPathsReady

 

エラーメッセージで検索してみましたが有益な記事にはたどり着けず、コードも確認してみましたが、特に変な処理は追加しておりませんでした。
というか、昨日動いてて何故急にエラーが…。

で、物は試しということで、思いついた下記のコマンドを実行。

cordova platform rm android
cordova platform add android

Android プラットフォームを削除し、再インストールしています。
この対処法、実は Cordova 開発では意外とよく見る方法です。
Android Studio 上で追加した設定等がなかったことになるので、たまに面倒なことになったりしますが、大体はこれで何とかなります。

上記コマンドを試してみたところ、問題なく動作するようになりました!
根本的な解決になったのかどうかは分かりませんが、とりあえず解決できたので良しとしましょう。

 

以上、Cordova アプリで発生した「deviceready has not fired after 5 seconds.」の対処法でした。
ご参考になれば幸いです。

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

【GoogleChrome】検証ツールで要素のhoverを確認する方法

今まであまり :hover を使う機会が無いため知らなかったのですが、Google Chrome の検証ツールで要素が :hover の時の確認をする方法です。
:hover はマウスカーソルが要素に合わせられているときの疑似クラスですが、これが有効なときの CSS を調整しようとしても、カーソルを外すと :hover の時に表示される要素が消えてしまい、CSS を調節できない…という状況になりました。
CSS を一部修正して、強制的に常に表示されるようにしても良かったのですが、出来れば他の方法を…と思っていたところ、検証ツールにありました。

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

chromeのデベロッパーツールでcssのhoverを調べる方法 – Qiita
https://qiita.com/blue_camel/items/ab3d03aca7add473c329

 

上記の記事によると、Google Chrome の検証ツールで hover 疑似クラスを強制的に有効にする方法があるとのことです。
スクリーンショットはこちら。

まずは Chrome 検証ツールを開き、検証したい要素を選択します。
そして Elements タブを開き、下部に表示されるウィンドウから Styles を選択します。
すると、:hov という項目があるのでこちらを選択し、:hover の項目のチェックボックスにチェックを入れるだけ!
そうすると、選択した要素が hover の状態を維持してくれるので、あとはいつも通りに CSS を調整すればOKです。

そして、上記の操作をやったのに hover 状態が維持されない場合、指定している要素が間違っている可能性があります。
CSS のコードを確認して、選択している要素が正しいかどうか確認してください。
私も全く同じミスをやらかしましたので、皆様もご注意ください。

 

以上、Google Chrome の検証ツールで要素の :hover を確認する方法でした。
ご参考になれば幸いです。

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

Windows7 の有償延長サポート

来年2020年1月14日で Windows7 のサポートが終了しますが、有料でサポートを購入する事もできる様な情報が出てきました。

米マイクロソフトはこの方針を転換。ボリュームライセンス契約を結んでいるかどうかにかかわらず、あらゆる企業がWindows 7の延長サポートを購入できるようにすると発表しました

今回の発表で新たにWindows 7 ProfessionalとWindows 7 EnterpriseのESUが、マイクロソフトのクラウドソリューションパートナー経由で12月1日より購入可能になります。
Windows 7 ESUはデバイスごとに販売され、1年ごとに料金が値上がりしていく予定。

https://www.publickey1.jp/blog/19/windows_72023.html

どうしても Windows7 を安全に使い続ける必要がある場合は、ボリュームライセンスでなくてもこの有償サポートを購入する事で維持ができそうです。

ただし年々料金が上がっていく仕組みらしい。

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

【Go】Go言語ことはじめ

Goは、シンプルで信頼性の高い効率的なソフトウェアを簡単に構築できるオープンソースのプログラミング言語です。
The Go Programming Language

 Go言語はC言語の様なコンパイルの必要な静的言語でとても高速で軽量な動作ができます。Go言語は記述の簡易さとパフォーマンスの両面を上げることを目的の一つとして作成されました。
 とりあえずコーディングを試すなら公式にオンラインエディタとそれ用の実行環境が置いてあります。
 
 ローカルにおけるGoの実行環境の作成は公式サイトに行って実行ファイルをダウンロードするだけです。windowsならインストーラを起動すればPATHも通してくれます。

 手軽に手元で試すエディタにはVSCodeがおすすめです。無料ですしGoでググって上位に出てくるプラグインを入れればそれなりに機能がそろいます。
 ソースコードの置き場にいきなり気にするようなルールはありませんでした。コンパイル後の実行ファイルがソースコードの配置場所でなくgoコマンドを実行したカレントディレクトリ直下にできることには注意です。
 コードは*.goであれば動作します。例えば次です。

package main

import (
	"fmt"
)

func main() {
	fmt.Println("Hello, World")
}

 とりあえずすぐに使うコマンドはgo run [ファイル名], go buildの二つでOKです。go runは指定したファイルを元にファイルをコンパイル、実行します。go buildは自動で対象を探してコンパイルをします。go buildはpackage名と同名の関数がないと動きません。go runはファイルの中にmain関数がないと動きません。package mainのmain関数を用意するのがよいです。go runするかコンパイルされた実行ファイルを実行するとHello, Worldが表示されます。

 Goの公式は何かと充実しています。Pythonを思い出す豊富な組み込みパッケージについても次のリンクに実例付きで網羅されています。
Packages – The Go Programming Language
 他にもGoコマンドに始まり、エディタ、ソースコードの書き方にまで言及してきます。公式の各ページにはサムネにあるGo言語マスコットであるgopherくんが至る所に変わった形でいて飽きさせません。

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

nginxでリバースプロキシするとバックエンド側への通信がHTTP/1.0になる件

Nginx経由でPHP製のWebアプリにつないだ際、なぜかWebアプリを稼働させているバックエンドのApacheのプロセスが無数に増えてしまい、RAMを食いつぶしてしまう問題に遭遇しました。

Apacheへ直つなぎした場合はそういった問題が起きないため、Apacheとnginxのアクセスログを見比べてみたところ、Apacheへ通信した際はHTTP/1.1が使われていたのに対し、nginx経由でアクセスした際は何故かApacheとの通信が”HTTP/1.0″になってしまっていました。

色々調べたところ、どうやらNginxでリバースプロキシを行う場合、何も指定しない場合、バックエンドのサーバーとはデフォルトでHTTP/1.0で通信してしまうとのこと。

HTTP/1.1で通信させたい場合は

server {}

ディレクティブに、下記の1行を追加すればOKです。

proxy_http_version 1.1;

記述例:

server {
  server_name  .example.com;

  listen          80;
  listen          443 ssl;

 ssl_certificate       /path/to/fullchain.pem;
  ssl_certificate_key   /path/to/privkey.pem;

  client_max_body_size 1g;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Host $host;
  proxy_set_header X-Forwarded-Server $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Fowarded-Proto \$scheme;
  proxy_max_temp_file_size 0;
  proxy_http_version 1.1; #HTTP1.1に固定
  location / {
    proxy_pass https://localhost:8081;
  }
}

これでHTTPの通信が1.1となり、Apacheの負荷も少なくなりました。

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

【android】ContentValuesでorientationを操作する

androidは、撮影した画像を即時にファイルに保存できないので、

(時間が経ってから・若しくは再起動で保存される)開発側でcontentValue

を用意してfileの場所を登録して書き込む必要があります。

androidで画像を保存するときはこのcontentValueに用意されている

putメソッドを使うことでandroidのギャラリーにすぐに使えるようになります。

 

このライブラリを使ってandroidのデータベースに問い合わせるのですが、

こちら側ではカラムとデータを設定するだけでsqlliteでやるような

sql操作は特に何もしないのでsqlをあまり触ったことのない方でも

簡単に書くことができるのでおすすめです。が、contentValueが

受け取るのは何も加工していないファイルになるので、当然このまま

保存しても期待した結果にならない時もあります。

 

例えば、bitmapをexifIntefaceを使ってactivityに表示したのに

contentValueで経由して保存した写真見ると横向きになっていたりします。

これは、exifInterfaceを経由して向きを回転させる前のファイルを

使用せず、生成したファイルオブジェクトをそのまま送っているためです。

 

一応bitmapをbitmap->uri->fileと分解して正しい向きに向かせられるのですが

これだとexif情報が全部抜けてしまい画像としては内容がなさすぎて

使い物になりません。

 

かくいう自分もこのギャラリー内の画像のexif処理にハマっていたのですが、

contentValueではputからorientationを操作できることを知ったので

こちらを使うことにしました。

カラムとデータに設定する方法は以下の通りです。

 


contentValues.put(MediaStore.Images.Media.ORIENTATION, 90);
contentValues.put(MediaStore.Images.Media.LATITUDE, replaceLati);
contentValues.put(MediaStore.Images.Media.LONGITUDE, replaceLong);

 

このように、カラムで修正したいexif情報をMediaStoreで書き込むことで

ファイルに保存される写真にデータを追加することができます。

 

これらの存在を今日の今日まで知らずに使っていたのが怖い・・・。

 

 

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

【android】ファイルのディレクトリを指定するときの注意点

androidアプリでカメラ機能の実装をするときに、bitmap加工やexifの修正の

ために撮った写真のディレクトリを取ってくる必要があるのですが

今まではEnvironment.getExternalStorageDirectoryで指定することに

よって簡単に写真のディレクトリを見つけることができたのですが、

api29からはユーザーのプライバシーを外部から悪用されないように

と厳しく取り締まった結果このメソッドが非推奨になり

開発者さんたちは泣く泣く変更を余儀なくされました。

 

ですが同じことができなくなったという訳ではなく、代わりに

getExternalFilesDirを使うことで今までと同じように

ディレクトリを指定することができます。

 

他にMediaStoreを使ってファイルを作る方法もあるのですが、

getExternalFilesDirのほうが短いコーディングで済ませられるので

こっちのほうが好みですね。

 

改めてapi29以降で共有ファイルを取得するには以下のように書く

ことで取得できるようになります。

</pre>
<pre>File imageStorageDir = new File(
        getExternalFilesDir(Environment.DIRECTORY_DCIM),
        "child"
);</pre>
<pre>

※DCIMとはandroidが持っている外部ストレージの一部なのですが、sdと
違い切り離すことができません。

なので何もマウントしていない状態で画像を保存する場合は

基本このDCIMに保存されます。

 

 

 

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

【Laravel】ログファイルのPermission deniedを恒久的に防ぐ

 Laravelに限った話でないですが、あるプログラムを異なるユーザが実行し同じ宛先のログファイルに追記をしようとする場合、書き込み権限を持っておらずPermission deniedで弾かれることがあります。この記事ではLaravelにおけるこのエラーの防ぎ方を書きます。
 前提としてsudo php artisan hogehoge(root以外が触れられるべきでないローカル領域に触れる処理とか)とwebサーバによるpublic/index.php(webページの表示)の二つが走るものとします。この前提の鬼門はrootユーザ製ログファイルにapache等のwebサーバがログを追記しようとする場合です。デフォルトでは次のようなファイルができあがり、webサーバに書き込み権限がないままwebサーバがログを書こうとしてこけます。

-rw-r--r-- 1 root    root          1368 10月  1 17:13 laravel-2019-10-01.log

 いくつか試した対応策で私的に最も有効なのは次です。

// config/logging.php
<?php

use Monolog\Handler\StreamHandler;
use Monolog\Handler\SyslogUdpHandler;

// whoamiコマンドを実行して現在のPHPプロセスの所有者を得る
// whoamiはwhoamiを実行したユーザの有効なuserid(ユーザ名)を表示するコマンド
$__current_process_user = trim(shell_exec('whoami'));
return [

/// 省略 ///

    'channels' => [
        /// 省略 ///
        'daily' => [
            'driver' => 'daily',
            // whoamiから得た名前別にログファイルを分ける
            'path' => storage_path('logs/laravel-'.$__current_process_user.'.log'),
            'level' => 'debug',
        ],
        /// 省略 ///
    ],
];

 コードのコメントにある通りwhoamiコマンドからプログラムの実行ユーザを得て、名前別にログファイルを分けるやり方です。
 これを用いると次のようにログファイルが分割され、権限による問題が起きなくなります。

-rw-rw-r-- 1 apache   apache     234 10月  1 17:25 laravel-apache-2019-10-01.log
-rw-rw-r-- 1 cplab    cplab     1332 10月  1 17:25 laravel-cplab-2019-10-01.log
-rw-rw-r-- 1 root     root      1368 10月  1 17:13 laravel-root-2019-10-01.log

 ログを時系列順に見たいならcat, sortコマンドがいくらか役に立ちます。

cat laravel-*-2019-10-01.log | sort

とすれば、Laravelログ共通の[2019-10-01 17:19:00] local.DEBUG: を用いて各行が時系列順に結合された結果を見れます。いくらか、というのはスタックトレース等の複数行に渡るメッセージが壊れるからです。残念ながらこれの対策は個別にファイルを見るぐらいしか見つけられていません。

 以下の二つは余談的な他のPermission denied対策です。状況によっては有効かもしれません。
 一つ目はログファイルのデフォルトアクセス権限を変えるやり方です。

// config/logging.php
        'daily' => [
            'driver' => 'daily',
            'path' => storage_path('logs/laravel.log'),
            'level' => 'debug',
            'permission' => 0666,// 権限が設定できる
        ],

 デフォルトのアクセス権限を誰でも読み書き可にすることでroot:rootなログファイルがあってもwebサーバから追記できます。誰でも既存のログを破壊できる点が気になって没にしました。
 二つ目はPHP組み込み関数get_current_userを使うやり方です。

// config/logging.php
        'daily' => [
            'driver' => 'daily',
            'path' => storage_path('logs/laravel-'.get_current_user().'.log'),
            'level' => 'debug',
        ],

 一見shell_exec(‘whoami’)と同様の結果を得られそうな関数名ですが異なる動作をします。get_current_userは現在のPHPスクリプトの所有者の名前を返します。どういうことかというと

-rw-r--r--    1 cplab     cplab       1686  9月 19 12:02 artisan

というファイルがあって

sudo php artisan hoge

とするとget_current_userはcplabを返します。しかしプロセス所有者はrootなので生成されるログファイルの所有者はrootです。artisanとwebページを分ける意味では適していますが実行ユーザ基準でログを分離するwhoamiの方がより安全と考えて没になりました。

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

【iOS】iPhoneのホーム画面でアプリアイコンが一瞬チラつく時の対処法

アプリ検証用の社用端末(iPhone)でたまーに発生していたアイコンのちらつきとその対処法についてです。
今までも発生しておりましたが、支障はないので放置していました。
でも、メモリ不足とかだったら早めに対処したほうがいいか…と思い、調べてみました。
なお、端末は iPhone 6 Plus で、ソフトウェアバージョンは 12.3.1 です。

今回参考にさせていただいたサイトはこちらから。

iPhoneのアプリが勝手に点滅する!?壊れた!?よくあるご相談 | iPhone修理大阪 豊中市 吹田市 | スマートクール エトレとよなか店・イオン吹田店
https://smartcool-toyonaka.com/blog/7393/

 

で、上記の参考サイトによると、アイコンが勝手に点滅する原因は、iPhone の仕様とのこと。
アップデートがあるアプリを自動更新しようとしているため、一瞬アイコンが点滅するようです。
特にメモリ不足とか端末の不具合とかではないので、特に気にしなくてOKとのことでした。

ただ、どうしても気になる!という場合は、アプリの自動更新を OFF にしてください。
iPhone の設定の 一般 > Appのバックグラウンド更新 から設定ができます。
念のためスクリーンショットも載せておきます。

こちらの自動更新は、アプリごとに設定することもできます。
また、更新タイミングも「オフ」「Wi-Fi」「Wi-Fiとモバイルデータ通信」から選ぶことができますので、お好みで変更してください。

 

以上、iPhone のホーム画面のアプリアイコンが一瞬チラつく時の原因とその対処法でした。
端末自体に特に問題があるわけではなくて一安心でした。

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