2020年10月6日火曜日

楽天ラッキーくじ一覧

(2022/9/2)
近日リリース予定のプログラム変更により、[KUJI]が不要となります。
そのため、[KUJI]を削除しました。

[KUJI_SP]
楽天Edyスマホラッキーくじ = https://r10.to/hf7Y7J

[KUJI_SP2]
楽天PointClubアプリラッキーくじ = https://point.rakuten.co.jp/doc/lottery/lucky/

2020年9月1日火曜日

Chrome拡張機能を自動でインストールする【Python】【Selenium】【win32com】

 調べても調べても検索に引っ掛からなかった、Chrome拡張機能を自動でインストールする方法がわかったので、ここに記載する。Teratailありがとう。

必要なもの

  • Python
  • Selenium
  • chromedriver_binary
  • win32com

ソース

 「楽天検索」の拡張機能をChromeにインストールするコードを示す。ソースがはみ出してしまっているのはすみません。

import time
from time import sleep

# selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
# ないと起動しない
import chromedriver_binary
import selenium.webdriver.support.expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import ctypes
import win32com.client

def getOptions():
    options = webdriver.ChromeOptions()
    options.add_argument( '--user-data-dir=' + 'UserData' )
    options.add_argument( '--profile-directory='+ 'Default' )
    return options

def installRakutenSearch():
    # 初回起動、楽天検索拡張機能をインストール
    driver = webdriver.Chrome( options=getOptions() )
    driver.get(r'https://chrome.google.com/webstore/detail/%E6%A5%BD%E5%A4%A9%E3%82%A6%E3%82%A7%E3%83%96%E6%A4%9C%E7%B4%A2/iihkglbebihpaflfihhkfmpabjgdpnol?hl=ja')

    WebDriverWait(driver, 15).until( EC.element_to_be_clickable( (By.XPATH, '//div[@class="g-c-Hf"]') ) )
    driver.find_element_by_xpath( '//div[@class="g-c-Hf"]' ).click() # Chromeに追加 ボタンクリック

    html = driver.page_source

    handle = ctypes.windll.user32.FindWindowW( "Chrome_WidgetWin_1",0)
    ctypes.windll.user32.SetForegroundWindow(handle)

    Shell = win32com.client.Dispatch("WScript.Shell")
    # うまくいかないときは、range(2)からrange(3)へ変更。調整してください。
    for i in range(2):
        Shell.SendKeys("{TAB}") 
        sleep (1)
    Shell.SendKeys("~") 
    time.sleep(5)
    driver.close()
    driver.quit()

if __name__ == '__main__':
    installRakutenSearch()

2020年8月18日火曜日

【Python】一括で svg を png に変換する。

Azure のアイコンが svg で用意されており、パワポで読み込めなかった。

 仕事の資料を作成するにあたって、Azureのアイコンを使いたかった。しかし、公式には svg のアイコンしかない。そのため、プログラム作ってpng画像を作ることにした。

Azure icon png(200 x 200) ここにpng変換後のアイコンを共有しておく。

以下にpng変換時のソースを貼っておく。

svg → png 変換ソース

 本プログラムは一括でsvg -> png 変換を行う。公式のsvgのzipファイルを解凍し、「AI + Machine Learning」フォルダがあるところと同一フォルダで本プログラムを動作させる。

python 3.7.8で動作確認済み。事前準備として、ライブラリの cairosvg をインストールする必要がある。

pip install cairosvg

 本体プログラムは以下。

import os.path
import cairosvg
import os

def main():
    for folder in os.listdir('.'):
        if os.path.isdir( folder ):
            for file in os.listdir( folder ):
                name = file.split('.svg')[0]
                url = folder + r'\{0}.svg'.format(name)
                write_to = folder + r'\{0}.png'.format(name)
                cairosvg.svg2png( url=url
                                , write_to=write_to
                                , output_width=200
                                , output_height=200 )  # svg -> png 本体
                print(file)

if __name__ == "__main__":
    main()

 svg が不要なら、以下のプログラムを実行すると削除できる。

import os.path
import cairosvg
import os

def main():
    for folder in os.listdir('.'):
        if os.path.isdir( folder ):
            for file in os.listdir( folder ):
                if '.svg' in file:
                    rfile = folder + r'\{0}'.format( file )
                    os.remove( rfile )
                    print(file)

if __name__ == "__main__":
    main()

2020年7月13日月曜日

【IoT】IoTプラットフォームを分類する。【2020年度版】

