pandasで条件抽出する2つの方法(単一条件、複数条件)

pandasで条件抽出する方法には、queryメソッドを使う場合と使わない場合がある。

A列に1-100、B列に101-200、 C列に201から300のデータが並んでいる100行のデータを考える。

df = pd.DataFrame({
    "A":[i for i in range(100)], 
    "B":[i+100 for i in range(100)], 
    "C":[i+200 for i in range(100)],])

メソッドを使用しない場合:

#A列が20未満を抜き出す
df = df[(df["A"]<20)]
#A列が20より大きく、かつ、50未満を抜き出す
df = df[(df["A"]>20)&(df["A"]<50)]
#A列が20より大きく、または、50未満を抜き出す
df = df[(df["Α"]>20)|(dF["B"]<50))

複数条件の場合、かっこで個々の条件を囲む必要がある。

queryメソッドを使用する場合:

単一条件での抽出:

#Aが20未満を抜き出す
df = df.query('A< 20')
df = df.query('(A > 20) and (A < 50)')
df = df.query('(A > 20) | (A < 50)')

個人的にはqueryを使わない方が好みです。

特定の文字列を含む行を取得したい場合はこちら

現場からの報告。製造業でAI/IoTを活用するために必要だと思うこと

製造業に勤めるエンジニアから見た製造業でAI/IoTを活用するために必要だと思うことです。 

はじめに

「2025年の崖」と言われているように、製造業にとってデジタルトランスフォーメーションが喫緊の課題となっております。新興国が品質とコストで猛追するなか、工場にいて日本の厳しさを感じるんですよね。
もはや「日本の品質って本当にいいの?」って思ってしまいます(まぁうちの工場だけかもしれないけど!)。
とはいえ人口減少する日本にとって、高付加価値品の製造が必要なのは明白であり、特にAI/IoTというのはその大きな試金石となっていると思います。いちメーカでAI/IoT担当(かっこ笑いw)をしている身から現場の感覚をお伝えできればと思います。

言いたいことは下記の3点です。
・本部機構にだけAI・IoT推進課を作っても無駄
・買い物だけでは不十分、プログラミングレベルの全体の底上げが必要
・既存のIT担当者は障害になる場合も

本部機構にだけAI・IoT推進課を作っても無駄

大企業で多いのは、工場とは離れた本部機構にAI/IoTの専門部署を作ることですよね。これ、本部だけに作るとうまくいかないパターンだと思います。というのは、AIを活用していくにあたって重要なのは、質のいいデータと現場にカスタマイズされたソフトだと思います。その点、本部にいる人が工場の既存のデータもよくわからないまま新しいデータを取るのって至難の技だと思います。加えて、新しくデータを取り始めたとしても日々起こるトラブルにすぐ対処できず工場任せにするようだと
本部「いいデータが上がってこないから解析できない」
工場「データとるのどんだけ大変だとおもってんねん!」
となる可能性が高いです。結局、本部だけに推進グループを設置するのは不十分で、工場にメインの担当チームを置かないとダメなんですよね。本部にグループ設置すること自身はいいことだと思いますが、本部だけでうまくいくなんてありえないのではないかと。

買い物だけでは不十分、プログラミングレベルの全体の底上げが必要

あとありがちなのが、買い物で済ませようってのも多くあると思います。やれTableauだ、やれDataRobotだ、そのほかにもDataSpiderやSensorCorpusなど高い買い物して「うちはAI/IoTやってる」と満足しているパターン。これって使いこなせないという意味で本当にもったいないと思います。日々の製造で活用するにはカスタマイズが必要で、どこかで自分でコード書く必要があります。この必要性を理解せずにツールを買っても片手落ちってものだと思います。

既存のIT担当者はむしろ障壁になることも

