エキサイトモバイル WiFiとWiMAXの比較。エキサイトの契約から初期契約解除に至るまでの経緯

1

三重県でNP-Systemsという個人事務所をやっています。

WiMAXを3年使っていたのですが、住んでいる場所では回線が不安定なのでエキサイトモバイルWifiを契約してみました。Docomo回線を使用しているということで安定していそうだったので。ただ、結果的にWiMAX継続でエキサイトモバイルWifiは初期契約解除に至りました。契約の流れ、回線速度、初期契約解除の流れなどをレポートしたいと思います。

概要

エキサイトモバイルWifiは、2020年10月からサービスが開始された新しいWiFiサービスで、Docomo回線を利用しているというのが一番の特徴だと思います。

  • ドコモ4G/LTE回線のデータ通信専用SIM(物理SIM)を採用
  • 速度制限時でも最大700kbpsでデータ通信が使い放題
  • 毎月のデータ通信容量は使い放題で3980円

ということがHPには記載されています。WiMAXが住んでいる三重県だだと結構不安定だったので、Docomo回線なら安定しているだろうということで契約してみました。値段も安くなりますしね。

ただ、結論を言うと初期契約解除に至りました。

  • Docomo回線だけあって、確かに回線は常に安定
  • しかし、速度は0.8Mbpsしかでない(え?いつも速度制限なみでは、、でもブースト機能あります)
  • 上りは30Mbpsで高速

と言うことで解約に至りました。

