My開発メモ

最近の投稿

Emacsでxmlを入力するとき終了タグを自動補完する

EmacsでJavaのコードを入力していると、xmlのコードを書く機会が多い。

終了タグが自動補完されたらうれしいので、その設定。

xmlのファイルを開いていると、自動で nxml-mode になるので、 その設定に追加する。

init.el(追加)

;;;==================================================
;;; nxml-mode
;;;
;; スラッシュの入力で終了タグを自動補完
(add-hook 'nxml-mode-hook
          (lambda ()
            (setq nxml-slash-auto-complete-flag t)))

参考

カテゴリ: Emacs
タグ: Emacs nxml-mode xml 終了タグ 自動補完
Count: 2

php.iniのmbstringの設定をどうするか

php.iniのmbstringの設定をどうするか

PHPのマニュアルを見てたら、こんな感じかなあ。

default_charset = "UTF-8"             
mbstring.language =                   // デフォルトは neutral 
mbstring.internal_encoding =          // 非推奨 これを空のままで default_charsetを設定すべき
mbstring.encoding_translation =       // デフォルトは 0
mbstring.http_input =                 // 非推奨 これを空のままで default_charsetを設定すべき
mbstring.http_output =                // 非推奨 これを空のままで default_charsetを設定すべき
mbstring.detect_order =               // デフォルトは NULL

結局、何も設定していない。これは、『独習PHP・第3版』の真似をしているのである。

『独習PHP・第3版』

『独習PHP・第3版』 -- PHP7.0.1

default_charset = "UTF-8" とするだけで、mbstringについては言及なし。

同じ著者が、前の版では、以下のように設定していた。

『独習PHP・第2版』 -- PHP5.3.2

default_charset = "UTF-8"
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.encoding_translation = Off
mbstring.http_input = auto
mbstring.http_output = pass
mbstring.detect_order = UTF-8, SJIS, EUC-JP, JIS, ASCII
mbstring.substitute_character = none

この著者が『第3版』で設定のしかたを大幅に変更したことは、PHPのマニュアルでの内容と合致する。 だから僕も『第3版』と同じように設定していたのだった。

ところが、ネットを見てたら、『独習PHP・第2版』と同じ設定が大半なのである。

日本語環境の設定 - mbstring

https://webkaru.net/php/mbstring-php-ini

mbstringの設定

日本語環境(UTF-8)を設定するにはPHPの設定ファイル(php.ini)のmbstringを設定します。
以下は設定例です。

[mbstring]
; language for internal character representation.
; http://php.net/mbstring.language
mbstring.language = Japanese ← コメント(;)をはずします。

; internal/script encoding.
; Some encoding cannot work as internal encoding.
; (e.g. SJIS, BIG5, ISO-2022-*)
; http://php.net/mbstring.internal-encoding
mbstring.internal_encoding = UTF-8 ← コメントをはずし、内部エンコーディングをUTF-8へ。

; http input encoding.
; http://php.net/mbstring.http-input
mbstring.http_input = auto ← コメント(;)をはずします。

; http output encoding. mb_output_handler must be
; registered as output buffer to function
; http://php.net/mbstring.http-output
mbstring.http_output = UTF-8 ← コメントをはずし、エンコーディングをUTF-8へ。

; enable automatic encoding translation according to
; mbstring.internal_encoding setting. Input chars are
:
; enable automatic encoding translation according to
; mbstring.internal_encoding setting. Input chars are
; converted to internal encoding by setting this to On.
; Note: Do _not_ use automatic encoding translation for
;       portable libs/applications.
; http://php.net/mbstring.encoding-translation
mbstring.encoding_translation = On ← コメントをはずし、Onに。

; automatic encoding detection order.
; auto means
; http://php.net/mbstring.detect-order
mbstring.detect_order = auto ← コメント(;)をはずします。

上はいつの記事なのかわからないのだけれど、フッターの著作権表示のところをみると 2013 - 2020 と書いてあった。

ダウンロードのページを見てたら、PHP7.4.7とあった。

PHPをインストールしたらやっておきたい設定

https://qiita.com/knife0125/items/0e1af52255e9879f9332

文字コード関連の設定

  * default_charset = "UTF-8"
  * mbstring.language = Japanese
  * mbstring.internal_encoding = UTF-8
  * mbstring.encoding_translation = Off
  * mbstring.http_input = pass
  * mbstring.http_output = pass
  * mbstring.detect_order = auto

