EExcel 丞燕快速查詢2

EExcel 丞燕快速查詢2
EExcel 丞燕快速查詢2 https://sandk.ffbizs.com/

laravel socialite line How to

Thank

https://medium.com/laravel-news/adding-auth-providers-to-laravel-socialite-ca0335929e42

This have problems https://socialiteproviders.com/Line/

1.


composer require socialiteproviders/line

2. create app/Providers/LineProvider.php

https://github.com/SocialiteProviders/Line/blob/master/Provider.php


namespace App\Providers;

use GuzzleHttp\RequestOptions;
use Laravel\Socialite\Two\InvalidStateException;
use \SocialiteProviders\Manager\OAuth2\AbstractProvider;
use \SocialiteProviders\Manager\OAuth2\User;

class LineProvider extends AbstractProvider
{
    public const IDENTIFIER = 'LINE';

    /**
     * The separating character for the requested scopes.
     *
     * @var string
     */
    protected $scopeSeparator = ' ';

    /**
     * The scopes being requested.
     *
     * @var array
     */
    protected $scopes = [
        'openid',
        'profile',
        'email',
    ];

    /**
     * Get the authentication URL for the provider.
     *
     * @param  string  $state
     * @return string
     */
    protected function getAuthUrl($state)
    {
        return $this->buildAuthUrlFromBase(
            'https://access.line.me/oauth2/v2.1/authorize',
            $state
        );
    }

    /**
     * Get the token URL for the provider.
     *
     * @return string
     */
    protected function getTokenUrl()
    {
        return 'https://api.line.me/oauth2/v2.1/token';
    }

    /**
     * Get the raw user for the given access token.
     *
     * @param  string  $token
     * @return array
     */
    protected function getUserByToken($token)
    {
        $response = $this->getHttpClient()->get(
            'https://api.line.me/v2/profile',
            [
                RequestOptions::HEADERS => [
                    'Authorization' => 'Bearer '.$token,
                ],
            ]
        );

        return json_decode((string) $response->getBody(), true);
    }

    /**
     * Map the raw user array to a Socialite User instance.
     *
     * @param  array  $user
     * @return \Laravel\Socialite\User
     */
    protected function mapUserToObject(array $user)
    {
        return (new User())->setRaw($user)->map([
            'id'       => $user['userId'] ?? $user['sub'] ?? null,
            'nickname' => null,
            'name'     => $user['displayName'] ?? $user['name'] ?? null,
            'avatar'   => $user['pictureUrl'] ?? $user['picture'] ?? null,
            'email'    => $user['email'] ?? null,
        ]);
    }

    // /**
    //  * Get the POST fields for the token request.
    //  *
    //  * @param string $code
    //  *
    //  * @return array
    //  */
    // protected function getTokenFields($code)
    // {
    //     return array_merge(parent::getTokenFields($code), [
    //         'grant_type' => 'authorization_code',
    //     ]);
    // }

    /**
     * @return \SocialiteProviders\Manager\OAuth2\User
     */
    public function user()
    {
        if ($this->hasInvalidState()) {
            throw new InvalidStateException();
        }

        $response = $this->getAccessTokenResponse($this->getCode());

        if ($jwt = $response['id_token'] ?? null) {
            $bodyb64 = explode('.', $jwt)[1];
            $user = $this->mapUserToObject(json_decode(base64_decode(strtr($bodyb64, '-_', '+/')), true));
        } else {
            $user = $this->mapUserToObject($this->getUserByToken(
                $token = $this->parseAccessToken($response)
            ));
        }

        $this->credentialsResponseBody = $response;

        if ($user instanceof User) {
            $user->setAccessTokenResponseBody($this->credentialsResponseBody);
        }

        return $user->setToken($this->parseAccessToken($response))
            ->setRefreshToken($this->parseRefreshToken($response))
            ->setExpiresIn($this->parseExpiresIn($response));
    }
}

3. edit app/Providers/AppServiceProvider.php


namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     */
    public function register(): void
    {
        //
    }

    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
        $this->bootLineSocialite();
    }

    public function bootLineSocialite(): void
    {
        // // laravel Socialite 和 Socialite Line 有問題,就是 在初始載入不了
        // // 看Socialite Line 作者還有在3星期前維謢,所以就不知道怎麼回事
        // // https://medium.com/laravel-news/adding-auth-providers-to-laravel-socialite-ca0335929e42
        $socialite = $this->app->make('Laravel\Socialite\Contracts\Factory');

        $socialite->extend(
            'line',
            function ($app) use ($socialite) {
                $config = config('services.line');

                // https://github.com/SocialiteProviders/Line/blob/master/Provider.php
                return $socialite->buildProvider(LineProvider::class, $config); // \SocialiteProviders\Line\Provider::class
            }
        );
    }
}

4. routes/web.php


Route::get('/auth/redirect', function () {
    return Socialite::driver('line')->redirect();
});

Route::get('/auth/callback', function () {
    $user = Socialite::driver('line')->user();

    dd($user);
});

[轉]美国教授在雅典论坛上,为中国说点公道话,让香港学生差点喘不过气来【视频11分9秒处】

https://www.youtube.com/watch?v=aYTsDSoePGI

@tanguemaxime4706 5 個月前 (已編輯)

我出生在中国农村,经历过根植于我记忆中的贫穷;大学之后赴法国学习、生活和工作了15年;后来又在不同的非洲国家工作了多年。我去过30个不同的亚洲、非洲欧洲国家,包括绝大多数东欧国家。我是历史和哲学系出身,我的爱人是哲学本科出身而且硕士和博士都是研究中国政治和法律系统的法国汉学家,她的专业也为了提供了很特别和有价值的视角。我非常赞同这位教授的基本观点:

