2020年4月17日金曜日

3Dプリンタでマスク作ってみる

作りたいな、作ってみたいなと思って、かなり時間が経ってしまった。


ネットで公開されているありがたいデータ

国内は以下のような感じ? 海外のは、フェイスガードが多いのかな。
名称 リンク 備考
イグアス http://www.iguazu-3d.jp/case_study/laboratory/3d_mask/ 男性/女性/子供向けがある♥
PITATT 3D print mask https://www.rootech360.com/ REGULAR/SMALLがある
NANOHACK 2.0 https://copper3d.com/hackthepandemic/ 本格的
イヤーガードとフェイスシールド https://flashforge.co.jp/stl-earguard-faceshield/
データ集 https://cults3d.com/en/collections/useful-3d-printed-coronavirus-covid19-tool 一覧になっていて見やすい

PITATT 3D print maskのシミュレーション

PITATT 3D print maskを出力した場合のシミュレーション
REGULARで、3時間45分くらいかかる見込み。


イグアス マスクのシミュレーション

イグアス マスクを出力した場合のシミュレーション
男性向けで、6時間45分くらいかかる見込み。


でも、サポート部分の印刷が支配的なので、PITATT 3D print maskのように配置を変えれば印刷時間変わるかもしれない。

X方向を60°にしたら、いい感じになった。 約3時間


PITATT 3D print maskを印刷してみた



フィラメントが劣化してしまったのか、ガタガタになってしまったOrz
乾燥させないとなー。めんどー。
微速度撮影にチャレンジしてみたよ。



動画の編集には「OpenShot」を使ってみた。
だけど、日本語入力が出来ないOrz
それと、ハードウェアエンコードが出来ない・・・。
課題はたくさんある。

2020年4月15日水曜日

YouPHPTube(avideo)を試してみる

動画管理・・・気になってやってみたかった。
https://www.moongift.jp/2017/06/youphptube-php製のyoutubeクローン/
試すだけ、、、なのできっとDockerがいいんじゃないかなと思った。


↑はフリー素材の犬 かわいい
https://pixabay.com/ja/videos/犬-飲酒-ペット-食品-5631/

Dockerでやってみる

久しぶりです。
Docker自体のインストールもやらないとね

Docker自体のインストール

・docker-ce
https://docs.docker.com/engine/install/ubuntu/
LinuxMintの場合は、Ubuntuじゃないので、注意。
「$(lsb_release -cs)」の部分を「bionic」書き換える。
https://continue-to-challenge.blogspot.com/2019/07/redmine.html
・docker-composer
https://docs.docker.com/compose/install/

ubuntuイメージの取得

$ sudo docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
5bed26d33875: Pull complete
f11b29a9c730: Pull complete
930bda195c84: Pull complete
78bf9a5ad49e: Pull complete
Digest: sha256:bec5a2727be7fff3d308193cfde3491f8fba1a2ba392b7546b43a051853a341d
Status: Downloaded newer image for ubuntu:18.04
docker.io/library/ubuntu:18.04

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              18.04               4e5021d210f6        2 weeks ago         64.2MB
起動
$ sudo docker run -it -d --name YouPHPTube -p 127.0.0.1:10080:80 ubuntu:18.04
1e9996bda6d080f5c7697bacdefd5f0f817dc6303b15003726c2bc2cbb10178c
$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
1e9996bda6d0        ubuntu:18.04        "/bin/bash"         18 seconds ago      Up 17 seconds       127.0.0.1:10080->80/tcp   YouPHPTube

環境の準備

起動したコンテナにアタッチする
$ sudo docker attach 1e9996bda6d0
<コンテナ側>
apt upate
apt upgrade
これで準備OKのはず

apacheのインストール

作成したコンテナにapacheをインストールしてみる
<コンテナ側>
apt install -y apache2 apache2-utils
service apache2 start
母艦側のでlocalhost:10080にアクセスしてみる


まずはOK

MariaDBのインストール

本当は、1コンテナ(イメージ)に複数のサービスを入れるのは推奨されないみたいだけど、今回はお試しということで、詰め込んじゃう。
公式の手順では、MySQLになっているけど、なんとなくMariaDBにしてみた。
apt install mariadb-server mariadb-client
service mysql start
mysql_secure_installation
アクセスできるかな?
mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 51
Server version: 10.1.44-MariaDB-0ubuntu0.18.04.1 Ubuntu 18.04

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)
OKそう

