用canvas播放scratch文件

參考網址:簡書

2019/02/06更新
https://github.com/ZKingQ/scratch-player
可以下載可播放sb3的程式


scratch 3.0 已於2019/1/2釋出
一直在找瀏覽器可以播放.sb3的方法
想不到朝敏已經找到了prolin

基于Github上的scratch-render实现sb2或者sb3文件可以用h5的canvas直接播放而不是flash

前言

关于scratch-render,scratch-gui,scratch-vm等组件的关系可以查看这篇教程Getting Started,然后发现与Scratch文件相关的播放部分是由scratch-render控制。

Scratch 3.0

安装

git clone https://github.com/LLK/scratch-render.git
cd scratch-render
npm install # 使用cnpm可能会安装失败

下载龟速的话可以科学上网然后使用Proxifier全局代理

使用

其实Scratch开发团队已经实现了这个功能,只是我们要找到接口来调用。打开目录下的/test/integration/index.html可以打开这个播放器Demo网页。此时上传sb文件会发现只能显示代码初始状态的效果,这时需要添加一行代码,添加vm.greenflag()给js执行,就可以实现播放的效果了。
这个网页的代码如下:

<body>
    <script src="../../node_modules/scratch-vm/dist/web/scratch-vm.js"></script>
    <script src="../../node_modules/scratch-storage/dist/web/scratch-storage.js"></script>
    <script src="../../node_modules/scratch-svg-renderer/dist/web/scratch-svg-renderer.js"></script>
    <!-- note: this uses the BUILT version of scratch-render!  make sure to npm run build -->
    <script src="../../dist/web/scratch-render.js"></script>

    <canvas id="test" width="480" height="360" style="width: 480px"></canvas>
    <input type="file" id="file" name="file">

    <script>
        // These variables are going to be available in the "window global" intentionally.
        // Allows you easy access to debug with `vm.greenFlag()` etc.
        window.devicePixelRatio = 1;
        var canvas = document.getElementById('test');
        var render = new ScratchRender(canvas);
        var vm = new VirtualMachine();
        var storage = new ScratchStorage();
        var mockMouse = data => vm.runtime.postIOData('mouse', {
            canvasWidth: canvas.width,
            canvasHeight: canvas.height,
            ...data,
        });
        vm.attachStorage(storage);
        vm.attachRenderer(render);
        vm.attachV2SVGAdapter(new ScratchSVGRenderer.SVGRenderer());
        vm.attachV2BitmapAdapter(new ScratchSVGRenderer.BitmapAdapter());
        document.getElementById('file').addEventListener('click', e => {
            document.body.removeChild(document.getElementById('loaded'));
        });
        document.getElementById('file').addEventListener('change', e => {
            const reader = new FileReader();
            const thisFileInput = e.target;
            reader.onload = () => {
                vm.start();
                vm.loadProject(reader.result)
                    .then(() => {
                        // we add a `#loaded` div to our document, the integration suite
                        // waits for that element to show up to assume the vm is ready
                        // to play!
                        const div = document.createElement('div');
                        div.id='loaded';
                        document.body.appendChild(div);
                        // ------------------------------ //
                        vm.greenflag(); // 这里添加这条语句
                        // ------------------------------ //
                    });
            };
            reader.readAsArrayBuffer(thisFileInput.files[0]);
        });
    </script>
</body>

现在打开之后随便扔一个sb文件进去就会自动播放了

 

scratch播放器

然后你就可以根据这个网页的逻辑进行改编,进一步定制实现自己的播放器界面了,比如像网易卡达这样子



作者:章开晴
链接:https://www.jianshu.com/p/1bbe539d5b87
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
發表於 程式設計, 軟體使用 | 發表迴響

php的strpos()函数的返回值false与0问题

參考網址:志文工作室

php中的strpos函数定义说明如下:

int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )

返回 needle 在 haystack 中首次出现的数字位置,以整型返回位置信息。如果没找到 needle, strpos() 将返回布尔型的 FALSE 值。

存在问题:

如果$needle出现在$haystack头部,则返回值为0。在不严格的判断中,0 = false,这样就无法区分是否找到。

解决方法:

使用符号“===”而不是“==”进行判断。
判断符号 “==”会转换类型再进行比较,而更严格的符号“===”会先判断类型是否相同,然后才进行比较。

如下举例:

//判断字符串是否存在的函数
function strexists($haystack, $needle) {
    return !(strpos($haystack, $needle) === FALSE);//注意这里的"==="
}

 

 

發表於 程式設計 | 發表迴響

hosts的運用