首先西方一直试图告诉人们这个世界的主要矛盾就是民主和专制的斗争,但是事实远非如此。如果你在非洲最贫困和混乱的国家诸如乍得、中非共和国、马里等地居住过,你才能明白世界的现实究竟是什么。世界的主要矛盾是新自由主义指导下的全球化在世界范围内的不公。这种不公被诸如知识产权、强权利益引导的军事和政治干预等诸多因素决定,在第三世界导致大量的赤贫、污染、动荡。绝大多数国家在全球化分工体系中都不能突破技术壁垒,只能被迫居于工业增值链的最低端。西方霸权会在任何场合提及“民主-独裁”问题,但不会把“每年全世界5岁以下的儿童因饥饿和营养不良死亡3到5百万”这个问题放在人类亟待解决的首位。因为对后者的分析才会揭示这个世界真正的主要矛盾在哪里,会动摇西方主导的全球化秩序。这个世界的基础是财富的创造(生产力)和财富的分配机制(生产关系),很多发达世界的年轻人根本没承受过真正的苦难,被西方政治宣传洗脑的香港年轻人也是这样,就像温室里的花,以为“民主”是一切病症的中心,说出来的都是那种“何不食肉糜”的蠢话。

第二,民主或者不民主本来就是一个非常复杂而且在历史中不断变动的概念。这些东西是“理念”,而不是可以客观观察的“一只猫”或者“一条狗”,其内涵不是不变的,而是不同时代的人们反思他们的时代,从而为其不断注入或者减去内涵。熊彼得之前和熊彼得之后的民主能是一样的吗?希腊的民主和当代的民主是一样的吗?这个教授说的很好,政治形式更值得关注的是细节,有那么多细节需要讨论和关注。要真正讨论民主自由这些东西,你至少要从古希腊、博丹、格劳秀斯、启蒙运动、康德、黑格尔一路读到以赛亚柏林、波普、熊彼得。但是这太难了,对于那些只知道喊口号的懒惰的年轻人而言。

第三,历史传统。我记得以前上学的时候有个法国教授跟我们说:如果西方对于中国的政治史有一些基本了解的话,那么就应该谦虚一些。中国唐代中书、门下、尚书省和皇帝在诏书的颁布和实施就已经非常具有严谨的制衡机制;谏台、监察等制度;中央和地方的关系、军制、劳役和税制等等,都是复杂和让人惊叹的严谨。很多知识匮乏的年轻人就觉得西方那套照搬到什么地方都好用,完全看不到这套制度在绝大多数地方的运行都是失败的。实际上,政治制度之于政治文化就像一个外壳、表象,或者冰山露出水面的部分。没有外力干扰的情况下,政治文化会自然的孕育政治制度。而政治文化是民族千百年来积累下来的、有机态的生长的结果。它是根植于血肉和土地的东西。比如利比亚,就是独特的历史和地理环境造成了这个国家以贝都因人部族为单位形成了一个复杂的制衡、联姻、竞争的权力和利益分配体。这是深层的政治文化,产生于千百年来“人”和“历史”、“地理”、“生产技术”的磨合。西方要在利比亚搞西方民主,那就是个表皮,这个表皮下面继续运作的还是原来的政治文化。西方的制度之所以在西方适合也是因为他们经历了一千多年从中世纪以来特别是200多年以来的各种摸索和磨合建立起来的,很多西方政治的机制都能在中世纪甚至更早的时代找到根源。政治制度的有效运行需要同历史、经济现实以及政治文化相契合。

最后,我想补充一点个人的看法。中国人并非一个封闭的民族,我们从古至今都不排斥学习别的民族。民主、自由、公平、正义、主权在民等等现代政治学的理念我们并不排斥。马克思也是西方的,中国排斥了吗?我们反对的是将它们神话,或者形而上学化。

周虽旧邦其命维新,古老的中华民族之所以能够穿越几千年还能保持其活力,根本就在于能够同时兼顾两个方面,即“接受新鲜的合理事物”同时又能“不失其本体”。

孙中山接受了民族主义,但是能很快适应中国的现实转而宣传“五族共和-中华民族”;毛泽东的革命胜利建立在对于马克思主义的修正使其的中国化,反对“教条主义”,走农村路线,而不是死板地依靠工人阶级;邓小平的改革开放也是将西方的市场经济融入马克思理论。一个民族但凡对于自身的智慧有一点信心,也要会动动脑子,不至于像个脑瘫一样照囫囵吞枣,闭着眼睛搬照抄别人的。

set alpine data out side of the component

https://tonylea.com/setting-alpine-data-outside-of-the-component


<div x-data="{good_id: '', good_name: ''}" id="good_info" class="w-full" @set_good_data="
    good_id = $event.detail.good_id;
    good_name = $event.detail.good_name;
">
    <div x-text="good_id"></div>
    <div x-text="good_name"></div>
</div>

<script>
    document.getElementById('good_info').dispatchEvent(new CustomEvent('set_good_data', { 
	    detail: { 
		    good_id: 1234,
		    good_name: 'Apple',
		} 
    }));
</script>

Laravel Livewire with WinNMP

1. winNMP for Windows

a. create project livewire (Database and user auto create livewire)

b. https://winnmp.wtriple.com/tutorial/laravel

2. update composer


  a. mkdir new directory "t"
  b. cd t
  c. https://getcomposer.org/download/
    c1. php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
	c2. php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
	c3. php composer-setup.php
	c4. php -r "unlink('composer-setup.php');"
	c5. mv composer.phar to C:\WinNMP\bin\composer
  d. rmdir t
  
3. cd \WinNMP\WWW\livewire


  a. delete index.php
  b. composer create-project --prefer-dist laravel/laravel .
  c. composer require laravel/ui
  d. composer install
  e. edit .env
    e1. DB_DATABASE=livewire
        DB_USERNAME=livewire
  f. php artisan ui bootstrap --auth
  g. php artisan migrate
  h. developer tools
    composer require doctrine/dbal
	composer require --dev barryvdh/laravel-ide-helper
	composer require --dev beyondcode/laravel-dump-server
	composer require --dev barryvdh/laravel-debugbar
	composer require --dev roave/security-advisories:dev-master
	php artisan vendor:publish --provider="BeyondCode\DumpServer\DumpServerServiceProvider"
	php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"
  I. php artisan key:generate
  
