2015年9月29日火曜日

Google Apps Script : ファイルとフォルダ

基本となるファイルとフォルダの列挙や操作について触れてみます
ファイル、フォルダまわりを扱うにはDriveAppを利用します

■列挙
 ・ファイルの単純な列挙
  DriveApp.getFiles() : FileIteratorという形で受け取ります

  基本的な列挙のコード
  var objFiles = DriveApp.getFiles();
  var objFile;
  while (objFiles.hasNext()){
    objFile = objFiles.next();
    Logger.log(objFile.getName());
  }
  →Googleドライブ内にある全てのファイルが列挙されます

 ・フォルダの単純な列挙
  DriveApp.getFolders() : FolderIteratorという形で受け取ります

  基本的な列挙のコード
  var objFolders = DriveApp.getFolders();
  var objFolder;
  while (objFolders.hasNext()){
    objFolder = objFolders.next();
    Logger.log(objFolder.getName());
  }
  →Googleドライブ内にある全てのフォルダが列挙されます

 ・指定のフォルダについての列挙
  ファイル、フォルダ共に指定のフォルダに属した物のみを対象に列挙できます
  objFolder.getFiles()
  objFolder.getFolders()
  →対象のフォルダ(objFolder)に、getFiles/getFoldersをする事で列挙ができます

 ・ファイルのタイプを限定して列挙
  DriveApp.getFilesByType(mime type) : タイプを引数に指定

  例えば、Spreadsheetのファイルを列挙する場合は以下のようにします
  DriveApp.getFilesByType(MimeType.GOOGLE_SHEETS);
   画像のようにMimeType.まで入力すると候補が表示されるので、
   この中から選択する形で覚えれば良いと思います


■取得
 列挙の中では、next()によって1つのファイル/フォルダを取得していましたが、IDや名前を使って取得ができます

 ・ファイルの取得
  DriveApp.getFileById(id) : IDから特定の1つのファイル受け取ります
  DriveApp.getFileByName(name) : 名前からFileIteratorという形で受け取ります

 ・フォルダの取得
  DriveApp.getFolderById(id) : IDから特定の1つのフォルダを受け取ります
  DriveApp.getFolderByName(name) : 名前からFolderIteratorという形で受け取ります

  →名前の場合は、同じ名前の物が存在しうるので列挙と同じ形の受け取りとなります

 ・フォルダの取得(マイドライブ)
  DriveApp.getRootFolder() : マイドライブ(ルート)を受け取ります


■名前の変更
 ・ファイル名の変更
  objFile.setName(name) : 引数に指定した名前に変更します

 ・フォルダ名の変更
  objFolder.setName(name) : 引数に指定した名前に変更します


■新規作成
 ・フォルダの作成
  DriveApp.createFolder(name) : 引数に指定した名前でマイドライブにフォルダを作成します
  objFolder.createFolder(name) : 引数に指定した名前でobjFolderにフォルダを作成します


■複製(コピー)
 ・ファイルの複製
  objFile.makeCopy() : 引数の有無によって名前や複製先を指定できます

  targetFolderへ"複製されたファイル"という名前で複製する例
  objFile.makeCopy("複製されたファイル", targetFolder);


■削除(ゴミ箱へ送る)
 ・ファイルの削除
  objFile.setTrashed(true) : objFileを削除します

 ・フォルダの削除
  objFolder.setTrashed(true) : objFolderを削除します

-----
以上でファイルとフォルダの列挙、基本的な操作ができると思います。

2015年9月26日土曜日

Google Apps Script : 準備から記述、実行まで

少しPythonから離れて、Google Apps Scriptにも触れてみます。

■準備
 ・Googleアカウント
 ・Googleドライブに「Google Apps Script」を追加
  →初期状態では、[新規ファイル]メニューに[Google Apps Script]が含まれていないので追加する作業が必要です。

  (1)Googleドライブにアクセスして、右クリックでメニューを表示

  (2)メニューから赤枠の[アプリを追加]を選択

  (3)検索ボックスに「Google Apps Script」を入力して、リストに表示された[Google Apps Script]の[接続]をクリック

  (4)右クリックのメニューの[新規ファイル]に[Google Apps Script]が表示されるようになる


■スクリプトの記述と実行
 エディタでスクリプトを記述して実行するところまでの一連の流れです

 (1)新規ファイルで「Google Apps Script」を選択

  (2)エディタが表示され、「myFunction()」が定義されているのが確認できる
   myFunction内に以下を記述します   
   Logger.log("Hello world!");

 (3)赤枠にある[保存]のボタンをクリックし、プロジェクト名(ファイル名)を入力します


 (4)赤枠にある[実行]のボタンをクリックします






  エディタのメニュー[表示]→[ログ]を選択すると、以下のような表示が確認できます

 
 このような流れで、スクリプトの記述から実行までを行います