AVideo用のユーザー・データベース作成

データベース:AVideo
ユーザー:AVideo
mysql -u root
create database AVideo;
create user AVideo@localhost identified by '**********';
grant all privileges on AVideo.* to AVideo@localhost;
もうひとつEncoder用
データベース:AVideoEncoder
mysql -u root
create database AVideoEncoder;
grant all privileges on AVideoEncoder.* to AVideo@localhost;

その他必要なもの

apt install php libapache2-mod-php php-mysql php-curl php-gd php-intl ffmpeg git libimage-exiftool-perl php-mbstring php-gettext python curl
これで、下準備完了

YouPHPTube(AVideo)のインストール

手順書どおりにやってみる
cd /var/www/html
git clone https://github.com/WWBN/AVideo.git
git clone https://github.com/WWBN/AVideo-Encoder.git
curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl
chmod a+rx /usr/local/bin/youtube-dl
a2enmod rewrite
phpenmod mbstring
service apache2 restart

apacheの設定

/etc/apache2/apache2.confで AllowOverride All に変更する
<Directory /var/www/>
          Options Indexes FollowSymLinks
          AllowOverride All
          Require all granted
</Directory>
そのあと更新
a2enmod rewrite
service apache2 restart

アクセスしてみよう

母艦から
http://localhost:10080/AVideo
にアクセスしてみる


ほう。
指示に従って解決していこう

Your videos directory must be writable

「>Details」を開くとやり方が出てきた
mkdir /var/www/html/AVideo/videos
chown www-data:www-data /var/www/html/AVideo/videos && chmod 755 /var/www/html/AVideo/videos

Your post_max_size is 8M, it must be at least 100M

POSTのサイズ
nano /etc/php/7.2/apache2/php.ini
; Maximum size of POST data that PHP will accept.
; Its value may be 0 to disable the limit. It is ignored if POST data reading
; is disabled through enable_post_data_reading.
; http://php.net/post-max-size
post_max_size = 8M
とりあえず2Gにしてみた。

Your upload_max_filesize is 2M, it must be at least 100M

アップロードサイズ的なやつか
nano /etc/php/7.2/apache2/php.ini
; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 2M
こちらも2Gにしてみた
変更後は、apacheの再起動を行う

セットアップを続けてみよう

あれー


もう一度やろうとすると、、起動しちゃったYO


こっちはこれでいいのかな

YouPHPTube(AVideo)-Encoder にアクセスしてみよう

セットアップウィザード

母艦から
http://localhost:10080/AVideo-Encoder
にアクセスしてみる


ほう。
指示に従って解決していこう
  • Your videos directory must be writable
  • Your max_execution_time is 30, it must be at least 7200
     とりあえず、7200にしてみた
  • Your memory_limit is 128M, it must be at least 512M
    とりあえず2Gにしてみた
これでよし


