2016年12月17日土曜日

.netでメール自動送信しようとして、つまづいたこと

このあたりの記事をみて、.netのSmtpClientを使用して、
メールを送信しようとしたところ、
エラーがでて送信できなかった。
メーラー(Outlook)では、送信できるのに、と思って原因を探していたら、
ウィルス対策ソフトがブロックしていたみたいだった。
で、ウィルス対策ソフトを一時的に、Offにしてみたら、送信できた。

2016年11月20日日曜日

Emacs24のruby-modeで波カッコが入力できなくなった時

Emacs24には、デフォルトでruby-modeが組み込まれているため、
自分で古い ruby-modeを用意する必要がなくなったみたい。
単純に、自分で用意したruby-modeをPathの通っていない位置におくだけで
波カッコが入力できるようになった。

2016年10月18日火曜日

.netでローソク足と出来高表示

.netでローソク足と出来高を表示する
コンパイルは
csc ChartTest2.cs /r:System.Windows.Forms.DataVisualization.dll

using System.Runtime.InteropServices;
using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;

public class ChartTest:Form
{
  private Chart chart;

  public ChartTest()
  {
    this.SuspendLayout();

    Size = new Size(500,500);
    SetChart();
 
    this.ResumeLayout();
  }

  //チャート画面の作成
  private void SetChart()
  {
    //チャート画面の作成
    chart = new Chart();
    //1つ目のチャートエリア
    chart.ChartAreas.Add(new ChartArea("chart1"));
    chart.ChartAreas["chart1"].AxisX.Interval = 5;

    //2つ目のチャートエリア
    chart.ChartAreas.Add(new ChartArea("chart2"));
    //チャートエリアサイズ
    chart.Size = new Size(400,400);
 
    Controls.Add(chart);

    //チャート1の描画
    chart.Series.Add(new Series());
    Series series;
    series = chart.Series[0];
    series.ChartArea = "chart1";
    series.ChartType = SeriesChartType.Candlestick;

    //データの作成(ローソク足)
    int ii;
    for(ii = 1; ii < 10 ; ii++)
      {
        double[] d = new double[4];
        d[0] = ii * 10;  // 高値
        d[1] = ii *  3;     // 安値
        d[2] = ii *  5;     // 始値
        d[3] = ii *  8;  // 終値
        DataPoint dp = new DataPoint(ii,d);
        series.Points.Add(dp);
      }
    
    //チャート2の描画(出来高)

    chart.Series.Add(new Series());
    Series series2;
    series2 = chart.Series[1];
    series2.ChartArea = "chart2";
    series2.ChartType = SeriesChartType.StackedColumn;

    //データの作成(出来高)

    for(ii = 1; ii < 10 ; ii++)
      {
        DataPoint dp = new DataPoint(ii,ii*10000);
        series2.Points.Add(dp);
      }

  }

  public static int Main(string[] args)
  {
    ChartTest ct = new ChartTest();
    ct.ShowDialog();
    return 0;
  }

}
結果はこんな感じ。
ただ、このままだと、上と下でY軸の線が合わずにみづらいので、
chart.ChartAreas["chart1"].AlignWithChartArea = "chart2";
を追加して、軸合わせする。
(上下の軸合わせしたいだけなのに、探すのに手間取った。
 Chartクラスは、凄い便利だと思うけど、使い方に癖があって
 慣れないと使いづらい。)
で、直した版はこんな感じ。


using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;

public class ChartTest:Form
{
  private Chart chart;

  public ChartTest()
  {
    this.SuspendLayout();

    Size = new Size(500,500);
    SetChart();
 
    this.ResumeLayout();
  }

