2011年09月29日

キーボードも液晶

両方タッチできる液晶のPC。
触ってみたけど、とてもブラインドタッチできる気がしねー。

110929_pc.jpg
posted by MINE at 11:05 | Comment(0) | TrackBack(0) | 諸行無常 | このブログの読者になる | 更新情報をチェックする | edit

MicrosoftのLyncがヤバイ

Microsoft Lync[microsoft]

The Microsoft Conference 2011で、Lyncが触れたので、後輩2人と遊んできたが、すげー良かった。導入したいよ。

IMとオンライン会議と(IP)電話(ビデオ含む)がうまく融合されているので、Exchange導入されている企業ならメール、会議予約含めて、すごく自然に使えると思う。

ホワイトボード共有、アプリケーション共有、PowerPoint(プレゼンテーション)共有、デスクトップ共有もあるから、設計とかコードレビューにも使えそう。使いどころは分からないけど、リアルタイムの投票システムもあった(笑)。プレゼンしながらインタラクティブに集計するんだろうか。

ビデオ会議も発言している人のカメラが勝手にアクティブになるし、自分は映らないようになってるしと、インテリジェンス。

クライアントは完全にWindows Live Messengerと同じだねー、と後輩と話してた。
MSの話だと、Windows Phoneのアプリも暮れには出るらしい。

ウチの会社もMSの製品で固めてくれないかなぁ。
いつまで古いシステムを使い続ける気だよぉ。

posted by MINE at 01:42 | Comment(0) | TrackBack(0) | サーバー技術 | このブログの読者になる | 更新情報をチェックする | edit

2011年09月28日

まいくろそふと かんふぁれんす 2011

参加してきた。
開発者向けの日じゃないせいか、そんな目新しい情報が無いな。

110928_seminer.jpg
posted by MINE at 16:59 | Comment(0) | TrackBack(0) | 諸行無常 | このブログの読者になる | 更新情報をチェックする | edit

2011年09月25日

HTC EVO 3Dかなぁ

auのHPからリーク[GIGAZINE]されたけど、秋冬モデル。

ざっと見たけど、WiMAXついていないシャープとNECカシオは論外として、HTCかな〜やっぱ。
京セラの有機LEが心惹かれるんだけど(笑)、そこしか面白い所なさそうだし、日本メーカーはバッテリーが少ないからなぁ。
富士通は日本仕様含めて全部入りって感じそう。
でも、富士通/東芝の端末で良いのに出会ったことが無いので、パスだろうな。

iPhone5?

Mac持ってないし、iTunes入れなきゃいけないし(今度OTA対応するんだっけ?)、oggやflac再生できない機械になんの魅力が・・・。

posted by MINE at 22:03 | Comment(0) | TrackBack(0) | デジモノ | このブログの読者になる | 更新情報をチェックする | edit

IronPythonでプロファイラ使って性能測定する方法

残念ながらIronPythonには[記事] のようなcProfileは無いので、別の方法で行う。