3つのなかでこれを一番いいたい。バブルの時代に建てられた工場なんかだともう30年近く経っています。うちの工場もそれくらいなのですが、こういった工場にありがちなのがシステムのレガシー化です。どんな感じかというと、例えばうちの工場ではOracleを使っているのですが、SQLでデータベースに接続すると怒られます。
既存のIT担当「接続して不安定になったらどうするんだ」
「・・・・」
Oracleにコマンドで接続してSQLでselect文発行して怒られるっていったいなんなんですか(30年前のGUIソフトでかちかちクリックしてデータを取得するのです)。。こんな状態でAI開発なんてむりですね。一悶着の末select文の発行だけさせてもらっても、なにかあると全部新しいコードがスケープゴートにされますので日々ひやひやものです。
Oracleに接続するbatファイル書いていて申し訳なさでいっぱいになるんですけど、かなしい。。悪いことしてるんだっけ!?加えてタチが悪いのは、既存の担当者の知識が一世代前のものだということです。問題起きて説明しても
「Pythonおれわからないから!!」やる気完全になくします。

対策

以上を踏まえて、製造業でAI/IoTを活用するためにわたしが思う必要な対策を下記に記載します。

本部にだけAI・IoT推進課を作っても無駄

→本部にはとても助かっています。でも、工場側にもチームが必要だと思います。
1. データの質を担保するインフラ担当、
2. データベース管理やAPI管理を行うバックエンド担当、
3. そして生技の業務に合わせてカスタマイズするフロントエンド担当

が必要です。共通化できるアルゴリズム開発などは本部に任せてもいいかもしれないですけど、でも、工場のなかにメインのチームが必要だと思います。

既存のIT担当者はむしろ邪魔になることも

→これきついですね。はっきりいって辟易しています。トラブル避けるために、AI/IoT用にはデータ回線、データベース、サーバは完全に分けられたら理想ですね。データベースはMySQLを立てて、サーバはGCPやAWSも使ってパソコンでもなんとかなるし、データ回線もセカンドイーサで分けちゃう。それでもデータ通信量が多くて他のソフト止まったと言われたら心の中で笑います、そして泣きます。

全体の底上げが必要

全員のプログラミングに対する理解が必要です。自分は関係ないと思っているひとたちのなかで根付かせるのは大変ですが、スタッフはある程度理解が必要なのではないでしょうか。「手順の決まっていることを自動化するツール」という名目で勉強してもらうのもいいと思います。

最後に

AI/IoT使いこなしたら素晴らしいと思うけど、日本の製造業課題多いなぁと。なにかにつけて古いし、固着してますよね。。工場いちから作り直したら簡単だけどね!って。あぁ、もう新興国の勝ちですね〜。・・・っいやいや!!

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

三重県で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のコレクションからデータ一覧を取得する

概要

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)で相方向バインディングを行う最低限のテンプレート

概要

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で作成する

概要

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

方法

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

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

https://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でエクセルライクな表を導入する

背景

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/

個人でプレスリリースしたら、Yahoo!に載ったった

先日公開した個人アプリをプレスリリースしたら、ケータイウォッチ経由でYahoo!に取り上げてもらいました。
どう書くか、どこに送るか、そのタイトル、文面は?などわからないことばらけで進めたのですが、なんとか成功体験を1つつかめたのは良かったです。

https://k-tai.watch.impress.co.jp/docs/news/1190264.html

プレスリリースの書き方について迷われている方もいると思うので、全文面を公開します・・!

取り上げられた様子がこちら。

こちらがその文面です。
よろしくお願いいたします

理系男子必見!「数マニア -数学は美しい-」を6月12日よりリリース
~ひたすら円周率を読み上げる究極のリラクゼーションアプリ~

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Androidアプリ「数マニア -数学は美しい-」を提供開始
- 「数学ガール」「博士の愛した数式」など数学をテーマにした小説や映画が有名ですが、「数マニア」は、美しいヒーリングミュージックの代わりに、数をひたすら読み上げて安眠へと導く少し変わったリラクゼーションアプリです。ひたすら続く数字を聞きながら、深い眠りへとあなたを導きます。
https://play.google.com/store/apps/details?id=com.rainbows.read_pi
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
夫婦でスマートフォンアプリケーション開発を手掛ける「なないろプロジェクト」(所在地:**)は、リラクゼーションアプリ「数マニア -数学は美しい-」を、2018年6月12日より正式にリリースしました。これまで、数学定数を1万桁読み上げるリラクゼーションアプリはありませんでした。
【Google Play ストア ダウンロードページ】
https://play.google.com/store/apps/details?id=com.rainbows.read_pi


