OmniAICreator/Qiita-1.07M huggingface dataset:
CSVのゼロパディングを外すワンライナー


数字の先頭のゼロを外したいケース。

```
$ cat test.txt 
1,2,3,0004,5
01,0,0,0002,4
```

「コンマまたは行頭」がうまく表現できず、sedだとこんな感じ。

```
$ sed -e 's/,0*\([1-9]\)/,\1/g' test.txt | sed -e 's/^0*\([1-9]\)/\1/g'
1,2,3,4,5
1,0,0,2,4

```

全ての列が数値、という前提ですが、Rubyならこんな感じにかけます。

```
$ ruby -ne 'puts $_.split(",").map { |v| v.to_i }.join(",")' test.txt 
1,2,3,4,5
1,0,0,2,4
```

## 参考リンク

http://qiita.com/hirohiro77/items/7fe2f68781c41777e507
投稿テスト

# 自己紹介
仕事のため１０年ぶりにプログラミングを再開しました。
私が所属しているのはとても古典的な製造業で
おそらくwindows2000以前に作成されたVB４～６環境のものがたくさんありメンテもあまりされることなく放置されております。

## Windows10以降に対応した置き換えを
VBS　VBA　VB4 BATを　Office2016　.NETフレームワークへ対応したものへリライトしていくのがメイン業務
およびWindows10の大量展開支援業務が現在の仕事
タグの数からみても、C＃のほうが主流ではあるが、VB資産が限りなく多く
C#で書き直すことはできないのではないか、VB.NETでずっと生き続ける会社になりそうです

### とはいっても
世の中がOSS、クラウドが全盛期になっていくなかで、周回遅れの業務をしている感が現在あり
最新技術、トレンドともかけらのない仕事をしているとはいえ
再びプログラミングを仕事としてやり始めると、最新技術に興味がわいてきます　（興味がわくだけでやるとは言っていない）

###
最適なUnicornのワーカー数

# 導入
Rails(に限らずRuby)で作ったWebアプリケーションを運用する場合、次のような構成を取ることが一般的かと。

> Internet <-外と中の壁-> nginx <--> Unicorn <--> Rails

この際、nginx/Unicornのワーカー数の設定をどうするかで迷ったことはないでしょうか。

nginxはイベント駆動型なため、基本的にはワーカー数 > CPU数にしても意味がありません。自動設定ではCPU数と同じになりますが、わざわざ変更する意味もないでしょう。

一方Unicornはシンプルなマルチプロセスモデルであるため、ワーカー数の設定が重要な意味を持ちます。

# ワーカー数の設定

もしアプリケーションが純粋にCPUだけを使うものであった場合は、nginxと同様にワーカー数をCPU数より増やしても意味がありません。しかし実際のアプリケーションはDBを読んだり外部APIに問い合わせをしたり、I/O待ちの時間が少なからず存在するはずです。

もしUnicornワーカー数がCPU数とまったく同じであれば、このI/O待ちの時間はCPUが何もしていません。

I/O待ちのプロセスがいるのであれば、その時間CPUを使うプロセスがいないと貴重なCPU資源を無駄にしていることになります。この時点で少なくともCPU数よりはワーカー数が多いほうがいいだろうというのはわかります。でも、どのくらい多くすればいいのでしょうか。

調べてみると、CPU数 + 1がいいよ、みたいな意見を見ましたが、これにはまったく根拠がありません。+1ってなんだよ、と。そこで、ちゃんと考えてみることにしました。

# 算出方法

## モデル

1リクエストをアプリケーションが処理する際の流れを超単純化し、次のようなものとします。

(I/O: r[msec]) -> (Computing: t[msec])

はじめに r[msec] かかるI/Oバウンドな処理があり(この間CPUは一切使用しない)、それが終わったら t[msec] かかるCPUバウンドな処理があるという。

## 計算式

ワーカー数が最適なときは、次のような等式が成り立っているはずです。

> (単位時間あたり、I/O処理が終わってCPU処理に入る数) = (単位時間あたり、CPU処理が終わって次のリクエストを処理し始める数)

実効ワーカー数をN, CPU数をn, I/O処理にかかる時間を r, CPU処理にかかる時間をt, 単位時間をTとおくと、次のような式が成り立つはずです。

```math
(N - n) \times \frac{T}{r} = n \times \frac{T}{t}
```

(N-n)個のワーカーがI/O処理を行っており、n個のワーカーがCPUを使っています。ワーカーを増やせば増やすほど単位時間あたりI/O処理が終わるリクエストが多くなりますが、CPU処理が終わるリクエストの数はCPU数にのみ依存しています。

## 実例

平均30msecでレスポンスを返してくれる外部APIに依存するAPIサーバーに対して負荷試験を行った結果として、5まではワーカー数を増やしても性能が向上するがそれ以上増やしても変化がないという結果が得られました。この数字をさきほどの式にあてはめると、 t=20msec というありそうな数字に。その後実際に計測してみたところ、割と近い数字に。

むやみにワーカー数を増やしても、CPUを使う処理を早くしないと意味がないという結論が得られました。

# 注意
もちろんこれまで述べたことはCPUを使うプロセスはすべてUnicornのワーカープロセスである、という想定に基づいたものです。実際にはOSやらデーモンプロセスやらもCPUを使用していますが、それらの影響は軽微であり無視して良いという切り捨てを行いました。
AWSのS３のデータを集計する

S3は簡単に言うとAWSのクラウドストレージサービスであり、大量にデータを保存することができます。

・Amazon S3 とは何ですか？　http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/Welcome.html

今回S３上のデータを集計してグラフにして表示する必要があったため、それについてのスクリプトについて説明します。

作業環境:
macOS Sierra バージョン10.12.5
Python 2.7.10

#boto
まずPythonからAWSにアクセスするためにbotoを使う必要があります。
最新バージョンはboto3なのでboto3をインストール。

```
$ pip install boto3
```

boto3をインストールしてPythonにインポートしたあと、以下のようにしてS3にアクセスします。さらに取ってきたいバケットの名前を指定してデータを取ってきます。

```Python 
import boto3

s3_resource = boto3.resource('s3')
bucket = s3_resource.Bucket('bucket_name')
```

バケットの中にもたくさんデータがあるので、取ってきたいオブジェクトがある場合はfilterで指定します。全部必要な場合はallで取ってきます。

```Python
obj = bucket.objects.filter(Prefix='filter_word')
obj = bucket.objects.all()
```
オブジェクトのデータをダウンロードします。Filenameはローカルで保存するときの名前です。拡張子はS3に置いてあるファイルと同じにします。

```Python
bucket.download_file(Key=obj.key, Filename='file_name')
```
これでS３のデータがダウンロードできました。あとはファイルオープンし、データの形式に従ってリストや辞書を使って集計していきます。

#グラフ化
次に集計したデータをグラフ化します。集計したデータは以下のような形式でテキストファイルとして保存しています。時間ごとに名前１〜６のその時の数値を記録しています。

```
時間1
名前1:数値1-1
名前2:数値1-2
名前3:数値1-3
名前4:数値1-4
名前5:数値1-5
名前6:数値1-6
時間2
名前1:数値2-1
名前2:数値2-2
名前3:数値2-3
名前4:数値2-4
名前5:数値2-5
名前6:数値2-6
時間3
・・・・・・・・・
・・・・・・・・
・・・・・・・
・・・・・
```

これをグラフ化するのにPandasとmatplotlibを使います。PandasはPyhtonでデータを扱いやすくしてくれるライブラリです。データフレーム形式にすることで簡単にグラフを作成することができます。matplotlibはグラフを描画するのに使います。どちらもpipでインストールしてきます。

データフレームは直接代入しても作れますが、辞書からも作成できるので辞書を作成してからデータフレーム形式にします。集計データのテキストファイルを開き辞書を作り、キーに名前、値に数値をリストにして入れていきます。入力し終わったらデータフレーム形式にしてグラフを作成します。

```Python
import pandas as pd

with open('data.txt')as f:
    line = f.readline()
    while line:
        results = line.rstrip()
        if ':' in results:
            data = results.split(':')
            results_dict[data[0]].append(int(data[1]))
        line=f.readline()

#辞書をデータフレームにする
my_df = pd.DataFrame.from_dict(results_dict)
#グラフの作成
my_df.plot(title='graph_title')
```




これでグラフが作成できました。最後にmatplotlibを使って表示します。

```Python
import matplotlib.pyplot as plt

plt.show()
```

#その他
もっとお洒落なグラフを作成するのにseabornというライブラリが使えます。
公式ページにいろんなグラフと使い方が載っています。
https://seaborn.pydata.org/examples/index.html
超簡単にVue.jsで非同期通信で取得したコンテンツをサーバサイドレンダリング(SSR)してみる

