wrongwrongな開発日記

情報系大学院生の忘備録

【日記】モイ株式会社のFizz Buzz チャレンジをやった

Fizz Buzz チャレンジとは?

モイ株式会社の新卒採用エントリー前の試験です。

saiyo2019.moi.st

結果

スコア上げは気力が続かなかったのでしてません。

ハイスコアは800超え。どうやったのかな……。

f:id:wrongwrongwrongwrong163377:20180813001958p:plain

【Java】Intellij IDEAでWebSocketを導入する【Kotlin】

Intellij IDEAでWebSocketを使います。

やること

やることは以下の通りです。

参考ページ

ここから書く内容は以下のページと同様です。
jckjaer.dk

Java EEを持ってきて配置する

OracleのダウンロードページからJava EE {バージョン} Platform SDKをダウンロードしてきます。
解答すると、中にはglassfish{バージョン}というフォルダが入っているので、C:\Program Files\Java\java_ee_sdk-{バージョン}*1配置します。
自分がやった時はJava EE 8 Platform SDKglassfish5でした。
配置後は以下のようになります。
f:id:wrongwrongwrongwrong163377:20180812200233p:plain

Application Serverを設定する

Intellij IDEAを起動し、New ProjectからJava Enterpriseを選択し、次にApplication Serverの右のNew...を押し、一番上のGlassfish Serverを選択します。
f:id:wrongwrongwrongwrong163377:20180812200756p:plain
選択すると以下のようにGlassfish Serverのディレクトリ選択画面が出るので、先程glassfish{バージョン}を配置したディレクトリを入力します。
f:id:wrongwrongwrongwrong163377:20180812201108p:plain
Application ServerにGlassFish {バージョン}という表記が入れば設定は完了です*2

*1:このフォルダはJDKJREが配置されるフォルダです。Java EEの配置先がここである必要は有りませんが、分かりやすさのためここに配置しています。

*2:ここで使用している画像では既に設定が済んでいます。最初はApplication Server欄が空欄となっています。

【Android】Retrofit2を使う【Kotlin】

KotlinでRetrofit2を使ってみました。

Retrofitとは

httpで公開されたAPI叩くライブラリです。
Pairsの中の人に聞いた所、事情がなければAndroidアプリ作ってる会社は基本的にRetrofitを使ってるそうです。

プロジェクト

プロジェクトはGitHubに挙げてあります。
github.com

やったこと

  • Gradleに追記
  • Manifestに追記
  • 受け取るためのデータクラス作成
  • Retrofitを使う
Gradleに追記

Module.appに以下3行を追加します。

implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'

追記後全文。

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.wrongwrong.retrofittest"
        minSdkVersion 15
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    //for Retrofit2
    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'

    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
Manifestに追記

ネットワークを使うのでパーミッションを書きます。

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

追記後全文。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.wrongwrong.retrofittest">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
受け取るためのデータクラス作成

今回はGitHubAPIのreposを取得します。取得するデータ一覧はこちら

package com.wrongwrong.retrofittest

import java.io.Serializable

data class Owner(
        var login: String,
        var id: Long,
        var node_id: String,
        var avatar_url: String,
        var gravatar_id: String,
        var url: String,
        var html_url: String,
        var followers_url: String,
        var following_url: String,
        var gists_url: String,
        var starred_url: String,
        var subscriptions_url: String,
        var organizations_url: String,
        var repos_url: String,
        var events_url: String,
        var received_events_url: String,
        var type: String,
        var site_admin: Boolean
): Serializable

data class Permissions(
        var admin: Boolean,
        var push: Boolean,
        var pull: Boolean
): Serializable

data class License(
        var key: String,
        var name: String,
        var spdx_id: String,
        var url: String,
        var name_id: String
): Serializable

