月別アーカイブ 10月 2019

著者:杉浦

【PHP】php-cs-fixerやPhpStormが最新のコーディング規約標準勧告PSR-12にもうすぐに対応

 PSR-12はPHPのコーディング規約のベースです。”PHPのコードを記述する時はとりあえずPSR-12に従い、加えてプロジェクト毎に状況に合わせて規約の拡張をする”という使い方が想定されています。PSR-12はPHP5.4時点で定められていたコーディング規約用標準勧告であるPSR-2に代わって定められたものです。現在のPHP最新バージョンは7.3であり更新が必要になりました。
 PSR-12に乗り換えたいのですが、まだまだ対応したLint等が少ないのが現状です。対応しなければ即座にコードがバグるわけでもなし、そんなものです。そんな中あっという間に対応したPHP_CodeSnifferに続いて、php-cs-fixerとPhpStormがPSR-12に対応しそうです。
 Release 3.5.0 · squizlabs/PHP_CodeSniffer
 php-cs-fixerは自動修正機能付きのPHP用Lintです。PSR-2やSymfonyの定めるコーディング規約セットに準じた自動修正をPHPのソースコードに適用できます。現在ver3.0で開発中です。
PSR-12 Support · Issue #4502 · FriendsOfPHP/PHP-CS-Fixer
 ある程度できておりcopmoser.jsonに

     "friendsofphp/php-cs-fixer": "3.0.x-dev",

と記述してcomposer updateすればPSR-12版を試せます。
 PhpStormはPHPを主に対象としたweb系言語のIDEです。こちらもコードのフォーマット機能があり、早期アクセスプログラム対象の2019.3verで既に実装されています。2019.1が5月、.2が8月なので順調にいけば来月辺りにリリースされ安定が担保されるでしょう。
 PhpStorm 2019.3 EAP #5 | PhpStorm Blog

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

【java】StringBuilderでデータをまとめてpostで送る

StringBuilderを使ってhttpURLConnectionで好きなだけデータを

postする汎用メソッドを作りました。

 

使い方はシンプルで、ただ拡張for文を使って回すだけなので

特別な制約は無いです。

 

</pre>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

StringBuilder contentsBuilder = new StringBuilder();
Map<String, String> map = new HashMap<>();
String str = "hello!!";
double lat = 34.222222;
double longi = 137.111111;
String line = ",";
String strlati = String.valueOf(lat);
String strlong = String.valueOf(longi);
map.put("string", str);
map.put("latitude", strlati);
map.put("longitude", strlong);
for (String val : map.values()) {
if (contentsBuilder.length() > 0) {
contentsBuilder.append(line);
}
contentsBuilder.append(val);
}
}
<pre>

変数latとlongiはdoubleですが、途中でString.valueOf()で変換することで

送ることができるようになります。

 

もしサーバー側で変換したい場合は、\nとか、ごとに切り分けた後に

各値に合った型に戻してあげればいけそうですね。

 

本当はもっと簡単に書きたかったですがこの辺で妥協します。

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

首里城火災

首里城が焼けてしまいました。
首里城へは一度だけ近くへ見に行ったことがあります。中は入らなかったのですが、なんで入場しなかったかは覚えていません・・・・。

那覇・首里城で火災、正殿など7棟焼失 31日午後鎮火

https://www.nikkei.com/article/DGXMZO51617010R31C19A0CE0000/

まだ原因はわかっていませんが、工事の電源熱による火災なのでしょうか。

クラウド化やアウトソースであまり直に触ることは少なくなりましたが、24時間365日稼働するサーバやネットワーク機器を扱っているので、電源から発生する熱についてはかなり注意しています。ホコリもそうです。

自宅でも、ホットプレートや、ドライヤー、溶接機なども使うとケーブルが熱くなるのですぐわかると思います。

使用容量の大きそうな機器を接続したときは、電源ケーブル握って熱くないか、溶けてないか、確認必要ですね。

