読者です 読者をやめる 読者になる 読者になる

TaillookTech

備忘録

連番のテキストファイルを自動生成するシェルスクリプトを組む

概要

テストデータ作る時に便利そうなので作った

コード

#!/bin/bash

for n in `seq 0 ${1}`
do
    touch ${n}.txt
    echo ${n}.txt
    echo "test">>${n}.txt
done

結果

$ ./test.sh 10
0.txt
1.txt
2.txt
3.txt
4.txt
5.txt
6.txt
7.txt
8.txt
9.txt
10.txt

Python3とRequestsで郵便番号から住所を取得するAPIを叩く

Requestsとは

PyhtonのHTTPライブラリ.
人類にとって読みやすくコーディングできるらしい.

qiita.com

インストール

pip3 install requests

郵便番号から住所を取得するAPI

今回は郵便番号データ配信サービスzipcloudのAPIを使用する.

zipcloudの使い方

ベースURL : http://zipcloud.ibsnet.co.jp/api/search
このURLにパラメータを加えてリクエストを送る.

zipcloudを使ってみる

getでhttp://zipcloud.ibsnet.co.jp/api/search?zipcode=1540013で郵便番号を与えるとjsonが返ってくる.

{
    "message": null,
    "results": [
        {
            "address1": "東京都",
            "address2": "世田谷区",
            "address3": "駒沢公園",
            "kana1": "トウキョウト",
            "kana2": "セタガヤク",
            "kana3": "コマザワコウエン",
            "prefcode": "13",
            "zipcode": "1540013"
        }
    ],
    "status": 200
}

不正な桁の郵便番号を渡すとエラーが出る.
http://zipcloud.ibsnet.co.jp/api/search?zipcode=19216811

{
    "message": "パラメータ「郵便番号」の桁数が不正です。",
    "results": null,
    "status": 400
}

存在しない郵便番号を渡すとnullが返る.
http://zipcloud.ibsnet.co.jp/api/search?zipcode=1234567

{
    "message": null,
    "results": null,
    "status": 200
}

PythonからAPIを叩いてみる

テキトーにコードを書いてみる

import json
import sys
import requests

def main(zipcode):
    url = "http://zipcloud.ibsnet.co.jp/api/search"
    param = {"zipcode": zipcode}

    res = requests.get(url, params=param)
    response = json.loads(res.text)
    address = response["results"][0]

    print(address["address1"] + address["address2"] + address["address3"])

main(sys.argv[1])

動作例

$ python3 main.py 1900003
東京都立川市栄町

Processingとminimで風船を膨らませる!

minimとは

minimはProcessing1.0以降のバージョンで標準のサウンドライブラリ.
短いコードでオーディオのコントロールができる!

Minim | Compartmental

今回作ったもの

画面中の風船をユーザの声で膨らませるもの.
“声を出し続けないと風船がしぼんじゃうよ!”
“膨らませすぎると割れちゃうよ!”
子供向けに何か作れないかなと思って作ったはいいけど唾がキーボードに散るのが嫌なので不採用. f:id:taillook:20170321185217p:plain
f:id:taillook:20170321185127p:plain
f:id:taillook:20170321185122p:plain
画像は"いらすとや"から

動作

  1. マイクから音を拾う
  2. 音量が一定以上で膨らませる
  3. 音量が一定以下でしぼませる
  4. 風船が一定以上の大きさになると破裂する
  5. Shiftキーでリセット

環境

  • MacBookPro 2016
  • macOS Sierra
  • Processing 3.3
  • minim 2.2.2

GitHub

github.com

subprocess.callでPythonからシェルコマンドを叩く

備忘録

import subprocess

subprocess.call('ls -l', shell=True)
subprocess.call(['ls', '-l'])

出力結果は同じ
自動でパースさせる場合にshell=Trueが必要.

ImageSnapを使ってbash上で写真を撮る

はじめに

