画像をタイル状に分離して一括ダウンロードさせるジェネレーター

2019.09.07

Logging

画像をタイル状に分離して一括ダウンロードさせるジェネレーターを
作ってみました。画像は自動的に削除されます?
あることをすれば他人の画像がアップした画像も削除されます。
ちなみに一括ダウンロードbuttonを押すと画像がサーバー上に保存され
強制ダウンロードが始まります。
動作はブラウザChromeオンリーです。
また一括ダウンロードを押すと複数のファイルを一括ダウンロードするか
どうかの問い合わせが表示されますので「はい」を
選択してください。尚、30秒以内に保存されていないファイルは
次々と削除されます。
サイトはこちらから
https://zip358.com/tool/demo5/index-14.html
ソースコードは下記になります。
ページ(base64生成+画像ダウンロード処理)

追記:zipファイルにより格納するように処理を変更しました。
参考にしたサイト:https://ex1.m-yabe.com/archives/4215

<!DOCTYPE html>
<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title>画像分離してダウンロード:画像分離ジェネレーター</title>
        <meta name="description" content="画像分離してダウンロード:画像分離ジェネレーター">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="../jquery/jquery-3.4.1.js"></script>
        <link rel="stylesheet" href="../bootstrap/css/bootstrap.css">
        <!-- Global site tag (gtag.js) - Google Analytics -->
        <script async src="https://www.googletagmanager.com/gtag/js?id=UA-71682075-1"></script>
        <script>
        window.dataLayer = window.dataLayer || [];
        function gtag(){dataLayer.push(arguments);}
        gtag('js', new Date());

        gtag('config', 'UA-71682075-1');
        </script>        
        <style>
            body{
                background-color: black;
                color: antiquewhite;
            }
            img{
                margin:10!important;
                padding:10!important;
            }       
            #container{
                width: 100%;
            }
            #container img{
                margin:10px;   
            }       
        </style>    
    </head>
    <body>
        <span id="bat"></span><a id="dl"></a>
        <input class="form-control" type="file"></input>
        <div id="container"></div>
        <script>
            $(function(){
                $("[type=file]").on("change",function(){
                    $('#container').html("");
                    $("#bat").html("");
                    console.log($(this));
                    if(!$(this).prop('files')[0].type.match(/[png|jpg|jpge|gif]/)){
                        alert("ファイル形式エラー");
                        return false;
                    }                        
                    var canvas = document.createElement('canvas');
                    var reader = new FileReader();
                    reader.onload = function(event) {
                        var image = new Image();
                        image.onload = function() {
                            sprite = {width:50,height:50};
                            canvas.width = sprite.width;
                            canvas.height = sprite.height;
                            var ctx = canvas.getContext("2d");                            
                            var x = 0;
                            for(var i=0; i*sprite.height<image.height; i++){
                                for(var j=0; j*sprite.width<image.width; j++){
                                    ctx.drawImage(
                                    image,j*sprite.width,i*sprite.height,
                                    sprite.width,sprite.height,
                                    0,0,
                                    sprite.width,sprite.height
                                    );

                                    var spriteElement = new Image;
                                    spriteElement.src= canvas.toDataURL();
                                    $('#container').append(spriteElement);
                                }
                            }
                            $("#bat").html("<input type='button' value='一括ダウンロード' onclick='bat_img()'>");
                        }
                        image.src = event.target.result;                       
                    }
                    reader.readAsDataURL($(this).prop('files')[0]);
                    
                });
            });

            function bat_img(){
                var data = [];
                for(var i=0; i< $("img").length;i++){
                    data.push({"base64":$("img").eq(i).attr("src"),"no":i});
                }
                $.ajax({
                    type: 'POST',
                    url: 'bat_img.php',
                    data:{"obj":data},
                    dataType: 'json'
                }).done(function(obj){

                    if(obj[obj.length - 1 ].chk=="ok"){

                        var link = document.getElementById("dl");
                        link.href = obj[obj.length - 1].zippath;
                        link.download = "zipimg.zip";
                        link.click();

                        var data2 = [];
                        for(var i = 0 ; i < obj.length ; i++){
                            if(i==0){
                                data2.push({Path:obj.path,no:obj.no,t:obj.t,"zipimgpath":obj[obj.length - 1].zippath});
                            }else{
                                data2.push({Path:obj.path,no:obj.no,t:obj.t});
                            }
                            
                        }

                       var del = function(){
                            $.ajax({
                                type: 'POST',
                                url: './bat_del.php',
                                data:{"obj":data2},
                                dataType: 'json'
                            });
                        };
                        del();
                    }
                    });
                }
        </script>
    </body>
</html>
<?php
$i=0;
foreach($_POST["obj"] as $key=>$val){
    $b64 = base64_decode(str_replace("data:image/png;base64,","",$val["base64"]));
    $no = (int)$val["no"];
    $t = time();
    $Path = "./bat_img/tmp/$t-$no.png";
    $re = @file_put_contents($Path,$b64);
    if($re){
        $obj[$i]["chk"] = $re?"ok":"ng";
        $obj[$i]["name"] = "$t-$no.png";
        $obj[$i]["path"] = $Path;
        $obj[$i]["no"] = $no;
        $obj[$i]["t"] = $t;
        $i++;
    }
}
$obj[--$i]["zippath"] = zipfile($obj);

print json_encode($obj);


function zipfile($obj){
    $ZipFiles = function($obj){
        foreach($obj as $key=>$val){
           $path[] = $val["path"];
        }
        return $path;
    };
    $Zip_Files = $ZipFiles($obj);
    $zipFileName = time().'_zipimg.zip';

    set_time_limit(0);
    $zip = new ZipArchive();
    $zipTmpDir = './tmp/zip/';
    $result = $zip->open($zipTmpDir.$zipFileName, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE);
    if( $result !== true ){ //エラー処理
      echo 'error!';
      exit();
    }
    foreach ($Zip_Files as $key=>$filepath) {
      $filename=basename($filepath);
    // ZIP圧縮するファイルを追加
    // ファイルパス・ファイル名としないと圧縮ファイルを解凍するとフルパスになる
      $zip->addFile($filepath,$filename); 
    }
    //ZIP 出力
    $zip->close();

    return $zipTmpDir.$zipFileName;
}
<?php