data class Repo(
        var id: Long,
        var node_id: String,
        var name: String,
        var full_name: String,

        var owner: Owner,

        var private: Boolean,
        var html_url: String,
        var description: String?,
        var fork: Boolean,
        var url: String,
        var archive_url: String,
        var assignees_url: String,
        var blobs_url: String,
        var branches_url: String,
        var collaborators_url: String,
        var comments_url: String,
        var commits_url: String,
        var compare_url: String,
        var contents_url: String,
        var contributors_url: String,
        var deployments_url: String,
        var downloads_url: String,
        var events_url: String,
        var forks_url: String,
        var git_commits_url: String,
        var git_refs_url: String,
        var git_tags_url: String,
        var git_url: String,
        var issue_comment_url: String,
        var issue_events_url: String,
        var issues_url: String,
        var keys_url: String,
        var labels_url: String,
        var languages_url: String,
        var merges_url: String,
        var milestones_url: String,
        var notifications_url: String,
        var pulls_url: String,
        var releases_url: String,
        var ssh_url: String,
        var stargazers_url: String,
        var statuses_url: String,
        var subscribers_url: String,
        var subscription_url: String,
        var tags_url: String,
        var teams_url: String,
        var trees_url: String,
        var clone_url: String,
        var mirror_url: String,
        var hooks_url: String,
        var svn_url: String,
        var homepage: String,
        var language: String?,
        var forks_count: Int,
        var stargazers_count: Int,
        var watchers_count: Int,
        var size: Int,
        var default_branch: String,
        var open_issues_count: Int,
        var topics: List<String>,
        var has_issues: Boolean,
        var has_projects: Boolean,
        var has_wiki: Boolean,
        var has_pages: Boolean,
        var has_downloads: Boolean,
        var archived: Boolean,
        var pushed_at: String,
        var created_at: String,
        var updated_at: String,
        var permissions: Permissions,
        var allow_rebase_merge: Boolean,
        var allow_squash_merge: Boolean,
        var allow_merge_commit: Boolean,
        var subscribers_count: Int,
        var network_count: Int,
        var license: License
): Serializable
Retrofitを使う

今回はonCreate内でhttps://api.github.com/users/{id}/reposにアクセスしてデータを取得し、0番目のリポジトリのフルネームをLogに出力します。
「インターフェースを用意し、定型文を書いたらonResponseのResponse.body()にデータが取れる」位しか理解できてませんが一応動いたのでここまで。

package com.wrongwrong.retrofittest

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.google.gson.GsonBuilder
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.http.GET
import retrofit2.http.Path
import java.io.IOException

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val gson = GsonBuilder().serializeNulls().create()
        var retrofit: Retrofit = Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create(gson))
                .baseUrl("https://api.github.com/users/")
                .build()
        var service = retrofit.create(IGetRepos::class.java)
        var call = service.GetRepos("k163377")
        call.enqueue(object : Callback<List<Repo>> {
            override fun onResponse(call: Call<List<Repo>>?, response: Response<List<Repo>>?) {
                try{
                    var arr: List<Repo>? = response!!.body()
                    Log.d("onResponse", arr!![0].full_name)
                }catch (e: IOException){
                    Log.d("onResponse", "IOException")
                }
            }

            override fun onFailure(call: Call<List<Repo>>?, t: Throwable?) {
                TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
            }
        })
    }

    interface IGetRepos{
        @GET("{id}/repos")
        fun GetRepos(@Path("id") userID : String) : Call<List<Repo>>
    }
}

参考URL

mainActivityの大部分はこちらから写経させて頂きました。 Retrofit2Demo/Example01.java at master · ikidou/Retrofit2Demo · GitHub
もっと詳しい解説です。 Android Retrofit2 with Kotlin
AndroidでRxJavaと組み合わせた例です。 KotlinでRetrofitとRxを使ってAPIクライアントをサクッと実装する

【c/c++】AVX2を使った行列積を計算するプログラム

講義で作ったOpenMPとAVX2命令を使って4096x4096の行列積を計算するプログラムです。そのまま並列化しろという内容だったので最適化はちゃんとしていませんが、折角作ったので公開しておきます。

ソースコード

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#include <omp.h>
#include <immintrin.h>

#define SIZE 4096

void MatrixMul_1_ST(double *A, double *B, double *C) { //シングルスレッドSIMD無し
    int i,j,k;
    double sum;
    double tmp;

    for (i=0;i<SIZE;i++){
        for (j=i+1;j<SIZE;j++){
            tmp         = B[j*SIZE+i];
            B[j*SIZE+i] = B[i*SIZE+j];
            B[i*SIZE+j] = tmp;
        }
    }

    for (i=0; i<SIZE; i++){
        for (j=0; j<SIZE; j++){
            sum = 0.0;
            for (k=0; k<SIZE; k++)
                sum += A[i*SIZE+k]*B[j*SIZE+k];
            C[i*SIZE+j] = sum;
        }
    }
}

