昨日は仕事初めでした。

昨日は仕事初めでした。
帰ってきてからAM1:00に寝たんだけどAM4:00に起きて
しまう始末…いまいち、体の体調が良くないです。
寝ないといけないけど、帰ってきてからサーバとかゴニョゴニョしてました。

 

可変長引数リストって忘れがちやな。

 

<?php
function hoge(...$hoge) {
     foreach($hoge as $key=>$val){
        sprintf("key = %02d val = %02d",$key,$val);
     }
}

hoge(1);
hoge(1,3,2);

//アンパック
function hoge2($i, $ii) {
    return $i + $ii;
}

$hoge3 = [3, 3];
echo hoge2(...$hoge3);

 

残業したくない自分ですが、仕事に追われています・・・。
なぜに8月に仕事がこんなに山積みなんだと・・・凹んでいます。

今日は可変長引数リストのことについて。
可変長引数リストって使わなかったら忘れがちやな事ですよね?
引数の変数が可変する、ですから可変長引数リスト!?
簡単ですね・・・。

javascriptにもあります。

ES6からPHPと同じ様になっているそうです。
ES6ってChrome42ぐらいからかな。たぶんIEとかでは使用できないのかも。

クックパッドの開発者ブログにやり方書いてます。
https://techlife.cookpad.com/entry/2015/02/02/094607

余談:
PHP5.6からPHP7へ移行している時代かもしれないですが
まだまだレガシーコードで動いているサイトもあると思います。

いや結構あると思います、改修したくても出来ない・・・。
そして新たなレガシーコードみたいなのを生んでいる自分もいます。

なぜ、レガシーコードみたいなのでコード書くのかという理由は
「平均的なコードだから」です。
高知県は特にレガシーコードみたいなのが多い気がします。
言語ってバージョンが上がれば
使われない関数とかセキュリティが甘い関数などは
推奨から非推奨移行して最後は使用不可に
なりますよね・・・あれってどうにかならないものなのか。

そしてライブラリ使っていたりすると破滅的なダメージになります。
そういう面ではJSのライブラリは持ちが良い気がします。

改修したくても・・・時間がない。

 

Gmail未読一括既読、最終形態みたいなものです。

Gmail未読一括既読、最終形態みたいなものです。
どうぞ、お使いください。
前回のプログラムをトリガー呼び出すと下記のエラーが表示されますが
今回のコードを実行してもプログラムエラーは表示されません。
よって未読メールから既読メールになります。

[object Object] を (class) に変換できません。

前回のコードはこちらです。
見比べてみると違いがわかると思います、
ちなみにエラーで落ちていた所は、3行目になります。

function gmailbat () {
  gm = GmailApp.search("is:unread"); 

  if(gm.length){
    gm.forEach(function(m,i,a){
      if(m.isUnread()){
        m.markRead();
      }
    });
  }

  if(gm.length==500){
      return gmailbat();
  }
  return true;
}

 

逃げるは恥だが役に立つグーグル画像検索ダウンロードコンソールアプリ

グーグル画像検索ダウンロードコンソールアプリを作ってみました。
へっぽこソースはこちら

using System;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.IO;

namespace google_img_get
{
    class Program
    {
        static void Main(string[] args)
        {
            gurl();
        }