unlink($_POST["obj"][0]["zipimgpath"]);
foreach($_POST["obj"] as $key=>$val){
    $Path = $val["Path"];
    $no = (int)$val["no"];
    $t = (int)$val["t"];
    
    $cmd = function(){
        foreach(glob("./bat_img/tmp/*") as $file_name){
            $command = "rm -rf " . realpath($file_name);
            exec($command);
        }    
    };
    
    if(pathinfo($Path)["extension"]=="png" and preg_match("/bat_img\/tmp/",$Path)){
        if(is_file($Path)){
            sleep(30);
            unlink($Path);
        }else{
            $cmd();
        }
    }else{
        $cmd();
    }

}

タグ

, 14, 30, 358, 4, 5, 64, archives, base, button, Chrome, com, demo, ex, html, https, index, m-yabe, tool, www, zip, アップ, オンリー, コード, こちら, こと, サーバー, サイト, ジェネレーター, ソース, タイル, ダウンロード, はい, ファイル, ブラウザ, ページ, 一括, 下記, 他人, 保存, 処理, 分離, 削除, 動作, 参考, 問い合わせ, 変更, 強制, 格納, 生成, 画像, 表示, 複数, 追記, 選択,

ANA積立で決済する方法とiPhoneでウォレット追加する方法。

2019.04.09

Logging


ANA積立航空券で決済する方法ですが、
まずWEBで予約まで行います、次に下記のサイトに
書かれているANA旅行積立プラン専用デスクに電話します。
その後、WEBへログインし支払い期限が延長されている
事を確認します。
サイトにANA航空券(旅行券)を送る住所が記載されているので
封筒にそれらを明記しANA旅行積立プラン専用デスク 行と記入した
うえで、郵便局で簡易書留+追跡サービスで送りましょう。
※送付するときは必ず送付書を入れて送りましょう。
尚、往復の場合、余白に搭乗日時などを明記し上記の内容に
合算することを明記しましょう。
http://www.anas.co.jp/tsumitate/anaticket/use_ticket/dom_desk/index.html
iPhoneでウォレット追加する方法
下記のサイトから手順通り行うとうまく行くはずなのですが、
純正ブラウザ以外の場合、インストールできない場合があります。
なので必ずSafariを使用してウォレット追加しましょう。
https://www.ana.co.jp/ja/jp/serviceinfo/share/passbook/

タグ

ANA, anas, anaticket, co, desk, dom, htmliPhone, http, index, iPhone, jp, Safa, ticket, tsumitate, use, web, www, インストール, うえ, ウォレット, こと, サービス, サイト, それら, デスク, とき, パス, ブラウザ, プラン, ログイン, 上記, 下記, 予約, , 住所, 余白, 内容, 合算, 場合, 封筒, 専用, 延長, 往復, , 手順, 搭乗, 方法, 旅行, 旅行券, 日時, 明記, 期限, 決済, 確認, 積立, 簡易書留, 純正, 航空券, , 記入, 記載, 追加, 追跡, 送付, 郵便局, 電話,

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

2019.02.16

Logging

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("DEMO1n");
print demo_php1::demo2("DEMO2n");
print demo_php1::demo3("DEMO3n");

下記のようにインスタンス(instance)すればこのコードはすべて怒られないです
それだけの違い。ちなみにdemo3は怒られない書き方です。
オブジェクトを単体で使う場合は気をつけましょう。
PHPのバージョンアップするにつれjavaのような動きになってきています。
PHP、Pythonに負けないようにかこの頃開発が活発化してます。
最新はPHP7.4ですからね・・・。

$demo_php1 = new demo_php1();
print $demo_php1->demo1("DEMO1n");
print $demo_php1->demo2("DEMO2n");
print $demo_php1->demo3("DEMO3n");

タグ

, 2, , class, demo, function, instance, lt, php, print, public, return, static, val, インスタンス, コード, すべて, それだけ, 下記, 参照, 書き方, ,

windows10 1809 不具合 Chromeが繋がらない(タイムアウト)

2019.02.02

Logging

windows10アップデート後(1809) 不具合 :Chromeが繋がらない
(タイムアウト)の対応策。
初期化して再度OSを入れ直すのもアレなんで対応策として
スタートアップ時にBatを走らせる事にした。
管理者権限にするBatとネットワークサービスを再起動するBatで
なんとか次期OSのアップデートかGさんが解決してくれる事を
期待しています。
それまでコンピュータ管理のサービスとかも停止せず待っときます。
Batは下記になります。
追記:
累積アップデートで直りましたと言いたいところだけど
一度、累積アップデートの一部を削除して再度、累積アップデートを
適応したら直りました・・・。

net stop CryptSvc
net start CryptSvc
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "Start-Process (管理者)ネットが繋がらないよ.bat -Verb runas"

タグ

-ExecutionPolicy, -NoProfile, 10, 1809, Bat, Chrome, CryptSvc, net, OS, powershell, start, stop, unres, Windows, アップ, アップデート, あれ, コンピュータ, サービス, スタート, それまで, タイムアウト, ところ, ネットワーク, 一度, 一部, 下記, 不具合, , 停止, 再度, 再起動, 初期, 削除, 対応策, 期待, 権限, 次期, 管理, 管理者, 累積, 解決, 追記, 適応,

DropFTPを配布。

2018.12.01

Logging

ドップして一つのファイルを転送するソフトを作りました。
こんなのどうしているのかと疑問を持つ人もいると思いますが
業務上、こんなソフトが要るという会社などもいるのではないかと
思いで作りました。
ダウンロードはこちらから
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;
        }
    }
}

タグ

358, Collections, com, ComponentModel, data, Drawing, DropFTP, Forms, FTP, Generic, Linq, System, Tasks, Text, Threading, tool, using, Wi, Windows, WinSCP, zip, コード, こちら, ソース, ソフト, ダウンロード, ドップ, ファイル, ライブラリ, 一つ, 下記, , 会社, 使用, 業務, 疑問, 転送, 部分, 配布,

さくらレンタルサーバーとXサーバーのMYSQLの規定

2018.11.13

Logging