■アプリ概要
アプリ名 :「数マニア -数学は美しい-」
配信開始 :2019年 6 月 12 日
料金 :無料(広告モデル)
ジャンル :音楽&オーディオ
対応 OS :Androidバージョン 4.1以降

■ターゲット
理系の男子大学生

■背景
今回開発したのは夫である**。開発背景をこのように語ります。
「高校の数学クラブで数学オリンピックを目指した高校生も、しがない会社員となりました。それでも数の不思議への想いは変わらず、円周率をひたすら読み上げるアプリを作りたくなりました。
円周率をピアノで弾くととても美しいことをご存知ですか。無味乾燥な数字の羅列も、実際に聞いてみると不思議な気持ちにさせてくれます。寝る前のリラックスミュージックの代わりにきいてみてください。『どうして円周率にはゼロが出てこないの?』『どうして同じ数字がこんなに連続するの?』そんな疑問をもとにだんだん眠くなるはず。。きっと数学マニアだけではなく、みんなに響きます」

■3つの特長
1:円周率以外にも、アペリー定数、オメガ定数など5つの定数を収録
当アプリは、数学的に興味深い性質を持つ定数を5つ厳選しました。
円周率や黄金比などだれもが知っている定数から、アペリー定数、オメガ定数など数学的に奥深いものも掲載されています。それぞれの定数には、小ネタも併せて掲載されているので、友人とのちょっとした雑談にも重宝します。

2:スマホアプリ初!5つの無理数を1万桁まで読み上げ可能
当アプリは、Androidの提供するTTS(Text to Speech)機能を用いて、それぞれの定数を1万桁読み上げます。数列を掲載するWebページは数多くありますが、1万桁を読み上げるリラクゼーションアプリはこれまでありませんでした。

3:読み上げ言語は、英語、日本語に対応
「数字を読み上げられると目が冴えちゃう」という方に配慮して、読み上げは日本語、英語に対応しています。気分に合わせて好きな言語が選択可能です。

■今後の展開
今後の展開について、開発者はこのように語ります。
「このアプリ製作を通じて、数学の奥深さを改めて感じることができました。興奮しすぎて眠れないときは、わたしもこのアプリでリラックスしたいと思います。少しでも多くの方に興味を持っていただけると幸いです」

■会社概要
組織名(個人開発者) :なないろプロジェクト
(英語名Awesome Rainbows)
代表者  :実名
所在地  :実際の住所
■本件に関するお問い合わせ先
組織名 :なないろプロジェクト
担当者  :実名
所在地  :TEL:携帯番号
Email :awesome.rainbows7じーめいる

是非、参考にしてみてください。
また、もっとこうしたらというアドバイスもお願いいたします!

Pandasでcsvを読み込む

高機能なデータハンドリングが魅力のPythonですが、Pandasを使用すると複雑な処理を1行でできるので便利です。よくわからないけど、とりあえずPythonでデータを操作したいというなら、Pandasでデータを読み込めば間違いありません。

[chat face=”man1″ name=”” align=”left” border=”gray” bg=”none” style=””]汎用的なデータの読み込みならPandasがおススメ![/chat]

そもそもPandasってなんだっけ?

Pandasは、データハンドリング用で使われる最も有名なライブラリのひとつです。
Pythonは本体には最小限の機能しか備えておりません。パソコンにソフトをインストールしてできることを増やすように、Pythonは、追加のパッケージ(ライブラリ)をインストールして様々なことができるようになります。Pandasは、データ処理用のライブラリです。データの読み込みは様々な方法でできますが、最も覚えることが少なく、汎用的な手法として、Pandasでのデータ読み込みがおススメです。
例えばPandasは下記のようなときに使用できます

・Excelデータの読み込み
・CSV形式の読み込み
・txtデータの読み込み

