カテゴリーアーカイブ 言語

著者:杉浦

【PHP】Laravelのランダム文字列生成メソッドとランダムURL用文字列生成スニペット

 最近、ほぼ素のPHPでURL用のランダム文字列生成機能を作ったところ後から見たLaravelのランダム文字列生成メソッドの実装に驚いたので紹介。加えてこのLaravelのランダム文字列生成メソッドを受けて作成した素のPHPのURL用ランダム文字列生成コードを紹介します。
 Laravelのランダム文字列生成メソッドは次の通りです。

    /**
     * Generate a more truly "random" alpha-numeric string.
     *
     * @param  int  $length
     * @return string
     */
    public static function random($length = 16)
    {
        $string = ''; // ランダム文字列が入る変数

        // 現在の文字列長$lenが要求される文字列長$length以下ならば繰り返し
        // 繰り返しはほぼなし. 理由は後述
        while (($len = strlen($string)) < $length) {
            $size = $length - $len; // ランダム文字列に必要な文字数を算出

            // $size長のランダムなバイト文字列を生成
            // random_bytesは貴重なPHP組み込みの暗号論的に安全なランダムな値生成関数
            /** @see https://www.php.net/manual/ja/function.random-bytes.php PHP: random_bytes - Manual */
            $bytes = random_bytes($size);

            // base64_encode関数によってバイト文字列をbase64へ変換. base64は[0-9a-zA-Z/+=]の64と1文字のみで形成される文字列
            // base64へ変換された文字列から多くの場面で邪魔になる記号文字である/, +, =を削る
            // この文字を削る処理によって繰り返しが必要になる確率が極僅かながら存在する(基本base64による文字列の伸びの方が強い)。
            // base64によって伸びすぎた文字列をsubstr関数によって切り詰める
            // 切り詰めた必要な長さ(あるいはそれ以下)のランダム文字列を返り値用の引数$stringに連結して格納
            $string .= substr(str_replace(['/', '+', '='], '', base64_encode($bytes)), 0, $size);
        }

        return $string;
    }

 いざ実装コードを見てみると確かにこれ以上はPHP自体がstr_random関数を実装するぐらいしかないように思えます。乱数の種がいらず、長さを自由に決められて、ダブりがまず起きない、というのは本当にありがたいです。 これだけでも便利なのですが、URLでまず問題なく用いることのできる文字列は[0-9a-zA-Z]でなく[0-9a-z]と-と_の38文字と少々要求とrandom()が異なります。このあたりと上記コードを考慮すると次のコードが書けます。

$size = 32; // ランダム文字列の長さ
// 記号を_に置き換えるので文字列長が足りなくなる場合はなし。
// base64の仕様上確実に要求される文字列長よりエンコード後の文字列が長く=はカットされる
// 大文字のアルファベットをstrtolower関数によって小文字にする
$string = strtolower(substr(str_replace(['/', '+'], ['_', '-'], base64_encode(random_bytes($size))), 0, $size));

 用途を限定したためほぼ一行で済む様になりました。ダブルクリックで一発選択をしたい場合は[‘_’, ‘-‘]を’_’に書き換えるとよいです。

  • この記事いいね! (0)
村上 著者:村上

【Android】ActionBarのタイトルとボタンの色を白色に変更する

前回に引き続き、今回も Android の ActionBar についての記事です。
今回は、ActionBar の戻るボタンやタイトルの色を白色に変更する方法です。
ActionBar を濃い色で指定しているので、戻るボタンの色を白に変えたかったのですが、どこを直すのかがわかりにくかったのでまとめました。

参考にさせていただいた記事はこちらから。

android – Changing ActionBar Text and Button color when using Theme.AppCompat.Light – Stack Overflow
https://stackoverflow.com/questions/30720873/changing-actionbar-text-and-button-color-when-using-theme-appcompat-light

 

修正するのは、プロジェクトの res > values ディレクトリ内にある styles.xml ファイルです。
このファイル内にある AppTheme という名前のタグの parentTheme.AppCompat.Light.DarkActionBar に変更します。
具体的には下記のとおりです。

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    ......
</style>

変更はこれだけで、実機で確認したところ、きちんと白色に変更されていました。

他にも、タグ内に下記を追加するという方法もあるようでしたが、私の環境では上手くいきませんでした。

<item name="android:textColorPrimary">#fff</item>

そのため、他に影響が出ないようでしたら、parent を変更する方法をおすすめします。

 

以上、Android の ActionBar のボタン・タイトルの色を白色に変更する方法でした。
ご参考になれば幸いです。

  • この記事いいね! (0)
著者:杉浦

【PHP】namespaceとautoloadの概要と連携

 最近、独自のオートローダを持つPHPプログラムを触ることになったので大雑把にnamespaceとautoloadの概要と連携を紹介します。
 namespace(名前空間)は1ファイルでも有効な変数名、関数名、クラス名等の区分け用の仕組みです。次の画像の様にちょっとしたスクリプトでも機能します。

 大雑把には各定義に接頭辞がついている様なものです。よくIDEのジャンプがnamespaceを元に働きますが、namespaceはファイルの読み込みに直接の関係を持ちません。
 autoloadは大まかには