さくらレンタルサーバーとXサーバーのMYSQLの規定は下記になります。
個人で使用する場合、1G、多くて3Gもあればそんなに困らないとは思いますが、企業や仕事で商品データなどをMYSQLサーバーに保存しようとすると足りない。さくらレンタルサーバーは9Gまで保証してくれるが、それでも足りないっていう企業の方も多くいると思います。そんな場合はさくらレンタルサーバーだと共有サーバーを諦めてワンランクアップしたマネージドサーバ(IP専用)を考えてみると良いかもしれないです。
ちなみにXサーバーはビジネスタイプでも同じ規定です。

https://www.xserver.ne.jp/manual/man_db_spec.php

https://help.sakura.ad.jp/hc/ja/articles/206053142#db

タグ

, 206053142, , , ad, articles, db, hc, help, https, IP, ja, jp, MYSQL, sakura, アップ, サーバ, サーバー, さくら, それ, タイプ, データ, ビジネス, マネージド, ランク, レンタル, ワン, 下記, 仕事, 企業, 使用, 保存, 保証, 個人, 共有, 商品, 場合, 専用, , 規定,

javascriptでテキストファイルやCSVファイルを読み込む方法。

2018.11.13

Logging

javascriptでテキストファイルやCSVファイルを読み込む方法は下記になります。
この他に、jqueryだとajaxを使用して読み込む方法などもありますが、あえて
javascriptで記述しています。

rt();
function rt(){
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.open("GET","xxx.txt",true);
    xmlHttp.send(null);
    xmlHttp.onload = function(){
        var data = xmlHttp.responseText;
    }
}

追記:アクセス数が結構あるのでサンプルを作りました。
下記のコードをお試しください。
デモページはこちらになります。
https://zip358.com/tool/demo13/ 【改良前】
https://zip358.com/tool/demo13/index2.php 【ちょっと改良】
https://zip358.com/tool/demo13/index3.php 【もうちょっと改良】
https://zip358.com/tool/demo13/index4.php 【もっと改良】
https://zip358.com/tool/demo13/index5.php 【もっともっと改良】2022年度版


※文字の中にカンマ区切りがあるのには対応してません?

"use strict";
var csv = {
	load:async function(filename,id){
		await fetch(filename).then(data=>data.text()).then((res)=>{
			let result = (res.split("\r\n").map(value=>{
				return "<tr>" + (value.split(",").map(val =>{
					return "<td>" + val.slice(1, -1) + "</td>";
				})).join("") +"</tr>";
			})).join("");
			if(result){
				document.getElementById(id).innerHTML = result;
			}
		}).catch(m =>{
			console.error(m);
		});
		return true;
	}
}

csv.load("xxx.csv", "table");
"use strict";
var csv = {
	load:async function(filename,id){
		const res = await fetch(filename);
		const data1 = await res.text();
		let separate1 = /\r\n/;
		let separate2 = ",";
		let data_tbl = (data1.split(separate1)).map(function(value){
			return (value.split(separate2)).map(function(value1){
				return value1.slice(1, -1);
			});
		});
		var str = "";
		for (const key in data_tbl) {
			str+=`<tr>`;
			for (const key1 in data_tbl[key]) {
				str+=`<td>${data_tbl[key][key1]}</td>`;
			}
			str+=`</tr>`;
		}
		document.getElementById(id).innerHTML = str;
		return "OK";
	}
};

csv.load("xxx.csv", "table");
"use strict";
var csv = {
    load: function (filename, id) {
		fetch(filename).then(
			Response=>{
				return Response.text();
			}).then(data1 =>{
                let separate1 = /\r\n/;
                let separate2 = ",";
				let data_tbl = (data1.split(separate1)).map(function(value){
					return (value.split(separate2)).map(function(value1){
						return value1.slice(1, -1);
					});
				});
				var str = "";
				for (const key in data_tbl) {
					str+=`<tr>`;
					for (const key1 in data_tbl[key]) {
						str+=`<td>${data_tbl[key][key1]}</td>`;
					}
					str+=`</tr>`;
				}
				document.getElementById(id).innerHTML = str;
				return "OK";
			}).catch(error=>{
				console.log("失敗しました" + error);
			})
    }
};

csv.load("xxx.csv", "table");
"use strict";
var csv = {
    load: function (filename, id) {
        var xmlHttp = new XMLHttpRequest();
        xmlHttp.open("GET", filename, true);
        xmlHttp.send(null);
        xmlHttp.onload = function () {
            if (xmlHttp.status === 200) {
                let separate1 = /\r\n/;
                let separate2 = ",";
				let data1 = xmlHttp.responseText;
				let data_tbl = (data1.split(separate1)).map(function(value){
					return (value.split(separate2)).map(function(value1){
						return value1.slice(1, -1);
					});
				});
				var str = "";
				for (const key in data_tbl) {
					str+=`<tr>`;
					for (const key1 in data_tbl[key]) {
						str+=`<td>${data_tbl[key][key1]}</td>`;
					}
					str+=`</tr>`;
				}
				document.getElementById(id).innerHTML = str;
				
            }
        };
    }
};

csv.load("xxx.csv?123", "table");
"use strict";
var csv = {
    load: function (filename, id) {
        var data = {};
        var xmlHttp = new XMLHttpRequest();
        xmlHttp.open("GET", filename, true);
        xmlHttp.send(null);
        xmlHttp.onload = function () {
            if (xmlHttp.status === 200) {
                let separate1 = /\r\n/;
                let separate2 = ",";
                let data_org = xmlHttp.responseText;
                let data_en = data_org.split(separate1);
                for (let d in data_en) {
                    data[d] = data_en[d].split(separate2);
                }
                //data load
                var t = document.getElementById(id);
                var h = "<table>";
                for (var o in data) {
                    h += "<tr>";
                    for (var r in data[o]) {
                        h += "<td>";
                        h += data[o][r].slice(1, -1);
                        h += "</td>";
                    }
                    h += "</tr>";
                }
                h += "</table>";
                t.innerHTML = h;
            }
        };
    }
};
csv.load("xxx.csv", "table");

タグ

