単純なコードで背景色にグラデーション。

単純なコードで背景色にグラデーションつける。
このコード自体は単純なコードです、ですが・・・。
気に食わないので何度も初期の色コードを設定を変えてみたのですが
鮮やかさがでません。ちょっとドス黒いグラデーションのまま。

コードを貼り付けておきます。
一時間ぐらい色を変えて遊んでました:D

See the Pen 単純なコードで背景色にグラデーション。 by taoka (@taoka-toshiaki) on CodePen.0

 

オブジェクト指向を勉強するのに最適なのは

オブジェクト指向を勉強するのに最適なのはjavaのような気がする。
C言語で理解するというのはベタなのかもしれないけれど、
javaが最適化と思ったりする。

javaとjavascriptとは全然違うけれど、javascriptもかなり
ゴリゴリ書こうと思えば書けます。

プログラムをどこから学べ良いだろうかと悩んでいる方は
ソフトウェア系ならjava、Web系ならjavascriptが良いじゃないだろうか。


仕事でコードのレベルを上げるべきなのかというのは
人それぞれ考え方が違うかもしれないけれど、人が多ければ多いほど
平均に合わさないといけないのではないだろうかと思うのです。

これ本当に大事なことなんです。
訳のわからないコードは負の遺産に他ならない。
自分は他人のコードを見て大体の平均に合わせて書いているつもりです。
新人が入社してきてもそれまで勉強してきたことで
理解できるレベルでコードを書いている。

なのであまりコメントは書かない。
修正に修正を加えたコードを見ているとこれは直すべきだと思う人も
いると思う、昔はそう考えていた時もあったけれど
今はそれで良いじゃないだろうかと思っています。

何故かといえば、処理がかなりの遅延になっていれば
それは直さないといけないけれど、そうではない場合は
わざわざ直す必要はないと教えられてきたこともあり
直さない。先人に敬意を払うということだ。

言語のバージョンによって直さないといけない箇所は
出てきます、そういう箇所は修正しないといけないかもしれないが
そうではない場合、直さなくて良いが
答えではないだろうか。

来週からコードサンプルに戻ります。


 

PHP忘れてしまいそう。

こういう書き方とか書かなかったら忘れてしまいそうですね。
クラスの多重継承とか職場ではそもそもしない。Functionで十分な感じで
この頃、ろくなコードを書いていません。FunctionからFunctionへなんて
コードを書いてたりしています。

 

<?php

function demo1(int $val=0):int
{
    return 3 * 3 * $val;
}

print demo1(3);


class demo2
{
    public static function test1():string
    {
        return "ABC";
    }
}

$demo2  = "demo2";
print $demo2::test1();


trait demo3
{
    public static function test2($val=""){
        return $val;
    }
    
}

class demo4 
{
    public static function test3($val = "")
    {
        return $val;
    }
}

class demo5 extends demo4
{
    use demo3;
    public static function test4($val = "")
    {
        return $val;
    }
}

$demo5 = 'demo5';
print $demo5::test2(1);
print $demo5::test3(2);
print $demo5::test4(3);

PHPで怒られる怒られない。

PHPで怒られる書き方と怒られない書き方です。
下記のコードを参照ください。

<?php

class demo_php1{

    function demo1($val=""){
        return $val;
    }

    public function demo2($val=""){
        return $val;
    }

    static function demo3($val=""){
        return $val;
    }
}

print demo_php1::demo1("DEMO1\n");
print demo_php1::demo2("DEMO2\n");
print demo_php1::demo3("DEMO3\n");

下記のようにインスタンス(instance)すればこのコードはすべて怒られないです
それだけの違い。ちなみにdemo3は怒られない書き方です。

オブジェクトを単体で使う場合は気をつけましょう。
PHPのバージョンアップするにつれjavaのような動きになってきています。
PHP、Pythonに負けないようにかこの頃開発が活発化してます。
最新はPHP7.4ですからね・・・。

$demo_php1 = new demo_php1();
print $demo_php1->demo1("DEMO1\n");
print $demo_php1->demo2("DEMO2\n");
print $demo_php1->demo3("DEMO3\n");

VBAオブジェクトを自動生成しイベントを付与する。

VBAオブジェクトを自動生成しイベントを付与する。
サンプルコードです。

ダウンロードはこちら
https://zip358.com/tool/sample.zip

Dim chg_class(0 To 5) As chg
Public Sub objset()
Dim obj_ctl As Control
Dim i As Integer
For i = LBound(chg_class) To UBound(chg_class)

    Set obj_ctl = UserForm1.Controls.Add("Forms.TextBox.1", "Box" & i)
    obj_ctl.Top = 10 + 20 * i
    obj_ctl.Width = 200
    obj_ctl.Height = 20
    obj_ctl.Text = "ここを変更してみて、またはダブルクリック(" & i & "番)"

    Set chg_class(i) = New chg
    chg_class(i).set_evn obj_ctl, i
    Set obj_ctl = Nothing