回線速度は遅い代わりに、ブースト機能(https://www.kashi-mo.com/media/50035/)があるようで接続の最初に30Mbps程度が出ます、なのでWebページの閲覧は非常に早く感じます。値段が安いなりの工夫ですね。しかし読み込みたいものがブーストで読み込めない場合は多少待つことになります。また、動画についてはある程度バッファする必要があるのですが、これもブーストで対応できないのでものすごくスムーズと言うわけではないです。

ただ、上りは非常に安定していて、30Mbps程度は出ます。上りが速いのはいいですね。WiMaxだとよくて1,2Mbps程度なので。Docomoなので屋内や地下などでも使えるのでは?

契約してから商品が届くまで

契約から商品が届くまでの流れです。

  • 火曜日の22時ごろに契約申し込み。申し込み確認のメールを即受信。
  • 4日後にSIMとモバイル端末を別々に発送すると連絡。実際は到着予定日に合わせてメールがくる。
  • 木曜日の朝9時に両方到着

と言う流れです。発送連絡が初期契約解除の算出日になりますので、お試しで試したいという人には重要です。

届いてから使えるようになるまで設定

開封してSIMカード入れるだけですが、挿入の仕方は少し迷いました。なんとかなって30分後には使えるようになりました。

こちらのサイトがわかりやいです。SIMカード傷つけないように気をつけてください。

https://support.qtmobile.jp/manual/dv/310011800189.html

ルータ端末について

HUAWEI Mobile WiFi E5785です。軽いし使いやすいしよかったです。

HUAWEI Mobile WiFi E5785
使いやすいしこちらはいい感じ。
HUAWEI Mobile WiFi E5785

回線速度について

Docomo回線ということで一番期待していましたが、これはよくありませんでした。速度制限時に「最大700kbpsでデータ通信が使い放題」と書いてありますが、実際はいつもこれくらいのスピードしか出ませんでした(いつも0.8Mbps程度)。平日朝、夜、場所を変えてもおなじでした。回線は安定していたのはWiMAXよりよかったです。せめて安定して5Mbps出れば継続でしたが、さすがに遅かったのですぐ初期契約解除することにしました。

speed test result

初期契約解除について

初期契約解除は端末が届いて8日以内であれば違約金なしで解約できる制度です。法律で定められており、ちゃんと対応してくれます。申し込みをしてから数日後に「発送したよ」というメール連絡がくるのですが、その8日以内であれば返却が可能です。その場合、違約金などはかかりません。

ただ日数分割した月額費用はかかるということで私は461円かかりました。

初期契約解除は下記の項目を書いた紙をFAXする必要があります

  • ご契約者名(フリガナ)
  • ご契約者住所
  • ご連絡先電話番号
  • エキサイトID
  • 契約のご案内通知の受領日
  • 初期契約解除請求対象サービス名
  • 初期契約解除請求FAX発送日
  • 初期契約解除請求対象の電話番号(xxx-xxxx-xxxx)

「初期契約解除を請求します。」の一文

これを記載した紙をFAXすればいいです。なお初期契約解除請求対象の電話番号というのはWiFiの端末の電話番号ですので、これはSIMカード同封の紙に書いてあると思います。私は020から始まる番号でした。自分の電話番号を書かないように。紙の記入は手書きで大丈夫です。

私の流れは

  • 日曜日の21時に紙に書いてセブンイレブンからFAX
  • 月曜日の14時にFAXの受領連絡がメールであり
  • その中に端末とSIMカードの返却先が記載されているので、火曜日の朝にそこへ発送

という流れでした。

FAXすると翌日にこんなメールが届きます。

=========================
1.端末及びSIM カードの返却について
=========================

<返却先>
〒106-0047
東京都港区南麻布3丁目20‐1 Daiwa麻布テラス4F エキサイト株式会社
エキサイトモバイル WiFi 返却受付窓口

※送料はお客様負担になります。
(着払いで返却された場合、後日送料を請求いたします。)
※初期契約解除を通知された日から1ヶ⽉以内に、端末及びSIMカードの返却が確認ができない場合、WiFi ルーター損害⾦(初期契約解除)10,000 円/台を請求いたします。
※当社に返却された端末に故障⼜は破損が認められた場合、故障⼜は破損にかかる修理代⾦相当額を請求いたします。

=========================
2.ご請求について
=========================

<請求金額>
461円(税抜き)

初期契約解除手続きの場合、「解約事務手数料」の請求はございません。
ただし、初期契約解除までの期間に応じた本サービスの⽉額料⾦、契約締結費⽤及び本SIMカードの提供に要する費⽤等について、電気通信事業法が定める範囲内にて請求いたします。

弊社からの請求に関するお支払い方法は、クレジットカード払いのみとなります。
※クレジットカードの場合は、各カード会社の請求書明細をご確認ください。
※クレジットカードのお引き落としタイミングについては、お客様の各カード会社とのご契約内容によって異なります。
※ご請求金額内訳については、弊社ホームページ内マイページをご確認ください。

=========================
3.その他の注意点
=========================

初期契約解除のご請求書面を弊社が確認できた日をもって、契約解除いたします。
契約解除の手続き後は、契約解除の取り消しには応じられません。
(再度、新規契約のお手続きが必要となります)

以上でございます。

本件に関しまして、ご不明な点がございましたら、本メールに直接ご返信をお願いいたします。

あとは住所に発送すればOK。法律に定められてますし、まぁ可もなく不可もなく対応してくれます。ただメールの二次利用はやめてくださいというようなことが書いてあるのが伏線はってる感じ。

契約前にいざとなれば初期契約解除すればいいや(でもちゃんとできるかな)と思っていたのですが、無事にできてよかった反面もう少し回線速度が出れば初期契約解除しなかったのですがね。。せめて5 Mbpsはでてほしかったですが、1Mbpsを切ると厳しいです。屋内で繋がるのはいいと思います。

なので、結局私はWiMAX継続でした。まぁ回線の安定性と値段が重要ならエキサイトモバイルWiFi、速度重視ならWiMAXというのが私の結論です。

さすがにシステム開発をやっているのでねぇ。。

https://bb.excite.co.jp/wifi/

Angularでfirestoreのコレクションからデータ一覧を取得する

1

概要

Angular2以降でfirestoreのコレクションからデータ一覧を取得する方法。

読み込む

コレクションに対して、valueChanges()をsubscribeする。valueChanges()ってなんだ。。

import { Component, ViewChild } from '@angular/core';
import { AuthService } from '../auth/auth.service';
import { AngularFirestore } from '@angular/fire/firestore';

@Component({
  selector: 'app-tab2',
  templateUrl: 'tab2.page.html',
  styleUrls: ['tab2.page.scss']
})
export class Tab2Page {
  authUid:string;

  constructor(
    public auth: AuthService,
    private firestore:AngularFirestore,
  ) {
    this.initialize();
    }

  initialize(){
      this.auth.getAuthUid().subscribe(uid =>{
        console.log(uid,'e');
        this.authUid = uid;
      })

  }

  test(){
    this.firestore.collection('users')
      .doc('data').collection(this.authUid)
      .valueChanges().subscribe(value =>{
        console.log(value);
      },
      error =>{
        console.log('error');
      })
  };
}

オブジェクトの配列で帰ってくる。

書き込み

こちらの方がシンプル

                      this.firestore.collection('users')
                        .doc('data')
                        .collection(this.authUid)
                        .doc(String(new Date().getTime()))
                        //.doc('test')
                        .set({
                          'title':this.originalImgName,
                          'content':data,
                          'filename':this.originalImgName,
                          'lastUpade':String(new Date().getTime()),
                        });

Angular(Ionic)で相方向バインディングを行う最低限のテンプレート

1

概要

Angularでは、相方向バインディングを行うための二つの方法があります。一つはテンプレート駆動型、もう一つはリアクティブフォールによるものです。

こちらの公式

https://angular.jp/guide/forms-overview

によると、

  • リアクティブフォーム はより堅牢です。よりスケーラブルで、再利用しやすく、そしてテストがしやすいです。フォームがアプリケーションの重要なパーツである場合、またはアプリケーションの構築にリアクティブパターンをすでに使用している場合は、リアクティブフォームを使用してください。
  • テンプレート駆動フォーム は、メーリングリストの申し込みフォームなどの単純なフォームをアプリに追加するのに役立ちます。アプリに追加するのは簡単ですが、リアクティブフォームほどスケーラビリティはありません。テンプレートでのみ管理できるとても基本的なフォーム要件とロジックをもつような場合は、テンプレート駆動フォームを使用してください。

ということです。

最低限のリアクティブフォーム

使いたいページのmodule、tsファイル、HTMLの3つに変更を加えます。

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { IonicModule } from '@ionic/angular';
import { Tab1p5PageRoutingModule } from './tab1p5-routing.module';
import { Tab1p5Page } from './tab1p5.page';

@NgModule({
  imports: [
    CommonModule,
    FormsModule,
    IonicModule,
    Tab1p5PageRoutingModule,
    ReactiveFormsModule
  ],
  declarations: [Tab1p5Page]
})
export class Tab1p5PageModule {}
import { Component, OnInit } from '@angular/core';
import { FormControl } from '@angular/forms';

@Component({
  selector: 'app-tab1p5',
  templateUrl: './tab1p5.page.html',
  styleUrls: ['./tab1p5.page.scss'],
})
export class Tab1p5Page implements OnInit {
  favoriteColorControl:formControl;

  constructor() { }

  ngOnInit() {
    this.favoriteColorControl = new FormControl('');
  }

}
<ion-header>
  <ion-toolbar>
    <ion-title>tab1p5</ion-title>
  </ion-toolbar>
</ion-header>

<ion-content>
  Favorite Color: <input type="text" [formControl]="favoriteColorControl">
{{favoriteColorControl.value}}
</ion-content>

Ionic(Angular)でズーム可能なグラフをchart.jsで作成する

1

概要

Ionic(Angular)でマウスホイールで拡大や移動などが可能なグラフを作成します

方法

標準のchart.jsに加えて、charjs-plugin-zoomを導入します。

通常のchart.jsの導入方法はこちら。

https://top.np-sys.com/general/438/

これをズーム可能にするためにcharjs-plugin-zoomを導入します。

npm i chartjs-plugin-zoom -s

そしたら、グラフを作成しているpageのtsファイルにて(今回はsrc/app/tab2/tab2.page.tsでした)

import 'chartjs-plugin-zoom';

を上部に追加して、あとはOptionsのなかに

          plugins: {
            zoom: {
              pan: {
                enabled: true,
                mode: 'xy'
              },
              zoom: {
                enabled: true,
                mode: 'xy'
              }
            }
          },

のように指定するだけです。

冗長ですが、コードを貼り付けておきます。貼り付ける場所などの確認にご使用ください。

import { Component, ViewChild } from '@angular/core';
import { Chart } from 'chart.js';
import 'chartjs-plugin-zoom';

@Component({
  selector: 'app-tab2',
  templateUrl: 'tab2.page.html',
  styleUrls: ['tab2.page.scss']
})
export class Tab2Page {
  @ViewChild('myChart') myChart;
  @ViewChild('myChart2') myChart2;
  @ViewChild('myChart3') myChart3;
  bars: any;
  colorArray: any;
  myNum:number;
  data:any=  {
        type: 'line',
        data: {
  				labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'Aug'],
  				datasets: [{
  					label: 'My First dataset',
            backgroundColor: 'rgb(150, 194, 129)', // array should have same number of elements as number of dataset
            borderColor: 'rgb(150, 194, 129)',// array should have same number of elements as number of dataset
  					data: [
  						12,
  						14,
              12,
  						14,
              12,
  						41,
              12,
  						4,
  					],
  					fill: false,
  				}, {
  					label: 'My Second dataset',
  					fill: false,
            backgroundColor: 'rgb(50, 194, 129)', // array should have same number of elements as number of dataset
            borderColor: 'rgb(50, 194, 129)',// array should have same number of elements as number of dataset
  					data: [
              2,
  						4,
              2,
  						4,
              2,
  						4,
              20,
  						142,
  					],
  				}]
  			},
        options: {
          scales: {
            yAxes: [{
              ticks: {
                beginAtZero: true,
                min: 0,
                max: 200
              }
            }]
          },
          responsive:true,
          maintainAspectRatio: false,
          plugins: {
            zoom: {
              pan: {
                enabled: true,
                mode: 'xy'
              },
              zoom: {
                enabled: true,
                mode: 'xy'
              }
            }
          },
          }
      }

      title = 'app';

      columnDefs = [
          {headerName: 'Make', field: 'make' },
          {headerName: 'Model', field: 'model' },
          {headerName: 'Price', field: 'price'},
          {headerName: 'Make', field: 'make2' },
          {headerName: 'Model', field: 'model2' },
          {headerName: 'Price', field: 'price2'},
          {headerName: 'Make', field: 'make3' },
          {headerName: 'Model', field: 'model3' },
          {headerName: 'Price', field: 'price3'},
      ];

      rowData = [
          { make: 'Toyota', model: 'Celica', price: 35000, make2: 'Toyota', model2: 'Celica', price2: 35000, make3: 'Toyota', model3: 'Celica', price3: 35000},
          { make: 'Ford', model: 'Mondeo', price: 32000 },
          { make: 'Porsche', model: 'Boxter', price: 72000 },
          { make: 'Toyota', model: 'Celica', price: 35000, make2: 'Toyota', model2: 'Celica', price2: 35000, make3: 'Toyota', model3: 'Celica', price3: 35000},
          { make: 'Ford', model: 'Mondeo', price: 32000 },
          { make: 'Porsche', model: 'Boxter', price: 72000 },
          { make: 'Toyota', model: 'Celica', price: 35000, make2: 'Toyota', model2: 'Celica', price2: 35000, make3: 'Toyota', model3: 'Celica', price3: 35000},
          { make: 'Ford', model: 'Mondeo', price: 32000 },
          { make: 'Porsche', model: 'Boxter', price: 72000 }
      ];

  constructor(
  ) { }

  ionViewDidEnter() {
    this.createBarChart(this.myChart);
    this.createBarChart(this.myChart2);
    this.createBarChart(this.myChart3);
  }

  onClicked(){
    let v = window.innerWidth;
    alert(v);
  }


  createBarChart(canvasId) {
    this.bars = new Chart(canvasId.nativeElement, this.data);
  }

}