どうやってインストールするの?

Pandasのインストール方法は、大きく分けて二つあります。一つは、Pythonの本体に単独でインストールする方法。もう一つは、Anacondaを利用する方法です。Anacondaとは、よく使用するパッケージをPython本体と一緒にダウンロードできる拡張版Pythonのイメージです。Anacondaは下記からインストールできますが、その場合、すでにPandasは自動でインストールされていますのでそれ以上の環境構築は必要ありません。

pipでインストールする場合:

pip install pandas

Anacondaでインストールする場合(おすすめ):
https://www.anaconda.com/で最新版をインストールすればOK.他の言語でもいえることですが、追加ライブラリのバージョンは、合わせておかないと動きません。これを依存関係といいますが、これらを整えて配布されているのはAnacondaです。Continuum社の有料サービスの無料版というのも安心です。

ホップ:Pandasでのcsvデータを読み込むには?

それでは、実際にPandasでcsvのデータを読み込みます。コードをGitHubにあげておくので、そちらからダウンロードかまいません。web上でPythonを実行できるpaizaのページからコードを貼り付けて実行していただいてもいいと思います。
paizaのページ:https://paiza.io/projects/featured?language=python3

GitHub;https://github.com/awesomerainbows/wp_read_csv

もし初めての場合、どこに何をおいたらいいかわからないと思います。そのときは、読み込みたいcsvとpythonのファイルは同じ階層においてください。おススメは、デスクトップにtestというフォルダを作成して、そこにpythonファイルとcsvの2つを配置することです。
こんな感じです。

Pythonコードは下記です。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pandas as pd
df = pd.read_csv("hogehoge.csv")#ファイル名は、クオテーションで囲んでください。もしtest.csvという名前なら、"hogehoge.csv"は、"test.csv"です

print(df)#読み込んだデータをすべて表示
print(df.head())#最初の5行程度を表示
print(df.shape)#読み込んだデータの行数と列数を表示。100行2列なら(100,2)です

[chat face=”man1″ name=”” align=”left” border=”gray” bg=”none” style=””]全然読み込めないんだけど[/chat]

[chat face=”man1″ name=”” align=”right” border=”gray” bg=”none” style=””]ファイル名のあとに読み込む条件を指定すれば読み込めるよ[/chat]

読み込むことはできましたでしょうか。
整形されたデータの場合はこれで読み込めたはずです。
ところが、実際扱うデータは往々にしてエラーを吐いてしまいます。
その場合、下記の項目をチェックして、読み込む条件を指定して読み込んでみてください。

エラーが出る場合、ポイントは下記になります。列名(header)が先頭にあるかどうか
行番号(index)がデータに含まれるかどうか
列名のないデータだけのファイルかどうか

列名(header)が先頭にない場合の読み込み

この場合、下記のコードで1行目と2行目をスキップして読み込みますので下記になります。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pandas as pd
df = pd.read_csv("hogehoge.csv",skiprows=2)#skiprowsの引数を指定することで先頭の2行を無視します

print(df)#読み込んだデータをすべて表示
print(df.head())#最初の5行程度を表示
print(df.shape)#読み込んだデータの行数と列数を表示。100行2列なら(100,2)です

[chat face=”man1″ name=”” align=”left” border=”gray” bg=”none” style=””]df = pd.read_csv(“hogehogehoge.csv”,header=2)と列名を指定しても読み込めます[/chat]

[chat face=”man1″ name=”” align=”right” border=”gray” bg=”none” style=””]0から数えるから、Excelでいう3行目は2で指定するんだね[/chat]

行番号(index)がデータに含まれる場合

この場合は、1列目はindexであると明示的に指定します。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pandas as pd
df = pd.read_csv("hogehoge.csv",index_col=0))#indexは0列目だと明示します

print(df)#読み込んだデータをすべて表示
print(df.head())#最初の5行程度を表示
print(df.shape)#読み込んだデータの行数と列数を表示。100行2列なら(100,2)です
列名がデータにない場合