4. install node.js for windows


  a. https://nodejs.org/zh-tw/download
  b. npm install
  c. npm run dev
  
5. nginx setting

a. https://laravel.com/docs/10.x/deployment#nginx

b. WinNMP Projects -> project Setup -> Edit Nginx Virtual Server



6. open http://livewire.test


  a. register

b. check db livewire table users have new reocd

7. install livewire


  a. use other cmd 
  b. cd \WinNMP\WWW\livewire
  
c.

  composer dump-autoload
  php artisan package:discover
  php artisan vendor:publish --tag=livewire:config
  composer require livewire/livewire
  
d. https://laravel-livewire.com/docs/2.x/quickstart

d1. edit resources\views\layouts\app.blade.php

put content

d2.

    php artisan make:livewire counter
    
edit resources\views\layouts\app.blade.php

put


    <livewire:counter /> in <main class="py-4"> </main>

d3. edit app\Http\Livewire\Counter.php

    public $count = 0;
 
    public function increment()
    {
        $this->count++;
    }

    public function render()
    {
        return view('livewire.counter');
    }
    
d4. edit resources\views\livewire\counter.blade.php

    <div style="text-align: center">
        <button wire:click="increment">+</button>
        <h1>{{ $count }}</h1>
    </div>
    

Codeigniter 4.2 with Eloquent ORM


composer require "illuminate/database"
composer require "illuminate/events"
Config/Events.php

use Illuminate\Database\Capsule\Manager as Capsule;
use Illuminate\Events\Dispatcher;
use Illuminate\Container\Container;

function boostEloquent() {
  $capsule = new Capsule;

  $capsule->addConnection([
    'driver' => 'mysql',
    'host' => 'localhost',
    'database' => 'database',
    'username' => 'root',
    'password' => 'password',
    'charset' => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix' => '',
  ]);

  // Set the event dispatcher used by Eloquent models... (optional)
  $capsule->setEventDispatcher(new Dispatcher(new Container));

  // Make this Capsule instance available globally via static methods... (optional)
  $capsule->setAsGlobal();

  // Setup the Eloquent ORM... (optional; unless you've used setEventDispatcher())
  $capsule->bootEloquent();
}