public function autoload(string $呼び出す対象の名前){
    // なんやかんや処理
    require $呼び出す対象の書かれたファイルのパス;
    // あるいは
    include $呼び出す対象の書かれたファイルのパス;
}

PHP: require – Manual
PHP: include – Manual
をいい感じに動かす機能です。autoloaderによって多数のPHPソースコードファイルの中から必要な分だけPHPソースコードファイルを読み込みます。
 namespaceとautoloadのそれぞれは互いに関係ありません。PSR-4で定められた規約に従ってnamespaceとautoloadは連携します。
PSR-4 autoloader (日本語訳) – Qiita
PSR-4: Autoloader – PHP-FIG
 PSR-4はnamespaceとファイルの配置を定義づける規約です。大雑把にいえばnamespaceの名前、階層をディレクトリ構造と一致させなさい、という規約です。
 新しめのフレームワーク(laravelなど)やオートローダ(composerなど)はこのPSR-4に従っているためnamespaceによってファイル読み込みをしているとも言えます。ファイルを読み込めない時はコーディングをしている人が謎namespaceを定義してしまった時が大半です。逆にPSR-4に従っていない古いオートローダはnamespaceが通じているといってソースコードが読み込めているとは限りません。そういった場合、使われているオートローダのドキュメントなりソースコードなりを読み込む必要があります。
 

  • この記事いいね! (0)
asaba 著者:asaba

【webpack】webpack3でUglifyjsWebpackPluginを使う方法

UglifyjsWebpackPluginとは、webpackに自動でjavascriptを圧縮させるプラグインです。

公式によるとbundleでまとめたjavascriptを、更に改行や不要なコード削除を行うことで

読み込み速度を改善させることができるみたいですね。

webpack4ではwebpack.config.jsで以下のようにして使うことが出来ます。

 

c

//webpack.config.js
<pre>const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); 
  module.exports = {
   optimization: { minimizer: [new UglifyJsPlugin()],
  },
}</pre>

 

webpack3の場合はoptimizationで書くことが出来ないので

npmで必要なプラグインをダウンロードした後に以下のように

定義をします。

 


//webpack.config.js

const webpack = require("webpack");

plugins: [new webpack.optimize.UglifyJsPlugin(),],

  • この記事いいね! (0)
asaba 著者:asaba

【react】Loading chunk failedでdynamic importができなくなったときの対処法

コードを分割して初回読み込みをチューニングする手段の中の一つに

dynamic importというものがあります。

こちらは、あらかじめ読み込みたいファイルのみを読み込み、ボタンを押したときや

render時などの特定のタイミングで別のファイルを読み込ませるテクニックの一つです。

先に主要部分のファイルだけ読み込んでおけばユーザーを待たせることなく

、後でボタンをタップなどのアクションに合わせてコンポーネント

を出せばいいだけなのでかなりお手軽だなと思い実装。

ところが関数を作ってビルドをするとLoading chunk 0 failedで読み込みエラー発生。

原因は、app.jsのRouteで作成漏れでした。

Dynamic Importをするときは、必ず

</pre>
import Test from './test';

<HashRouter>
<Switch>

<Route exact path="/test" component={Test} />

</Switch>
</HashRouter>
<pre>

と定義する必要がありました。

 

後は主要ファイルの中で切り離したいコンポーネントを

以下のように組み立ててコンポーネントとして差し込めば

完成です。

 

</pre>
main.js

render() {

const SubConponent = Loadable({
loader: () => import('./subcomponent'),
loading: Loading,
});

return(

<SubConponent/>

);

}
<pre>
  • この記事いいね! (0)
村上 著者:村上

【Android】setTitle()で指定したActionBarのTitleが表示されない時の対処法

凄く初歩的ですが、今後も同じミスをやらかしそうな予感がしたので、未来の自分のためにまとめ。
タイトル通り、.setTitle() を使って ActionBar の Title を指定したのに表示されなかった時の対処法です。

今回参考にさせていただいた記事はこちらから。

Android getActionBar().setTitle does not work – Stack Overflow
https://stackoverflow.com/questions/26045431/android-getactionbar-settitle-does-not-work

ちなみに5年前の投稿でしたので、結構古いです。
が、私の環境ではこちらの方法で解決可能でした。

 

対処法ですが、getSupportActionBar().setDisplayShowTitleEnabled(true); を追加するだけでした。
具体的には下記のとおりです。

getSupportActionBar().setDisplayShowTitleEnabled(true);  // この行を追加
getSupportActionBar().setTitle("[タイトル]");

実際に実機(Android 7.0 と 8.0)で試したところ、問題なくタイトルが表示されていました!
念のため、他の端末でも確認する予定ですが、多分問題はないはずです。

 