  //チャート画面の作成
  private void SetChart()
  {
    //チャート画面の作成
    chart = new Chart();
    //1つ目のチャートエリア
    chart.ChartAreas.Add(new ChartArea("chart1"));
    chart.ChartAreas["chart1"].AxisX.Interval = 5;

    //2つ目のチャートエリア
    chart.ChartAreas.Add(new ChartArea("chart2"));
    //チャートエリアサイズ
    chart.Size = new Size(400,400);
 
    Controls.Add(chart);

    //チャート1の描画
    chart.Series.Add(new Series());
    Series series;
    series = chart.Series[0];
    series.ChartArea = "chart1";
    series.ChartType = SeriesChartType.Candlestick;

    //データの作成(ローソク足)
    int ii;
    for(ii = 1; ii < 10 ; ii++)
      {
        double[] d = new double[4];
        d[0] = ii * 10;  // 高値
        d[1] = ii *  3;     // 安値
        d[2] = ii *  5;     // 始値
        d[3] = ii *  8;  // 終値
        DataPoint dp = new DataPoint(ii,d);
        series.Points.Add(dp);
      }
    
    //チャート2の描画(出来高)

    chart.Series.Add(new Series());
    Series series2;
    series2 = chart.Series[1];
    series2.ChartArea = "chart2";
    series2.ChartType = SeriesChartType.StackedColumn;

    //データの作成

    for(ii = 1; ii < 10 ; ii++)
      {
        DataPoint dp = new DataPoint(ii,ii*10000);
        series2.Points.Add(dp);
      }

    /**** 上のチャートと下のチャートのY軸位置調整 ******/
    chart.ChartAreas["chart1"].AlignWithChartArea = "chart2";
    /***************************************************/
  }

  public static int Main(string[] args)
  {
    ChartTest ct = new ChartTest();
    ct.ShowDialog();
    return 0;
  }

}
実行結果は、↓
軸があって見易くなった。

2016年9月19日月曜日

C#から、dllの読み込み

C#から、Windows APIなどの、Dllを読み込む時は、読み込みの宣言をしてから使用する。
using System.Runtime.InteropServices;

public class DllRead
{
  //読込む、dllの定義
  [DllImport("Kernel32.Dll", EntryPoint="GetPrivateProfileInt")]
  public static extern uint GetPrivateProfileInt(string lpAppName,string lpKeyName,
                                                 int nDefault,string lpFileName);
  public static void Main()
  {
    uint hoge;
    //iniファイルの読込
    hoge = GetPrivateProfileInt("app","key",10,@".\file.ini");
    System.Console.WriteLine(hoge);
  }
  
}
設定ファイル:file.ini
[app]
key=66

2016年7月16日土曜日

postgresqlで月曜日の最新の日付を取得する。

下の表があるとき、月曜の中で最新の日付を取得する。

date
2016-07-11(月)
2016-07-12(火)
2016-07-13(水)
2016-07-14(木)
2016-07-15(金)


SELECT Max(date)
FROM   dateTable
WHERE extract(dow from date) = 1;
-- 日曜日(0)から土曜日(6)までの曜日


結果
    max
------------
 2016-07-11

2016年6月25日土曜日

WindowsでTCP・IP通信のひな型