Next i
End Sub
Private WithEvents TextB As MSForms.TextBox
Private index_no As Integer
Public Sub set_evn(hoge_obj As MSForms.TextBox, hoge As Integer)
    Set TextB = hoge_obj
    index_no = hoge
End Sub
Private Sub TextB_Change()
    MsgBox TextB.Text 'UserForm1("Box" & index_no)
End Sub

Private Sub TextB_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    MsgBox TextB.Text 'UserForm1("Box" & index_no)
End Sub
Private Sub TextBox1_Change()
MsgBox TextBox1
End Sub

Private Sub CommandButton1_Click()

End Sub

Private Sub UserForm_Click()

End Sub

年賀状CSVを作りました。SJISで保存してください。

https://zip358.com/tool/nenga/

ブラウザ上で完結しています。
禁則処理などはありません、ただ純粋に入力したものが
CSV形式の文字列で出力されます。

これ何のために使えるかといえば
https://nenga.yu-bin.jp/

こちらのサイトで住所録を登録する際に使用できます。

タイトルにも描きましたがSJISの文字コードで出力をお願い致します、
また、データベースに保持などはしていないため
リロードしてしまうと全てのデータが消えてしまいます。

これを作った経緯。
自分が郵便年賀.jpで登録するのが面倒だったため作りました。

DropFTPを配布。

ドップして一つのファイルを転送するソフトを作りました。
こんなのどうしているのかと疑問を持つ人もいると思いますが
業務上、こんなソフトが要るという会社などもいるのではないかと
思いで作りました。

ダウンロードはこちらから
https://zip358.com/tool/DropFTP.zip

ソースコードは下記になります。
※FTP部分はWinSCPのライブラリを使用しています。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WinSCP;

namespace dropFTP
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void upbtn_Click(object sender, EventArgs e)
        {

            String err = "";

            if (hostText.Text == "") {
                err += "ホスト名が設定されていません\n";
            }

            if (idText.Text == "")
            {
                err += "IDが設定されていません\n";
            }

            if (passText.Text == "")
            {
                err += "passが設定されていません\n";
            }

            if (remText.Text == "")
            {
                err += "アップロード場所が設定されていません\n";
            }

            if (uplab.Text == "")
            {
                err += "アップロードファイルが設定されていません\n";
            }

            var RadioGroup = groupFTP.Controls.OfType<RadioButton>().SingleOrDefault(rb => rb.Checked == true);
            if (RadioGroup == null) {
                err += "アップロード環境が設定されていません\n";
            }

            if (err != "")
            {
                MessageBox.Show(err);
            }
            else {
                if (RadioGroup.Text == "FTP") {
                    upFTP();
                }
                if (RadioGroup.Text == "SFTP")
                {
                    upSFTP();
                }

            }
        }

            private int upFTP() {
            try
            {
                // Setup session options
                SessionOptions sessionOptions = new SessionOptions
                {
                    Protocol = Protocol.Ftp,
                    HostName = hostText.Text,
                    UserName = idText.Text,
                    Password = passText.Text,
                    PortNumber =int.Parse(portText.Text)
                };

                using (Session session = new Session())
                {
                    // Connect
                    session.Open(sessionOptions);

                    // Upload files
                    TransferOptions transferOptions = new TransferOptions();
                    transferOptions.TransferMode = TransferMode.Binary;

                    TransferOperationResult transferResult;
                    if (remText.Text.EndsWith("/"))
                    {
                        transferResult = session.PutFiles(@uplab.Text, remText.Text, false, transferOptions);
                    }
                    else
                    {
                        transferResult = session.PutFiles(@uplab.Text, remText.Text + "/", false, transferOptions);
                    }
                    // Throw on any error
                    transferResult.Check();

                    // Print results
                    foreach (TransferEventArgs transfer in transferResult.Transfers)
                    {
                        MessageBox.Show("アップロードしました");
                    }
                }

                return 0;
            }
            catch (Exception e)
            {

                MessageBox.Show("Error: {0}" + e);
                return 1;
            }

        }
        private int upSFTP()
            {
                try
                {
                    // Setup session options
                    SessionOptions sessionOptions = new SessionOptions
                    {
                        Protocol = Protocol.Sftp,
                        HostName = hostText.Text,
                        UserName = idText.Text,
                        Password = passText.Text,
                        PortNumber = int.Parse(portText.Text),
                        GiveUpSecurityAndAcceptAnySshHostKey = true
                    };

                using (Session session = new Session())
                {
                    // Connect
                    session.Open(sessionOptions);

                    // Upload files
                    TransferOptions transferOptions = new TransferOptions();
                    transferOptions.TransferMode = TransferMode.Binary;

                    TransferOperationResult transferResult;
                    if (remText.Text.EndsWith("/")) { 
                        transferResult = session.PutFiles(@uplab.Text, remText.Text, false, transferOptions);
                    } else { 
                        transferResult = session.PutFiles(@uplab.Text, remText.Text + "/", false, transferOptions);
                    }
                        // Throw on any error
                        transferResult.Check();

                        // Print results
                        foreach (TransferEventArgs transfer in transferResult.Transfers)
                        {
                        MessageBox.Show("アップロードしました");
                        }
                    }

                    return 0;
                }
                catch (Exception e)
                {

                    MessageBox.Show("Error: {0}" + e);
                    return 1;
                }

            }

            private void Form1_DragDrop(object sender, DragEventArgs e) {
            //e.Effect = DragDropEffects.Copy;
            string[] fileName = (string[])e.Data.GetData(DataFormats.FileDrop, false);
            uplab.Text = fileName[0];

        }

        private void Form1_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.Copy;
        }

        private void radioSFTP_CheckedChanged(object sender, EventArgs e)
        {
            portText.Text = "22";
        }

        private void radioFTP_CheckedChanged(object sender, EventArgs e)
        {
            portText.Text = "21";
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.FormBorderStyle = FormBorderStyle.FixedSingle;
            this.MaximumSize = this.Size;
            this.MinimumSize = this.Size;
        }
    }


}

