When it’s ready.

出来るまで出来ない

pythonのmapの使いどころの一つ

LLTV行けなかったよぅ。USTも見つけられなかったし、TVって名前なのに中継してないの残念、まぁ有料だからしょうがないな。報告ブログなどをポチポチ見て回っています。LLTVでどなたが言ったか分からないけど「Mapを使っていきましょう」と言っていたらしい。
pythonでmap関数試した事があるだけで、実際どこにも使った事がなかったので改めてどんなところで使うのか考えてみた。普通にList渡してforしてる所で使えそう。

ファイルの読み込みの所でforが多段で有ったのでそこに使って見た。

読み込みたいファイル

Player.dat

名前 : 所属 : 地域 : 識別子
太郎 : 赤 : 地球 : E
ゆき : 青 : 木星 : J

みたいなデータファイルを読み込む

[
  ['名前', '所属', '地域', '識別子'],
  ['太郎', '赤', '地球', 'E'],
  ['ゆき', '青', '木星', 'J']
]

という風になればOK

ファイルを読む部分のソースは以下のような感じで

import os, logging, codecs
file_path = os.path.dirname(__file__)

def loadFile(file_name):
  DATA_PATH = os.path.join(file_path, file_name)
  try:
    res = codecs.open(DATA_PATH, 'r', 'euc-jp').readlines()
  except Exception, e:
    logging.warning(u'ExceptionType: %s'%(e))
    logging.warning(u'%s : file open fail'%(file_name))
    res = []
  return res

forバージョン

def forSplit(fArr):
  resArr = []
  for line in fArr:
    lineArr = []
    for word in line.split(':'):
      lineArr.append(word.strip())
    resArr.append(lineArr)
  return resArr

ちょっと、丁寧すぎる気がしなくもないがforで書くとこんな感じになる。
スプリットして、ストリップ。パッと思いつくのはこんな感じかも。

map使ったバージョン

def mapSplit(fArr):
  return map(lambda a:map(lambda b:b.strip(),a.split(':')), fArr)

そんなに無理せずに、1行になった。mapの範囲を見れば読見にくいと言うわけでは無い気がする。
だけどコレを一発で思いつくかというと、思いつかないなぁ

LC使ったバージョン

map考えてる時にリスト内包表記で書くのを思いついた。

def lcSplit(fArr):
  return [[word.strip() for word in line.split(':')] for line in fArr]

なにげにコレが一番しっくり来るかも・・・
mapが使うのが目的だったけど、この書き方見つけられたのでまぁいっか。

mapが活躍するところって実際どんなところが多いんだろ。
lambdaとか、可読性下がる気がするし、map関数に渡すところに書き殴るのあんまり好きじゃないなぁと
かといって、外に出すとそっちも見にくい気がするし。慣れの問題かな。

Googleカレンダーと、SnowLeopardのiCalで複数のカレンダーをシンクする。SpaningSyncもmobileMeも要らないよ

SnowleaopardのiCalは、CalDAVに対応したサーバとか、Exchangeに対応したとかそういう情報はちょいちょい見かけるけど実際どうやって設定すればいいの? という事でやってみた。

iCalでの設定


環境設定>アカウント アカウントの+マークを押す、アカウントの種類>Googleのアカウントを追加する。
ここで追加されるのは、Googleカレンダーでデフォで作られている1つめのカレンダー。

カレンダーひとつを利用したい場合は、この設定だけで快適に使える。iCalで変更しても、Googleカレンダー(Webから)変更しても、iPhoneのカレンダーから変更しても同じでーたを弄る事になるのでとても幸せ。

複数のカレンダーがある場合

Googleのアカウントを登録しただけの場合だと、他のカレンダー(自分の2個目や共有カレンダ)はiCalのカレンダーリストには出てこない、見る為にはiCalのウィンドウメニューから選択する必要が有る。しかし、ウィンドウメニューからカレンダーを選択しても新規にそのカレンダーだけのウィンドウが表示されるだけでメインのウィンドウにデータをマージして表示する事は出来ない。

追加の設定を行う>委任の設定

環境設定>アカウント>委任タブ にGoogleカレンダーで登録しているカレンダー一覧が表示されているので利用したいカレンダーにチェックを付ける。他人や公開カレンダーのように編集権限が無いものは権利のところが「読み出しのみ」になっている。

この設定を行う事で、iCalのメインのウィンドウにカレンダーを同時に表示する事が可能になる。

今までSpaningSyncを使ってシンクしていたカレンダー(紫)と今回CalDAVでシンク下カレンダー(オレンジ)を同時に表示してみた。

きちんと時間も数も同じモノが来ている。快適かも知れない。

問題

カレンダーの取り扱いが微妙。
自分のカレンダーでも、他人のカレンダーもなんかやたら階層を作ってしまう。

多分、追加したカレンダーと同名のユーザが居ると理解して、そのユーザのカレンダーがひとつあるという状態になっている感じ。CalDAVのプロトコルの詳細をしらないけどこの表示のされかたどうにかならないかな。無駄に縦方向の解像度無駄遣いしてる。