參考網址: iT邦幫忙

C:\Windows\System32\drivers\etc\hosts
 linux 放在 /etc/hosts

簡而言之,就是要查詢一個主機名稱時,
如果這個檔案沒定義的話,
就會去查DNS。
例如,若該檔案的內容有:

1.2.3.4   ithelp.ithome.com.tw

那麼您要連ithelp.ithome.com.tw時,
不會去向 DNS 查真正的 IP 是什麼,
而馬上往 1.2.3.4 來送。

如果有一些常要連的目標,
若 DNS 常會有問題,或者很清楚其 IP ,
也可以手動去加上 IP 及其對應名稱;
或者若 DNS 還沒有設好,
而主機上有好幾個虛擬主機的話,
且是用 virtual name 來對應的話,
也可以利用 hosts 的功能,
這樣在這台電腦上 query 該名稱,
雖 DNS 還沒有該記錄,但您電腦就可 query 到正確的 IP 所在,
而虛擬主機也可以由被 query 的hostname來做出回應;
這是 hosts 可以的正向作法。

寫程式時常會用到localhost
懶得打那麼多字,就在hosts檔中加入

127.0.0.1 lo

修改完後記得重新啟動網路

那麼只要在網址列輸入lo就可以連到localhost了

 

ultraedit
licensing.ultraedit.com
licensing2.ultraedit.com

發表於 Linux系統, Windows系統, 軟體使用 | 發表迴響

[SQL]查詢及去除換行符號

參考網址:
MySQL 查询带有回车换行符的内容

MySQL 去除字段中的换行和回车符

MySQL查询带有回车换行符内容的方法:
select * from table where content like '%\r\n%';//或者 \n

108.11.16更新
新版的mysql換行符號只剩'\n'
所以下命令變成
SELECT * FROM `player` WHERE `player_name` like '%\n%'

php語法
str_replace(array("\r", "\n", "\r\n", "\n\r"), '', $str);

參考網址:標準之旅
參考網址:淺談mysql資料庫中的換行符與textarea中的換行符

 

解决方法:
UPDATE tablename SET field = REPLACE(REPLACE(field, CHAR(10), ''), CHAR(13), '');
UPDATE player SET player_engname = REPLACE(REPLACE(player_engname, CHAR(10), ''), CHAR(13), '') where player_id = 8
char(10):  换行符
char(13):  回车符

MySQL的trim函数没办法去掉回车和换行,只能去掉多余的空格,可以用MySQL的replace函数。

 

 

========================================
以下查詢不適用在mysql

參考網址:逍遙齋

SQL 查詢 換行符號
where id like '%'+char(10)+'%'

CHAR 可用於將控制字符插入字符串中。下表顯示了一些常用的控制字符。
控制鍵 值
Tab: CHAR(9)
換行: CHAR(10)
ENTER: CHAR(13)

Ex:
SELECT * FROM TABLE_NAME
WHERE 1=1 AND COLUMN_NAME LIKE '%'+CHAR(13)+'%'

update base_mapping set basename = replace(basename,Char(10),'')
update base_mapping set basename = replace(basename,Char(13),'')

發表於 程式設計 | 發表迴響

複製百度文庫

參考網址:百度文库收费高?教你六招轻松免费下载

嗨文库是一款在线BD文库文档下载工具,目前有两个网址:http://www.hiwenku.com/ 和 http://47.95.226.123/wenku/。可以原格式下载百度文库文档的好网站。

發表於 軟體使用 | 發表迴響

[phpmyadmin] 登錄超時 (1440 秒未操作),請重新登錄

參考網址:精讚布落格

 

phpmyadmin是很好用的工具,但是出現登錄超時 (1440 秒未操作)這樣的問題,要一直重登滿煩的。請照下面修改:

一、修改 /etc/php.ini

設定系統逾時的秒數
session.gc_maxlifetime = 86400

重啟 apache 生效

二、修改 /path/to/phpmyadmin 設定檔

到你安裝phpmyadmin的目錄

理論上在 phpmyadmin的根目錄下應該有 config.inc.php 這個檔案,如果沒有的話,請將sample設定檔拿來用:

# cp config.sample.inc.php config.inc.php

修改config.inc.php

最上面加入一行,設定時間(秒數)即可

$cfg[‘LoginCookieValidity’] = 86400;

UBUNTU的phpmyadmin路徑
可以查/etc/apache2/conf-enabled/phpmyadmin.conf
應該 是放在/usr/share/phpmyadmin

另一個方法 參考 台部落
在/usr/share/phpMyAdmin / libraries / config.default.php 裏找到$cfg[‘LoginCookieValidity’] = 1440;