2014年12月18日に更新

この設定については、以下の記述があった。

※上記初心者対象という事由により、PHPのバージョンはCentOSデフォルトでyum installできるPHP5.3.3を対象にしていま
す。
※既に5.3系のPHPがオフィシャルサポート終了になっているのは承知のうえで、設定上の大きな変更はないものに絞って記
述しています。

つまり、PHP5.3.3 での設定ということだ。

日本語利用に関する設定(mbstring)

https://www.javadrive.jp/php/install/index8.html

[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = pass
mbstring.http_output = pass
mbstring.encoding_translation = Off
mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII
mbstring.substitute_character = none
mbstring.func_overload = 0
mbstring.strict_detection = Off
;mbstring.http_output_conv_mimetype=
;mbstring.regex_stack_limit=100000
;mbstring.regex_retry_limit=1000000

これもいつの記事かわからない。フッターには 2006-2020 と書かれてある。

「PHPをダウンロードする」という箇所に以下の記述があった。

2020 年 6 月現在、 PHP 7.4 系、 PHP 7.3 系と PHP 7.2 系がダウンロード可能です。今回は php-7.4.7 をダウンロード
します。「Current Stable PHP 7.4.7」ブロックの中にある「Windows downloads」をクリックして下さい。

phpマニュアルの説明

ここでPHPマニュアルを引用する。少し長いけれど。

phpマニュアルの説明 https://www.php.net/manual/ja/mbstring.configuration.php

実行時設定

php.ini の設定により動作が変化します。

                                            mbstring 設定オプション                                            
            名前                     デフォルト         変更可能                    変更履歴                
mbstring.language                   "neutral"           PHP_INI_ALL    5.2.6以前では PHP_INI_PERDIR でした。   
mbstring.detect_order               NULL                PHP_INI_ALL                                            
mbstring.http_input                 "pass"              PHP_INI_ALL    PHP 4.0.6 から利用可能です。PHP 5.6.0 で
                                                                       非推奨になりました。                    
mbstring.http_output                "pass"              PHP_INI_ALL    PHP 5.6.0 で非推奨になりました。        
mbstring.internal_encoding          NULL                PHP_INI_ALL    PHP 5.6.0 で非推奨になりました。        
mbstring.script_encoding            NULL                PHP_INI_ALL    PHP 5.4.0 で削除されました。代わりに    
                                                                       zend.script_encoding を使いましょう。   
mbstring.substitute_character       NULL                PHP_INI_ALL                                            
mbstring.func_overload              "0"                 PHP_INI_SYSTEM PHP 5.2.6 以前では PHP_INI_PERDIR。 PHP 
                                                                       7.2.0 で非推奨になりました。            
mbstring.encoding_translation       "0"                 PHP_INI_PERDIR                                         
                                    "^(text/|                                                                  
mbstring.http_output_conv_mimetypes application/xhtml\  PHP_INI_ALL    PHP 5.3.0 以降で利用可能です。          
                                    +xml)"                                                                     
mbstring.strict_detection           "0"                 PHP_INI_ALL    PHP 5.1.2 以降で利用可能です。          
以下に設定ディレクティブに関する簡単な説明を示します。

mbstring.language string
   
    mbstring で使用される言語設定(NLS)のデフォルト値。この設定は mbstring.internal_encoding を定義するため、
    php.ini の中で mbstring.internal_encoding は、 mbstring.language の後に置く必要があることに注意してください
    。
   
mbstring.encoding_translation bool
   
    入力される HTTP クエリに関して、文字エンコーディング検出および内部文字エンコーディングへの変換を行う透過的
    な文字エンコーディングフィルタを有効にします。
   
mbstring.internal_encoding string
    警告
   
    この機能は PHP 5.6.0 で非推奨になります。この機能に頼らないことを強く推奨します。
   
    内部文字エンコーディングのデフォルト値を定義します。
   
    PHP 5.6 以降のユーザーは、これを空のままにしておいて、代わりに default_charset を設定すべきです。
   
mbstring.http_input string
    警告
   
    この機能は PHP 5.6.0 で非推奨になります。この機能に頼らないことを強く推奨します。
   
    HTTP 入力文字エンコーディングのデフォルト値を定義します。
   
    PHP 5.6 以降のユーザーは、これを空のままにしておいて、代わりに default_charset を設定すべきです。
   