Ionicにag-gridでエクセルライクな表を導入する

1

背景

Webで表をいれたいときってあります。主に3つの方法があると考えております。

・Tableを使う

・FlexBoxを使う

・ライブラリを使う

今回は、ライブラリを使う方法としてAg-gridを導入します。先頭の二つは簡単な表には使用できると思いますが、例えば1万行を超えるようなデータを表にして、Excelのようにセルごとに編集して色分け、、などをするためにはAg-gridを使うのが最適だと思います。

https://www.ag-grid.com/

無料でもできる範囲はかなりひろいです。

環境

$ ionic info
Ionic:
   Ionic CLI : 6.4.1
Utility:
   cordova-res (update available: 0.14.0) : 0.9.0
   native-run (update available: 1.0.0)   : 0.2.9
System:
   NodeJS : v12.10.0
   npm    : 6.14.2
   OS     : macOS Mojave

流れ

ライブラリをnmpでインストールしたあと、プロジェクト全体のレイアウトを管理するglobal.scssで読み込みます。その後、使いたいページのpage.module.tsで読み込んだ後、page.tsで情報を設定して、page.htmlにタグを設置します。

参考文献

https://www.ag-grid.com/angular-grid/

インストール

パッケージのインストールを行います

npm install --save ag-grid-community ag-grid-angular

