月別アーカイブ 8月 2019

asaba 著者:asaba

【android】onItemClickで動的にリストを削除する方法

ListViewを組み立てるときに一緒に使うonItemClick関数ですが、叩く時にアクションを起こす方法は

知っていたのですが決められたリストを削除する方法はまだ調べたことが無く、ついこの間その方法を

見つけたので忘れないうちに収めときます。

以下構文になります。

 


myAdapter = new MyListAdapter(this);
    lv = (ListView) findViewById(android.R.id.list);
    lv.setAdapter(adapter);
    lv.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> a, View v, int position, long id) {
        final int positionToRemove = position;
                MyObject.remove(positionToRemove);
                myAdapter.notifyDataSetChanged();
        }
    });

onclickで特定のリストを叩くまでは同じなのですが、ここでは第三引数のpositionを一度int変数に格納します。

その後オブジェクト.removeを使い先ほど格納したpositionToRemoveを指定します。

adapter.notifyDataSetChanged();で、リストを更新。リストの値が変更されたことが確認できれば

成功になります。

よく考えたらめっちゃ簡単でしたね・・・。

※notifyDataSetChangedの前にclear()しないとエラーになるみたいですがこちらでは確認できず。

このコードで動作したのでとりあえず間違いではないと思います。

出典↓

notifyDataSetChanged()でListViewが更新されない

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

※解決済み_windows10でatomが何回もインストール失敗してしまう

自宅でちょちょいとコードをいじりたいなって時にterapadを使うのもそろそろ苦しくなってきた

ので会社のpc同様atomをダウンロードすることにしたのですが、思ったより上手くいかず・・・。

 

まずダウンロードしたexeファイルが開けなかったり二重にインストールして

インストールがめちゃめちゃ重くなったりとインストール前でのトラブルが多すぎて

嫌になっていたのですがこちらは無事解決いたしました。

※今から書くのはatomのダウンロードファイルが大量にフォルダに生まれてしまったときの対処法になります。

 

方法はC->User->任意の名前->AppData->Local内にあるatomフォルダを丸ごと消して再インストール。

この後もう一度ダウンロードファイルを開いて実行するとしばらくすると下のようなアニメーションが

流れるので終わるまで静観してください。

 

 

たまにアニメーションが止まりますがちゃんとダウンロードしてくれているので気長に

待ってください。(ここでせっかちになってダウンロードし直すと自分みたいにatomファイルが増殖します)

ディレクトリにあるAppDataというのは隠しファイルになっているので

表示タブの右側にある隠しファイルというチェックボックスにレ点をいれてください。

 

 

ただしこの隠しファイルにあるファイル群は、何らかの理由で消された場合OSに支障をきたす程度に重要

なのでよほどの用事でない限りは触らないようにするか基本レ点を外すようにしてください。

後は自動でatomのエディタが開くのでここでピン止めするかデスクトップに

ショートカットを作れば通常通り使うことができます。

 

以上でatomのダウンロード時のトラブル処理の方法を終了します。

ちなみに同じos同じ容量なのになぜ会社とここまでダウンロードに時間がかかるかはよく分かりませんでした。

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

【JavaScript】テストツールJestの紹介

 JestはシンプルでリッチなJavaScript用テストツールです。
Jest · 🃏 Delightful JavaScript Testing
Getting Started · Jest
 例によってnpmでインストールです。

npm install --save-dev jest

 使い方はプロジェクトルートに設定ファイルjest.config.jsを置いてnpmスクリプトに好きなオプション(–coverageと–verboseはあると開発の指針になります)をつけて登録、実行するのがおすすめです。

// jest.config.js
module.exports = {
  moduleFileExtensions: [
    'ts',
    'js',
  ],
  testMatch: [
    '**/tests/**/*.test.(ts|js)',
  ],
};

// package.json
{
  "scripts": {
    "test": "jest --forceExit --coverage --verbose"
  }
}

 実行するとコンフィグのtestMatch欄に合っているファイル内部のtest関数が走り出します。

// sum.js
function sum(a, b) {
  return a + b;
}
module.exports = sum;
// sum.test.js
const sum = require('./sum');

test('1+2=3が成立する', () => { // これが実行されます。第一引数はテスト内容の説明なので日本語でOK
  expect(sum(1, 2)).toBe(3);
});

 jestにはいくつかオプションがあります。–verboseと–coverageはおすすめです。
 Jest CLI Options · Jest
 –verboseはどのテスト関数がパスしたか失敗したかを表示します。ないとファイル単位でしか結果がわからずとても不便です。
 –coverageはテスト関数がソースコードの内のどこをどれだけをカバーしているか表示し、レポートを出力します。完璧にする必要はありませんが、漏れが多いとバグが残ってる公算が大きいです。このためテストすべき点がどこに残っているのか、次にチェックする点は何か、とやることの指針になります。見た目も気持ちがいいです。