また乾燥する季節なので、改めて電源廻り、要確認です。

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

【Cordova】アプリで表示する画像を「imgcache.js」を使ってキャッシュする

まだ実装途中ですが、備忘録としてまとめ。
「imgcache.js」を使って、Cordova アプリで表示している画像をキャッシュする方法についてです。

なお、使用したライブラリの GitHub はこちらから。

GitHub – chrisben/imgcache.js: JS library based on the File API to cache images for offline recovery (target: cordova/phonegap & chrome)
https://github.com/chrisben/imgcache.js

 

実装方法ですが、まず下記の npm コマンドでライブラリをインストールします。

npm install imgcache.js --save

また、File 関係の Cordova プラグインも必要なので、合わせてインストールします。

cordova plugin add cordova-plugin-file --save
cordova plugin add cordova-plugin-file-transfer --save

なお、私の環境では既に cordova-plugin-file がインストールされていたのですが、他のプラグインの兼ね合いで、バージョンが低いものがインストールされていました。
で、そのままだと cordova-plugin-file-transfer がインストールできなかったので、オプションの --force を付けて強引にインストールしました。

インストールできたら、ライブラリをインポートします。

import ImgCache from 'imgcache.js';

node_modules > imgcache ディレクトリ内にある imgcache.js を任意の場所にコピーし、それをインポートします。

インポートまで完了したら、あとは ImgCache を初期化して実行するだけです!
初期化は下記のサンプルコードの通りです。

ImgCache.options.debug = true;
ImgCache.options.chromeQuota = 50*1024*1024;
ImgCache.options.usePersistentCache = true;
ImgCache.init(function() {
    // 初期化成功
}, function() {
    // 初期化失敗
});

で、初期化が完了したら、下記のコードで画像のキャッシュを行えます。

var target = $('img#cacheImg');
ImgCache.isCached([キャッシュしたい画像のパス], function(path, success) {
  if (success) {
    ImgCache.useCachedFile(target);
  } else {
    ImgCache.cacheFile(path, function() {
      ImgCache.useCachedFile(target);
    });
  }
});

1行目でキャッシュしたい画像が格納される img 要素を指定しています。
なお、こちらは適宜変更してください。
で、2行目で画像がキャッシュ済みかを調べ、キャッシュ済みだったらキャッシュされた画像を表示し、まだキャッシュされていなかったら、画像をキャッシュしてそれを表示しています。

処理としてはこれだけなのですが、私の環境では下記のメッセージが表示されてしまい、画像のキャッシュに失敗しております!

WARN: No source given to getCachedFileName
INFO: File undefined not in cache

どうやら画像の保存場所が悪いらしい…?
ちなみに、実行環境は iOS です。
解決方法がわかったら、また改めてご紹介したいと思います。

 

以上、Cordova アプリで画像をキャッシュする方法でした。
なお、当然ですが、ImgCache の初期化が完了していない状態で、画像をキャッシュしようとしたり、保存している画像を取得しようとしたりすると警告が表示されますので、ご注意ください。
綺麗な方法かはわかりませんが、私は ImgCache.init() が成功したらフラグを立てて、フラグが立っていたら、画像キャッシュの処理などを行うようにしています。

ご参考になれば幸いです。

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

Cookieを規制する法案が浮上 Webサービスへの今後の影響が心配…

先日、気になるニュースを見かけました。

CookieはステートレスであるWebの仕組み上ユーザーを識別する数少ない手段となっています。

例えば、会員制サイトでアクセスしてきたユーザーがログイン済みなのか、まったく関係のない(会員ではない)部外者なのか、の判別にはCookieの存在が不可欠です。

Cookieがなければ、ログインを前提とした会員制サイトを作ることは事実上難しくなるでしょう。