bashコマンドで写真とか撮れないかなーって探してたらあったので使ってみた.

ImageSnapとは

ImageSnapはWebカメラから画像をキャプチャできるコマンドラインツール.

詳細

github.com

使ってみる

環境

インストール

brewでインストールできる.
brew install imagesnap

ヘルプ

とりあえずimagesnap -h

USAGE: imagesnap [options] [filename]
Version: 0.2.5
Captures an image from a video device and saves it in a file.
If no device is specified, the system default will be used.
If no filename is specfied, snapshot.jpg will be used.
Supported image types: JPEG, TIFF, PNG, GIF, BMP
  -h          This help message
  -v          Verbose mode
  -l          List available video devices
  -t x.xx     Take a picture every x.xx seconds
  -q          Quiet mode. Do not output any text
  -w x.xx     Warmup. Delay snapshot x.xx seconds after turning on camera
  -d device   Use named video device

写真を撮る

imagesnap -q -w 1 snapshot.pngで写真が撮れる.
オプションはqとwを使っている.
qはリザルトとかの出力をなくす.wは写真を撮る時間をコマンド実行時から遅らせる.
今回は1秒遅らせた.(このオプションを付けないと画像が真っ暗になった.レンズのライトが着くタイミングとかなのかな…?)

何秒かごとに写真を撮る.

tオプションを付けることで何秒かごとに写真を撮ることができる.
imagesnap -t 1.00で1秒ごとに写真を撮ることができる.

結果

open snapshot.pngで写真を開く.
f:id:taillook:20170306232438p:plain
こんな感じの写真が撮れた.

感想

後ろに居る人にバレずに写真を撮りたい時とかに使えそう.

MacのsayコマンドとPythonでツイート読み上げスクリプト書いた

経緯

知り合いのオタクがVOCALOID?のゆかり?にツイート読み上げさせてたのでやってみたかった.

実装

ツイッターのストリーミングAPIを使って取得したツイートの内容をPyhtonのsubprocessモジュールでbashのsayコマンドで読み上げさせる.
sayコマンドはOS X独自のコマンドでLinuxとかではGoogleとかの読み上げ機能を使うといいみたい.
sayコマンドで使える音声は色々あってデフォルトではKyokoという女の声.

ha1f-blog.blogspot.jp
ツイッターのストリーミングはこのページのコードを参考にしました.
qiita.com
sayコマンドの使い方はここを参考にしました,

動作

こんな感じの出力が出てKyokoさんが喋ってくれる.
f:id:taillook:20170304185116p:plain

コード

# -*- coding: utf-8 -*-
import tweepy
import subprocess
from datetime import timedelta

#CK = 'XXXXXXXXXXXXXXXXXXXXXX'                             # Consumer Key
#CS = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'         # Consumer Secret
#AT = 'XXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' # Access Token
#AS = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'         # Accesss Token Secert

class Listener(tweepy.StreamListener):
    def on_status(self, status):
        status.created_at += timedelta(hours=9)

        print('------------------------------')
        print(status.text)
        print(status.author.name + status.author.screen_name +  unicode(status.created_at) + status.source)
        subprocess.call('say ' + '"' + status.author.name + 'さんのツイート"'.decode('utf-8'), shell=True)
        subprocess.call('say ' + '"' + status.text + '"', shell=True)
        return True

    def on_error(self, status_code):
        print('Got an error with status code: ' + str(status_code))
        return True

    def on_timeout(self):
        print('Timeout...')
        return True

auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)

listener = Listener()
stream = tweepy.Stream(auth, listener)
stream.userstream()

bashで syntax error near unexpected token `(' が出た

bashsyntax error near unexpected token `('が出たときの話

bashでsayコマンドで遊んでたら syntax error near unexpected token `('というエラーが出た.
例:say go on the next page(唐突)
このときに引数の文字列をダブルクオーテーションで囲めばいいだけだった.
say "go on the next page(唐突)"