OmniAICreator/Qiita-1.07M huggingface dataset:
Trelloのすべてのカードの情報をスプレッドシートに出力する(ひとまず版)

#やったこと
プロジェクト管理をtrelloで行い、振り返りを行うこともあるワニね。
trello上で見るのも良いですが、データをスプレッドシートですべてを見たい・・ということもあるでしょうワニ。そんな時の為にGASで作ってみたワニ🐊

#ひとまず版とした所以
・jsonデータの要素をそのままスプレッドシートに履いているので、生データ過ぎる要素がある。
・アーカイブされているものは現在取れません。。なのでタスク終了=アーカイブとしているボードではあまり有効ではないです。

#GAS作成の上で必要なもの
・trelloのAPIキー
　https://trello.com/app-key
・trelloのトークン
　https://trello.com/app-key
　ページ内の"あなたは手動でTokenを作られます"のToken部分のリンクをクリック→認証
・カード一覧を取得したいboardID
　boardIDは実際にボードを開いたアドレスの以下XXXXXXの部分になります。
　https://trello.com/b/XXXXXX/YYYYYY
・出力するGoogleスプレッドシートのID
　スプレッドシートのIDは、実際にスプレッドシートを開いたアドレスの以下ZZZZZZの部分になります。
　https://docs.google.com/spreadsheets/d/ZZZZZZ/edit#gid=0
・出力するGoogleスプレッドシートのシート名

 用意するものが多そうに見えますが、1分以内で集められます。スプレッドシートは新規作成したものでOK。

#ソースコード
これがコードワニ🐊

```GASのソース.
function myFunction() {
  var trelloKey   = "trelloのAPIキー";
  var trelloToken = "trelloのトークン";
  var trelloBoard = "trelloのボードID";
  var sheetId = "スプレッドシートのID";
  var sheetName = "スプレッドシート名";
  var cardItem = ['id',
                  'badges',
                  'checkItemStates',
                  'closed',
                  'dateLastActivity',
                  'desc',
                  'descData',
                  'due',
                  'dueComplete',
                  'email',
                  'idAttachmentCover',
                  'idBoard',
                  'idChecklists',
                  'idLabels',
                  'idList',
                  'idMembers',
                  'idMembersVoted',
                  'idShort',
                  'labels',
                  'manualCoverAttachment',
                  'name',
                  'pos',
                  'shorLink',
                  'shortUrl',
                  'subscribed',
                  'url'
            ];

  //　カード情報をjson形式で取得
  var cardUrl = "https://trello.com/1/boards/"+trelloBoard+"/cards?key="+trelloKey+"&token="+trelloToken+"&fields=id,badges,checkItemStates,closed,dataLastActivity,desc,descData,due,dueComplete,email,idAttachmentCover,idBoard,idChecklists,idLabels,idList,idMembers,idMembersVoted,idShort,labels,manualCoverAttachment,name,pos,shortLink,shortUrl,subscribed,url";
  var cardRes = UrlFetchApp.fetch(cardUrl, {'method':'get'});  
  var cardJson = JSON.parse(cardRes.getContentText()); 

  // シート情報を取得
  var spreadSheet = SpreadsheetApp.openById(sheetId);
  var sheet = spreadSheet.getSheetByName(sheetName);
  spreadSheet.duplicateActiveSheet();

  // 見出し出力
  for(var i = 0; i < cardItem.length; i++)
  {
    sheet.getRange(1,2+i).setValue(cardItem[i]);
  }

　// カード情報取得  
  for(var i = 0; i < cardJson.length; i++)
  {
    var writeRow = 2;
    
    sheet.getRange(2+i,1).setValue((i+1));
    
    for(var j = 0; j < cardItem.length; j++)
    {
      var getElement = cardJson[i][cardItem[j]];
      sheet.getRange(2+i,writeRow).setValue(getElement);
      writeRow++;
    }
  }
  
}

```

#出力結果
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/211061/42c63cae-2087-a133-5492-a0325ec70519.png)

＊IDは伏せていますワニ。
*それ以外の情報もちゃんと取れているワニ。I列以降。

#所感
・カード総数の調べ方がわからず、頓挫しそうになりましたが、json.lengthであっさり解決してしまったワニ🐊
・2018/6/23現在のカード情報になりますワニ。developerページを参照しましたワニ🐊
　https://developers.trello.com/reference/#card-object
Azure Iot Hubチュートリアル


# 公式チュートリアル
基本は↓↓に沿って進めました。
https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-raspberry-pi-kit-python-get-started

# ひっかかったところ
## IoT Hubウィンドウが出てこない
『IoT Hub の作成』の項の『2.[リソースの作成] > [モノのインターネット] > [IoT Hub]』まで進んだが
『3.[IoT Hub] ウィンドウ』が出てこない。
画面下を見ると「有効なサブスクリプションがない」旨のメッセージが表示されていた。
有効なクレジットアカウントがない、というような意味と捉えた。
無料アカウントを作ってチュートリアルに臨む人は問題ないのだろうが、
私は少し前にアカウントを作っていて30日間の無料期間が終了していたので
サブスクリプションが無効になっていたようだ。

## サブスクリプションを有効にする
というわけで↓↓を確認。
https://docs.microsoft.com/ja-jp/azure/billing/billing-upgrade-azure-subscription

「1.」の通り、Azureアカウントセンターにいけばすぐにわかった。
有効にするのも画面に沿って進めていくだけ。
ただ、**サポートプラン切り替えの箇所で有料プランがデフォルト選択になってる**のだけは
マジでやめてほしい。
無料プランは一番下の選択肢です。

## 所持センサーがBME280ではなかった
センサーはDHT11を使用。
ピンは以下の接続。

|DTH11  |ラズパイ  |
|:-:|---|
|GND  |No.6(Ground)  |
|DATA  |No.7(GPIO04)  |
|VCC  |No.1(3.3V)  |

※記事執筆時点ではサンプルアプリケーションは

```
SIMULATED_DATA=True 
```

で動かしたのでこれで合っているのかはまた後日検証する。
ただサンプルはBME280用のプログラムなのでたぶんDTH11では動かないだろう...。
センサーだけ買おうかな。

## サンプル アプリケーション実行時に「**ImportError: No module named iothub_client**」のエラー

```
$ sudo mv /etc/apt/apt.conf.d/10defaultRelease
/etc/apt/apt.conf.d/10defaultRelease.old
$ sudo apt-get upgrade
$ sudo apt-get install build-essential cmake pkg-config
```

途中、libboost1.55-devのパッケージ展開にかなり時間がかかってて、
フリーズか？と思ったけどしばらくして(30分くらい？)再開された。

# まとめ
一番ひっかかったところは、最後の「**ImportError: No module named iothub_client**」のエラー部分だった。
結論としては**cmakeがインストールされていなかった**ことなのだが。
次はIot Hubに送ったデータを可視化するところ。
GCEでVNCを使ってリモートデスクトップ接続しました。

この数日Google cloud platformのGoogle Compute Engineのインスタンスに、Ubuntu17.10をインストールしてXRDPでリモートデスクトップ接続して使いたいソフトをインストールしようと試みていました。
XRDPで接続した内容は、こちらを読んで下さい。
https://qiita.com/masaru21/items/13215be80fcb8e62d82a

今回は、VNCでリモートデスクトトップを試みます。
VNCについては、こちらの記事を読んで下さい。

http://www.obenri.com/_subitem_dir/vnc01.html


XRDPについては、こちらの記事を読んで下さい。
https://ja.m.wikipedia.org/wiki/Xrdp

VNCとXRDPは、プロトコルの、違いです。
RDPリモートデスクトトップは、Windowsに標準でクライアントソフトが入っているので、使われる機会も多いです。

私は、モバイルPCとスマホで、wi-fi環境でVNCとRDPを試しました。
私の体感では、VNCの方が早く快適にデスクトップが使えるように思いました。

今回GCEでVNC接続するために、ネットで色々と調べました。
でも、VNCでは接続できませんでした。

今回Ubuntuのユーザーの権限が、GUIに反映されないことで、XRDPではなくVNCを使ってみたらとアドバイスして頂いた人と出会いました。
この人に、下記の記事を教えて頂きました。
https://medium.com/google-cloud/graphical-user-interface-gui-for-google-compute-engine-instance-78fccda09e5c

この記事を読んで、私が接続できなかった原因が分かりました。
GCEでVNCを使うときは、ファイアウォールの設定が必要だったのです。

この記事の中のGCEのファイアウォールの設定を、補足説明します。
Google cloud platformのメニューの中で、Compute Engineのインスタンス詳細で編集を選択してください。
ページの中程に、ネットワークタグの項目があります。
ここに、vnc-serverを入力します。

