An empty bottle

しがないメンヘラエンジニアの日記。

管理画面のデザインどうするの

BootstrapはBootstrapでも、 純粋なBS3を使うとありきたりなデザインになってしまうのが、欠点。

有志の方がテンプレートを独自で開発してくださっているので ありがたく拝見。

uxmilk.jp

このサイト見てうんうんうなりながら、 とりあえず今開発中のサイトの管理画面デザインはGentelellaにしました。 綴りあってるはず。

cloud9で自動的にphp7.1にアップデートしてついでにlaravelをインスコする。

備忘録

#リポジトリ
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update

#apache用phpモジュール
sudo apt-get install libapache2-mod-php7.1
sudo a2dismod php5
sudo a2enmod php7.1

#php7のモジュールを追加
sudo apt-get install php7.1-dom
sudo apt-get install php7.1-mbstring
sudo apt-get install php7.1-zip
sudo apt-get install php7.1-mysql

# laravel install
# rm README.md php.ini hello-world.php
sudo composer self-update
composer create-project laravel/laravel ./laravel --prefer-dist
shopt -s dotglob
mv laravel/* ./
rm -rf laravel

これを update.sh として作って sh update.sh してやればいいんでないの?

OCR 画像解析(調査段階)

背景・前置き

最近の興味は、画像分析。というのも、要件定義中のシフト管理 + WebERPでレシートの取り込みを実装できないかと思い立ったからである。
今要件定義中のWebアプリに取り込めたら、それはニーズがあるのではないかと思って、本格的に調査してみる。
..まあ、本来であればPOSレジのデータを取り込めれば一番簡単なんですがね..それはまた別の機会に。

有料であれば、他社が開発しているものが有ると思いますが、どうせなら自分で作ったりlibraryを見たりしたほうが面白いですよね。

この調査に伴って新たにカテゴリ追加します。

紹介

MODI

詳細↓

itpro.nikkeibp.co.jp

マイクロソフトが提供しているだけあって、結局はWindows専用なようです。残念。
無理やり通信してしまえばいいのか…とも思ってしまいますが、それはコストが高すぎる。

tesseract-ocr

kikuchy.hatenablog.com

一番無難なのはこちらでしょうか。linuxmacで動きそうですね。試してみましょう。

あとがき

使用感、その他のツールについては、別途記載していきます。お楽しみに。
楽しみにしてくれてるのは未来の自分のみでしょうが。

SessionのLifetimeの永続化。@Laravel5

用途

仕様によっては、Sessionをn分やm時間など有限にせず無限にしたい場合。
※厳密には、今回は「Browserが閉じるまで」

方法

設定ファイル

app/config/session.php

設定箇所

<?php

  // 略

  //'expire_on_close' => false 
  'expire_on_close' => true

  // 略

注意点

expire_on_closetrueにしたところで、PHPガーベジコレクションは防げません。
gcの影響で、消えてしまうことはあります。cloud9だとありがち..?そんな印象。
そのため、念のためlifetimeも修正しておきましょう。 lifetimeの目安はシステムによりけりですが。。

LaravelCollectiveにカスタム関数追加してやったぞ @Laravel5.4

概要

HTMLにAnchor吐き出す関数なかったな。 →作るか

1. artisan

php artisan make:provider HtmlServiceProvider

2.その中身

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Html;

class HtmlServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        Html::macro('anchor', function ($text, $attrs = '') {
            $anc = '<a' ;
            
            if (is_array($attrs)){
                foreach($attrs as $key => $value) {
                    $anc .= ' ' . $key . '=\'' . $value . '\'';
                }
                
            } else {
                $anc .= $attrs;
            }
            
            $anc .= '>' . $text . '</a>';
            return $anc;
        });
    }
    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

3. app.phpに追加

<?php

//略
    'aliases' => [

//略
        
        // Custom Function
        'CostomHelper' => 'app\lib\CostomHelper',

    ],

4. Usage

<?php

{!! Html::anchor('<i class="ban icon"></i>パスワードを忘れた場合', ['href' => '/user/forgot', 'class' => 'ui negative basic button']) !!}

5.おわり

もう今日は頑張らない

文字列のUnique制約でエラー出るんやけど @Laravel5.4

お疲れ様です。

お遊びで、Laravel5.4でWebアプリ作成してるんですよ。

順調かと思ってたら、migrateでコケました。

stringにunique指定すると、コケる。

解決方法は以下です!

またまたリンク貼るだけになりましたが、大変助かりました。

AppServiceProviderをいじるんですよ!!!

teratail.com

カスタム関数をエイリアス使ってしまおうぜ。 @laravel5

以前、こんな記事を書きました。↓

cresta522.hateblo.jp

これは確かに手段としてあるが、 Laravelチックではないな…と反省。

だったら もう少しLaravelチックに書こうじゃないかと。

上記記事と比べてみてください。

1. /app/lib/CostomHelper.php

ファイル名は適当で良いです。

<?php

namespace app\lib;

class CostomHelper
{

    /**
    * Create link tag element for css
    * 
    * @param   string  $file_name
    * @param   bool    $secure = false
    * @return  string  link_tag
    */
    public static function asset_css($file_name, $secure = false){
        if (is_array($file_name)) {
            $tag = '';
            for ($i = 0; $i < count($file_name); $i++) {
                $relative_file_path = '/css/' . $file_name[$i] . '.css';
                $tag .= self::make_tag($secure, 'link', $relative_file_path, ['rel' => 'stylesheet']) . PHP_EOL;
            }
        } else {
            $relative_file_path = '/css/' . $file_name . '.css';
            $tag = self::make_tag($secure, 'link', $relative_file_path, ['rel' => 'stylesheet']);
        }
        return $tag;
    }
    
    /**
    * Create link tag element for javascript
    * 
    * @param   string  $file_name
    * @param   bool    $secure = false
    * @return  string  script_tag
    */
    public static function asset_js($file_name, $secure = false)
    {
        if (is_array($file_name)) {
            $tag = '';
            for ($i = 0; $i < count($file_name); $i++) {
                $relative_file_path = '/js/' . $file_name[$i] . '.js';
                $tag .= self::make_tag($secure, 'script', $relative_file_path, ['type' => 'text/javascript']) . PHP_EOL;
            }
      
        } else {
            $relative_file_path = '/js/' . $file_name . '.js';
            $tag = self::make_tag($secure, 'script', $relative_file_path, ['type' => 'text/javascript']);
        }
    
        return $tag;
       
    }
    
    
    /**
    * Create link tag
    * 
    * @param   string  $tag_header
    * @param   string  $relative_file_path
    * @param   string  $attr = ''(array)
    * @return  string  script_tag
    */
    public static function make_tag($secure, $tag_header, $relative_file_path, $attr = '')
    {
        $file_full_name = asset($relative_file_path, $secure);
        $abs_file_path = public_path($relative_file_path);
        $timestamp = filemtime($abs_file_path);
        
        $tag_attr = ' ';
        if(is_array($attr)){
            foreach ($attr as $key => $value) {
                $tag_attr .= $key . '="' . $value . '" ';
            }
        } else {
            $tag_attr .= $attr;
        }

        switch ($tag_header) {
            case 'link':
                $tag_file_name = ' href="' . $relative_file_path. '?' . $timestamp . '" ';
                $tag_end = '';
                break;

            case 'script':
                $tag_file_name = ' src="' . $relative_file_path . '?' . $timestamp . '" ';
                $tag_end = '</' . $tag_header . '>';
                break;
        
            default:
                $tag_file_name = '';
                $tag_end = '';
                break;
        }
    
        $tag_begin = '<' . $tag_header . $tag_file_name . trim($tag_attr) . '>';
    
        $tag = $tag_begin . $tag_end;
    
        return $tag;
    }
    
}

2. config/app.php

追記するよ

'aliases' => [
        
        ...
              
        // Custom Function
        'CostomHelper' => 'app\lib\CostomHelper',

    ],

こんな感じで使うよ

use 宣言しても良かったかも。

 <head>
   <meta charset="utf-8">
   <title>@yield('title')</title>
   <link rel="stylesheet" href="/assets/css/style.css">
   {!! App\lib\CostomHelper::asset_css(['app', 'semantic.min']) !!
   {!! App\lib\CostomHelper::asset_js(['jquery.min', 'semantic.min', 'app']) !!}
 </head>