20200212のJavaに関する記事は4件です。

「=」を使わずにFizzBuzzを書く

「=」を使わずにFizzBuzzを書きたい

特に意味はない
20までのFizzBuzzを「=」を使わずにいろんな言語で書いてみよう

C言語

c_fizzbuzz.c
#include <stdio.h>

int main(void) {
  int n;
  n++;
  while (1) {
    if (n%3 && n%5) {
      printf("%d", n);
    }
    else{
      if (!(n%3)) {
        printf("Fizz");
      }
      if (!(n%5)) {
        printf("Buzz");
      }
    }
    printf("\n");
    n++;
    if (n>20) {
      break;
    }
  }
  return 0;
}

初期化しないと0が入るのを利用(ただしコンパイラによる)
0がFalse、それ以外がTrueになる性質を使って条件分岐する

Python

python_fizzbuzz.py
def fizzbuzz(n):
    if n%3 and n%5:
        return n
    else:
        if not n%3 and not n%5:
            return "FizzBuzz"
        elif not n%3:
            return "Fizz"
        elif not n%5:
            return "Buzz"

for x in list(map(fizzbuzz, range(1,21))):
    print(x)

Pythonはインクリメントがないため
rangeで整数のリストを作成
mapで一気すべてに関数を掛ける方式に
地味に

print("hoge", end="")

が使えないのでつらかった

Java

java_fizzbuzz.java
class java_fizzbuzz {
  static int n;
  public static void main(String[] args) {
    n++;
    while(true){
      if (!String.valueOf(n%3).equals("0") && !String.valueOf(n%5).equals("0")) {
        System.out.print(n);
      }
      else{
        if (String.valueOf(n%3).equals("0")) {
          System.out.print("Fizz");
        }
        if (String.valueOf(n%5).equals("0")) {
          System.out.print("Buzz");
        }
      }
      System.out.println();
      n++;
      if (n>20) {
        break;
      }
    }
  }
}

クラスのメンバ変数は0で初期化されることを利用
Booleanが0 or その他で処理していないことが判明
一旦Stringに変換してequalsで比較することでイコールを使わずに済んだ

まとめ

どうしても「=」を使いたくないときに参考にしてください
なお変数は明示的に初期化するようにしましょう

もっといい書き方がある!
この言語ではこうできる!
等ありましたらコメントへお願いします

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Apache-Tomcat連携サーバで、Chrome 80のSameSite挙動が変わっても、セッションが切れないように設定する。

リンク型決済サイトについて、
2/17以降にChrome決済サイトから決済完了後の画面にPOSTで遷移するとセッションが切れる事が判明したので、
対応方法をメモ。

発生する現象

Cookieに「SameSite」という属性がありますが、これは現行ではデフォルトが「None」で動作しています。
この状態では、別ドメインのサイトから遷移する場合でもCookieを送信してくれるので、サーバ側でセッションタイムアウトでもしていなければ、遷移前のセッションが保持されます。
その属性が、2/17日以降、Chrome 80ではデフォルトで「Lax」になり、これは「GETの場合は送信しても良いが、POST等、特定の条件ではダメ」という挙動になるようです。
その結果、リンク型決済サイトで別ドメインのページから決済完了画面にPOSTで遷移されると、
Cookieの中のJSESSIONIDが、決済サイトへの遷移する前とは異なる値になってしまい、「別セッション」として扱われます。

事前の検証方法

1:Chromeで以下の設定ページを開きます。
chrome://flags/
2:設定の中から、「SameSite by default cookies」と「Cookies without SameSite must be secure」を「Enabled」に切り替えてChromeを再起動します。
これで、2/17以降のChromeのデフォルトと同じ動作になるはずです。
3:ChromeでF12ツールを開き、「Application」タブの左メニューで「Cookies」を開きます。
※JSESSIONIDについては、フィルターに「SESSION」等を入れれば絞り込めます。
4:JSESSIONIDが、決済サイトへの遷移前と、戻って来た時とで違っていたら、セッションは切れています。

対応方法

以下の方法でサーバ側の対応を行えば、現行と同じ動作を継続できるようです。
※サーバがApacheの場合

□概要
mod_headers.soを使って、Apache→Tomcatの連携部分の設定に、
Cookieに一律SameSite=Noneを設定する指定を追加します。
以下に手順を書きます。

1:Apache→Tomcatの連携部分の設定ファイルを開きます。
※「/etc/httpd/conf.modules.d/00-proxy.conf」等

2:各転送設定を以下のように変更します。

□変更前: 
ProxyPass /{アプリケーション名}/ ajp://localhost:8009/{アプリケーション名}/

□変更後:
<Location /{アプリケーション名}/>
ProxyPass ajp://localhost:8009/{アプリケーション名}/
Header edit Set-Cookie ^(.*)$ $1;Secure;SameSite=None
</Location>

3:Apacheを再起動します。

以上

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

hibernateの複合キー

@Entuty
@Table(name="sample")
public class SampleRecord {

    @Column(name = "id")
    private long id;

    @Column(name = "name")
    private String name;

    // 省略
}
Exception in thread "main" org.hibernate.AnnotationException: No identifier specified for entity: com.sample.jpa.SampleRecord

@Entityを使う場合は@Idを指定しないといけないっぽい

@Embeddable
@Table(name="sample")
public class SampleRecord {

    @Column(name = "id")
    private long id;

    @Column(name = "name")
    private String name;

    // 省略
}

@Embeddableを使ってみるとコンパイルエラーすることなくできました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Java 基礎知識 1

はじめに

現在、私はRubyを中心に学んでおります。
学習を進める中、他言語にも興味が沸いた為、Javaに関して用語等を整理していたいと思いました。
もうすでにご存知の方、省略の仕方等ご存知でしたら、ご教授願います。

Javaとは

  • プログラミング言語の1つであり、世界的に人気の高い言語であること

人気の理由は?

  • 多くの現場で使われていること
  • 汎用的でOSに依存しないこと(超重要)

Javaで何ができるのか?

Javaのメリットは?

  • 処理速度が速いこと

    • 起動にコンパイルを必要とするコンパイラ言語であること
    • Ruby等のスクリプト言語よりも処理速度が速いのが特徴のようです。
  • プラットフォームに依存しないこと

    • 上述の通り、OSに関係なく、Windows, iOS, Linuxで動作させることができる言語
  • オブジェクト指向であること

    • Rubyと同じですね!

Javaのデメリットは?

  • プログラミング以外の作業が面倒なこと

    • Javaはプログラムを実行するためにコンパイルという作業をする必要があるようです。
    • コンパイラ言語の特徴かと勝手に思ってます。
    • 事前準備や開発環境を整える作業が多くなる。
  • 学習環境が少ないこと

    • 私はこれで苦労しそうです。なんとか触りだけでも頑張りたいなと思ってます。

以上、私の感想を交えつつ、整理してみました。

さいごに

日々勉強中ですので、随時更新します。
皆様の復習にご活用頂けますと幸いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む