次に、Google cloud platformのVPCネットワークを選択してください。
![20180624_095417.png](https://qiita-image-store.s3.amazonaws.com/0/20977/3eb79174-0c1a-e5bf-e088-1bab6540bc6f.png)



次に、ファイアウォールルールを選択してください。
![Screenshot_2018-06-24-09-41-41.png](https://qiita-image-store.s3.amazonaws.com/0/20977/626feb29-e1b4-fc3f-511a-ab69476b14f4.png)

次に、画面上部のファイアウォールルール作成を選択してください。
![20180624_094328.png](https://qiita-image-store.s3.amazonaws.com/0/20977/cd50b071-d2eb-3e8e-5d59-959d0de8a28e.png)

先にご紹介した英語の記事の設定をもとに、入力してください。
設定例です。
![20180624_100102.png](https://qiita-image-store.s3.amazonaws.com/0/20977/8caefc6f-86fb-d356-f85e-e5d6478248aa.png)
ネットワークタグでファイアウォールのルールが適用されるように設定すると、インスタンスの詳細で設定したネットワークタグと紐付けられます。

#ファイアウォールの設定で接続できました
今回ファイアウォールの設定をすることで、GCEでvnc4serverを使ってリモートデスクトトップ接続に成功しました。

#VNCとXRDPの両方接続
VNCサーバーの設定でファイアウォールルール適用してますが、vnc4serverを起動したままXRDPでの接続も出来ました。
私は、スマホでSSH接続しているので、インスタンスにブラウザでSSH接続したときとユーザー違うのが気になっています。
今回スマホでvnc4serverを起動して、このデスクトップにネットからダウンロードしてインストールしたソフトは、XRDPに別のユーザーでログインすると反映されないです。
同じユーザーで、VNCとXRDPの両方を使うことが出来るのも、便利だと思います。

#参考にした記事
今回先にご紹介した記事の他に、下記の記事も参考にしました。
http://uyama.coffee/wp/ubuntu-17-10でvnc4server入れようとしたら情報が断片的すぎて大/
OpenSSL ソースリーディング その2

[前回](https://qiita.com/mofu/items/b067f77193771c72b334)からの続き。
read_state_machine/write_state_machineを見ます。

## read_state_machine
ネゴシエーションパケットの読み込み側の処理です。
この処理は以下のフローから成ります。

* ヘッダの読み込み
* transition
* ボディの読み込み
* process_message
* post_process_message

post_process_message後に書き込みフェーズに移行する場合はSUB_STATE_FINISHEDを返却します。

transition/process_message/post_process_messageの処理の実体は、クライアント側であればssl/statem/statem_clnt.cに、サーバ側であればssl/statem/statem_srvr.cにあります。

### ヘッダの読み込み
まだレコードヘッダを読み込んでいない場合、read_stateはREAD_STATE_HEADERであり、tls_get_message_header関数でレコードヘッダとハンドシェイクタイプ、長さ、バージョンまでのデータをソケットから読み出します。

### transition
現在の状態と、読み込んだレコードのタイプから、SSL/TLSネゴシエーション状態の遷移を行います。
ネゴシエーション状態は、「ClientHello読み込み」や「ServerHello送信」のことであり、include/openssl/ssl.hのOSSL_HANDSHAKE_STATEのenum型です。

サーバ側のServerHelloDone送信状態(TLS_ST_SW_SRVR_DONE)で、read側のtransitionを行う場合、読み込んだパケットのタイプがClientKeyExchangeであれば、状態をサーバ側でKeyExchangeを受信した状態(TLS_ST_SR_KEY_EXCH)に遷移することになります。

### ボディの読み込み
ヘッダの読み込みが完了した場合、取得したデータの長さ分をtls_get_message_body関数で読み込みます。
ソケットがブロッキングで動作している場合、レコードの読み込みが完了するまで、ヘッダの読み込み処理やボディの読み込み処理から戻りません。

### process_message
ネゴシエーションデータの読み込みを行います。

### post_process_message
ネゴシエーションデータの読み込み後の処理を行います。この処理は不要な場合は行いません。
OpenSSL-1.1.0hのサーバ側では、ClientHello受信時と、ClientKeyExchange受信時しか処理を行いません。

## write_state_machine
ネゴシエーションデータの書き込み(送信)側の処理です。
この処理は以下のフローから成ります。

* transition
* pre_work
* 送信処理
* post_work

### transition
現在の状態から、SSL/TLSネゴシエーション状態の遷移を行います。
ネゴシエーション状態は、読み込み側と共通のOSSL_HANDSHAKE_STATEのenum型です。

サーバ側のServerHello送信状態(TLS_ST_SW_SRVR_HELLO)の場合、ネゴシエーションの状況によって、ChangeCipherSpecを呼び出すか、サーバ証明書の送信に入るかなど、分岐します。

### pre_work
送信前処理です。pre_workに登録した関数自体では、やることはあまりありません。
pre_work後にconstruct_messageで取得できる関数を利用して、ネゴシエーションパケットを構築します。

### 送信処理
statem_do_write関数により、レコードレイヤを構築して、ソケットに送信依頼を行います。

### post_work
送信後処理です。
連続するネゴシエーションパケットがない場合は、ソケットをflushしてデータを送り出します。

## state_machine後の動作
ブロッキングソケットの場合、ネゴシエーションが完了するまでループから抜けません。そのため、SSL_accept関数から戻った場合、ネゴシエーションが完了したか、失敗したかのいずれかになります。

ノンブロッキングソケットで、ソケットの読み込みデータがまだない場合、tls_get_message_header関数やtls_get_message_body関数が0を返却します。その場合はread_state_machine関数でSUB_STATE_ERRORを返却し、state_machine関数のwhileループから抜け、SSL_accept関数から戻ります。
その場合、SSL_get_error関数でSSL_ERROR_WANT_READ/SSL_ERROR_WANT_WRITEを取得できますので、再度SSL_accept関数やSSL_do_handshake関数を呼び出して、ネゴシエーションを再開させます。

# 次回
SSL_read関数を見ていきます。
setInterval 二通りの記述方

###タイマー処理 
#####パターン１
```javascript
var i = 0
function show(){
console.log(i++);
}
setInterval(function(){
   show();
},1000);
```
#####パターン２
```javascript
var count=0;
var countup=function(){
 console.log(count++);
}
 setInterval(countup,1000);
```

setIntervalで指定する関数を、var=関数で設定しているか、直接functionで動作を表しているかの違いと見受けられる。後者の方が記述する際に混乱せずに済むのではないだろうか...
###タイマーストップ
```javascript
var count = 0
var countup=function(){
console.log(count++);
}
var id =setInterval(function(){
countup();
if(count>5){
clearInterval(id);
}},1000);
```
Markdown 書き方の基本をまとめてみた

　　
#Markdownとは?メリットは？

Markdownとは簡単に言うと、デジタル文章の書き方の１つです。メリットとしては、

- 簡単かつ覚えやすい
- 簡単にHTMLに変換が可能
- 対応するツールが多い

などが挙げられます。

#Markdownっていつ使えるの？

Markdownは、ブログや文書を書く際に、非常に簡単に書くことができます。
有名どころでは、

- はてなブログ
	- はてなブログで記事を書くときは
		- 見たままモード
		- はてな記法モード
		- Markdownモード  
		と３つの書き方を選ぶことができ、**Markdown**はその１つである。
　　
　　
- Qiita
	- 私が書いたこのQiitaの記事も、もちろん**Markdown**で書かれています
　　
　　	
- GitHub
	- GitHub内で、各説明がまとめられている`README.md`は**Markdown**を採用
	
このように、Markdownは多くの環境で使われています。簡単で見た目も綺麗なため、非常に使い勝手の良いマークアップ言語と言えます。

#おすすめのMarkdownエディタ

- [Atom](https://atom.io)
	- AtomはGitHubが開発したエディタです。Mac、Windowsなど多くの環境で使用することができるエディタの一つである。様々なプログラム言語に対応しているため、おすすめである。
	
- [Visual Studio Code](https://code.visualstudio.com)
	- Visual Studio CodeはWindowsで有名なMicrosoft製のエディタであり、「Open Preview」を選択することで、プレビューを確認することができます。

- [MacDown](http://macdown.uranusjr.com/)
	- MacDownはOS X用のMarkdownエディタです。自動補完機能やプレビュー表示などが特徴です。

私が使用しているエディタは、３番目に紹介した[MacDown](http://macdown.uranusjr.com/)です。  
理由としては、私自身がMacユーザであるということ。また、多くの機能はいらず、エディタの見た目が変更できるツールであるという点にマッチしたからである。　　

MacDownでは、エディタの見た目はもちろん、文字数の表示、HTMLへの書き出しも行えるため、非常に愛用している。

**あなたのPC環境や欲しいエディタ機能に、マッチしたツールを選択することが一番!!**

#Markdown の書き方 - 基本編 - 

##・見出し
見出しの先頭部分に`#`をつけます。 
`#`が増えることに小さな見出しになります。
 
入力

```
#大きい見出し
##中くらい見出し
###小さい見出し
####さらに小さい見出し

```
結果　
***
#大きい見出し
##中くらいの見出し
###小さい見出し
####さらに小さい見出し
***
　　

##・リスト
リストには**通常のリスト**と**数字付きリスト**の２種類があります。

まず、**数字付きリスト**は、先頭部分に`	1.`とつけると表示できます。  
(数字部分は他の数字でも良いです)

入力

```
1. 数字付きリスト1
1. 数字付きリスト2
1. 数字付きリスト3 
```

結果
***
1. 数字付きリスト1
1. 数字付きリスト2
1. 数字付きリスト3 

***
次に、通常のリストは、先頭部分に`-`,`+`または`*`のどれかをつけると表示できます。
また、リストでは`tabキー`を使うことにより階層化を行うことができます。


入力

```
- 通常リスト
* 通常リスト
+ 通常リスト

- 階層化１
	- 階層化2-1
	- 階層化2-2 
```

結果
***
- 通常リスト
* 通常リスト
+ 通常リスト

- 階層化１
	- 階層化2-1
	- 階層化2-2 
		
***

##・区切り線
区切り線を表示するには、`*`か`-`か`_`のどれかを３つ並べて入力します。

入力

```
***
---
___
```

結果
***
↑のように表示されます。　　

##・強調
文章の一部など、強調したい部分を`**`で囲うと強調された文字になります。

入力

```
**この場所**を強調します。

```

結果　　
***
**この場所**を強調します。

***

##・コードの表示
コードの表示では、バッククォートを使用して表示を行います。  
様々な言語での記述も可能ですが、今回は最もシンプルな部分だけ紹介します。

入力

```　　
    ```
    ここにコードを記入する
    ```
```

結果
***
```
ここにコードを記入する
```
***

コードをインライン表示したい場合は、

入力

```
`バッククォート１つで囲む`
```

結果
***
`バッククォート１つで囲む`
***

##・リンク
外部サイトのリンクを表示したい場合は、

入力　　

```
[リンク名](URL)
例: [マイページ](https://qiita.com/Hase-pro)
```
と書きます。

結果
***
[マイページ](https://qiita.com/Hase-pro)
***

##・画像の表示
画像の表示は、

- `![代替テキスト](画像のURL)`
-  `![代替テキスト](画像のURL "タイトル名")`

によって行えます。  
(Qiitaでの画像表示では、エディタに載せたい画像をドラッグ&ドロップ、または画像挿入ボタンを使うのが容易だと思います。)

#おわりに

今回は私自身もMarkdown記法の練習を兼ねて、Markdownの基礎をまとめてみました。
書いていても思いましたが、Markdownは**書きやすくて、とても可読性が高い**ですね！  
これからもMarkdown愛用していきたいと思っています！！

##参考にさせていただいたサイト
[Markdown記法 チートシート](https://gist.github.com/mignonstyle/083c9e1651d7734f84c99b8cf49d57fa)  
[省エネHTML入力！基本Markdown記法のチートシート](https://nelog.jp/markdown)  
[Markdown書き方メモ](https://qiita.com/Thermidor/items/b684cfabe0f2fde0c67b)  
[Markdown記法一覧](https://qiita.com/oreo/items/82183bfbaac69971917f)  
[Markdown の書き方 - 基本構文](https://webkaru.net/dev/markdown-cheat-sheet/)
rustとscalaとkotilnの勉強 数当てゲーム(scala)

TRPLの数当てゲームをscalaで
一応できた

```scala
import scala.util.Random
import java.security.SecureRandom
import scala.util.control.Breaks
import scala.util.{Try, Success, Failure}
object Main{
	def main(args:Array[String]){
		val secret_number = new Random(new SecureRandom()).nextInt(99)+1
		println(s"秘密の数字は次の通り：$secret_number")
		println("数をあててごらん")
		println("ほら、予想を入力してね")
		
		val wb = new Breaks
		val eb = new Breaks

		wb.breakable{
			while(true){
				import scala.io.StdIn
				val guess = StdIn.readLine()
				println(s"次のように予想しました:$guess")
				eb.breakable{

					Try{guess.toInt} match {
						case Success(n) => {
							n match{
								case n if n == secret_number => println("正解"); wb.break
								case n if n > secret_number => println("おおきすぎる")
								case n if n < secret_number => println("ちいさすぎる")
							}
						}
						case Failure(e) => eb.break
					}
				}
			}
		}
	}
}
```

・・・動きはするけどなんだかな・・・
ネストがすげえな・・・
scalaにはloopのbreak,continueなんて軟弱なものはないのでBreaksで対応。
中身は例外投げてcatchをしているらしい。

Tryは例外が起きたらFailure、成功ならSuccessにしてくれる。
Scalaは基本例外、必要に応じてmonadに変化するっぽい。

イマイチ感が拭えないけどとりあえずはこれでいいや。
デザイン自動化メモ（InDesignのテキストフレームの背景色をグレースケールにする）

DTPのカンプチェック時に一部のオブジェクト以外をグレースケールにする。
検版とか機械学習するデータを作るときに使えないかと試作。
InDesignはオブジェクトごとに、やり方が異なります。
とりあえず、テキストフレームの背景色から。

#特定の条件を満たすテキストフレームの背景色を変更する

ここでは、グレースケールに変換する対象を、スクリプトラベルが空白、カラー指定がスウォッチの場合に限っています。
グレースケールへの変換は、RGB経由で輝度を出しています。
**2018/6/24 輝度からKへの計算でK=100-輝度のところK=輝度と間違えていました。訂正しました。**


```js
function main() {
    
    pageObj = app.activeDocument.pages[0];
    total = pageObj.allPageItems.length;
    
    for (i=0;i<total;i++) {
       var label = "";
       var typeName = "";
       var pageItem;
        
       pageItem = pageObj.allPageItems[i];
        
       var typeName = pageItem.constructor.name;
       label = pageItem.label;
       
       // テキストフレームのときの背景色を変更する。
       if (typeName=="TextFrame") {
 
           // 特定のテキストフレームは処理をしない。ここではスクリプトラベルで判断する。
           if (label=="hoge") {
                           
               continue;
           }

            // 設定されている背景色を取得する。
            var col = pageItem.fillColor;
            var cs = col.space;
            
            // カラーモデルがCMYKなのを確認し、CMYK以外なら処理しない。
            // 実際に使う場合はエラーにします。
            if (cs!=ColorSpace.CMYK) {
                
                continue;
            }
        
            var c = col.colorValue[0];
            var m = col.colorValue[1];
            var y = col.colorValue[2];
            var k = col.colorValue[3];
            
            // InDesignのCMYKは0% - 100%になるので、0-255にスケール変換
            var c255 = c*2.55;
            var m255 = m*2.55;
            var y255 = y*2.55;
            var k255 = k*2.55;
            
            // なんちゃってRGB
            var r = Math.max(0,255- c255 - k255);
            var g = Math.max(0,255- m255 - k255);
            var b = Math.max(0,255- y255 - k255);
            
            // 輝度を出す
            var luminance = Math.round(0.2990 * r  + 0.5870 * g + 0.1140 * b);
            
            // スケールを 0% - 100%に戻す
            var retk = 100 - Math.round(luminance / 2.55);

            alert(retk);
            
            // スォッチを追加
            var sname = "K" + retk;

               for (i=0;i<app.activeDocument.colors.length;i++) {
                    if (app.activeDocument.colors[i].name==sname) {
                        app.activeDocument.colors[i].remove();
                    }
               }

            colorOption = {colorValue:[0,0,0,retk],model:ColorModel.process,space:ColorSpace.cmyk,name:sname}
            colorObj = app.activeDocument.colors.add(colorOption);            
            
            // 背景色を反映
            pageItem.fillColor = colorObj;
       }
    }
 }

main();
```

シアン１００％から変換した結果
![スクリーンショット 2018-06-24 9.36.20.png](https://qiita-image-store.s3.amazonaws.com/0/139650/c7125522-b81d-c394-3d08-ceb92b3e2d2b.png)

![スクリーンショット 2018-06-24 19.30.13.png](https://qiita-image-store.s3.amazonaws.com/0/139650/59be0f6e-9aca-96c8-7d90-75a7ea745ce4.png)

マゼンダ１００％から変換した結果
![スクリーンショット 2018-06-24 9.37.04.png](https://qiita-image-store.s3.amazonaws.com/0/139650/4a242063-3d6b-06b3-3ef7-bba7b925175a.png)

![スクリーンショット 2018-06-24 19.31.38.png](https://qiita-image-store.s3.amazonaws.com/0/139650/9f88da4b-745b-8e75-b46d-f9b939d379a7.png)
HashiCorp Vault のUIを利用する

# はじめに

OSS版VaultでEnterprise向けに提供されていたUIが利用できるようになったらしいので、UIを利用する方法について備忘録として投稿させていただきます。

# 参考

- [vault server \-dev](https://www.hashicorp.com/resources/vault-oss-ui-introduction)
- [UI \- Configuration \- Vault by HashiCorp](https://www.vaultproject.io/docs/configuration/ui/index.html)

# 開発モード

開発モードでは設定不要でUIが利用可能になっており、ブラウザから`http://127.0.0.1:8200/ui`へアクセスすることでUIを利用することができます。

```shell-session
$ vault server -dev
==> Vault server configuration:

             Api Address: http://127.0.0.1:8200
                     Cgo: disabled
         Cluster Address: https://127.0.0.1:8201
              Listener 1: tcp (addr: "127.0.0.1:8200", cluster address: "127.0.0.1:8201", tls: "disabled")
               Log Level: info
                   Mlock: supported: false, enabled: false
                 Storage: inmem
                 Version: Vault v0.10.3
             Version Sha: c69ae68faf2bf7fc1d78e3ec62655696a07454c7
```

![スクリーンショット 2018-06-24 8.46.28.png](https://qiita-image-store.s3.amazonaws.com/0/141934/ebacdfc5-cb2e-9a30-0da5-c7515776393d.png)


# サーバモード

サーバモードでは明示的にuiを有効にする必要があります。
↓の`ui = true`がUIを有効化している箇所になります。

```text:example.hcl
storage "file" {
  path = "<path>/vault"
}

listener "tcp" {
 address = "127.0.0.1:8200"
 tls_disable = true
}

disable_mlock = true

ui = true
```

`ui = true`を含んだコンフィグを指定してvaultをサーバモードで起動して、 `http://<address>/ui` へアクセスすることでUIを利用することができます。

```shell-session
$ vault server -config=example.hcl

==> Vault server configuration:

                     Cgo: disabled
              Listener 1: tcp (addr: "127.0.0.1:8200", cluster address: "127.0.0.1:8201", tls: "disabled")
               Log Level: info
                   Mlock: supported: false, enabled: false
                 Storage: file
                 Version: Vault v0.10.3
             Version Sha: c69ae68faf2bf7fc1d78e3ec62655696a07454c7

==> Vault server started! Log data will stream in below:
```

![スクリーンショット 2018-06-24 9.12.35.png](https://qiita-image-store.s3.amazonaws.com/0/141934/b1f9dd3d-62d9-9c76-4ad4-2e1f47804734.png)
GoogleAppEngineでDjangoを3年ほど動かしてわかったこと

# お断り

Google App Engine、というか、Google Cloud Platformは日進月歩で機能が新しくなっていきます。
そのため、以下でお話しすることは半分ぐらいは思い出話（今はそうではない）ということになると思います。

# 前提

私がGCPで動かしているDjangoはGoogleAppEngineのStandard環境です。当時はStandard環境なんて言葉はありませんでしたが。
また、動かしているのは組織内コミュニケーションツール的なものになります。

# Djangoのバージョン

[app.yamlのlibraries](https://cloud.google.com/appengine/docs/standard/python/config/appref#runtime_and_app_elements)でdjangoを指定すると使えます。
しかし、[最新のDjangoは指定できません](https://cloud.google.com/appengine/docs/standard/python/tools/built-in-libraries-27)。

モデルに変更を加えて、今なら簡単にマイグレーションが行えますが、この機能がDjango本体に取り込まれたのは1.7です。その当時、AppEngineで使える最新のDjangoは確か1.5でした。
モデルを変更する必要があり、どうしようかなと悩んでいてふと、「あ、ライブラリ自分のローカルに置けばいいじゃん」とlibディレクトリ以下にDjango全部コピーしてデプロイしました。

で、[公式ドキュメント](https://cloud.google.com/python/django/appengine?hl=ja)確認してみたら同じような技が使われていますね。それでいいのかGCP(笑)

# バックエンドのデータベース

## 第1世代Cloud SQL

初めにアプリをApp Engineで動かそうという話になった時、「○○（別の人が作ったツール）、Django使ってるよ」ということなので調べてみるとCloud SQLなるものがありました。当時出たてなのでもちろん、「第1世代」という言葉はついていませんが。
ともかく、これを使ってDjangoアプリを立ち上げました。
あ、「○○、Django使ってるよ」って言葉はもう一回出てくるので覚えておいてください。

## 第2世代Cloud SQL

しばらく運用していると妙な動作をしていることに気づきました。別アプリからの連携（HTTPリクエスト）作った時だったかな、リクエストの処理がたまに時間がかかるのです。調べてみると第1世代Cloud SQLはデフォルトで従量制なので、そこまで頻繁にリクエストが飛んでくるわけではないのでよくスリープしているということがわかりました。

というわけで解決策はないかと調べていたところ、これまた出たての第2世代。こいつならスリープしないようなので第2世代に切り替えました。それが罠とも知らずに・・・

第2世代のCloud SQLを作ってからしばらくして、「結構請求されてるな」ということに気づきました。そう、第2世代Cloud SQLは結局のところ、GCEのインスタンスを作ってそこでMySQL動かしてるだけなのです（自分でGCE作るよりは割引されるみたいですが）
ということで、月$10ぐらいかかっているのですが、今のところこのまま動かしてます。まあ自分で払うわけじゃないしｗ

## Djangae

そんなわけで移行はしていませんが、調べたところ[Djangae](https://github.com/potatolondon/djangae)なるものがあることを知りました。[公式ドキュメントでも一応紹介はされている](https://cloud.google.com/python/django/?hl=ja)ので使っちゃ駄目というわけではないのでしょう。
ご存知の方も多いかと思いますが、Datastoreなら無料枠を超えなければ課金されません。

ここで先ほど伏線しておいた「○○、Django使ってるよ」と言う言葉が出てくるのですが、最近になって「Django使ってるよって、Djangoのテンプレート機能使ってるよってことか！」と気づきました。別のアプリはwebapp使って作られています。

#  ログ

logging使って出力したログはGCPコンソールのログビューアで確認できます。
ただし、過去一か月。一時期、一週間分しか保存されないってことがあった時期に比べれば優しくなったかなと思います(笑)

もう少し保存期間を延ばしたいという場合はStorage等にエクスポートすることもできるようです。試したことはありませんが。

# Pythonのバージョン

Standard環境は2.7です。これ今後どうなるの？？

# おわりに

というわけでGoogle App EngineのStandard環境でDjangoを動かしてきたお話をしました。作り始めたときはDjangoに対する理解、GCPに対する理解も浅かったのでいろいろと「歴史的経緯」な部分ができてしまいましたが、今新しいアプリを作るとするとそこら辺の反省を活かして作れるかなと思います。
athrill(アスリル)機能マニュアル(起動オプション)

#概要
[athrill(アスリル)](https://qiita.com/kanetugu2018/items/cf3dea16710a3f0737e8)の起動プションについて解説します．

#起動オプション
##メモリコンフィグファイル
###-m(必須)
実行対象バイナリのメモリレイアウトを指定します．

書式は，以下の3種類あります．

* ROM/RAM指定(必須)
* MMAP指定(linuxのみ指定可能)
* 外部シェルスクリプト起動指定(linuxのみ指定可能)


####ROM/RAM指定(必須)
```
<type>, <address>, <size>
```
|項目|説明|
|---|---|
|type|ROM領域の場合は「ROM」，RAM領域の場合は「RAM」と記載してください|
|address|16進数表記で領域の開始アドレスを記載してください|
|size|10進数表記で領域のサイズを記載してください(1KB単位)|

以下，設定例です．

```
ROM, 0x00000000, 512
RAM, 0x06FF7000, 512
```

####MMAP指定(linuxのみ指定可能)

実行対象バイナリの任意の変数をmmapでファイル・マッピングできます．
本指定はオプションで，linux環境でのみ使用可能です．

検査用に内部データをシームレスにアクセスできるように，本機能を追加しています．

```
<type>, <address>, <filepath>
```
|項目|説明|
|---|---|
|type|「MMAP」と記載してください．当該ファイルにマッピングする変数は".mmap_section"でセクション指定してください|
|address|16進数表記で領域の開始アドレスを記載してください|
|filepath|mmap対象ファイルパスを指定してください．当該ファイルのサイズを8KB単位で端数切り上げしたサイズが本領域のサイズになります．当該ファイルは事前にゼロクリアし，領域確保しておく必要があります|

以下，設定例です．


```
MMAP, 0x07FF0000, mmap_file.bin
```

* 注意
  * mmap対象ファイルは，athrill起動前に空データを埋めておく必要があります．
  * 設定例：dd if=/dev/zero of=mmap_file.bin bs=1k count=1024


変数のセクション指定例です．

```
unsigned char mmap_data[1024] __attribute__ ((section(".mmap_section")));
```

####外部シェルスクリプト起動指定(linuxのみ指定可能)

本指定はオプションで，linux環境でのみ使用可能です．
athrill専用変数 athrill_device_func_call(32bit変数) を".athrill_device_section"にセクション配置することで，
当該変数に書き込んだ値を引数にして，外部シェルプログラム [athrill_extfunc.sh](https://github.com/tmori/athrill/blob/master/bin/linux/athrill_extfunc.sh)が自動起動します．
外部シェルプログラムの処理が終了するまで，CPUの実行は停止します．

検査用に外部シェルプログラムと連携する場合を想定して本機能を追加しています．

```
<type>, <address>, <size>
```
|項目|説明|
|---|---|
|type|「RAM」と記載してください．athrill_device_func_call(32bit変数)を".athrill_device_section"でセクション指定してください|
|address|16進数表記で領域の開始アドレスを記載してください|
|size|「1」と記載してください|

以下，設定例です．

```
RAM, 0xDEAD0000, 1
```

変数のセクション指定例です．

```
static unsigned int athrill_device_func_call __attribute__ ((section(".athrill_device_section")));
```

##モード指定
以下のいずれかのオプションを指定してathrillを起動してください．
###-i(オプション)
athrillをデバッグモードで起動します．
端末上でathrillを起動すると，端末からデバッグコマンドを叩くことができます．
初期開発時に，アプリケーションの動作確認をする際に使用します．

####-r(オプション)
-i オプション指定した場合，"-r"を指定すると，athrill_remoteコマンドを使用して，athrill上のデバッグを遠隔実施できます．

本機能を使用すると，シェルプログラムからathrillのデバッグ機能を利用できるようになります．
複雑なテストシーケンスをシナリオとして実行したい場合に使用します．

###-t(オプション)
athrillをタイムアウト付き(単位：クロック)でバックグラウンド実行します．

以下は，タイムアウト時間を1000クロックとして起動する際の引数指定例です．

```
$ athrill -t 1000 -d device_config.txt -m memory.txt asp
```

##athrillパラメータ指定
###-d(オプション)

athrillに指定したいパラメータを本ファイルで設定します．
パラメータ詳細は，パラメータ説明マニュアルを参照ください．

#関連記事
* [athrill(アスリル) を使用して TOPPERS OS(ASP3) をデバッグ](https://qiita.com/kanetugu2018/items/1f2ef93c9e1fa7a29f97)
* [マルチコア対応仮想環境(athrill)を使用して TOPPERS/ATK2 を実行する](https://qiita.com/kanetugu2018/items/b43c5715124f42a0393d)
* [今さらなぜCPUエミュレータを自作しようとおもったのか？](https://qiita.com/kanetugu2018/items/d692e612c3d4d715c0ad)
* [athrill(アスリル)を使用してC言語ポインタ変数を理解する](https://qiita.com/kanetugu2018/items/b9ad84c2f74324174864)
* [athrill(アスリル) を使用してベアメタル・プログラミング(１回目：main関数が動き出すまで)](https://qiita.com/kanetugu2018/items/7d2ce8def53cb9bda06b)
* [athrill(アスリル) を使用してベアメタル・プログラミング(2回目：割り込みがソフトウェアに通知されるまで)](https://qiita.com/kanetugu2018/items/8cb411717511ca96bc64)
CodeBuildでRails5.2プロジェクトをビルドしようてハマった

## 概要

CodeBuildでRails5.2プロジェクトをビルドしようてハマったのでメモ

## 症状

ビルド時に`RAILS_MASTER_KEY`がないといわれてエラー終了する

```
Missing encryption key to decrypt file with. Ask your team for your master key and write it to /app/config/master.key or put it in the ENV['RAILS_MASTER_KEY'].
```

## 原因

以下の条件が重なってエラーになっていた

- ENV['RAILS_MASTER_KEY']が設定されていなかった
- Dockerfile内でRailsプロセスの起動を行なっていた
- `config.require_master_key = true` が設定されていた

```Dockerfile
...
ENTRYPOINT ["./entrypoint.sh"]
```

```entrypoint.sh
bundle exec rake about
bundle exec rake db:create db:migrate db:seed
```

```config/environments/production.rb
config.require_master_key = true
```

## 解決方法

以下の2点が必要

- CodeBuildの環境変数としてRAILS_MASTER_KEYを設定する
- docker build 時に引数としてRAILS_MASTER_KEYを渡す

### CodeBuildの環境変数としてRAILS_MASTER_KEYを設定する

マネージメントコンソールからビルドの環境変数としてRAILS_MASTER_KEYを設定してもよいのだが、
機密情報ではあるのでAWS System Managerのパラメータストアを利用する。

```
version: 0.2
env:
  parameter-store:
    RAILS_MASTER_KEY: 'rails_master_key'
  variables:
    AWS_DEFAULT_REGION: us-east-1
    REPOSITORY_URI: 08123xxxx.dkr.ecr.us-east-1.amazonaws.com/collect_and_destroy
```

`env`の`parameter-store`にキーを設定する。
`RAILS_MASTER_KEY`がCodeBuildで利用できる環境変数名、`rails_master_key`がSystem Managerのパラメータとして設定したキー名となる。

### docker build 時に引数としてRAILS_MASTER_KEYを渡す

シェルに設定された環境変数とDockerから利用される環境変数は違うみたい
Dockerから利用される環境変数を設定するには`ENV`か`ARG`という定義命令を使う
`ENV`は環境変数の定義、`ARG`は`docker build`時に引数として値を渡すことができる

```Dockerfile
ENV RAILS_ENV production
ARG RAILS_MASTER_KEY
```

`ARG`に引数を渡すには以下のようなコマンドを実行する

```
$ docker build --build-arg RAILS_MASTER_KEY=12345 -t docker_image:latest .
```

最終的に以下のような感じになった

```buildspec.yml
version: 0.2
env:
  parameter-store:
    RAILS_MASTER_KEY: 'rails_master_key'
phases:
  build:
    commands:
      - docker build --build-arg RAILS_MASTER_KEY=$RAILS_MASTER_KEY -t collect_and_destroy:latest .
```
【AWSメモ②】請求アラーム機能の設定

## 請求アラーム機能

AWS使用料金が一定枠を越えた際にメールで通知する機能。

無料枠だと以下が基準


Amazon EC2
・1 か月あたりの Linux、RHEL、または SLES t2.micro インスタンスの使用量 …750時間
・1 か月あたりの Windows t2.micro インスタンスの使用量 …750時間

Amazon S3
・5 GB 標準ストレージ
・20,000 件の Get リクエスト
・2,000 件の Put リクエスト

Amazon RDS
・Amazon RDS Single-AZ db.t2.micro インスタンスの使用…750時間
・DB Storage: General Purpose (SSD) または Magnetic の任意の組み合わせ …20GB
・バックアップ (RDS Magnetic ストレージを使用)…20GB
・1,000 万 I/O

その他
https://aws.amazon.com/jp/free/


### 設定方法

マネジメントコンソールへログイン後、アカウント名を押下すると、プルダウンメニューが表示されるので、「請求ダッシュボード」を押下する。

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/558235c6-769c-0c91-329c-f98777c42e2b.png">

請求ダッシュボード へ遷移後、画面をスクロールして下の方にある「アラートおよび通知」の2つ目の「請求アラートを今すぐ有効にする」を押下する。

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/976cfba7-7185-709c-2b93-5b2c80b19ca7.png">

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/0656b104-8a6a-435d-d28c-331bec83972a.png">

請求アラートの設定画面で、「コスト管理設定」の「無料利用枠の使用のアラートの受信」にチェック、「E メールアドレス」にメールアドレスを入力する。
「請求アラートを受け取る」にチェックをつける。
設定を入力後、「設定の保存」ボタンを押下する。

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/ea316395-7abc-c18f-acb8-3cfc2215cee4.png">

リージョンを 「バージニア北部」 に変更して CloudWatch のダッシュボードへ遷移する。
CloudWatch のダッシュボードの「請求」を押下する。
「請求」を押下後、「アラームの作成」ボタンを押下する。

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/59037057-82c2-4ffb-82ef-2cfb0f6c0edb.png">

「アラームの作成」ウィンドウで、「超過」に金額を入力、「通知の送信先」に通知するメールアドレスを入力する。
入力完了後、「アラームの作成」ボタンを押下する。

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/57cab186-f15b-73e3-d5d1-edf761f978fd.png">

「アラームの作成」ボタン押下後、メールアドレスの確認ウィンドウが表示される。
入力したメールアドレス宛に確認リンク付きのメールが送信されているのでリンクにアクセスして登録を完了する。

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/f5598e36-902a-d084-0b65-53ef2ffea15d.png">

登録完了後、「アラームの表示」ボタンを押下する。

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/880c4af3-3e20-05ea-23f7-e4ecce7b120c.png">

「アラームの表示」ボタン押下後、アラーム一覧が表示される。
作成したアラームが追加されていることを確認する。

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/38cead95-0a3a-058e-c0c5-6971da759ed0.png">

[](https://qiita.com/Kento75/items/3a84db0f55bef73eec6d)
[](https://qiita.com/Kento75/items/bf8f7c91ee9dfb973d56)
[](https://qiita.com/Kento75/items/e1478fead92f70fb757e)
How to Build Paper-Fast Static Website

## About Me

Name: Yota Toyama
GitHub: [raviqqe](https://github.com/raviqqe)
Religion: Vim

---

## Background

---

## Paper-Fast (紙速)?

- Web pages served _like a sheet of paper_.
- Every content shown at once
- No flashing

```text
+--------+
|        |
|   紙   |
|        |
+--------+
```

---

## Near Paper-Fast Example

![経済、株価、ビジネス、政治のニュース 日経電子版.png](https://qiita-image-store.s3.amazonaws.com/0/80296/3a345592-7381-3b41-b196-2679f17af4d3.png)

---

## A lot of challenges...

- Hard for dynamic websites 
- Heavy use of CDN
    - Fastly and VCL
- How about static ones?

---

## What I built

---

## https://cloe-lang.org

![Cloe programming language.png](https://qiita-image-store.s3.amazonaws.com/0/80296/4507baf8-18c2-da4c-9895-187a9766ee85.png)

---

## JavaScript optimization

- Run JavaScript locally
    - Less JS codes on browsers
    - Read, modify, and write HTML files
    - [jsdom](https://github.com/jsdom/jsdom) with common tools like jQuery
- Consider embedding scripts into HTML

---

## Fonts optimization

- Hosted fonts
    - [Google Fonts](https://fonts.google.com/)
        - Easy to use
        - Your fonts can be already in disk cache
        - [text](https://www.labnol.org/internet/reduce-google-fonts-size/21057/) query option
- Serving from your domain
    - Connection reuse
    - [fontmin](https://github.com/ecomfe/fontmin)

---

## Images optimization

- Honestly speaking, not familiar with this topic
- If possible, use SVG
    - Even embeddable to HTML
- [`<picture>` and `<source>` tag in HTML](https://www.w3schools.com/tags/tag_picture.asp)
- [webp image format](https://developers.google.com/speed/webp/) by Google

---

## Others

- Minify HTML/CSS/JS
    - [webpack](https://webpack.js.org)
    - [html-minifier](https://www.npmjs.com/package/html-minifier)

---

## Demo

---

## Summary

- Optimize everything
    - Don't run codes
    - Don't use resources
- KPI improvement? More user views?
    - IDK but self satisfaction

---

## References

- [dev.to](https://dev.to)
- [日経新聞 電子版](https://www.nikkei.com)
- [リニューアルした日経電子版が高速すぎてヤバイ件](https://note.mu/konpyu/n/n9fd5b81f6305)
ISTE2018版Scratch3.0+micro:bit の接続手順

【2018/08/31追記】このドキュメントは2018年6月に行われたISTE2018向けに用意された環境についての解説です。2018/08/01に公開されたScratch3.0 beta https://beta.scratch.mit.edu/ については東京都公立小学校Yasuharu Suzuki先生が作成された「[スクラッチ micro:bit連携]( http://mbit.fun/doc/scratch_microbit_20180881.pdf)」を参照願います。


# はじめに

　ISTE2018で発表された、Scratch3.0+micor:bitの接続方法は、Macの場合、拍子抜けするほど簡単で、Scratcherたちの標準デバイスになるのは間違いないと感じました。

【2018/07/04追記】CloudReady(ChromeOS)のUSB起動+安価なBluetooth USBドングルで問題なく動きました。検証済みのドングルは ELECOM LBT-UAN05C2と Newiy Start BL-V40 です。2011年製のemachines E729Zで検証。Windows7や8の人でも楽しめそうです。

# 接続手順

　2018年6月23日に行われたワークショップ用のURLを含むため、将来は動かなくなる可能性があります。また、Macでしか検証が出来ていません。（2018年6月26日追記：Windowsは8月1日のBetaでサポートされるそうです。ただしWindows10のみ。）

- micro:bit側での作業
    - micro:bit用の接続プログラム https://llk.github.io/scratch-microbit-firmware/scratch-microbit-firmware-combined.hex をダウンロード
    - micro:bitにインストール
    - 波紋が広がるようなLEDアニメーションがスタートすればOK（そのまま電源を入れておきます）
- Scratch3.0での作業
    - micro:bit接続用プロトタイプにアクセス https://llk.github.io/scratch-gui/microbit/
    - 左下の機能拡張ボタンを押して micro:bit　を選択
    - 右上のブルートゥースマークをクリック
    - 検出されたmicro:bitをクリックして接続

以上です。
まだ、プロトタイプなのでブロックが少ないですが、これは素晴らしいの一言です。

![s4.jpg](https://qiita-image-store.s3.amazonaws.com/0/44523/69bfd762-e1ca-e6c5-c996-81e72b54316a.jpeg)

# 大勢で行う際に自分のIDを調べる方法（2018-07-09追記）

近くにmicro:bitがいっぱいあると、自分のmicro:bitがどれだか判らなくなります。
自分のmicro:bitのIDを確認する簡単な方法は以下の通りです。
![checkid.jpg](https://qiita-image-store.s3.amazonaws.com/0/44523/eaa7f61f-17b3-1b1c-0ec0-ec8c8af27559.jpeg)
DeferredRenderingとMSAA 

Forward+でレンダリングエンジンを作っていたのですが、Forward系でも結局ポストのためにG-Bufferが必要になってきて、ZPrepassが無駄で冗長な処理に感じてきたので、Deferred系にレンダリングエンジンを一新しました。

その際に、G-Bufferの出力でMSAAをかけていたら、法線のG-Bufferにアンチがかかってしまってアーティファクトが発生していました。

キャラモデルと背景との間に不自然なアーティファクトが発生している。
![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/167635/b4b7fed1-b9ef-16d6-3034-eabd606a4600.png)

法線のG-Bufferを見るとこんな感じで法線にアンチがかかって、変なライティングが起きていた模様。
![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/167635/3237c3a5-be61-64fc-d7f9-8003f5aa421f.png)



というわけでG-Bufferの出力からMSAAを外すとこんな感じで綺麗になった。
<b>最終シーン</b>
![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/167635/ea0df541-c981-52ee-fcee-b7770f643a5b.png)
<b>法線バッファ</b>
![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/167635/9af8f78d-8aad-0fec-0684-fc28291dafd3.png)

さて、これでMSAAがかからなくなってしまったので、元のエンジンよりジャギーが目立つようになってしまっているかもしれません。MASSってピクセルの深度値でアンチをかけるので、ディファードシェーディングをかけるときに深度値を書き込むようにしてやれば、そのタイミングでアンチをかけられるかもしれません。
サポートベクターマシンを理解する

データ量が少ない場合はSVMを使ったほうがいい場合も多い。

## サポートベクタマシンとはなんなのか

教師ありの機械学習手法で、実は分類だけでなく、回帰問題にも利用することができる。
とはいえ、多くの場合は分類問題に使うけれど。
n次元空間にプロットされたデータを扱います。
この、n次元ってのがイメージしづらいのですが、特徴量と考えるとわかりやすいかと。

超平面を使ってクラス分類することにしましょう。
超平面は、英語でHyper-Planeですね。

![figure1.png](https://qiita-image-store.s3.amazonaws.com/0/242196/cfe0b3bb-a53c-6432-cf9a-44b3c0a4fb9f.png)

こんな感じで2値分類に、いい感じに使えます。

## どうやって分類するの？

分類するときに、良い超平面はどうやって作るのか？という問題が出てきます。

![figure2.png](https://qiita-image-store.s3.amazonaws.com/0/242196/7dce9d52-18c2-5372-cb51-8e10a67d74dc.png)

超平面を追加してみました。
どれが一番良い超平面でしょうか？というと、明らかにもともとの線ですよね？

![figure3.png](https://qiita-image-store.s3.amazonaws.com/0/242196/51cc62b2-3379-f909-b1ae-fe53435932c1.png)

今度はどうでしょう？

![figure4.png](https://qiita-image-store.s3.amazonaws.com/0/242196/b5a68ceb-fa33-8f04-7174-49516e296a27.png)

各超平面から一番近い点（最近傍）との距離＝マージンといいますが、これを使って良い平面を定義していきます。
真ん中の超平面が、マージンが最長です。マージンが長いほうが良い超平面であるとします。
マージンが長い＝ロバスト性が高いといい、マージンが短い場合は誤分類の可能性がたかいと考えられます。
ここまで、直感的にわかると思います。

さて、次のケース。

![figure5.png](https://qiita-image-store.s3.amazonaws.com/0/242196/751c65c4-9c02-18fa-1b29-c2c11162dd8e.png)

青の線のほうがマージンは大きい。ですが、SVMではマージンの大きさよりも、正しい分類のほうが重要なので、ここでは、赤の線のほうがより良い超平面ということになります。

では、線形では分類できない問題の場合はどうでしょうか？
外れ値が混ざっています。

![figure6.png](https://qiita-image-store.s3.amazonaws.com/0/242196/fdd570a7-4b7b-f33a-f260-3b332b4569d2.png)

SVMは外れ値を無視して、マージンを最大化するような超平面を探します。SVMは外れ値に対してロバストです。

今度は、線形の分類はどう考えても無理な場合。

![figure7.png](https://qiita-image-store.s3.amazonaws.com/0/242196/d23a43e0-d692-4927-bcf5-b5e23e5d4757.png)

SVMの面白さは、このような問題を線形に分類できるところです。
$$z=x^2+y^2$$
zという追加の特徴量をつくって、プロットし直してみます。

![figure8.png](https://qiita-image-store.s3.amazonaws.com/0/242196/cbf8c465-507b-33fc-8757-e4e1c5708afa.png)

zの値は累乗のため常に正。
もともとのプロットで原点に近い点のz値は小さく、遠いものはz値も大きくなります。これによって、線形に超平面を引いて2値分類ができるようになります。

このzのように、都度特徴を追加していく必要があるのでしょうか。
SVMでは、カーネルトリックと呼ばれる技法を使うため、その必要がありません。
カーネルトリックは低次元のインプットを、高次元空間にプロットし直すことができます。非線形の分類問題に便利です。

![figure9.png](https://qiita-image-store.s3.amazonaws.com/0/242196/834b6fa5-bb15-8c4a-e607-38b1b066fd07.png)

元のインプットに対する超平面は、楕円のようなかたちになります。
OpenMapTilesでラスタータイルを生成する

[OpenMapTiles](https://openmaptiles.org/)を使って地図タイルを生成するときに、要件によってはベクタータイルではなく、ラスタータイルの方が向いている場合もあります。
今回は、必要な分のラスタータイルをすべて生成して保存することを考えます。

# Tileserver GL
ラスタータイルを生成するときに、まず考えられるのが[Tileserver GL](https://github.com/klokantech/tileserver-gl)を使う方法です。([Serve Raster and Vector Tiles with Tileserver GL](https://openmaptiles.org/docs/host/tileserver-gl/))
でも、タイルの境界でのラベルがうまく描画されない問題 [klokantech/tileserver-gl#35](https://github.com/klokantech/tileserver-gl/issues/35) があります。

# 解決方法1
解決方法の1つ目は、ラベルのレイヤーに

```json
"symbol-avoid-edges": true
```
を設定することです。([Mapbox Style Specification](https://www.mapbox.com/mapbox-gl-js/style-spec/#layout-symbol-symbol-avoid-edges))
この場合は、タイルの境界をまたぐラベルがすべて描画されません。都市名のような大きなラベルも消えてしまうため良くないです。

# 解決方法2
境界付近のラベルも正しく描画されたタイルを生成するには、マージンを取って描画し切り抜く必要があります。[^1]



[^1]: [Mapion・日本一の地図システムの作り方](https://www.amazon.co.jp/Mapion%E3%83%BB%E6%97%A5%E6%9C%AC%E4%B8%80%E3%81%AE%E5%9C%B0%E5%9B%B3%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9-Software-Design-plus-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%E3%83%9E%E3%83%94%E3%82%AA%E3%83%B3/dp/4774153257) p.69 タイル生成スクリプト

この方法を、Tileserver GLを使わずに、[Puppeteer](https://github.com/GoogleChrome/puppeteer)を使って実装しました。
https://github.com/tattii/puppet-tiler

Mapbox GL JSでマージンを取って描画した地図から、256px四方のタイル画像をスクリーンショットして生成します。1枚を生成するのに約50msです。
Retina用に512px四方のタイル画像を生成することもできます。

また、[TileReduce](https://github.com/mapbox/tile-reduce)を使って並列処理するように実装しています。


# まとめ
ベクタータイルからラスタータイルを生成する、[puppet-tiler](https://github.com/tattii/puppet-tiler) を作成したという紹介でした。
新卒で会社に入った感想（1年未満）

今年から某IT企業に新卒で入ったものです。
学生と社会人のギャップが激しいのと技術的なあれがやばかったので、書き残すことにしました。グチグチ書いてるので、温かい目で見てくれればいいです。あと、これからプログラマーになりたいという人にこういうこともあるんだよという参考になれば良いです。

## 新卒で入って感じたこと
まずはじめに思ったのが、時間の拘束がすごいこと。学生のときは時間に余裕があって、いろいろと時間に自由だったなと思った。学生に戻りたい...

### 習慣が多い
あと、決まったことを毎日することが多いのも、学生のときとのギャップ。学生のときは規則さえ守ってればなんでもやってもいいということが多く、その分、会社に勤め初めて、毎日、進捗報告や日報とかやらなくちゃいけないことが多くて、正直毎日書く必要ある?って思うことが多い。正直、多くて1週間に1回でいいと思う。

### お金の面
学生の頃と比べて収入面は良くて、お金の面は確実に学生の頃とは違う。確実にこの月にこのお金が入るというのは安心や安定の面では大きい。ただ、慣れというのは怖くて、初めのうちは良かったけど、先輩や同期と飲み会に行くときがあったり、人との付き合いでよく金を消費したり、一人暮らしをしたいとなったとき、今の給料だと少しきついなと思ったりして、給料って少ないなって思ってくるようになってくる。ただ、人と飲みに行ったりして、話をするのは好きだし、断るときはしっかりと断ってるからそこはバランス取れてるかな。

### 技術にあまり触れなくなる（特に高い地位は）
ベンチャーとかスタートアップじゃないからだと思うけど、自分としては技術触れて新しいことをしていきたいので、会社に入ればもっと技術に触れていけると思っていた。けど、そうでもなくて、さらにわかったのが課長や部長くらいになると、コードを書かない人が多い。エンジニアが30年定年ってこのことかな?ベンチャー企業は結構新しいことや高い技術を使って開発したり、充実した開発環境のイメージなんだけど、正直そこは会社によって異なっていて、会社に入ってから、改めて会社を選ぶのは本当に重要だなって思った。どこかで、就活はガチャって聞いたけど本当にそのとおりだと思う。

## 業務に携わる
### 技術に関して経験年数は関係ない
今いる会社に入って思ったのがほんとにこれで、新卒から2年3年で主任になった人や中途の人が結構いるけど、新卒であろうと中途であろうと、技術のレベルは年数に関係ないんだなって思った。自分は学生の頃に興味のあるがまま、気になったことはとことん調べて、プログラムを学んだけど、そこから今の会社に入って、実際にエンジニア同士で技術の話をしてみると、意外とみんな知らないことが多かった。そこは実際に手を動かしてやっていて、かつ、ちゃんと理解しているのかっていうのがでかいと思う。中途採用の欄でよく、経験年数何年以上とかってあるけど、なんで年数で決めんのかなって言うのは疑問にある。でも、実際にどんな技術ができて、何ができるのかって言う判断の基準がないから年数なんだろうなって思う。

### 実際の環境
実際の開発の環境はノートPCを一つとモニターが一個で一応使うツールが決まっているので、あまり自由度は感じられないかなっていう印象。あと、ssdではなく、hddを使っているので、開発のときにストレスがある。自分のいる会社があまり新しい会社ではない（2000年以前）ので、この辺はわからないところが多いのかなって思う。

### 相談できる人がいる
自分のいる会社は100人を超える規模の会社で幸運なことに相談すると真剣に相談に乗ってくれる人が多かった。実際に何かに悩んでいたり、今後どうして行きたいかの相談を人生の先輩、仕事の先輩として相談に乗ってくれることがかなり心強い。相談に乗ってくれる人がいる環境があるのは精神面でもかなり助けられるので良いなと感じた。ただ、こういうのは、自分で作るか、会社にもよると思う。

## 今後
今思いつく限りでは、こんなんだけど、新卒でまだ一つしか会社を経験してないから、会社が違えば思うことも違うのかなって思うし、どの会社もこんなんじゃないって思う事もただある。注意してほしいことは自分が今いる会社はブラックじゃない（みんな残業しないし、してたらちゃんと残業代出る、法律重視）からそこは良かった。~~これからは少しずつ変えられるところから変えて行ければ~~(←何回かチャレンジしたところ動きが遅く検討が多いため環境を変えたほうが良いと判断)

変わらなそうだったら働く環境を変えればいいし、そのときになったらまたqiitaに記事書こうかなって思ってるし...

最初にも書いたけど、これからプログラマーとして働きたいなって思ってる人の参考になればいいな。
grpc-gatewayで使用する `google/api/annotations.proto` のインポート問題 python編

grpc-gatewayの設定を書くために、 `google/api/annotations.proto` ファイルをインポートするのだが、そのために、吐き出したpythonのソースコードでも

```python
from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
```
のような記述があり、そんなものはないとインポートエラーになる。

[Integration with other languages is partially broken](https://github.com/grpc-ecosystem/grpc-gateway/issues/298) によると、[googleapis-common-protos](https://pypi.org/project/googleapis-common-protos/) をpipで入れればいいらしい。

```console
$ pip install googleapis-common-protos
```
Webサービスや電子工作,3Dモデル,プロダクト試作品を登録 宣伝できるサイトまとめ


イベントあるたびに作品が登録されて、その年にあった作品もわかって気に入ってた [hacklog](https://hacklog.jp/) が 2018/6/20 で閉鎖してしまうので、同じ様なサイトあるのかなーと調べてみました。

## [hacklog](https://hacklog.jp/)
```
2006年からスタートした日本最大級の開発コンテスト「Mashup Awards」（マッシュアップアワード、略称MA）は、
この世に公開されているさまざまなデバイスやAPI、ハードウェア、技術をマッシュアップ（「混ぜ合わせる」の意）して新しいものを生み出すエンジニアを応援するコンテストです。
MashupAwards への作品応募に hacklog は利用されていました。
```
運営 Mashup Awards運営委員会
主にその年のハッカソンやアイデアソンで産まれたものが登録されていた。<br> MA無関係の作った作品をのせてもOKでした。

## [protopedia](https://protopedia.net/)
```text
みなさんの「つくろう」や「つくった」を発表する場です。
登録する内容は、モノでもコトでも、なんでも構いません。
```
運営 [一般社団法人MA](http://we-are-ma.jp/)
hacklog の移管先にもなっている [一般社団法人MA](http://we-are-ma.jp/) が運営するサイト。 <br> (わたしも運営に少し協力していたりします)

## [ServiceSafari](https://www.service-safari.com/)
```
今後注目のWebサービスや人気アプリを発見することができる場所。
キュレータが選りすぐんだWebサービス・アプリ情報を、毎日メールで受け取ることができます。
```

運営 個人？ [木下 慶](https://twitter.com/kkino0927?lang=ja)
登録されたサービスやアプリをメールで知ることができる。<br>掲載依頼フォームから投稿して、許可されるとサイトへ登録される。<br>[公式Twitter](https://twitter.com/ServiceSafari)と[FBページ](https://www.facebook.com/ServiceSafari)にもURLつきで投稿される。

## [メカトロライフ](https://mechatro-life.com/)
```
「主役は、ものづくりが大好きな個人（小さなつくり手たち）」
これがメカトロライフの原点です
作品を投稿し、自慢し、鑑賞し、探求し、笑い、
そして交流してください。
```

運営 株式会社 オリジナルマインド [公式](https://www.originalmind.co.jp/company/outline/)
委託販売の機能があり、個人事業者の方が製作した作品（プロダクト）や設計データを製作者に代わって販売する事ができる。


## [startapp](http://startapp.jp/)
```
startappは、アプリやWebサービスを作ることが大好きなクリエイタのためのユーザー参加型メディアです。
開発者インタビューを自分で作って公開しPRする
```

運営 不明 [Twitter](https://twitter.com/startapp_jp)
"開発者インタビューを自分で作って公開しPRする"という、ちょっと特殊なサイト。<br>インタビュー記事作成のためのガイドラインや対話形式で記事を作る事ができるっぽい。

## [seekgeeks](https://seekgeeks.net/#/)
```
プランナーとエンジニアのマッチングWebアプリ
```
運営 個人 [seekgeeks_ny](https://twitter.com/seekgeeks_ny)
アイデアだけでも登録できる。投稿がオープンなので気になる投稿もちらほらある。けど、開発者として関わるのは少しハードルありそうな雰囲気。

## [3Dモデラボ](https://modelabo.itmedia.co.jp/)
```
3Dデータでつながる、広がる、モノづくり。
3Dデータの共有、3Dデータのダウンロードを誰でも“無料”で楽しめる、3Dモデルデータ共有コミュニティーサービスです。
```
運営 [ITmedia](http://www.itmedia.co.jp/)
Webサービスやプロダクトではなく3Dモデルのデータ共有,交流サイト。<br>2016年までは Autodeskさんと fusion360 ネタや カーデザイン コンテスト , Fabミニ四駆などのタイアップをしていようです。 モノづくりスペシャリストのための情報ポータル [monoist](http://monoist.atmarkit.co.jp/) との連動サイトでもあったみたい。

# [Instructables](http://www.instructables.com/)
```
3Dプリントからお菓子作りなど様々なジャンルの「モノづくり」に関する情報をオープン化し、自由に共有することが可能なコミュニティサイト
```
運営 [Autodesk](https://www.autodesk.com/)
以前[日本語にも対応した](http://makezine.jp/blog/2013/11/instructables_jp.html)けど、現在はサポートがなくなっているようです。お菓子のレシピと電子工作,ガーデニングのレシピなど、ジャンル混ざって投稿されているのが面白いです。

# まとめ
他にもあると思うけど 見つけきれず。<br>おすすめを知っている方がいればコメント欄などで教えてもらえるとありがたいです。

# 参考記事
[Webサービスを宣伝できるサイトまとめ](https://readmaster.net/think-issue-memo/webservice-senden-matome)
python property

# property
pythonで自分で定義したオブジェクトから値を取得したり更新したり削除したりしたい時の
動作を定義することができる機能

# 使ってみる
## まずはpropertyを使わない場合

```python
class NoProperty(object):
    def __init__(self, x):
        self._x = x

    def get_x(self):
        return self._x

    def set_x(self, v):
        self._x = abs(v)

    def del_x(self):
        self._x = None
```

```python:実行結果
nopro = NoProperty(100)
print(nopro.get_x()) # 100

nopro.set_x(-200)
print(nopro.get_x()) # 200

nopro.del_x()
print(nopro.get_x()) # None

```

## 同じことをpropertyを使って表現

```python
class MyProperty(object):
    def __init__(self, x):
        self._x = x

    @property # propertyの時は　x.getterと同義
    def x(self):
        return self._x

    @x.setter
    def x(self, v):
        self._x = abs(v) # 更新前に何らかの処理をはさめる

    @x.deleter
    def x(self):
        self._x = None
```

```python:実行結果

mypro = MyProperty(100)
print(mypro.x) # 100

mypro.x = -200
print(mypro.x) # 200

del mypro.x
print(mypro.x) # None

```
使わない場合と実行の仕方が違うことに注意


## propertyを使って動作を制限
```python
class MyProperty(object):
    def __init__(self, x):
        self._x = x

    @property
    def x(self):
        return self._x
```
```python:実行結果
mypro = MyProperty(100)
print(mypro.x) # 100

mypro.x = -200
AttributeError # 定義されていないのでエラー

```

読み取り専用として使いたい時などに便利
[VSCode]UnityでVSCodeの { が改行されなくするための設定方法

最近、UnityでARKitを使ってゲーム制作をしていますTOSHです。

久しぶりにUnityを使っているのですがエディターをもともとMonoDeveloperを使用してたものの、バージョンの更新に伴いVisual Studioに変更しましたが、やっぱり軽いほうがいいということでVSCodeに変更しました。

**しかし**

完璧に思えたVSCodeには絶対に見過ごせない欠点がありました...
それは、コードを整形した時、下のようになるのです。

```c#
void Update ()
{
           if (Input.GetMouseButtonDown (0)) {
                Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
                RaycastHit hit;

                //we'll try to hit one of the plane collider gameobjects that were generated by the plugin
                //effectively similar to calling HitTest with ARHitTestResultType.ARHitTestResultTypeExistingPlaneUsingExtent
                if (Physics.Raycast (ray, out hit, maxRayDistance, collisionLayer)) {
                    //we're going to get the position from the contact point
                    m_HitTransform.position = hit.point;
                    Debug.Log (string.Format ("x:{0:0.######} y:{1:0.######} z:{2:0.######}", m_HitTransform.position.x, m_HitTransform.position.y, m_HitTransform.position.z));

                    //and the rotation from the transform of the plane collider
                    m_HitTransform.rotation = hit.transform.rotation;
                }
            }
}
```

***いやいやなんで { 改行されるん！！！***

いや必要ないやん！ってかこれが気になって気になって仕方がなかったのです。
しかし、どのサイトを調べ得ても、方法が見つからなかったので、仕方なく英語で検索しました。

**いやいや、整形って英語でなんていうん？？？**
そもそもここがわからず、だいぶ苦戦しましたが、どうやら`format`というようです。
それがわかり、Googleで`VSCode change format`と検索すると、
とある拡張機能が出てきました。
それがこれです。
[C# Fix Format](https://marketplace.visualstudio.com/items?itemName=Leopotam.csharpfixformat)
説明文を読んで見るとそれっぽいので早速、installしてみることに！
installをし、VSCodeを再起動、
そして、option+shift+fで整形をすると、なんと

```c#
void Update () {
            if (Input.GetMouseButtonDown (0)) {
                Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
                RaycastHit hit;

                //we'll try to hit one of the plane collider gameobjects that were generated by the plugin
                //effectively similar to calling HitTest with ARHitTestResultType.ARHitTestResultTypeExistingPlaneUsingExtent
                if (Physics.Raycast (ray, out hit, maxRayDistance, collisionLayer)) {
                    //we're going to get the position from the contact point
                    m_HitTransform.position = hit.point;
                    Debug.Log (string.Format ("x:{0:0.######} y:{1:0.######} z:{2:0.######}", m_HitTransform.position.x, m_HitTransform.position.y, m_HitTransform.position.z));

                    //and the rotation from the transform of the plane collider
                    m_HitTransform.rotation = hit.transform.rotation;
                }
            }
}
```

おお！変わった！感動！
これで気持ち悪い違和感はなくなりました。めでたし、めでたしと。
M5GoのPIRセンサーをArduinoで使う

###目的
M5GOに入っている、PIRセンサーをArduinoで使ってみる。

###準備

PIRセンサーを、
PORT Aにつなぐ場合は、GPIO22pin
PORT Bにつなぐ場合は、GPIO36pin
PORT Cにつなぐ場合は、GPIO16pin
のIOを読み取る。

###実装例

```

#include <M5Stack.h>

const int PIN_PIR_SIG = 16;

void setup() {
  Serial.begin(115200);
  pinMode( PIN_PIR_SIG, INPUT_PULLUP );
}

void loop() {
  int i = digitalRead( PIN_PIR_SIG );
  if ( i == HIGH ) {
    Serial.print("HIGH\n");
  }
    if ( i == LOW ) {
    Serial.print("LOW\n");
  }
}
```
特定の単語だけ途中で改行させないHTML/CSS（「あなたとJAVA, 今すぐダウンロー(改行)ド」問題）

トップページに掲載されるキャッチフレーズなど、言葉の途中で改行されると急激にダサくなってしまう文があると思います。
英語を始めとするスペースで単語が区切られる言語であればブラウザが良い感じに調整してくれるのですが、日本語を含む[CJKV](https://ja.wikipedia.org/wiki/CJKV)のような言語では単語の途中であっても無慈悲に改行されてしまいます。


## 要するにこれを避けたい
途中で改行されるものとして最も有名なのがこれです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185296/bab5f8de-06e4-a300-d422-1eba7ac400c1.png)
（https://java.com/ja/ より）

この「今すぐダウンロー（改行）ド」は何の変哲もないHTMLで再現できます。

```html:HTML
<div>
  <h1>あなたとJAVA, 今すぐダウンロード</h1>
</div>
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185296/4a254565-faea-2ffa-f0f2-9b17274b6310.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185296/c4231e20-b0c1-d61a-9ff0-435d01063d7a.png)


ビューポートの幅によっては途中で文章が折り返されます。当然ながら単語や意味の区切りは無視されます。


ビューポートの幅どころの問題ではないjava.comのサイトは間抜けすぎるにしても、レスポンシブ対応をしていたらモバイルだと変になった……という事案は普通にあるのではないでしょうか。



## 解決策:inline-blockを使う

`display:inline-block` を適用したクラスを作ってあげて、絶対に改行させたくない単語だけspanで囲ってあげると「一塊」になるため、良い感じになります。

```css:CSS
.nobreak{
  display:inline-block;
}
```

```html:HTML
<div>
  <h1>あなたとJAVA, <span class="nobreak">今すぐ</span><span class="nobreak">ダウンロード</span></h1>
</div>
```


![image.png](https://qiita-image-store.s3.amazonaws.com/0/185296/33b90529-1d79-2342-b708-7e21dd4be18f.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185296/5fb662bd-c7d7-94d6-b723-fc04d98affac.png)



もちろんどんな幅でもOKというわけではなく、ビューポート幅がそのspan内の文字列による幅未満になるとやむを得ず改行されてしまいます。（そもそも、こういう状況では`font-size`を見直すべきでしょう。）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185296/c601b382-98ba-d3bf-4acc-7e99b6189f1e.png)