mbstring.http_output string
    警告
   
    この機能は PHP 5.6.0 で非推奨になります。この機能に頼らないことを強く推奨します。
   
    HTTP 出力文字エンコーディングのデフォルト値を定義します (出力は、内部エンコーディングから HTTP 出力エンコー
    ディングに変換された上で出力されます)。
   
    PHP 5.6 以降のユーザーは、これを空のままにしておいて、代わりに default_charset を設定すべきです。
   
mbstring.detect_order string
   
    文字コード検出のデフォルト値を定義します。 mb_detect_order()も参照ください。
   
mbstring.substitute_character string
   
    無効な文字を代替する文字を定義します。サポートされる値は、mb_substitute_character() を参照してください。
   
mbstring.func_overload string
    警告
   
    この機能は PHP 7.2.0 で非推奨になります。この機能に頼らないことを強く推奨します。
   
    シングルバイト対応の関数を mbstring 関数の対応する関数でオーバーロード (置換)します。詳細は、関数のオーバー
    ロードを参照してください。
   
    この設定は、php.ini でしか変更できません。
   
mbstring.http_output_conv_mimetypes string
   
mbstring.strict_detection bool
   
    厳密なエンコーディング検出を行います。
   
» HTML 4.01 の仕様によると、Web ブラウザは、フォームのデータを投稿する際にページで使用される文字エンコーディン
グと異なるエンコーディングを使用することができます。ブラウザで使用される文字エンコーディングを検出するには、 
mb_http_input() を参照ください。

一般的に使用されるブラウザでは、指定したHTML文書の文字エンコーディングをかなり正確に推定することができますが、 
header() または設定パラメータ default_charset により、 Content-Type HTTP ヘッダで charset を設定する方がより良
いでしょう。

結論

『独習PHP・第3版』が正しいと思うなあ。

追記

とうとうPHPマニュアルの記載事項に言及しているサイトを見つけた。

php.ini のご利用方法 https://support.heteml.jp/hc/ja/articles/360042620533

mbstring 関連
mbstring.detect_order
文字コード検出のデフォルト値を定義します。
※「 UTF-8,EUC-JP,SJIS 」のような形でご入力ください。

mbstring.encoding_translation
HTTP入力文字のエンコーディング検出と内部文字エンコーディングへの変換を有効にします。

mbstring.func_overload
シングルバイト対応の関数をmbstring関数の対応する関数で置換するかどうかの設定を行います。
(設定値の詳細は【PHPオンラインマニュアル】をご覧ください)

mbstring.http_input
HTTP入力文字エンコーディングのデフォルト値の定義を行います。
※ PHP5.6 から非推奨の設定となりました。未設定の状態をおすすめします。

mbstring.http_output
HTTP出力文字エンコーディングのデフォルト値の定義を行います。
※ PHP5.6 から非推奨の設定となりました。未設定の状態をおすすめします。

mbstring.internal_encoding
内部文字エンコーディングの設定を行います。
※ PHP5.6 から非推奨の設定となりました。未設定の状態をおすすめします。

mbstring.language
デフォルトの言語を設定を行います。『neutral』 の場合は『UTF-8』に設定されます。
カテゴリ: PHP
タグ: php.ini mbstring PHP
Count: 7

Jersey2.32UserGuideをやってみた

Jersey2.32UserGuideをやってみた

Getting Started にしたがってやってみた。

https://eclipse-ee4j.github.io/jersey.github.io/documentation/latest/getting-started.html

最初に「注意」があった。

最新のSNAPSHOTバージョンのJerseyモジュールに依存する場合は、次のリポジトリー構成をMavenプロジェクトpomに追加する必要があります。
<snapshotRepository>
  <id>ossrh</id>
  <name>Sonatype Nexus Snapshots</name>
  <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
</snapshotRepository>

プロジェクトの開始

以下のコマンドでおこなう

$ mvn archetype:generate \
-DarchetypeArtifactId=jersey-quickstart-grizzly2 \
-DarchetypeGroupId=org.glassfish.jersey.archetypes \
-DinteractiveMode=false \
-DgroupId=com.billies_works \
-DartifactId=simple-service \
-Dpackage=com.billies_works.simple \
-DarchetypeVersion=2.32