サーバー側
#include
#include
int main(){
  SOCKET soc,accpSoc;
  int ret,w_ret,len;
  struct sockaddr_in addr,accpAddr;
  WORD wVersionRequested;
  WSADATA wsaData;
  char buf[256];
  wVersionRequested = MAKEWORD( 2, 2 );

  //0.Setup
  ret = WSAStartup( wVersionRequested, &wsaData );
  if ( ret != 0 ) {
    /* Tell the user that we could not find a usable */
    /* WinSock DLL.                                  */
 printf("fail startup");
    return -1;
  }
 
  //1.ソケット作成
  soc = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

  //2.bind
  addr.sin_family = AF_INET;
  addr.sin_addr.s_addr = inet_addr("0.0.0.0");
  addr.sin_port = htons(5150);
  ret = bind( soc,(SOCKADDR*) &addr, sizeof(addr) );

  if(ret == 0){
 printf("success bind\n");
  }
  else{
 w_ret = WSAGetLastError();
 printf("fail bind error code(%d)\n",w_ret);
 return w_ret;
  }
  
  //3.listen
  ret = listen(soc,1);

  if(ret == 0){
 printf("success listen\n");
  }
  else{
 w_ret = WSAGetLastError();
 printf("fail listen error code(%d)\n",w_ret);
 return w_ret;
  }

  //4.accept
  accpSoc = accept(soc,NULL,NULL);
  printf("accept socket");
  
  //5.receive
  while(1){
 len = recv(accpSoc,buf,sizeof(buf),0);
 w_ret = WSAGetLastError();
 if(len <= 0){

   break;
 }
 printf("recv message length = %d\n",len);
  }
  
  //6.後始末

  if ( LOBYTE( wsaData.wVersion ) != 2 ||
    HIBYTE( wsaData.wVersion ) != 2 ) {
    /* Tell the user that we could not find a usable */
    /* WinSock DLL.                                  */
    WSACleanup( );
    return 0; 
  }
  else{
 return -1;
  }
 
}

クライアント側
#include
#include
int main(){

  SOCKET soc;
  int ret,w_ret;
  struct sockaddr_in addr;
  WORD wVersionRequested;
  WSADATA wsaData;
  char* message = "hoge";
  //0.準備
  ret = WSAStartup( wVersionRequested, &wsaData );
  if ( ret != 0 ) {
    /* Tell the user that we could not find a usable */
    /* WinSock DLL.                                  */
 printf("fail startup");
    return -1;
  }
  
  //1.ソケット作成
  soc = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

  //2.接続
  addr.sin_family = AF_INET;
  addr.sin_addr.s_addr = inet_addr("127.0.0.1");
  addr.sin_port = htons(5150);

  if ( connect( soc, (SOCKADDR*) &addr, sizeof(addr) ) == SOCKET_ERROR) {
    printf( "Failed to connect.\n" );
    WSACleanup();
    return -1;
  }


  //3.送信
  while(1){
 send(soc,message,sizeof(message),0);
 Sleep(1000);
  }
  //4.後始末
  WSACleanup();  
  return 0;
}

2016年6月11日土曜日

.net シリアライズ機能を使用してクラスの保存

シリアライズ機能を使用する時のひな型

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

//クラス保存出来るように、属性を追加
[Serializable()]
public class Hoge
{
  public DateTime d;
}

public class SaveLoad
{
  public const string FILE_NAME = "hoge.txt";

  public static void InitFile()
  {
 if(!File.Exists(FILE_NAME))
    {
   Hoge[] h = new Hoge[1];
   h[0] = new Hoge();
   h[0].d = DateTime.Now;
   Save(h);
    }
 
  }
  
  public static void Save(Hoge[] h)
  {
 FileStream fs = new FileStream(FILE_NAME,FileMode.Create,FileAccess.Write);
 BinaryFormatter b = new BinaryFormatter();
 b.Serialize(fs,h);
 fs.Close();

  }

  public static Hoge[] Load()
  {

 BinaryFormatter b = new BinaryFormatter();
 FileStream fs = new FileStream(FILE_NAME, FileMode.OpenOrCreate, FileAccess.Read);
 Hoge[] loadFile;
 loadFile = (Hoge[])b.Deserialize(fs);
 fs.Close();

 return loadFile;  
  }

  public static void Main()
  {
 Hoge[] h;
 //ファイルがない場合は、ファイルを作成
 SaveLoad.InitFile();
 //ファイルのロード
 h = SaveLoad.Load();
 System.Console.WriteLine("前回起動時刻は"+ h[0].d.ToString("yyyy/MM/dd HH:mm:ss")+"です。");
 //終了時刻をセーブ
 h[0].d = DateTime.Now;
 SaveLoad.Save(h);
  }

2016年5月1日日曜日

postgresql で 列にコメントを表示する

1.表を作成する
  CREATE TABLE hoge (hoge int);

2.列にコメントをつける
  COMMENT ON COLUMN hoge.hoge IS 'ほげ';
 
3.列のコメントを表示する
  \d+ hoge