如何得知目前phpmyadmin的連線時間限制?
不知道phpmyadmin哪個程式有顯示這個訊息,所以就自已寫了。
/usr/share/phpmyadmin/server_status.php
 

$lcv='LoginCookieValidity:'. $cfg['LoginCookieValidity'];
$response->addHTML($lcv);

在phpmyadmin的操作界面中,點伺服器–>狀態,就可以查詢目前的連線限制。

後來發現這個值可以在phpmyadmin 伺服器–>設定–>功能中找到

 

不用密碼就可登錄,適用於測試環境
編輯config.inc.php 把帳號密碼寫入設定檔
$cfg[‘Servers’][$i][‘auth_type’] = 'config';
$cfg[‘Servers’][$i][‘user’] = 'root';
$cfg[‘Servers’][$i][‘password’] = 'xxxxxx';

發表於 Linux系統, 程式設計 | 發表迴響

firefox 好用的附加元件

參考網址:
 Clear  Browing Data
Delete browsing data directly from the browser toolbar. Clear cookies, history and cache with a single click.

JavaScript Errors Notifier
Notifies JavaScript errors by icon in toolbar bar or notification popup
GitHub → https://goo.gl/RBcFK8
Test page → https://goo.gl/IEXS2y
按F12可以快速打開開發人員工具

Print Preview Button
Open the Print Preview to view a page before printing it.
Paper costs money (and trees) so it is worth checking what the page looks like before you print it. Though it has always amazed me just how much the button gets downloaded.

發表於 程式設計, 軟體使用 | 發表迴響

PHP 取得用戶真實 IP

參考網址:Linux 技術手札

要用 PHP 取得用戶的 IP 十分容易,只要用 $_SERVER[‘REMOTE_ADDR’] 變數就可以知道用戶的 IP,但如果用戶使用了 proxy server 上網的話,$_SERVER[‘REMOTE_ADDR’] 只會得到 proxy 的 IP 地址。

以下方法會使用 $_SERVER[“HTTP_CLIENT_IP”] 及 $_SERVER[“HTTP_X_FORWARDED_FOR”] 解決這個問題:

<?php
if (!empty($_SERVER["HTTP_CLIENT_IP"])){
    $ip = $_SERVER["HTTP_CLIENT_IP"];
}elseif(!empty($_SERVER["HTTP_X_FORWARDED_FOR"])){
    $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
}else{
    $ip = $_SERVER["REMOTE_ADDR"];
}
     
echo $ip;
?>

 

發表於 程式設計 | 發表迴響

嫌Raspberry Pi太弱?Atomic Pi搭載Intel Atom處理器帶來更強效能

參考網址:電腦王

Atomic Pi則是以Atom x5-Z8350為核心設計的開發板,並搭載2GB DDR3L-1600記憶體、16GB eMMC儲存裝置與SD讀卡機(最大可支援256GB記憶卡),支援GbE有線網路、IEEE 802.11b/g/n/ac無線網路、藍牙4.0、HDMI、USB 2.0、USB3.0等網路與輸出入介面,基本規格與輕省筆電接近,使用者可自由安裝Windows 10或Linux等作業系統。

 

目前Atomic Pi在Kickstarter集資網站募款,本體價格為美金34元 (約合新台幣1,060元),搭配Breakout Shield擴充底座則為美金49元(約合新台幣1,520元) ,預定上市時間為2019年1月。

發表於 硬體維修, 軟體使用 | 發表迴響

網頁列印、轉成PDF

參考網址:程式前沿 CSS3輸出PDF列印的小技巧
it邦幫忙 其實Css的內心還住著一位Print​

開源中國 PHP输出PDF打印HTML5+CSS3打印格式控制
本文推荐两个可用的类库:Princewkhtmltopdf。这两位都是跨平台系统支持,并且不需要内嵌于php,不需要有任何担心。

Prince和wkhtmltopdf,实际上就是一个html5+css3的解析器,并且是完整支持css3 @page部分的打印特性的功能。并且具备生成PDF的功能。其中Prince是收费的,但他提供免费使用License,美中不足的地方就是生成PDF预览时,第一页右上角会有一个P字的icon,不过在打印的时候就会消失掉。

两者比较,Prince对中文样式的支持更好(可能wkhtmltopdf是因为我的CSS写法有问题,没有针对@mediaprint),修改中文字体,wkhtmltopdf还是会用默认的宋体输出,而Prince则是你指定的字体。

 

 

發表於 程式設計 | 發表迴響