この場合、1行目からデータであるということを指定する必要があります。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pandas as pd
df = pd.read_csv("hogehoge.csv",header=None))#header=Noneでカラム名はないことを明示します

print(df)#読み込んだデータをすべて表示
print(df.head())#最初の5行程度を表示
print(df.shape)#読み込んだデータの行数と列数を表示。100行2列なら(100,2)です

列名を作成しながら読み込みたい場合、

df=pd.read_csv(“hogehoge.csv”,header=None,names=[“a”,”b”,”c”,”d”])

のようにnamesの引数で指定します

その他の場合

その他さまざまな条件を指定してデータを読み込むことができますが、詳細は公式ドキュメントを参照していただくのがよいと思いますので、最後によく使う指定条件をまとめたいと思います。

◎ファイルが大きすぎる
⇒nrows:nrows=100のように読み込む行数をint型で指定
◎なぜかエラーが起きる
⇒engine:pythonで読み込むかCで読み込むかを指定。engine=”python”と指定すると柔軟に読み込める
◎日本語が文字化けする
⇒encoding:encoding=”shift-jis”で読み込んでみる

よろしくお願いします。
以上、お疲れさまでした。

CordovaでjavaScriptを1行ずつデバッグする

Chrome Remote Web Inspector によるデバッグがよさそう。
参考にしたサイトはこちら。

https://mobilefirstplatform.ibmcloud.com/tutorials/ja/foundation/8.0/application-development/debugging-applications/#debugging-with-chrome-remote-web-inspector

半日ほど迷った。ポイントは、アンドロイドの端末で「usbデバッグを有効化」することと、アプリ側にもやり取りを許可するためのソースを埋め込まないといけないこと。ソースはJavascriptではなくて、Javaなので、どこに書くか迷った。結局追加プラグインのファイルにJavaのファイルがあったので、そこに張り付けた。

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){ WebView.setWebContentsDebuggingEnabled(true); }

一度実行されたらchromeとの接続には支障がないとのことで、プラグイン呼び出しのメインの関数のなかに記載した。なお、JAVAのファイルの中でパッケージをインストールする必要があるので、そのファイルの上のほうで下記コードも書き加えた。

import android.os.Build;import android.util.Log;import android.content.pm.ApplicationInfo;import android.webkit.WebView;

import android.util.Log;import android.content.pm.ApplicationInfo;import android.webkit.WebView;

書き加えたのはcordova-plugin-admobproプラグインのなかの
AdMobPlugin.javaというファイルで、