正確にはCookieのURLにセッションIDを乗せることで、Cookieを使用しない状態の管理行うことはできますが、URLはCookieよりも漏れやすい情報(ユーザーがURLを意図的に保存しなくても、ブラウザの履歴に残ったり、リファラーという仕組みで分かってしまったりする)ため、URLを盗まれてしまうと第三者が正規のユーザーに成り代わって会員サイトを操作できてしまう”セッションハイジャック”が発生しやすくなってしまいます。

ただし、クッキーレス・セッションにはセキュリティ上の問題がある。というのも、クッキーレス・セッションを利用した場合、(当たり前の話であるが)セッションIDが一般ユーザーの目に直接さらされることになる。つまり、URLさえ分かってしまえば、第三者による「なりすまし」も可能であるということだ。
 ただし、このクッキーレス・セッションの脆弱性の問題は、クッキー経由でセッションIDの受け渡しを行った場合でもさほど事情は変わらない。ネットワークをモニタすることで、クッキーの内容などは簡単に盗聴できてしまうからだ。ただ、URLの方が「なりすまし」も「盗聴」も簡単であるという意味で、より危険であるといえる。しょせんは相対的なものといってしまえばそれまでだが、安全性がより重視される局面で、無用にクッキーレス・セッションを採用するべきではない

[ASP.NET]クッキーをサポートしないクライアントでセッション機能を利用するには? – @IT

もちろんURLによるクッキーレス・セッションもシステムによっては適用できる場合もありますが、セキュリティに気を使いたいサイトの場合は当然 Cookieという選択肢が存在しなければなりません。

Cookieという選択肢が取れなくなってしまった場合は、非常に大きな問題です。

そのような技術的な裏側を知ってか知らずかわかりませんが、昨今”個人情報保護”という観点だけを重視してしまい、Cookieを規制しようとする政治的な動きが出てきていますが、正直言って理解に苦しみます。

もっとも、現在多くのサイトで行われている”Cookieを使用することに同意を求める”だけであれば(めんどくさいですが)画面を追加するだけなので問題ありません。

しかし、Cookieの使い方そのものを規制するような動きが万が一出てきた場合、ITインフラそのものを崩壊に追い込んでしまうことも考えられます。

現状”Cookieを規制するようだ”という動きだけニュースになっていて、具体的にどのような規制が行われるのかを説明しているところはまだないようですが、いくらITに詳しくないとはいえ、”知らないから”という言い逃れは許されない問題です。

関係者の方には是非Webの技術やCookieをなぜ使用するのかをきちんと勉強していただいた上で議論していただきたいと思います。

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

【java】ライブラリを使わずに文字列を反転させる

入力した文字列を反転させるミニアプリを作りました。

ライブラリを使えばこんな手間なんてかからないのですが、

なんとなく生のjavaを触って反転させたいと思ったのがきっかけです。

 


public class MainActivity extends AppCompatActivity {
EditText ed;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.altBtn);
ed = findViewById(R.id.mountingText);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String beforeAlterText;
beforeAlterText = ed.getText().toString();
char[] chars = beforeAlterText.toCharArray();
int i = beforeAlterText.length();
if(i % 2 == 0) {
int dev = i / 2;
for(int j = 0; j < dev; j++){
char temp = chars[j];
chars[j] = chars[i – j – 1];
chars[i – j – 1] = temp;
}
System.out.println(chars);

}else if(i % 2 == 1){
int notdev = i / 2 + 1;
for(int j = 0; j < notdev; j++){
char temp = chars[j];
chars[j] = chars[i – j – 1];
chars[i – j – 1] = temp;
}
System.out.println(chars);
}
}
});
}
}


 

最初の分岐で奇数か偶数か判別した後に入力した文字を2で割って中間地点を決めます。

この中間地点まで文字を反転させるといった感じになっています。

 

バブルソートは値の大小を判断しますがここではただの文字列

なのでそのまま文字を置き換えています。

 

文字は出てこないですがSystem.outで反転後の文字列が