下図の黄色が分岐の都合で通っておらずテストされていないコード部です。

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

【Cordova】「BluetoothSerial」プラグインで端末との接続ができない時の対処法

昨日投稿した「BluetoothSerial」のトラブルに関する記事の解決策が判明したので、私のための備忘録も兼ねてご紹介。

解決策ですが…プラグインを変更したらうまくいきました!
正攻法ではないような気もしますが、とりあえず解決したから良しとします!

 

変更したプラグインはこちらです。

GitHub – don/cordova-plugin-ble-central: Bluetooth Low Energy (BLE) Central plugin for Apache Cordova (aka PhoneGap)
https://github.com/don/cordova-plugin-ble-central

インストールには下記のコマンドを実行します。

cordova plugin add cordova-plugin-ble-central

この時、cordova-plugin-compat も同時にインストールされますが、もし失敗したら手動で入れ直してください。
私の環境ではこちらのプラグインの導入に失敗したので、一度プラットフォームを削除してから、cordova-plugin-compat を再度インストールしました。

あとはメソッドの一覧を組み合わせて、端末の検出~接続~データ取得までを行えました。
サンプルコードはこちらから。
ちなみに、React で書いています。

import React, { Component } from 'react';

class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      error: null,
      result: null,
    };
    this.scanDevices = this.scanDevices.bind(this);
    this.connectDevice = this.connectDevice.bind(this);
    this.readDeviceData = this.readDeviceData.bind(this);
  }
  componentDidMount() {
    const that = this;
    if (window.device.platform === 'Android') {
      window.ble.enable(function() {
        that.scanDevices();
      }, function(error) {
        that.setState({ error: "Bluetooth を有効にしてください" });
        console.log("Bluetooth を有効にしてください");
      });
    } else {
      this.scanDevices();
    }
  }
  componentWillUnmount() {
    window.ble.stopScan(function() {
      console.log('stop scan');
    }, function(error) {
      console.log(error);
    });
  }
  scanDevices() {
    const that = this;
    window.ble.startScanWithOptions([], { reportDuplicates: true }, function(result) {
      that.connectDevice(result.id);
    }, function(error) {
      console.log(error);
      that.setState({ error: "デバイス情報を取得できませんでした" });
    });
  }
  connectDevice(deviceId) {
    const that = this;
    window.ble.connect(deviceId, function(result) {
      that.readDeviceData(result);
    }, function(error) {
      console.log('デバイス接続 失敗');
      console.log(error);
      that.setState({ error: "デバイスとの接続に失敗しました" });
    });
  }
  readDeviceData(result) {
    const that = this;
    window.ble.read(result.id, result.characteristics[0].service, result.characteristics[0].characteristic,
      function(data) {
        console.log("Hooray we have data"+JSON.stringify(data));
        that.setState({ result: JSON.stringify(data) });
      },
      function(failure) {
        console.log("Failed to read characteristic from device.");
        console.log(failure);
        that.setState({ error: "端末のデータの取得に失敗しました" });
      }
    );
  }
  render() {
    return (
      <div className="App">
        <p>{this.state.result}</p>
        <p>{this.state.error}</p>
      </div>
    );
  }
}
export default App;

とりあえずのサンプルアプリで見た目などは全然こだわっていませんので、その点はご了承ください。

ただしこのコードを実行したところ、端末には接続できたのですが、データが Empty で取得できませんでした…。
こちらは引き続き修正中です。

 

以上、BLE で端末と接続できない時の対処法でした。
Cordova のプラグインはたくさんあるので環境に合わせて使い分ける必要がありますね。
個人的には、プラグイン名で検索してみて参考サイトがある程度見つかるかや、Cordova の公式サイトの Plugin Search でヒットしたものを使うようにしています。
どなたかのご参考になれば幸いです。

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

G Suite などのメールルーティング

レンタルサーバを使いつつ、外部のウィルスチェックサービスを経由させることがありますが、その場合送信ドメイン認証の問題にぶち当たります。

送信者 → DNS MX → G Suite (メールルーティング) → レンタルサーバ (元の MX)

こうすることで G Suite の膨大なデータに基づいたウィルス対策が使えるわけですが、DKIM や SPF など認証に失敗してしまいます。

