haruki のすべての投稿

LazarusでMysqlに接続する

LazarusでMysqlに接続する

1,接続
2,読み込み(Select)
3,挿入(Insert)
4,アップデート(Update)
5,削除(Delete)

ポイント
 TMySQL55Connection
 TSQLQuery
 TSQLTransaction
を、使用する。

プログラム

設定

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  Grids
  , mysql55conn  // 追加
  , sqldb // 追加
  , db // 追加
  , ComCtrls // 追加

  ;

本体

procedure TForm1.FormCreate(Sender: TObject);
begin
     MySQL55Connection1:= TMySQL55Connection.Create(nil);
     MySQL55Connection1.HostName := 'xxx.xxx.xxx.xxx';
     MySQL55Connection1.CharSet:='utf8mb4';
     MySQL55Connection1.UserName := 'xxxx';
     MySQL55Connection1.Password := 'xxx';
     MySQL55Connection1.DatabaseName:='xxxxx';
     SQLQuery1:= TSQLQuery.Create(nil);
     SQLTransaction1:= TSQLTransaction.Create(nil);
     SQLTransaction1.SQLConnection:=MySQL55Connection1;


     button1.Caption:='search';
     button2.Caption:='select';
     button3.Caption:='insert';
     button4.Caption:='update';
     button5.Caption:='detale';
     button6.Caption:='maketable';


     StringGrid1.RowCount:=1;
     StringGrid1.ColCount:=3;

     StringGrid1.Cells[1,0]:='商品名';
     StringGrid1.Cells[2,0]:='商品コード';


end;
procedure TForm1.Button1Click(Sender: TObject);
var
  StrText:string;
begin
if not MySQL55Connection1.Connected then MySQL55Connection1.Open;
if MySQL55Connection1.Connected then begin
SQLQuery1.DataBase := MySQL55Connection1;
SQLQuery1.SQL.Text := 'select p_name from m_product where p_name="'+edit1.text+'" and p_code = "'+edit2.text+'" ';
         SQLQuery1.Open;
if SQLQuery1.EOF then begin
                   StrText :='商品と商品コードが一致しません';
                   MessageDlg(StrText, mtInformation, [mbYes], 0);
         end
    else  begin
      StrText :='商品と商品コードが一致しました';
      MessageDlg(StrText, mtInformation, [mbYes], 0);
             end;
         SQLQuery1.Close;
end;
MySQL55Connection1.Close();
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  i:integer;
  s:string;
begin
if not MySQL55Connection1.Connected then MySQL55Connection1.Open;
if MySQL55Connection1.Connected then begin
SQLQuery1.DataBase := MySQL55Connection1;
SQLQuery1.SQL.Text := 'select p_name,p_code from m_product ';
         SQLQuery1.Open;
               SQLQuery1.Open;
       i:=1;
       while not SQLQuery1.EOF do
        begin
        if i+1>StringGrid1.RowCount then StringGrid1.RowCount:=StringGrid1.RowCount+1;
//        s:= SQLQuery1.Fields[0].AsString;
//        StringGrid1.Cells[i+1,0]:=SQLQuery1.Fields[0].AsString;
        StringGrid1.Cells[1,i]:=SQLQuery1.FieldByName('p_name').AsString;
        StringGrid1.Cells[2,i]:=SQLQuery1.FieldByName('p_code').AsString;
        i:=i+1;
        SQLQuery1.Next;
        end;
        StringGrid1.RowCount:=i;

      SQLQuery1.Close;
      MySQL55Connection1.Close;
end;


end;

procedure TForm1.Button3Click(Sender: TObject);
var
  i:integer;
  s,sql:string;
begin
if not MySQL55Connection1.Connected then MySQL55Connection1.Open;
if MySQL55Connection1.Connected then begin
   SQLQuery1.DataBase := MySQL55Connection1;

   if not SQLTransaction1.Active then SQLTransaction1.StartTransaction;
   sql:='INSERT into m_product (p_name,p_code,update_date,create_date) VALUES';
   sql:=sql+'("'+edit3.Text+'","'+edit4.Text+'",now(),now())';

   MySQL55Connection1.ExecuteDirect(sql);
   SQLTransaction1.Commit;
    end;
    SQLQuery1.Close;
    Button2Click(Sender);
    MySQL55Connection1.Close;
