自動化厨のプログラミングメモブログ │ CODE:LIFE

Python/ExcelVBA/JavaScript/Raspberry Piなどで色んなことを自動化

4行でPythonからSlackへ投稿する(着信 Web フック)

f:id:maru0014:20180516215325p:plain

色々な通知をするのにも超便利なSlack。

会社のSlackでもIFTTTから自動投稿させたりしていますが、Pythonでいろいろ業務を自動化していくにあたって「自動業務が完了したよ!」をSlackに通知してほしいと思い調べたところ思いの外簡単だったのでサクッとメモしておきます。

前準備Slackに着信Webフックをインテグレーション

SlackのAppディレクトリで「hooks」と検索すると「着信 Web フック」というのが出てくるはず。

f:id:maru0014:20180516214011p:plain

続きを読む

PythonからExcelのVBA(マクロ)を実行する方法

C:\macro_book.xlsmというExcelファイルのmsgというマクロをPythonから実行する場合は以下のようになる

import win32com.client  # ライブラリをインポート

excel = win32com.client.Dispatch("Excel.Application")  # インスタンス生成
excel.Visible = 1  # エクセルを表示する設定(0にすれば非表示で実行される)
excel.Workbooks.Open(Filename="C:\macro_book.xlsm", ReadOnly=1)  # ブックを読み取り専用で開く
excel.Application.Run('msg("aaa")')  # マクロ名を指定して実行(引数なしの場合マクロ名のみで実行可能)
excel.Workbooks(1).Close(SaveChanges=1)  # ブックを保存して閉じる(SaveChangesを0にすると保存せず閉じる)
excel.Application.Quit()  # 終了

なんでわざわざPythonから?という意見はごもっともなんだけど、実際の仕事で使ってる内容としては 「ECサイトのドロップシッピング商材の在庫更新を自動でやる」というもの。フローは以下の通り。

  1. 取引先の卸サイトにログイン
  2. 卸サイトから在庫データ(CSVやExcelファイル)を所定のフォルダにダウンロード
  3. 自社ECの在庫管理ツールから在庫データ(CSV)を所定のフォルダにダウンロード
  4. 2と3を元にエクセル上で商品コードごとに最新の在庫情報へ書き換える
  5. 在庫管理ツールにCSVファイルをアップロード

このうち1~3と5はPythonにSeleniumをインポートして行っているが、4のExcelでの在庫更新データの計算式が地味に複雑で(納期情報文言の正規化とか) わざわざPythonで作り直すのが面倒なため今回の「Pythonからマクロを実行する」ことが必要になったわけです。

意外とシンプルにかけたので満足していますが、やはり言語をまたぐとエラー処理とかどうしよ・・・ってかんじ。

Pythonでスクレイピングしようと思ってScrapy入れようとしたらエラーになった話

sutaba-mac.site

$ pip install scrapy

でインストールすればええんやな、楽勝。 ・・・。 めっちゃエラーでるやん。