そもそも G Suite 側で行うので、レンタルサーバ側では認証無視で良い筈ですが、レンタルサーバ側は共通なしくみで動いている為、あまり変更は出来ません。
対処はどの様にしたら良いのだろうか。

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

大手MNO3社で中古端末もSIMロック解除が可能に

携帯回線を提供するMNOのドコモ、ソフトバンク(Y!Mobile含む)ともに、中古のSIMロック解除対応端末についても、SIMロックの解除が可能になりました。

ドコモからのお知らせ : SIMロック解除の受付条件を一部変更 – docomo

ソフトバンクが「SIMロック解除」要件を緩和 中古端末でも来店すれば原則ロック解除可能に – ITMedia Mobile

なお、残るauについても、2019年9月1日までには対応したい考えのようです。

中古スマホのSIMロック解除、auも「9月1日までに」対応予定〜ソフトバンクに続き – engadget 日本版

従来では各社で端末をSIMフリー化したい場合は、端末を最初に購入したユーザーが解約後90日以内までにSIMロック解除の手続きを行う必要があり、この機会を逃してしまうと該当の端末は永久にSIMロック解除できなくなってしまう状態でした。

しかし、今回の変更で、そういった期限切れや中古販売されている端末もSIMロックの解除ができるようになりそうです。
(※SIMロック解除機能が搭載されていない古い端末は解除できません。)

ただし、解除するためには、各端末の提供元キャリアの実店舗へ行き、手続き料3000円を支払ったうえで手続きを行う必要があります。

自分はたまに中古販売店に行ってよさそうな端末がないか探しに行くのですが、前に中古販売店で見た限りではSIMロック未解除の端末は、SIMロック済み端末よりも若干安い価格で販売されている印象でした。(現にSIMロック解除済み端末の場合は、解除していない場合と比較して買い取り額を高く設定している業者も存在しています。)

そのままの価格であればSIMロック未解除の端末のほうが安く手に入ってお得な感じになりそうですが、個人的には中古端末もSIMロック解除できるようになったことで、今後値上がりもありえそうな気がしています。

そのあたりの動向が実際にどうなっていくのかも今後チェックしたいところですね。

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

【Cordova】「BluetoothSerial」プラグインで端末との接続ができない【未解決】

Cordova アプリで BLE によるデータ取得を行おうとしたのですが、アプリと端末との接続ができません。
現在も引き続き対応中ですが、とりあえず途中経過をまとめ。
ちなみに、Android、iOS 共に失敗します。

なお、今回使用しているプラグインは「BluetoothSerial」です。
GitHub のページは下記からご確認ください。

GitHub – don/BluetoothSerial: Cordova (PhoneGap) Plugin for Serial Communication over Bluetooth
https://github.com/don/BluetoothSerial

 

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

Cordova アプリで Bluetooth 通信ができる cordova-plugin-bluetooth-serial を試した – Corredor
http://neos21.hatenablog.com/entry/2017/08/02/080000

で、上記記事を参考にして書いたコードは下記のとおりです。

window.bluetoothSerial.list(function(result) {
  result.map(function(device) {
    window.bluetoothSerial.connect(device.id, function() {
      console.log('デバイス接続 成功');
    }, function(error) {
      console.log('デバイス接続 失敗');
      console.log(error);
    });
  });
}, function(error) {
  console.log(error);
});

このコードだと、bluetoothSerial.list でデバイスの一覧を取得することろまではできたのですが、その次の bluetoothSerial.connect で失敗しています。
Android と iOS で bluetoothSerial.list で取得できる値が違いますが、参考サイトによると、どちらも ID の項目の値を設定すればOKとのことだったのでそうしているのですが…。
何か設定などで抜けがないか引き続き調査したいと思います。

 

以上、Cordova アプリで BLE 通信ができない問題でした。
デバイス取得はできているので、あともう少しのはず!
解決策が分かったら、改めてまとめたいと思います。

 

追記:
プラグインを変更したら端末とアプリを接続することができました!
解決策を掲載したページはこちらから。
【Cordova】「BluetoothSerial」プラグインで端末との接続ができない時の対処法
ご参考になれば幸いです。

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

Chrome76でPWAのアプリがインストールしやすくなった…かも?

細かい変更ですが、GoogleChrome 76から、URLバー(正式名称はOmniバーというそうです。)からPWAアプリがインストールできるようになりました…!

今まではブラウザのメニューを開かないとPWAに対応しているサイトかどうかすらもわからなかったので、この改良はちょっとうれしいですね。

ちなみに、僕の環境ではさらにこちらの機能も追加されていました。