358, ajax, com, CSV, data, function, GET, https, javascript, jquery, new, null, onload, open, quot, responseText, rt, send, too, true, txt, var, xmlHttp, XMLHttpRequest, xxx, zip, アクセス, コード, こちら, サンプル, テキスト, デモ, ファイル, ページ, 下記, , 使用, 方法, 記述, 追記,

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

2018.11.08

Logging

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

追記:2022/10/08 修正:詳しくはコチラ
https://qiita.com/question909/items/8f1df9b62ab4fba76243

<?php
//5分刻みに対して有効な無限クローン 処理が負荷の場合どうなるかは知りません。
date_default_timezone_set('Asia/Tokyo');
class cron{

    public function d_m($obj)
    {
            if($obj->m==="*")return true;
            if(preg_match("/,/",$obj->m))return $this->comma($obj->m,date("m"));
            if((int)$obj->m === (int)date("m"))return true;

            return false;
    }

    public function d_d($obj)
    {
            if($obj->d==="*")return true;
            if(preg_match("/,/",$obj->d))return $this->comma($obj->d,date("d"));
            if((int)$obj->d === (int)date("d"))return true;

            return false;
    }

    public function d_H($obj)
    {
            if(preg_match("/\*\/[0-9]{1,2}/",$obj->H)){
                $H = explode("/",$obj->H);
                if((int)$H[1]>0 && ((int)date("H") % (int)$H[1])===0)return true;
            }else{
                if($obj->H==="*")return true;
                if(preg_match("/,/",$obj->H))return $this->comma($obj->H,date("H"));
                if((int)$obj->H === (int)date("H"))return true;

            }
            return false;
    }

    public function d_i($obj)
    {
            if(preg_match("/\*\/[0-9]{1,2}/",$obj->i)){
                $i = explode("/",$obj->i);
                if((int)$i[1]>0 && ((int)date("i") % (int)$i[1])===0)return true;
            }else{
                if($obj->i==="*")return true;
                if(preg_match("/,/",$obj->i))return $this->comma($obj->i,date("i"));
                if((int)$obj->i === (int)date("i"))return true;

            }
            return false;
    }

    //曜日 0=日曜日 6=土曜日
    public function d_w($obj)
    {
            if((int)$obj->w[date("w")]===1)return true;
            return false;
    }

    public  function comma($c="",$t=""){
        if($c==="")return false;
        if($t==="")return false;
        $flg = false;
        foreach(explode(",",$c) as $cc){
            if((int)$cc===(int)$t)$flg = true;
        }
        return $flg;
    }


    public function d_command($obj){
        if($obj->command){
            exec($obj->command . " > /dev/null &");
        }
        return true;
    }

}
if ($argv[1]) {
   $filename = $argv[1];
    if(is_file($filename)){
        $jsn = json_decode(file_get_contents($filename));
        $cron = new cron();
        try {
            foreach($jsn as $obj){
                if($cron->d_m($obj)){
                    if($cron->d_d($obj)){
                        if($cron->d_H($obj)){
                            if($cron->d_i($obj)){
                                if($cron->d_w($obj)){
                                    $cron->d_command($obj);//波動拳{{{{
                                }
                            }
                        }
                    }
                }
            }
        } catch (\Throwable $th) {
            print $th->getMessage();
        }
    }
}

タグ

08, 10, 2022, 39, 5, Asia, class, cron, crontab, date, default, function, if, lt, obj, php, public, qiita, set, timezone, Tokyo, UP, , クラス, クローン, クロン, コーディング, コード, ここ, コチラ, サーバー, さくら, タブ, まえ, レンタル, 下記, 今回, 何年か, 修正, 処理, 分刻み, 制限, 場合, , 技術, 改善, , 方法, 日付, , 有効, 概念, 構築, 無限, 自体, 自分, 負荷, 追記,

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

2018.04.28

Logging


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

【表示する】buttonを押下後、【ダウンロードする】を押さないとダウンロード出来ない仕様に変更してます。

ライブラリにこちらのライブラリを使用しております。
https://www.nuget.org/packages/VideoLibrary/

追記:ソースコードは控えることとにしました。下記の理由から・・・。今後どうなるか不透明なので使用する場合はご自身の判断の元で!尚、私自身はオススメはしません。

タグ

button, https, NuGet, org, packages, VideoLibrary, www, youtube, おすすめ, コード, こちら, こと, ご自身, ソース, ソフト, ソフトウェア, ダウンロード, プログラマー, ホント, もの, ライブラリ, 下記, 不透明, 今後, 仕様, 使用, , 判断, 動画, 印象, 場合, 変更, 押下, 理由, , 自身, 表示, 追記,

laravelをインストールするまで。

2017.10.20

Logging


laraveをインストールするまで、普通の環境ならそれ程、時間もかからないでしょう。下記のURLを参照すればちょこっとした時間でインストール出来るのですが php-cgi環境がしっかりと理解できない場合、うまくインストールされない事があります。
https://laravel.com/
例えばphp-cgiの環境は一通り整っているのに、php -v とバージョンを確認すると以前のバージョンが表示される場合、モジュール版のphpを削除したのにもかかわらず以前のバージョンが実は残っているのです。
その為、サーバ上はうまくそれぞれのPHPのバージョンが動いているのに、コンポーザーでコマンドラインからlaravelをインストールを行うと以前のバージョンが悪さをしてうまくインストールされない場合があります。
対処法として、コマンドラインで動いているPHPを探し出し削除を行い、シンボリックリンクか何かで、ソースからインストールしたPHPにリンクを張ってあげましょう。
そうすることにより、うまくインストールされます。
それでもインストールが出来ない場合は、GitHubより最新版のlaravelをダウンロードすることにより動作することが可能ですが、試してはないです。
https://github.com/laravel/laravel?(PHP7なら動きそう)
ちなみにインストールをコンポーザーから行うとPHPのバージョンを確認して、それに対応したバージョンを自動的に インストールすることが可能です。

何故・・・laravelをインストールすることになったかというと
会社でお試し使用することがキッカケです。その為、会社で環境構築を行い、じぶんでも同じように環境構築したという事です。
PHPフレームワーク、実は殆ど使用したことがなく、どんな機能があるのかなど 本当に未知数なですね・・・。でもコレをゴリゴリと使用することが可能になれば、かなり開発が早くなりそうな予感がします。