ここでのSteramerURLはDockerの中なので、**localhost:80/AVideo/**になるので注意

各種設定

基本設定

管理者でログインして
[設定]-[サイトの構成]から各種設定を行っていく

サインイン/アップ

[設定]-[一般的な設定]から
名称 説明 設定値
userMustBeLoggedIn Hide the website to non logged users 有効
doNotIndentifyByEmail Do not show user’s email on the site 有効
doNotIndentifyByUserName Do not show user’s username on the site 有効

プラグイン

[設定]-[その他]-[プラグイン]
名前 要約
Hotkeys Enable hotkeys for videos, like F for fullscreen, space for play/pause, etc…
SeekButton Add seek buttons to the control bar
VideoTags User interface for managing tags
これでしばらく使ってみようかね

コンテナの開始と終了など

忘れてたけど、まだアタッチで起動していただけだった。
アタッチで起動したものはコマンドプロンプトからCtrl+P → Ctrl+Qで抜ける
sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
1e9996bda6d0        ubuntu:18.04        "/bin/bash"         3 days ago          Up 3 days           127.0.0.1:10080->80/tcp   YouPHPTube

#終了
sudo docker stop 1e9996bda6d0

#開始
sudo docker start 1e9996bda6d0

#各種サービス起動
sudo docker exec -it 1e9996bda6d0 service apache2 start
sudo docker exec -it 1e9996bda6d0 service mysql start

#アタッチ
sudo docker attach 1e9996bda6d0

参考

https://github.com/WWBN/AVideo/wiki/How-to-install-LAMP,-FFMPEG-and-Git-on-a-fresh-Ubuntu-18.x-for-AVideo-Platform-version-4.x-or-newer
https://qiita.com/tsumtsumyuma/items/de7678d7f118793ea3e0
http://enakai00.hatenablog.com/entry/20140628/1403933390

Redmineをちゃんと使う

在宅勤務で、いろいろなことを見直している。
なんとなく使っているRedmineもちゃんと使うためにいろいろ調べようと思う。
自分用に家庭でも使用しているが、あまり使えていなかったし。

用語の整理

ほんとなんとなくで使っていたと反省・・・。
用語 意味 デフォルト値 参考
ワークフロー 「仕事の流れ」を意味する言葉で、チケット作成から完了までの流れを決める機能 「ロール数」×「トラッカー数」存在する 引用元
ロール ユーザーがプロジェクト上で行える操作を定義したもの 「管理者」、「開発者」、「報告者」 引用元
トラッカー トラッカーはチケットの大分類 バグ/機能/サポート 引用元
チケット タスク管理の最小単位 引用元
ステータス ステータスはチケットの進捗状況を表すもの 新規/進行中/解決/フィードバック/終了/却下 引用元
作業分類 チケットの作業時間を活動(作業分類)単位で分ける 「設計作業」、「開発作業」 引用元
http://redmine.jp/glossary/

自分に合わせてカスタマイズする

上記用語やそれを実際に即したかたちにしたら、家族にも使ってもらえたりするのかと・・・。

趣味の開発用途の場合

これは、1人で完結するので、単純化できる
名称 設定
ワークフロー あとで
ロール 変更なし(管理者/開発者/報告者)
トラッカー 変更なし(バグ/機能/サポート)
ステータス 変更なし(新規/進行中/解決/フィードバック/終了/却下)
作業分類 変更する(調査作業/設計作業/開発作業/確認作業)

作業分類の追加

管理者でログインして、[管理]→[選択肢の値]にて、作業分類(作業時間)を追加する


これでOK

ワークフローの確認

1人なので、ロールは「管理者」のみになる(T_T)
変更はなしで大丈夫


勉強系用途の場合

これも、1人で黙々なので、単純化できる
名称 設定
ワークフロー あとで
ロール 変更なし(管理者/開発者/報告者)
トラッカー 変更する勉強/バグ/機能/サポート)
ステータス 変更する(新規/進行中/終了/却下)※ワークフローで対応する
作業分類 変更する(インプット/アウトプット/テスト・振り返り)

トラッカーの追加

管理者でログインして、[管理]→[トラッカー]にて「勉強」を追加する


作業分類の表示/非表示を変更

管理者でログインして、[管理]→[選択肢の値]にて
作業分類(作業時間)でインプット/アウトプット/テスト・振り返りを追加する
その後、プロジェクトに移動して[設定]→[時間管理]から表示したい項目を有効化する。


ワークフローでステータス遷移を縛る

ステータスの遷移を新規/進行中/終了/却下のみにしたい
解決とフィードバックは遷移しないようにする。
これは、[管理]→[ワークフロー]にてトラッカーを「勉強」にして遷移を決める。


これで、ステータスの遷移を確認する

これでOK

家庭内タスク管理の場合

これは、家族で使うことになるので、少し複雑になるか?
名称 設定
ワークフロー あとで
ロール 変更する(管理者/依頼者/作業者)
トラッカー 変更する(家のこと/学校のこと/会社のこと/実家のこと)
ステータス 変更なし(新規/進行中/解決/フィードバック/終了/却下)
作業分類 変更する(見積/対応/確認)

ロールの追加

管理者でログインして、[管理]→[ロールと権限]にて行う

その他

トラッカーの追加は、今までと同じ。

2020年4月7日火曜日

PhpSpreadsheet をオフライン環境に導入する

昔にPHPExcelを使ったクローズなサービスを作っていた。
クローズというのは、インターネットから遮断されているということ。
このサービスを少し手直すする必要が出てきた。
寝ている子を起こすといやつだ。
どうやらPHPExcelはもう推奨されていないらしい
https://github.com/PHPOffice/PHPExcel
https://qiita.com/suin/items/7a8d0979b7675d6fd05b
「PhpSpreadsheet」というのが後継にあるのかな。
https://phpspreadsheet.readthedocs.io/en/latest/
https://github.com/PHPOffice/PhpSpreadsheet

環境

開発環境はlinuxで、上記のサービス環境はwindowsという変な状態になっている。
windows環境はインターネットからは遮断されており、検査されたデータしか持ち込めない。
しかも手動検査・都度申請が必要…

PhpSpreadsheet の公式インストール方法

公式では、composerを使って
composer require phpoffice/phpspreadsheet
php -S localhost:8000 -t vendor/phpoffice/phpspreadsheet/samples
で一撃的な感じで書いてある。
composerねー。npmもそうだけど、オフライン環境への導入が大変そう。
みんなはどうしているのかな? 巨人の肩に乗らせて欲しい
まずは、公式の手順でやってみる

早速サンプルを実行してみる

php -S localhost:8888 -t vendor/phpoffice/phpspreadsheet/samples


ディレクトリ構成

これで、一体どのようなファイル生成されているかを見てみよう
:~/excel$ tree
.
├── composer.json
├── composer.lock
└── vendor
    ├── autoload.php
    ├── composer
    │   ├── ClassLoader.php
    │   ├── LICENSE
    │   ├── autoload_classmap.php
    │   ├── autoload_files.php
    │   ├── autoload_namespaces.php
    │   ├── autoload_psr4.php
    │   ├── autoload_real.php
    │   ├── autoload_static.php
    │   └── installed.json
    ├── markbaker
    │   ├── complex
    │   └── matrix
    ├── phpoffice
    │   └── phpspreadsheet
    │       ├── CHANGELOG.PHPExcel.md
    │       ├── CHANGELOG.md
    │       ├── CONTRIBUTING.md
    │       ├── LICENSE
    │       ├── bin
    │       ├── composer.json
    │       ├── composer.lock
    │       ├── docs
    │       ├── mkdocs.yml
    │       ├── phpunit.xml.dist
    │       ├── samples
    │       └── src
    └── psr
        └── simple-cache
            ├── LICENSE.md
            ├── README.md
            ├── composer.json
            └── src
なるほど・・・。
vender配下に生成するのと、autoload.phpが肝なのか?

Composerをオフラインで使う

調べてみると、オンラインPCでComposerを使用して必要なライブラリなどを取得して環境を作って、それをオフライン環境に導入するといった方法が多いみたい
https://teratail.com/questions/76493
https://blitzgate.co.jp/blog/1820/
上記を踏まえて作戦を考えた
  1. ローカルのリポジトリ的なやつからインストール
  2. 手動で依存関係を解決する
  3. オンラインPC環境で構築してから転送する

ローカルのリポジトリからインストール

https://qiita.com/suin/items/d24c2c0d8c221ccbc2f3
windows版のcomposerをインストールするハードルがあるが、出来てしまえば、応用がききそう。
今回は時間が無いので、見送る。

手動で依存関係を解決してみる

依存関係の定義

依存関係はcomposer.jsonに定義しているみたい
    "require": {
        "php": "^7.1",
        "ext-ctype": "*",
        "ext-dom": "*",
        "ext-gd": "*",
        "ext-iconv": "*",
        "ext-fileinfo": "*",
        "ext-libxml": "*",
        "ext-mbstring": "*",
        "ext-SimpleXML": "*",
        "ext-xml": "*",
        "ext-xmlreader": "*",
        "ext-xmlwriter": "*",
        "ext-zip": "*",
        "ext-zlib": "*",
        "markbaker/complex": "^1.4",
        "markbaker/matrix": "^1.2",
        "psr/simple-cache": "^1.0"
    },

ベースとなるディレクトリ構造

まずは、この構造を作る
:~/excel$ tree
.
└── vendor
    ├── markbaker
    │   ├── complex
    │   └── matrix
    ├── phpoffice
    │   └── phpspreadsheet
    └── psr
        └── simple-cache
それぞれを手動でインストールしてみようと試みた。
名称 ソース
PHPComplex https://github.com/MarkBaker/PHPComplex
PHPMatrix https://github.com/MarkBaker/PHPMatrix
simple-cache https://github.com/php-fig/simple-cache
phpspreadsheet https://github.com/PHPOffice/PhpSpreadsheet
composer関係を除けば同じようになった。

サンプルを実行してみる

これで動けばいいのだけれど
$ php -S localhost:8888 -t vender/phpoffice/phpspreadsheet/samples
PHP 7.2.24-0ubuntu0.18.04.3 Development Server started at Sun Mar 15 09:52:56 2020
Listening on http://localhost:8888
Document root is /***/vender/phpoffice/phpspreadsheet/samples
Press Ctrl-C to quit.
[Sun Mar 15 09:53:12 2020] PHP Fatal error:  Uncaught Exception: Composer autoloader could not be found. Install dependencies with `composer install` and try again. in /***/vender/phpoffice/phpspreadsheet/src/Bootstrap.php:22
Stack trace:
#0 /***/vender/phpoffice/phpspreadsheet/samples/Header.php(9): require_once()
#1 /***/vender/phpoffice/phpspreadsheet/samples/index.php(3): require_once('/home/adeno/exc...')
#2 {main}
  thrown in /***/vender/phpoffice/phpspreadsheet/src/Bootstrap.php on line 22
