OmniAICreator/Qiita-1.07M huggingface dataset:
PC-88 z80asmでVBLANK

直接テキストVRAMをクリアして書き込むより、仮想テキストVRAMに書き込んでからVBLANKで一気に転送する方がいいかもしれない。

```vblank.asm
; z88dk / PC-88 mon
; z80asm -b -l vblank.asm

tvram   equ     $f3c8

        org     $b000
start:
        call    crtset
.loop
        ld      e, a
        call    vblank
        ld      a, e
        call    cls
        inc     a
        jr      loop

crtset:
        ld      hl, $e6b4
        ld      (hl), $f8       ; アトリビュート
        inc     hl
        inc     hl
        inc     hl
        inc     hl
        ld      (hl), $00       ; ファンクション・キー表示スイッチ
        inc     hl
        ld      (hl), $ff       ; カラー／白黒スイッチ
        ld      b, 80
        ld      c, 25
        call    $6f6b           ; CRTSET
        ret

vblank:
        in      a, ($40)
        and     $20
        jr      nz, vblank
.wait
        in      a, ($40)
        and     $20
        jr      z, wait
        ret

cls:
        ld      hl, tvram
        ld      de, 40
        ld      c, 25
.clsy
        ld      b, 80
.clsx
        ld      (hl), a
        inc     hl
        djnz    clsx
        add     hl, de
        dec     c
        jr      nz, clsy
        ret
```