end;

procedure TForm1.Button4Click(Sender: TObject);
var
  i:integer;
  s,sql:string;
begin
if not MySQL55Connection1.Connected then MySQL55Connection1.Open;
if MySQL55Connection1.Connected then begin
   SQLQuery1.DataBase := MySQL55Connection1;
   if not SQLTransaction1.Active then SQLTransaction1.StartTransaction;
   sql:='update  m_product set p_code="'+edit6.Text+'" where p_name = "'+edit5.Text+'"';
   MySQL55Connection1.ExecuteDirect(sql);
   SQLTransaction1.Commit;
    end;
    SQLQuery1.Close;
    Button2Click(Sender);
    MySQL55Connection1.Close;
end;


procedure TForm1.Button5Click(Sender: TObject);
var
  i:integer;
  s,sql:string;
begin
if not MySQL55Connection1.Connected then MySQL55Connection1.Open;
if MySQL55Connection1.Connected then begin
   SQLQuery1.DataBase := MySQL55Connection1;
   if not SQLTransaction1.Active then SQLTransaction1.StartTransaction;
   sql:='delete from  m_product where p_name = "'+edit7.Text+'"';
   MySQL55Connection1.ExecuteDirect(sql);
   SQLTransaction1.Commit;
    end;
    SQLQuery1.Close;
    edit8.Text:=sql;
    Button2Click(Sender);
    MySQL55Connection1.Close;

end;

procedure TForm1.Button6Click(Sender: TObject);
var
  i:integer;
  s,sql:string;
begin
if not MySQL55Connection1.Connected then MySQL55Connection1.Open;
if MySQL55Connection1.Connected then begin
   SQLQuery1.DataBase := MySQL55Connection1;
   if not SQLTransaction1.Active then SQLTransaction1.StartTransaction;
   sql:=' CREATE TABLE IF NOT EXISTS m_product ( ';
   sql:=sql+'product_id INT(11) NOT NULL AUTO_INCREMENT,';
   sql:=sql+'p_name VARCHAR(20) NOT NULL,';
   sql:=sql+'p_code VARCHAR(50) NOT NULL,';
   sql:=sql+'create_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,';
   sql:=sql+'update_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,';
   sql:=sql+'PRIMARY KEY ("product_id"))COLLATE="utf8mb4_general_ci" ENGINE=InnoDB ';
   MySQL55Connection1.ExecuteDirect(sql);
   SQLTransaction1.Commit;
    end;
    SQLQuery1.Close;
    edit8.Text:=sql;
    MySQL55Connection1.Close;

end;       

サンプルのDB

