2016年3月26日土曜日

.NETからPythonを使う

.NETとpythonの連携についての記事があった。この方法だと、確かにコンパイルしなおさなくても、簡単に、ソフトの動作を細かく調整できて、便利かもしれない。
https://codezine.jp/article/detail/2187?p=2

http://ironpython.codeplex.com/releases/view/5141から.dllファイルを持ってきて、参照に追加するだけで、動作するので、設定も簡単だ。

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim pe As PythonEngine = New PythonEngine()
        pe.Globals.Add("MyButton", Me.Button1)
        pe.ExecuteFile("1st.py")
    End Sub

1.pyは
# coding: utf-8
#最初の例(MyButtonをGlobalで共有)
MyButton.Text = "スクリプトを実行"
のような感じでいいようだ。

Postfixとmailutilsでメール送信

Vmware上で、メール送信を試してみた。HDD残量が少なくなったとき、メールで知らせたりいろいろ応用がきく。

Postfixとmailutilsをインストールし、/etc/postfix/main.cfにいろいろ設定を追加する。

メールサーバの設定に合わせて変更が必要である。
mydestinationに、自分の利用しているメールサーバを追加する。
mynetworksに自分のローカルネットワークを追加
smtp_user_tlsは自分の環境ではコメントアウトしていいようだ。

relayhost=[自分のメールサーバアドレス]:587  通常のISPはこの形
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/isp_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_mechanism_filter = plain,login,digest-md5,cram-md5

[mail.asahi-net.or.jp]:587 mailユーザ名:パスワード というファイルを/etc/postfix/isp_passwdにおき
# postmap /etc/postfix/isp_passwd
とするとハッシュ化されるらしい
service postfix restart

メール送信は
mail dist@abc.jp -aFrom:myname@abc.jp
でOkでした。
送信者名を指定しないとroot@abc.jpという形になってしまうようです。


以下のリンクを参照させていただきました
http://d.hatena.ne.jp/shibainu55/20100620/1277904550
http://askubuntu.com/questions/405058/postfix-start-error-port-25-address-already-in-use

2016年3月24日木曜日

HerokuでPythonを少し動かしてみた

Herokuでは、Ruby,scala、java、pythonなど主要な言語をクラウドで使える。今回は、最近学び始めたばかりのPythonをちょっとばかりためしてみた。

Edit hello/views.py. At the beginning, add a line to import the os module:
import os
Now modify the index method so that it repeats an action depending on the value of the TIMES environment variable:
def index(request):
    times = int(os.environ.get('TIMES',3))
    return HttpResponse('Hello! ' * times)
heroku local will automatically set up the environment based on the contents of the .env file in your local directory. Edit the .env file to add:
TIMES=2

 これはconfig varの説明のところ。うまく動作せず、いろいろ試行錯誤してみた。
エラーメッセージを見たらインデントがどうのこうのと英語で書いてあった。
pythonはインデントが重要であることを忘れていた。インデントをそろえたらうまく動作した。

 要するに、ローカルに.envというファイルを作成してTIMES=2としておけば、これを読むようだ。
もしこのファイルがなければディフォルトで3を読む。(os.environ.get('TIMES',3)の3はそういう意味のようだ。)
 こういったちょっとしたことも、検索しても出てこない。慣れてない言語は手間取る。Pythonはグローバルスタンダートなのに、日本語の情報が少ないのが気になる。でも、わりと覚えやすく使いやすい言語といえるかもしれない。scalaやHaskelほどではないが、ほどほどに関数型としても使えるようだ。

2016年2月14日日曜日

非同期ワークフロー パラレル計算 F#

http://d.hatena.ne.jp/rhasumi/20101209/p1のサイトを参照させてもらいました。

試しに、1000000回で実行時間を比べたら、ノンパラレルでないほうが速かったようなので
10000000回に一桁回数を増やしたところ、パラレルのほうが速くなりました。
シミュレーションの計算などで活用すると便利なようです。

let Runif seed n =
  let r = new System.Random(seed)
  let ans:float[] = Array.zeroCreate n
  for i in 0..(n-1) do
    ans.[i] <- r.NextDouble()
  ans

let Parallel' n =
    let r = new System.Random()
    [for x in 1..2 -> async { return Runif (r.Next ()) n }]
    |> Async.Parallel
    |> Async.RunSynchronously