本記事は主に分類が途中のものである。少しずつ更新していく。主にプラットフォームの分類が未完。

対象はどれにするのか。

下記サイトに最新のプラットフォームの動向を整理されている。ここで示されているプラットフォームを対象とする。

どう分類するのか。

矢野経済研究所がプレスリリースPDF内で分類している「産業用 IoT プラットフォームの種類」で分類する。(下図参照)

分類について、プレスリリースPDFからの引用で分類とその内容を解説する。

種類内容
水平・業種フルカバレッジ型 水平型のソリューションとしてどの業種もカバーしようとするもの。全業種に対して提供されるクラウド基盤であり、その基盤(プラットフォーム)上にユーザーや SIer などがIoT システムを開発することを主要コンセプトとする。
垂直・基本機能提供型 目的や機能を絞り提供される IoT プラットフォーム。遠隔監視・予防保全のみに絞った IoT プラットフォームなどが一部のベンダーから提供されている。
垂直・アプリ提供型 フルカバレッジ型から、開発・導入・運用支援を差し引いた領域を主に手掛けるのが垂直・アプリ提供型である。外資系の大手製造業が IoT プラットフォームの提供に乗り出しているが、概ねそうした企業の提供するものが該当する。サードパーティによるアプリケーション開発のプラットフォームにもなっているケースも多い。
垂直・機能フルカバレッジ型 開発・導入から応用アプリケーション、基礎アプリケーション、クラウド基盤、ネットワーク、センサー類まで、IoT ソリューション構築にかかわる全要素をフルカバレッジでソリューション提供しようとするもの。同領域は国内大手 SIer が主な提供者であり、ここでいうプラットフォームとは、“IoT ソリューションを開発・運用しビジネスとして動かすためのプラットフォーム”という意味合いが強い。

 垂直型は、IoTプラットフォーム(提供サービス)が業界に対して何を提供しているかという観点で3つに分類している。水平型は業種に限らないIoTプラットフォームを提供していることを示している。水平=業種フルカバレッジと考えられる。

 ただ今回、各IoTプラットフォームを調査していくと、水平・業種フルカバレッジに応用アプリ群を付け加えたようなプラットフォームが多く存在した。そのため、水平・業種フルカバレッジの分類では応用アプリ群が含まれていてもよいものとした。また、「業種フルカバレッジ」というより「汎用型」の方がしっくりきたので、分類上の言葉を変更した。

また、クラウドベースとしていないもの、IoTプラットフォームとして考えられないものも存在した。それらは「エッジコンピューティング」「IoTプラットフォームでないもの」として分類した。

分類基準
水平・汎用型IaaS、PaaS~基本アプリケーション群で、応用アプリ群を含んでもよい。
垂直・基本機能提供型遠隔監視・予防保全など機能を絞って提供。
垂直・アプリ提供型センサーやネットワーク~応用アプリ群までを提供。センサーを提供している場合、ネットワークも提供しているものとした。
垂直・機能フルカバレッジ型センサーやネットワーク~開発・導入・運用支援まで提供している。センサーを提供している場合、ネットワークも提供しているものとした。また開発・導入・運用支援はいずれかを提供していればよいものとした。
エッジコンピューティングクラウドにプラットフォームがない。
IoTプラットフォームでないものデータ収集対象が機械のセンサーなどの情報でない。

分類

それでは分類する。「不明」に分類されているものは日本語サイトがなかったり、どんなプラットフォームなのかわからないものが分類されている。また、「エッジコンピューティング」はクラウドに提供されるサービスではないものを分類している。