今回はnodeサーバーもVuexもNuxt.jsも使いません。
細かい所いろいろ抜けてる気がするけどとりあえずこんな感じでできるのかという検証途中のメモ代わりに。
非同期通信で取得したコンテンツをコマンドライン上でSSRで描画するまで(今回はルーティングなしの単一ページのみ)
Vueは初心者なのでもしかしたら結構悪い例かも。

## Webpackの設定

```webpack.config.js
const webpack = require("webpack");
module.exports = [{
  target: 'node',
  context: __dirname + '/source',
  entry: {
    'application': './es2015/application',
  },
  output: {
    path: __dirname + '/distribution/javascript',
    filename: 'bundle.js'
  },
  module: {
    loaders: [
     {
       test: /\.vue$/,
       loader: 'vue-loader',
       exclude: /node_modules/
     },
     { 
       test: /\.js$/, 
       exclude: /node_modules/, 
       loader: "babel-loader", 
       query:{
         presets: ['es2015']
       } 
     }
    ]
  },
}];

```

## 実行ソース

```store.js
// 今回はaxiosを利用
import axios from 'axios';
// storeオブジェクト、公式ではVuexが推奨されているっぽい。
export default {
	items: [],
	prefetch() {
		var store = this;
		//promiseを返す
		//{ items: [ 'foo', 'bar', 'baz' ] }が帰ってくるURL
		return axios.get('http://XXXXXXX.com/items')
		.then(res => {
			store.items = res.data.items;
		});
	}
} 
```

```list.vue
<template>
  <ul>
    <li v-for="item in items">{{item}}</li>
  </ul>
</template>

<script>
import store from './store'; 
export default {
  data() { return store; }
  }
</script>


```


```application.js
import Vue from 'vue'
import list from './list.vue';
import store from './store'; 

const app = new Vue({
	render: h => h(list)
});

const renderer = require('vue-server-renderer').createRenderer();

//storeオブジェクトにjsonを格納後、レンダリングを実行。
store.prefetch()
.then(()=>{
	renderer.renderToString(app, (err, html) => {
		if (err) throw err
			console.log(`<!DOCTYPE html>
				<html lang="ja">
				<head><title>Hello</title></head>
				<body>
				${html}
				</body>
				</html>`)
	})
});
```

```
#build実行
webpack
#実行
node bundle.js

#実行結果
<!DOCTYPE html>
<html lang="ja">
<head><title>Hello</title></head>
<body>
    <ul data-server-rendered="true"><li>foo</li><li>bar</li><li>baz</li></ul>
</body>
</html>
```


## 所感まとめ
- 当然だけど非同期通信で取得するコンテンツについてはレンダリング実行前にプリフェッチしておく必要があるみたい。
  - たったこれだけでもサンプルソース少なくて意外とハマった。
- 最近はSSR不要論とかも聞くようになってきたけどTwitterカードやはてなブックマークは未対応なのでまだまだSPAオンリーというわけには行かないのかなぁという印象。
  - ただがっつりSSRやるってなると結構工数や考慮点が重くなりそうなので正直個人開発とかの範囲ではあんまりやりたくはない。


## 参考
ちゃんとSSRやりたい場合はこの辺参照

- https://ssr.vuejs.org/ja/
- https://ja.nuxtjs.org/
[クイズ]javascriptと仲良くなるための一歩　第２９話「nullでcreate２」

#問題


```js
var obj = {}
obj //=> {}
typeof obj //=> "object"
obj instanceof Object //=> ?
var obj = Object.create(null)
obj //=> {}
typeof obj //=> "object"
obj instanceof Object //=> ?
```

:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:
:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:

#答え

なんで？:hugging_face:

```js
var obj = {}
obj //=> {}
typeof obj //=> "object"
obj instanceof Object //=> true
var obj = Object.create(null)
obj //=> {}
typeof obj //=> "object"
obj instanceof Object //=> false
```
Vivaldiブラウザで、Webページ全体の長ーいスクリーンショットを一瞬で撮る

# Vivaldi ブラウザとは？
元Opera創業者が開発した、ChromiumベースのWebブラウザです。Windows、Mac、Linux 向けに無料で提供されています。

特徴は、いろんなオプションが（拡張機能ではなく）ビルトインされているところ。スクリーンショット撮影もそのひとつです。

# スクリーンショット撮影の仕方
ブラウザ画面最下部右側の、カメラボタンをクリックし、必要に応じて以下項目を設定

* 撮影範囲を、[ページ全体] または [選択範囲]
* 保存形式を、[PNG] または [JPEG] または [クリップボード]

そして、[ページキャプチャ] ボタンを押下

<img width="1171" alt="Vivaldi_Browser___Fast___Flexible_Web_Browser.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/4584/09380942-6cb7-0ef8-b220-648ff6c3b257.jpeg">

# あっという間にこんな長ーいスクリーンショットが撮影できます
<img height="552" alt="1f707c9e-b8a6-4559-ad56-917d326616f7_png.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/4584/cffa75a9-5bfb-c87e-316e-fbbb5e51f9eb.jpeg">

一部のスクリーンショット撮影用のChrome拡張機能と違って、不要なスクロールバーなども残りません。

Vivaldi、まずはスクショ撮影専用ブラウザとして使ってみるのはどうでしょう。
CSSでwebフォントの読み込みが遅い問題を改善する方法

##💀 Webフォントの問題点
Webフォントに限らず、ブラウザでテキストを表示する過程には、フォントの読み込み作業が存在します。また、フォントを読み終えるまではテキストを表示させない機能[^1]がブラウザには組み込まれています。
[^1]: FOIT(flash of invision text)

ローカル環境下のフォントであれば読み込みに時間はあまりかからないので問題ありませんが、webフォントの場合はローカルフォントと比べると読み込みに多くの時間を要してしまいます。
この機能の影響で、ページのロードをしてからテキストが表示されるまでの間、ユーザーはテキストを読むことができない為、不満や苛立ちを覚え、体験価値の低下やページの離脱を引き起こすと考えられます。