現ディレクトリに simple-service というディレクトリができて、内容は以下のようになっている。

./simple-service/
├── pom.xml
└── src
    ├── main
    │   └── java
    │       └── com
    │           └── billies_works
    │               └── simple
    │                   ├── Main.java
    │                   └── MyResource.java
    └── test
        └── java
            └── com
                └── billies_works
                    └── simple
                        └── MyResourceTest.java

src/main/java/com/billies_works/simple/MyResorce.java

package com.billies_works.simple;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

/**
 * Root resource (exposed at "myresource" path)
 */
@Path("myresource")
public class MyResource {

    /**
     * Method handling HTTP GET requests. The returned object will be sent
     * to the client as "text/plain" media type.
     *
     * @return String that will be returned as a text/plain response.
     */
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getIt() {
        return "Got it!";
    }
}

src/test/java/com/billies_works/simple/MyResourceTest.java

package com.billies_works.simple;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;

import org.glassfish.grizzly.http.server.HttpServer;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;

public class MyResourceTest {

    private HttpServer server;
    private WebTarget target;

    @Before
    public void setUp() throws Exception {
        // start the server
        server = Main.startServer();
        // create the client
        Client c = ClientBuilder.newClient();

        // uncomment the following line if you want to enable
        // support for JSON in the client (you also have to uncomment
        // dependency on jersey-media-json module in pom.xml and Main.startServer())
        // --
        // c.configuration().enable(new org.glassfish.jersey.media.json.JsonJaxbFeature());

        target = c.target(Main.BASE_URI);
    }

    @After
    public void tearDown() throws Exception {
        server.stop();
    }

    /**
     * Test to see that the message "Got it!" is sent in the response.
     */
    @Test
    public void testGetIt() {
        String responseMsg = target.path("myresource").request().get(String.class);
        assertEquals("Got it!", responseMsg);
    }
}

プロジェクトの実行

$ mvn clean test

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.billies_works.simple.MyResourceTest
11月 24, 2020 6:09:48 午後 org.glassfish.jersey.server.wadl.WadlFeature configure
警告: JAXBContext implementation could not be found. WADL feature is disabled.
11月 24, 2020 6:09:48 午後 org.glassfish.grizzly.http.server.NetworkListener start
情報: Started listener bound to [localhost:8080]
11月 24, 2020 6:09:48 午後 org.glassfish.grizzly.http.server.HttpServer start
情報: [HttpServer] Started.
11月 24, 2020 6:09:48 午後 org.glassfish.grizzly.http.server.NetworkListener shutdownNow
情報: Stopped listener bound to [localhost:8080]
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.963 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  14.898 s
[INFO] Finished at: 2020-11-24T18:09:48+09:00
[INFO] ------------------------------------------------------------------------

以下のコマンドで GrizzlyというHttpサーバーが起動する。

$ mvn exec:java

以下のような文字列が出力される。

11月 24, 2020 6:12:24 午後 org.glassfish.jersey.server.wadl.WadlFeature configure
警告: JAXBContext implementation could not be found. WADL feature is disabled.
11月 24, 2020 6:12:24 午後 org.glassfish.grizzly.http.server.NetworkListener start
情報: Started listener bound to [localhost:8080]
11月 24, 2020 6:12:24 午後 org.glassfish.grizzly.http.server.HttpServer start
情報: [HttpServer] Started.
Jersey app started with WADL available at http://localhost:8080/myapp/application.wadl
Hit enter to stop it...

別の端末で以下のように入力する。

$ curl -i http://localhost:8080/myapp/myresource

すると、以下のように出力される。

HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 7

Got it!

また、ブラウザにて http://localhost:8080/myapp/myresource にアクセスしても

Got it!

と表示される。

MyResource.java の中で、@Producesアノテーションに記述した内容、すなわち

@Produces(MediaType.TEXT_PLAIN)

が、

Content-Type: text/plain

として出力されている。

curl -v とすると、通信全体に関する多くの追加情報が出力される。

$ curl -v http://localhost:8080/myapp/myresource
*   Trying 127.0.0.1:8080...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET /myapp/myresource HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.68.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Type: text/plain
< Content-Length: 7
< 
* Connection #0 to host localhost left intact
Got it!
カテゴリ: Java
タグ: Maven Jersey JAX-RS Grizzly
Count: 3