タグ

-v, com, https, larave, Laravel, php, php-cgi, url, インストール, コマンド, コンポーザー, サーバ, シンボリック, ソース, それぞれ, バージョン, モジュール, ライン, リンク, 下記, , 以前, 削除, 参照, 場合, 対処法, 時間, 普通, , 理解, 環境, 確認, 表示,

datetimepicker-master::でぃーたたいむぴっかーマスター!!日本語化

2017.10.14

Logging


datetimepicker-masterが日本語化できない。時刻だけ表示したい、カレンダーだけ表示したいなどに
実は対応しているのだけど、バージョンがアップしてからそのやり方が変わっていて
ググってもそのやり方が出てこないので、じぶんが記載してみました。
ソースを読まないと見えてこないものが有るですが、ぶっちゃけ他人のソースを読むのは面倒くさいでもプラグインは使用したい方。
下記のコードで日本語化可能です。
カレンダー非表示可能です。
時刻非表示可能です。
ちなみにソースを見るとdefault_options(でふぇるとおぷしょん)のオブジェクトで
その他、操作も可能ですのでソースを読みたい人は読んでみてください。
ちなみにちなみにdatetimepicker-masterプラグインはこちらからダウンロード可能です。
https://github.com/xdan/datetimepicker
サンプルプログラムはこちらです。
https://zip358.com/tool/datetimepicker

<!doctype html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>zip358.com:datetimepicker日本語</title>
  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=10.0, user-scalable=yes">
  <link rel="stylesheet" href="./datetimepicker-master/jquery.datetimepicker.css">
  <script src="//code.jquery.com/jquery-1.10.2.js"></script>
  <script src="./datetimepicker-master/build/jquery.datetimepicker.full.js"></script>
  <script>
      $(function(){
          $.datetimepicker.setLocale("ja");//にほんご
          $("#dtp").datetimepicker({
              format:"Y/m/d H:i",
              formatTime:"H"//時間だけ(分:非表示)
          });
          $("#dtp2").datetimepicker({
              format:"Y/m/d",
              timepicker:false//時刻非表示
          });
          $("#dtp3").datetimepicker({
              format:"H:i",
              datepicker:false//カレンダー非表示
          });
      });
  </script>
</head>
<body>
    <input id="dtp" type="text">
    <input id="dtp2" type="text">
    <input id="dtp3" type="text">
    <div id="ana">
    </div>
</body>
</html>

タグ

com, datetimepicker, datetimepicker-master, default, github, https, options, xdan, アップ, オブジェクト, カー, カレンダー, コード, こち, こちら, サンプル, じぶん, ソース, その他, タイム, ダウンロード, バージョン, ふぇると, プラグイン, プログラム, マスター, もの, やり方, 下記, , 他人, 使用, 可能, 対応, 操作, , 日本語化, 時刻, 表示, 記載,

サイトのテコ入れ。

2017.10.05

Logging


サイトのテコ入れを行うことに
このサイトはアクセス数はまぁまぁあるのでテコ入れはしません。
ですが、その他のサイトは雀の涙程度のアクセス数しかないので、モール関係のサイトの
テコ入れを行うことに決めました。
検索に引っかかりやすい作りにするには、
ゴネゴネとプログラムで作って
固定ページが有るかのようにサイトを作り直さなければ、
おそらく検索には拾ってもらえないだろうから、下記のことを行うことに、
まず、必要な単語リストを生成し、その生成した単語からページを生成する。
容量はかなりあるので、動的なサイトより静的なサイトで
ページを構築します。問題は単語リストをどうするかなのです・・・。
単語リスト=辞書データなのですが
このフリー版を見つけるのが一苦労しそうです。
静的なサイトは辞書データが見つかれば
そのデータを元にバッチ処理(一括処理)を行えば
何とかなりそうなのですが。。。。
問題は辞書データかなと。。。。
 

タグ

アクセス数, かなり, サイト, その他, テコ入れ, バッチ処理, フリー版, プログラム, モール関係, 一括処理, 下記, 作り, , 単語リスト, 問題, 固定ページ, 容量, 検索, 辞書データ, 雀の涙程度,

テンソルフロー的な画像解析。

2017.09.03

Logging


Tensorflow(テンソルフロー)的な画像解析をやってみました。
コードはオープンで公開する程のものではないので仕組みだけ説明します。

python classify_image.py --image_file test11.jpg

Pythonのモジュールの上記(classify_image.py)のファイルをパラメータ渡しでキックしているだけです。
モジュールはグーグルさんが書いているのを貰ってきただけです、何とも簡単に
画像を解析してくれます。ここまでたどり着くまでには長い道のりがありましたが
手順を教えます。
まず、Tensorflowをインストールして置きます。これはググれば見つかります。
TensorBoardで可視化とかしていませんので割愛します。インストールして
任意の場所に下記のモジュール(models repo)をダウンロードします。
https://www.tensorflow.org/versions/master/tutorials/image_recognition

ダウンロードしたファイルを配下に画像を置けばおわり、その名前と共にファイルをキックして
あげるだけでOKのはずが・・・・。OKじゃねぇ、そう何か動かない。
構文間違っているじゃねぇみたいなエラーを吐くのでファイルを修正します。

この配下に「classify_image.py」ファイルがありますのでこちらを修正します。
紫で囲っている部分を削除してしまいましょう。実際、自分は削除はしませんでした。
あまりPythonの構文を分かっていないので、コマンドラインからは不必要かもしれないけれど・・・。
WEB上で動かす(呼び出す)際は必要かもしれないのでコピってコメントアウトしてます。
コメントアウト後、PHPの関数、execを使い外部コマンドでPythonを実行してみると動きます。
動いた時は感動します。ひとりニヤニヤしてました。
返却されたものを表示しているだけ・・・なんですけどね。
https://www.youtube.com/watch?v=96-5oYVi4Pg
サンプルサイトはこちらです。
http://zip358.site/labo/

タグ

AM, exec, image_file test11.jpg, models repo, python classify_image.py, TensorBoard, tensorflow, エラー, グーグル, コマンドライン, サンプルサイト, テンソルフロー, テンソルフロー的, パラメータ渡し, ファイル, モジュール, 下記, 外部コマンド, 構文, 画像解析, 配下, 関数,