見つけた方法は、An IronPython Profiler。[Iron Curt
IronPython2.7で動作確認したけど、動くようだ。

ipy –X:EnableProfiler プログラム名

「type」で始まるのが.Netで、ModuleはPythonのコードらしい。

posted by MINE at 20:47 | Comment(0) | TrackBack(0) | IronPython | このブログの読者になる | 更新情報をチェックする | edit

Pythonでプロファイラ使って性能測定する方法

cProfileを使う。[Python v2.6.2 documentation 27.4.Python プロファイラ
pythonに引数m(意味はライブラリのスクリプトを実行する)にcProfile渡して、実行したいプログラム名を渡す

python -m cProfile プログラム名

-sでソートが指定できる。timeとかcallとか使える。

python -m cProfile -s time プログラム名

-oでファイルに出力できるとヘルプに書いてあるが、出力しても何に使うのか不明。(プログラムの再利用できるの?)

python -m cProfile -o 出力ファイル名 プログラム名

人が見る分には下記の感じで、リダイレクトした方が良い気がする。

python -m cProfile プログラム名 > 出力ファイル名
posted by MINE at 20:09 | Comment(0) | TrackBack(0) | Python | このブログの読者になる | 更新情報をチェックする | edit

2011年09月24日

風邪だったのかインフルだったのか

水曜日に熱があるなー、節々がいてーと思って、早く帰りたいのに台風で帰れねーと悶えてて、家帰って体温計で熱測ったら38.3度。

きゅー、バタン。

ってわけで、木、金と熱がさっぱり下がらず、ずっと寝込んでた。

ようやく土曜日になって、36度台に下がってきたので、フラフラできるようになった。

しかし、ずっと寝てたせいか、体が固まっちゃってアチコチ痛い(ToT;

posted by MINE at 15:56 | Comment(0) | TrackBack(0) | 諸行無常 | このブログの読者になる | 更新情報をチェックする | edit

2011年09月18日

バーベキュー

中学の友人に誘われ、BBQへ。

前日のプロジェクト打ち上げ飲み会は抑えてたはずなのに、飲み過ぎてたらしく頭と腹が痛かったので、ウコンと胃薬飲んで参加。

午後には大分回復したけど午前はヤバかった。

110918_tent.jpg110918_fire.jpg
posted by MINE at 18:08 | Comment(0) | TrackBack(0) | 諸行無常 | このブログの読者になる | 更新情報をチェックする | edit

プロジェクト打ち上げ

震災後位から途中参加したプロジェクトの打ち上げ。
同席した人がたまたまお酒好きで、一時間も名前名乗る前に語り合ってしまった。

後半にようやく「お名前は?」状態。
しかもよく飲みに行ってる人の会社の人だった(笑)

110918_bear.jpg
posted by MINE at 17:49 | Comment(0) | TrackBack(0) | 御飯 & お酒 | このブログの読者になる | 更新情報をチェックする | edit

2011年09月15日

2011年 送別会2

実は寿退社だったことにビックリ!(注:結果的にだけだったようで)

そして先輩は遅れてきたのに、飲み過ぎて記憶を無くしてたらしい。当日は二次会行こうぜーって、皆誘ってたのに…。

110915_bear.jpg
タグ:ビール
posted by MINE at 17:16 | Comment(0) | TrackBack(0) | 御飯 & お酒 | このブログの読者になる | 更新情報をチェックする | edit

2011年09月13日

[IronPython] 画像の縦横比を見て回転させ縮小するプログラム Ver2

PILでは扱えなかった[記事]が、IronPtyhonの.Netライブラリだと普通に扱えたので、更新しておく。

コード

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# 引数で指定したフォルダの画像ファイルを
# 出力先フォルダに縮小・回転しながらコピーする

from __future__ import print_function
from __future__ import division
import os,sys,glob
import shutil

import clr
clr.AddReferenceByPartialName('System.Drawing')
from System.Drawing import *

# 出力先フォルダ指定。
TARGET_DIR = 'C:\\Photo'
#COWON A3向け
#max_size = (800, 480)
#PSP向け
#max_size = (480, 270)
#Ziio向け
max_size = (480, 800)
#対象拡張子
ext_dic = ['.jpg','.jpeg','.png','.bmp','.tiff']
#強制変換対象フォーマット
forceCompressFormat = [Imaging.ImageFormat.Bmp,Imaging.ImageFormat.Tiff]
#ファイル名のprefix
DEST_PREFIX = 's_'
#JPEG品質
JPEG_QUALITY = 75

def makeOutputDirectory(outputDirPath):
	if os.path.isdir(outputDirPath) == False:
		os.makedirs(outputDirPath)

def isTarget(ext):
	return True if ext.lower() in ext_dic else False

class ProgressBar:
	def __init__(self,totalNum):
		self.totalNum = totalNum
		self.counter = 0
		self.chr = u"*"
		self.width = 40
	def addCounter(self,incrementNum):
		self.counter += incrementNum
	def show(self):
		pbar_chrs = self.chr * (self.width * self.counter // self.totalNum)
		percentage = 100 * self.counter // self.totalNum
		meter = '\r|{0}{1}| {2}/{3}個 ({4}%)'.format(pbar_chrs,u' ' * (self.width - len(pbar_chrs)),self.counter,self.totalNum, percentage)
		sys.stdout.write(meter)
		sys.stdout.flush()
		
def createJpegEncoder():
	jpgEncoder = [codec for codec in Imaging.ImageCodecInfo.GetImageEncoders() if codec.FormatID == Imaging.ImageFormat.Jpeg.Guid][0]
	encParam = Imaging.EncoderParameter(Imaging.Encoder.Quality,JPEG_QUALITY)
	encParams = Imaging.EncoderParameters(1)
	encParams.Param[0] = encParam
	return (jpgEncoder,encParams)
	
def shrinkImage(srcFileName, dstFileName,jpgEncoder):
	srcImg = Bitmap.FromFile(srcFileName)
	
	if srcImg.Width > max_size[0] or srcImg.Height > max_size[1] or (srcImg.RawFormat in forceCompressFormat):
		# BMP/TIFFの場合、JPEGにする
		if srcImg.RawFormat in forceCompressFormat:
			format = Imaging.ImageFormat.Jpeg
			root,ext = os.path.splitext(dstFileName)
			dstFileName = root + '.jpg'
		else:
			format = srcImg.RawFormat
		
		srcWidth = srcImg.Width
		srcHeight = srcImg.Height
		if max_size[0] > max_size[1]:
			#横が長いディスプレイの場合は縦長の画像を回転させた絵を作る
			if srcImg.Width < srcImg.Height:
				srcWidth = srcImg.Height
				srcHeight = srcImg.Width		
				srcImg.RotateFlip(RotateFlipType.Rotate90FlipNone);
		else:
			#縦が長いディスプレイの場合は横長の画像を回転させた絵を作る
			if srcImg.Width > srcImg.Height:
				srcWidth = srcImg.Height
				srcHeight = srcImg.Width		
				srcImg.RotateFlip(RotateFlipType.Rotate90FlipNone);
		
		# 画面より画像が小さい場合はスケーリングしない
		if max_size[0] < srcWidth or max_size[1] < srcHeight:
			scalerate = min(max_size[0]/srcWidth,max_size[1]/srcHeight)
			destWidth = int(round(scalerate * srcWidth))
			destHeight = int(round(scalerate * srcHeight))
		else:
			destWidth = srcWidth
			destHeight = srcHeight
					
		destImg = Bitmap(destWidth,destHeight)
		grphics = Graphics.FromImage(destImg)
		grphics.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
		grphics.DrawImage(srcImg,0,0,destWidth,destHeight)
		if format  == Imaging.ImageFormat.Jpeg:
			destImg.Save(dstFileName,jpgEncoder[0], jpgEncoder[1])
		else:
			destImg.Save(dstFileName,format)
		destImg.Dispose()
	else:
		# 画面に収まらない or BMP/TIFF形式以外の場合は、再圧縮する必要ないので普通のコピーにする
		shutil.copy(srcFileName,dstFileName)
	srcImg.Dispose()
	
def copyImageTree(targetList,progress):

	jpgEncoder = createJpegEncoder()
	for target in targetList:
		srcname = target[0]
		dstname = target[1]
		try:
			makeOutputDirectory(os.path.dirname(dstname))
			shrinkImage(srcname,dstname,jpgEncoder)
			progress.addCounter(1)
			progress.show()
		except (IOError, os.error), why:
			print("Cant' copy",srcname,'to',dstname,':',str(why))

def createTargetImagePath( path,targetBaseDirectory ):

	targetPath = []
	names = os.listdir(path)
	targetDirectory = targetBaseDirectory

	for name in names:
		srcname = os.path.join(path, name)
		try:
			if os.path.isdir(srcname):
				targetDirectory = os.path.join(targetBaseDirectory, name)
				targetPath += createTargetImagePath( srcname,targetDirectory )
			else:
				root, ext = os.path.splitext(srcname)
				if isTarget(ext) == True:
					targetPath.append((srcname,os.path.join(targetDirectory,DEST_PREFIX + name)))
		except (IOError, os.error), why:
			print("Can't copy",srcname,':',str(why))
	return (targetPath)
			
if __name__=='__main__':
	#引数がおかしい場合
	if len(sys.argv) < 2:
		print('Usage: # Python ',sys.argv[0],' [SouceImageDirectoryPath]...')
		raw_input()
		quit()
		
	targetPathList = []
	for x in range(1,len(sys.argv)):
		sourcePath = os.path.dirname(sys.argv[x] + '\\')

		if os.path.isdir(sourcePath) == False:	#存在しないPathを指定した場合
			print('[',sourcePath,']: Src directory does not exist.')
			raw_input()
			quit()
		elif os.path.isdir(TARGET_DIR) == False:	#存在しないPathを指定した場合
			print('[',TARGET_DIR,']: Dest directory does not exist.')
			raw_input()
			quit()
		elif sourcePath == TARGET_DIR:	#入力先と出力先が同じ場合
			print('The input destination is the same as the output destination.')
			raw_input()
			quit()
		else:
			targetPathList +=  createTargetImagePath(sourcePath,(TARGET_DIR + '\\' + os.path.basename(sourcePath)))
	
	if len(targetPathList) == 0:
		print('File does not exist.')
		quit()

	progress = ProgressBar(len(targetPathList))
	copyImageTree(targetPathList,progress)
関係する記事
  • [IronPython] 画像の縦横比を見て回転させ縮小するプログラム Ver1[記事]
posted by MINE at 01:31 | Comment(0) | TrackBack(0) | IronPython | このブログの読者になる | 更新情報をチェックする | edit

2011年09月11日

PILのTIFFはCCITT Group 3 Fax形式が扱えない

このプログラム[記事]で、縮小できない画像があり、「decoder tiff_ccitt not available」というエラーをはいていた。

ちょっと調べてみると、TIFFの圧縮形式には以下があり、PILは全部を扱えないようだ。

  • LZW:Lempel-Ziv & Welch algorithm
  • JPEG:Joint Photographic Expert Group
  • OJPEG:OLD JPEG
  • Pbit:Macintosh PackBits algorithm
  • 1D:CCITT Group 3 1-Dimensional Modified Huffman run length encoding
  • G3:CCITT Group 3 Fax, CCITT T.4 bi-level encoding
  • G4:CCITT Group 4 Fax, CCITT T.6 bi-level encoding
  • RLEw:CCITT run-length encoding, Word alignment
  • NeXT:NeXT 2bit encoding
  • TS4:ThunderScan 4bit run-length encoding
  • PKZIP:PKZIP-style Deflate encoding
  • ZIP
  • SGIl:SGI Log
  • SGIl2:SGI Log24

とりあえずテストした感じ、LZWは扱えそう。

posted by MINE at 22:42 | Comment(0) | TrackBack(0) | Python | このブログの読者になる | 更新情報をチェックする | edit

2011年09月10日

ベルギービール ウィークエンド 2011

前から目をつけてたベルギービールの祭りへ。

普段飲まないビールとバンドの音楽聞けて満足。
結構皆のってたので、盛り上がってた。

110910_hiruz.jpg110910_bear.jpg110910_kaijyo.jpg110910_band.jpg110910_ice.jpg
タグ:ビール
posted by MINE at 19:59 | Comment(0) | TrackBack(0) | 御飯 & お酒 | このブログの読者になる | 更新情報をチェックする | edit

2011年09月04日

PythonはVisual Studioで

米Microsoft、Visual StudioでのPython開発をサポートするプラグイン「PTVS 1.0」をリリース[SOURCEFORGE]

MSからPythonをVSで開発できるようにするプラグインがリリース。

CPythonだけでなくIronPythonとかもできるようだ。

さっそく、会社に入れてみよう。

posted by MINE at 00:11 | Comment(0) | TrackBack(0) | Python | このブログの読者になる | 更新情報をチェックする | edit