2015年9月22日火曜日

Python 再帰関数

プログラム言語に触れるようになって、最初に衝撃を受けたのがタイトルにある再帰関数でした。
正しい表現とは言えないですが、その時感じたそのままの表現を使うなら「自分で自分自身を呼ぶ関数」
その衝撃というものは、今でも記憶にしっかりと刻み込まれているくらいのものです。

その名の通り、再帰的に処理を行うのにはとてもきれいに書ける仕組みだと思います。
ディレクトリなど、ツリー構造を走査するにはもってこい。
きちんと引き返す条件を設定してあげないと無限ループにはまりますが・・・

練習問題的に出されるのが1からNまでの和を求める。
これをPythonで書いてみます。

>>> def sample(val):
...    if val > 1:
...        return = val + sample(val-1)
...    else:
...        return val
...

たったのこれだけ、
王道の1から10までの和を求めるには
>>> sample(10)
55

2015年9月8日火曜日

Python リストとタプル

少し戻っているような気もしますが、正直混乱の元になっていたので・・・
あらためてリストとタプルについて確認をしておきます。

■環境
 Python 2.7


■確認
 先ずは単純に
 >>> x = [1, 2, 3]
 >>> print type(x)
 <type 'list'>
 >>>
 >>> x = (1, 2, 3)
 >>> print type(x)
 <type 'tuple'>
 →[]で囲ったのがリストで、()で囲ったのがタプル

 複数の値を返す関数は?
 >>> def func1(x):
 ...     return x+1, x*2
 ...
 >>> x = func1(5)
 >>> print type(x)
 <type 'tuple'>
 →戻り値が複数ある関数の結果はタプル

-----
初歩的な事だと思いますが、少し触らない期間があったら簡単に忘れてしまいそう・・・

2015年9月7日月曜日

Python 単純なグラフの表示

「これだ!」というテーマ(やりたい事)を持っていないままPythonの勉強継続中です。
モチベーション維持の観点からも、そろそろ壮大過ぎない程度のテーマが欲しいところですが・・・

1つの方法としてグラフの表示を取り上げてみました。「視覚化」と言ってしまえば非常に聞こえの良いテーマだと思います。そんなに立派なものにはなりませんが、やはり目に見える(分かり易い)形で表現する事は大切な事だと考えています。


前置きが長かったですが、matplotlibを使用してグラフを表示します。
他、numpyも利用

■環境
 Windows 7(64bit)
   + Python 2.7.9(32bit)
      + matplotlib 1.4.3
      + numpy 1.9.2

■インタラクティブで実行
 >>> import numpy as np
 >>> import matplotlib as plt
 >>>
 >>> x = np.arange(0, 361, 1) # 0から360まで1刻み
 >>> y1 = np.sin(x * np.pi / 180)
 >>> y2 = np.cos(x * np.pi / 180)
 >>>
 >>> plt.plot(x, y1)
 [<matplotlib.lines.Line2D object at 0x.....>]
 >>> plt.plot(x, y2)
 [<matplotlib.lines.Line2D object at 0x.....>]
 >>> plt.xlim(0, 360)
 (0, 360)
 >>> plt.show()






















なんて事のない正弦波と余弦波ですが、これだけの記述で表示できてしまうのだから便利です。

2015年9月3日木曜日

Python 構造体みたいなもの

サードパーティのライブラリを追加したりしながらPythonに触れていて
ふと、構造体のようなものはないかとインターネットで検索していたら
名前付きタプル」がヒットした。

とりあえず、座標値を表すPositionを考えて試してみると
>>> from collections import namedtuple
>>>
>>> pos = namedtuple('Position', 'x y z')
>>>
>>> p1 = pos(x=100, y=200, z=300)
>>>
>>> print p1.x, p1.y, p1.z
100 200 300
>>>

print部分で書いているように、ピリオドに続けてxやy,zを書くことで値にアクセスする事ができる
あくまでタプルなので、以下のように値を変更する事はできない
>>> p1.x += 10
AttributeError: can't set attribute

元の「構造体」という点から考えれば、100点満点とは言えないかもしれないけれど
「名前付きタプル」そのものは便利な仕組みだと思えました。

-----
typeを確認してみると
>>> print type(p1)
<class '__main__.Position'>

2015年9月2日水曜日