CREATE TABLE m_product (
	product_id INT(11) NOT NULL AUTO_INCREMENT,
	p_name VARCHAR(20) NOT NULL,
	p_code VARCHAR(50) NOT NULL,
	create_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
	update_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
	PRIMARY KEY ('product_id')
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;

SQLインジェクションは、未対応、修正が必要

参考
//http://www.366service.com/jp/qa/679747ee836bb2082ae2df224d6839ed

LazarusでJsonを扱ってみた

LazarusでJsonを扱ってみた

参考ページ
https://wiki.freepascal.org/fcl-json

ポイント
・jData : TJSONData;
jData := GetJSON(Json文字列);
 で取り込み、パースする
 例:jData.findpath(‘data’)
 データの取り込み時には、型変換(キャスト)する
 例:jData.findpath(‘data’).Items[i].FindPath(‘name’).AsString;
 配列は、Items[n]で、取り込む

プログラム
宣言部

uses
  ,fpjson,jsonparser; //追加

本体

procedure TForm1.FormCreate(Sender: TObject);
begin
  button1.Caption:='分析(エンコード)';
  button1.Width:=150;
  Memo1.Text:='{"data": [{"name":"abc"}, {"name":"def"},{"name":"hijk"}]}';
  StringGrid1.Cells[1,0]:='No';
  StringGrid1.Cells[2,0]:='name';
  StringGrid1.ColCount:=3;
  StringGrid1.ColWidths[0]:=40;
  StringGrid1.ColWidths[1]:=40;
  StringGrid1.RowCount:=2;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
    jData : TJSONData;
   i:integer;
begin
   // https://wiki.freepascal.org/fcl-json
   jData := GetJSON(Memo1.Text);
   StringGrid1.RowCount:=2;
   for i := 0 to jData.findpath('data').Count - 1 do
   begin
    if i+2>StringGrid1.RowCount then StringGrid1.RowCount:=StringGrid1.RowCount+1;
    StringGrid1.Cells[1,i+1]:=IntToStr(i+1);
    StringGrid1.Cells[2,i+1]:=jData.findpath('data').Items[i].FindPath('name').AsString;
   end;
end; 

LazarusでStringGridを使ってみた

LazarusでStringGridを使ってみた

参考ページ
https://www.petitmonte.com/bbs/answers?question_id=6229
http://delfusa.main.jp/delfusafloor/archive/www.nifty.ne.jp_forum_fdelphi/samples/00488.html

ポイント
行は
 ・Row
列は
 ・Col
幅を変えるのは
・StringGrid1.ColWidths[行]:=40;
行を追加するのは
 ・StringGrid1.RowCount:=・StringGrid1.RowCount+1;
セルは
 ・StringGrid1.Cells[列,行]:=’文字列’;
イベントは
 ・TForm1.StringGrid1Click(Sender: TObject);
表(StringGrid)を選択(クリックした時)行(Row)と列(Col)を利用できる
 ・TForm1.Edit1Change(Sender: TObject);
  入力欄(Edit1)の内容を変更した時

procedure TForm1.FormCreate(Sender: TObject);
begin
   StringGrid1.ColCount:=5;
   StringGrid1.RowCount:=5;

   StringGrid1.Cells[1,0]:='No';
   StringGrid1.Cells[2,0]:='data1';
   StringGrid1.Cells[3,0]:='data2';
   StringGrid1.Cells[4,0]:='data3';

   StringGrid1.Cells[1,1]:='1';
   StringGrid1.Cells[2,1]:='1-1';
   StringGrid1.Cells[3,1]:='1-2';
   StringGrid1.Cells[4,1]:='1-3';

   StringGrid1.Cells[1,2]:='2';
   StringGrid1.Cells[2,2]:='2-1';
   StringGrid1.Cells[3,2]:='2-2';
   StringGrid1.Cells[4,2]:='2-3';

   StringGrid1.Cells[1,3]:='3';
   StringGrid1.Cells[2,3]:='3-1';
   StringGrid1.Cells[3,3]:='3-2';
   StringGrid1.Cells[4,3]:='3-3';

   StringGrid1.Cells[1,4]:='4';
   StringGrid1.Cells[2,4]:='4-1';
   StringGrid1.Cells[3,4]:='4-2';
   StringGrid1.Cells[4,4]:='4-3';

   StringGrid1.ColWidths[0]:=40;
   StringGrid1.ColWidths[1]:=40;
   StringGrid1.ColWidths[2]:=80;
   StringGrid1.ColWidths[3]:=80;
   StringGrid1.ColWidths[4]:=100;
     with  StringGrid1  do
  begin
    Edit1.Text := Cells[1,Row];
    Edit2.Text := Cells[2,Row];
    Edit3.Text := Cells[3,Row];
  end;
  button1.Caption:='削除';
  button2.Caption:='挿入';
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  with  StringGrid1  do
   Cells[1,Row]:=Edit1.Text;
end;

procedure TForm1.Button1Click(Sender: TObject);
    var
      KeepTopRow, KeepRow: Integer;
      ARow: Integer;
    begin
    with  StringGrid1  do begin
      ARow:=Row;
      KeepRow := Row;
      KeepTopRow := TopRow;

      BeginUpdate;
      try
        DeleteRow(ARow);

        if RowCount > KeepRow then Row := KeepRow
        else Row := KeepRow - 1;
        TopRow := KeepTopRow;

        SetFocus;
      finally
        EndUpdate;
      end;
    end;
end;

procedure TForm1.Button2Click(Sender: TObject);
//var
//        i : Integer;
//        k : Integer;
//begin
// https://www.petitmonte.com/bbs/answers?question_id=6229
// http://delfusa.main.jp/delfusafloor/archive/www.nifty.ne.jp_forum_fdelphi/samples/00488.html
  var
     i,InsCount,InsAt:integer;
  begin
     InsCount:=1;
     InsAt:=StringGrid1.Row;
     with StringGrid1 do
     begin
        RowCount:=RowCount+InsCount;
        For i:=RowCount-1 downTo InsAt+InsCount do
        begin
           Rows[i].assign(Rows[i-InsCount]);
        end;
        For i:=InsAt to InsAt+InsCount-1 do
        begin
           Rows[i].clear;
        end;
     end;

end;

procedure TForm1.Edit2Change(Sender: TObject);
begin
  with  StringGrid1  do
   Cells[2,Row]:=Edit2.Text;
end;

procedure TForm1.Edit3Change(Sender: TObject);
begin
  with  StringGrid1  do
   Cells[3,Row]:=Edit3.Text;
end;

procedure TForm1.StringGrid1Click(Sender: TObject);
begin
  with  StringGrid1  do
  begin
    Edit1.Text := Cells[1,Row];
    Edit2.Text := Cells[2,Row];
    Edit3.Text := Cells[3,Row];
  end;
end;  

Lazarusでmemoを使ったファイルのロード、セーブをしてみた

Lazarusでmemoを使ったファイルのロード、セーブ

テキストをファイルに格納する場合
memoを使って行うと、内容が見えるのでわかりやすい
文章などを扱う場合には有効である

参考
http://www.osk.3web.ne.jp/~satou/delphi6.htm

ポイント
Memo1.Lines.LoadFromFile( FName );
Memo1.Lines.SaveToFile(FName);
で、Memo1とテキストファイルのロードセーブができる

procedure TForm1.FormCreate(Sender: TObject);
begin
  Button1.Caption:='save';
  Button2.Caption:='load';
end;

procedure TForm1.Button1Click(Sender: TObject);
var FName:string;
begin
  FName:='test.txt';
//  Memo1.Lines.LoadFromFile( FName );
  Memo1.Lines.SaveToFile(FName);
end;

procedure TForm1.Button2Click(Sender: TObject);
var FName:string;
begin
  FName:='test.txt';
  Memo1.Lines.LoadFromFile( FName );
//  Memo1.Lines.SaveToFile(FName);
end;
         

Lazarusでタイマーを使ってみた

Lazarusでタイマーを使ってみた

一定時間ごとに起動する仕組みを作ってみる

参考
http://www.w-frontier.com/delphi/2_timer.html

ポイント
Timer1.Enabled := True ;
 とすると、タイマーが起動される
timer1.Interval:=2000; //2秒間隔
 インターバル(間隔)の設定ができる  
時間になると
 TForm1.Timer1Timer
 が起動する

プログラム

変数設定

 private
    cu:integer;

プログラム本体

procedure TForm1.Button1Click(Sender: TObject);
begin
  cu:=0;
   if Button1.Caption = 'Start' then
begin
 Button1.Caption := 'Stop' ;
 Timer1.Enabled := True ;
end else
begin
 Button1.Caption := 'Start' ;
 Timer1.Enabled := False ;
 end ;
end ;

procedure TForm1.FormCreate(Sender: TObject);
begin
  button1.caption:='Start';
  timer1.Enabled:=False;
  timer1.Interval:=2000;
  edit1.Text:='0';
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 cu:=cu+1;
 edit1.Text:=IntToStr(cu);
end;
             

Lazarusでftp接続してみた

Lazarusでftp接続してみた

環境
Ubuntu 16.04 LT (VirtalBoxにて)
Lazarus 2.0.10

必要な情報
ftpサーバのアカウントとパスワード(x-sreverなどにて取得)

idFTP1.Host
idFTP1.Username
idFTP1.Password

実施した内容
1,ftpサーバへの接続
2,フォルダーリストの収集
3,ファイルのアップロード
4、ファイルのダウンロード
5、ファイルの削除
6、ファイル名の変更
7、ファイルの移動

手順
パッケージ「indy」を読み込む
パッケージ>OnlinePackageManager
IdFTP
を、設置

参考ページ
https://www.getlazarus.org/forums/viewtopic.php?t=51
http://mrxray.on.coocan.jp/Delphi/plSamples/773_Indy_FTPGetPut.htm

ポイント
1,ftpサーバへの接続
 ・パッケージindyのTIdFTPを利用
2,フォルダーリストの収集
 ・接続後 FTP.List、FTP.DirectoryListing.Items[i].FileName
   で、ファイル名を取得
3,ファイルのアップロード 
 ・ファイルパスを指定して FTP.Put(SourceFile, UpLoadFile)で実施
4、ファイルのダウンロード
 ・FTP.Getただし、ストリームで来るため、文字列変換などが必要
   FTP.Get(srcFile, Stream)
5、ファイルの削除
 ・ FTP.Delete(deldFile)で行う、
  ファイルがないときはexceptが発生してくれる
6、ファイル名の変更
 ・ FTP.Rename(LOldName,LName)で行う、
  ファイルがないときはexceptが発生してくれる
7、ファイルの移動
 ・ファイル名変更と同じ手順、変更先をパス指定で移動ができる

プログラム

procedure TForm1.Button1Click(Sender: TObject);
var
FTP:         TIdFTP;
begin
  FTP := TIdFTP.Create( nil );
  FTP.Host     := 'xxxx.xserver.jp';
  FTP.Username := 'xxxx@xxxx.xsrv.jp';
  FTP.Password := 'xxxx';
  try
    FTP.Connect;
  except
    FTP.Disconnect;
    MessageDlg('サーバの接続に失敗しました.', mtInformation, [mbOK], 0);
    exit;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
FTP:         TIdFTP;
i: integer;
LFileName:string;
begin
     FTP := TIdFTP.Create( nil );
     FTP.Host     := 'xxxx.xserver.jp';
     FTP.Username := 'xxxx@xxxx.xsrv.jp';
     FTP.Password := 'xxxx';
  try
    FTP.Connect;
    FTP.ChangeDir( '/' );
    FTP.List;
    for i := 0 to FTP.DirectoryListing.Count - 1 do begin
         LFileName := FTP.DirectoryListing.Items[i].FileName;
        //ファイル名が'.'または'..'の時は除外
        if (LFileName = '.') or (LFileName = '..') then Continue;
         Memo1.Append(LFileName)
         end;
  except
    Screen.Cursor := crDefault;
    FTP.Disconnect;
    MessageDlg('サーバの接続に失敗しました.', mtInformation, [mbOK], 0);
    exit;
  end;
end;

function StreamToString(Stream: TStream): string;
var
  ms: TMemoryStream;
begin
  Result := '';
  ms := TMemoryStream.Create;
  try
    ms.LoadFromStream(Stream);
    SetString(Result, PChar(ms.memory), ms.Size);
  finally
    ms.Free;
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
FTP:         TIdFTP;
i: integer;
ss,LFileName,SourceFile,UpLoadFile:string;
Stream : TMemoryStream;
begin
     FTP := TIdFTP.Create( nil );
     FTP.Host     := 'xxxx.xserver.jp';
     FTP.Username := 'xxxx@xxxx.xsrv.jp';
     FTP.Password := 'xxxx';
     SourceFile := '/home/kon009/lazarus/blog/ftp/test01.txt';  // アップロードするファイル名(クライアント:ローカル)
     UpLoadFile := '/test01.txt';    // アップロードするファイル名(サーバー上)
  try
    FTP.Connect;
    FTP.ChangeDir( '/' );
  except
    FTP.Disconnect;
    ShowMessage('FTP接続に失敗しました。');
    Exit;
  end;
    try
      FTP.Put(SourceFile, UpLoadFile);
      ShowMessage('アップロードしました')
    except
      ShowMessage('アップロードに失敗しました')
    end;
    FTP.Disconnect;
end;

procedure TForm1.Button4Click(Sender: TObject);
var
FTP:         TIdFTP;
i: integer;
ss,LFileName,srcFile,dstFile:string;
Stream : TMemoryStream;
begin
     FTP := TIdFTP.Create( nil );
     FTP.Host     := 'xxxx.xserver.jp';
     FTP.Username := 'xxxx@xxxx.xsrv.jp';
     FTP.Password := 'xxxx';
     srcFile := '/abc.json';    // 読み込むファイル名(サーバー上)
     dstFile := '/home/kon009/lazarus/blog/ftp/abc.json';  // 書き込むファイル名(クライアント:ローカル)
  try
    FTP.Connect;
    FTP.ChangeDir( '/' );
  except
    FTP.Disconnect;
    ShowMessage('FTP接続に失敗しました。');
    Exit;
  end;
  Stream := TMemoryStream.Create;
    try
        FTP.Get(srcFile, Stream);
      if (Stream.Size<>0) then
          begin
        Stream.SavetoFile(dstFile);
        ss:=StreamToString(Stream);
        memo1.Text:=ss;
          end
      else
        ShowMessage('ファイルが見つかりませんでした。');
    except
      ShowMessage('FTP接続に失敗しました。')
    end;
    Stream.free;
    FTP.Disconnect;
end;

procedure TForm1.Button5Click(Sender: TObject);
var
FTP:         TIdFTP;
ss,LFileName,srcFile,deldFile:string;
Stream : TMemoryStream;
begin
     FTP := TIdFTP.Create( nil );
     FTP.Host     := 'xxxx.xserver.jp';
     FTP.Username := 'xxxx@xxxx.xsrv.jp';
     FTP.Password := 'xxxx';
     deldFile := '/test01.txt';    // 削除するファイル名(サーバー上)
  try
    FTP.Connect;
    FTP.ChangeDir( '/' );
  except
    FTP.Disconnect;
    ShowMessage('FTP接続に失敗しました。');
    Exit;
  end;
  try
        FTP.Delete(deldFile);
        ShowMessage('ファイルを削除しました');
   except
      ShowMessage('削除に失敗しました。')
   end;
   FTP.Disconnect;
end;

procedure TForm1.Button6Click(Sender: TObject);
var
FTP:         TIdFTP;
ss,LFileName,LOldName,LName:string;
Stream : TMemoryStream;
begin
     FTP := TIdFTP.Create( nil );
     FTP.Host     := 'xxxx.xserver.jp';
     FTP.Username := 'xxxx@xxxx.xsrv.jp';
     FTP.Password := 'xxxx';
     LOldName := '/test01.txt';    // 変更前ファイル名(サーバー上)
     LName    := '/test02.txt';    // 変更後ファイル名(サーバー上)
  try
    FTP.Connect;
    FTP.ChangeDir( '/' );
  except
    FTP.Disconnect;
    ShowMessage('FTP接続に失敗しました。');
    Exit;
  end;
  try
        FTP.Rename(LOldName, LName);
        ShowMessage('ファイルを変更しました');
   except
      ShowMessage('変更に失敗しました。')
   end;
   FTP.Disconnect;
end;

procedure TForm1.Button7Click(Sender: TObject);
var
FTP:         TIdFTP;
ss,LFileName,LOldName,LName:string;
Stream : TMemoryStream;
begin
     FTP := TIdFTP.Create( nil );
     FTP.Host     := 'xxxx.xserver.jp';
     FTP.Username := 'xxxx@xxxx.xsrv.jp';
     FTP.Password := 'xxxx';
     LOldName := '/test01.txt';    // 移動前ファイル名(サーバー上)
     LName    := '/dja/test01.txt';    // 移動後ファイル名(サーバー上)
  try
    FTP.Connect;
    FTP.ChangeDir( '/' );
  except
    FTP.Disconnect;
    ShowMessage('FTP接続に失敗しました。');
    Exit;
  end;
  try
        FTP.Rename(LOldName, LName);
        ShowMessage('ファイルを移動しました');
   except
      ShowMessage('移動に失敗しました。')
   end;
   FTP.Disconnect;
end;         

Lazarusでメール送信

Lazarusでメール送信してみた

環境
Ubuntu 16.04 LT (VirtalBoxにて)
Lazarus 2.0.10

手順
パッケージ「indy」を読み込む
パッケージ>OnlinePackageManager

検索
indy
Indy10にチェック
install
From repository

参考
http://oto.chu.jp/a.oto.chu.jp/kujira/text/delphi/mail/sendmail.htm
https://www.migaro.co.jp/contents/support/technical_report_search/no06/tech/06_01_04.pdf
https://www.petitmonte.com/bbs/answers?question_id=29625

必要な情報
メールサーバのアカウントとパスワード(x-sreverなどにて取得)

smtp.HOST:=’svxxxx.xserver.jp’;
smtp.PORT:=587;
smtp.Username:=’xxx@xxx.jp’;
smtp.Password:=’xxxxx’;

IdIMAP4,IdSMTP, IdSSLOpenSSL, IdMessage
を、設置

プログラム

var
smtp: TIdSMTP;
msg : TIdMessage;

begin
//*** 変数を初期化する ***/
smtp := nil;
msg := nil;
try
try
smtp := TIdSMTP.Create(nil);
smtp.HOST:=’xxxx.xserver.jp’;
smtp.PORT:=587;
smtp.Username:=’xxxx@xxxxx.com’;
smtp.Password:=’xxxx’;
smtp.Connect;
//*=== メッセージオブジェクトの作成 ===*/
msg := TIdMessage.Create(smtp);
msg.Subject := ‘Subject’;
msg.From.Name := ‘Name’;
msg.From.Address := ‘xxxxxx@gmail.com’;
msg.Recipients.EMailAddresses := ‘xxxxxx@gmail.com’;
msg.Body.Text := ‘Text’;

//*=== メール送信 ===*/
smtp.Send(msg);
except
// Result := False; // 異常終了
end;
finally
//*=== メッセージオブジェクトの破棄 ===*/
if msg <> nil then msg.Free;

//*=== SMTPサーバの切断 ===*/
if smtp <> nil then
begin
smtp.Disconnect;
smtp.Free;
end;

end;
end;

無事送信できました

Conoha VPS Ubuntu16 GUI

Conoha VPS Ubuntu16 GUI環境を構築

環境の選択

東京
2GB
Ubuntu 16.04 (64bit)

パスワード
ネームタグ変更

rootのパスワードを設定し

オプション ssh key

起動したら、IPを調べ

ssh -i /home/xxx/key-xxx-xx-xx-xx-xx.pem root@xx.xx.xx

で、端末に入る

root
XXXXパスワードでログイン

apt-get update
apt-get upgrade
Could not get lock /var/lib/dpkg/lock-frontend

のエラーがでたら

sudo rm /var/lib/apt/lists/lock
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock-frontend
sudo rm /var/lib/dpkg/lock

などで回避(一度に行わず、1行づつ確認)

たまに、問い合わせがあるが(y)で、回答

ポップアップ画面で問い合わせがでるが
そのまま「TAB」でOK

apt-get upgrade
の途中で、一度画面が切れたら
再度、ログインしなおし

アカウント作成

adduser xxx

Enter password
Retype password

sudoを使えるようにする

usermod -G sudo xxxxxx

ユーザに切り替える

su - xxx

sudoが使えるか調べる

sudo ls /
sudo tasksel

Ubuntu Desktop
をスペースで選択しTABでOKをリターン
(Ubuntu Cloud Image (instance) に入っているチェックはそのまま)

設定がはじまる

設定が完了したら

sudo sh -c 'echo 127.0.1.1 $(hostname) >> /etc/hosts'
sudo reboot

画面がリセットされた場合は
再度ログイン

データのやり取り
端末は

ssh -i /home/xxx/key-2015-xx-xx-xx-xx.pem root@150.xx.xx.xx
sftp -i /home/xxx/key-2015-xx-xx-xx-xx.pem root@150.xx.xx.xx
cd /home/xxx

Python環境を構築

$ python -V
Python 2.7.12

$ python3 -V
Python 3.5.2
python3 -m venv env

エラーにが出た場合は、メッセージに従い

apt-get install python3-venv

仮想環境構築の有効化

python3 -m venv env
source env/bin/activate

seleniumを組み込んでみる

pip install selenium

サンプルを起動

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time

def main():
    print ('start_main')
    browser = webdriver.Chrome('/usr/lib/chromium-browser/chromedriver')
    time.sleep(5)
    browser.get('https://google.co.jp')
    time.sleep(4)
    print ('end_main')

main()
print ('end')

chromedriver エラーになる

chromedriverの場所を探す

 sudo find ./ -name chromedriver
#   browser = webdriver.Chrome('/usr/lib/chromium-browser/chromedriver')
   browser = webdriver.Chrome('/home/kon/env/lib/python3.5/site-packages/chromedriver')
Message 'chromedriver' executable may have wrong permissions. Please see https://sites.google.com/a/chromium.org/chromedriver/home

https://sites.google.com/a/chromium.org/chromedriver/home

から、ドライバーをダウンロード

chromedriver_linux64.zip

解凍し、フォルダーをドライバーとして指定

unzip chromedriver_linux64.zip

# browser = webdriver.Chrome(‘/usr/lib/chromium-browser/chromedriver’)
# browser = webdriver.Chrome(‘/home/kon/env/lib/python3.5/site-packages/chromedriver’)

browser = webdriver.Chrome(‘/home/kon/Downloads/chromedriver’)

に、変更、でうまく行った。
設置場所は後で、変更しておこう

参考
Chromeのバージンと合わせる方法として

pip install chromedriver-binary==xx.x.xxx.xx

にて、インストールする方法がある

https://qiita.com/hanzawak/items/2ab4d2a333d6be6ac760

各種バージョンのドライバは

https://sites.google.com/a/chromium.org/chromedriver/home
https://chromedriver.storage.googleapis.com/index.html

Chromeをヴァージョンアップする方法は

sudo apt-get --only-upgrade install google-chrome-stable

参考
https://qastack.jp/superuser/130260/how-to-update-google-chrome-in-ubuntu

問題がなければ、
最新のChromeにバージョンアップしてそれにあった
Driverを入れるといい

ubuntu14 にlazarusをインストール

ubuntu14 にlazarusをインストールしてみました。

http://je7tsc.blogspot.com/2019/01/ubuntu17lazarusinstall.html
を、参考にしましたが

https://www.lazarus-ide.org/
からのDownloadNowより

lazarus-project
fpc-src
fpc-laz
を、ダウンロード
lazarus-project_2.0.10-0_amd64.deb
fpc-src_3.2.0-1_amd64.deb
fpc-laz_3.2.0-1_amd64.deb

となっていました。

フォルダーを作り、ダウンロードしたものを移動

cd
mkdir lazarus
cd lazarus

sudo dpkg -i lazarus-project_2.0.10-0_amd64.deb
sudo dpkg -i fpc-src_3.2.0-1_amd64.deb
sudo dpkg -i fpc-laz_3.2.0-1_amd64.deb

にて、インストール

sudo apt-get install build-essential
sudo apt-get install libgtk2.0-dev
を、しておいたが、不要だったかもしてません。

startlazarus
で、起動

ボタンを配置して
ダブルクリックをして

begin
Button1.caption := ‘lazarus’;
end;

として、実行してみましょう(beginとend;は、記述済)

参考の

sudo apt install ./lazarus-project_2.0.10-0_amd64.deb
sudo apt install ./fpc-src_3.2.0-1_amd64.deb
sudo apt install ./fpc-laz_3.2.0-1_amd64.deb

が、うまくいきませんでした。

再度
sudo apt-get install build-essential
なしで行った時

linker: /usr/bin/ld: -lcairo が見つかりません
などのエラーがでた

sudo apt-get install build-essential
をしたら、エラーが出て、メッセージに従い
sudo apt-get -f install
をおこなったらインストールできた

再起動したら、コンパイルができた
sudo apt-get install build-essential
は、必要のようだ。

Djangoで外部DB(Mysql)に接続 django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module 対策

DjangoのDBをSqligthからMysqlへ切り替える

ローカルではうまくいくのに、サーバで切り替えがうまく行かない

migrateを実施してみたら
Mysqlが入っているのに

django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module
と、エラーが出る

Django: 解決法 Error loading MySQLdb module.


を、参考にして
対策したらうまくいった

切り替えの流れ

■Settingを変更
https://docs.djangoproject.com/en/1.11/ref/settings/#databases
を、参考にDBを追加

DATABASES = {
‘default’: {
‘ENGINE’: ‘django.db.backends.postgresql’,
‘NAME’: ‘mydatabase’,
‘USER’: ‘mydatabaseuser’,
‘PASSWORD’: ‘mypassword’,
‘HOST’: ‘xxx.xxx.xxx.xxx’,
‘PORT’: ‘3306’,
}
}

WSGI_APPLICATIONの設定をDATABASESの前に追加
WSGI_APPLICATION = ‘[app_name].wsgi.application’

■Mysqlライブラリーを追加
pip install pymysql

■migrateを実施
python manage.py makemigrations
python manage.py migrate

ローカルでできたが、サーバ端末でエラー
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?

Django: 解決法 Error loading MySQLdb module.


を、参考にして
app_root_folder/app_name/__init__.py
へ、
import pymysql
pymysql.install_as_MySQLdb()
を、追加

無事切り替え完了