確認することができます。

以上ですが見ての通り中身が何もないです。

ttsとか使って応用できればもっと面白そうなアプリが作れるかもしれません。

とりあえずソートの練習をしたいとか見てみたいとか思ったら試してみてください。

 

P.S.余談ですが、自分はこのコードの中で文字列を

退避するところをゴミ箱って呼んでます。

 

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

PlantUMLで出力を見やすい様に制御する

 PlantUMLはUML図を生成する記法です。
シンプルなテキストファイルで UML が書ける、オープンソースのツール
PlantUML integration – Plugins | JetBrains
 便利なのですが生成の配置の制御が大雑把なのが玉に瑕です。
 画面に10個、20個もノードを描画すると関係線(この記事で使う造語。関係を表現する線)が交差して複雑になりだします。

@startuml

abstract class AbstractList
abstract AbstractCollection
interface List
interface Collection


class ArrayList {
Object[] elementData
size()
}

enum TimeUnit {
DAYS
HOURS
MINUTES
}

abstract class AbstractList2
abstract AbstractCollection2
interface List2
interface Collection2


List <|-- AbstractList
Collection <|-- AbstractCollection

Collection <|-- List
AbstractList <|-- ArrayList

List2 <|-- AbstractList2
AbstractList2 <|-- AbstractCollection2
AbstractList2 <|-up- Collection2


AbstractCollection <|- AbstractList

ArrayList <|-- ArrayList2
AbstractList <|-- AbstractList2
AbstractCollection <|-- AbstractCollection2
List <|-- List2
Collection <|-- Collection2

@enduml

 このためにpackage{}で集約を作ったり矢印のstyleskinparam linetype ortho-left-|>で方向を制御します。集約は簡単にいい感じになるので定義できるときはできる限り記述しておくべきです。

@startuml
skinparam linetype ortho

package 1st {
    abstract class AbstractList
    abstract AbstractCollection
    interface List
    interface Collection


    class ArrayList {
    Object[] elementData
    size()
    }

}

enum TimeUnit {
    DAYS
    HOURS
    MINUTES
}

package 2nd {
    abstract class AbstractList2
    abstract AbstractCollection2
    interface List2
    interface Collection2

    class ArrayList2 {
        Object[] elementData
        size()
    }
}

List <|-- AbstractList
Collection <|-- AbstractCollection

Collection <|-- List
AbstractList <|-- ArrayList

List2 <|-- AbstractList2
AbstractList2 <|-- AbstractCollection2
AbstractList2 <|-up- Collection2


AbstractCollection <|- AbstractList

ArrayList <|-down- ArrayList2
AbstractList <|-down- AbstractList2
AbstractCollection <|-down- AbstractCollection2
List <|-down- List2
Collection <|-down- Collection2

@enduml

 見やすくするなる時に重要になるのは連続した関係線があまり曲がらないことです。a -> b-> cとなる時に、a -right-> b, b-right-> c, の様に書くとやりやすいです。

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

【Swift】正規表現による文字列の検索を行う方法

以前に、「【Swift】正規表現を使わずに指定した文字列が含まれているかを判定する」という記事を投稿しましたが、今回は正規表現を使って文字列の検索を行う方法についてです。

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

正規表現による文字列の抽出(Swift) [NSRegularExpression, NSTextCheckingResult] iOS Objective-C, Swift Tips-モバイル開発系(K)
http://www.office-matsunaga.biz/ios/description.php?id=28

iOSエンジニアの正規表現入門 – Qiita
https://qiita.com/shoheiyokoyama/items/5dc67fdc9e06a9dc5728

 

サンプルコードは下記の通りです。

let regex = try? NSRegularExpression(pattern: "[正規表現のパターン]", options: NSRegularExpression.Options())
if regex!.firstMatch(in: [検索したい文字列], options: NSRegularExpression.MatchingOptions(), range: NSMakeRange(0, [文字列の長さ(文字数)])) != nil {
    // 一致した場合に行いたい処理を記述
}