CPython 上場銘柄の一覧を取得する

jsmというモジュールを使って、銘柄の一覧取得をしてみました
該当のモジュールは、Yahooファイナンスから情報を取得しているみたいです。
過去にさかのぼっての株価取得も可能でしたが、ここでは銘柄一覧の取得のみにとどめておきます。

■環境
 Windows 7 Ultimate Service Pack1 (64bit)
 + Python 2.7.9 (32bit)


■準備(jsmモジュールの追加)
 なんて事はありません。以下を実行するだけ。。。
 >python -m pip install jsm


■スクリプト
 getStockInfo.py
 #coding:shift-jis

 import jsm

 q = jsm.Quotes()
 list = q.get_brand()

 # 列挙
 for key in list.keys():
     for item in list[key]:
         print item


■実行(コマンドプロンプト)
 以下でテキストファイル「getStockInfo_result.txt」に結果が出力されます
 >python getStockInfo.py >> getStockInfo_result.txt

2015年8月31日月曜日

CPython 数値計算ライブラリ(Theano)の追加

Theanoを追加してみる

■環境
 Windows 7 Ultimate Service Pack1 (64bit)
 + Python 2.7.9 (32bit)


■インストール
 これだけで、インストールはあっさり出来てしまう
 >python -m pip install theano

 インストール後、importを試してみると
 >>> import theano
 →エラーが。。。メッセージを見ると、g++が無いと言われている

 そこで、MinGWをインストールし、以下の項目にチェックを入れて追加
 ・mingw32-base (必要かどうか分からなかったのでとりあえず...)
 ・mingw32-gcc-g++

 MinGWインストール先のbin以下に「g++.exe」が存在している事を確認して、この場所を環境変数の「PATH」に追加する

 -----
 ここまでの作業後に再度importで確認
 >>> import theano
 >>>
 →無事、使えるようになったらしい


■簡単に試してみる
 >>> import theano
 >>> import theano.tensor as T
 >>>
 >>> x = T.dscalar('x')
 >>> y = x**2+3
 >>> gy = T.grad(cost=y, wrt=x)  # 微分
 >>>
 >>> f1 = theano.function(inputs=[x], outputs=y)
 >>> f2 = theano.function(inputs=[x], outputs=gy)
 >>>
 >>> print f1(3), f2(3)
 12.0 6.0

 期待通りの計算結果が表示される
 12.0 「x**2+3」のxに3を代入した結果
 6.0 「2*x」(x**2+3の微分)に3を代入した結果

 簡単な記述で、式を解析して微分を解けてしまう事に驚いてしまった!

Python CPythonのインストールとモジュール追加

IronPythonでnumpy、scipy等のライブラリ追加をしようと手を動かしてみたのだけど、どうにも上手く進める事が出来なくて、追加でCPythonをインストールする事に。

■CPython
 インストールは何てことない。msi(インストーラー)があるので、これを実行するだけ
 インストールしたのは、以下のもの
 「python-2.7.9.msi


■モジュールの追加
 ・numpy
  インストーラーが存在しているのですんなり
  「numpy-1.9.2-win32-superpack-python2.7.exe

 ・scipy
  インストーラーが存在しているのですんなり
  「scipy-0.16.0-win32-superpack-python2.7.exe

 -----
 ここまでで、当初の目的は果たしたものの他にも追加をすすめる

 ・matplotlib
  インストーラーが存在しているのですんなり
  「matplotlib-1.4.3.win32-py2.7.exe

 ・dateutil
  pipで見つからないと怒られて、ダウンロードして手動で追加
  「python-dateutil-1.5.tar.gz

 ・wxPython
  インストーラーが存在しているのですんなり
  「wxPython3.0-win32-3.0.2.0-py27.exe

 ・six
  pipでインストール
  「python -m pip install six

 -----
 失敗により保留

 ・pyaudio
  インストーラーが落ちてしまう・・・
  「pyaudio-0.2.8.py27.exe

なんだか、すでに混沌の予感。。

2015年8月28日金曜日

Python Pipのインストール


IronPythonをインストールしたのは良いものの、ライブラリのインストールでかなり戸惑いました。
とりあえず、Pipのインストールが以下の流れできた様子

■環境
 Windows 7 Ultimate Service Pack 1 (64bit)
 + IronPython 2.7.5