小利口、動かないひとびと(じぶんを含む)。

2017.06.19

Logging


堀江貴文氏、云わく動かないひとびと(じぶんを含む)を小利口と
呼ぶらしい。

イノベーションを生み出す仕組み | 堀江 貴文 | TEDxTokyo

堀江貴文氏が言っていることに反感的な感情を持つ人もいると
思いますが、当たっていると思います。このひと(下記の動画)、内容は違えども
同じことを言っていると思います。結局、行動しているという人を見て
自分も行動しようと思うか、どうかだと思います。
方向性は違いますが、ひとつだけ同じ共通点は行動していることです。

人生の価値は、何を得るかではなく、何を残すかにある。 | Kazunari Taguchi | TEDxHimi

タグ

B00YE0H1XG, jp, じぶん, ひとつ, ひとびと, 下記, , 共通点, 内容, 動画, 反感的, 堀江貴文, 感情, 方向性, 結局, 行動イノベーション,

140文字ぴっちり文字を埋めるの簡単。

2017.06.15

Logging


140文字ぴっちり文字を埋めるの簡単に出来る。
方法は下記の通り、
まず思ったことをびしっり140文字より多めに書きます。
その後、言い回し修正しながら書き直していくことで
140文字に収めることは意外にも簡単にできてしまったりします。
ちなみに何も考えなしに140文字で収まることも
たまにあったりします。逆にこちらの方が
優越感てきな気持ちになったりするので不思議です。
TwitterとかFacebookとかNET中毒的な要素があるらしいので
程々に・・・。
140文字以上呟きたい方はこちらを参考にしてください。

タグ

140文字ぴっちり文字, 140文字以上, Facebook, NET中毒的, かんたんmini Twitter, ツイッター, 下記, 便利技, 優越感てき, 参考, 基本, 改訂4版, 方法, 気持ち, 要素, 言い回し, 通り,

ゲームRiMEがなんだかあのゲームに酷似している。

2017.05.29

Logging


下記の動画を見てもらうとわかるように人喰い大鷲トリコが手がけるゲームに
なんだか酷似している気がします。似ているけど、そんなのどうでもいいやと言う方は
こちらのゲーム、RiMEをプレイしてみるのも良いじゃないでしょうか?
普通に面白そうな気もしますね。自分が小学生とかだったら絶対、親に
ねだっているようなそんなゲームですね。
ちなみに公式ページをクリックしたら
ウイルス対策ソフトが危ないサイトだよと拒絶してくれました・・・。
なので、プレイステーションの公式サイトを載せときます。
https://www.playstation.com/en-us/games/rime-ps4/

RiME – Launch Trailer | PS4
『人喰いの大鷲トリコ』 ストーリートレーラー

タグ

B01H1EWOG0, PS4, ウィルス対策, オリジナルPlayStation 4テーマ, ゲームRiME, プレイステーション, プロダクトコード封入, ミニサウンドトラック, 下記, 人喰い大鷲トリコ, 公式サイト, 公式ページ, 初回限定版, 動画, 危ないサイト, 小学生, 早期購入特典, 昨日,

ラグリ:手のひらに「わたしの農園」を。

2017.05.26

Logging


ラグリ:手のひらに「わたしの農園」を。
下記の動画をみました、賛同する農家さんもいると思います、
逆に賛同しない農家さんもいると思います。
興味が在る方はこちらにリンクを貼っときます。
https://agriculture.rakuten.co.jp/
https://www.youtube.com/watch?v=4CvAZbwhLtA
 

タグ

ラグリ, リンク, わたし, 下記, 動画, 手のひら, 興味, 農園, 農家,

殻「」に。

2017.05.05

Logging


下記の動画を見て
「高校の時とあまりやっていることは変わらない」が印象的。
ちなみに自分も高校の時とあまりやっていることは変わっていないのですね。
プログラムは基本的にあきないです、そして自分にとっては好きなものなんですから
まだまだ技術は吸収していけるモノだとも思っています。
もうすぐU40間近ですが、自分の感覚では
あと20年はこの道で続けていきたいなと思いますし、実際、続けてきている先輩プログラマーさんは
多くいるだろうと思います。35歳でプログラマー引退とか言われていた時代も
ありますが、まぁ毎日というぐらいコードを書いている人は
ずっと続けられるだろうと感じます。
https://www.youtube.com/watch?v=GLN_h6fY_3M

tofubeats DJ set / Lost Decade 9 20161216

タグ

B00U784MUE, U35, U40, コード, プログラマー引退, プログラム, 下記, 先輩プログラマー, 動画, 実際, 感情, 感覚, 技術, 時代, , 若い人, 高校,

通称オレオレ認証の警告でハマる解決策。

2017.03.11

Logging

https://jp.globalsign.com/ 『SSL導入のことなら↑』
会社で必要になりオレオレ認証SSLを導入!!
通称オレオレ認証の警告でハマる解決策です。ググると簡単にコピペでローカルSSLの環境を作れると
思っていのですが、少しだけ甘かった。巷でググるとオレオレ認証のことが山のように出てくるのだけど、その記述では警告が出てしまいます。なぜ、警告が出てしまうか。
それはsha-1にしか、対応していないからです。なので警告表示が出ます。いまは各ブラウザ、sha-2=>sha256にしか対応していないオレオレ認証出来ません。
ということで?
下記の記述で大体のローカルサーバでSSL認証が可能になります。

openssl genrsa 2048 > oreore-server.key
openssl req -new -sha256 -key oreore-server.key > oreore-server.csr
Common Name (eg, YOUR name) []: oreore.com ←ここだけ合わせる。あとの入力欄はエンターでOK
openssl x509 -in -sha256 oreore-server.csr -days 777777 -req -signkey oreore-server.key > oreore-server.crt
cp oreore-server.crt /var/www
cp oreore-server.key /var/www
/etc/httpd/conf/httpd.conf
下記の記述などを追加。
<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile /var/www/oreore-server.crt
    SSLCertificateKeyFile /var/www/oreore-server.key