let nonParallel' n =
    let r = new System.Random()
    [for x in 1..2 -> Runif (r.Next ()) n ]



[<EntryPoint>]
let main argv =
    let sw = System.Diagnostics.Stopwatch()
    sw.Start()
    let rs=[nonParallel' 10000000]
    sw.Stop()
    System.Console.WriteLine("nonParrallel Time elapsed: {0}", sw.Elapsed)
    sw.Reset()

    sw.Start()
    let rs=[Parallel' 10000000]
    sw.Stop()
    System.Console.WriteLine("Parrallel Time elapsed: {0}", sw.Elapsed)
    sw.Reset()

    System.Console.ReadKey() |> ignore
    0 // 整数の終了コードを返します

F#の非同期ワークフロー

http://fsharp.web.fc2.com/#非同期ワークフロー
を参考にさせていただいた。

 [<EntryPoint>]
let main args =
     let task1 = async { while true do printf "a" }
     let task2 = async { while true do printf "b" }  
     Async.RunSynchronously (Async.Parallel [task2]) ①
     Async.Start  task1 ②
     0
これだと、bしか表示されない。つまり、①が終わらない限り、②は実行されない。

①と②を逆にすると
 [<EntryPoint>]
let main args =
     let task1 = async { while true do printf "a" }
     let task2 = async { while true do printf "b" }  
     Async.Start  task1 ②
     Async.RunSynchronously (Async.Parallel [task2]) ①
     0
これだと、bとaが交互に表示される。つまり、②が終わらなくても、①が実行される。
以前はStartはSpawn、RunSynchronouslyはRunだった?ようです。

2016年2月13日土曜日

C#とF#の連携2

http://www.infoq.com/jp/articles/pickering-fsharp-async
上記のサイトを参考にさせいていただきました。
C#のGUIで、いろいろ試してみました。

F#側は
namespace Library1
open System
open System.Collections.Generic
open System.IO
open  Microsoft.FSharp.Control.CommonExtensions
open  System.Diagnostics
open  System.Text.RegularExpressions
module FSLib =
 let  path = @"\\192.168.1.1\HomeICT\test"
 let  readFile filePath =
     // open and read file
     let  fileStream = File.OpenText(filePath)
     let  text = fileStream.ReadToEnd()
     // find all the "words" using a regex
     let  word = new  Regex("\w+")
     let  matches = word.Matches(text)
     let  words  = seq{ for m in  matches -> m.Value }
     // count unique words using a set
     let uniqueWords = Set.ofSeq words
     // print the results
     let name = Path.GetFileNameWithoutExtension(filePath)
     sprintf "%s - Words: %d Unique words: %d "  name matches.Count  uniqueWords.Count
 let xt2 =
     let filePaths = Directory.GetFiles(path)
     [for filePath in filePaths -> readFile filePath]

C#側は

using System;
using System.Linq;
using System.Windows.Forms;
using Library1;
using System.Collections.Generic;
using Microsoft.FSharp.Collections;
途中省略
 private void button2_Click(object sender, EventArgs e)
        {
            //FSharpList<string> xt2 = FSLib.xt2;   最初、この2行でやってみたけれど
            //listBox2.Items.AddRange(xt2.ToArray());  めんどうなので、1行にまとめてみたらOKでした
            listBox2.Items.AddRange(FSLib.xt2.ToArray());

        }


2016年2月6日土曜日

WEBソフトはブラウザによる微妙な調整が必要

 グループウエアの改良に少しずつ取り組む。<img src='path'>を使った画像挿入の機能を入れてみた。IEでは、通常のファイルパスで指定してもOKだったが、ChromeやEdgeではhttp://で指定してやらないとだめだということがわかった。といっても、ファイルの削除等の処理は、ファイルパスを使う必要があるので、思ったより複雑になってしまった。
 画像は、HTML5の機能で、ファイルサイズを縮小する機能があるので、縦サイズをそろえてからアップロードするようにしてみた。
 
 WEBソフトというのは、ブラウザによって微妙に動かなかったり、動いたりするということにあらためて気づかされる。将来的に、ブラウザも変わっていけば、それに合わせてソフトも変えていかなければならないということになるのだろうか。