■インストール手順

 (1)コマンドプロンプトを管理者権限で実行

 (2)IronPythonのインストール先(ipy.exeが存在する場所)へ移動し、以下を入力
  PROMPT>ipy -X:Frames -m ensurepip
  Ignoring indexes: https://pypi.python.org/simple/
  Downloading/unpacking setuptools
  C:\Program Files (x86)\IronPython 2.7\Lib\weakref.py:1: DeprecationWarning: object.__init__() takes no parameters for type KeyedRef
  """Weak reference support for Python.
  Downloading/unpacking pip
  Installing collected packages: setuptools, pip
  Successfully installed setuptools pip
  Cleaning up...


 書いてしまえばこれだけなんですが、、、
 正直、辿り着くまでに費やした時間が。

2015年8月27日木曜日

Python 少しだけ実用的な所に触れてく(2)

■関数、ファイルサイズ取得

ファイルサイズを表示する関数を書いてみる
 >>> import os
 >>> import glob
 >>>
 >>> # 関数
 >>> def GetFileSize(target_file):
 ...     fsize = os.path.getsize(target_file)
 ...     print target_file, "=", fsize
 ...
 >>>
 >>> # 対象の指定
 >>> target = r'd:\tmp\*.*'
 >>>
 >>> # 対象についてファイルサイズを表示(関数呼び出し)
 >>> for file in glob.glob(target):
 ...     GetFileSize(file)
 ...
 →「ファイル名 = ファイルサイズ」の形で列挙されます

Python 少しだけ実用的な所に触れてく

■ファイルの一覧

 指定したディレクトリのファイル一覧を表示
 >>> import os
 >>>
 >>> # ディレクトリの指定
 >>> path = r'd:\tmp'
 >>>
 >>> # ファイルの列挙
 >>> for file in os.listdir(path):
 ...     print file
 ....
 →これで指定ディレクトリ(d:\tmp)のファイル一覧が得られます


■ファイル書き込み(テキスト)

 単純なテキストファイルの処理
 >>> # 対象のファイル
 >>> target_file = r'd:\tmp\test.txt'
 >>>
 >>> # ファイルオープン
 >>> f = open(target_file, 'w')
 >>>
 >>> # ファイルへ書き込み
 >>> f.write("aaa")
 >>>
 >>> # ファイルクローズ
 >>> f.close()
 >>>
 →aaaが記述された指定ファイル(d:\tmp\test.txt)が作成されます。
  既に存在する場合は上書き


■ファイル読み込み(テキスト)

 単純なテキストファイルの処理
 >>> # 対象のファイル
 >>> target_file = r'd:\tmp\test.txt'
 >>>
 >>> # ファイルオープン
 >>> f = open(target_file, 'r')
 >>>
 >>> # ファイルの読み込み、クローズ
 >>> lines = f.readlines()
 >>> f.close()
 >>>
 >>> # ファイルの内容を表示
 >>> for line in lines:
 ...     print line
 ...
 aaa
 →テキストファイルの内容(aaa)が表示されます


Pythonに触れてみる(3)



Pythonに触り始めて2日目。
基本的な触り方を続けて見ていきます。


■真/偽(bool)を使う

 単純に変数に入れてprint
 >>> value1 = True
 >>> print value1
 True
 >>> print int(value1)
 1
 →そのままprintだとTrueの出力がされてます。

 -----

 Trueと1の比較
 >>> value1 = True
 >>> if value1 == 1:
 ...     print "True"
 ... else:
 ...     print "False"
 ...
 True
 →比較の結果、等価とみなされています。


■変数へ値を入れる

 今さらですが、なじみの無い書き方ができるようなので
 >>> a, b = 1, 2
 >>> print a
 1
 >>> print b
 2

 -----

 異なる型でも同じように
 >>> c, d = 10, 'aaa'
 >>> print c
 10
 >>> print d
 aaa
 →こんな書き方ができるんですね。実際には複数行に分けて書きそうなので、出番はないかも・・・


 ■繰り返し(for文)

 何も考えず
 >>> for x in (1, 2, 3):
 ...     print x
 ...
 1
 2
 3

 -----
 
 forブロックの後ろでxを確認してみると
 >>> print x
 3
 →xは存在していて、最後の値である3が出力されてました。

 -----

 for文にelse??
 >>> for x in (1, 2, 3):
 ...     print x
 ... else:
 ...     print "終わり"
 ...
 1
 2
 3
 終わり
 →繰り返しの終わり(繰り返し条件を満たさなくなった)ところで実行されてます。

 -----

 次へ(continue)
 >>> for x in (1, 2, 3)
 ...     continue
 ...     print x
 ... else:
 ...     print "終わり"
 ...
 終わり
 →乱暴ですが。。。print前に次の要素へ進めて、最後にelseの"終わり"が出力されてます。

 -----

 中断(break)
 >>> for x in (1, 2, 3):
 ...     break
 ...     print x
 ... else:
 ...     print "終わり"
 ...

 →中断をした場合は、else部分の処理もされてません。
 
繰り返しでelseが使えるのは面白いかも知れませんね

2015年8月26日水曜日

Python モジュールを追加

何ができるか、まだまだ理解が出来ていませんが
試しにモジュールを追加してみる。

対象 : jinja2-2.8

■環境
 Windows 7 Ultimate (64bit)
 + IronPython 2.7.5


■追加手順
 (1)jinja2を入手
  →jinja2-2.8.tar.gz (2015/08/26時点の最新)

 (2)解凍した中の「jinja2」フォルダをIronPythonインストール先の「Lib\site-packages」以下へコピー

 (3)テキストファイル「jinja2.pth」を作成し、テキスト「jinja2」(フォルダ名)を記述

 (4)上で作成したテキストファイルを「Lib\site-packages」へ配置

 -----
 ここで、IronPython Consoleを起動して確認してみると・・・
 >>> import jinja2
 Traceback (most recent call last):
  (省略)
 ImportError: No module named markupsafe
 →markupsageが無いと怒られる。
 -----

 (5)markupsafeを入手
  →Markupsafe-0.23.tar.gz(2015/08/26時点の最新)

 (6)解凍した中の「markupsafe」フォルダを同様に「Lib\site-packages」以下へコピー

 (7)テキストファイル「markupsafe.pth」を作成し、テキスト「markupsafe」を記述

 (8)上で作成したテキストファイルを「Lib\site-packages」へ配置


■確認
 >>> import jinja2
 >>>
 →エラーが表示されなくなる

Pythonに触れてみる(2)


触ってみない事には始まらないので、何も考えずConsoleを起動してみます。
 
 [スタート]メニューから[IronPython 2.7]→[IronPython Console]

























「何かを書いてみる」というレベルではないので、シンプルが一番。
エディタとしてVisual Studio環境を利用するのは
かなり先の話かも知れません。

■お約束の「Hello World!」

 >>> print "Hello World!"
 Hello World!

 -----
 せっかく .NET Frameworkが利用出来るので、ちょっと脱線するようですが

 >>> import System.Console
 >>> System.Console.WriteLine("Hello World!")
 Hello World!


■数値や文字

 なんて事のない、変数に値を入れて、printで出力するだけ。
 >>> value1 = 3
 >>> value2 = "string"
 >>>
 >>> print value1
 3
 >>> print value2
 string

 -----
 単純に演算を含めてみると
 >>> print value1 + 2
 5
 >>> print value2 + "!!"
 string!!

 -----
 数値と文字で演算(1)
 >>> print value1 + value2
 →数値と文字(文字列)の加算で怒られます。。(安直過ぎ)

 数値を文字に変換する必要がありました。
 >>> print str(value1) + value2
 3string

 -----
 数値と文字で演算(2)
 >>> print value2 * value1
 stringstringstring
 →*3(value1)でvalue2の文字列が3回繰り返されます!!
  PowerShellでも「文字列*(数値)」で繰り返しの結果が得られますが、ちょっと不思議な感覚が抜けません。。


■リスト

 要素(数値や文字など)の並びを作る?
 >>> numlist = (10, 20, 30)
 >>> print numlist
 (10, 20, 30)

 -----
 リストの要素にアクセス
 >>> print numlist[1]
 20
 →0始まりなので、[1]は2番目の要素

 >>> print numlist[-1]
 30
 →末尾方向からの参照ができる!(新鮮な感じがします)

 仕方がないかも知れませんが、先頭からは0開始で末尾からは1開始なのは
 少し気持ち悪いかも知れません。。
 
numlist102030
先頭からの添え字[0][1][2]
末尾からの添え字[-3][-2][-1]




Pythonに触れてみる(1)


 とりあえず触れてみようと考えて、環境を準備しました。
 IronPython 2.7 

 最初に検索をかけて見て、いくつかの選択肢がある事が分かり迷いましたが...
 始める前から考え過ぎても仕方がないので、以下の理由からIronPythonを選びました。

 ・.NET Frameworkが使える

 少なくとも、スタートは純粋にPythonに触れられれば良いと考えているので、意味のない理由かも知れませんが、何か不都合が出た時に道具を変えれば良いだけと思います。

 ■環境
  Windows 7 Ultimate Service Pack 1 (64bit)
  + Visual Studio 2013

 ■インストール
  ・Python Tools for Visual Studio
  ・IronPython-2.7.5