さくらレンタルサーバーとかで制限以上のクロンタブ(crontab)を使う方法。

さくらレンタルサーバーとかで制限以上のクロンタブ(crontab)を使う方法
10年ぐらいまえのコードを見直して改善したコードが下記になります。
10年前はクラスを使わない方法で構築したのだけど、今回はクラスの概念を
使って構築。ここ何年かで自分のコーディングの技術は上がっているかといえば
そうでもないですが、昔よりかは技術の幅は広がっていると思いたいw
※qiita日付は数年前にUPしたのですけど、コード自体は10年前のコードです。

 

<?php
//五分置きのクロンを走らせてください。
//php5.6以上推奨? エラーの場合:explodeを見直してください 
class cronphp2{
    
    public $set = array(
            array("file"=>"/home/tool/test1.php","year"=>"*","month"=>"*","day"=>"*","hour"=>"*","minute"=>"*"),
            array("file"=>"/home/tool/test2.php","year"=>"2018","month"=>"7","day"=>"7","hour"=>"*","minute"=>"*/10"),
            array("file"=>"/home/tool/test3.php","year"=>"*","month"=>"*","day"=>"7","hour"=>"7","minute"=>"7")
        );
    
    
    function __construct(){
        if(is_array($this->set)){
            foreach ($this->set as $key => $value) {
  
                    if(!$this->chk($value["year"],"year"))continue;
                    if(!$this->chk($value["month"],"month"))continue;
                    if(!$this->chk($value["day"],"day"))continue;
                    if(!$this->chk($value["hour"],"hour"))continue;
                    if(!$this->chk($value["minute"],"minute"))continue;
                    if(!$value["file"])continue;       
                    $h = @shell_exec("/usr/local/bin/php -f ",$value["file"]);
                    print $value["file"];
                    var_dump($h);
                
            }
        }
    } 
    
    function chk($q1="",$q2=""){

        if(!$q1)return false;
        if(!$q2)return false;
        switch ($q2) {
            case "year":
            case "month":                
            case "day":   
                $ren = array("year"=>"Y","month"=>"n","day"=>"j");
                if($q1==="*"){return true;}
                if(is_numeric($q1)){
                    if((int)$q1 == date($ren[$q2])){return true;}
                }else{
                    return false;
                }
                break;
           case "hour":
           case "minute":
                $ren = array("hour"=>"H","minute"=>"i");
                if($q1==="*"){return true;}
                if(is_numeric($q1)){
                    if((int)$q1 == date($ren[$q2])){
                        return true;
                    }else{
                        return false;
                    }
                }else{
                    if(preg_match("/\*\//",$q1)){
                        $q = explode("*/",$q1)[1];
                        if(date($ren[$q2])%(int)$q==0){
                            return true;
                        }else{
                            return false;
                        }                       
                    }
                    return false;
                }
                break;
            default:
                return false;
                break;
        }
        
        return false;
     }
}
$crn = new cronphp2();