Events::on('pre_system', function () {
    boostEloquent();

    if (ENVIRONMENT !== 'testing')
    ...
}

https://www.modb.pro/db/49966

golang gin windows service

Golang Gin Api become Windows Service Use github.com/kardianos/service

package main

import (
    "errors"
    "fmt"
    "io"
    "log"
    "net"
    "net/http"
    "os"
    "path/filepath"
    "strings"
    "time"
    
    "github.com/gin-gonic/gin"
    "github.com/joho/godotenv"
    "github.com/kardianos/service"
)

// Process Windows Service  // github.com/kardianos/service 

var logger service.Logger

type program struct{}


func (p *program) Start(s service.Service) error {
	// Start should not block. Do the actual work async.
	go p.run()
	return nil
}

func (p *program) Stop(s service.Service) error {
	// Stop should not block. Return with a few seconds.
	return nil
}

func ExecPath() string {
	ex, err := os.Executable()
	if err != nil {
		panic(err)
	}

	exPath := filepath.Dir(ex)
	return exPath
}

func main() {
    File, err := os.Create(ExecPath() + "\\gin_service_run.log")
    if err != nil {
        File = os.Stdout
    }
    defer File.Close()

    log.SetOutput(File)

    var s service.Service

    svcConfig := service.Config{
        Name:        "GinAPI",
        DisplayName: "Gin API Service",
        Description: "Gin API Server Converter Windows Service",
    }

    prg := &program{}

    s, err = service.New(prg, &svcConfig)
    if err != nil {
        log.Fatalln(err)
    }

    logger, err = s.Logger(nil)
    if err != nil {
        log.Fatalln(err)
    }

    if len(os.Args) > 1 {
      switch os.Args[1] {
        case "install":
            err := s.Install()
            if err != nil {
                logger.Errorf("Install Service Fail!", err.Error())
                return
            }
            fmt.Printf("Install Service Success!")
        case "uninstall":
            err := s.Uninstall()
            if err != nil {
                logger.Errorf("Uninstall Service Fail!", err.Error())
                return
            }
            fmt.Printf("Uninstall Service Success!")
        case "start":
            err := s.Start()
            if err != nil {
                logger.Errorf("Start Service Fail!", err.Error())
                return
            }
            fmt.Printf("Start Service Success!")
        case "stop":
            err := s.Stop()
            if err != nil {
                logger.Errorf("Stop Service Fail!", err.Error())
                return
            }
            fmt.Printf("Stop Service Success!")
        }
        return
    }
    
    err = s.Run()
        if err != nil {
            logger.Error(err)
        }
    }
    
func (p *program) run() {
    //
    // Create Error logger
    //
    errFile, err := os.OpenFile(ExecPath()+"\\errors.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
    if err != nil {
        log.Fatalf("打開日誌文件失敗:", err)
    }

    Error = log.New(io.MultiWriter(errFile, os.Stderr), "【Error】", log.Ldate|log.Ltime|log.Lshortfile)


    //
    // Get .env
    //
    err = godotenv.Load(ExecPath() + "\\.env")
    if err != nil {
    	msg := "找不到 .env 檔案"
    	logger.Errorf(msg, err)
    	Error.Printf(msg, err)
    }

    web_port := os.Getenv("WEB_PORT")
    
    
    //
    // Start Gin
    //
    router := gin.Default()
    
    corsConfig := cors.DefaultConfig()
	corsConfig.AllowAllOrigins = true
	router.Use(cors.New(corsConfig))
    
    router.GET("/", func(c *gin.Context) {
      c.JSON(http.StatusOK, gin.H{"status": "Gin Api Success!"})
	})
    
    log.Fatal(http.ListenAndServe(":"+web_port, router))
    
}
    
1. run server.exe can run Gin Api Server right now.

2. run server install, server uninstall, server start, server stop.

2.1 【Install and Start】run server install Then server start

2.2 【Stop and uninstall】run server stop Then server uninstall

3. log file use absolute path. ExecPath() can get absolute path.

4. .env must use absolute path. Try to use


  svcConfig.EnvVars = map[string]string{
    "WEB_PORT": web port
  }
see register Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\GinAPI have EnvVars Data.

But err := godotenv.Load() can't get anything, just No Error. So must use absolute path.

5. log have two method.

5.1 File, err := os.Create(ExecPath() + "\\gin_service_run.log")

5.2 【logger.Errorf】 This Error Msg showed at Windows Servce and have Error tag.

OK~ Just try. Hope this blog can help.

Codeigniter 4 ORM relation By hand Part 2

Modify ModelTrait file at \App\Traits


namespace App\Traits;

trait ModelTrait
{
    // fetaure Maybe belongsTo

    // get result but not effect this, keep this ORM status
    public function newSelfObject()
    {
        return $this->db->query($this->builder->getCompiledSelect(false));
    }
    
    // copy self object return ORM Object
    public function cso() 
    {
        $class_name = get_class($this);
        $class_new_object = (new $class_name);
        $class_new_object->builder = clone $this->builder;
        return $class_new_object;
    }

    public function hasOne($class, $relation_primary_key=null, $primary_key=null)
    {
        return $class->where($relation_primary_key ?? $this->primaryKey, $this->newSelfObject()->getRowArray()[$primary_key ?? $this->primaryKey] ?? '');
    }

    // whereIn  If can't get records, return null.  Usually use primaryKey cloud happen
    public function hasMany($class, $relation_primary_key=null, $primary_key=null)
    {
        $temp = array_column($this->newSelfObject()->getResult(), $primary_key ?? $this->primaryKey);
        return $class->whereIn($relation_primary_key ?? $this->primaryKey, empty($temp) ? [null] : $temp);
    }
}
App\Controllers\OrderListContriller.php

namespace App\Controllers\Order;

class OrderListController extends \App\Controllers\BaseController
{
  public function OrderList()
  {
      // 3. 
      $order = (new Order)->where("id", $order_id);
      $orderData = $order->cso()->findAll(); // Maybe need orderData to do something.

      $member = $order->members()->where('createtime >', '2022/11/22')->first(); // ->findAll();
  }
}

Codeigniter 4 ORM relation By hand

Add ModelTrait file at \App\Traits


namespace App\Traits;

trait ModelTrait
{
    // fetaure Maybe belongsTo

    // get result but not effect this, keep this ORM status
    public function newSelfObject()
    {
        return $this->db->query($this->builder->getCompiledSelect(false));
    }

    public function hasOne($class, $relation_primary_key=null, $primary_key=null)
    {
        return $class->where($relation_primary_key ?? $this->primaryKey, $this->newSelfObject()->getRowArray()[$primary_key ?? $this->primaryKey] ?? '');
    }

    // whereIn  If can't get records, return null.  Usually use primaryKey cloud happen
    public function hasMany($class, $relation_primary_key=null, $primary_key=null)
    {
        $temp = array_column($this->newSelfObject()->getResult(), $primary_key ?? $this->primaryKey);
        return $class->whereIn($relation_primary_key ?? $this->primaryKey, empty($temp) ? [null] : $temp);
    }
}


How to use


App\Models\Order.php

class Order extends Model
{
    use ModelTrait;

    protected $table      = 'order';
    protected $primaryKey = 'order_id';
    
    public function members()
    {
        return $this->hasMany(new Member);
        
        // OR
        return $this->hasMany(new Member, 'id', 'member_id'); // id always use new Member,  member_id use Order
    }


App\Controllers\OrderListContriller.php

namespace App\Controllers\Order;

class OrderListController extends \App\Controllers\BaseController
{
  public function OrderList()
  {
      // 1. one order
      $members = (new Order)->where('id', $order_id)->members()->first(); // ->findAll();

      // 2. All orders
      $members = (new Order)->members()->findAll();

      // 3. 
      $order = (new Order)->where("id", $order_id);
      $orderData = $order->newSelfObject()->getRow(); // Maybe need orderData to do something.

      $member = $order->members()->where('createtime >', '2022/11/22')->first(); // ->findAll();
  }
}


You can make belongTo or belongsTo by yourself. More about feature like multiple key, it's more complex

SeckillSolution 秒殺 高并發 交易

https://github.com/qianshou/SeckillSolution
https://blog.csdn.net/koastal/article/details/78995885
=====
https://blog.csdn.net/qq_38512763/article/details/118830903

Aggregate array values into ranges

https://codereview.stackexchange.com/questions/80080/aggregate-array-values-into-ranges

    // Output:
    // Array (
    //     [0] => Array ( [0] => 1, [1] => 2, [2] => 3, [3] => 4, [4] => 5, [5] => 6 )
    //     [1] => Array ( [0] => 10, [1] => 11, [2] => 12, [3] => 13 )
    //     [2] => Array ( [0] => 20 )
    //     [3] => Array ( [0] => 24 )
    // )
    static function GetRanges1( $aNumbers ) {
        $aNumbers = array_unique( $aNumbers );
        sort( $aNumbers );
        $aGroups = array();
        for( $i = 0; $i < count( $aNumbers ); $i++ ) {
          if( $i > 0 && ( $aNumbers[$i-1] == $aNumbers[$i] - 1 ))
            array_push( $aGroups[count($aGroups)-1], $aNumbers[$i] );
          else
            array_push( $aGroups, array( $aNumbers[$i] )); 
        }
        return $aGroups;
    }

    // Output: Array ( [0] => 1-6, [1] => 10-13, [2] => 20, [3] => 24 )
    static function GetRanges2( $aNumbers ) {
        $aNumbers = array_unique( $aNumbers );
        sort( $aNumbers );
        $aGroups = array();
        for( $i = 0; $i < count( $aNumbers ); $i++ ) {
          if( $i > 0 && ( $aNumbers[$i-1] == $aNumbers[$i] - 1 ))
            array_push( $aGroups[count($aGroups)-1], $aNumbers[$i] );
          else
            array_push( $aGroups, array( $aNumbers[$i] )); 
        }
        $aRanges = array();
        foreach( $aGroups as $aGroup ) {
          if( count( $aGroup ) == 1 )
            $aRanges[] = $aGroup[0];
          else
            $aRanges[] = $aGroup[0] . '-' . $aGroup[count($aGroup)-1];
        }
        return $aRanges;
    }

    // Output: 1~6,10~13,20,24
    static function GetRanges3( $aNumbers, $headChar='' ) {
        $aNumbers = array_unique( $aNumbers );
        sort( $aNumbers );
        $aGroups = array();
        for( $i = 0; $i < count( $aNumbers ); $i++ ) {
          if( $i > 0 && ( $aNumbers[$i-1] == $aNumbers[$i] - 1 ))
            array_push( $aGroups[count($aGroups)-1], $aNumbers[$i] );
          else
            array_push( $aGroups, array( $aNumbers[$i] )); 
        }
        $aRanges = array();
        foreach( $aGroups as $aGroup ) {
          if( count( $aGroup ) == 1 )
            $aRanges[] = $headChar.$aGroup[0];
          else
            $aRanges[] = $headChar.$aGroup[0] . '~' . $headChar.$aGroup[count($aGroup)-1];
        }
        return implode( ',', $aRanges );
    }

gorm manytomany many2many use go program


type RoleHasPermissionList struct {
	model.Roles
	Rolehaspermissions []CUS_Rolehaspermissions `json:"rolehaspermissions" gorm:"foreignkey:role_id; references:id"`
}

type CUS_Rolehaspermissions struct {
	PermissionId  int                 `json:"-"`
	RoleId        int                 `json:"-"`
	PermissinInfo model.Permission `gorm:"foreignkey:id; references:permission_id"`
}

func (CUS_Rolehaspermissions) TableName() string {
	return "RoleHasPermissions"
}

type FormaterResult struct {
	model.Roles
	Permission []model.Permission `json:"permission"`
}

func GetRoleList(c *gin.Context) serializer.Response {
	var req GetRoleListRequest
	c.ShouldBind(&req)

	var total int64
	var list []RoleHasPermissionList

	page := req.Page
	pageSize := req.PageSize

	model.DB.
		Scopes(util.Paginate(c, page, pageSize)).
		Preload("Rolehaspermissions.PermissinInfo").
		Find(&list).Offset(-1).Limit(-1).Count(&total)

	// 重新整理輸出格式
	var formater_result []FormaterResult
	for i, v := range list {
		formater_result = append(formater_result, FormaterResult{Roles: v.Roles})

		for _, v2 := range v.Rolehaspermissions {
			formater_result[i].Permission = append(formater_result[i].Permission, v2.PermissinInfo)
		}
	}

	return serializer.Response{
		Code:    0,
		Message: "成功",
		Data:    util.Pagination(c, page, pageSize, total, formater_result),
	}
}


    {
        "id": 1,
        "name": "company",
        "display_name": "公司",
        "guard_name": "admin_api",
        "created_at": "2020-03-26 14:34:25",
        "updated_at": "2020-03-26 14:34:25",
        "permission": [
          {
            "id": 1,
            "name": "add company",
            "display_name": "add company",
            "guard_name": "admin_api",
            "created_at": "2020-03-26 14:34:25",
            "updated_at": "2020-03-26 14:34:25"
          },
          {
            "id": 2,
            "name": "edit company",
            "display_name": "edit company",
            "guard_name": "admin_api",
            "created_at": "2020-03-26 14:34:25",
            "updated_at": "2020-03-26 14:34:25"
          },
        ]
    },
    ...

bytes32[] remix solidity


// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract Fix {

    bytes32[] questionList= [
            bytes32(0x52a6eb687cd22e80d3342eac6fcc7f2e19209e8f83eb9b82e81c6f3e6f30743b),
            bytes32(0x257f3de9149acf0a49d3f7668956aeb52490202fae9ec2e92c3caa7d5223c6ef)
        ];

    // constructor() {
    //     // questionList = [
    //     //     bytes32(0x52a6eb687cd22e80d3342eac6fcc7f2e19209e8f83eb9b82e81c6f3e6f30743b),
    //     //     bytes32(0x257f3de9149acf0a49d3f7668956aeb52490202fae9ec2e92c3caa7d5223c6ef)
    //     // ];
    // }

    // function addQuestion(bytes32 questionKey)
    //     public
    //     returns(bool success)
    // {
    //     questionList.push(questionKey);
    //     return true;
    // }

    function getQuestionCount()
        public view
        returns(uint questionCount)
    {
        return questionList.length;
    }

    function getQuestionAtIndex(uint row)
        public view
        returns(bytes32 questionkey)
    {
        return questionList[row];
    }

}

[轉]After 5 years, I'm out of the serverless compute cult

https://dev.to/brentmitchell/after-5-years-im-out-of-the-serverless-compute-cult-3f6d

I have been using serverless computing and storage for nearly five years and I'm finally tired of it. I do feel like it has become a cult. In a cult, brainwashing is done so gradually, people have no idea it is going on. I feel like this has happened across the board with so many developers; many don’t even realize they are clouded. In my case, I took the serverless marketing and hype hook, line, and sinker for the first half of my serverless journey. After working with several companies small and large, I have been continually disappointed as our projects grew. The fact is, serverless technology is amazingly simple to start, but becomes a bear as projects and teams accelerate. A serverless project typically includes a fully serverless stack which can include (using a non-exhaustive list of AWS services):


  1. API Gateway
  2. Cognito
  3. Lambda
  4. DynamoDB
  5. DAX
  6. SQS/SNS/EventBridge

Combining all of these into a serverless project become a huge nightmare for the following reasons.



Testing


All these solutions are proprietary to AWS. Sure, a lambda function is a pretty simple idea; it is simply a function that executes your code. The other services listed above have almost no other easy and testable solutions when integrated together. Serverless Application Model and Localstack have done some amazing work attempting to emulate these services. However, they usually only only cover basic use cases and an engineer ends up spending a chunk of time trying to mock or figure out a way to get their function to test locally. Or, they simply forget it and deploy it. Also, since these functions typically depend on other developer's functions or API Gateway, there tends to be 10 different ways to authorize their function. For example, someone might have an unauthorized API, one may use AWS credentials, another might use Cognito, and yet another uses an API key. All of these factors lead to an engineer having little to no confidence in their ability to test anything locally.


Account Chaos


Since engineers typically don't have a high confidence in their code locally they depend on testing their functions by deploying. This means possibly breaking their own code. As you can imagine, this breaks everyone else deploying and testing any code which relies on the now broken function. While there are a few solutions to this scenario, all are usually quite complex (i.e. using an AWS account per developer) and still cannot be tested locally with much confidence. Chaos engineering has a time and a place. This is not it.


Security


With all the possible permutations of deployments and account structures, security becomes a big problem. Good IAM practices are hard. Many engineers simply put a dynamodb:* for all resources in the account for a lambda function. (BTW this is not good). It becomes hard to manage all of these because developers can usually quite easily deploy and manage their own IAM roles and policies. And since it is hard to test locally, trying to fix serverless IAM issues requires deploying to AWS and testing (or breaking) in the environment.


Bad (Cult-like) Practices


No Fundamental Enforcement


Without help from frameworks, DRY (Don't Repeat Yourself), KISS (Keep It Simple Stupid) and other essential programming paradigms are simply ignored. In a perfect world, a team would reject PR's that do not abide by these basic principles. However, with the huge push for the cloud over the past several years, many junior developers have had the freedom to do what they want in the serverless space because of its ease of use; resulting in developers enmasse adopting something that doesn’t increase the health of the developer ecosystem as a whole. AWS gives you a knife by providing such an easy way to deploy code on the internet. Please don't hurt yourself with it.


Copy and Paste Culture


Most teams end up copying code to the new microservices and proliferating it across many services. I have seen teams with hundreds and even thousands of functions with nearly every function being different. This culture has gotten out of hand and now teams are stuck with these functions. Another symptom of this is not taking the time to provide a proper DNS.

DNS Migration Failures

Developers take the generic API Gateway generated DNS name (abcd1234.amazonaws.com) and litter their code with it. There will come a time when the teams want to put a real DNS in front of it and now you're faced with locating the 200 different spots it was used to change it. And, it's not as easy as a Find/Replace. Searching like this can become a problem when you have a mix of hard-coded strings, parameterized/concatenated strings, and environment variables everywhere that DNS name lies. Oh and telemetry? Yeah that's nowhere to be found.


Microservice Hell


This isn't a post about microservices. However, as teams and developers can decide and add whatever they want into their YAML files for deployment, you end up with hundreds of dependent services and hundreds of repositories. Many have different approaches and/or have different CI/CD workflows. Also, I've found that repository structures begin widely diverging. Any perceived cost savings has now been moved to managing all of these deployments and repositories. Here are a few examples of how developers choose to break up their serverless functions by Git repositories:

  1. Use a monolith for all their API's.
  2. Separate each API Gateway or queue processors
  3. Separate "domain" (i.e. /customers or /invoices)
  4. Separate by endpoint (I have seen developers break out a repository for POST:/customers while maintaining a separate one for GET:/customers/:id and so on…).

Many times, developers switch between different styles and structures daily. This becomes a nightmare not only for day-to-day development, but also for any developer getting to a quick-understanding of how the code deploys and what dependencies it has or impacts.


API Responses


The serverless cult has been active long enough now that many newer engineers entering the field don't seem to even know about the basics of HTTP responses. Now there are many veteran developers lacking this knowledge. While this is not strictly a serverless problem, I never have experienced this much abuse outside of serverless. I've seen endpoints returning 200, 400, 500 like normal. Yet another set of endpoints return all 2xx responses, with a payload like:

{
  "status": "ERROR",
  "reason": "malformed input"
}

Then, another set of endpoints implement inconsistent response patterns dependent on some permutation of query parameters. For example:
Query 1:
/customers?firstName=John

[{
  "accountId": "1234",
  "firstName": "John",
  "lastName": "Newman"
}]

Query 2:
/customers?lastName=Newman

{
  "accountId": "1234",
  "firstName": "John",
  "lastName": "Newman"
}

Inventing New Problems

As mentioned previously, initially deploying these types of services are easy. The reality is there are new problems with these kind of serverless structures that don't typically occur in server-backed services:

  1. Cold starts - many engineers don't care too much about this. But they suddenly start caring when Function A calls Function B which calls Function C and so on. Without some voodoo warm-up scripting solution, paying for provisioned concurrency, or ignoring it, you may be out of luck.
  2. In the past five years, prior to our work on our flooring installation marketplace, the teams I have been a part of have always chased the latest features because we had been doing workarounds like FIFO queues, state machines, provisioned concurrency, etc. As teams chase the latest features released by AWS (or your cloud provider of choice), things then become even harder to test and maintain since SAM or Localstack don't match these features for some time.
  3. Some awful custom eventing solution because… serverless. Engineers think simply putting an API Gateway in front of EventBridge will solve all their eventing problems. What about retries? What about duplicate events? What about replaying events? Schema enforcement? Where does the data land? How do I get the data? These are all questions that have to be answered or documented in a custom fashion. Ok, EventBridge supports a few of these things in some form but it does leave engineers chasing the latest features, waiting for these to become available. However, outside of the serverless cult, these issues can be solved with KafkaNATS, or other technologies. Use the right tool.
  4. When it’s not okay to talk about the advantages and disadvantages of serverless with other engineers without fear of reprisal, it might be a cult. Many of these engineers say Lambda is the only way to deploy anymore. There isn't much thought to offline solutions when things need to be run onsite or separated from the cloud. For some companies this can be a fine approach. However, many medium to large organizations have (potentially) offline computing needs outside of the cloud. Lambda cannot provide a sensitive, remote pressure device real-time updates in the event of an internet outage in the middle of Canada during winter.

So, how do I get out of the cult?


In this article, I didn’t plan to address the many options you have to extricate yourself from the grips of mindless serverless abuse. If you're interested, please leave a comment and I will write a follow-up on the different solutions and alternatives to serverless I’ve found as well as some tips to incrementally shift back to a normal life. What I did want to do here was to express the pains I have experienced with serverless technologies over the past couple years now that I have helped architect more traditional VM and container-based tech stacks. I felt compelled to ensure individuals, teams, and organizations know what serverless can really mean for long-term sustainability in an environment.


What does serverless do well?


Deployment and scaling. That's really it for most organizations. For a lot of these organizations, it's hard to find the time, people, and money to figure out how to automatically provision new VM's, get access to a K8S cluster, etc. My challenge to you is to first fix your deployment and scaling problems internally before thinking about serverless compute.



Conclusion

Serverless is one of the hottest new cloud trends. However, I have found it leads to more harm than good in the long run. While I understand some of the problems listed above are not unique to serverless, they are much more prolific; leading engineers to spend most of their time with YAML configuration or troubleshooting function execution rather than crafting business logic. What I find odd is the lack of complaints from the community. If I’m alone in my assessment, I’d love to hear from you in the comments below. I’ve spent a significant amount of time over the last few years working to undo my own serverless mistakes as well as those made by other developers. Maybe I’m the one who has been brainwashed? Time will tell.

jenkins withCredentials sshUserPrivateKey

https://codeleading.com/article/11015806881/

Remeber sshCommand remote, remote infos have identityFile
identityFile need be at insdie identity

Don't understand identity be keep. Only can be used inside identity

def getRemoteHost(ip, user) {
    def remote = [:]
    remote.name = ip
    remote.host = ip
    remote.user = user
    remote.identityFile = identity
    remote.port = 22
    remote.allowAnyHosts = true

    return remote
}

pipeline {
    agent any

    environment {
        ssh_ip = 'ooo.xxx.ooo.xxx'
        ssh_user = 'ubuntu'
        ssh_jenkins_key_uid = 'oooooooo-xxxx-xxxx-xxxx-oooooooooooo'
        
        // SSH_CREDS = credentials('oooooooo-xxxx-xxxx-xxxx-oooooooooooo')
    }
    
    stages {
        stage('ssh Command'){
            steps {
                withCredentials([sshUserPrivateKey(credentialsId: "${ssh_jenkins_key_uid}", keyFileVariable: 'identity')]) {
                    sshCommand remote: getRemoteHost(ssh_ip, ssh_user), command: "whoami"  //在远程服务器执行echo命令
                }
                
            }
        }
        
        
    }
}

def runCommand(cmd) {
    def remote = [:]
    remote.name = "${ssh_ip}"
    remote.host = "${ssh_ip}"
    remote.user = "${ssh_user}"
    // remote.identityFile = identity
    remote.port = 22
    remote.allowAnyHosts = true
    
    withCredentials([sshUserPrivateKey(
        credentialsId: "${ssh_jenkins_key_uid}", 
        keyFileVariable: 'identity')]) 
    {
        remote.identityFile = identity
        sshCommand remote: remote, command: cmd
    }
}

pipeline {
    agent any

    environment {
        ssh_ip = 'ooo.xxx.ooo.xxx'
        ssh_user = 'ubuntu'
        ssh_jenkins_key_uid = 'oooooooo-xxxx-xxxx-xxxx-oooooooooooo'
        
        // SSH_CREDS = credentials('oooooooo-xxxx-xxxx-xxxx-oooooooooooo')
    }
    
    stages {
        stage('ssh Command') {
            steps {
                echo 'whoami start...'
                runCommand('whoami') 
                echo 'whoami success'
    		}
        }
    }
}

model y 車機掛幾次

保养花费差7倍?特斯拉Model Y蔚来EC6《真十万公里长测》报告 7 Times in Maintenance costs? Tesla Model Y vs NIO EC6 Test

https://youtu.be/UrCEOMQPRzk?t=1052

17:32

laravel schedule cron docker dockerfile docker-compose

cron

php laravel UI Boostrap jetstream docker-compose

laravel_docker

dokcer-compose.yml

  cron:
    build: ./infra/docker/cron
    env_file: ./env.mariadb.local.env
    stop_signal: SIGTERM
    depends_on:
      - app
    volumes:
      - ./backend:/work/backend
Dockerfile

FROM php:8.0.11-fpm-buster
LABEL maintainer="ucan-lab "
#SHELL ["/bin/bash", "-oeux", "pipefail", "-c"]

# timezone environment
ENV TZ=Asia/Taipei \
  # locale
  LANG=en_US.UTF-8 \
  LANGUAGE=en_US:UTF-8 \
  LC_ALL=en_US.UTF-8 \
  # Laravel environment
  APP_SERVICES_CACHE=/tmp/cache/services.php \
  APP_PACKAGES_CACHE=/tmp/cache/packages.php \
  APP_CONFIG_CACHE=/tmp/cache/config.php \
  APP_ROUTES_CACHE=/tmp/cache/routes.php \
  APP_EVENTS_CACHE=/tmp/cache/events.php \
  VIEW_COMPILED_PATH=/tmp/cache/views \
  # SESSION_DRIVER=cookie \
  LOG_CHANNEL=stderr \
  DB_CONNECTION=mysql \
  DB_PORT=3306 

RUN apt-get update
RUN apt-get -y install locales libicu-dev libzip-dev htop cron nano
RUN apt-get -y install default-mysql-client

RUN locale-gen en_US.UTF-8 && localedef -f UTF-8 -i en_US en_US.UTF-8
RUN docker-php-ext-install intl pdo_mysql zip bcmath exif

RUN apt-get clean && rm -rf /var/lib/apt/lists/* 

# 自訂
RUN mkdir -p /tmp/cache
WORKDIR /work/backend


# 這行超級重要 把初始環境的變數寫死
RUN printenv > /etc/environment

# 把log 輸出到 docker 上
RUN ln -sf /proc/1/fd/1 /var/log/laravel-scheduler.log


#ADD crontab /var/spool/cron/crontabs/root
#RUN chown root:crontab /var/spool/cron/crontabs/root
#RUN chmod 0600 /var/spool/cron/crontabs/root

#RUN crontab -l | { cat; echo "* * * * * . /usr/local/bin/php /work/backend/artisan config:cache && php artisan schedule:run >> /var/log/cron.log 2>&1"; } | crontab -
#RUN crontab -l | { cat; echo "* * * * * date >> /var/log/cron.log"; } | crontab -
#RUN crontab -l | { cat; echo "* * * * * echo hello > /proc/1/fd/1 2>/proc/1/fd/2"; } | crontab -


COPY crontab /etc/cron.d/crontab
RUN chmod 0644 /etc/cron.d/crontab
RUN crontab /etc/cron.d/crontab

CMD bash -c "/usr/local/bin/php /work/backend/artisan config:cache && cron -f"
cron

# 這行可有可無 主要是 dockerfile printenv 那行最重要 #!/usr/bin/env bash
# 這行可有可無 SHELL=/bin/bash
PATH=/usr/bin:/usr/local/bin:$PATH
* * * * * cd /work/backend && php artisan schedule:run >> /var/log/cron.log 2>&1
#* * * * * cd /work/backend && php artisan schedule:run >> /var/log/cron.log 2>&1 && echo schedule > /proc/1/fd/1 2>/proc/1/fd/2
#* * * * * date >> /var/log/cron.log
#* * * * * echo hello > /proc/1/fd/1 2>/proc/1/fd/2
#要多一行
app/Console/Kernel.php

protected function schedule(Schedule $schedule)
    {
        // $schedule->command('inspire')->hourly();

        $fileCronLog = '/var/log/laravel-scheduler.log';  // dockerfile RUN ln -sf /proc/1/fd/1 /var/log/laravel-scheduler.log

        // cron('* * 26 * *')
        $schedule->command('your command')->timezone(config('app.timezone'))->everyMinute()->onOneServer()  
            ->before(function () {
                Log::info("Schedule your command before!");
            })
            ->after(function () {
                Log::info("Schedule your command after!");
            })
            ->onSuccess(function (Stringable $output) {
                Log::info("Schedule your command onSuccess!");
            })
            ->onFailure(function (Stringable $output) {
                Log::error("Schedule your command onFailure!");
            })
            ->appendOutputTo($fileCronLog);

【事實釐清】媒體報導「歐盟主要成員國近日同意將核能納入『綠色轉型』,成為解決碳排放的一環;希望各國利用核能,趕在2050年前實現碳中和」?

【事實釐清】媒體報導「歐盟主要成員國近日同意將核能納入『綠色轉型』,成為解決碳排放的一環;希望各國利用核能,趕在2050年前實現碳中和」?

https://tfc-taiwan.org.tw/articles/2192 

黃其君


✔正常查核程序:
優先翻閱一手資料,若不懂則請教專家
✖ TFC 台灣事實查核中心:
請教(有偏見)專家,也無對專家言論做查對

然後第一個說核能列入歐盟綠色轉型的不是台灣報導也不是哪個擁核媒體平台,是世界最大的媒體通訊社,美聯社以《EU leaders include nuclear energy in green transition》為標題報導歐盟高峰會結論,然後有紐約時報、日本時報等轉載刊登,到台灣因為翻譯就變成歐盟將核能納入綠色轉型。不懂台灣反核怎麼一直說別人世界最大平台假消息呢?

▉美聯社
https://reurl.cc/5gmyV6

范建德老師以2020/01/10的法案文字來認定歐盟要非核,但1/10有好多版本討論,法案文字都不是最終版,反核的還是綠黨提的...裏頭還要求2030歐盟要非核無煤阿...所以最後全部被刪光光也不意外。

▉法案文字
2020/01/15(無反核定案版)
https://reurl.cc/RdNl3Z
2020/01/10(無反核草案)
https://reurl.cc/4gx79v
2020/01/10(反核草案)
https://reurl.cc/Gk1R2v

而台大風險中心趙研究員真的讓你看看什麼叫超譯...

歐盟的技術文件裡提到核能在低碳能源中的重要腳色顯而易見,但確實在風險管理例如核廢料上難以將do no harm排除,很重要的一點,他有表明是因為現階段尚無啟用的核發電燃料的深層處置設施,所以無實例可以做評估。該報告也會在近一步針對核能做詳細討論。

並非像趙研究員說的什麼沒有解方或要隔絕數百萬年...可以不要自己腦補嗎?明明裏投也跟你說有解法了...

▉報告這邊看
https://reurl.cc/9zlYz8

Regarding the long-term management of High-Level Waste (HLW), there is an international consensus that a safe, long-term technical solution is needed to solve the present unsustainable situation. A combination of temporary storage plus permanent disposal in geological formation is the most promising, with some countries are leading the way in implementing those solutions. Yet nowhere in the world has a viable, safe and long-term underground repository been established. It was therefore infeasible for the TEG to undertake a robust DNSH assessment as no permanent, operational disposal site for HLW exists yet from which long-term empirical, in-situ data and evidence to inform such an evaluation for nuclear energy.

Given these limitations, it was not possible for TEG, nor its members, to conclude that the nuclear energy value chain does not cause significant harm to other environmental objectives on the time scales in question. The TEG has not therefore recommended the inclusion of nuclear energy in the Taxonomy at this stage. Further, the TEG recommends that more extensive technical work is undertaken on the DNSH aspects of nuclear energy in future and by a group with in-depth technical expertise on nuclear life cycle technologies and the existing and potential environmental impacts across all objectives.

https://hugo-m9c19ra1o-sueboy.vercel.app/