[Sun Mar 15 09:53:12 2020] 127.0.0.1:39226 [500]: / - Uncaught Exception: Composer autoloader could not be found. Install dependencies with `composer install` and try again. in /***/vender/phpoffice/phpspreadsheet/src/Bootstrap.php:22
Stack trace:
#0 /***/vender/phpoffice/phpspreadsheet/samples/Header.php(9): require_once()
#1 /***/vender/phpoffice/phpspreadsheet/samples/index.php(3): require_once('/home/adeno/exc...')
#2 {main}
  thrown in /***/vender/phpoffice/phpspreadsheet/src/Bootstrap.php on line 22

あら、、、
Composer autoloader could not be found

オンラインPC環境で構築してから転送する

他のPCで環境構築したものを持ってくるのは最終手段にしたかったが、仕方ない。
linuxで環境構築した一式をwindows側に持ってくる。
php -S localhost:8888 -t vendor\phpoffice\phpspreadsheet\samples


なんと、一撃だった。

肝心な使い方

おいおいと
https://symfoware.blog.fc2.com/blog-entry-2059.html
https://vertys.net/php-spreadsheet-often-use-process/
https://qiita.com/BRSF/items/ed32311d48161be7c719
https://blog.capilano-fw.com/?p=3945#i-16
https://qiita.com/sudnonk12/items/a0d58cc0f6ff1c6e2765
http://ariarijp.hatenablog.com/entry/2017/08/24/093000
https://knooto.info/php-phpexcel-vs-phpspreadsheet/
とりあえずサンプル+追記で今日はここまで。
<?php