        static void gurl() {

            string url = "https://www.google.co.jp/search?tbm=isch&biw=1920&bih=957";
            string htmlSource = "";
            Boolean flg = true;
            try
            {
                //コマンドライン引数を配列で取得する
                string[] cmds = System.Environment.GetCommandLineArgs();
                if (cmds.Length == 2)
                {
                    url = url + "&q=" + cmds[1] + "&oq=" + cmds[1];
                    flg = false;
                }

                if (flg)
                {
                    Console.ForegroundColor = ConsoleColor.Cyan;
                    Console.WriteLine("***** google画像検索&ダウンロード少しw キーワードを入力してください *****");
                    Console.ForegroundColor = ConsoleColor.White;
                    string hoge= Console.ReadLine();
                    url = url + "&q=" + hoge + "&oq=" + hoge;
                 }

                

                if (url != "")
                {
                    Console.WriteLine("***** google check *****");
                    htmlSource = gsource(url);
                    Console.WriteLine(htmlSource);
                    string img = "\"ou\":\"(?<text>https?.*?)\"";
                    Regex reimg = new Regex(img, RegexOptions.IgnoreCase | RegexOptions.Singleline);
                    for (Match m = reimg.Match(htmlSource); m.Success; m = m.NextMatch())
                    {
                        char[] cc = { '"', '\'' };
                        string u = m.Groups["text"].Value;
                        u = u.Trim(cc);
                        string[] exte = u.Split('.');
                        string gexte = "";
                        if (Regex.IsMatch(exte[exte.Length - 1].ToLowerInvariant(),"jpge")) {
                            gexte = "jpg";
                        }
                        if (Regex.IsMatch(exte[exte.Length - 1].ToLowerInvariant(), "jpg"))
                        {
                            gexte = "jpg";
                        }
                        if (Regex.IsMatch(exte[exte.Length - 1].ToLowerInvariant(), "gif"))
                        {
                            gexte = "gif";
                        }
                        if (Regex.IsMatch(exte[exte.Length - 1].ToLowerInvariant(), "png"))
                        {
                            gexte = "png";
                        }

                        Console.ForegroundColor = ConsoleColor.DarkGreen;
                        Console.WriteLine("***** " + u + " *****");
                        if (gexte != "")
                        {
                            int ihoge = new Random(100).Next(100) * 100;
                            Console.WriteLine(media(u, gexte));
                            System.Threading.Thread.Sleep(ihoge);
                        }

                    }
                }
                gurl();
            }

            catch (Exception e)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("***** " + e.Message + " *****");
                gurl();
            }
        }

        static string gsource(string url) {
            string htmlSource = "";

            WebClient client = new WebClient();
            client.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36");
            Stream st = client.OpenRead(url);
            Encoding enc = Encoding.GetEncoding("UTF-8");
            StreamReader sr = new StreamReader(st, enc);
            htmlSource = sr.ReadToEnd();
            sr.Close();
            st.Close();
            client.Dispose();

            return htmlSource;

        }

        static string media(string url, string exte)
        {
            // カレントディレクトリを取得する
            string nowstr = DateTime.Now.ToString("yyyyMMddHHmmss");
            string stCurrentDir = Directory.GetCurrentDirectory();
            WebClient wc = new WebClient();
            wc.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36");
            @wc.DownloadFile(url, @stCurrentDir + "\\webcmd" + nowstr + "." + exte);
            wc.Dispose();
          
            return "***** " + "Success!! [webcmd" + nowstr + "." + exte + "] *****";
        }
    }

}

 

コンソールアプリ軽量で動作が機敏なので良いかなと
これを使用していているとリモートサーバーから怒られることが
あるのでお気をつけください。リモートサーバー=プロバイダと認識しています。
あまりにも立て続けにダウンロードしていると400エラーになり
処理が途中で中断してしまいます。

何故、そうなるのかはお察しください。

回避策のため、ランダムタイマーで一旦処理を停止しながら
ダウンロードを行っているので微妙に遅い。

これを改良してもっとより良いものを
作ってくれる有志が入れば有り難いです、GitHubにも
公開していますので改良してもらうと有り難いです。

その他、コンソールアプリの詰め合わせzipを置いときますので
ご自由にご使用いただければと思っています。
法的にまずい使い方は行わないでください。

https://warera-web.com/tool/web.zip

 

googleメールを指定時間に既読にするには

https://script.google.com/home

まず、上記でスプリントを作り、gmailと連携した後。
矢印の時計マークをクリックします。

そうするとトリガー作成しますかみたいな文言が表示されるので
クリックし指定の時間を設定します。

そうすることで、指定の時間になれば毎日メールは
既読になります。