void MatrixMul_1_MT(double *A, double *B, double *C) { //マルチスレッドSIMD無し
    int i,j,k;
    double sum;
    double tmp;

    #pragma omp parallel for private(j, tmp)
    for (i=0;i<SIZE;i++){
        for (j=i+1;j<SIZE;j++){
            tmp         = B[j*SIZE+i];
            B[j*SIZE+i] = B[i*SIZE+j];
            B[i*SIZE+j] = tmp;
        }
    }

    #pragma omp parallel for private(j, k, sum)
    for (i=0; i<SIZE; i++){
        for (j=0; j<SIZE; j++){
            sum = 0.0;
            for (k=0; k<SIZE; k++) sum += A[i*SIZE+k]*B[j*SIZE+k];
            C[i*SIZE+j] = sum;
        }
    }
}

void MatrixMul_1_ST_SIMD(double *A, double *B, double *C) { //シングルスレッドSIMD有り
    int i,j,k;
    double tmp;
    __m256d vsum;
    double *sum = (double*)(&vsum);

    for (i=0;i<SIZE;i++){
        for (j=i+1;j<SIZE;j++){
            tmp         = B[j*SIZE+i];
            B[j*SIZE+i] = B[i*SIZE+j];
            B[i*SIZE+j] = tmp;
        }
    }

    for (i=0; i<SIZE; i++){
        for (j=0; j<SIZE; j++){
            vsum = _mm256_set1_pd(0.0);
            for (k=0; k<SIZE; k+=4){
                vsum = _mm256_add_pd(vsum, _mm256_mul_pd(
                        _mm256_load_pd(&A[i*SIZE+k]),
                        _mm256_load_pd(&B[j*SIZE+k])));
            }
            C[i*SIZE+j] = sum[0] + sum[1] + sum[2] + sum[3];
        }
    }
}

void MatrixMul_1_MT_SIMD(double *A, double *B, double *C) { //マルチスレッドSIMD有り
    int i,j,k;
    double tmp;
    __m256d vsum;
    double *sum;

    #pragma omp parallel for private(j, tmp)
    for (i=0;i<SIZE;i++){
        for (j=i+1;j<SIZE;j++){
            tmp         = B[j*SIZE+i];
            B[j*SIZE+i] = B[i*SIZE+j];
            B[i*SIZE+j] = tmp;
        }
    }
    #pragma omp parallel for private(j, k, vsum, sum)
    for (i=0; i<SIZE; i++){
        sum = (double*)(&vsum);
        for (j=0; j<SIZE; j++){
            vsum = _mm256_set1_pd(0.0);
            for (k=0; k<SIZE; k+=4){ //sizeが4指定なので後処理はしない
                vsum = _mm256_add_pd(vsum, _mm256_mul_pd(
                        _mm256_load_pd(&A[i*SIZE+k]),
                        _mm256_load_pd(&B[j*SIZE+k])));
            }
            C[i*SIZE+j] = sum[0] + sum[1] + sum[2] + sum[3];
        }
    }
}

void Measurement_1(char* Title, void (*MatrixMul_1)(double*, double*, double*)){
    int i,j;
    double *a,*b,*c;
    clock_t ts,te;
    clock_t d1,d2,d3;

    printf("//---------------------\n");
    printf(Title);
    printf("Matrix Size: %d X %d.\n",SIZE,SIZE);

    ts = clock();
//---------------------
    a = (double*)malloc(SIZE*SIZE*sizeof(double));
    b = (double*)malloc(SIZE*SIZE*sizeof(double));
    c = (double*)malloc(SIZE*SIZE*sizeof(double));
    d1 = clock();
//---------------------
    srand(10);

    for(i=0; i<SIZE; i++){
        for(j=0; j<SIZE; j++){
            a[i*SIZE+j] = rand()/(double)RAND_MAX;
            b[i*SIZE+j] = rand()/(double)RAND_MAX;
            c[i*SIZE+j] = 0.0;
        }
    }
    d2 = clock();
//---------------------
    MatrixMul_1(a,b,c);
    d3 = clock();
//---------------------
    printf("Result:\n");
    printf("c[0][0]= %.15e ... c[%d][0]=%.15e\n",c[0],SIZE-1,c[(SIZE-1)*SIZE+0]);
    printf("c[0][1]= %.15e ... c[%d][1]=%.15e\n",c[1],SIZE-1,c[(SIZE-1)*SIZE+1]);
    printf("c[0][2]= %.15e ... c[%d][2]=%.15e\n",c[2],SIZE-1,c[(SIZE-1)*SIZE+2]);
    printf("c[0][3]= %.15e ... c[%d][3]=%.15e\n",c[3],SIZE-1,c[(SIZE-1)*SIZE+3]);
    printf(".......\n");
    printf("c[0][%d]= %.15e ... c[%d][%d]=%.15e\n",SIZE-4,c[SIZE-4],SIZE-1,SIZE-4,c[(SIZE-1)*SIZE+SIZE-4]);
    printf("c[0][%d]= %.15e ... c[%d][%d]=%.15e\n",SIZE-3,c[SIZE-3],SIZE-1,SIZE-3,c[(SIZE-1)*SIZE+SIZE-3]);
    printf("c[0][%d]= %.15e ... c[%d][%d]=%.15e\n",SIZE-2,c[SIZE-2],SIZE-1,SIZE-2,c[(SIZE-1)*SIZE+SIZE-2]);
    printf("c[0][%d]= %.15e ... c[%d][%d]=%.15e\n",SIZE-1,c[SIZE-1],SIZE-1,SIZE-1,c[(SIZE-1)*SIZE+SIZE-1]);

    te = clock();

    printf("\nTotal Time : %f [sec]\n", (float)(te-ts)/CLOCKS_PER_SEC);
    printf("Time of Allocation           : %f [sec]\n", (float)(d1-ts)/CLOCKS_PER_SEC);
    printf("Time of Initialization       : %f [sec]\n", (float)(d2-d1)/CLOCKS_PER_SEC);
    printf("Time of Operation for Matrix : %f [sec]\n\n", (float)(d3-d2)/CLOCKS_PER_SEC);
//---------------------
    free(a);
    free(b);
    free(c);
//---------------------
}