                   テーブル "public.hoge"
  列  |   型    | 修飾語 | ストレージ | 対象統計情報 | 説明
------+---------+--------+------------+--------------+------
 hoge | integer |        | plain      |              | ほげ


2016年4月10日日曜日

postgresql で 3番目に大きい数を取得する

select num
from  hoge
order by num desc  -- numを降順に並べる
limit 1                    -- 条件に合うnumを一つだけ取得する
offset 3;                 -- 条件に合うnumを3番目から取得する

2016年3月26日土曜日

emacs skkで日本語の検索

emacsでskkを使って入力できるけど、
検索ができない状態だった。
.emacsに以下の設定を追加したら解決した。

(require 'skk-setup)

2016年3月23日水曜日

PostgresqlでTCP・IP接続をできるようにする

Postgresqlは設定を変えないと外部から接続できないのでメモ
(Postgresqlはdebian8.2)

1. postgresql.confの設定を変える

/etc/postgresql/9.4/main/postgresql.conf

を開いて、

listen_addresseas = 'localhost'

listen_addresseas = '*'
に変更する

2.pg_hba.confの設定を変える

/etc/postgresql/9.4/main/pg_hba.conf

を開いて、

host  all  all 192.168.1.0/24  md5

を追加する。
(192.168.1.0/24は、IPによって変える)

3.違うパソコンからpsqlでアクセスしてみる

psql -h 192.168.1.17 dbName
(192.168.1.17は、IPによって変える)
で接続できるか確認する。

2016年3月13日日曜日

Visual Studio キーバインドメモ

編集
Ctrl+K,Ctrl+C選択範囲をコメント
Ctrl+K,Ctrl+U選択範囲をコメントアウト
Ctrl+K,Ctrl+F選択範囲のフォーマット
Ctrl+r,Ctrl+r名前の変更
Alt+Shiftを押しながら↑↓←→矩形領域の選択
Ctrl+M,Ctrl+S現在の領域を折りたたむ
Ctrl+M,Ctrl+E現在の領域を展開
Ctrl+M,Ctrl+O定義を折りたたむ
Shift+Ctrl+Bソリューションのビルド

C#でWebBrowser

今まで全然使ったことがなかったけれど、 .NetにはWebBrowserといクラスがあって、 Form内にブラウザを作れる。 これが使えると、どこかのサイトにログインした後に プログラム的に結果をとってくるとかが簡単にできて便利そう。
using System;
using System.Drawing;
using System.Windows.Forms;

public class WebBrowserTest : Form

{
  WebBrowser webBrowser1 ;
  public WebBrowserTest()
  {
    //パネルにWebブラウザをadd
    this.webBrowser1 = new System.Windows.Forms.WebBrowser();
    this.webBrowser1.Location = new System.Drawing.Point(-3, 37);
    this.webBrowser1.MinimumSize = new System.Drawing.Size(20, 20);
    this.webBrowser1.Name = "webBrowser1";
    this.webBrowser1.Size = new System.Drawing.Size(783, 544);
    this.webBrowser1.TabIndex = 0;
    this.webBrowser1.Dock = DockStyle.Fill;
    
    Uri uri = new Uri("http://www.yahoo.co.jp");
    webBrowser1.Url = uri;

    
    this.Controls.Add(this.webBrowser1);

  }
  
  [STAThread]
  public static void Main()
  {
    WebBrowserTest test = new WebBrowserTest();
    test.Size = new Size(1000,1000);
    Application.Run(test);
  }
  
}
このプログラムを実行するだけだと、スクリプトエラーとなるので、 IE9エンジンをIEコンポーネントブラウザで使う を参考に、レジストリーキーを更新する。

2016年2月29日月曜日

Windowsでプロセス間通信5(共有メモリ)

プロセス間通信を共有メモリで行う場合のひな型

 送信側
using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Threading;
using System.Runtime.InteropServices;
public class ShareMemWrite
{
  public const string MEMNAME = "TEST";
  
  public static void Main()
  {
    //1.共有メモリの作成
    MemoryMappedFile mem = MemoryMappedFile.CreateOrOpen(MEMNAME,512);
    MemoryMappedViewAccessor acc = mem.CreateViewAccessor();

    DateTime d;
    while(true)
      {
        //2.共有メモリの書き込み
        d = DateTime.Now;
        acc.Write(1,ref d);
        
        Thread.Sleep(1000);
      }
    
  }
  
}

 受信側
using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Threading;
using System.Runtime.InteropServices;

public class ShareMemRead
{
  public const string MEMNAME = "TEST";
  
  public static void Main()
  {
    //1.共有メモリの作成
    MemoryMappedFile mem = MemoryMappedFile.CreateOrOpen(MEMNAME,512);
    MemoryMappedViewAccessor acc = mem.CreateViewAccessor();
    DateTime d;
    while(true)
      {
        //共有メモリの読み込み
        acc.Read(1,out d);
        System.Console.WriteLine(d);
        Thread.Sleep(1000);
      }

  }
  
}

2016年2月20日土曜日

Linuxコマンドでテキスト編集

Linuxコマンドでテキスト編集を書こうと思ったのだけど、
下のページがとってもまとまっていたので、
何か付け足すのがあったら書こう。

Linuxテキスト編集コマンドのすべて

Windowsでプロセス間通信4(メッセージキュー)

プロセス間通信をメッセージキューで行う場合のひな型

 送信側
using System;
using System.Messaging;
using System.Runtime.Serialization.Formatters.Binary;
using System.Threading;

public class QueueSend
{
  const string QUEUE_NAME = ".\\Private$\\TEST";

  public static void Main(string[] args)
  {
    MessageQueue queue;

    //メッセージキューがある場合はNewする
    //ない場合は、作成する
    if(MessageQueue.Exists(QUEUE_NAME))
       {
         queue = new MessageQueue(QUEUE_NAME);
       }
    else
      {
         queue = MessageQueue.Create(QUEUE_NAME);
      }

    BinaryMessageFormatter bf = new BinaryMessageFormatter();
    Message msg;
    while(true)
      {
        DateTime d = DateTime.Now;
        //メッセージをフォーマットして送信する
        msg = new Message(d,bf);
        queue.Send(msg);
        Thread.Sleep(1000);
        
      }
  }
  
}

 受信側
using System;
using System.Messaging;
using System.Threading;

public class QueueRecv
{
  const string QUEUE_NAME = ".\\Private$\\Test";

  public static void Main(string[] args)
  {
    MessageQueue queue;
    //メッセージキューがある場合はNewする
    //ない場合は、作成する
    if(MessageQueue.Exists(QUEUE_NAME))
      {
        queue = new MessageQueue(QUEUE_NAME);
      }
    else
      {
        queue = MessageQueue.Create(QUEUE_NAME);
      }
    //フォーマッタを指定
    queue.Formatter = new BinaryMessageFormatter();
    Message msg;
    DateTime d;
    while(true)
      {
        //メッセージを受信
        msg = queue.Receive();
        //受信したメッセージを型変換
        d = (DateTime)msg.Body;
        Console.WriteLine(d.ToString());
      }
  }
  
}

2016年2月17日水曜日

Windowsでプロセス間通信3(名前付きパイプ)

プロセス間通信をファイルで行う場合のひな型

 送信側
using System;
using System.IO.Pipes;
using System.Text;
using System.Threading;

public class NamedPipeSend
{
  const string NAME = "test";
    public static void Main(string[] args)
  {

    //1.パイプ作成
    NamedPipeClientStream client = new NamedPipeClientStream(".",NAME,PipeDirection.Out);
    //2.サーバに接続
    client.Connect();
    byte[] sendData = new byte[1024];
    while(true)
      {
        //3.処理
        Thread.Sleep(1000);
        DateTime d = DateTime.Now;
        Encoding enc = Encoding.UTF8;
        sendData = enc.GetBytes(d.ToString());
        client.Write(sendData,0,sendData.Length);
        client.Flush();

      }
  }
}

 受信側
using System;
using System.IO.Pipes;
using System.Text;

public class NamedPipeReceive
{
  const string NAME = "test";

  public static void Main(string[] args)
  {
    //1.パイプ作成
    NamedPipeServerStream server = new NamedPipeServerStream(NAME,PipeDirection.In);
    //2.受信待ち
    server.WaitForConnection();
    byte[] rData = new byte[4096];
    int len;
    while(true)
      {
        rData = new byte[4096];
        //データ受信
        len = server.Read(rData,0,rData.Length);
        if(len == 0)
          {
            break;
          }
        Array.Resize(ref rData,len);
        Encoding enc = Encoding.UTF8;
        System.Console.WriteLine(enc.GetString(rData));

      }
  }
  
}

おまけ(名前付きパイプの一覧表示)
public class NamedPipeList
{
  public static void Main()
  {
    string[] pipeList = System.IO.Directory.GetFiles("\\\\.\\pipe\\");
    foreach(string pipe in pipeList)
      {
        System.Console.WriteLine(pipe);
      }
    
  }
}

2016年2月16日火曜日

Windowsでプロセス間通信2(ソケット(UDP))

プロセス間通信をソケット(UDP)で行う場合のひな型

 送信側
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
public class SocketSend
{
  const string  address = "127.0.0.1";
  const int port = 5555;
  public static void Main()
  {
    //1.ソケット作成
    Socket soc = new Socket(AddressFamily.InterNetwork,
                            SocketType.Dgram,
                            ProtocolType.Udp);
    IPEndPoint ePoint = new IPEndPoint(IPAddress.Parse(address),port);
    while(true)
      {
        //2.処理
        Thread.Sleep(1000);
        //3.データ送信
        DateTime d = DateTime.Now;
        Encoding enc = Encoding.UTF8;
        byte[] sendData;
        sendData = enc.GetBytes(d.ToString());
        soc.SendTo(sendData,ePoint);
      }
    
  }
  
}

 受信側
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
public class Socketレエイヴェ
{
  const string  address = "127.0.0.1";
  const int port = 5555;
  public static void Main()
  {
    //1.ソケット作成
    Socket soc = new Socket(AddressFamily.InterNetwork,
                            SocketType.Dgram,
                            ProtocolType.Udp);

    EndPoint ePoint = new IPEndPoint(0,0);
    EndPoint bPoint = new IPEndPoint(0,port);
    byte[] rData = new byte[4096];
    int len;
    //2.ソケットのバインド
    soc.Bind(bPoint);
    while(true)

      {
        //2.データ受信
        len = soc.ReceiveFrom(rData,ref ePoint);
        Array.Resize(ref rData,len);
        Encoding enc = Encoding.UTF8;
        Console.WriteLine(enc.GetString(rData));
        //3.処理
        Thread.Sleep(1000);
        
      }
  }
}

2016年2月14日日曜日

Windowsでプロセス間通信1(ファイル)

プロセス間通信をファイルで行う場合のひな型

 送信側
using System;
using System.IO;
using System.Threading;
public class FileWrite
{
  private static Mutex mut = new Mutex(false,"mut");
  private const string FILE_NAME = "hoge.txt";
  
  public static void Main(string[] args)
  {
 while(true)
   {

  //1.処理
  Thread.Sleep(1000);
  //2.ロック
  mut.WaitOne();
  //3.書き込み
  DateTime d = DateTime.Now;
  StreamWriter sw = new StreamWriter(FILE_NAME);
  sw.WriteLine(d.ToString());
  sw.Close();
  //4.ロックの開放
  mut.ReleaseMutex();
   }
  }
}

 受信側
using System;
using System.IO;
using System.Threading;
public class FileRead
{
  private static Mutex mut = new Mutex(false,"mut");
  private const string FILE_NAME = "hoge.txt";
  
  public static void Main(string[] args)
  {
 while(true)
   {
  //1.ロック
  mut.WaitOne();
  //2.読み込み
  StreamReader sr = new StreamReader(FILE_NAME);
  Console.WriteLine(sr.ReadLine());
  sr.Close();
  //3.ロックの開放
  mut.ReleaseMutex();
  //4.処理
  Thread.Sleep(1000);
   }
  }
}

Windowsでプロセス通信


Windowsでプロセス間の通信を行う時、いくつか方法が
あるけど、比べてみた。

No. 方法 説明 長所 短所
1 ファイル ファイルを作成して共有 分かりやすい HDDディスクを使ってしまう。
2 ソケット通信 TCP or UDP通信を使う プロセスを別のPCに移しても動く オーバスペックな気がする
3 namedpipe 名前付きパイプ
4 メッセージキュー メッセージキュー オブジェクトをそのまま渡せる
5 共有メモリ 共有メモリを作成して書き込み読み込みを行う 可変長データは共有しづらい


2016年2月10日水曜日

linux コマンドでディレクトリ毎の行数確認


├─a
│      chmod.c
│      od.c
│    
└─b
        cut.c
        paste.c

上のような感じでaとbのフォルダにファイルがある時、
aフォルダとbフォルダ毎のファイルの行数を調べたい時の話

1行でできたらおしゃれなのだろうけど、うまくいかなかったので、
shscriptとコマンドを組み合わせて作ってみた。

shscriptの内容は下のような感じ

hoge.sh
#!/bin/bash

for dir in "$@"
do
 echo $dir
        #nameで対象ファイルの絞り込み
 find $dir -type f -name \*.c -o -name \*.h|xargs wc -l|grep 合計
done

うえのシェルスクリプトをパスを通した場所に保存して、find で探したディレクトリを渡す。


find . -type d|xargs hoge.sh

実行結果はこんな感じ。

.
  3907 合計
./a
 2555 合計
./b
 1352 合計
ディレクトリ内にたくさんファイルがあると分割されてしまうけど、
取りえず我慢

2016年2月3日水曜日

c#で動的な関数呼び出し


using System;
using System.Reflection;

public class DynamicCall
{

  public static void TestMethod(int a,int b)
  {
System.Console.WriteLine("a="+a.ToString()+"  b="+b.ToString());
  }

  public  void TestMethod2()
  {
System.Console.WriteLine("test Method2");
  }

  public static void Main()
  {
DynamicCall dCall = new DynamicCall();
//型の取得
Type t = typeof(DynamicCall);
//メソッドの取得
MethodInfo mInfo = t.GetMethod("TestMethod");
//メソッド呼び出しstaticメソッドの場合は、nullでOK
mInfo.Invoke(null,new object[] {10,20});

//メソッドの取得
mInfo = t.GetMethod("TestMethod2");
//メソッド呼び出し通常メソッドの場合は、
//一番目の引数にインスタンス変数を渡す
mInfo.Invoke(dCall,null);

  }

}

2016年1月23日土曜日

emacs lispで文字列挿入

hoge001
hoge002
     :
hoge100

みたいに単純に数字だけ変わっていく場合
emacs lispでしたみたいに書いて実行する。

(let ((ii 1))
  (while (<= ii 100)
(insert (format "hoge%03d\n"  ii))
(setq ii (+ ii 1))
)
  )