(※ならないです・・・という方は見直しが必要です、
下記はあくまでもヒントです。

余談:
自分の場合、殆ど読まないメールが大半なので
重要なメールに目を通して、後は指定の時間にグーグルスプリクトで
既読する方法を選びました。

function gmailbat(q) {
  q = !q?0:q;
  var gm = GmailApp.search("is:unread",q,500);
  var flg = false;
  gm.forEach(function(m,i,a){
    if(m.isUnread()){
        m.markRead();
        flg = true;
    }
  });

  if(flg){
      q = q+500;
      return gmailbat(q);
  }
  return true;
}

 

C# でYOUTUBEダウンロードもどきを作ってみました。

C# でYOUTUBEダウンロードもどきを作ってみました。
ライブラリを使用しているので、結局、楽に作れるわけです。
ホントに有り難いものです。YOUTUBEやニコニコ動画をダウンロードする
ソフトが売られていますけど、おそらくソフトウェアプログラマーは
買うことはないだろうなと言う印象を作ってみて思いましたね。

そしてアプリのブラウザから検索(YOUTUBE)すると
ブロッキングされるという事を知りました。
(もしかしたら、以前作ったフェイスブックの履歴削除アプリも
もう使用できなくなっているかもしれないなと・・・。)

なので、対策としてアドレス入力し【表示する】buttonを押下後、
【ダウンロードする】を押さないとダウンロード出来ない仕様に変更してます。

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 System.Text.RegularExpressions;
using VideoLibrary;

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

        private void button1_Click(object sender, EventArgs e)
        {
            webBrowser1.Navigate(textBox1.Text);
            button1.Visible = false;
            Application.DoEvents();
            string pat = @"\?v=([^&]+)";
            string YouTubeid = textBox1.Text;
            Regex r = new Regex(pat, RegexOptions.IgnoreCase);
            Match m = r.Match(YouTubeid);
            string Yid = m.Groups[1].ToString();
            if (Yid != "")
            {
                progressBar1.Style = ProgressBarStyle.Marquee;
                progressBar1.MarqueeAnimationSpeed = 50;
                var VedioUrl = "https://www.youtube.com/embed/" + Yid + ".mp4";
                var youTube = YouTube.Default;
                var video = youTube.GetVideo(VedioUrl);
                System.IO.File.WriteAllBytes(video.FullName + ".mp4", video.GetBytes());

            }
            progressBar1.Style = ProgressBarStyle.Blocks;
            progressBar1.Value = 100;
            button1.Visible = true;
        }

 
        private void button2_Click(object sender, EventArgs e)
        {
            webBrowser1.Navigate(textBox1.Text);
        }

  
        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {

        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

 

 

 

たった数行のプログラムでドツボにはまる。

<?php
$command = "ls -m img";


exec($command,$val,$chk);
//imglist

$imglist = explode(",",implode("",$val));
if(is_array($imglist)){
    foreach ($imglist as $key => $value) {
        
//        $ch = curl_init(); // 初期化
//        curl_setopt( $ch, CURLOPT_URL, "https://warera-web.com/tool/imglist/img/".$value );//URLの設定
//        curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); // 出力内容を受け取る設定
//        $result = curl_exec( $ch ); // データの取得
//        curl_close($ch); // cURLのクローズ
//        $img64[$key] = base64_encode($result);
        
        $img64[$key] = base64_encode(file_get_contents("img/".trim($value)));
        $path_parts = pathinfo($value);
        $path_parts['extension']=="jpeg"?"jpg":$path_parts['extension'];
?>
<div><a href="./img/<?=trim($value)?>"><?=$value?></a><br><img src="data:image/<?=$path_parts['extension']?>;base64,<?=$img64[$key]?>"></div>
<?php
       
    }
}
$obj["imglist"] = implode("\n\n",$img64);

//print json_encode($obj);

 

ls -m というコマンドをPHPのexecという関数を使用して
画像リストを取得しようとしてハマった・・・。
この関数、exec(“ls -m”)と書くと全部返却値が返ってくる前に
変数に値を代入してくれるという何とも厄介な代物です。
処理するコマンドによるのですが・・そうなる場合があります。

なので第三引数まで書いて処理することが望ましいです。
また返却値は配列で返ってくるのでそれを一度、文字列化を行い
自分が取得したい値を再度処理を加えることが望ましいです。

今回、ディレクトリの画像ファイル参照し
画像読み込みをbass64のエンコードを行って
画像をIMGタグに入れ込むといった一連の流れを上記では
記述しています。

ちなみにTrimも行っています、
ls -m の場合、文字の前後に・・・空白部分があるので、
get_file_contentsを行う前にその処理を行う必要がありますが
画像名に先頭や後方に空白文字がある場合は一工夫行う必要がありますが。

今回は簡易的な処理のため、このよう感じで
大丈夫だと思います。

 

 

laravel5の古いバージョンをインストールする。{laravel5.2}

laravel5の古いバージョンをインストールする。{laravel5.2}

Composerが入っていることを前提に記事を書いていきます。
まず、インストールしたい環境を指定(プロジェクト名=ディレクトリが作成されます)します。
コマンドラインからこんなコマンドを打ちます。

composer create-project laravel/laravel laravel-test 5.2.* --prefer-dist

そうするとlaravel-testというフォルダが作成されます。
そしてその中にある、/config/app.phpの42行目を任意のURL変更します。

その後、下記のフォルダのパーミッションを777に変更して下さい。
storageのフォルダの配下
bootstrap/cacheフォルダ
こちらを変更することにより
任意のURL/public/というアドレスを入力することにより
デモページが表示されます。

フォルダとか言っていますけど、ディレクトリとか言うのが
普通みたいです(。-ω-)zzz. . . (。゚ω゚) ハッ!そうだった。

こんな感じでララベルの5.2をインストールすることが出来ました。
ちなみに5.2にするとPHP5.6ぐらいからPHP7.1ぐらいまで動作するという
事なので便利かなと思います。トイウカ、laravel、最先端を走りすぎているのか
日本のサーバ環境が古いのか分からないですが・・・
日本ではPHP5.6環境でざらで動いているのが結構あります。

なので5.2のバージョンで開発するのがベストかなと思います。
ちなみに自分の勤めている会社でもそろそろ導入するのかなと思っています。
そろそろと去年あたりから言ってますけど、、、、
仕事が立て込んでいて中々、移行するのが難しいですね、、、、。
一段落したかと思うと別の案件が・・・悩ましい。

合間合間で作るのは何だか気が引けるので未だに未着手なんです。
自分が担当している部分を変更するのはそれ程、時間はかからないとは思います。
ただ、未だにチーム開発ではないのが・・・難儀。

 

「jetpack」と「Japanese AutoTag」の相性が悪くて公開及び更新出来なくなる不具合について2

jetpackのプラグインが度々更新されその都度、過去記事の対応するのは面倒くさいので
根本的なJapanese AutoTagのプラグインを修正すればよいのではないかと思い
インフルエンザB型療養中にプログラムの修正を行いました。

ファイル名:japanese-autotag.phpの267行目~400行目ぐらいのアレやコレをキャスト(string)するように追加を行いました。
この事によってエラー500を出力されることもなくなりました。

Uncaught exception ‘Exception’ with message ‘Serialization of ‘SimpleXMLElement’ is not allowed’

	function get_word_array( $appkey, $sentence, $filter = '9', $exwords = array(), $expattern = '' ) {

		$expattern = trim( $expattern );
		$result = array();
		
		$url = 'http://jlp.yahooapis.jp/MAService/V1/parse?filter=' 
			. $filter . '&appid=' 
			. $appkey . '&results=ma&sentence=' 
			. urlencode($sentence);

		$c = @file_get_contents( $url );
		
		if( function_exists('simplexml_load_string') ) { // PHP5 or later

			$xml = simplexml_load_string ( $c );

			if($xml === false) {
				return (string)$result;
			}

			foreach($xml->ma_result->word_list->word as $w) {
				
				if( in_array($w->surface, $exwords) ) {
					continue;
				}

				if( $expattern != '' && @preg_match( $expattern, $w->surface) ) {
					continue;
				}
				
				$result[] = (string)$w->surface;
						
			}
		
		}
		else { // PHP4
		
			$dom = domxml_open_mem ( $c );
			
			if(!$dom) {
				return (string)$result;
			}
			
			$wa = $dom->get_elements_by_tagname('surface');
			
			for($i=0; $i<count($wa); $i++) {

				$t = $wa[$i]->get_content();				
				
				if( in_array($t, $exwords) ) {
					continue;
				}
				
				if( $expattern != '' && @preg_match( $expattern, $t ) ) {
					continue;
				}
				
				$result[] = (string)$t;
			}
		}
		
		return array_values(array_unique($result));
	
	}
	
	
	function get_keyphrase_array( $appkey, $sentence, $exwords = array(), $expattern = '' ) {

		$expattern = trim( $expattern );
		$result = array();
		
		$url = 'http://jlp.yahooapis.jp/KeyphraseService/V1/extract?' 
			. 'appid=' . $appkey 
			. '&results=xml&sentence=' 
			. urlencode($sentence);			

		$c = @file_get_contents( $url );
		
		if( function_exists('simplexml_load_string') ) { // PHP5 or later

			$xml = simplexml_load_string ( $c );

			if($xml === false) {
				return (string)$result;
			}

			foreach($xml->Result as $w) {
				
				if( in_array($w->Keyphrase, $exwords) ) {
					continue;
				}

				if( $expattern != '' && @preg_match( $expattern, $w->Keyphrase) ) {
					continue;
				}
				
				$result[] = (string)$w->Keyphrase;
						
			}
		
		}
		else { // PHP4
		
			$dom = domxml_open_mem ( $c );
			
			if(!$dom) {
				return (string)$result;
			}
			
			$wa = $dom->get_elements_by_tagname('Keyphrase');
			
			for($i=0; $i<count($wa); $i++) {

				$t = $wa[$i]->get_content();				
				
				if( in_array($t, $exwords) ) {
					continue;
				}
				
				if( $expattern != '' && @preg_match( $expattern, $t ) ) {
					continue;
				}
				
				$result[] = (string)$t;
			}
		}
		
		return array_values(array_unique($result));
	
	}

 

https://warera-web.com/%E3%80%8Cjetpack%E3%80%8D%E3%81%A8%E3%80%8Cjapanese-autotag%E3%80%8D%E3%81%AE%E7%9B%B8%E6%80%A7%E3%81%8C%E6%82%AA%E3%81%8F%E3%81%A6%E5%85%AC%E9%96%8B%E5%8F%8A%E3%81%B3%E6%9B%B4%E6%96%B0%E5%87%BA.html

javascriptの並列処理について

 

javascriptの並列処理についてdemoサイトを作りましたので
参照し見てください。尚、コードは下記になります。
注意点とかは下記の画像を参照してみて下さい。
使用してわかったことは落ちないというのは良いことだということ。
落ちても表面上はエラー警告などはないので、結構便利なんじゃないだろうかという事です。

ちなみにこちらがデモサイトのリンクになります。
https://warera-web.com/tool/worker/

<!DOCTYPE html>
<html>
    <head>
        <title>worker</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
        <script>
            var wkr = new Worker("worker.js");
            wkr.onmessage = function(d) {
                document.getElementById("wkr").innerHTML = document.getElementById("wkr").innerHTML +  d.data + "<br>";
            };
        </script>    
    </head>
    <body>
        <div id="wkr">
        </div>
    </body>
</html>
var e = 0;
function en(){
    e = e + 1;
    postMessage((e*3.14));
    if(e < 1000)en();
}
en();