int main() {
    Measurement_1("Serial Program (1d ver.)\n", *MatrixMul_1_ST);
    Measurement_1("Parallel Program (1d ver.)\n", *MatrixMul_1_MT);
    Measurement_1("Serial SIMD Program (1d ver.)\n", *MatrixMul_1_ST_SIMD);
    Measurement_1("Parallel SIMD Program (1d ver.)\n", *MatrixMul_1_MT_SIMD);

    return 0;
}

実行結果

//---------------------
Serial Program (1d ver.)
Matrix Size: 4096 X 4096.
Result:
c[0][0]= 1.037951225539265e+03 ... c[4095][0]=1.026167362779490e+03
c[0][1]= 1.031621032790639e+03 ... c[4095][1]=1.028450900218210e+03
c[0][2]= 1.034022283576758e+03 ... c[4095][2]=1.028215220977095e+03
c[0][3]= 1.034019113402438e+03 ... c[4095][3]=1.028631778558352e+03
.......
c[0][4092]= 1.034580439819138e+03 ... c[4095][4092]=1.042994714743114e+03
c[0][4093]= 1.034889413448711e+03 ... c[4095][4093]=1.025519289347927e+03
c[0][4094]= 1.038085640812733e+03 ... c[4095][4094]=1.031131779777061e+03
c[0][4095]= 1.033145491256165e+03 ... c[4095][4095]=1.023042270704371e+03

Total Time : 77.487999 [sec]
Time of Allocation           : 0.001000 [sec]
Time of Initialization       : 0.586000 [sec]
Time of Operation for Matrix : 76.901001 [sec]

//---------------------
Parallel Program (1d ver.)
Matrix Size: 4096 X 4096.
Result:
c[0][0]= 1.037951225539265e+03 ... c[4095][0]=1.026167362779490e+03
c[0][1]= 1.031621032790639e+03 ... c[4095][1]=1.028450900218210e+03
c[0][2]= 1.034022283576758e+03 ... c[4095][2]=1.028215220977095e+03
c[0][3]= 1.034019113402438e+03 ... c[4095][3]=1.028631778558352e+03
.......
c[0][4092]= 1.034580439819138e+03 ... c[4095][4092]=1.042994714743114e+03
c[0][4093]= 1.034889413448711e+03 ... c[4095][4093]=1.025519289347927e+03
c[0][4094]= 1.038085640812733e+03 ... c[4095][4094]=1.031131779777061e+03
c[0][4095]= 1.033145491256165e+03 ... c[4095][4095]=1.023042270704371e+03

Total Time : 12.139000 [sec]
Time of Allocation           : 0.001000 [sec]
Time of Initialization       : 0.575000 [sec]
Time of Operation for Matrix : 11.563000 [sec]