以上、Android の ActionBar のタイトルが表示されない時の対処法でした。
ご参考になれば幸いです。

  • この記事いいね! (0)
村上 著者:村上

【Android】「Only fullscreen opaque activities can request orientation」エラーでアプリがクラッシュする時の対処法

タイトル通り、今回は Android で発生したエラーの対処法についてです。
以前に開発したアプリの修正を行っていたところ、確か現在の Activity から別の ActivityIntent を使って遷移した際に「java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation」というエラーと共にアプリが強制終了しました。

参考にさせていただいた記事はこちらから。

java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation – Qiita
https://qiita.com/oxsoft/items/042aaa6e9c7ae828e967

全く同じ状況だったので、大変参考になりました…!

 

参考サイトによると、クラッシュ原因は下記の 4つを満たすと発生するそうなので、どれか一つでも対処すればOKです。

  1. Android 8.0 の端末
  2. targetSdkVersion が 27 以上
  3. 背景を透過にしている
  4. 画面の向きを固定している

私は 4番目の「画面の向きを固定している」を変更することで対応しました。
…というか、これを変更する以外の選択肢がないのでは…?

画面の向きを固定しない方法については、下記のサイトを参考にさせていただきました。

Y.A.M の 雑記帳: Android 画面の向きを設定
http://y-anz-m.blogspot.com/2010/09/android.html

設定方法は AndroidManifest.xml 内にある、画面向きを固定しないアクティビティの android:screenOrientationbehind に設定するだけです。
サンプルコードは下記のとおりです。

<activity
    android:name=".[アクティビティ名]"
    android:label="@string/app_name"
    android:screenOrientation="behind" />

対処方法としては以上です。
再度アプリをビルド・実行したところ、クラッシュすることなく問題なく動作しました!

 

以上、「java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation」エラーでアプリがクラッシュする時の対処法でした。
ご参考になれば幸いです。

  • この記事いいね! (0)
著者:杉浦

【Chrome】開発者ツールNetworkタブInitiator列の紹介

 Chromeで開発を行う際、通信の内容を見るためにNetworkタブをよく見ます。そういった時、Initiator列は全く使いませんが、この列は意外に高性能です。具体的に何ができるかというと、カーソルを合わせた時に通信の起点を元にスタックトレースを出力します。

 これによってどのコードのどの部分で通信、特にaxiosなどの非同期通信が走っているか分かります。これだけでも便利なのですが、強力なのはスタックトレースであるという点です。仮にサーバからブラウザに暗号化したリソースを投げたとしてもスタックトレースをさかのぼり、そこからステップ実行をすると復号処理(ページ上でリソースを使うために復号するものと仮定)の場所、引いては復号した状態を得られます。これと前回のJavaScriptの圧縮を展開する方法によって謎リソースを元にした謎処理でも案外、解き明かせます。昨今のブラウザは強力ですね。

  • この記事いいね! (0)
takahashi 著者:takahashi

“MySQL版SSMS”なGUIツール MySQL Workbench

Microsoft SQL ServerというRDBMSには、GUIでDBやテーブル、データの編集ができる”SQL Server Management Studio(SSMS)”が無料で用意されています。

SQL Server Management Studio (SSMS) のダウンロード – Microsoft

一方MySQLはサードパーティ製のツール以外ではあまり充実している印象がなかったのですが、先日、公式のツールとして公開されている”MySQL Workbench”というソフトウェアで、実はSSMS同様GUIでDBを操作できる機能があることを知りました。

MySQL Workbench

https://www.mysql.com/jp/products/workbench/ より引用

接続したMySQL内のスキーマやテーブルの一覧を表示したり、現在DBへ保存済みのデータ一覧をGUI上で確認したり、編集したりもできます。

さらにパフォーマンス解析などを行うことも可能です。

https://www.mysql.com/jp/products/workbench/ より引用

CLI環境とSQL文だけでもMySQLは問題なく操作できますが、開発やデバック時はCLIだけではとても効率が悪い場合もあります。

このツールは無料で利用できるので、MySQLを使ったある程度規模の大きいシステムを構築する際は、是非利用してみてはいかがでしょうか。

  • この記事いいね! (0)
著者:杉浦

【Chrome】圧縮されたJavaScriptを圧縮されてない様に扱う

 Chromeの開発者ツールのちょっとした機能の紹介になります。
 長い行に圧縮されたJavaScriptを展開する機能です。ちょっとしたLint、prettier的な感じで改行とインデントが入ります。使うには下一枚目の赤丸で囲った{}ボタンを押すだけです。

 特筆すべきはこの状態でブレークポイントを指定できる点です。これのおかげで図の様に圧縮済みのコードでも現在、どこのどの変数に何が入っているのか、ここまでのフローはどうなっているのか、今起きているEventは何なのかと様々な情報を得られます。

  • この記事いいね! (0)