</VirtualHost>
systemctl restart httpd Apache再起動
一旦ブラウザを閉じオレオレ認証がうまく行ったか
確認を行う。
なお、ファイアウォールで見えない場合は443ポートを
開放するように!!
systemctl restart httpd Apache再起動
一旦ブラウザを閉じオレオレ認証がうまく行ったか確認を行う。
なお、ファイアウォールで見えない場合は443ポートを開放するように!!

※尚、出来上がったcrtファイルを個人分のパソコンにダウンロードして設定するように!!
設定方法はこちら
https://scratchpad.jp/ssl-self-certification/
追記:Chrome58以降、上記の方法ではうまく行かなくなりました。
https://qiita.com/ll_kuma_ll/items/13c962a6a74874af39c6

タグ

, 2, 2048, 256, com, csr, genrsa, globalsign, gt, https, jp, key, new, openssl, oreore-server, req, sha, SSL, いま, オレオレ, こと, コピペ, サーバ, それ, ブラウザ, ローカル, 下記, 会社, 可能, 大体, 対応, 導入, 少し, , , 必要, 環境, 簡単, 表示, 解決策, 記述, 認証, 警告, 通称,

PHPの連想配列追加作成方法。んっ

2017.02.11

Logging


PHPの連想配列追加作成方法。
こちらの下記のコードで連想配列が追加可能です。

<form action="rensou.php" method="POST">
    <input name="name" type="text"><br>
    <input name="name2" type="text"><br>
    <input name="name3" type="text"><br>
    <input name="name4" type="text"><br>
    <input name="name5" type="text"><br>
    <input name="name6" type="text"><br>
    <input name="name7" type="text"><br>
    <input type="submit"><br>
</form>
<?php
$_POST = xss_d($_POST);
$array = [];
if(is_array($_POST)){
    foreach ($_POST as $key => $value) {
        if($value<>""){
            $array[$key] = $value;
        }
    }
}
?>
連想配列表示<br>
<textarea style="width: 500px;height: 500px;">
<?php
print_r (count($array)>0)?($array):["値無し"];
?>
</textarea>

<?php
function xss_d($val){
    if(is_array($val)){
        foreach ($val as $key => $value) {
            # code...
            $val[$key] = strip_tags($value);
            $val[$key] = htmlentities($val[$key],ENT_QUOTES);
        }
    }else{

        $val = strip_tags($val);
        $val = htmlentities($val,ENT_QUOTES);        
    }
    return $val;
}

サンプル
https://zip358.com/tool/rensou.php
余談:連想配列よく使います。。。。
そして便利です。こういう追加方法を知らない人も
いると思います。最初に連想配列を設定して終わり・・・。
じぶんもちょっと昔までは追加方法なんて知らなかったです。
知っていると便利です。
あと、ブログですが、こんな感じで
たまに書き込みするようにします。ブログを書かなくなった理由は
ネタがないのではなく。ダラダラ書くより
これは皆さんに伝えたいと思うのだけで良いじゃないかなと
思ったからです。
ぷらす書く時間を他のことにシフトしただけです。
なので、気分が乗る日は書きます・・・よ。

タグ

2, , 4, 5, Action, br, Form, gt, input, lt, METHOD, name, php, POST, quot, rensou, Text, type, コード, こちら, 下記, 作成, 可能, 方法, 追加, 連想, 配列,

SSH.NETでSFTPとSSHの接続を確立させるまでの過程。

2016.12.11

Logging

SSH.NETでSFTPとSSHの接続を確立させるまでの過程。
ソースコードは下記です、あくまでも触りなのでココからご自分で考えて作り変えてください。ちなみにSSH.NETのライブラリを入手するには拡張機能からNuGet Package Managerという拡張機能を追加するとツールのNuGetパッケージマネージャーが現れるので、ソリューションのNuGetパッケージ管理からSSH.NETと検索しインストールすることによりライブラリが使用できます。

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.IO;
using Renci.SshNet;
using Renci.SshNet.Common;
using Renci.SshNet.Sftp;
namespace ftp
{
    public partial class Form1 : Form
    {
        String Host = "168.192.11.1";
        int Port = 22;
        String RemoteFileDIR = "/root/";
        String LocalDestinationDIR = "C:\\Users\\hoge\\Documents\\BACKUP\\";
        String Username = "admin";
        String Password = "hogehoge";
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            ssh_cmd();
        }
        private void dl(string filename) {
            using (var sftp = new SftpClient(this.Host, this.Port, this.Username, this.Password))
            {
                sftp.Connect();
                using (var file = File.OpenWrite(this.LocalDestinationDIR + filename))
                {
                    sftp.DownloadFile(this.RemoteFileDIR + filename, file);
                }
                sftp.Disconnect();
            }
        }
        private void ssh_cmd() {
            SshClient ssh = new SshClient(this.Host, this.Username, this.Password);
            ssh.Connect();
            string command = "cd /root && ls";
            string[] str_result;
            string str_results;
            char ptn ='\n';
            int i =0;
            var result = ssh.RunCommand(command);
            //MessageBox.Show(result.Result);
            str_results = result.Result;
            str_result = str_results.Split(ptn);
            ssh.Disconnect();
            for ( i = 0; i < str_result.Length; i++) {
                //MessageBox.Show((str_result[i]));
                if (str_result[i] != "")
                {
                    dl(str_result[i]);
                }
            }
        }
    }
}

タグ

Collections, ComponentModel, data, Drawing, Generic, Linq, Manager, net, NuGet, Package, SFTP, SSH, System, Tasks, Text, Threading, using, インストール, コード, ココ, こと, ご自分, ソース, ソリューション, ツール, パッケージ, マネージャー, ライブラリ, 下記, 使用, 入手, 拡張, 接続, 検索, 機能, 確立, 管理, 追加, 過程,

9月から10月にかけて観に行くかもしれない映画。

2016.09.22

Logging

9月から10月にかけて観に行くかもしれない映画が下記になります。
上映初日に観に行くかもしれないし、そうでないかもしれないですが・・・。
今のところ7割の確率で観に行くと思われる作品を記載しときます。
また、観たら感想なんかを記載すると思います。

ハドソン川の奇跡
http://wwws.warnerbros.co.jp/hudson-kiseki/