require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Fill;
use PhpOffice\PhpSpreadsheet\Style\Style;

$spreadsheet = new Spreadsheet();

// Set document properties
$spreadsheet->getProperties()->setCreator('Adeno')
    ->setLastModifiedBy('Adeno')
    ->setTitle('タイトル')
    ->setSubject('件名')
    ->setDescription('コメント')
    ->setKeywords('キーワード');

$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'Hello World !');
$sheet->setCellValue('A2', '日本語はどう?');
$sheet->unFreezePane();


// Rename worksheet
$spreadsheet->getActiveSheet()->setTitle('シート1');


$sheet = $spreadsheet->createSheet(1);
$sheet->setCellValue('A1', '2枚めHello World !');
$sheet->setCellValue('A2', 'No');
$sheet->setCellValue('B2', '名前');
$sheet->setCellValue('C2', '単価');
$sheet->setCellValue('D2', '数量');
$sheet->setCellValue('E2', '小計');
$sheet->setTitle('シート2');

// スタイルを指定
$sharedStyle = new Style();
    $sharedStyle->applyFromArray([
        'borders' => [
            'top' => ['borderStyle' => Border::BORDER_THIN],
            'bottom' => ['borderStyle' => Border::BORDER_THIN],
            'right' => ['borderStyle' => Border::BORDER_THIN],
            'left' => ['borderStyle' => Border::BORDER_THIN],
        ]
    ]
);


$sheet->duplicateStyle($sharedStyle, 'A2:E3');

$sheet->freezePane('A2');   //1行目を固定

// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$spreadsheet->setActiveSheetIndex(0);


$writer = new Xlsx($spreadsheet);

// Redirect output to a client’s web browser (Xlsx)
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="01simple.xlsx"');
header('Cache-Control: max-age=0');
// If you're serving to IE 9, then the following may be needed
header('Cache-Control: max-age=1');


//$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->save('php://output');
exit;
こんな感じ