@Override protected void pluginInitialize() { super.pluginInitialize(); // TODO: any init code }という部分を

@Override protected void pluginInitialize() { super.pluginInitialize(); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){ WebView.setWebContentsDebuggingEnabled(true); }; // TODO: any init code }と書き換えた

Extract android app’s package name

windows10

if you are able to use use adb commands already, then you can get package name as below.

extract android app's package name

matplotlibで日本語を表示(python)

matplotlibで日本語を扱いたいとき、フォントをダウンロードして、matplotlibrcファイルを修正して、、みたいな方法が正統派なのかもしれない。
でも職場のパソコンに一斉にそういう設定ができますか?みたいなときがある。

1.フォントをダウンロードして、C:\Users\**\Anaconda3\Lib\site-packages\matplotlib\mpl-data\fonts\ttfの中にコピペをする
2.ファイルのなかにigfont = {‘family’:’IPAexGothic’}という文字列を追加しておく

これだけでよさそう。これなら自動でできそう。
ちなみにつまったところとして、コピペするファイルはipaexg.ttfとipaexm.ttfの2つだということ。一方だけでをコピペするだけだとうまくいきませんでした。フォントのダウンロード先は下記。

https://ipafont.ipa.go.jp/node26

バラ十字会(Amorc)の正体。薔薇十字団とフリーメイソンとの関係はあるの?

絹田
絹田

4年間名古屋で活動していた会員経験を基に説明するよ.

4年間会員をしていましたが,2020年に名古屋支部の役員の休会されたのを機に休会しました.

3000円の月額が少し高いというように感じていたのも事実です.以降は休会半年前くらいの2020年初めの記事です.

2021年8月に追記

t

わたしはバラ十字会に入会して4年目になります。バラ十字!?なにそれ(笑)と妻に言われたものですが、なんだかんだ続いています。「怪しさ満点だな」という印象でしたが、HPに載っているオバマ大統領の推薦書をみて興味本位で入りました。ここでは実際にどんな活動をしているかお伝えしたいと思います。

バラ十字会とは結局なんなのか?怪しい組織なのか

HPを見るといろいろかいてあります。

・人生の意味・意義・理由を知りたいあなたへ

・人生を知り、豊かに生きる叡智を学ぶ

・世界の歴史の偉人たちが学んできた成功哲学

2016年に入会を検討したとき,ネットで評判を調べてもなかなか出ず実態がよくわからなくて困りました.
バラ十字会は
①月に一度送られてくる薄めの本を毎週読む。3ヶ月ごとに理解度確認テストのようなものを送付する
②毎月ないしは隔月で会合に参加する
という通信教育を行なっているNPO法人です。入っている感覚として、新興宗教かと聞かれるとそうではないと思います。入ったところでそれ以上の勧誘はありませんし、教義を強制されることもありません。物品の購入で寄付することはできますが、それはカトリック教会などでも教会に売店があるのと同じですし、購入を強制されたと感じたことは一切ありません。感覚でいうと、啓蒙・自助団体にちかいです。

とはいえ、バラ十字会は良くも悪くもぶっとんだスピリチュアル団体だと感じました。人間にはソウルと呼ばれる輪廻を繰り返す主体が存在し、人生を通じてその本質を開花させていくという思想です.ソウルを薔薇で表現し、肉体を十字で表現し、その組み合わせがアイコンに使われている薔薇十字です。学者を含む著名人も入会しており、海外では比較的知られた国際団体でもあります。

(強制はされないものの薔薇十字会の立場でいうと)特徴的なところでいうと、

・身体と霊魂(ソウルと呼ぶ)が存在する
・生まれ変わりはあり、ソウルは人生を通じて開花している
・この世界を超えた世界が存在する

などの考えは一般にはかなり衝撃だと思います。また、(強制はされないものの)会合に出ると全面に押し出されるのでこれも他にはない特徴だと思います。まぁ結構私は好きですけどね、

母体は?正体は?

ネットで検索すると薔薇十字団という昔の団体が出てくると思います。ただこれ自身は直接関係あるわけではないと思います。フリーメイソンとの違いみたいなのも聞かれるのですが、向こうのほうが有名です。本質的には変わらないと思いますが、もし人脈構築を目的とするならフリーメイソンの方がいいと思います。


日本ではマイナーなバラ十字会ですが、実はかなり大きな組織だと感じることがあります。
たとえば日本バラ十字会のHPには、オバマ大統領の祝電が掲載されています。いわく、バラ十字会自身は、古代エジプトの思想から生まれ、ギリシャなどの哲学を踏まえ、さらに先進的な科学的な知見を取り入れた教義を伝えるといっております。実態は上に述べたようなNPO法人で、4年経ってもまだ全体がつかめていないというのが正直な感想で、ときどき隔月で行われている会合で、日本にビジネスの出張できたのでついでに顔を出した、というフランス人がきたりしたこともありました。

どんな人がいるの?バラ十字の思想とは

HPに公開されている情報以上のことは言わないでくださいということなのですが、参加している人は会社員だったり学校関係者だったり主婦であったりです。私はNP-Systemsという個人事務所をやっています。精神的なものに惹かれているっていう点では皆同じだと思います。女性がやや多いです。
あらためてになりますが、バラ十字の思想としては
・身体と霊魂(ソウルと呼ぶ)が存在する
・生まれ変わりはあり、ソウルは人生を通じて開花している
・この世界を超えた世界が存在する
あたりは特徴的な思想です。古代エジプトから生まれ現代に続く知識を体系立てて伝えるとしています。シンボルはこん感じで、ソウルが身体を通じて開花していく様子を示しているとされています。

フリーメイソンとの関係は?秘密結社なの?

昔は秘密結社だったようです。いまは通信教育(!)です。一般には公開されておりません。(適切な準備をしてからじゃないとうまく教義を伝えられないからという理由です)フリーメイソンも似たイメージですが、フリーメイソンほどお金はかからないと思います。あと、フリーメイソンは紹介制なのですがバラ十字会は誰でも入会できます。フリーメイソンほど有名ではないので、興味本位で入る人が少ない分静かに過ごせるかなとは思います。

バラ十字会への疑問点

わたしは理系で、むかしは無神論者でした。科学しか信じないような性格でしたが、その目線であえて批判的な点をあげたいと思います

  • 自らの組織の考えが歴史的にも科学的にももっとも正当・正しいと思っている
  • 若い人が少ない

という2点です。

1点目については、例えば「前世があるか」「過去世があるか」「7という数字は神秘的か」「魂はいつ人体に宿るのか」といった事柄は、実際はわからないというのが真実だと思うのです。それを踏まえた上で、「でもわたしは個人的にはそうだと思います」というならわかりますが、バラ十字のスタンスは「あなたは知らないし信じないかもしれないけど、それが実は絶対的な真実なんです、強制はしないし思想は自由だと思うけど」というスタンスなのです。これを少し独善的だと感じる時があります。また、自分の意見をいうときに「科学的に正しい」「神秘学的に正しい」というのもやめた方がいいかと思います。性格には、合理的な判断によりこう考えている、ということだと思います。

2つ目については、まぁ高齢化の日本社会ではどうしようもないかな。。ちなみに男女比は男性3.5に女性6.5のイメージです。

おすすめなの?

わたしの意見だと、自らの本質であるソウルというものがあり、それが人生を通じて花開くことを目指すということに共感を感じられるか次第だと思います。無神論者で人間は肉体以上のものではないと思うなら難しいと思いますが、自分の本質は意識とは別のところにあるなにか高尚なものかもしれない、それに触れたい、近づきたいと思うなら、バラ十字会はベルトコンベアのような役割を果たすかもしれません。

また、個人的に会合で面白いと思ったことがあるます。
・幽霊の話、前世のはなし?ぜんぜんOK!
わたしの参加している地区を主導してくれている方はとてもいい女性ですが、お茶会のときに「どうぞここでは普段できない話を(笑)」と言ってくれたりすると和みます。たしかに前世、霊魂、秘密結社、話題はなんでもありです。
・会合ではエプロンのようなものをする。ふんどしに見えないこともないが、それを若い女性がしているのがちょっと面白い
強制はされませんが、薔薇十字会自身はかなりコアな思想をもっています。会合では瞑想のようなものを全員で最初の1時間程度おこなうのですが、建前上こう振舞ってくださいとか、これを着用してくださいとか言われます。別に思想を強要するわけではないですし、マナーのイメージなので問題ないと思いますが、ちょっとそういうところがどきどきしたりします。
・ときどき「こんな人が生活していたのか」と思うような人が参加していたりする。
以前、会合に初参加のひとが、古参の会員に「前世以来、ひさしぶり!」と挨拶していたのはびっくりした(笑)

どこで活動してるの?

会合は規模の大きさにしたがっていろんな名前がありますが、東京の大きなものだと入会してすぐに参加するのは難しいですが、3ヶ月くらいするとどの会合にも参加できるようになります。
東京では、板橋で毎月会合があります。
名古屋と奇数月に、金沢では偶数月に行なっています。
あとは札幌と大阪も定期的におこなっていますね。岡山もやっているようです。

実際に参加するとどういう人がいるのかわかりますし、迷っているなら参加するといいと思います。2回くらいきてやめてしまう人が多い印象ですが、それも問題ないとされている空気ですし。「フリーメイソンとか秘密結社に興味ある」「前世療法を仕事にしてて興味あって」みたいな人もいますし、いたって普通な人もいます。

まぁ精神的なことに興味があるならきてみてもいいんじゃないかと思います。

絹田
絹田

読んでくれてありがとう.これからもよろしくね