水平・汎用型
Azure IoTMicrosoft
AWS IoTAmazon
Oracle IoT Cloud ServiceOracle
Google Cloud IoT CoreGoogle
SensorCorpusインフォコーパス
intra-martNTTデータ
PELION IOTプラットフォームArm
Lumada Solution Hub日立
OPTiM Cloud IoT OSオプティム
Watson IoT PlatformIBM
Bellonicaクオリカ/Bellonica
MMCloud安川電機
IoT+mプラットフォーム東芝機械
ToamiNSW
µSocketsPanasonic
ThingWorxPTC
COLMINA プラットフォーム富士通
LANDLOGコマツ
V-factoryアマダ
Industrial IoT ソリューション横河電機
製造業向けIoTサービス Meister Cloudシリーズ東芝デジタルソリューションズ
Uniformance Suiteハネウェル
Twin BuilderANSYS
Salesforce IoTSalesforce
SAP Cloud PlatformSAP
VANTIQミツイワ
Cerebra日立ハイテク
Cisco Kineticシスコ
OSIsoftPI System
PredixGEデジタル
Telit IoT Device Management PlatformTelit
MindShpereシーメンス
垂直・基本機能提供型
FogHorn LightningFogHorn
HSDPフィリップス
垂直・アプリ提供型
Sakura.ioさくらインターネット
IoE Solutionジェイテクト
Softbank IoTSoftbank
SORACOM IoTソラコム
Workplace Hubコニカミノルタ
Vortex DDSADLINK
NB-IoT M2Mソフトバンク
垂直・全カバー型
IoT基盤サービスNEC
i-BELTオムロン
b-en-g IoTビジネスエンジニアリング
エッジコンピューティング
FIELDシステムファナック
FA-IT-Open Edgecross三菱電機
HULFT IoTセゾン情報
IoTプラットフォームでないもの
3DEXPERIENCEルノー/ダッソー/Singapore
不明
DP-Factory IoTDENSO
FactoryTalkロックウェル
jAppORBCOMM
CerebraFlutura
Kaa IoTCyberVision
EcoStruxureプラットフォームシュナイダーElec
ABBAbilityABB
Device Connection Platformエリクソン
IMPACTノキア
ADAMOS IIoTADAMOS

2020年4月16日木曜日

【MySQL】インデックス作成はテーブルを一時コピーして作らない。

なぜこんなことを記事にしているのか。

 仕事上、MySQLのALTER TABLE文は、テーブルを一時的にコピーしてから新旧テーブルを入れ替える形で処理されていると知った。 そうなのか!?と驚き、検索をかけた。


どこにそんなことが書かれているのか。

 下記記事を参照。

ALTER TABLEを上手に使いこなそう。


MySQLのドキュメントはどうだろうか。

 以下のリンク先に書かれていた。

13.1.7 ALTER TABLE 構文

一部引用すると

ストレージ、パフォーマンス、および並列性に関する考慮事項

ほとんどの場合、ALTER TABLE は元のテーブルの一時的なコピーを作成します。MySQL は、そのテーブルを変更しているほかの操作を待ってから、処理を続行します。そのコピーに変更を組み込み、元のテーブルを削除したあと、新しいテーブルの名前を変更します。

ALTER TABLE後のテーブル定義でコピーを作って、最終的にそちらを使うことになっている。


インデックス作成はどうなのか。

 やりたかったのはインデックス作成なので、それはどうなのだろうかとドキュメントを追ってみたところ、以下の引用部分を発見した。

一部の操作では、一時テーブルを必要としないインプレース ALTER TABLE が可能です。
  • ・・・
  • InnoDB と NDB に対するインデックスの追加または削除。

インデックス作成と削除は大丈夫ということだ。一安心した。InnoDBというのは検索をすればすぐに答えが出てくるので、気にしなくてよい。


【Python】演算子 in は数値や文字列の混合配列でも評価できる。

 Pythonのin 演算子を検索すると、だいたい数値や文字列のみを要素とする配列と比較している例が目立つが、数値と文字列を混合した配列でも比較することが可能である。

ドキュメントを見てみる

 Pythonのドキュメントを見てみよう。
6.10.2. 所属検査演算

ここには以下のような記述がある。

演算子 in および not in は所属関係を調べます。 x in s の評価は、 x が s の要素であれば True となり、そうでなければ False となります。

ドキュメント上では、配列要素が1種類のときに限定している記述はない。

試してみる

Python 3.7.3 (default, Apr  3 2019, 05:39:12)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 3 in [ 4, 'abc', 'cdf' ]
False
>>> 4 in [ 4, 'abc', 'cdf' ]
True
>>> [3,4] in [ [1,2], [3,4] ]
True
>>> [3,4] in [ [1,2], [3,5] ]
False
>>> 'abc' in [ 4, 'abc', 'cdf' ]
True

2020年2月23日日曜日

【Typescript】TS2339: Property 'startsWith' does not exist on type 'String'.【エラー】

TypescriptでなぜかstartsWithでエラーとなった。(TS2339: Property 'startsWith' does not exist on type 'String'.)

これは、ES6から使えるので、ES6でコンパイルしたらエラーでなくなった。

【JavaScript】奇数を要素とする配列を生成する。

1からある正の整数までの奇数を要素とする配列を生成する。

function odd_list(n:number) :number[] {
    return  [...Array(n)].map((_, i) => i + 1).filter(n => n % 2);
}