SCOOP!
http://scoop-movie.jp/

ジェイソン・ボーン
http://bourne.jp/

何者
http://nanimono-movie.com/

スタートレックビヨンド
http://www.startrek-movie.jp/

インフェルノ
http://www.inferno-movie.jp/site/#!/

タグ

10, 7, , bourne, co, com, http, hudson-kiseki, inferno-movie, jp, nanimono-movie, SCOOP, scoop-movie, site, startrek-movie, warnerbros, www, wwws, インフェルノ, ジェイソン, スタートレック, ところ, ハドソン川, ビヨンド, ボーン, 上映, 下記, , 何者, 作品, 初日, 奇跡, 感想, 映画, 確率, , 記載,

FuelPHPをサクラレンタルサーバー共有で動かすには?

2016.07.14

Logging

FuelPHPをサクラレンタルサーバー共有で動かすには?
どうしたら良いのかを記述しときます。
\fuel\app\config\config.phpに記述されている’base_url’の所を
base_url’ ?=>’http://任意.com/’,かbase_url’ ?=>’任意の階層’にします。
オプションでいろいろと変更できる点はありますが、今回はスルーします。
FuelPHPの日本公式サイトを参照
次にルートの直下に.htaccessを作成し下記の内容を記述しアップロードを行なってください。

RewriteEngine on 
RewriteBase /public 
RewriteRule (.*) /public/$1

この段階ではルートにアクセスしても表示されません。表示させるためには
\public.htaccessの.htaccessファイルを一部変更してあげる必要があります。
まず、RewriteBase /publicを追加しOptions +FollowSymLinks -Indexesと
記載されている部分をコメントアウトする必要があります。
これらの事をするとルートURLでFuelPHPの初期の表示がされるようになります。

いろいろなサイトを拝見しましたが、結構設定を変更しないといけないよと書かれていますが、実際はコレだけの設定変更で表示することは可能です。ちなみに余談ですがオプション値のココだけは変更したら良いかなという
所を記載します。

	/**
	 * Localization & internationalization settings
	 */
	 'language'           => 'ja', // Default language
	 'language_fallback'  => 'ja', // Fallback language when file isn't available for default language
	 'locale'             => 'ja_JP.UTF-8', // PHP set_locale() setting, null to not set
	/**
	 * Internal string encoding charset
	 */
	 'encoding'  => 'UTF-8',
	/**
	 * DateTime settings
	 *
	 * server_gmt_offset	in seconds the server offset from gmt timestamp when time() is used
	 * default_timezone		optional, if you want to change the server's default timezone
	 */
	 'server_gmt_offset'  => 0,
	 'default_timezone'   => 'Asia/Tokyo',

タグ

, App, base, com, config, fuel, FuelPHP, htaccess, http, ON, php, public, Rewrite, RewriteBase, RewriteEngine, RewriteRule, url, アクセス, アップロード, いろいろ, オプション, サーバー, サイト, さくら, スルー, ため, ファイル, ルート, レンタル, 一部, 下記, 今回, 任意, 作成, 公式, 共有, 内容, 参照, 変更, 必要, , 日本, 段階, , 直下, 表示, 記述, 階層,

これから先のSEO、AI:SEOというものなのかも。

2016.07.02

Logging


これから先のSEO、AI:SEOというものなのかもと下記の記事を
読んでそう思いました。
人工知能はSEOを一変させる―Google RankBrainを知らない対策が危険な理由
今はAIとSEOのハイブリッドみたいなものですけど
今後、AIがサイトの内容を理解していくと、トラフィックの流れや
サイトの内容によって検索順位を変動させることに成ると思います。
もうひとつ言えることは、今でもそうですが
検索順位が意味をなさなくなるという問題もあります。
人や場所によって、検索順位が変動することによって
従来のSEOは意味をなさなくなるという事です。
じゃ、どうすれば良いのかといえば
品質の良い情報を吐き出すことと、SNSの活用することの
2つだと思います。この事が人工知能SEO対策の一番有効な
対策だと感じました。
良いサイト、悪いサイトを人工知能が分別し学習するのは
そんなにも時間はかからないと思います。

タグ

―Google, 2, AI, RankBrain, SEO, SNS, こと, これ, サイト, トラフィック, ハイブリッド, もうひとつ, もの, 一変, 下記, , , 人工, , 今後, , 内容, 分別, 危険, 品質, 問題, 場所, 変動, 学習, 対策, 従来, 情報, 意味, 時間, 有効, 検索, 活用, 理由, 理解, 知能, 記事, 順位,

20代はお金を貯めようともしなかった(゚Д゚)。

2016.06.07

Logging


20代はお金を貯めようともしなかった。
いま、20代の自分に一言言うなら、少しぐらいお金を
貯めとけと言いたい。
もうひとつ付け加えるとするならば
遊ばない人はもっと遊べということを追加したい。
20代後半になると知人友人などの結婚が多くなり
30代になるとそのお呼びも減り、出会いが少なくなる。
歳だけを重ねていき、結婚が遠ざかっていく事になるので
早いうちから、出会いの場所には足を運ぶことを
オススメします!!
出会いはいらないというのなら
確実にお金は貯めといたほうが良い。
お金も貯めず出会いもなければ
若い時は良いけど年老いてから大変になります。
ちなみに幸福な人生を送るには
地域や社会と繋がりがあるかどうかだそうです。
追跡調査の研究結果によりそういう結果がでているそう。
また40代以上になると
結婚できる確率がガクッと低くなるそうなので(1%ぐらいに)
20代、30代と言わず、結婚したいなら
行動あるのみです。
それなりに相性ってものがあるから
誰とでも付き合いたいわけではないのですからね。皆んな。
だから、20代にはお金を貯めつつ
出会いの場に足を運ぶことをオススメします。
ちなみに下記の本は
自分の言っていることと少し真逆なところが
あります(゚Д゚)。こちらの方が理にかなっているのかも。
 

タグ

お呼び, お金, つながり, もうひとつ, 一言, 下記, 出会い, 出会い論, 少し, 早いうち, 法則, 相性, 知人友人, 研究結果, 確率, 結婚, 繋がり, , 追跡調査,