![vblank.png](https://qiita-image-store.s3.amazonaws.com/0/257554/1a54733b-f9a9-1aa6-24ab-9b6e24b7229a.png)
Goの値型と参照型

Goの値型と参照型。
Array,Structは値型。
Slice,Mapは参照型。

# Source
```golang
package main

import "fmt"

type Strct struct {
	a, b int
}

func aryFunc(aryVar [3]int) {
	aryVar[0] = 9
}

func sliceFunc(sliceVar []int) {
	sliceVar[0] = 9
}

func mapFunc(mapVar map[string]int) {
	mapVar["a"] = 9
}

func strctFunc(strctVar Strct) {
	strctVar.a = 9
}

func main() {
	fmt.Print("Array:\t値型\t")
	aryVar := [3]int{0, 1, 2}
	aryFunc(aryVar)
	fmt.Println(aryVar) // [0 1 2]

	fmt.Print("Slice:\t参照型\t")
	sliceVar := []int{0, 1, 2}
	sliceFunc(sliceVar)
	fmt.Println(sliceVar) // [9 1 2]

	fmt.Print("Map:\t参照型\t")
	mapVar := map[string]int{"a": 0, "b": 1, "c": 2}
	mapFunc(mapVar)
	fmt.Println(mapVar) // map[a:9 b:1 c:2]

	fmt.Print("Struct:\t値型\t")
	strctVar := Strct{a: 0, b: 1}
	strctFunc(strctVar)
	fmt.Println(strctVar) // {0 1}
}
```

# Output
```
Array:  値型    [0 1 2]
Slice:  参照型  [9 1 2]
Map:    参照型  map[a:9 b:1 c:2]
Struct: 値型    {0 1}
```
HtmlCompatを使ってみる


HTMLタグでTextViewを装飾できる`Html.fromHtml`がdeprecatedとなり、
androidxから`HtmlCompat`というクラスが追加されたようだ

さっそく使ってみる

## 準備

app/build.gradleに`androidx.appcompat`を追加

```diff:app/build.gradle
dependencies {
+   implementation 'androidx.appcompat:appcompat:1.0.0-beta01'
```

## 実装

公式ドキュメントでHtmlCompatを見るとPublic methods
`fromHtml(String source, int flags)`
とある。

flagsにはとりあえず`FROM_HTML_MODE_COMPACT`を使ってみる。
「ブロックレベルの要素を改行（改行文字）で区切る」らしい

```kotlin
val html = """
    <html>
        <p>こんにちは、本日は<font color="#ff0000">晴天</font>なり
        <p>これが<u>アンダーライン</u>だ</p>
        <b><font color='red'>台風が</font><b/> 日本に <b><font color='red'>やってきた</font></b>
    </html>
""".trimIndent()

// HtmlCompatの出番!!!
text_view.text = HtmlCompat.fromHtml(html, FROM_HTML_MODE_COMPACT)
```

![2018-08-08-18-55-29.png](https://qiita-image-store.s3.amazonaws.com/0/52227/b122bfaa-61df-d6cc-f25b-129cf7186206.png "2018-08-08-18-55-29.png")

できた、簡単だね

以上、現場からお伝えしました。

## リンク

[HtmlCompat | Android Developers](https://developer.android.com/reference/androidx/core/text/HtmlCompat)
Hive で「グループごとに1件だけ取得」する

Hive で「グループごとに1件だけ取得」をやろうとしたときに、今まで `ROW_NUMBER` を使ってやっていたが、Hivemall の `EACH_TOP_K` を使うという方法もあると知ったのでメモ。

参考： [Top N 件をとる効率的なHive / Prestoクエリ](https://qiita.com/toru-takahashi/items/b748a381d8d046450028)

今回は Treasure Data のサンプルデータセットにある NASDAQ の株価テーブルを使って「各銘柄の最新の株価を取得したい」とする。

## ROW_NUMBER
普通に `ROW_NUMBER` を使って書くとこう。

``` sql
SELECT time, symbol, volume
FROM (
  SELECT
    time, symbol, volume,
    ROW_NUMBER() OVER (PARTITION BY symbol ORDER BY time DESC) AS rank
  FROM sample_datasets.nasdaq
) AS t
WHERE rank = 1
```

## EACH_TOP_K
Hivemall の [EACH_TOP_K 関数](https://hivemall.incubator.apache.org/userguide/misc/topk.html) を使うと、このように書ける。

``` sql
SELECT EACH_TOP_K(
  1,                -- 上位 1 件のみを取得
  symbol,           -- symbol (銘柄) ごとに取得
  time,             -- time が大きい順に
  symbol, volume    -- 追加で出力するカラム
) AS (rank, time, symbol, volume)
FROM (
  SELECT time, symbol, volume
  FROM sample_datasets.nasdaq
  CLUSTER BY symbol  -- EACH_TOP_K に渡す前に CLUSTER BY でまとめておく必要がある
) AS t
```

## パフォーマンス比較
``` :ROW_NUMBER
Stage-Stage-1: Map: 1  Reduce: 1   Cumulative CPU: 115.69 sec
Total MapReduce CPU Time Spent: 1 minutes 55 seconds 690 msec

MapReduce time taken: 124.516 seconds
```

``` :EACH_TOP_K
Stage-Stage-1: Map: 1  Reduce: 1   Cumulative CPU: 76.0 sec
Total MapReduce CPU Time Spent: 1 minutes 16 seconds 0 msec

MapReduce time taken: 85.171 seconds
```

`EACH_TOP_K` の方が約 1.46 倍速い。

NASDAQ のサンプルデータは約880万行だったが、約2億行ある別のデータで同様に比較した場合は `EACH_TOP_K` の方が約 1.1 倍速いという結果になった。

データによってはそれほど差が大きわけではないが、Hivemall が使える場合は `EACH_TOP_K` を検討してみるのもいいかもしれない。

## [追記] EACH_TOP_K でパフォーマンスが良くなるケース
<blockquote class="twitter-tweet" data-conversation="none" data-lang="en"><p lang="ja" dir="ltr">row_numberの場合は関係ない要素全部にも数字を振る必要がありますが、row_numberの場合は必要な分を振ったらそのあとは処理をしなくてよいので、グループ内の要素数の差が大きいほどパフォーマンスに差が出るかなと思います。</p>&mdash; torut (@nora96o) <a href="https://twitter.com/nora96o/status/1027188628412227585?ref_src=twsrc%5Etfw">August 8, 2018</a></blockquote>

<blockquote class="twitter-tweet" data-conversation="none" data-lang="en"><p lang="ja" dir="ltr">どちらもrow_numberになってました。後者がeach_top_kです。</p>&mdash; torut (@nora96o) <a href="https://twitter.com/nora96o/status/1027188758947348482?ref_src=twsrc%5Etfw">August 8, 2018</a></blockquote>
uninitialized constantのエラーをどう解決すべきか

#uninitialized constantとは
uninitialized constantは「定義したクラスを読むことができない」ことを言っている

具体例
NameError in HogeController#index
uninitialized constant HogeController::OutTable

#原因
クラスの読み込みが上手くいっていない。

rubyファイルを実行した時にrails sした直後は実行時点でクラスを読み込んでいないので、app/models/user.rbファイルを探しにいく。
app/models/user.rbというファイルがあれば、ファイルをオープンしてクラスを読み込む
しかし、app/models/user.rbというファイルがない、ファイルの中にUserというクラスが定義されていない場合、uninitializedエラーが起きる

#解決策
1. ファイル名とファイルパス、ファイル中のクラス名を確認する
2. それでも解決しない場合は、config/initializersディレクトリを利用して、アプリケーション初期化時に読み込めるように定義する

config/initializers/requirements.rb

```
require Rails.root.join(“app/models/user.rb”)
```
大いに参考にした文献
https://techacademy.jp/magazine/17957
https://www.sejuku.net/blog/21170
Macで日本語を含む大量のShift_JISファイルの文字列置換をする

Macで日本語を含む大量のShift_JISファイルの文字列置換をするというシチュエーションで、色々やった結果Antスクリプトだうまく言ったので、xmlを残しておきます。

```xml:build.xml
<project name="SJIS replace" default="rep">
	<property name="source.dir" location="/foo/targer-dir" />
	<target name="rep">
		<replace dir="${source.dir}" encoding="Shift_JIS">
			<include name="**/*.*" />
			<replacetoken>変更前文字列</replacetoken>
			<replacevalue>変更後文字列</replacevalue>
		</replace>
	</target>
</project>
```
Rollbarにsourcemapを送信する

はじめに
---
エラー監視にRollbar使ってます。
今回、Rollbarにsourcemapを送信するために、gemをインストールしたりヘルパーを作ったりしたのでそのメモです :pencil: 

gemのインストール
---
`sprockets_uglifier_with_source_maps`を利用します。

```rb:Gemfile
gem 'sprockets_uglifier_with_source_maps'
```

compressorに指定します。

```rb:config/environments/production.rb
SotoasobiRails::Application.configure do
  ...
  config.assets.js_compressor = :uglifier_with_source_maps
  ...
end
```

javascriptの設定
---
[docs/source-maps.md at master · rollbar/docs](https://github.com/rollbar/docs/blob/master/guides/source-maps.md#enabling-source-map-translation-in-rollbar)
docにしたがってscriptを作成していきます。
が、code versionにgitのコミットハッシュを使いたかったので、ヘルパーを作りました。

capistrano3でデプロイしているプロジェクトだったので、currentディレクトリにあるREVISIONファイルを利用します。

```rb:app/helpers/application_helper.rb

def git_commit_hash
  `cat REVISION `.chomp
end
```

最終的に以下のようになりました。

```rb
var _rollbarConfig = {
  accessToken: "xxxxxxxxxxxxxxxxxxxxxxx",
  captureUncaught: true,
  captureUnhandledRejections: true,
  payload: {
    environment: "production",
    client: {
      javascript: {
        code_version: "<%= git_commit_hash %>",
        guess_uncaught_frames: true
      }
    }
  }
};
```

あとはこいつをデプロイして、Rollbarが自動的にsourcemapを見つけてくれるのを待つだけ :hugging: 

以上です。

参考
---
- [Rollbar](https://rollbar.com)
- [Source Maps](https://docs.rollbar.com/docs/source-maps/)
- [docs/source-maps.md at master · rollbar/docs](https://github.com/rollbar/docs/blob/master/guides/source-maps.md#providing-source-maps-to-rollbar)
- [AlexanderPavlenko/sprockets_uglifier_with_source_maps: Create javascript source maps for your Rails applications](https://github.com/AlexanderPavlenko/sprockets_uglifier_with_source_maps)
【N予備校】Basic認証によりログイン、ログアウト

自分的メモ要素が強いです。

## Basic認証とは？
HTTPのプロトコルで定義されている。
ヘッダの値に、エンコードされたIDとパスワードを含めて通信することで認証する方式。
しかし、暗号化されないBase64という方式でエンコードを行うために、HTTPSのように暗号化されていないただのHTTPで使用すると盗聴や改ざんされる恐れがある。
Basic認証以外の認証方法でメジャーな方法としては、Cookieというヘッダを利用した認証や、OAuth認証と呼ばれる方式がある。

## Bacic認証を実装
まずはBasic 認証をするためのライブラリをインストール

```
npm install http-auth@3.2.3 --save
```

index.js

```
const http = require('http');
const pug = require('pug');
const auth = require('http-auth');
const basic = auth.basic(
  { realm: 'Enter username and password.' },
  (username, password, callback) => {
  callback(username === 'guest' && password === 'xaXZJQmE');
  });
const server = http.createServer(basic, (req, res) => {
console.info('Requested by ' + req.connection.remoteAddress);
res.writeHead(200, {
```

## 解説
```
const auth = require('http-auth');
```
上記のコードはBasic認証をするためのモジュールを読み込んでいるコード。

```
const basic = auth.basic(
 { realm: 'Enter username and password.' },
 (username, password, callback) => {
  callback(username === 'guest' && password === 'xaXZJQmE');
});
```
上記はBasic認証の設定を行うコード。
basic関数にはオブジェクトと無名関数を渡している。
オブジェクトのrealmプロパティには、Basic認証時に保護する領域を規定する文字列となる。
無名関数では指定された呼び出し方でユーザー名とパスワードを設定。

```
const server = http.createServer(basic, (req, res) => {
```
http.createServerの第一引数にbasicオブジェクトを渡してBasic認証に対応させてserverのオブジェクトを作成している。

## ログアウトを実装
Basic認証では、特定のURLにアクセスした際に、ステータスコード「401 - Unauthorized」を返すことによってログアウトされる。
**index.js**

```
console.info('Requested by ' + req.connection.remoteAddress);
	if (req.url === '/logout') {
		res.writeHead(401, {
		    'Content-Type': 'text/plain; charset=utf-8'
	});
	res.end('ログアウトしました');
	return;
}
```
**解説**
パスが/logoutであるときに、ステータスコード「401 - Unauthorized」を返す処理。
メッセージ「ログアウトしました」をコンテンツとして書き出して、``` res.end ```でレスポンスを終了している。また、return文でこの関数の実行を終えている。

**所感**
N予備校のカリキュラム的にはこの後からCookieの実装やデータベースとの連携に入ってくる。
Webサービスを作る際に最低限必要なサーバーサイドの知識は学べそう。
GCSからファイルをローカルに落としたい

社内のユーザからWPのデータをGoogleCloudStorageから落としたい！とのことで。
ついでにやり方を書く
##この記事の前提
・GoogleCloudSDKを入れていること（gsutilコマンド使えること）
→セットアップも終わってること。

```io:GCSバージョン
Google Cloud SDK 211.0.0
bq 2.0.34
core 2018.08.03
gsutil 4.33
```
・MacOS　(10.13.6)であること。

##手順
① *gcloud config list*でまずは目的のGCSのあるプロジェクトかチェック。

```
hogehogenoMacBook-Air:~ hoge$ gcloud config list

[compute]
region = asia-northeast1
zone = asia-northeast1-b
[core]
account = hogehoge@gmail.com
disable_usage_reporting = True
project = hogeproject

Your active configuration is: [default]
```

② *gsutil ls* でバケットを確認する

```
hogehogenoMacBook-Air:~ hoge$ gsutil ls
gs://hoge-bucket1/
gs://hoge-bucket2/
```

③　*gsutil ls gs:/*　でほしいフォルダを選択する（必須ではない）

```
hogehogenoMacBook-Air:~ hoge$ gsutil ls gs://hoge-bucket1/
gs://hoge-bucket1/aquarium_db.sql.gz
gs://hoge-bucket1/dev_aquarium_db.sql.gz
gs://hoge-bucket1/wpdata/
```

④　*gsutil -m cp -r gcsの場所 ローカル先*　でマルチで特定の場所に落とす

```
gsutil -m cp -r gs://hoge-bucket1/wpdata/ ./
```

##感想　
とりあえず、-mで、同時並行して一気に落としてくれる。とてもありがたい。。。
あと、アップデートも *-m* 使えるので、ぜひ活用を。

#### お礼
@khsk　GCSの綴直しました。ご指摘ありがとうございます。
react-native-modalboxで<ScrollView>のスクロールが効かないとき

## `<Modal>`のoptionを確認してください
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103475/737f13f2-8463-a94c-4e9c-8e63060b044b.png)
> https://github.com/maxs15/react-native-modalbox/issues/38#issuecomment-181842648

`swipeToClose`が`true`になっている場合(デフォルトはtrue)
下から上にスワイプする動作=onCloseになっているのでスクロールされません。

`swipeToClose={false}`にすると、動作します。

```jsx:ex
// GOOD
  <Modal
    isOpen={IsOpen}
    swipeToClose={false}
  >
    <ScrollView>
    ...
    </ScrollView>

// BAD
  <Modal
    isOpen={IsOpen}
    // none or
    swipeToClose // =>true
  >
    <ScrollView>
    ...
    </ScrollView>
```
Pythonで世界地図-26(各国の県境・市町村境を表示)

####各国の国境線・県境・市町村境のダウンロード
https://gadm.org/download_country_v3.html
Country　を選択する。
Shapefile　をクリックする。

BaseMapの場合

```python:
#!/usr/bin/python3
# coding: UTF-8

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

font = {'family':'IPAGothic'} #日本語Fontを指定

#fname = 'gadm36_JPN_shp/gadm36_JPN_0' #国境線のみ
fname1 = 'gadm36_JPN_shp/gadm36_JPN_1' #県境
fname2 = 'gadm36_JPN_shp/gadm36_JPN_2' #市町村境

lon1 = 137.50 #japanの場合
lat1 = 34.5
lon2 = 12.5
lat2 = 12.5

map = Basemap(llcrnrlon=lon1-lon2,llcrnrlat=lat1-lat2,urcrnrlon=lon1+lon2,urcrnrlat=lat1+lat2,resolution='h',projection='cyl', area_thresh = 100.0)

map.drawcoastlines() #海岸線が重複する。他国の国境線・海岸線が必要な時は先頭の#を削除する。resolution='h'にする。（非常に時間がかかる）

#map.drawcountries() #国境線
#map.drawmapboundary(fill_color='aqua')
map.fillcontinents(color='cyan')

map.readshapefile(fname2, 'prefectural_bound2', color='gray', linewidth=.5) #市町村境
map.readshapefile(fname1, 'prefectural_bound1', color='black', linewidth=.8) #県境

plt.title('日本', **font,fontsize=15)

plt.show()
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/238800/e901ac80-e2cb-1db3-d061-dbb1dd2c8cbb.png)


cartopyの場合

```python:
#!/usr/bin/python3
# coding: UTF-8

import cartopy.crs as ccrs
import cartopy.io.shapereader as shpreader
import matplotlib.pyplot as plt

font = {'family':'IPAGothic'} #日本語Fontを指定

#fname = 'gadm36_JPN_shp/gadm36_JPN_0.shp' #国境線のみ
fname1 = 'gadm36_JPN_shp/gadm36_JPN_1.shp' #県境
fname2 = 'gadm36_JPN_shp/gadm36_JPN_2.shp' #市町村境

adm1_shapes = list(shpreader.Reader(fname1).geometries())
adm2_shapes = list(shpreader.Reader(fname2).geometries())

ax = plt.axes(projection=ccrs.PlateCarree())

plt.title('日本', **font)
#ax.coastlines(resolution='10m') #海岸線が重複する。他国の海岸線が必要な時は先頭の#を削除する。

ax.add_geometries(adm2_shapes, ccrs.PlateCarree(),
                  edgecolor='gray', facecolor='cyan',  alpha=0.5) #市町村境
ax.add_geometries(adm1_shapes, ccrs.PlateCarree(),
                  edgecolor='black',alpha=0.5) #県境

ax.set_extent([125, 150, 22, 47], ccrs.PlateCarree()) #[lon1,lon2,lat1,lat2] #japanの場合

plt.show()

```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/238800/cf87a00e-49b6-994d-f94f-108f230e79fb.png)
いろいろな構文

# switch文
- 「もしaaaの場合、bbbをする。またはcccの場合、dddをする。または…」

```php
switch($num){
 case 1:
   echo '1です';
   break;
 case 2:
   echo '2です';
   break;
}
```

- 書き方

```php
switch(判定に使いたい値や変数){
 case 値:
   実行したい命令
   break;
 case 値:
   実行したい命令
   break;
}
```

# if文
- 「もしaaaの場合、bbbをする。」

```php
if($num==3){
  echo $num;
}
```
- 「もしaaaの場合、bbbをする。そうでない場合、cccをする。」

```php
if($num==3){
  echo $num;
}else{
  echo '変数$numは3でない';
}
```

- 「もしaaaの場合、bbbをする。そうでなく、もしcccの場合、dddをする。」

```php
if($num==3){
  echo $num;
}elseif($num==5){
  echo '変数$numは5です';
}
```

# while文

- 「aaの間、bbをする。」

```php
$i=0;
while($i<1000){
 echo $i;
 $i++;
}
```
- 書き方

```php
while(条件式){
 条件にあっている場合に実行したい命令
}
```

# for文

- 「aaの間、bbをする。」

```php
for($i=1;$i<1000;$i++){
 echo $i;
}
```
`$i=1` 変数$iを作って1を代入する。最初のみ1回だけ実行される。
`$i<1000` ループごとの最初に変数$iを比較。1000未満かどうか。
`$i++` ループごとの最後に変数$iをインクリメントする。
VSCodeVim：コマンド繰り返しのキーバインディング設定

VSCodeVimプラグインのキーバインド設定にコマンドの繰り返しを定義する方法をまとめました。

画面単位のスクロール（`<C-u>` `<C-d> ` `<C-b>` `<C-f>`）があまり合わないため、Vimでは `J` で10行上に移動するようなキーバインドを設定している。

```text
noremap <S-j> 10j
noremap <S-k> 10k
noremap <S-h> 10h
noremap <S-l> 10l
```

この設定をVisual Studio Codeに入れるにはユーザー設定に下記のように記載する。

```json
{
    "vim.normalModeKeyBindings": [
        {
            "before": ["H"],
            "after": ["1", "0", "h"]
        },
        {
            "before": ["J"],
            "after": ["1", "0", "j"]
        },
        {
            "before": ["K"],
            "after": ["1", "0", "k"]
        },
        {
            "before": ["L"],
            "after": ["1", "0", "l"]
        }
    ]
}
```

ポイントは、コマンドの繰り返しの指定は `["10h"]` でも `["10", "h"]` でもなく、`["1", "0", "h"]` と指定する必要があること。
配列を作ってみる

今回はRubyの配列について書いていこうと思います。

#配列を作る
配列を作る上で、配列の値がわかっている場合は

```.rb
fruits = ["ブドウ", "ミカン", "リンゴ"]
```
のような形で配列を宣言することができます。
これを出力すると

```.rb
p fruits
#=>["ブドウ", "ミカン", "リンゴ"]
```

という風になります。
また、中に値の入力されていない空の配列を宣言する場合には

```.rb
arr = Array.new
```

```.rb
arr = []
```
というように宣言ができます。

#配列の要素
配列の要素を指定して出力する場合、配列名の後に要素の番号を付けることで出力できます。
例えば最初に作ったfruits配列の場合

```.rb
puts fruits[0]
#=>ブドウ
puts fruits[1]
#=>ミカン
puts fruits[2]
#=>リンゴ
```
という風に表示されます

ここで、配列は要素を0から数え上げます

配列の要素を書き換える場合は
 
```.rb
fruits[1] = "メロン"
puts fruits[1] #=>メロン
```
となります

また、配列の要素数を確認する場合は`length`もしくは`size`メソッドを使用します

```.rb
puts fruits.length
#=>3
```

#二次元配列を考える
一つの要素の中にもう一つ要素が入っている場合を考えます
例えば

```.rb
fruits = fruits = [["ブドウ","300円"], ["ミカン","100円"], ["リンゴ","200円"]]
```
このような配列があったとき
`p`での出力の結果はそれぞれ以下のようになります。

```rb
p fruits
#=>[["ブドウ","300円"], ["ミカン","100円"], ["リンゴ","200円"]]

p fruits[0]
#=>["ブドウ","300円"]

p fruits[0][1]
#=>"300円"
``` 
ここで、`fruits[0][1]`の値を400円に変更するとき

```rb
fruits[0][1] = "400円"
```

という風に要素を指定して変更します
また、二次元配列の要素数を数えた結果はそれぞれ

```rb
puts fruits.length
#=>3
puts fruits[0].length
#=>2
```
となります
どこjavaについて

#どこjavaとは
どこjavaとはパソコンやスマートフォンでのブラウザだけでjavaの開発と実行が行えるクラウドサービスである。

自宅にPCがない方やjavaプログラミングを行いたいが環境構築ができない、又は環境構築が面倒という方におすすめである。

#どこjavaの使い方
中山清喬、国本大悟著のスッキリわかるJava入門に記載されているURL からどこjavaのページに移行する

[どこjava](http://dokojava.jp/pc/index.html)

ページに移行したらコードを打ってコンパイル、実行を行う。
コンパイル、及び実行の際以下の画像のような認証が出るので入力する


![Screenshot_2018-08-08-17-19-44.png](https://qiita-image-store.s3.amazonaws.com/0/279352/9ba745f6-8030-b3c0-b889-5cc1c675860b.png)

今回は一番基礎となるHello Worldを表示するプログラムを実行した
以下にサンプルコードを記載する

``` java:HelloWorld.java
public class HelloWorld｛
　　　　public static void main(String args[])｛
    　　　　System.out.println ("Hello World");
　　　　｝
｝
```

実行結果は画面下側に表示される。

![Screenshot_2018-08-08-17-19-35.png](https://qiita-image-store.s3.amazonaws.com/0/279352/274a9af0-e045-dbd6-20b8-7f63010c2645.png)
 
#まとめ
今回私本人がPCを持っていない状況で課題としてプログラムを作らなくてはいけなかったので実際に使用したが基礎的なプログラムを書くには申し分ないスペックであった。
しかし、コンパイル、実行の再に画像認証が行われることと、コードを書くにはある程度の画面の大きさがないと少し見えにくいこと、コードを打つ際、スマートフォンでの入力はキーボード打っている時と多少変わってしまうので多少の打ちにくさがある。


#参考文献
スッキリわかるJava入門
(インプレス社　中山清喬　国本大悟　著)
CGO の書き方、コンパイル時に必要な環境変数、指定できるオプション、ライブラリの使い方など

C++ で書かれたライブラリを Go から使うために CGO を使ったときの知見をちょろちょろまとめます。

C も Go も初心者の域を脱していないので、単に C の文法の問題だったりすることがあるかもしれません

# CGO コードの書き方関連
## `import C` の前には空行を入れない
Go の中に C のコードを書くことができるが、そのときに必要な注意。

https://golang.org/cmd/cgo/#hdr-Using_cgo_with_the_go_command にも書いてある

```golang
// #include <stdio.h>
// #include <errno.h>
import "C"
```

のように、空行は入れずに書く

## C / C++ のコンパイラに渡すオプション(flag)を記述する `CFLAGS`

`import C` の上に CFLAGS を書く。

```golang
// #cgo CFLAGS: -I/usr/local/lib
import C
```

# CGO build 関連
## ビルドするには `CGO_ENABLED`

`go run` で動かしていたコードも、 `go build` でバイナリを作るときには `CGO_ENABLED` という環境変数に1を入れないといけない。

これを怠ると、「同じパッケージの別ファイルに書いた関数や定数が読めない」という問題が出て、マジで意味がわからなくなる。

## コンパイラの指定 `CC`

環境変数 CC に、コンパイルに必要な gcc 的なものを指定する。

C++ のコードをコンパイルして参照したいからといって `CC` に `g++` 系を指定すると、

```
# runtime/cgo
gcc_libinit.c: In function 'int _cgo_try_pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)':
gcc_libinit.c:110:21: error: invalid conversion from 'void*' to 'timespec*' [-fpermissive]
   nanosleep(&ts, nil);
                     ^
```
こういう問題に出くわす。これを読んで解決した。 https://github.com/bazelbuild/rules_go/issues/1320

CXX を使えばいいかとかそういうことはちょっと調べきれていない。
変数・型・配列・連想配列

# 変数の書き方
- 文字列の先頭に$をつけて宣言

```php
<?php
 $str = 'xoxo';
?>
```

- 変数の名前には英字と数字、アンダーバーが使える(大文字と小文字は区別される)

```php
<?php
 $str_str = 'xoxo';
?>
```

- 変数の名前の先頭に数字は使えない

# 型とは
変数には型があって、型によって中に何を入れられるかが決まっています。

|型名       |入れられるもの        |
|-----------------|------------------|
| 整数型(integer)             |1,3,-10,1000など小数点を持たない整数 |
| 浮動小数点型(float,double)       |1.2,3.4,0.33,23.1,-1.5など小数点のついた数値|
| 文字列型(string)             |あいうえお、xoxo、1234などの文字列 |
| 論理型(boolean)              |true,falseの2つ。大文字小文字の区別なし|
| オブジェクト型(object)             |オブジェクトのインスタンス|
| 配列型(array)          |array関数によって指定された配列 |
| NULL型(null)|nullというもの。大文字小文字の区別なし|

# PHPの変数は特殊
変数を宣言するときに型を指定する必要がなく、変数内に入れたものによって自動的に判断して方を決めてくれる。（動的型付け言語って呼ばれてます）

# 配列とは？
配列は変数(箱)を横になれべてひとかたまりとしてみたもの。

## 配列の書き方
- 配列の名前は変数と同じルール。array()の中にカマで区切って値を入れていく。

```php
<?php
 $array = array(12,'xoxo',2.5,FALSE);
?>
//最初に入れる値が決まってなければ $array = #array(); でもOK
```
- 配列に値を入れるには[]、または[1]のように番号指定。先頭の番号は0なので注意。

```php
<?php
 $array = array(); 
 $array[] = 'あいうえお'; //配列の最後尾に追加。今回は配列に何も入ってないから$array[0]に追加された。
 $array[2] = 234; //$array[2]に数値の234が追加された。
?>
```
- 配列の中身を取り出すには[]の中に番号を指定。

```php
<?php
 $array = array();
 $array[] = 'あいう';
 echo $array[0]; //「あいう」と表示。
?>
```
#連想配列とは
配列と同じだが、キー名をつけられる。

- 連想配列の名前は変数と同じルール。array()の中にカマで区切って「キー名 => 値」のペアで入れる。

```php
<?php
 $array = array('スイカ' => '甘い', 'ドリアン' => '臭い');
?>
```

- 連想配列に値を入れるには[]の中にキー名を指定。

```php
<?php
 $array = array();
 $array['スイカ'] = '甘い'; //指定したキー名がまだないから、新しく連想配列に追加された。
 $array['スイカ'] = '苦い'; //$array['スイカ']の値が「苦い」に書き換えられた。
?>
```

- 配列の中身を取り出すには、[]の中のキー名あるいは番号を指定する。

```php
<?php
 $array = array();
  $array['スイカ'] = '甘い';
  echo $array[0];
  echo $array['スイカ'];
  //どちらも結果は同じく「甘い」と表示される。
?>
```

>[ウェブカツ！！](https://webukatu.com/?afid=p5lxu1kvh03rayd2ctjsw4e9bgzq8nom)
Thymeleaf使用時にcssが適用されない問題

SpringBootでの開発で、cssファイルが適用されなかったときの備忘録。

#原因
原因は大体この二つのどちらかです。

## 1.普通にcssの構文が間違っている
- `;`が足りない
- `{}`が閉じてない
- `.class{...}`のドット忘れ
- `#id{...}`のシャープ忘れ


## 2.パスが間違えている
SpringBootでは、cssファイルは、`resouses/static/css/`の中に入れなくてはいけません。

###　だめ
```
src/main/
┣ java
┗ resouses
    ┗ templates
        ┣ index.html
        ┗ css
           ┗ style.css
```

###　おっけー
```
src/main/
┣ java
┗ resouses
    ┣ static
    ┃   ┗ css
    ┃　　　　　　　　　　　　┗ style.css
    ┗ templates
        ┗ index.html
```
Exact Types を & で結合する方法

# 環境
flow-bin: 0.78.0

# Issues

https://github.com/facebook/flow/issues/4946
https://github.com/facebook/flow/issues/2626

# 結論

Exact Types `{||}` を object type spread `{...}` を使って通常のタイプに戻し, そうでないタイプと Intersection Types `&` で結合する

つまり、こう

```code.js
type A = { a: number };
type B = {| b: string |};
const intersection: A & { ...B } = {
  a: 1,
  b: 'hoge'
};
```

この方法でいくつでも連結させられる

# 追記

## 2018/08/08

上記の方法で別のエラーに遭遇した
> ./src/components/Contents.jsx: Cannot read property 'forEach' of undefined

.babelrc から `babel-plugin-flow-react-proptypes` を取り除くとエラーが出ないことから、原因はそのプラグインにあると予想される。よって自分で PropTypes を書いている人は問題ない

どうやらこの方法は **libdef (flow-typed 等) から import した type には使えない** らしい
https://github.com/brigand/babel-plugin-flow-react-proptypes/issues/106

この babel plugin がソースコードをトランスパイルするタイミングで libdef の型定義にアクセスして等価な PropTypes を生成しなきゃいけないけど、そのためには libdef の .js.flow もパースしないといけないよね、ということみたい

まだ Issue は Open なので、ひとまず対処療法を考えることにする

### 解決策

1. libdef に書いてある type definition をソースコードにコピペする（
1. `'no babel-plugin-flow-react-proptypes';` で自動変換をやめて、そのファイルの prop-types は自分で書く
1. あきらめて `any` にする

対象が少ないなら 1 で良いと思う。しかし、そもそも Flow を使いながら PropTypes も必要なケースは限られる（モジュールとして公開しつつ、Flow のない環境でも利用される場合）ので、 **本当にそのプラグインが必要なのか考えた方がいい**

追記ここまで

- - -

# ダメな例

## 素直に `A & B` すると？

```code.js
type A = { a: number };
type B = {| b: string |};
const intersection: A & B = {
  a: 1,
  b: 'hoge'
};
```

3行目で Flow エラー（一部抜粋）
> [flow] Cannot assign object literal to `intersection` because property `a` is missing in `B` [1] but exists in object literal [2]. (References: [1] [2])


### なんでダメなの？

- `B` は Exact Types なので、`b` 以外のプロパティを **持っていてはならない**
- `A` は `a` というプロパティを持っている
- `A & B` は「`b` しか持っていないが、 `a` も持っているタイプ」という矛盾を孕んでいる
	- **タイプを作った時点ではエラーにならない**
	- そのタイプで作られた変数は、何を代入してもエラーになる

このことは[ドキュメント](Intersections of exact object types may not work as you expect. If you need to combine exact object types, use object type spread:)にも明記されている

>Intersections of exact object types may not work as you expect. If you need to combine exact object types, use object type spread:

しかしドキュメントで紹介されているのは **Exact Types 同士の結合** だけで、そうでないものが混ざったケースについては（多分）載っていない


## `{ ...A, ...B }` すると？

上記のドキュメント通りにやってみる

```code.js
type A = { a: number };
type B = {| b: string |};
const intersection: { ...A, ...B } = {
  a: 1,
  b: 'hoge'
};
```

エラーは起きない
しかし、 `intersection.a` のタイプは `void | number` になる

つまり、 `a` が含まれていなくてもエラーが起こらない

```code.js
type A = { a: number };
type B = {| b: string |};
const intersection: { ...A, ...B } = {
  b: 'hoge'
};
```

`a` を `number` として扱いたい場合は `if (intersection.a) { ... }` と書く必要がある
これは大変面倒

### なんでダメなの？

本来の object type spread は、コピー可能なプロパティだけを shallow copy するもの。それに倣って、Flow は、プロパティが存在するとしてもコピー可能かどうかは分からないから、全てのプロパティを[Optional object propertyies](https://flow.org/en/docs/types/primitives/#toc-optional-object-properties) `?` という扱いにするのだろう（多分）

そういう仕様としか言えない


# 所感

`react-router-dom` の `ContextRouter` を `Props` に結合するときに使った。 `ContextRouter` は Exact Types なので、そのまま結合するとエラーが起きてしまう

しかし、そもそも HOC の injection props を Exact Types にする意味って何かあるのだろうか。非常に使いづらいのだが。たぶん .d.ts から flow-typed を作った人がそうしたんだろうけど

`$Exact<T>` の逆の操作は `{ ...T }` って覚えておけばいいと思う
SSRじゃなくても大丈夫！AngularでつくったWebサイトをGoogleに読み込ませる方法

## GoogleはJavaScriptを読むことはできるが。
Googleの進化は早いもので、「JavaScriptフレームワークは検索に弱い」と言われたのは今は昔。JavaScriptをちゃんと読み込み、レンダリング後をインデックスしますので、今では検索結果に表示するためだけに`ServerSideRendering`や`pre-rendering`をする必要はなくなりました。

ただ、その一方で、Googleのクローラーで採用されているJavaScriptのバージョンは低いです。ES5を使ってる模様。ES6以降を使って書いているJavaScriptコードは、Googleのクローラーは認識しない可能性があります。

## AngularはES5への互換をデフォルトでは外している
AngularにはES5互換のためにスターターテンプレートに`src/polyfills.ts`が内包されています。これを使うと、ES5との互換がサポートされます。しかしいつからかすっかり失念したのですが（最初からだったかも）、ほとんどの互換をコメントアウトされています。

「ほとんどのブラウザはES6をサポートしてるんだから、わざわざ後方互換のためのpolyfillsをimportしてしまうとバンドルサイズが大きくなる」というのはわかるのですが、大変なことにこのことにより、GoogleのクローラーはAngularのプロジェクトを読み込むことができません。

GoogleのクローラーがどのようにあなたのWebサイトを表示しているか確認する「Fetch as Google」というツールが公開されているのですが、初期の何も設定しないままWebにあげた場合、Googleのクローラーは以下のように認識します。

<img width="1009" alt="スクリーンショット 2018-08-08 17.31.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/100460/9b8eea3b-15f4-751d-0338-9941c7c5faf1.png">

真っ白が表示されていますよね。つまりは、Webサイトのコンテンツを読み込めていないということです（おそらくJavaScriptエラーで処理が中断してる）。
もちろん、Webアプリケーションなどで「別に読み込ませる必要ないし」というシチュエーションは多いとは思うのですが、普通にWebサイトをPWAでつくって公開することなどあると思いますので、Googleのクローラーに認識させる方法を紹介しておきます。

`src/polyfills.ts`の31行目のコメントアウトを解除してください。

```src/polyfills.ts
- //import 'core-js/es6/array';
+ import 'core-js/es6/array';
```

これだけで、Googleのクローラーはあなたのサイトを認識できるようになります。

<img width="982" alt="スクリーンショット 2018-08-08 17.36.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/100460/46080bab-70ba-6c23-ca90-1c1375b019e0.png">

Ionic v4 + Angularで[弊社Webサイト](https://www.rdlabo.jp/)をリニューアルした時に気づきまして、時間が経ってしまっていたので念のため、本日（2018年8月8日）に再度検証を行いましたが、しっかりと表示されていました。

「Googleのクローラーに認識させるためには、polyfillsの一部を有効化させる」。

何かの機会でお役に立てましたら幸いです。
RailsでCSVをDBに登録する

#### CSVをDBにimportする
gemのactiverecord-importを入れて、モデルのApplicationRecord.rbで下記を書く

```ruby

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
  require 'csv'

  def self.simple_import(path: '', col_sep: ',')
    a = []
    CSV.foreach(path, headers: true, col_sep: col_sep) do |r|
      a << new(get_import_params(r))
    end
    import a # activerecord-importのメソッドです。
  end

  private

  def self.get_import_params(row)
    headers = row.headers & column_names # 存在するカラム名のみに限定する
    headers.each_with_object({}) do |c, h|
      h[c.to_sym] = row.field(c)
    end
  end
end
```
あとは
simple_importを呼び出して終わり
例：dbディレクトリの下層にファイルを保存した場合

```terminal
> モデル名.simple_import(path: 'db/ファイル名.csv', col_sep: ',')
```

参照記事：https://qiita.com/junara/items/183aaff5e5b77ec1c679
RubyからS3を利用する

#やりたいこと
- S3にHTMLの文字列をファイルとしてアップロードしたい
- S3に存在するHTMLファイルをダウンロードしたい
- ファイルにタグ付けしたい

----

#やってみる
S3を扱う際、というかAWS-SDKにはResourceとClientが存在する
今回はResourceを利用する

----

## 環境
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]
aws-sdk (3.0.1)

----

## 初期設定
アクセスキーやデフォルトリージョンの設定のためにAWS CLIをインストールして
```aws configure```を行っておく

----

## Resource作成

```ruby
require 'aws-sdk'
s3 = Aws::S3::Resource.new
```
----

## bucket作成

```ruby
# bucket_name = 'test_bucket20180808'
# _はバケット名に使用できない
bucket_name = 'test-bucket20180808'
bucket = s3.bucket(bucket_name)
# バケット名は全世界で一意でなければならないので存在した場合作成できない
bucket.exists? # => false
bucket.create
bucket.exists? # => true
```
----

## オブジェクトのアップロード

----

### テキストをオブジェクトとしてアップロードする場合
```ruby
file_name = "#{Time.now.strftime("%Y%m%d")}.html"
s3_path = "site_a"
key = "#{s3_path}/#{file_name}"
obj = bucket.object(key)
# bodyには任意の文字列を渡せる
obj.put(body: 'hogehoge')
# 存在確認
obj.exists? # => true 
bucket.objects(prefix: 'site_a/').each{|obj| p key}
# => "site_a/20180808.html"
```
----

### ファイルをアップロードする場合
```ruby
file_name = "hoge_file"
s3_path = "site_b"
key = "#{s3_path}/#{file_name}"
obj = bucket.object(key)
obj.upload_file('log/test.log')  # => ホーム指定ができない？  
# 存在確認
obj.exists? # => true 
bucket.objects(prefix: "site").each {|obj| p obj.key}
"site_a/20180808.html"
"site_b/hoge_file"
```

----
## オブジェクトのダウンロード
----
### 文字列として読み込む
```ruby
key = "site_a/20180808.html"
obj = bucket.object(key)
obj.get.body.read
```
----
###　ファイルとして保存する場合
```ruby
key = "site_a/20180808.html"
obj = bucket.object(key)
file_name = "hogehoge"
obj.download_file(file_name)
```
----

基本的にはgetやputではなく
upload_file,download_fileを利用した方が良い

後者はサイズが大きい時に
自動的にマルチアップロード、ダウンロードを行ってくれるため

----
## オブジェクトにタグ付け
----
```ruby
tags = {env: "dev", name: "hoge"}.to_query
# to_queryはRails依存だったかも？
# URLエンコードする必要がある
key = "tagtest"
obj = bucket.object(key)
obj.put(body: 'hogehoge', tagging: tags)
# upload_fileの際も同じオプションでおｋ
```

**タグ付けしたはいいものの、タグで指定してgetができませんでした**
あったら教えてください

----
## 階層内で最新を取る
```ruby
# s3://test-bucketxxxx/site_a/以下の最新のオブジェクトがほしい、そんな時
bucket.objects(prefix: "site_a").sort_by{|obj| obj.last_modified}.reverse[0]
```

----
# あとがき
やろうとしてることがS3でやることではない気がします
最新や、更新対象にタグ付けして管理するつもりだったのですが・・・
git rebase -i pick, squashの備忘録

## 概要
git rebase -iでコミットまとめる時に毎回ググってたのでメモ

## 手順
git logを確認する

```
$ git log --oneline
```

コミットログを指定してまとめたい場合は、まとめたいコミットログの`1つ手前のcommit`まで指定する

例: 1-3までをまとめたい場合は、4のコミットログを指定する

```
1: xxxddd
2: yyyddd
3: zzzddd
4: aaaddd
```

こんな感じ

```
$ git rebase -i aaaddd
```


pick (残す)
squash (潰す)
KaggleのCompetitions Categoriesを整理してみた

# Competitions Categoriesとは？

そのCompetitionsがどんな立ち位置にあるか分類しているもの（という解釈）。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/76913/ad1a09c9-8f0e-1622-44a7-4d490b503092.png)


## 経緯
Kaggle初心者なんで、
「まずはどこから手を付けよう… Getting startedあるやん！ でも他にもあるし、違いはなんや…？？」ってのが思いつき。

## ソース
KaggleのCompetitionsの種類は、公式Wikiに書いてあった。
https://www.kaggle.com/docs/competitions#common-competition-types

この人が教えてくれた。
https://www.kaggle.com/getting-started/6479


# Categoriesの概要

サイト上の絞り込みでは、6つ。

## 主要なCategories

### 1. Featured

* どうやら数が多いらしい、主要どころ。
* 立ち位置は、「困難で一般的に商業目的の予測問題を提起する本格的な機械学習課題」
* 賞金あり。
* 初心者でも参加可能。

### 2. Research

* Featuredと並んで一般的
* 立ち位置は、「特集された競技問題よりも実験的な問題」
* 賞金とかポイントはない。（実験的性質のため）
* `しかし、クリーンで簡単な解決策を持たず、競争の激しい環境下で特定のドメインやエリアに不可欠な問題に取り組む機会を提供します。` だそう。（よくわからんかった）

### 3. Getting Started

* 簡単で親近感がある。
* 半永久的にやってる。（常に参加できる）
* **初心者がまずやるべき。チュートリアル。**
* 賞金、ポイントはなし。
* ２ヶ月ごとのランキング。投稿して２ヶ月間有効。

### 4. Playground

* 競技の一歩前くらいの楽しさにフォーカスを当てたもの。
* 立ち位置は、「比較的単純な機械学習タスクを提供する競技」
* まだ初心者だが、新しい問題を解きたい人が対象。Getting Started終わったらココに来る感じ。
* ちょっとだが賞金もある。

### 5. Recruitment

* 採用に繋がるもの。
* 立ち位置は、「企業が企画した課題の機械学習モデルを構築するために競争」
* 参加後、参加者はそのホスト企業に履歴書を送ることができる。
* 賞品が、企業の面接に値する。
* Walmart, Airbnbがやってる。

### 6. Masters / Limited Participation

* プライベート及び招待のみのもの
* Mastersは、Kaggle Masters、Grandmastersなどの選ばれし者のみが参加できる。

### 7. Annual

* 年２回の競技大会

## 補足

* Wikiには、MastersはLimited Participationの項で説明されていた。

* `Kaggle Prospect` ってのもあるらしいが、今は見当たらない。
* ここのCategoriesも随時変わっているのかもしれない。


# あとがき

ちなみに翻訳は偉大なるGoogle翻訳任せです。
Reading余裕だぜだと、自分で見に行ったほうが早いかもw
Pythonの正規表現で重複したマッチのやり方（先読みアサーション）

# はじめに
Pythonのreモジュールにおける公式ドキュメントを読んでもしっくり来なかったので、具体的な使い方を含めてまとめてみます。
正規表現の先読みアサーション（Lookahead Assertion), 後読みアサーション(Lookbehind Assertion)についての情報です。
バージョンはPython 3.7.0で確認。

# 先読みアサーションって何？
正規表現において**(?=...)**で記述出来る、検索条件には含めるけどマッチ対象には含めない記法のこと。
混乱を招きやすい以下2つの表現について説明します。

* (?=...)　先読みアサーション(Lookahead Assersion)
* (?<=...)　後読みアサーション(Lookbehind Assertion)

# どんな時に使うの？
具体的には空白文字で挟まれた&&をandに置き換える場合を考えてみます。（ && ) => ( and )
re.subを使って全体を対象として置換したいような場合です。

以下の通り重複が発生しないような場合は単純な正規表現で対応可能です。
空白に挟まれた&&をマッチ対象として、単純に空白で挟んだandで置換しています。

```python3:&&をandに置き換えたい
pattern = r'\s&&\s'
string = 'foo && bar && buz'
re.sub(pattern, ' and ', string)

>>> 'foo and bar and buz'
```

しかし重複がある場合は意図通りには動作しません。
下の例では二番目の空白文字（&&　&&の間）が重複した状態(overlapped)になっています。

```python3:上手くいかない
pattern = r'\s&&\s'
string_overlapped = 'foo && && bar'
re.sub(pattern, ' and ', string_overlapped)

>>>  'foo and && bar'
```
1番目の&&の後ろの空白文字が最初のマッチで消費されてしまって、2番目の&&の前には空白文字が存在しないことになってしまっているために1箇所しか置換されません。
Pythonの標準モジュールであるreの正規表現ではマッチしている部分が重複しないように取り出す(non-overlapping)であるため、このような挙動になります。

そこで先読みアサーションの出番です。

# どうやるか
```python3:先読みアサーションを使う
pattern_ex = r'(?<=\s)&&(?=\s)'
string_overlapped = 'foo && && bar'
re.sub(pattern_ex, 'and', string_overlapped)

>>>  'foo and and bar'
```

空白文字（\s）は判定条件として機能していますが、マッチ対象に含まれません。
そのため置き換え対象の文字列も'and'となり空白文字を取り除いています。
先の例とは異なって空白を除いた&&のみがマッチ対象となっているので、それがandに置き換わっています。
もう少し詳しく先読みアサーションと後読みアサーションについて説明します。

## 先読みアサーション (?=...)
マッチ対象（この場合は&&)の後ろに続く部分文字列...(この場合は\s)を指定できます。
ポイントとなるのはこの丸括弧で括った部分文字列は判定条件にのみ使われ、マッチ対象には含まれないことです。
この記法には先読みアサーションという名前がついています。
検索対象となっている条件部分を消費せず宣言しているだけなのでアサーション、実際のマッチ対象は前方にあることから先読み(Lookahead)という分類のようです。

## 後読みアサーション (?<=...)
同じ意味合いで、マッチ対象の前に置かれる部分文字列...（この場合は\s）を指定できます。
丸括弧で括った部分がマッチ対象に含まれない点が同じです。
実際のマッチ対象は後ろに置かれているため後読み(Loobehind)アサーションです。
2つ合わせてLookaround Assertionと呼びます。


# 他の方法(regexモジュール)
標準モジュールでは無いのですが、regexモジュールにはoverlappedについてのオプションが一部あります。
regex.finditer, regex.findallにはoverlappedオプションがあるのでこれをTrueにすることで重複ありで検索できます。
ただregex.subにはこのオプションはありません。


# 最後に
Pythonでコードを書いていた時にhelp(re.sub)で調べると「...non-overlapping occurrences of the pattern...」とあるけど、overlappingさせたい場合はどうすればいいんだと混乱してました。
先読みアサーションが使いこなせれば色々と便利です。
正規表現に関してはPythonと関係なくドキュメントは沢山あるのですがピンポイントの情報をまとめてみました
Raspberry Pi への Tensorflow と Keras のインストールコマンド

(本記事は2018/8/8に作成しました。）
とりあえず、Kerasで作ったモデルをRaspberryPiですぐに使いたい、という方むけに最低限必要なインストールコマンドを列挙しています。

## 0. Raspberry piを最新にアップデート

Raspberry Piに何らかをインストールする前には、必ずRaspberryPiの状態を最新にアップデートしておく必要があります。以下の2つのコマンドを入力すれば良いです。

```pi@raspberrypi.local
$ sudo apt-get update
$ sudo apt-get upgrade
```

Pythonを動かすために最低限インストールしておくべきモジュールがあります。

```pi@raspberrypi.local
$ sudo apt-get install git gcc make openssl python3-dev
$ sudo apt-get install libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
$ sudo apt-get install tk-dev python-tk libfreetype6-dev 
$ sudo apt-get install pkg-config libjpeg8-dev libpng12-dev
$ sudo apt-get install python3-numpy python3-scipy python3-matplotlib python3-h5py
```


## 1. TensorFlowのインストール

TensorFlowのインストールはpipで行います。

```pi@raspberrypi.local
$ pip3 install tensorflow
```
ダウンロードが完了したら、問題なく起動できるかどうか確認しておきましょう。


```pi@raspberrypi.local
$ python3
>>>import tensorflow as tf
>>>tf.__version__
```
'1.9.0'と、バージョンが表示されれば、うまくインストールできています。


## 2. Kerasのインストール

Kerasのインストールもpipから可能です。

```pi@raspberrypi.local
pip3 install keras
```
こちらも、ダウンロードが完了したら、問題なく起動できるかどうか確認しておきましょう。


```pi@raspberrypi.local
$ python3
>>>import keras
>>>keras.__version__
```
'2.2.2'と、バージョンが表示されれば、うまくインストールできています。
翻訳 Vuex のテスト

翻訳しました。プルリク中です。

https://lmiller1990.github.io/vue-testing-handbook/testing-vuex.html

## Vuex のテスト

これ以降しばらくは、Vuex のテストについて解説していきます。

The next few guides discuss testing Vuex.

## Vuex のテストにおける二つの側面

一般的にいってコンポーネントは Vuex と以下の方法でやりとりをしています。

Generally components will interact with Vuex by

1. mutation へ commit する
2. action を dispatching する
3. `$store.state` もしくは getters 用いて state にアクセスする

1. committing a mutation
2. dispatching an action
3. acesss the state via `$store.state` or getters

コンポーネントについてのテストを書く場合には、コンポーネントが Vuex store の現在の state に基づいて正しく動作していてることを assert すればいいわけです。ですから mutation や action や getter がどのように実装されているかを知る必要はありません。(訳注: コンポーネントのテストを書く際に、mutation 等々のテストを含める必要はないということ。)

These tests are to assert that the component behaves correctly based on the current state of the Vuex store. They do not need to know about the implmentation of the mutators, actions or getters.

それにたいして、store が遂行するロジック、例えば mutation や getter に関しては、それ自体を単独でテストをすることができます。なぜなら Vuex の store は通常の JavaScript の関数によって構成されているからで、それゆえユニットテスをするのも簡単です。

Any logic performed by the store, such as mutations and getters, can be tested in isolation. Since Vuex stores are comprised of regular JavaScript functions, they are easily unit tested.

まずは Vuex 単独のテストについて説明していきます。後半では、Vuex store を使ったコンポーネントのテスト技法を取り上げます。

The next guide introduces some techniques to test components that use a Vuex store, and ensure they behave correctly based on the store's state. Later guides discuss testing Vuex in isolation.
2 つの配列を結合して、片方の要素に基づいてソートしたい

ほぼ個人用メモですが…

# やりたいこと

NumPy でこれを

```py
[2, 1, 3]
[18, 54, 43]
```

こうして

```py
[[2, 18],
 [1, 54],
 [3, 43]]
```

こうしたい

```py
[[1, 54],
 [2, 18],
 [3, 43]]
```

# 方法

```py
>>> import numpy as np
>>> array_1 = np.asarray([2, 1, 3])
>>> array_2 = np.asarray([18, 54, 43])
>>> array_3 = np.column_stack((array_1, array_2))
>>> array_3
array([[ 2, 18],
       [ 1, 54],
       [ 3, 43]])
>>> array_4 = array_3[array_3[:, 0].argsort(), :]
>>> array_3[:, 0].argsort()
array([1, 0, 2])
>>> array_4
array([[ 1, 54],
       [ 2, 18],
       [ 3, 43]])
```

# 参考

* [numpy.column_stack](https://docs.scipy.org/doc/numpy/reference/generated/numpy.column_stack.html)
* [numpy.argsort](https://docs.scipy.org/doc/numpy/reference/generated/numpy.argsort.html)
RSpec の describe で定数を定義するとトップレベルに定義される

```ruby
describe 'parent' do
  describe 'child A' do
    SOME_CONST = 1
    it { expect(SOME_CONST).to eq 1 }
  end
  describe 'child B' do
    SOME_CONST = 2
    it { expect(SOME_CONST).to eq 2 } # => fail
    it { expect(SOME_CONST).to eq 1 }
    it { expect(::SOME_CONST).to eq SOME_CONST }
  end
end
```

`describe` の中身は単なるブロックなので `module` とか `class` みたいに名前空間がなく、トップレベル定数になる。当たり前なんだけど、DSLだとRubyを書いてる意識が希薄でうっかりやってしまうかもしれない。

[定数 - Ruby 2.5.0 リファレンスマニュアル ](https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html#const)
シェルスクリプトで正規表現を使い、ファイルから文字列を抽出


下記のファイルを読み込んで、[]で囲まれた部分が"DATA"+数字４桁の時に
[]で囲まれた"DATA"+数字４桁をシェルスクリプトで出力したい。
具体的には、five [DATA1001]の行があったら、DATA1001と抽出します。

pythonなどで書いてしまえば簡単だと思うのですが、
myokoymさんの「シェルスクリプトで部分文字列を切り出す方法」を読んで
http://d.hatena.ne.jp/myokoym/20110408/1302292907
cutやsedではできていたのですが、BASH_REMATCHという配列が使えると知ったのでやってみました。


```text:入力データ

$ cat data.txt 
one 
two
three
four 
five [DATA1001] 
 six 
 seven
 eight 　
 nine 
ten [DATA1002]
```

```bash:script

#!/bin/bash
TARGET_FILE="data.txt"
while read LINE
do
    if [[ $LINE =~ ^.*\[(DATA[0-9]{4})\].*$ ]]
    then
        echo "${BASH_REMATCH[1]}"
    fi
done < $TARGET_FILE
```


```text:結果
./test.sh 
DATA1001
DATA1002
```

メモ：
 DATA[0-9]{4}:			　 DATAに続く数字4桁　　
 (DATA[0-9]{4}):			　 正規表現に最初にマッチした部分をBASH_REMATCH[1]に入れるためにカッコで囲む
 if [[ $LINE =~ 正規表現 ]]: 正規表現に一致したらtrue
 \\[(DATA[0-9]{4})\\]:		   正規表現に[ ]を書く時エスケープ文字をつける
【JavaScript】どんな時にJSを使うか

今までRubyとPHPをやってきて、JSは苦手だったのですが、なんとなくわかってきました。

#JSをどんな時に使うか

##デザインに動きをつけたい時
これは定番の使い方です。
フロントエンジニアのほとんどがこの使い方じゃないでしょうか。
jQueryなのかもしれませんが。

##画面遷移したくない時
サーバサイドよりの使い方です。
ボタンを押すたびに画面が一度切り替わってトップに戻ると使いづらいです。
ボタンを押しても画面がそのままで値だけ変わるような作りにしたいときに使います。

##個別データを渡したい時

**確認モーダルから削除を行う方法**
https://qiita.com/KendyNakamura/items/36b2fd617d49d491c626

一覧画面からモーダル確認をつけて削除をしたい時などに使用します。

##クラスを付け替え

クリックしたら違うアイコンを出したい時に使います。
addClassとremoveClassを組み合わせて、
`<input class="text">`
`<input class="hidden">`
みたいにしておいて、クラスを入れ替えることで表示の切り替えができます。

もっといろんなことができると思いますが、今の所使えそうなのはこんなところです。
Microsoft Teams と Yammer の使い方の違いに思いを馳せる

Office 365 の話をしていると出てくる話題として「Microsoft Teams と Yammer は何が違うの？どうやって使い分けてるの？」といったものがあります。それぞれを実際に使い始めると異なる目的のために作られたサービスだと実感するわけですが、どちらも同じような「チャットツール」じゃんと思われるようです。

ではどこが違うのか？日頃の経験から違いを考えていきたいと思います。

#Yammer

Yammer は企業内ソーシャルネットワークサービスに分類されるサービスです。ソーシャルネットワークサービスの特徴は何でしょうか？チャットが出来ることでしょうか？

ソーシャルネットワークサービスの肝となる部分は、ネットワークが作成されることにあると思います。人、投稿、コミュニティなどがノードとなり、関連や興味を基にしたリンクで繋がっていくというところです。そうして形成されたネットワークを伝わって「情報が広がっていく」または「関心の高い情報が集まってくる」というのが SNS の良さです。

さて、Yammer の機能を思い浮かべていきましょう。Yammer には投稿や返信、いいね!の他、人やタグのフォローや、グループの作成やグループへの参加、さらには、関連するグループといった機能があります。たしかに投稿や返信の機能だけを見ると Microsoft Teams でも出来ることかもしれませんが、そのほかの機能はどうでしょうか？特に、フォローの機能をちゃんと使い、ネットワークを構成できるかという点が Yammer を活用する上では重要になります。

そしてネットワークを最大限活用するためには、多くの情報が他のユーザーに対してオープンであることが必要になります。Yammer では、グループの作成時に組織内に対して「パブリック」または「プライベート」いずれかを設定することができます。プライベートなグループとは、つまりは、グループのメンバーでのみ情報を共有しているグループということになります。

Yammer の失敗例としては、こうしたメンバー内にクローズした、プライベートなグループが非常に多くなってしまっているというものがあります。こうした使い方では、ネットワークの良さを享受できないため、SNS っぽいチャットツールで、なんでこんなもの仕事で使わなきゃならないんだ？という結末になりがちです。そして、なぜか多くの方がプライベートなグループを作りたがります。放っておくとプライベートなグループが増えていきます。意識的にパブリックなグループを増やす施策が必要です。

というわけで、Yammer を活用する場合のポイントは次の通りです。

* ユーザーやタグのフォロー機能を使う
* パブリックなグループを意識的に増やす

#Microsoft Teams

Microsoft Teams はビジネスチャットツールなどに分類されるサービスです。ビジネスチャットツールの特徴はなんでしょうか？それはチャットができることです。

多くの場合、チャットはメールなどの他の連絡手段よりも手軽だと言われています。私たちの日常生活でも、Facebook Messenger や LINE などコミュニケーションがチャットに置き換わってきました。こうしたツールを利用されたことがある方であれば、その手軽さを実感しているかと思います。

さて、Microsoft Teams の機能を思い浮かべていくと、こちらは Yammer のようにフォローなどといった機能はありません。チャットや Web 会議、そして、タブを利用した他のサービスとの統合などといった機能が用意されています。これらによって実現されるのは「チーム内の状況の可視化」「チーム内のコミュニケーションの迅速化」あたりかと思います。

Microsoft Teams が Yammer と最も異なる点は、クローズされた、つまり、プライベートなグループでもその効果が発揮できるということです。いや、むしろ、Web 会議を使ったり、タブで Planner のタスク共有をしたり、必要なドキュメントをタブに固定したりなど…、プライベートだからこそ効果的に利用できる機能が多く用意されています。まさに、チームにフォーカスして作られているのが Microsoft Teams というわけです。

そして多くの場合、プライベートでも効果が発揮できる Microsoft Teams は、ユーザーの意識に合っています。なぜか多くの方がプライベートなグループを作りたがります。そのため Yammer とは違いここが問題になることはありません。Microsoft Teams の活用のポイントは、いかにユーザーが必要なツールをタブなどで組み合わせて利用できるか、そして、それを実現するためのユーザー教育です。

Microsoft Teams の失敗例としては、ほとんどチャットしか利用していないというものがあります。正直なところチャットだけを見ると、他にも良いツールがいっぱいありますし、それこそ使い慣れた LINE の方が良いというユーザーが多いかもしれません。Microsoft Teams の活用を進めるには、タブの活用が大きなポイントになると考えています。多様なクラウドサービスやファイルなどの情報に Microsoft Teams の画面から一元的にアクセスができる状態にならなくては良さが発揮されません。そのためにも「Excel」「Word」「PowerPoint」「OneNote」「Web サイト」「Wiki」「Planner」などの代表的なタブの活用方法はユーザーに教えてあげると良いかと思います。

というわけで、Microsoft Teams を活用する場合のポイントは次の通りです。

* タブの機能を使う
* 良く利用されるタブの機能はしっかり使い方を教えてあげる

#というわけで…
というわけでして、大雑把に言うと「Yammer は組織内での情報共有や収集」「Microsoft Teams はチーム内のコミュニケーション」みたいな使い分けになるわけです。こんなことを話すと、多くの方が「じゃあ Microsoft Teams を使ってみようかな」となります。

**「なぜか多くの方がプライベートなグループを作りたがります。」**

意識や文化を変えるのは難しいということです。
【Laravel】確認モーダルから削除を行う方法

#モーダルとは

モーダルは、ボタンを押したときに一度確認するウインドウのことです。
ダイアログも同じ意味のようですが、若干違いがあるようです。

#モーダルとダイアログの違い

ダイアログは警告や確認のメッセージウインドウのこと。
モーダルはダイアログの一種だけれども、そのウインドウを処理しないと先に進めないもの。

つまりダイアログのモーダルではないものは警告だけで、OKを押せばページが切り替わるけど、キャンセルを押しても問題ないようなメッセージが想定できる。

#一覧画面の削除方法
なぜ、一覧画面からの削除をわざわざ書いているかというと、一覧画面のモーダルに削除対象の情報を送るのに一手間必要だから。
例えば、投稿一覧画面にPostが並んでいるとする。
そのPostに削除ボタンをつければそのまま削除できるのだが、
一度モーダルを表示させると、モーダルはどのPostから来た情報なのかがわからないみたい。

これが編集画面だと、URLにIDあるしすでに変数にPostが渡されているから理解してくれる。

##どうやって理解させようか
これなんだが、一度JSで取得してからモーダルに渡すことで解消する。

```post.index1.blade.php
<button type="button" data-toggle="modal" data-target="#modal_delete" data-title="{{ $post->id }}" data-url="post/index">削除</button>
```

```post.index2.blade.php
  <div class="modal" tabindex="-1" role="dialog" id="modal_delete">
    <form role="form" class="form-inline" method="POST" action="">
      {{ csrf_field() }}
      <div class="modal-dialog" role="document">
        <div class="modal-content">
          <div class="modal-body">
            <p></p>
          </div>
          <div class="modal-footer">
            <button type="button" class="btn btn-default" data-dismiss="modal">キャンセル</button>
            <button type="submit" class="btn btn-danger">削除</button>
          </div>
        </div>
      </div>
    </form>
  </div>
```

```post.index3.blade.php
  <script>
    $('#modal_delete').on('shown.bs.modal', function (event) {
      var button = $(event.relatedTarget);
      var title = button.data('title');
      var url = button.data('url');
      var modal = $(this);
      modal.find('.modal-body p').eq(0).text(title);
      modal.find('form').attr('action',url);
    });
  </script>
```

全て1つのファイルへ書き込んでいるとします。

post.index1.blade.phpでボタンをクリックして、#modal-deleteを探します。
post.index3.blade.phpでJS用のデータに変換します。
post.index2.blade.phpでモーダルを表示し、必要なデータを取り込みます。

という流れです。
これで一覧画面でも個別のデータを受け渡すことが可能です。
tFPDFで日本語フォントを利用する

# はじめに
PHPを利用していてPDF出力を行うとき，FPDF系を使えという指示があったが，ググってもなかなか出てこないのでまとめる。

# tFPDFのダウンロード
[ここ](https://qiita.com/Akira07/items/b73d3a240a398046413f#tfpdfのダウンロード)を参考に

# 問題

ググって見つかる `japanese.php` や `mbfpdf` を使う方法は[FPDF公式サイト](http://www.fpdf.org)見てもらえばわかる通り，リンクが消えている。

正確には，以前は各言語ごとにパッチを配布していたのが，UTF-8対応のtFPDFを配布する形になっている。
しかし，tFPDFにはUTF-8対応フォントの「DejaVu」含まれているが，日本語は入っていない。


# 日本語フォントを準備する
日本語フォントが入ってないのなら，自分で準備すればいい，ということで，自前でフォントを準備する。

Macに入っているフォントは全て，改変・配布をしないのであれば自由に使用していいらしい([参考](https://yaritakunai.hatenablog.com/entry/2017/01/22/201000))ので，ありがたく使うことにする。

例として「ヒラギノ丸ゴ」を使った場合を。

## フォントを書き出し
まずは，FontBookを開き，ヒラギノ丸ゴを「右クリック→Finderで表示」を選び，デスクトップなどにコピペする。

ファイル名に日本語が入っていると後の工程で詰まるため，ディレクトリ名・ファイル名全てアルファベットに書き換えておく。
（ファイル名を「HiraginoMaruGo.ttc」へ変更した)

## フォントファイルの分解
このファイルは `.ttc` ファイルとなっている。
これは `TrueType Fonts Collections` という意味らしく，文字幅(W0とかW1とか)を複数まとめてあるもので，tFPDFは対応していない。

```
ERROR - TrueType Fonts Collections not supported
```

と言われてしまう。

これを分解するために， `fontforge` を使用する。
HomeBrewでインストールできるので，

```zsh
$ brew install fontforge
```

サクッとインストールを行う。

[このスクリプト](https://gist.github.com/fatum12/941a10f31ac1ad48ccbc)を利用して，ttcファイルを変換する。
8行目だけ，書き換える必要があった。

```ttc2ttf.pe
8: Open($1 + "(" + fonts[i] + ")", 1)  →変更→  Open($1, 1)
```

同ファイル2行目にあるように実行する。

```zsh
$ fontforge -script ttc2ttf.pe ./HiraginoMaruGo.ttc
```

すると， `.otf` ファイルが出力される。

（スクリプト内で書かれているが， `$order == 3` の時だけ `.otf` が出力されるようになっているがそれが何なのかはよくわからない）

## otfからttfへ変換

`.otf` ファイルも対応していないため，

```
ERROR - Postscript outlines are not supported
```

と言われてしまう。

次にすることはこれをttfファイルへ変換することだ。

[このスクリプト](https://qiita.com/nkmrtkhd/items/f5d678ef542cce9ffbd3)をそのまま利用させていただく。

これで晴れて `.ttf` ファイルが出力されたので， `tFPDF/font/unifont` の中に配置する。


## 完成

あとは以下のように書けば日本語が出力される。

```php
<?php
require_once('./lib/tfpdf/tfpdf.php'); // 自分の環境に応じて書き換えを

$pdf = new tFPDF();
$pdf->AddPage();

// Add a Unicode font (uses UTF-8)
$pdf->AddFont('YuGothic','','YuGothic-Medium.ttf',true); // ファイル名は適宜書き換えを
$pdf->SetFont('YuGothic','',14);

// Load a UTF-8 string from a file and print it
$txt = '日本語テスト';
$pdf->Write(8,$txt);

$pdf->Output();
```

# おまけ

游ゴシック体を使おうとしたとき，Finderで表示が選択できなかったため，「ファイル→フォントの書き出し...」を選んで任意の場所（デスクトップなど）に出力するといい。
この場合でもディレクトリ名やフォルダ名は全て英数字で。

游ゴシック体の時は書き出した時点で `.otf` ファイルなので otf→ttf変換のスクリプトをかけるだけで済む。
Minio Windows版をサービス登録する

https://github.com/minio/minio-service/tree/master/windows
ここの真似をしてサービスと登録したら、バックエンドで起動はしたものの、アクセスキーとシークレットキーが分からない…

サービスとしてEXEを起動しようとした時に本来なら標準出力に出てくる内容をテキストに出力させるにはどうやればいいの？？？
それかmcコマンドでキーを確認する方法ってあったっけ？
いくらググっても見つからなくてお手上げ。
tFPDFでjapanese.phpを利用する

# はじめに

FPDFで日本語でPDF出力を行おうとして，ググると大体出てくる `japanese.php` を利用する方法。

[FPDF公式ページ](http://www.fpdf.org)に日本語対応パッチへのリンクが消えているため，今それを利用する方法をまとめる。

今までは各言語ごとに対応パッチを配布していたのだが，公式がUTF-8に対応したライブラリtFPDFを配布することになり，各言語へのパッチはリンクが消えている模様。

# tFPDFのダウンロード

まずはtPDFのダウンロードを行う。

[FPDF公式ページ](http://www.fpdf.org)の，

<img width="1377" alt="スクリーンショット 2018-08-08 16.40.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/170435/d1eaa267-d808-337c-0210-80c8ba5abcc7.png">

このリンクを飛んだ先の

<img width="1375" alt="スクリーンショット 2018-08-08 16.44.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/170435/d0a1e91a-bc18-dd69-4452-cbe7c54313f5.png">

一番下のZIPダウンロードから。

ダウンロードしたらディレクトリ名を「tfpdf」へと書き換えて好きな場所へと配置する。
（僕はプロジェクト内に `lib` ディレクトリ作ってその下に置いた）



# 直リンク
フォーラムの中には残ってるらしいので[直接飛ぶ](http://www.fpdf.org/phorum/read.php?f=1&i=7977&t=7977)。

`japanese.zip`  をクリックし，ダウンロードを行う。

中に入っているのは

- japanese.php （本体）
- ex.php （サンプル）

の2つなので `japanese.php` を tFPDFの中に入れる。


# japanese.php の変更

そのままだと，FPDFを利用する形になっているので，tFPDFを利用するように書き換える必要がある。

2行目と15行目の， `fpdf` と `FPDF` を，それぞれ `tfpdf` と `tFPDF` へ書き換える

```diff:japanese.php
- 2: require('fpdf.php');
+ 2: require('tfpdf.php');

- 15: class PDF_Japanese extends FPDF
+ 15: class PDF_Japanese extends tFPDF
```

以上で準備が完了。

# 利用法


`japanese.php` はShift-JISしか対応していない？ため， `mb_convert_encoding` を使ってShift-JISへと変換する必要がある。

```php
<?php
require('./lib/tfpdf/japanese.php'); // ←自分の環境に応じて書き換えを

$pdf = new PDF_Japanese();
$pdf->AddSJISFont();
$pdf->Open();
$pdf->AddPage();
$pdf->SetFont('SJIS','',18);
$pdf->Write(8, mb_convert_encoding('FPDFの日本語対応サンプルです', 'SJIS'));
$pdf->Output();

```
【Java】どこjava利用してみた

スッキリわかるJava入門で紹介されているどこjavaを利用してみた。

![どこjava.png](https://qiita-image-store.s3.amazonaws.com/0/279359/14256028-0373-2ce6-3113-f524949d7ee0.png)

ブラウザによってすぐにコンパイル、実行できるので非常に便利である。
ただ、実行の度に数字を入力しなければならないのが少し面倒なところだろうか…。

今後はこのどこJavaを利用しながら記事を書いてみようと思う。