![従来の読み込み開始からの時間経過.png](https://qiita-image-store.s3.amazonaws.com/0/48027/53242488-4b57-e599-835f-2b6a0919652b.png)

##⚔️ 'font-display'プロパティでこの問題に立ち向かう

font-displayというCSSプロパティを用いることで、webフォントを読み終えるまではローカルフォントを代替的にロードし、テキストの表示に使用することができるようになります。これによってユーザーはいち早くテキストを目にすることができるようになります。

![font-display_swapを使用時の時間経過.png](https://qiita-image-store.s3.amazonaws.com/0/48027/2f8637f1-be1d-044e-3edb-90b675251e04.png)

この問題の従来までの改善方法はJavaScriptを記述しないと実現することはできませんでした。しかしながら、chrome49から追加、chrome60では正式採用された'font-display'プロパティを用いることで、ワンライナーでこの問題の対処をすることができます。

###📝 スタイルシートの記述方法
具体的には、下記のようにfont-faceに対して`font-display: swap`を指定することで、適応させることができます。

```css:css
@font-face {
  font-family: "font name";
  font-weight: 400;
  font-style: normal;
  src: url("fonFile.woff2") format("woff2");
  font-display: swap;
}
```

```css:css
p {
  font-family: "font name", sans-serif;
}
```

上記のスタイルを適応すると、webフォントが読み込まれるまでは一時的にsans-serifを読み込んだ上でテキストの表示に使用されます。  

###👀 font-displayの比較サンプル
<p data-height="500" data-theme-id="0" data-slug-hash="gxxgzB" data-default-tab="css,result" data-user="oreo" data-embed-version="2" data-pen-title="Test of 'font-display'" class="codepen">See the Pen <a href="https://codepen.io/oreo/pen/gxxgzB/">Test of 'font-display'</a> by oreo (<a href="https://codepen.io/oreo">@oreo</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>
[Test of 'font-display' | codepen.io](https://codepen.io/oreo/pen/gxxgzB)
(是非CodePenへアクセスし、リロードして確認してみてください)


##🙏🏻 終わりに
テストはgoogle fontsで行いましたが、google fontsは軽くて優秀過ぎたのであまり効果を実感できませんでした。
欧文フォントよりも、ファイルサイズの大きい日本語フォントであれば十分に真価を発揮するかと思います。

これから、よりwebフォントの使用の場が増えてくると思います。その中でユーザーの体験の質を低下させることを防ぐために、この'font-display'プロパティは大いに役に立つ存在になるはずです。現在はchrome60でしかサポートがされていませんが、対応ブラウザの増加を願ってやみません。将来的にwebフォントと一緒に使っていければと考えています。

##🔗 リンク
* can I use font-display
[https://caniuse.com/#search=font-display](https://caniuse.com/#search=font-display)

* `font-display` for the Masses | CSS TRICKS
[https://css-tricks.com/font-display-masses/](https://css-tricks.com/font-display-masses/)

* Test of fontDisplay | github.com
[https://github.com/ore0/cssTricks/tree/master/fontDisplay](https://github.com/ore0/cssTricks/tree/master/fontDisplay)
npm run で ビルドしたとき ReferenceError: Unknown plugin "transform-runtime" が消えなくなった話

#ReferenceError: Unknown plugin "transform-runtime"
ある日、vueのプロジェクトで npm run build とかlaravelのプロジェクトで npm run dev　とかができなくなりました。
ぐぐってもいまいち解決しなくてめっちゃ悩んだんですけど、なんにせよwebpack周りがおかしい。
最終的に新規にプロジェクト作ってビルドしてもだめでこれはプロジェクトの外がおかしいぞということで原因がわかりました。

##読むべきデバックログ

>Module build failed: ReferenceError: Unknown plugin "transform-runtime" specified in "/Users/riin/workspace/.babelrc" at 0, attempted to resolve relative to "/Users/riin/workspace"

うん。 ReferenceError: Unknown plugin "transform-runtime" が解決できないんだ。
ぐぐって出てくるissueとかに書いてあること試しても解決しないし。

>specified in /Users/riin/workspace/.babelrc

**ん？**
***そんなところにプロジェクトねーぞ？！***

>% ll -a ~/workspace
total 120
drwxr-xr-x  23 riin  staff    782  8 15 16:46 ./
drwxr-xr-x+ 64 riin  staff   2176  8 15 17:00 ../
-rw-r--r--@  1 riin  staff  32772  8 15 16:59 .DS_Store
-rw-r--r--   1 riin  staff    312  7 25 21:58 .babelrc
-rw-r--r--   1 riin  staff    147  7 25 21:58 .editorconfig
-rw-r--r--   1 riin  staff     23  7 25 21:58 .eslintignore
-rw-r--r--   1 riin  staff    642  7 25 21:58 .eslintrc.js
-rw-r--r--   1 riin  staff    145  7 25 21:58 .gitignore
drwxr-xr-x   7 riin  staff    238  7 30 19:04 .idea/
-rw-r--r--   1 riin  staff    197  7 25 21:58 .postcssrc.js
drwxr-xr-x  26 riin  staff   884  8 15 13:56 laratest/
(他プロジェクトのディレクトリが続く...)

*な なにをする きさまらー！*

##原因と解決法
原因はプロジェクトのディレクトリの上で npm install をうっかり実行してしまっただかで
node_modulesと一緒に.babelrc　を含む関係のないファイルが生成されてしまったため。
node_modulesは消したものの、隠しファイルの存在に気づかず、消し忘れていた模様。

そやつらを抹殺してやれば自分の場合は解決しました。
疑ってごめんよlaravel-mixさん。
チーム開発を各々のDBを使って作業する





覚書です。
チーム開発をしているとmigration fileにチームで作業しているそれぞれの人の変更が反映されてしまい、どこが自分の変更したところか分かりづらいということがあったので、チームそれぞれの人で使用するDBを自分のlocalに変更することにしました。




```database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: <%= ENV['DB_USERNAME'] %>
  password: <%= ENV['DB_PASSWORD'] %>
  port: 3306

development:
  <<: *default
  host: <%= ENV['DB_HOST'] %>
  database:
```
 
 チーム開発している時はこちらの`ENV`で書かれている部分を、チームで使用している`username`と`password`,`host`を設定していますが、今回はDBを各個人のlocalのものに変更したいので、ここに自分が使っているDBの`username`と`password`,`host`を設定します。
 
## どうやって自分のDB設定を調べるか？
 
 terminalからmysqlに入ります。
 `mysql -u root`
 
 mysqlに入ることができたら
 `mysql> select Host, User from mysql.user;`
 
```
 mysql> select Host, User from mysql.user;
+--------------------------------+-----------+
| Host                           | User      |
+--------------------------------+-----------+
|                                | root      |
| ::1                            | root      |
| localhost                      |           |
| localhost                      | mysql.sys |
| localhost                      | root      |
|                                |           |
|                                | root      |
+--------------------------------+-----------+
7 rows in set (0.00 sec)
```


このように表示されたら、`host`、`username`をそれぞれ確認することができました。
`password`は自分で設定したものになります。
`password`を忘れてしまったらhttp://qiita.com/is0me/items/91a0af0342c307b94a16

以上の3つを取得することができたら`.env`ファイルにそれぞれ設定し直します。

```.env
DB_USERNAME = "root"
DB_PASSWORD = "hogehuga"
DB_HOST = "localhost"
```



`bundle exec rake db:migrate`
最後にmigrateして自分のlocalに移動させます


これで各々のDBで作業できるようになると思います。

自分はこの後にroot.userの権限がなかったりなどの問題がありました…
その際に参考したのはこちら
http://qiita.com/harada4atsushi/items/a36d26c798967e1f2cd9
http://www.goofoo.jp/2011/11/1457

以上です！
macのメニューバーにIPアドレスを表示させる

macのメニューバー（右上）にIPアドレスを表示させる方法の紹介です。
自分がいまどのネットワークに繋がってるのか一目でわかります。

<img width="400" alt="スクリーンショット 2017-08-15 17.40.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/158680/9ff21c84-2e26-ca9b-8af3-f07cda7d00c6.png">


### インストール
 
```
$ brew cask install ip-in-menu-bar
```

### 自動起動設定

環境設定の「ユーザーとグループ」から、
ip-in-menu-barをログイン時の起動アプリに追加する

<img width="500" alt="app自動起動設定mac.png" src="https://qiita-image-store.s3.amazonaws.com/0/158680/e61f5f06-a9b8-d8bc-70cb-e931ffcacbde.png">
配列のある範囲にあるマッチした要素の数を調べる Swift

# 配列のある範囲にあるマッチした要素の数を調べる swift

Swiftの配列はrange(for文で範囲指定するアレ)を使ってスライス(ある範囲の配列を取り出す)ことができる. 
そしてfilterでマッチする要素を取り出して
countで数える.
以下のコードでは配列arrの中の1番から6番までのindexの中の要素が3である個数を調べる

``` swift
let arr = [1,2,3,2,5,3,4,5,5,3,2,3]

let t = arr[1...6].filter({$0 == 3}).count
print(t)
```
output
```
2
```
ARKitで立方体の6面それぞれに異なるテクスチャを貼る方法[追記あり]

# はじめに

iOS11(beta)で登場したARKitで遊んでいます。ちょっとしたアイディアで面白いアプリができそうで楽しいです。

立方体の6面それぞれに別々のテクスチャを貼ろうとしたところ、検索しても明確な説明が見つからなかったので、簡単なコードを書いて実験してみました。

※この記事を描いてだいぶ経ってから、扱っている立体は〈立方体〉ではなく、〈直方体〉であることに気がつきました。タイトルまで変えると検索性が悪くなるので、本稿ではそのまま〈立方体〉で通しています。(2020/06/02 追記)

## 環境
- Xcode Version 9.0 beta 3 (9M174d)
- iOS11 beta 11.0(15A5341f)
- iPhone 6S(MKQW2J/A)

# 座標系について

地面に垂直に立って、カメラを正面に向けてiPhoneを保持しているとします。

アプリ起動時のiPhoneの位置が原点となり、自分から見て、左→右方向がX軸の正の方向、下→上方向がY軸の正の方向となります。Z軸は正面→背面方向が正の方向となりますので、気をつける必要があります。

このときiPhoneが傾いていたとしても、地面に対して垂直・水平が基準となって座標系が設定されます。この座標系はアプリ起動後に設置され、その後iPhoneの位置が移動しても、原点の位置と軸の方向は維持されます(これがARの面白いところ)。

長さの単位ですが、コード上の`1.0`が現実世界の1mに対応します。

# テクスチャの貼り方を試す

立方体の6面全てに同一のテクスチャを貼る場合は、以下のようにすれば済みます。

`cube.firstMaterial?.diffuse.contents = UIImage(named: "texture.png")`

6面それぞれに別のテクスチャを貼ろうとした場合は、ノードの`materials`プロパティに、テクスチャの配列を与えれば良いのですが、順番や向きがどうなるのかよくわからなかったので、シンプルなプログラムを書いて実験してみます。

図のような6面分のテクスチャを用意しました。

![six_textures_t.png](https://qiita-image-store.s3.amazonaws.com/0/56444/1db7a321-0cc6-0866-abd6-09e77dd4dd8e.png)

## コード

幅10cm、高さ20cm、奥行き30cmの立方体を作成し、テクスチャを貼り付けます。辺の長さを変えているのは、面の対応関係がわかりやすいようにです。

```swift:GameScene.swift
    func makeCube() {
        // 幅10cm、高さ20cm、奥行き30cmの立方体を作成
        let cube = SCNBox(width: 0.1, height: 0.2, length: 0.3, chamferRadius: 0)
        let cubeNode = SCNNode(geometry: cube)
        
        // 6面、別々のテクスチャを貼る
        let m1 = SCNMaterial()
        let m2 = SCNMaterial()
        let m3 = SCNMaterial()
        let m4 = SCNMaterial()
        let m5 = SCNMaterial()
        let m6 = SCNMaterial()
        
        m1.diffuse.contents = UIImage(named: "texture_1.png")
        m2.diffuse.contents = UIImage(named: "texture_2.png")
        m3.diffuse.contents = UIImage(named: "texture_3.png")
        m4.diffuse.contents = UIImage(named: "texture_4.png")
        m5.diffuse.contents = UIImage(named: "texture_5.png")
        m6.diffuse.contents = UIImage(named: "texture_6.png")
        
        cube.materials = [m1, m2, m3, m4, m5, m6]
        
        // 初期位置の指定: 50cm画面奥、10cm上方に配置
        cubeNode.position = SCNVector3Make(0, 0.1, -0.5)
        
        self.rootNode.addChildNode(cubeNode)
    }
```

## 結果

このようにテクスチャが貼られます。

手前から見たとき、つまり原点側からZ軸マイナス方向に見たときの画像です。
<img width="375" alt="IMG_0036.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/56444/b119e69b-ed71-a546-eecd-c96e0ee8defa.png">

手前側で3つの線分が直交している点が原点で、赤がX軸、緑がY軸、青がZ軸です。
やや上から見下ろしているので、立方体は1,2,5の面が見えます。

奥から振り返って見たとき、つまりZ軸マイナス方向から原点方向を見たときの画像です。
<img width="375" alt="IMG_0037.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/56444/25763c26-3690-f1b2-6695-b0be478ab504.png">

画面奥に原点があり、X軸、Y軸、Z軸が直交しています。
やや下から見上げているので、立方体は、3,4,6の面が見えます。

展開図にしてみるとこんな配置となります。

![textures_development.png](https://qiita-image-store.s3.amazonaws.com/0/56444/4269b7ac-4eca-2aa6-7a34-d6464a1ebcf7.png)

# おわりに

Qiitaに記事を書くのは初めてです。

初歩的な事ですが、自分がわからなかったことがわかったとき、それを共有することで、どこかの誰かに役立てば嬉しいことです。

ARKitはいじっていてわくわくします。簡単なアプリを作って、app storeで公開することを目標にしています。
Swift で NextTrain 形式 (TBL 形式) をパースしてみた

## NextTrain形式

私が以前作成したWebアプリの「次のバスの発車時刻を表示・カウントダウンする HTML & Javascript の Webアプリ」http://qiita.com/ynomura/items/a406c9148fac3c7fc1e2　
では、独自のデータ形式を使用しておりましたが、広く使われているのは NextTrain形式(TBL形式) というもののようです。
http://office.toyolab.com/nexttrain/
ということで、上記のソースを TBL形式に対応しました。
さらに、iOS ネイティブアプリも視野に入れて、Swift でも書いてみようと思い立った。

## Swift 3.0 でパースしてみる

この形式はテキストデータなので、これをテーブルデータにパースする処理を Swift で書いて見た。
使用環境は X-Code の Playground で、TBL形式データは外から読み込むのではなく、テスト用に行データの配列にしている。

## ソース

実際のTBLデータは高機能で、備考など豊富なのだが、とりあえず、タイトル行（駅や路線名）と時刻データのみ処理するようにしている。
行き先や発駅などの備考データは読み飛ばすようにしている。

```Swift:tblperce.swift
var inTbl = [ "# 盛岡",
             "e:A",
             "f:B",
             "8: 10 ef20 30 40 50",
             "9: 15 25 35 45 55",
             "10: 20 30 50",
             "23: 15 25 30" ]
var stName = ""
var bTbl:[Int] = []
var temp:[String] = []
var hh = ""
var mms:[String] = []
var mins:[String] = []

for rowData in inTbl {
    if rowData[rowData.startIndex] == "#" {
        stName = rowData.substring(from: rowData.index(rowData.startIndex, offsetBy: 2))
    } else {
        temp = rowData.components(separatedBy: ":")
        hh = temp[0]
        if !hh.isEmpty {
            if "0"..."9" ~= hh[hh.startIndex] {
                mins = temp[1].components(separatedBy: " ")
                for eachMin in mins {
                    mms = eachMin.components(separatedBy: CharacterSet.decimalDigits.inverted)
                    for mm in mms {
                        if mm != "" {
                            bTbl.append(Int(hh)! * 100 + Int(mm)!)
                        }
                    }
                }
            }
            // 備考の処理はしない
        }
    }
}
print(stName, bTbl)

```
最後の print 文の結果は
```
盛岡 [810, 820, 830, 840, 850, 915, 925, 935, 945, 955, 1020, 1030, 1050, 2315, 2325, 2330]
```
で、うまくいっているようです。

Swift の勉強を始めたばかりで、これで良いのか自信がありませんので、厚かましいとは思いますが、先輩諸氏の指摘など歓迎します！
【VMplayer】CentOS7を起動する際のNICが認識されない

# 環境
　■ホスト
　　・Windows7 pro_SP1
　■仮想マシン
　　・CentOS 7.3.1611
　■ミドルウェア
　　・VMwarePlayer 6.0.7 build-2844087

# 事象
　・VMwareplayer上にCentOS7(64bit)の仮想マシンを構築したが，物理ネットワークが認識されていない。
　　※ループバックは存在する。

# 原因
　・CentOS7からの仕様変更によるもの。

# 対応
　・「ネットワークと共有センター」＞「アダプターの設定の変更」を表示する。
　　⇒「VMware Bridge Protocol」のチェックが無いことを確認する。

　・対象のマシンのvmxファイルに，下記の文字列を追記する。
　　ethernet0.virtualDev = "e1000"

　・追記後，仮想マシンを起動する。
OpenCVでリアルタイムエッジ検出する

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

#### Raspberry Pi

[python開発環境構築](http://qiita.com/msrks/items/f4489c553fb2492f6616)を参照

#### Windows

[anacondaでtensorflowとopencv導入](http://qiita.com/msrks/items/a9f6fca9085977c0d1af)

#### mac

```bash:systemにいれる場合(opencv2)
$ brew install gcc
$ brew install cmake
$ brew install tesseract
$ brew tap homebrew/science
$ brew install opencv
$ ln -s /usr/local/Cellar/opencv/2.4.13.2/lib/python2.7/site-packages/cv2.so /Users/riki/.pyenv/versions/ML-2.7.13/lib/python2.7/site-packages/
```

```bash:anacondaを使って入れる場合(opencv3)
$ pyenv install anaconda3-4.1.1
$ cd <workspace with opencv3>
$ pyenv local anaconda3-4.1.1
$ conda install -c https://conda.anaconda.org/menpo opencv3
$ conda update hdf5
```

## 2. スクリプトの作成

opencvの[canny edge detection](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_canny/py_canny.html)を使う。

```edge-detection.py
import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    ret, frame = cap.read()
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    frame =  cv2.Canny(frame, threshold1 = 100, threshold2=300)
    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
```

<img width="700" alt="スクリーンショット 2017-08-15 16.58.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/158680/e76861aa-466b-6cb9-7b22-d2e29fb52adf.png">
Square APIをはじめてみよう

Square APIを試すのは簡単です。まず開発者ポータルにログインします。[Square APIのサイト](https://squareup.com/jp/developers)から開発者ポータルに入れます。

![Screenshot_ 2017-08-15 16.54.08.png](https://qiita-image-store.s3.amazonaws.com/0/197026/a787342d-3283-0651-b797-5fe1cc1231ff.png)

ログインするとアプリケーションダッシュボードが表示されます。最初はNew Applicationをクリックします。

![Screenshot_ 2017-08-15 16.54.34.png](https://qiita-image-store.s3.amazonaws.com/0/197026/c008b95a-39bd-74f6-af7d-a9147b0561c1.png)

新しいアプリケーションができると、認証情報としてアプリケーションIDとパーソナルアクセストークンが表示されます。これはどちらも重要な情報なので取り扱いに注意してください。

![Screenshot_ 2017-08-15 16.55.10.png](https://qiita-image-store.s3.amazonaws.com/0/197026/86b38911-bd7c-82d8-d928-219106b6479e.png)

と同時にサンドボックス用のアプリケーションIDとアクセストークンも作成されます。このサンドボックスと言う環境はAPIのテスト環境になります。ここで決済を行ったとしても課金される訳ではありませんのでAPIを試用するのにぴったりな環境です。このサンドボックスは v2 のみに対して提供されるのでご注意ください。

ではまずこのサンドボックス環境を使ってAPIを呼んでみることにしましょう。今回はRubyを使います。

開発者ドキュメントによると [unirest](http://unirest.io) というライブラリを使うのが推奨されています。 unirest はHTTPアクセスを容易にしてくれるライブラリで、RubyだけでなくPython/Node/PHP/Java/Objective-C/.NET/Windows 8などで利用できるようになっています。共通した使い勝手なので、別な言語に乗り換えた時にもすぐに使いこなせるでしょう。

まずunirestをインストールします。コマンドラインで行います。

```
$ gem install unirest
```

そしてテストコードは次のようになります。 `YOUR_SANDBOX_ACCESS_TOKEN` と書かれている部分はサンドボックス環境のアクセストークンを記述してください。

```
require 'unirest'

access_token = 'YOUR_SANDBOX_ACCESS_TOKEN'

response = Unirest.get 'https://connect.squareup.com/v2/locations', 
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer ' + access_token
  }

puts response.body
```

上記内容を squre.rb として保存します。

今回は[Location API](https://docs.connect.squareup.com/api/connect/v2#endpoint-listlocations)を試します。これは店舗などの拠点情報が得られるAPIです。

実行すると、下記のように結果が表示されます。

```
$ ruby squre.rb 
{
  "locations"=>[
    {
      "id"=>"CBASEJqRSQmT1vVfMXar4RcrtCcgAQ",
      "name"=>"ヤマモト 東京",
      "address"=>{
        "address_line_1"=>"中　１丁目",
        "locality"=>"東京都",
        "administrative_district_level_1"=>"国立市",
        "postal_code"=>"186-0004",
        "country"=>"JP"
      },
      "timezone"=>"Asia/Tokyo",
      "capabilities"=>[
        "CREDIT_CARD_PROCESSING"
      ],
      "status"=>"ACTIVE"
    }
  ]
}
```

拠点の一つであるヤマモト 東京（これはサンドボックス環境なのでデモデータです）のデータが得られました。

このようにAPIを使うことでSquareから簡単にデータを取り出したり、逆にデータの登録もできるようになっています。ドキュメントは[Square Connect API Documentation](https://docs.connect.squareup.com/api/connect/v2)にありますので実装時にはぜひお読みください。
Raspberry Piに Python開発環境を構築する

pyenvを使ってもいいが、ラズパイでそんなにたくさんの環境が必要にはならないと思われるので、下の方が簡単。

```
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install git gcc make openssl python-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 python-numpy python-scipy python-matplotlib
```

[option] opencv

```
$ sudo apt-get update
$ sudo apt-get install -y libopencv-dev
$ sudo apt-get install -y python-opencv
```
Set proxy with Shadowsocks and Privoxy in Debian

# Why this?

You know.

# How?

## 0x00 Configure Server

Set a server to run shadowsocks as server.

Refer: https://shadowsocks.org/en/download/servers.html

## 0x01 Install Client

Install the shadowsocks client

```
pip install shadowsocks
```

## 0x02 Open Listener

Save this as a shell, and call it to open listener. 

```
#!/bin/sh

echo prepare open shadowsocks client on localhost...

sslocal -s [SERVER-IP] -p [SERVER-PORT] -l [LOCAL-PORT] -k"[PASSWORD]" -t 600 -m [METHOD(rc4-md5, etc.)] &

echo over
```

Delimiter: You have to use `ps aux|grep sslocal` to find pid to kill!

## 0x03 Install Privoxy

```
apt-get install privoxy -y
```

## 0x04 Config Privoxy

Edit `/etc/privoxy/config` to make sure that:

```
listen-address 127.0.0.1:8118
forward-socks5 / 127.0.0.1:[LOCAL-PORT] .
```

Then start the service.

```
/etc/init.d/privoxy start
```

## 0x05 Usage

The terminal proxy export command:

```
export http_proxy='http://127.0.0.1:8118'
export https_proxy='http://127.0.0.1:8118'
export no_proxy=localhost
```

Add this to `~/.bashrc` and so on, you can make an easy way.

## 0x06 Test

Run something such as curl to test!
【PostgreSQL】UPDATEで時間/日付を加算するSQL

個人的なメモ

1秒加算

```
$ UPDATE table_name SET "column_name" = ("column_name" + INTERVAL '1 SECOND') where 条件;
```

1日加算

```
$ UPDATE table_name SET "column_name" = ("column_name" + INTERVAL '1 DAY') where 条件;
```

分だとMINUTE、時間だとHOUR、一週間だとWEEK
減算だと `("column_name" - INTERVAL '1 SECOND')` にするだけ
~>  rails 5.1.0 で acts-as-taggable-on を利用している時に super: no superclass method `quote_value' がでる場合の対処法

[このブログ](http://tackeyy.com/)はrailsで動かしているのですが、ちょっとrailsを最新にしてみようと思い立って作業をしてみたところ、
acts-as-taggable-on で super: no superclass method `quote_value' が出てしまいました。

acts-as-taggable-onのmasterブランチを参照することでこの問題は解消できます。
https://github.com/mbleigh/acts-as-taggable-on/issues/808#issuecomment-318495139

1.Gemfileを修正する

```
-gem 'acts-as-taggable-on', '~> 4.0'
 +gem 'acts-as-taggable-on', github: 'mbleigh/acts-as-taggable-on', branch: 'master'
```

2.bundle install

acts-as-taggable-onのVersion 3.5.0はmysqlのアダプターが入ったようなので、 ` rake acts_as_taggable_on_engine:install:migrations ` をしたあとに ` bundle exec rake db:migrate ` を実行してください、

```
Bundle complete! 78 Gemfile dependencies, 202 gems now installed.
Gems in the group production were not installed.
Bundled gems are installed into ./vendor/bundle.
Post-install message from acts-as-taggable-on:
When upgrading

Re-run the migrations generator

    rake acts_as_taggable_on_engine:install:migrations

This will create any new migrations and skip existing ones
Version 3.5.0 has a migration for mysql adapter
```
---

railsのバージョンアップにともなって修正したファイルは以下の通りです。

https://github.com/tackeyy/blog/pull/15/files
webpack 4入門：スタイルシート(CSSやSass)を取り込む方法

この記事は大幅に加筆して「[最新版で学ぶwebpack 4入門 \- スタイルシート\(CSSやSass\)を取り込む方法 \- ICS MEDIA](https://ics.media/entry/17376)」に引っ越しました。

<a href="https://ics.media/entry/17376"><img src="https://ics.media/wp-content/uploads/2018/03/180305_webpack_eyecatch.png" /></a>

上記の記事ではwebpack+CSSの手順を網羅的に解説しています。


- CSSのバンドル方法
- Sassのバンドル方法
- Sass内の画像もバンドルする方法
- 容量の閾値で画像のバンドルを制御する方法
- webpack 4でExtractTextPluginを利用する方法(webpackでCSSファイルとして書き出す方法)

※Google検索等で訪れた方がリンク切れになると申し訳ないので、このページは残しておきます。
sshを切っても動くデーモンをnohupで簡単につくる

nohupというunixコマンドを使えば、ssh接続を切った時に発生するHUPをトリガーにprocessがkillされることを防げる。

## 基本的な使い方

&を使ってバックグラウンド実行させる

```
(ssh)$ nohup [command] > log.txt &
(ssh)$ exit
```

## ログをとらない時

入力と出力を明記する

```
(ssh)$ nohup [command] < /dev/null 2>&1 /dev/null &
(ssh)$ exit
```

入力： < /dev/null (null。つまり何もなし)
出力：2>&1 /dev/null (標準出力、標準エラー出力共にnullに。つまり何もなし)
acts-as-taggable-onの大文字、小文字検索について

#acts-as-taggable-onでのタグ処理について
[acts-as-taggable-on](https://github.com/mbleigh/acts-as-taggable-on)
でのタグ付けで、大文字でタグを付けた時に、検索で表示されなかった。
その時の解決方法。

##どのような症状か

例えばAというコンテンツに　`IMPORTANT` というタグを付けたとする。
`IMPORTANT`と付けられたタグ一覧のコンテンツを取得するため

```rb
contents = Content.tagged_with("IMPORTANT")
```

と記述したが、　どうしても結果がnilになってしまう。

##原因
発行されているSQLをよくみると

```sql
(SELECT `tags`.`id` FROM `tags` WHERE `tags`.`name` LIKE 'important' ESCAPE '!')
```

LIKE　検索が小文字になっていて、なおかつMySQLのBINARYがONになっているので、大文字、小文字を区別してしまうらしい。

##修正

[acts-as-taggable-on](https://github.com/mbleigh/acts-as-taggable-on)を見ていると

If you would like tags to be case-sensitive and not use LIKE queries for creation:

```
ActsAsTaggableOn.strict_case_match = true
```

→タグで大文字、小文字を区別するにはtrueにしてねとの事。

なので、初期設定を変えました。


`vim config/initializers/acts_as_taggable_on.rb`

```acts_as_taggable_on.rb
ActsAsTaggableOn.strict_case_match = true
```

これで再起動すると、ちゃんと大文字小文字を区別して検索されました。
RailsでCoffeeScriptを用いたときに起きた事件

とあるプロジェクトで `index.html.erb`のviewに、とあるイベントを効かせるためにCoffeeScriptを用いました。
そのときに起こったちょっとした事件です。

## 前提
今回は元あったアプリケーションの改修作業 & 新しい機能の追加等を行うというプロジェクトでした。
僕自身まだ新人でRailsの経験も浅いところ、新人の中でもRubyがまあまあできるということで入ったのですが、如何せんフロントの知識がほとんどない。
既存のコードを参考にしながら、先輩を質問攻めにして困らせながら何とか進めていました。
フロントが苦手でも以外と何とかなるもんでしたが。

## 過程
いつものように、指定のviewがロードされたときのイベントを作成しようとしていました。
まあ、簡単ですよね。

```
$(window).on 'load', 'viewに指定したclassまたはid', ->
  行いたい処理
```
以前にも先輩に質問をし、該当のソースコードを読み漁っていたので、当たり前のように書いて、当たり前のようにページをロードしました。
が、全く動かない。
最初はIDがおかしいものと思って何度も確認し書き換えましたが、それでもうまくいかない。
`console.log`で確認してみても、そもそも`console.log`の結果が出てこない。なぜだ。

ちなみに冒頭にも書いていますが、該当のviewは `index.html.erb`です。
ここに書くまでもないかもしれないですが、JSファイルは `app/assets/javascripts`に作成してます。ファイル名はviewに合わせて`index.js.coffee`にしていました。

試行錯誤して開発者コンソールを確認したところ、`index.js.coffee`この子が読み込まれていないことが発覚。最初は理由が全くわかりませんでした。。。

## 原因と結論
結論を言ってしまえば、`javascript`ディレクトリ内に同じ名前のファイルがあったことが原因でした。
しかも、僕が作成したものとは別に`index.js`というものが先に存在していたのです。

```
$ cd app/assets/javascripts
$ ls
=> index.js index.js.coffee
```
こんな感じ。

フロント & Railsの知識が乏しい僕には全くわからなかったのですが、いかに`.coffee`と書いてあろうと、同一ファイル名だと読み込めないようです。CoffeeScript自体がコンパイルされてから読み込まれるので

```
index.js.coffeeをコンパイル
↓
コンパイルされたindex.jsが読み込まれる
↓
元あったindex.jsが読み込まれ上書きされる

結果：せっかく作成したindex.js.coffeeが闇に葬られる
```
ということになるみたい。そりゃあ読み込まれんわなｗ

## 終わり
僕が作成したCoffeeScriptは泣く泣く削除して、元あったjsファイルに追記したら何事もなかったかのようにうまくいきました。
泣く泣くと言いつつもブラウザで変換してくれるツールを使いましたがね。
この子です http://js2.coffee/


JSのエラーは非常にわかりにくいです(僕の知識不足なだけかもしれません…)。
万が一`console.log`が表示されなかったら、上の現象を疑ってください。
同じ名前のファイルがあるかもしれません(設計をしっかりしましょう)。
Railsがんばろ。。。
Raspberry PiのGPIOを使って電子工作を楽しむ

ラズパイ3ではGPIOをpythonから操作するライブラリが標準で入っている

1. 準備：`import RPi.GPIO as GPIO`
2. モードの指定をする：`GPIO.setmode(GPIO.BOARD)`
    - GPIO.BOARD: 物理ピン番号（左上からの連番）
    - GPIO.BCM: 役割ピン番号（broadcomが命名しているもの）
3. ピンの設定：`GPIO.setup(channel, GPIO.out)`
    - GPIO.in: 入力
    - GPIO.out: 出力
4. ピンの操作：
    - GPIO.output(channel, GPIO.HIGH)
    - GPIO.output(channel, GPIO.LOW)
    - val = GPIO.input(channel)

<img width="600" alt="スクリーンショット 2017-07-15 17.41.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/158680/1223296d-51a6-9873-ea00-02d7766a6694.png">

## 例1: LEDチカチカ

```python:led-blink.py
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)
GPIO.setup(11, GPIO.OUT)

while True:
    GPIO.output(11, True)
    time.sleep(2)
    GPIO.output(11, False)
    time.sleep(2)
```

## 例2: ボタン入力を検出

```python:led-blink.py
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)

while True:
    input_state = GPIO.input(18)
    if input_state == False:
        print('Button Pressed')
        time.sleep(0.2)
```

<img width="400" alt="スクリーンショット 2017-07-15 17.41.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/158680/a8cb5e2c-01c1-f6e4-4027-75aa4df87879.png">
railsのサーバーで利用しているさくらVPSにmackerelを入れてみた

[このブログ](http://tackeyy.com/)はrailsをさくらVPSで動かしています。
今までサーバーの監視などはしていなかったのでmackerelを入れてみました。
AWS EC2などだと簡単に導入できるようですが、ちょっとつまずきかけたのでログを残します。

_この記事は個人ブログでも掲載しています。_
http://tackeyy.com/blog/how-to-introduce-mackerel-to-sakura-vps

ユーザー登録はトップページの右上からできます。

https://mackerel.io/ja/

# さくらVPSにmackerel-agentをインストールする

sshでサーバーにログインして以下のコマンドを実行します。

```
# まずMackerelのyumリポジトリを登録します
$ curl -fsSL https://mackerel.io/file/script/setup-yum.sh | sh

# その後、yumコマンドを用いてインストールできます
$ sudo yum install -y mackerel-agent

# エージェントのアップデートもyumコマンドから行えます
$ sudo yum update -y mackerel-agent

# 下のキャプチャのスタートガイド > 新規ホストの登録 > その他 Linux からAPIキーを確認できます
$ sudo mackerel-agent init -apikey="xxxxxxxxxxxxxxxx"

$ sudo /etc/init.d/mackerel-agent start
-> Starting mackerel-agent:                                   [  OK  ]
```

[![https://gyazo.com/3ec1aec42bca37de8f53d44e3c0ca230](https://i.gyazo.com/3ec1aec42bca37de8f53d44e3c0ca230.png)](https://gyazo.com/3ec1aec42bca37de8f53d44e3c0ca230)

mackerel-agentの起動までできれば、後はmackerelの画面から各種情報を確認できるようになります。

# 参考

https://mackerel.io/ja/docs/entry/howto/install-agent/rpm
Swiftの練習 Swift3 で文字列を整数に変換する方法

Swift3 で文字列を整数に変換する方法

~~~Swift3.swift
   let str = "12345"
   let num = Int(str)!

   print("num : \(num)")

   let yearStr = "ab3de"
   var nextYear = 0

   if let year = Int(yearStr) {
      nextYear = year + 1
      print("\(yearStr)年の翌年は\(nextYear)年")

   } else {
      print("変換できません")
   }
~~~

~~~Swift3.log
   num : 12345
   変換できません
~~~

失敗しました

それでは失敗しない方法

~~~Swift3.swift
   let str = "1984"
   let num = Int(str)!

   print("num : \(num)")

   let yearStr = str
   var nextYear = 0

   if let year = Int(yearStr) {
      nextYear = year + 1
      print("\(yearStr)年の翌年は\(nextYear)年")
   } else {
      print("変換できません")
   }
~~~

~~~Swift3.log
   num : 1984
   1984年の翌年は、1985年
~~~

#ちなみに

##String型のtoInt()メソッド

Swift1.xでは、「”12345″」といった整数を表す文字列を整数に変換する場合String型のtoInt()メソッドを使用しておりましたがSwift2.x以降ではtoInt()メソッドが廃止されました。

~~~Swift1.swift
   var str = "134"
   var num = str.toInt()
~~~

##Int()イニシャライザ

Swift2.x以降ではInt型のInt()イニシャライザを使用して文字列を整数に変換します。toStr()メソッドと同様に戻り値はオプショナル型なので、値を取り出すには変数/定数の後ろに「!」を記述してアンラップしています。

~~~Swift2.swift
   var str = "134"
   var num = Int(str)!
~~~

##オプショナルバインディング

値が「”ab3de”」のように整数値に変換できない場合は、実行時にエラーとなります。より安全にアンラップするには、例題にあげたようにオプショナルバインディングを使用するようにしましょう。

例題は、変数yearStrを整数に変換して1を足してnextYearに格納し「〜年の翌年は〜年です」と表示する。
変換できない場合には「変換できません」と表示する。
---


## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集
同じコマンドを複数並列実行する便利シェル関数

小ネタ。

``` sh
parallel () {
  if [ $# -lt 2 ]; then
    echo -e "Usage:\n  parallel <N> <command>"
    return 1
  fi
  seq $1 | xargs -I{} -P $@
}
```

`.bashrc` とか `.zshrc` とかにこれを書いておくと、

``` console
$ parallel 3 echo foo
foo
foo
foo
```

こんな感じで `parallel <並列数> <実行コマンド>` で同じコマンドを並列実行できて便利。

``` console
$ parallel 3 echo process_{}
process_1
process_3
process_2
```

さらに、実行コマンド内の `{}` は `seq` が生成したユニークな番号に置き換えられるので、これも何かに使えるかもしれない (並列実行なので順序はバラバラ)

## [追記] GNU Parallel
このエントリを書いた当時は知らなかったけど、GNU Parallel という便利コマンドがあってこちらの方が高性能。

https://qiita.com/PENGUINANA_/items/af27a833e835fe17f09b
CommonLispでXML読み込み（CXML、XPATH）


# CommonLispでXMLファイルを読み込みたい

読んでみました。
[Closure XML](https://common-lisp.net/project/cxml/)と[Plexippus XPath](https://common-lisp.net/project/plexippus-xpath/examples.html)を使用しています。

```cl:xmltest.lisp
; Closure XMLをロード
(ql:quickload :cxml)
(ql:quickload :cxml-stp)
; Plexippus XPathをロード
(ql:quickload :xpath)

(let (xml)
  ; XML読み込み
  (setf xml (cxml:parse-file "./test.xml" (stp:make-builder)))
  ; 文字列を取得
  (format t "string : ~A~%" (xpath:string-value (xpath:evaluate "/document/string" xml)))
  ; 数値を取得
  (format t "number : ~A~%" (xpath:number-value (xpath:evaluate "/document/number" xml)))
  ; 複数のノードを処理する
  (xpath:do-node-set
    (node (xpath:evaluate "/document/books/*" xml))
    (format t "book : name=>~A , price=>~A~%" 
            (xpath:string-value (xpath:evaluate "name" node))
            (xpath:string-value (xpath:evaluate "price" node)))))
```

```xml:test.xml
<?xml version="1.0"?>
<document>
  <string>foobar</string>
  <number>123</number>
  <books>
    <book>
      <name>foo</name>
      <price>1000</price>
    </book>
    <book>
      <name>bar</name>
      <price>500</price>
    </book>
  </books>
</document>
```

結果。

```shell-session
* (load "./xmltest.lisp")

;;; Checking for wide character support... WARNING: Lisp implementation doesn't use UTF-16, but accepts surrogate code points.
 yes, using code points.
To load "cxml":
  Load 1 ASDF system:
    cxml
; Loading "cxml"
;;; Checking for wide character support... WARNING: Lisp implementation doesn't use UTF-16, but accepts surrogate code points.
 yes, using code points.
;;; Building Closure with CHARACTER RUNES
.
To load "cxml-stp":
  Load 1 ASDF system:
    cxml-stp
; Loading "cxml-stp"
.......
To load "xpath":
  Load 1 ASDF system:
    xpath
; Loading "xpath"

string : foobar
number : 123
book : name=>foo , price=>1000
book : name=>bar , price=>500
T
*
```

xpath:boolean-valueの使い方はよくわかりませんでした。
動的にHTMLが変更されるコンテンツにTypeSquareを反映したい

## TypeSquare とは？

モリサワが提供しているWebフォントのクラウドサービス。
MORISAWA PASSPORTのライセンスとかもってても使える。

## 仕組み

Script要素を挿入しておくと、ページを読み込んだときにページ内に含まれる文字だけフォントをロードしてくる仕組み。

## 問題

必要な文字だけ読み込んでくれる仕組みがゆえに、
ページ読み込みよりも後に表示文字を含むHTMLを生成すると、その文字にWebフォントが適応されない。
(すでに読みこんでいる文字については適応されるので、場合よってはまばらな適応具合になる)

## 解決方法

[TypeSquare API](http://typesquare.com/service/api_reference/) を利用すればできる。

### Script要素のURI変える

```
<script type="text/javascript" src="//typesquare.com/accessor/script/typesquare.js?{ID}" charset="utf-8"></script>
```
↓ `apiscript` にする。

```
<script type="text/javascript" src="//typesquare.com/accessor/apiscript/typesquare.js?{ID}" charset="utf-8"></script>
```

### JavaScript API でロードさせる。

そうするとグローバルスコープに `Ts` オブジェクトが定義されるので、用意されたインターフェイスでTypeSquareに関する操作が可能になる。
たとえば、HTMLを `append` したあとなど、任意のタイミングでロードさせるには下記のメソッドを呼び出す。

```
Ts.reload();
```

### ロード時の挙動をパラメータで設定する

そのまま変えるだけだとロード時点で適応されなくなるので、自動で適応したければ下記のように `loadstart=1` とする。

```
<script type="text/javascript" src="//typesquare.com/accessor/apiscript/typesquare.js?{ID}&loadstart=1" charset="utf-8"></script>
```

## 参考

- [TypeScript JavaScript API](http://typesquare.com/service/api_reference/#box_api_reference_3)

他にも読み込みを監視したりいろいろできるようです。
git -rm でファイル削除を反映するとき複数のファイル全部を指定する方法

#ローカル上で削除したファイルを反映するには

例えばこんな状況

```bash
# ファイルを削除した後
$ git status
# On branch hogebranch
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       deleted:    hoge.erb
#       deleted:    hoge.erb1
#       deleted:    hoge.erb2
#       deleted:    hoge.erb3
#       deleted:    hoge.erb4
#       deleted:    hoge.erb5
#       deleted:    hoge.erb6

```
</font>
普段はrm を使って反映させます。

```bash
# ファイルを削除した後
$ git rm <ファイル名>
```
# ローカル上で削除した複数のファイルを一気に反映するには
**一気に削除したい** 場合

```bash
$ git add -u
$ git status
# -uを使ってステータスを確認すると色が変わって反映できることが分かります。
```

以上
C# LINQ 覚書

自分用に。

**2次元配列を1次元配列に**

```C#
int[,] array = { { 1, 2, }, { 3, 4 } };
var x = array.Cast<int>();
// {1, 2, 3, 4}
```
>[多次元配列を LINQ で簡単に扱おう - xin9le.net](http://blog.xin9le.net/entry/2016/02/17/003605)

**ジャグ配列を1次元配列に**

```C#
int[][] array = { new int[]{ 1, 2, }, new int[] { 3, 4 } };
var x = array.SelectMany(x => x).ToArray();
// {1, 2, 3, 4}
```
>[C# - C# のジャグ配列を1次元の配列に変換する方法を幾つか教えてください。C#(44909)｜teratail](https://teratail.com/questions/44909)
Raspberry Piを Mac上から開発する：ssh, vnc

スッキリとした環境で、ラズパイ開発したい人向けに情報共有。
以下、インターネットにつながる無線LAN環境があることを想定。

## 1. ラズパイのsshを有効にする

**この作業のみモニター・マウス・キーボードを接続**

ラズパイを起動して
・「スタートメニュー」->「Preferences」->「Raspberry Pi Configuration」
からsshを有効にする。完了したら電源を切る。

<img width="300" alt="スクリーンショット 2017-07-15 17.41.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/158680/802f4746-f16c-2c8e-5ac0-91bc85ad42d4.png">

**以降、モニター・マウス・キーボード全て不要。**

## 2. macからsshでラズパイを操作する

mac上で
・「システム環境設定」->「共有」->「インターネット共有」
で、外部接続は「wifi」相手コンピューターのポートを「有線LANポート」にする（下図）

<img width="400" alt="スクリーンショット 2017-07-13 20.16.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/158680/036690ad-fb4b-443f-1c48-d6b891875069.png">

macとラズパイをLANケーブルで直結して、ラズパイの電源を起動。
立ち上がったら、以下のコマンドでラズパイにsshで接続できる。

```bash:mac
#$ ssh -X pi@raspberrypi.local
$ ssh -X pi@192.168.2.2
```

## 3. macからGUIベースでラズパイを操作する（option）

```bash:rpi
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install tightvncserver
$ tightvncserver
```

macのFinderのメニューから「移動」->「サーバへ接続」で vnc://192.168.2.2:5901 に接続する。
Beagle bone black androidのビルド

2017.8.15現在
BeaglaBone BlackでAndroidを起動する

開発環境はWindows10(64bit)、virtualBox、ubuntu12.04(64bit)

手順
①JDKのダウンロード、実行権限付与、解凍、インストール
②カーネルコンパイルに必要なソフトのインストール
③カーネルソースのダウンロード、展開
④カーネルのビルド
⑤microSDに書き込む

①-1 JDKのダウンロード
[jdk-6u45-linux-x64.bin](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
)をダウンロードする
旧バージョンのためORACLEにアカウントを作る必要がある

①-2 実行権限付与
$ chmod a+x jdk-6u45-linux-x64.bin //実行権限を付与する

①-3 解凍
$ ./jdk-6u45-linux-x64.bin

①-4 インストール
\$sudo mkdir -p /usr/lib/jvm
\$sudo mv jdk1.6.0_45 /usr/lib/jvm/
\$sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk1.6.0_45/bin/java" 1
\$sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/lib/jvm/jdk1.6.0_45/bin/javac" 1
\$sudo update-alternatives --config java
\$sudo update-alternatives --config javac
\$java -version　//インストール出来たかどうか確認する
java version "1.6.0_45"
 Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
 Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)

②-1 カーネルコンパイルに必要なソフトのインストール
\$sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dri:i386 libgl1-mesa-dev g++-multilib mingw32 openjdk-6-jdk tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 minicom tftpd u-boot-tools expect libgl1-mesa-dri
\$sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so

③-1 カーネルソースのダウンロード
以下のサイトからダウンロードする
http://downloads.ti.com/sitara_android/esd/TI_Android_DevKit/TI_Android_JB_4_2_2_DevKit_4_1_1/exports/TI_Android_JB_4.2.2_DevKit_4.1.1.bin

③-2 展開
\$ ./TI_Android_JB_4.2.2_DevKit_4.1.1.bin
利用規約の確認画面が出るのでエンターを押し続け「I AGREE」と入力する。そうすると解凍が自動で始まる
私の好みよりフォルダ名をandroidに変更する。変えなくても問題ない

④-1 ツールチェインにパスを通す
\$export PATH=\$HOME/android/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin:$PATH

④-2 ブートローダのビルド
\$cd ~/android/u-boot
\$make CROSS_COMPILE=arm-eabi- distclean
\$make CROSS_COMPILE=arm-eabi- am335x_evm_config
\$make CROSS_COMPILE=arm-eabi-

④-3 カーネルのビルド
\$cd ~/android/kernel
\$make ARCH=arm CROSS_COMPILE=arm-eabi- distclean
\$make ARCH=arm CROSS_COMPILE=arm-eabi- am335x_evm_android_defconfig
\$make ARCH=arm CROSS_COMPILE=arm-eabi- uImage

④-4 ユーザランドのビルド
\$cd ~/android/hardware/ti/sgx
\$make TARGET_PRODUCT=beagleboneblack OMAPES=4.x ANDROID_ROOT_DIR=\$HOME/src-android
\$make TARGET_PRODUCT=beagleboneblack OMAPES=4.x ANDROID_ROOT_DIR=$HOME/src-android install

④-5 ユーザランドのパッケージ化
\$cd $HOME/android
\$make TARGET_PRODUCT=beagleboneblack fs_tarball

⑤maicroSDカードに書き込む
\$mkdir \$HOME/image-folder
\$cp \$HOME/android/kernel/arch/arm/boot/uImage \$HOME/image-folder
\$cp \$HOME/android/u-boot/MLO \$HOME/image-folder
\$cp \$HOME/android/u-boot/u-boot.img \$HOME/image-folder
\$cp \$HOME/android/external/ti_android_utilities/am335x/u-boot-env/uEnv_beagleboneblack.txt \$HOME/image-folder
\$cp \$HOME/android/out/target/product/beagleboneblack/rootfs.tar.bz2\$HOME/image-folder
\$cp \$HOME/android/external/ti_android_utilities/am335x/mk-mmc/mkmmc-android.sh 
\$LANG=C
\$sudo ./mkmmc-android.sh /dev/sde MLO u-boot.img uImage uEnv_beagleboneblack.txt rootfs.tar.bz2
Raspberry PiでDHCPサーバーを立てる

isc-dhcp-serverを使って構築します

## 1. サーバーに固定ipアドレスを設定

[こちらの手順で](http://qiita.com/msrks/items/d9b48996e65d7fbdf0e7)

## 2. isc-dhcp-serverのインストール

```
$ sudo apt-get install isc-dhcp-server
```

## 3. DHCPサーバーの設定

リースするアドレス体系の設定（dhcp.confを編集する）

```
$ sudo nano /etc/dhcp/dhcpd.conf
```

```dhcp.conf
# コメントアウト
#option domain-name "example.org";
#option domain-name-servers ns1.example.org, ns2.example.org;

# コメントを外す	
authoritative;

# dhcp-relayを動作させるためには自ネットワークと、
# アドレス付与ネットワークの両方について設定を記述する必要がある
# セミコロンを忘れないように注意！
subnet 202.0.0.0 netmask 255.255.255.0 {}
subnet 8.0.0.0 netmask 255.255.255.0 {
  range 8.0.0.2 8.0.0.254;
  option routers 8.0.0.1;
  option subnet-mask 255.255.255.0;
  default-lease-time 600;
  max-lease-time 7200;  
  # dns setting
  #
  #
}
```

インタフェースの設定

```
$ sudo nano /etc/default/isc-dhcp-server
```

```isc-dhcp-server
INTERFACES="eth0"
```

リース用ログファイルの作成

```
$ sudo touch /var/lib/dhcp/dhcpd.leases
```

リースアドレスのリセット

```
$ sudo rm /var/lib/dhcp/dhcpd.leases
$ sudo touch /var/lib/dhcp/dhcpd.leases
```

## 4. サービスの再起動・自動起動設定

```
$ sudo systemctl status isc-dhcp-server.service
$ sudo systemctl stop isc-dhcp-server.service
$ sudo systemctl start isc-dhcp-server.service
$ sudo systemctl enable isc-dhcp-server.service
```
Raspberry PiでIoTする時に便利なコマンド(自動化編)


# 定時実行
## cron

USBカメラの画像を定期的にサーバにアップロードするために使用
簡易的な監視カメラが簡単にできます。（サーバまでのセキュリティはsshで確保、観覧のためのセキュリティは別途考えてください。）
crontabの設定はこんな感じ

motionで拾ったカメラ画像のlatestのファイル名を1個だけ拾って1分置きにscpでサーバの/tmp/test.jpgとしてアップロードする

~~~
* * * * * ls -1t /tmp/motion/*.jpg | head -1 | xargs -i scp -i ~/.ssh/privatekey -P 22 {} user@domain:/tmp/test.jpg
~~~

上記同様だが10秒置きに実行したい場合

~~~
* * * * * for i in `seq 0 10 59`;do (sleep ${i}; ls -1t /tmp/motion/*.jpg | head -1 | xargs -i scp -i ~/.ssh/privatekey -P 22 {} user@domain:/tmp/test.jpg) & done;
~~~

ちなみにmotionはデフォルトでlastsnap.jpgというシンボリックリンクを/tmp/motionに置いてくれるので、下記で良いことがわかった

~~~
* * * * * for i in `seq 0 10 59`;do (sleep ${i}; scp -i ~/.ssh/privatekey -P 22 /tmp/motion/lastsnap.jpg  user@domain:/tmp/lastsnap.jpg) & done;
~~~


# コマンド自動応答
## expect

ラズパイからiRemocon Wi-Fiを制御しようと思った時に使用
iRemocon Wi-Fiは有線または無線LAN経由でのSocket通信によりデータを送受信します。そのため、コマンド送出→レスポンス受信→次のコマンド送出→レスポンス受信というシーケンスを繰り返すことになるため、ラズパイから制御する場合、expectが便利と判断しました。
ちなみに、iRemoconを有線LANで直接ラズパイに接続する場合は、ラズパイ側がDHCPサーバになる必要があります。

# トリガ実行

## incron

inotifyをcron風にして使いやすくした印象。
ファイルが置かれたあるいは更新された、削除されたことを契機にコマンドを実行できます。
motionによるカメラ画像もcronではなくこちらでも可能と思われます。
詳細の例は事情が有り書けないので上記キーワードで検索してみてください。

# 起動時コマンド実行・常駐化

## /etc/rc.local

rootで実行したい場合。gpioの制御など何にも考えなくて済む(と書いた後で調べたら最近のRaspbianはpiユーザでもgpioアクセス可能らしい)。一番簡単だけどセキュアじゃない方法。

## systemdに登録

Linuxの正統派。ちょっとめんどくさい。きちんとライフサイクルを考える必要あり。

# プロセスが死んでも再起動してくれるようにする

## forever

node.jsを使うときによく出てくるようだけど、それ以外でも利用可能(なはず)

## upstart

使ったことないけど設定が簡単そうです。
Java8の型キャストを綺麗に！

# Java8の型キャストを綺麗に！

タイトルのとおりです。私は Javaの旧来の型キャストの構文があまり好きではないです。
動的なデータ操作なのに謎の構文を使わないといけないところがね。C言語由来でしょうか？
こういうのは関数的に書きたいところ。
とりあえずまずは例から。下記のような 2通りの書き方があると思います。

```java
SomeClass instance = (SomeClass) anotherClassInstance;          // 1
SomeClass instance = SomeClass.class.cast(anotherClassInstance) // 2
```

1番は避けたいやつですね、2番はいいんですが１行が長くなりがちなのが玉に瑕。
そこでこんなのを考えました。

```java
public class As {
    public static <T> T of(Object value) {
        return (T) value;
    }
}
```

これを使うと下記のように割と綺麗に書けます。

```java
SomeClass instance = As.of(anotherClass);
```

lombok を使っているならこんな風です。

```java
val instance = As.<SomeClass>of(anotherClass);
```

以上！