こちらもOmniバーのURL欄をクリックすると出てくる機能です。

ここには、Chromeで同じGoogleアカウントにログインしている端末の一覧が表示され、今開いているタブをクリックした端末に転送することができる、という機能です。

しれっと追加されていたので知らなかったのですが、どうやらテスト公開中の機能のようで、デフォルトでは一部のユーザーでしか使うことができないようです。

この先行機能を使いたい方は、例によって

chrome://flags/#enable-send-tab-to-self
chrome://flags/#enable-send-tab-to-self-show-sending-ui

の2項目を有効化してChromeを再起動すれば利用できそうです。

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

ルーティング処理について

最近はバックエンド側も触れるようになりたいと思い、少ない時間を見つけて

自宅でlaravelをいじっております。

mvcの概念を頭に入れこむのに少し時間がかかりましたがおおよその流れだけは理解

できたのかなと感じています。とはいってもまだ覚える必要のあるものもたくさん

あるので忘れないように今回みたいにちょくちょく書いていきます。(でないと忘れるので)

 

という訳でルーティング処理の概念について少しおさらいします。

ルーティングというのは、各ページにて処理をあらかじめ決めておき、どのアドレスでどのような処理を

返すかを選定する決め事のようなものです。

書く場所としてはroutes/web.phpの中が適正です。つまり、このページを見ることで

処理をするページのアドレスと処理の内容(返す値)を一括で知ることが出来るので

いちいちページに行って確認する必要がなくなります。

ただ単純に文字列を返すだけだとこんな感じになります。


Route::get(&lt;span class="hljs-string"&gt;'posts/{id}'&lt;/span&gt;,

&lt;span class="hljs-function"&gt;&lt;span class="hljs-keyword"&gt;&nbsp; function&lt;/span&gt; &lt;span class="hljs-params"&gt;($id)&lt;/span&gt; &lt;/span&gt;{ &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; &lt;span class="hljs-string"&gt;'あなたのidは&lt;/span&gt;&lt;span class="hljs-string"&gt;'&lt;/span&gt;$id.&lt;span class="hljs-string"&gt;'番です'&lt;/span&gt;; }

);

一つ目の引数にはアドレスの隣にページに渡す値を持たせています。保持することによって

このアドレスのページで受け取って使うことができます。

二つ目の引数は受け取った値で処理をした結果を持たせています。

ざっくり答えるとposts/{id}ページはidを教えてくれるページとなっており、受け取った

値によって結果を変える動的なファイルとなっています。

 

これだけでは実用性があるとまではいえないので、viewを返すルーティング処理を

書いていきます。

なんにもない普通のviewを返すコードです。


<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Laravel</title>
</head>
<body>
<form>
<h1>フォーム</h1>
<div>
<input type="text" placeholder="asaba"/>
</div>
<div>
<textarea placeholder="お問い合わせ"></textarea>
</div>
</form>
</body>
</html>

ディレクトリは「resources/views/sample.blade.php」です。

(ここではBladeというテンプレートエンジンを使っていますが自分でも

まだわかっていない部分があるので割愛させていただきます。)

 

お次はまたルーティングを書いていきます。


Route::get('/sample', function() {
return view('sample');
});

第一引数でパスを決めるとこまでは同じですが、returnの中ではviewそのもの

を返しているのが分かります。

 

これでhtmlひとかたまりを表示することはできました。後はこれとmvcを組み合わせてきれいな

コードを書きあげれば一歩踏み出したことになります。

今回はページをルーティングを使って値を返すだけの内容でしたが、いずれはmodelで

DBを操作したりcontorollerで非同期処理をしてみたりということも書けたらなと思っています。

 

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

オフラインリファレンスブラウザZealの紹介

 Zealはオフラインで言語、フレームワーク、プログラムなどのドキュメントを読むためのブラウザです。オフラインに置くことによる高速な動作と言語を横断した検索ができるのが強みです。

Zeal – Offline Documentation Browser
 使う準備はダウンロードした後、Tools->Docsets->AvailableやTools->Docsets->Add feedでドキュメントをwebから引っ張ってくるだけです。適宜検索等で必要なところをすぐに読める様になります。
 
 元から用意されているAvailableに含まれていないドキュメントが欲しいこともあります。そういった際はZeal User Contributionsの様な個別に用意されているdocsetから取得します。Add feedに要求されるURLにxmlファイルへのURLを入れればOKです。
 いくつかIDEのプラグインがzealにアクセスする様に作られています。例えば、PhpStormのDash – Plugins | JetBrainsはCtrl+Shift+Dでzeal内の検索を走らせます。
 

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