Command "c:\users\1953.three-i\appdata\local\continuum\anaconda3\python.exe -u -c "import setuptools, tokenize;__file__='C:\\Users\\1953~1.THR\\AppData\\Local\\Temp\\pip-install-3mpbwq60\\Twisted\\setup.py';f=getattr(tokenize, 'ope
n', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record C:\Users\1953~1.THR\AppData\Local\Temp\pip-record-imjhck90\install-record.txt --single-version-externally-man
aged --compile" failed with error code 1 in C:\Users\1953~1.THR\AppData\Local\Temp\pip-install-3mpbwq60\Twisted\
続きを読む

Sassで何ができて何が良いのかProgateで勉強しながらまとめてみた

プログラミングの学習においてProgate(プロゲート)を使っています。

HTMLやCSSの学習は有料部分含め全て終えたわけですが、最後に残っていたのがSass。

なんとなくのイメージはCSSの上位版というか効率的にCSSを書けるもの。具体的にどんな事ができるかはぼんやりしていたので何が出来て何が良いのかをまとめてみます。

SassにはSASS記法とSCSS記法の2種類の書き方がある

プロゲートではSCSS記法で学習するみたいですがググって見たところそれぞれの特徴はこう。

①SASS記法

{}などの括弧を使わずインデントのみで階層構造を書く記法。 セミコロンも無しなんて凄くスピーディーに書けそうですね!

div
    margin: 0 auto
    a
        color: red

②SCSS記法

こっちはCSSと同じっぽい?と思いきやdivの中にaがある! 階層構造になっているわけですね。

どちらかというとこっちのSCSSが主流らしいです。

div {
    margin: 0 auto;
    a {
        color: red;
    }
}

参考: SassとSASSとSCSSの違いについて | UX MILK

ふと気づいたけどはてなブログのシンタックスハイライトには「sass」はあるけど「scss」は無いんですねぇ。

Sassで書くメリット

前述部分でもう分かってしまいましたね。いちばん大事な部分。「入れ子構造で短く書ける」というところ。

そしてもう一つに「変数が使える」こと。要は一度書いたスタイルを名前で呼び出して再利用できるということですね。

書いた後の修正が楽

.header {
  width: 100%;
}
.header ui {
  padding: 10px;
}
.header ui li {
  font-size: 15px;
}

などと書いたあとに.headerのセレクタ名を変更したいという場合にCSSの場合は3箇所を編集する必要がある。

でもSCSSの書き方なら1箇所だけを編集すればOK。

.header {
  width: 100%;
  ui {
    padding: 10px;
    li {
      font-size: 15px;
    }
  }
}

変数を使ってスタイルを使い回す

普通のCSSで文字の色を指定する場合

h1 {
  color: red;
}
p{
  color: red;
}
a{
  color: red;
}

SCSSで変数を使って書く場合

$main-color: red;
h1 {
  color: $main-color;
}
p{
  color: $main-color;
}
a{
  color: $main-color;
}

こうすることによってクラス名の修正の時同様に変数$main-colorの値を変えるだけで一挙に各要素の文字色を変更可能です。

ここまででも十分便利っぽいですが他にもいろいろあるみたい。

SCSSで出来ること

mixinでコードを一括で読み込む

$main-colorの時の例ではプロパティの値のみを変数として格納して利用していましたが、mixinではプロパティをまるごと変数にできるイメージ。

@mixin 変数名 {
  ここにCSS
}

のようなかんじです。

読み込みは@include 変数名;でOK。 以下の例ではカードっぽいデザインをmixin化して使いまわしています。

@mixin card {
  background: #fff;
  border-radius: 2px;
  box-shadow: 0 2px 5px #ccc;
}

.main-card {
  @include card;
  width: 50%;
}
.sub-card {
  @include card;
  width: 25%;
}

mixinに引数を渡して値を代入する

前述のカードスタイルの例ではwidthをメインとサブで分けて記述していますが、このwidthの値を引数として渡すよう書き換えるとさらに短く簡潔に書くことができます。

@mixin card($wsize) {
  background: #fff;
  border-radius: 2px;
  box-shadow: 0 2px 5px #ccc;
  width: $wsize;
}

.main-card {
  @include card(50%);
}
.sub-card {
  @include card(25%);
}

@mixin card($wsize)とすることで引数として受け取った値を自動的に$wsizeという変数に格納します。

  1. .main-cardでは50%が引数として渡される
  2. $wsize50%が代入される
  3. width: $wsize;width: 50%;となる

のような流れでCSSが読み込まれます。 ここまでくるとかなりプログラミングって感じがしてきますね。

関数を使って動的に色を生成する

Sassには関数がある。引数を渡すと計算後の値が返ってくるというあれができる。

例として出てきたのは色の生成。色を暗くする関数darken、色を明るくするlighten、透明度を指定する関数rgbaの3つがでてきました。

//redを10%暗く
.dark-red {
  color: darken(red, 10%)    
}
//redを10%明るく
.light-red {
  color: lighten(red, 10%)    
}
//redを50%透明に
.skeleton-red {
  color: rgba(red, 0.5)    
}

これを使えば基準の色を元にhover色やactive色を生成できるのでメインカラーだけ指定すればそれらしいカラーセットが作れそうですね。

importで外部ファイルを読み込む

CSSでもimportはありますが、SCSSでは読み込まれる側のファイル名の先頭に「_」(アンダーバー)を付ける必要があるようです。

そして読み込む時は「」と「.scss」を省略してOKらしい。 「variables.scss」というファイルを作って読み込むとすると

@import "variables";

で読み込むことができる。 で、これができると何が良いのかというと読み込み元の変数をそのまま使えるようになること。 そして、_variables.scssファイルに変数を全てまとめて記述しておくと設定ファイルのような使い方ができる。

$main-color: #d00;
$sub-color: lighten($main-color, 20%);
$font-color: white;
@import "variables";
h1 {
  background-color: $main-color;
  .tag {
    background-color: $sub-color;
    color: $font-color;
  }
}

このようにstyle.scssはテンプレートとして触らないようにして、_variables.scssさえ変更すればデザインが変わるようなことができます。

プロゲートでのお勉強部分はここらへんまででした。 その先は実践的な内容で目標物があって、それと同じにするにはどう書くでしょう的な問題。

最近は仕事でもマテリアライズフレームワークを使っているため、CSSをガシガシ書く時間が減っていたのですがSCSSで書きたくなってきました。

次にページ製作をやるときもしくはリファクタリングするときには使ってみようと思います。

MOS Excel 2016 Expert に合格しました

  この教材を会社に買ってもらってひたすら模試。 これで多少は転職に有利になるかなぁ。

Microsoft Office Specialist Microsoft Excel 2016 Expert 対策テキスト&問題集 (よくわかるマスター)

Microsoft Office Specialist Microsoft Excel 2016 Expert 対策テキスト&問題集 (よくわかるマスター)

  • 作者: 富士通エフ・オー・エム株式会社(FOM出版)
  • 出版社/メーカー: FOM出版 富士通エフ・オー・エム
  • 発売日: 2017/10/20
  • メディア: 大型本
  • この商品を含むブログを見る

まぁエキスパートとは言ってもVBAなんてまったく出てこない内容だったし 実際会社にインパクト与えるほど劇的な生産性向上をもたらすにはVBAでの業務自動化が必須。

これからも精進します。