正規表現のパターンは、上記で紹介した記事の内、2つ目が参考になります。
ほとんど JavaScriptPHP と同じなので、他の言語で触ったことがある場合は特に困ることはないかと思います。
なお、2行目ので指定している関数の返り値に、検索で一致した文字列の情報が含まれています。
今回は、一致したらどうかの判断だけが行えればよかったので、特に返り値を保持していませんが、必要に応じてご活用ください。

 

以上、Swift で文字列の検索を正規表現を使用して行う方法でした。
ご参考になれば幸いです。

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

docomoがついにFOMA(3G)の終了を発表!? 電波の届きやすさへの影響が心配…

先日、NTT docomoがFOMAの終了を発表しました。

 「FOMA」および「iモード」のサービス終了について <2019年10月29日> – NTT docomo

FOMAとは、docomoでの3Gサービスの名前で、今回の発表はつまりdocomoの3G対応携帯電話(およびスマートフォン)のサービスが使えなくなることを意味します。

FOMAのサービスが終了した時点で、3G通信までにしか対応していない従来のガラケーはすべて使用不能となるわけですが、個人的に気にしているのは4G以上に対応したスマートフォンの”フォールバック機能”としての3G利用も終了するのかどうかについてです。

現行の4Gとまもなく登場予定である次世代の通信規格の5Gは、3Gと比較して電波が届く範囲が狭い性質があり、現状でも4G以上の電波がつかめない場合は3Gにフォールバックすることで接続を維持する仕組みがどのスマートフォンにも入っています。

田舎や山間部などではこの機能のおかげで何とか携帯電話が利用できていた、という地域もまだまだあるかと思うのですが、もし3Gの電波そのものが停波されるとなると、こういった地域では携帯電話が利用できなくなる可能性があり、事実上のサービスエリアの縮小を招く恐れが出てきます。

特に緊急時に携帯電話が必要になる場面を考えると、4G以上の電波が届きにくい、人の少ない場所の場合が多いと思う(人も多く、設備も整っている場所では最悪携帯が使えなくても助けを呼ぶ手段がある)ので、そういった場所で今後携帯電話が使用不能になるのではないかと不安です。

また、4G対応のスマートフォンであっても、VoLTEに対応していない機種を使っている場合は音声通話のみ3G回線を利用しているため、3Gが停波した場合はこういった機種で音声通話が利用不能となります。

“4Gをつかんでいるから”と思っていたらある日音声通話が使えなくなって混乱が発生する、といった状況にならないかも不安なポイントです。

auはすでに停波を予告していますし、docomoが停波するとなれば必然的にSoftbank/Y!Mobileも追従せざるを得なくなると思いますので、おそらく全社で3G廃止の流れが来ることは間違いないかと思います。

フォールバックも含めた3G停波は行われるのか。3G停波までの間に上記のような問題に各キャリアがどこまで対応してくれるのか。

今後注意深くチェックしていく必要がありそうです。

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

YAMAHA RTX ルータの AWS クラウド版

先月、YAMAHA から vRX というクラウド稼働インスタンス上で動くルータの販売が開始されました。

会社も自宅もルータはYAMAHAルータでまとまっているので、同じコンフィグが利用できて嬉しい。

Amazon Web Services(AWS)版仕様

https://network.yamaha.com/products/software_service/vrx/spec#tab

EC2の仮想マシンで動く AMI イメージが利用できる形として提供されています。

家庭向けでしか Web UI は使ったことが無いけど、CLI だけなのかな?GUI 付くのだろうか?

まずは 20 日間利用できるトライアルライセンスが ありますが、EC2インスタンス費用も必要だし、価格はそれなりに高いので IIJ の SEIL の様に非商用無償とか、保存できない版などが出てくれるとありがたいですね。

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