//---------------------
Serial SIMD Program (1d ver.)
Matrix Size: 4096 X 4096.
Result:
c[0][0]= 1.037951225539264e+03 ... c[4095][0]=1.026167362779491e+03
c[0][1]= 1.031621032790638e+03 ... c[4095][1]=1.028450900218213e+03
c[0][2]= 1.034022283576759e+03 ... c[4095][2]=1.028215220977093e+03
c[0][3]= 1.034019113402438e+03 ... c[4095][3]=1.028631778558351e+03
.......
c[0][4092]= 1.034580439819138e+03 ... c[4095][4092]=1.042994714743114e+03
c[0][4093]= 1.034889413448712e+03 ... c[4095][4093]=1.025519289347928e+03
c[0][4094]= 1.038085640812731e+03 ... c[4095][4094]=1.031131779777060e+03
c[0][4095]= 1.033145491256164e+03 ... c[4095][4095]=1.023042270704369e+03

Total Time : 27.774000 [sec]
Time of Allocation           : 0.001000 [sec]
Time of Initialization       : 0.572000 [sec]
Time of Operation for Matrix : 27.198999 [sec]

//---------------------
Parallel SIMD Program (1d ver.)
Matrix Size: 4096 X 4096.
Result:
c[0][0]= 1.037951225539264e+03 ... c[4095][0]=1.026167362779491e+03
c[0][1]= 1.031621032790638e+03 ... c[4095][1]=1.028450900218213e+03
c[0][2]= 1.034022283576759e+03 ... c[4095][2]=1.028215220977093e+03
c[0][3]= 1.034019113402438e+03 ... c[4095][3]=1.028631778558351e+03
.......
c[0][4092]= 1.034580439819138e+03 ... c[4095][4092]=1.042994714743114e+03
c[0][4093]= 1.034889413448712e+03 ... c[4095][4093]=1.025519289347928e+03
c[0][4094]= 1.038085640812731e+03 ... c[4095][4094]=1.031131779777060e+03
c[0][4095]= 1.033145491256164e+03 ... c[4095][4095]=1.023042270704369e+03

Total Time : 7.994000 [sec]
Time of Allocation           : 0.000000 [sec]
Time of Initialization       : 0.575000 [sec]
Time of Operation for Matrix : 7.419000 [sec]
実行結果(表)
並列化無し OpenMP AVX2 OpenMP + AVX2
Time of Operation for Matrix[s] 76.901001 11.563000 27.198999 7.419000
速度比[%] 100 15.04 35.37 9.65

考察

今回は前回に比べるとちゃんと高速化しました。
今回はループの中でも一番内側のkについてSIMDによる並列化を行いましたが、恐らくkよりjについて並列化を行ったほうが高速だと思います。
とりあえずメモ書き程度としてここまで。

【自作PC】Mini-ITX向け280mmラジ搭載可能コンパクトケースを考えてみた【日記】

Mini-ITX向け280mmラジ搭載可能コンパクトケースを考えてみました。
かなり希望観測を含みますが、サイズ的にはC4-SFXにも引けを取らない形に仕上げられたと思います(考えただけで確かめられない、3Dデザインのスキルが欲しい。。。)。
グラボ側からトップまで回すとして、ホースの長さ足りるのかな……。

基本情報

HWD 247x160x330mm
対応ラジェーターサイズ 280mm
ケースファン 140mmx4
対応CPUクーラー高 80mm(アクリルパネル使用時は70mm以下推奨)
搭載可能グラフィックボードサイズ 287x160mm(2スロット)

基本構造

右側面から見てマザーが上を向く状態を想定。

グラボ

ライザーケーブルで後ろに回し、マザーと背中合わせになるように配置*1

ラジェーター

マザーとグラボにまたがるような形でケース上部に配置*2
構造的にケースを右側面から見て右側にラジェーターに繋がるホースを配置する形となる。

電源・SSD

1枚のパネルの表裏に電源とSSDをそれぞれマウントし、吊り下げる形で配置*3
光り物電源やSSDが増えていることを踏まえ、SSDと電源のどちらを外側へ向けるか選べるような構造とする。
横方向ではマザーと並べる形になるが、サイズ的に30mm程度の余裕を作れそうなので、配線はその隙間から行う形とする。

外装

鉄フレームとし、サイドとトップは磁石での貼り付け式とする。小型だけにエアフローが死にそうなので、これらはダストフィルタとする。勿論アクリルパネルも用意。
ボトムはフロント側にツールレスで取り外し可能なダストフィルタを装着。

詳細なサイズ

HWD=247x160x330[mm]

ケース高