すると、node_modulesにライブラリが配置されます。

scssの読み込み

Angularではstyles.scss に書き込みますが、ionicではglobal.scssに書き込みます。

@import "../node_modules/ag-grid-community/src/styles/ag-grid.scss";
@import "../node_modules/ag-grid-community/src/styles/ag-theme-alpine/sass/ag-theme-alpine-mixin.scss";

.ag-theme-alpine {
    @include ag-theme-alpine();
}

あとは、これを使いたいページのモジュールで読み込むだけです。ag-gridはモジュールなので、tsファイルで読み込む必要はありません

表を作る

以上で準備完了です。あとは使いたいpageで読み込みます。下記はsrc/app/app.module.ts、src/app/app.component.ts,src/app/app.module.htmlの場合ですが、src/app/tab1/tab1.module.tsなどでも同じです。その場合、src/app/app.module.tsには設定する必要はないです。

それではsrc/app/app.module.tsから編集します。

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';
import { AgGridModule } from 'ag-grid-angular';

@NgModule({
  declarations: [AppComponent],
  imports: [
    BrowserModule,
    AgGridModule.withComponents([])
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule {}

Copy

次にsrc/app.component.tsで情報を設定します。

import { Component } from '@angular/core';

@Component({
    selector: 'app-root',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.scss']
})
export class AppComponent {
    title = 'app';

    columnDefs = [
        {headerName: 'Make', field: 'make' },
        {headerName: 'Model', field: 'model' },
        {headerName: 'Price', field: 'price'}
    ];

    rowData = [
        { make: 'Toyota', model: 'Celica', price: 35000 },
        { make: 'Ford', model: 'Mondeo', price: 32000 },
        { make: 'Porsche', model: 'Boxter', price: 72000 }
    ];
}

最後にapp/app.component.htmlファイルでタグを設置します。

<ag-grid-angular
    style="width: 500px; height: 500px;"
    class="ag-theme-alpine"
    [rowData]="rowData"
    [columnDefs]="columnDefs"
    >
</ag-grid-angular>

そうすると、下記のような表が表示されるはずです。

all-in-one-migrationでインポートしてログインできなくなった

タイトルの通り、サーバ上のデータをexportしてxammpのローカルにインポートしたらログインできなくなった。

’http://localhost:8080/phpmyadmin/’でデータベースの情報を見たら、メールアドレスとして使用していたユーザー名が変わっていた。メールアドレスは独自ドメインのものを使っていたのだが、@以降がlocalhostに変わっていた。

また、site-guardと干渉することもあるということなので、import/export時にはそのプラグインをオフにした方が良さそう。

独自ドメインからローカルへ

site-guardをオフにする

export/importする

’http://localhost:8080/phpmyadmin/’でユーザ名を書き換える

ということになりそう。あまり普段からやる感じでもなくなるけど。

https://webst8.com/blog/wordpress-all-in-one-migration/