170(マザー)+52(ファン+ラジエーター)+5(遊び)+(5+5)(外装)+10(足)=247mm程度。

ケース幅

150mm(ラジエータ)+10(外装)=160mm程度。
40(グラボ)+64(電源)+10(TeamのRGB SSD)+10mm(遊び)+10mm(外装)=134mm程度。

ケース長

312(ラジェーター)+18(外装)mm=330mm程度。
170(マザー)+125(電源)+(25(ケースファン))。

他特徴

フロントIO

ラジェーターの関係で配置できそうなのはフロント下部。

ケースファン

ボトムは薄型ファンであれば搭載可能か?マザー以下の高さにSFX-F電源を配置する場合45mm程度スペースができると考えられるので、ファン+ファングリルで20mm程度取ると残り25mmでかなりギリギリ*4
フロントは中央~下部に25mm厚140mmファンを搭載可能*5
上部の140mmx2基を合わせ、4基の140mmケースファンに対応。

*1:参考:A4-SFX

*2:参考:C4-SFX

*3:参考:PC-Q38

*4:参考:SFX-L電源で約30mmのスペースの実例

*5:マザー電源間は長さ方向にくっつけて配置可能であるため、330-170-125=35mmの隙間ができる

【日記】Sansan 技術×寿司 エンジニア交流会に参加してきた

Sansan 技術×寿司 エンジニア交流会に参加してきました。その中で聞かせていただいた面白かった話を(正確な内容はうろ覚えですが)まとめます。

日本人とアメリカ人の差

日本人とアメリカ人を比べても技術力の分布に差は無いが、アメリカ人は『自分が世界を変える』というマインドを強く持っているのに対して、日本人はあまり持っていない。この差は、アメリカ人はアマゾンやツイッターがショボいサイトから始まって世界を変えるのを間近で見た人が多いのに対し、日本人は既に世界を変えたものばかりを見て『ああいう世界を変えるものを作るためには技術力が必要だ』と思い込んでいるから生まれているんじゃないだろうか?

学生にはもっと世界を変えようと思って欲しい。

これは言われてハッとしました。個人的に「今は技術力がなきゃ勝負にならない」という思い込みが結構有りましたが、やっぱり一番大切なことはその技術で何をするかの方だよなと改めて思い直しました。

自分の観測範囲内の話ですが、この話の状況は本当に自分の周囲の人間にも当てはまっているように思います。技術レベルで負けてないのに日本からイノベーションが起きないのは、社会の構造だけでなくこういったマインド面にも原因があるのではないか、とも思いました。

人事の役割と能力

今の就職活動は人事に対して学生の立場が弱い。学生の側は社会のことや自分のアピールポイント、アピールのしかたなんて知らなくて当たり前で、むしろ学生の本分である勉強や研究を真面目にやっているなら、そういったことを知っている方がおかしい。それなのに人事は『さあ、あなたの出来ることをアピールして下さい』と要求する。できるできないは別として、学生の良さを発掘するのは人事の方の仕事じゃないのか?

これは本当に同意します。自分の何をアピールしていいかは、面談やイベント参加を5, 6回こなして漸く把握できた感じがありますが、逆に最初の5, 6回は「一体何をどのレベルで求められているのか」「何をアピールして欲しいのか」といった部分が全く分かりませんでした。

後から「それ評価されるの!?先に言って欲しかった……」みたいなことに結構なっていたので、引き出すようなことは言って欲しかったなと感じます。

まあアピール下手の言い訳には全くならないんですが……。

終わりに

とても貴重なお話を沢山聞かせていただくことができ、これからの歩み方をより具体的にできたかなと思います。勿論、お寿司もとてもおいしかったです。

ここからは愚痴ですが……遠いですね、東京。イベント参加後の日帰りができないのもあって、2万円近く掛かりました。首都圏の学生はこういうイベントに簡単に参加できるというのが羨ましくてしょうがありません。

この辺はどうしようもないので、まあ頑張っていきます。

【Android】コードからアクションバーを変更する【Kotlin】

出てきた情報が古かったりしたのでまとめます。

やり方

変数で変更する方法と、supportActionBarを持ってきて変更する方法とが有ります。

ソースコード

アクションバーのタイトルを「あああ」に、背景(色)をリソースのcolor内colorAccent変更します。

title = "あああ"
supportActionBar!!.setBackgroundDrawable(ColorDrawable(ContextCompat.getColor(this, R.color.colorAccent)))

参考ページ

qiita.com
stackoverflow.com