OmniAICreator/Qiita-1.07M huggingface dataset:
Android Studioの新コンフィグレーションimplementationとapiのひとつ注意点

Android Studioで古いGradleバージョンで作成されたモジュールのコンパイルで以下のようなエラーが出ました。

```
Configuration 'compile' is obsolete and has been replaced with 'implementation' and 'api'.
It will be removed at the end of 2018. For more information see: http://d.android.com/r/tools/update-dependency-configurations.html
```
早速公式のサイトを確認しましたが、旧「compile」コンフィグレーションが2018を以て廃止するらしいです。

で、代替品は「implementation」と「api」となりますが、どっちに使うべきかなという疑問があると思います。

公式サイトの説明によると、大半のアプリとテスト モジュールに、「implementation」を使用することをお勧めしますと書いてあるので、とりあえず一般的にはこれを使えば問題ないということですね。

そして、私が導入した旧バージョンで開発されたモジュールの「build.gradle」ファイルの「compile」を全部「implementation」で書き換えて、コンパイルしたら特にエラーが出てなく、問題ないようです。

が、アプリのMainActivity.javaでモジュールのlibsの下に存在するjarファイルの中のclassをimportして参照されようとしたら
> Cannot reslove symbol 'XXXX'

というエラーが出ました！

この問題は、モジュールの「build.gradle」ファイルの「dependencies」のところに

```
dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'src/main/libs')
    implementation 'com.android.support:support-v4:27.0.0'
    implementation project(':XXXX')
}
```
**↑誤**

> implementation fileTree(include: ['*.jar'], dir: 'src/main/libs')

になるから。

正しい書き方は

```
dependencies {
    api fileTree(include: ['*.jar'], dir: 'src/main/libs')
    implementation 'com.android.support:support-v4:27.0.0'
    implementation project(':XXXX')
}
```
**↑正**

「fileTree」の前に「api」を使うべきです。

こう書くとアプリのMainActivity.javaにimportでモジュールのlibs下のjarファイルの中身を参照させたらエラーが出なくなります。

### IDEとコンパイル環境

・Android Studio 3.1.1
・Android SDK Build-Tools 28-rc2
Moom

# Moom

主に macOS で Emacs を使う人に向けたツールとして，[Moom](https://manytricks.com/moom/) を porting しています．マウスを使わず，キーボードだけで，Emacsのフレームの位置を動かしたり，最大化したりできます．

最大化や拡大時にはフォント設定を変更するので，そのあたりの挙動が好みでない時は，`(moom-toggle-font-module)` を `init.el` に書いておくか， `moom-font.el` を削除すれば大丈夫です．デモなどは，下記リポジトリの README が詳しいです．インストールは [melpa](https://melpa.org/#/moom) からどうぞ．

macOS以外に，Ubuntu 18.04, Windows 8, Windows 10 で動作確認していますが，精度面でもう少し改良が必要な状況です．

https://github.com/takaxp/moom

![move-right.gif](https://qiita-image-store.s3.amazonaws.com/0/12232/b03c1820-c9cf-6df8-9b0b-89a1169abab6.gif)

## とりあえず使う

インストールに成功していると仮定して，とりあえず以下3行を `init.el` に記載すれば適当に動きます．`moom-recommended-keybindings` は，ガッツリとキーバインドを奪いますのでご注意を．ただこのパッケージはマイナーモードなので `(moom-mode -1)` すればいつでもキーバインドを取り戻せます．あるいは同関数のオプションを工夫すれば，特定の操作だけ，推奨キーバインドを設定できます．`'all`指定は，`'(move fit expand fill font reset)`と同じです．

```elisp
(when (require 'moom nil t)
  (moom-recommended-keybindings 'all)
  (moom-mode 1))
```

すると，`moom-mode-map` に次のキーバインドが設定されます．

```elisp
;; Move
(define-key moom-mode-map (kbd "M-0") 'moom-move-frame) ;; to top-left corner
(define-key moom-mode-map (kbd "M-1") 'moom-move-frame-left)
(define-key moom-mode-map (kbd "M-2") 'moom-move-frame-to-center)
(define-key moom-mode-map (kbd "M-3") 'moom-move-frame-right)

;; Fit
(define-key moom-mode-map (kbd "M-<f1>") 'moom-move-frame-to-edge-left)
(define-key moom-mode-map (kbd "M-<f3>") 'moom-move-frame-to-edge-right)
(define-key moom-mode-map (kbd "<f1>") 'moom-move-frame-to-edge-top)
(define-key moom-mode-map (kbd "S-<f1>") 'moom-move-frame-to-edge-bottom)

;; Expand
(define-key moom-mode-map (kbd "<f2>") 'moom-cycle-frame-height)
(define-key moom-mode-map (kbd "C-c f s") 'moom-change-frame-width-single)
(define-key moom-mode-map (kbd "C-c f d") 'moom-change-frame-width-double)
(define-key moom-mode-map (kbd "C-c f a") 'moom-change-frame-width-half-again)

;; Fill
(define-key moom-mode-map (kbd "C-c f f t") 'moom-fill-top)
(define-key moom-mode-map (kbd "C-c f f b") 'moom-fill-bottom)
(define-key moom-mode-map (kbd "C-c f f l") 'moom-fill-left)
(define-key moom-mode-map (kbd "C-c f f r") 'moom-fill-right)
(define-key moom-mode-map (kbd "C-c f f 1") 'moom-fill-top-left)
(define-key moom-mode-map (kbd "C-c f f 2") 'moom-fill-top-right)
(define-key moom-mode-map (kbd "C-c f f 3") 'moom-fill-bottom-left)
(define-key moom-mode-map (kbd "C-c f f 4") 'moom-fill-bottom-right)
(define-key moom-mode-map (kbd "C-c f f m") 'moom-fill-band)
(define-key moom-mode-map (kbd "M-<f2>") 'moom-toggle-frame-maximized)

;; Font
(define-key moom-mode-map (kbd "C--") 'moom-font-decrease)
(define-key moom-mode-map (kbd "C-=") 'moom-font-increase)
(define-key moom-mode-map (kbd "C-0") 'moom-font-size-reset)

;; Reset
(define-key moom-mode-map (kbd "C-c C-0") 'moom-reset)
```

*以下，随時更新*
Juliaでインタラクティブプロット(Button編)

本稿ではJuliaによるmatplotlibを使ったインタラクティブプロット(Button編)について紹介します．
基本的には本家サイトにあるmatplotlib.widgetsのサンプルソースの移植版です．

```julia:buttons.jl
#Translated from python to julia (reffer to https://matplotlib.org/examples/widgets/buttons.html)
#Julia v0.6.2
#PyCall v3.6.4

using PyCall
using PyPlot

const Button = matplotlib[:widgets][:Button]

freqs = 2:3:20

fig, ax = subplots()
subplots_adjust(bottom=0.2)
t = 0.0:0.001:1.0
s = sin.(2*π*freqs[1]*t)
l, = plot(t, s, lw=2)
ind = 1

function next_(event)
    eval(:(ind += 1))
    i = (ind % length(freqs)) + 1
    ydata = sin.(2*π*freqs[i]*t)
    l[:set_ydata](ydata)
    draw()
end

function prev_(event)
    ind > 0 ? eval(:(ind -= 1)) : eval(:(ind=length(freqs)))
    i = (ind % length(freqs)) + 1
    ydata = sin.(2*π*freqs[i]*t)
    l[:set_ydata](ydata)
    draw()
end

axprev = axes([0.7, 0.05, 0.1, 0.075])
axnext = axes([0.81, 0.05, 0.1, 0.075])
bnext = Button(axnext, "Next")
bnext[:on_clicked](next_)
bprev = Button(axprev, "Previous")
bprev[:on_clicked](prev_)

show()
```

![スクリーンショット 2018-05-10 21.10.34.png](https://qiita-image-store.s3.amazonaws.com/0/256319/7252fab2-ef42-6071-3896-071aec21e504.png)
PX3280をwin7で動かす

格安で手に入れたKINGMAX Zeus PX3280がwin7で動かす手順

# driverの入手
https://svn.openfabrics.org/svnrepo/nvmewin/releases/revision_1.5/installations/64-bit/Windows7/

# デジタル署名の設定変更
管理データの一部が間違っているため修正する。

レジストリエディタを起動して
　HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{36fc9e60-c465-11cf-8056-444553540000}
　を開き、 「UpperFilters」「LowerFilters」という項目が見つかったら、それらを削除（片方しかない場合もある）
コンパイルエラーやランタイムエラーを直していくだけでiOSアプリの作り方がわかるプロジェクト

を作りました。

takasek/MokuMokuNotes_iOS: Quest based learning tool for writing a basic iOS app
https://github.com/takasek/MokuMokuNotes_iOS

# モチベーション

元々、 Androidエンジニアの[@callipan](https://twitter.com/callipan)が、私のAndroid入門のためにわざわざ `コンパイルエラーやランタイムエラーを直していくだけでAndroidアプリの作り方がわかるプロジェクト` を用意してくれたんですが、それがとても楽しかったのでiOS版を作りました。

**(2018/5/12追記)**
インスパイヤ元であるAndroid版も、パワーアップして公開されました！
panpanini/MokuMokuNotes_Android: Quest based learning tool for writing a basic Android app
https://github.com/panpanini/MokuMokuNotes_Android


# コンセプト

ゲームのように、クエストをひとつひとつクリアしていくことで自然にレベルアップできる教材になるよう意識しました。

# 何が学べるか

- Xcodeでのファイルの検索方法
- delegateパターン（MVP）
- Storyboardの使い方
- Outlet接続
- tableviewのregisterやdequeue
- 画面遷移

あたりを段階的に楽しく学習できます。

# あそびかた

1. [Mac AppStoreでXcodeをインストールする](https://itunes.apple.com/jp/app/xcode/id497799835?mt=12)
1. `git clone https://github.com/takasek/MokuMokuNotes_iOS.git` する
1. Xcodeでプロジェクトを開いて、ビルドする
    - しかしビルドエラーに遭遇する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/34405/d8115ec1-b057-a353-34b8-5825972fcf99.png)
1. ヒントをたよりにビルドエラーを直す
    - この場合、 `hint: press Command+/` とあるので従うと…
    ![image.png](https://qiita-image-store.s3.amazonaws.com/0/34405/4226458f-95d4-0261-e9a6-d8753a72d3f4.png) 直った！
1. 再びビルドする
    - `Command+B`や `Command+R` というショートカットキーが使えることは、上のメッセージをよく読んだ諸兄であればもうおわかりですね？
    - 今度はビルドが通ったようです！ ![image.png](https://qiita-image-store.s3.amazonaws.com/0/34405/0ab15601-7981-4f1c-6e51-51fbcccb496c.png)
    - しかしアプリを実行すると、ランタイム（実行時）エラーに遭遇
    ![image.png](https://qiita-image-store.s3.amazonaws.com/0/34405/14acc672-c7cd-d149-02a5-9f8273d7bf1c.png)
1. ヒントをたよりにランタイムエラーを直す
    - ヒントにあるように、MVPについてのスライドを読んだり、リポジトリのアーキテクチャ図を確認したら、行を削除
1. 再びアプリを実行すると…この後に何が起こるかはお楽しみ。さあ冒険のはじまりです。

# あそんでくれたひとの声

<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">swift書いてますが結構難しかったです。<br>ただゲームのようでとても面白かったです。<br>最後の画面を自分でデザインのところはなんか少しいじるだけでとっても嬉しくなれる感じでとても素敵だと思いました。<br>完成形のgif載せない方がよければすぐに削除します。 <a href="https://t.co/NgPDsqyers">pic.twitter.com/NgPDsqyers</a></p>&mdash; さちこ (@854729) <a href="https://twitter.com/854729/status/993084659738144768?ref_src=twsrc%5Etfw">2018年5月6日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ネタバレになっちゃいますが最終クエストはそんな感じです。
どうです？　わくわくしてきましたか？

# フィードバック募集中！

「何すればいいのか困った」「ここヒント少ない」「英語おかしい」とかでもフィードバックもらえたら改善しますので是非お寄せください。
RubyのAST入門 #omotesandorb

表参道.rb #34
https://omotesandorb.connpass.com/event/86444/

の発表資料。

---

## 自己紹介

名前: sinsoku
会社: 株式会社DMM.comラボ(🔞🙅)
副業: 株式会社grooves
github: [sinsoku](https://github.com/sinsoku)
twitter: [@sinsoku_listy](https://twitter.com/sinsoku_listy)

---

## 話すこと

1. ASTの概要
2. 実務で役立つAST
3. ASTの限界
4. そして型推論の夢を見る...

---

## AST(抽象構文木)の概要

---

## ASTを知っている人？✋

---

## ASTの概要

Rubyはコードを下記の順で解析され、実行されます。

1. 字句解析
2. 構文解析
3. YARV(Yet Another Ruby VM) 上で実行
  * コードをiseqにして動かす
  * iseq(InstructionSequence)

---

## 字句解析

Rubyのコードを単語に分ける。

```ruby
Ripper.lex("a = 1 + 1").each { |t| p t }
# [[1, 0], :on_ident, "a", #<Ripper::Lexer::State: EXPR_CMDARG>]
# [[1, 1], :on_sp, " ", #<Ripper::Lexer::State: EXPR_CMDARG>]
# [[1, 2], :on_op, "=", #<Ripper::Lexer::State: EXPR_BEG>]
# [[1, 3], :on_sp, " ", #<Ripper::Lexer::State: EXPR_BEG>]
# [[1, 4], :on_int, "1", #<Ripper::Lexer::State: EXPR_END>]
# [[1, 5], :on_sp, " ", #<Ripper::Lexer::State: EXPR_END>]
# [[1, 6], :on_op, "+", #<Ripper::Lexer::State: EXPR_BEG>]
# [[1, 7], :on_sp, " ", #<Ripper::Lexer::State: EXPR_BEG>]
# [[1, 8], :on_int, "1", #<Ripper::Lexer::State: EXPR_END>]
```

---

## 構文解析

単語からRuby構文を表現するAST(抽象構文木)を作る。

```ruby
Ripper.sexp("a = 1 + 1")
# [:program,
#  [[:assign,
#    [:var_field, [:@ident, "a", [1, 0]]],
#    [:binary, [:@int, "1", [1, 4]], :+, [:@int, "1", [1, 8]]]]]]
```

---

## YARV上で実行

ASTをiseqという命令列に変換し、YARV上で実行する。
詳細を知りたい人は下記の本を読むと良いです。

* [Rubyのしくみ](https://www.amazon.co.jp/dp/B01IGW56CU)
* [iSeq探訪(同人誌)](https://booth.pm/ja/items/834594)

---

## 実務で役立つAST

---

## RuboCop の拡張がオススメ！

---

## 💀404 NotFound

---

## 資料が間に合わなかった。。。

* [RuboCopの新しいルールを追加する方法（Custom Copの作り方）](http://sinsoku.hatenablog.com/entry/2018/04/24/022911)

---

## ASTの限界

---

## 👮 RuboCop DynamicFindBy

```ruby
class User < ActiveRecord::Base
end

User.find_by_name("foo") # <= 1 offence
```

---

## 👮 false positive

RuboCop さんは下記のコードを誤検知します。

```ruby
class Foo
  def self.find_by_name(name); end
end

Foo.find_by_name("bar")
```

---

## なぜ誤検知するのか？

RuboCop はメソッド名のみをチェックしていて、
**ActiveRecord::Base** の子孫かどうかはチェックしていない。

Rubyには型がないため、どうしようも無い...。

---

## そして型推論の夢を見る

---

## リテラルの型は分かる

```ruby
num = 1
#=> Integer型
array = []
#=> Array型
```

---

## newの戻り値の型も分かる

```ruby
class User
end

user = User.new
#=> User型
```

---

## newの戻り値の型も分かる

```ruby
Ripper.sexp("user = User.new")
# [:program,
#  [[:assign,
#    [:var_field, [:@ident, "user", [1, 0]]],
#    [:call,
#     [:var_ref, [:@const, "User", [1, 7]]],
#     [:@period, ".", [1, 11]],
#     [:@ident, "new", [1, 12]]]]]]
```

---

## (Railsの)schem.rbも使えそう

```ruby
create_table "users" do |t|
  t.string "email", default: "", null: false
  t.integer "age", null: false
end
```

---

## ASTで推論できるかも？

---

## 上書きされるnew

```ruby
class User
  def self.new
    Admin.new
  end
end

user = User.new
#=> Admin型
```

---

## 引数で変わる型

```ruby
def pick(*column_names)
  limit(1).pluck(*column_names).first
end

User.pick(:name)
#=> "David Heinemeier Hansson"
User.pick(:name, :admin)
#=> ["David Heinemeier Hansson", true]
```

---

## 世知辛いのじゃ...

* Ruby の世界は厳しい
* ただ、7割くらい推論できる気がする

---

## まとめ

* ASTは意外と簡単なのでみんな触ろう！
* 型に興味ある人はぜひ話しましょう！

ご清聴ありがとうございました。
Could not insert new outlet connection: Could not find any information for the class named ViewControllerの対処法

Could not insert new outlet connection: Could not find any information for the class named ViewControllerの対処法

下記のサイトの対応をやっても解決しなかった人向け
http://www.clrmemory.com/swift/xcode-error-couldnt-insert/
https://qiita.com/nagahori/items/71c1940319d35fa886f5

全然直らなくて、悪夢の様な日々を過ごしました。
解決策を発見したので、全世界の人に共有を・・・

[Main.storyboard]選択
↓
[Edit]
↓
[Delete]
↓
[Remove Reference] 
!ここ注意間違って消さないように参照だけ外してください

でその後[Main.storyboard]をXcodeにドラッグして追加

これで直った！！！！！！！
CentOS6.9 + Apache2.4 + PHP7.1 の環境構築

# 問題
CentOS7はデフォルトApache2.4なのですんなりいくのだが、CentOS6はそうも行かない。

```bash:bash
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
yum install -y --enablerepo=remi,remi-php71 php
```

とすると

```
================================================================================
 Package            Arch   Version                             Repository  Size
================================================================================
Installing:
 php                x86_64 7.1.17-1.el6.remi                   remi-php71 2.8 M
Installing for dependencies:
 httpd              x86_64 2.2.15-60.el6.centos.6              updates    836 k
 httpd-tools        x86_64 2.2.15-60.el6.centos.6              updates     80 k
```

apache2.2が依存関係でインストールされる。
2.2はEOLでupdateしなきゃならないので邪魔なんだけど。。。

# 解決方法

```bash:bash
# php7.1をインストール。7.2にするなら全部読み替えること。
yum install -y --enablerepo=remi,remi-php71 \
  php \
  php-devel

# 依存関係で入ったapache2.2を削除
rpm -e --nodeps httpd
rpm -e --nodeps httpd-tools
rm -fr /etc/httpd
rm -fr /etc/init.d/httpd

# apache2.4をインストール
wget https://repos.fedorapeople.org/repos/jkaluza/httpd24/epel-httpd24.repo
mv epel-httpd24.repo /etc/yum.repos.d/
yum -y install --enablerepo=epel-httpd24 httpd24-httpd httpd24-httpd-devel httpd24-mod_proxy_html httpd24-mod_session httpd24-mod_ssl

# httpd24関連はパスが長いので2.2に合わせてリンクも作っている
ln -s /opt/rh/httpd24/root/etc/httpd /etc/httpd
ln -s /etc/init.d/httpd24-httpd /etc/init.d/httpd
chkconfig httpd on

# PHP7.1をコンパイルしてapache2.4 向けのPHPライブラリ(libphp7.so)を作成する
yum -y install \
  bison \
  libxml2-devel

# .configureの失敗回避
ln -s /opt/rh/httpd24/root/usr/lib64/pkgconfig/apr-1.pc /usr/lib64/pkgconfig/apr-1.pc

# PHP7.1のコンパイルする。副産物(libphp7.so)が目的なので出来上がるphpは使わない
wget https://github.com/php/php-src/archive/php-7.1.17.tar.gz
tar xvf php-7.1.17.tar.gz
cd php-src-php-7.1.17
./buildconf --force
./configure \
    --with-config-file-path=/etc/ \
    --with-config-file-scan-dir=/etc/php.d \
    --with-apxs2=/opt/rh/httpd24/root/usr/bin/apxs
make

cp /home/vagrant/php-src-php-7.1.17/libs/libphp7.so /opt/rh/httpd24/root/usr/lib64/httpd/modules/libphp7.so

# ライブラリを読み込ませる設定を追記
echo "LoadModule php7_module /opt/rh/httpd24/root/usr/lib64/httpd/modules/libphp7.so" >> /etc/httpd/conf/httpd.conf

service httpd start
```

makeしたPHP7.1をmake installしないのは、yum installで各種PHPライブラリを取得すると`PHP Warning:  Module 'apc' already loaded in Unknown on line`という警告が大量に出たから。
phpの`./configure`で上のようにほぼ何もつけなくてもjson等のライブラリをyumが取ってきてしまうので、/etc/php.d/xxxx.confが勝手に作られて多重ロードの警告を出してしまう。
まあ多重ロードの定義を消せばいいのだが、以降も追加でPHPライブラリが欲しくなる可能性があるので、導入が簡単なyumを使えるようにmakeしたphpを使わない方式にした。
【Elm】特定のフィールドを持つレコードをパターンマッチさせる

## Elmのパターンマッチ
関数型言語であるElmはパターンマッチが使える。
便利な使い方を教えてもらったのでメモ。
例えば、Int型のidを持つレコードを表す場合は以下のように定義する。

```elm
-- elmではtype aliasで任意の型定義をすることが出来る
type alias Identifiable a = { a | id : Int }
```

## 活用例
特定のidをもつレコードの値を入れ替える時には以下のような書き方が出来る。

```elm
type alias Record = 
  { id: Int
  , name: String
   -- 以下のようなフィールドがあってもマッチする。
   --, hogehoge : hogehoge
  }
  
preRecords : List Record
preRecords = 
  [ Record 1 "A"
  , Record 2 "B"
  , Record 8 "C"
  , Record 4 "D"
  ]
  
  
main =
  let 
    newRecord = 
      Record 8 "NEW!"
    
    postRecords= 
      updateRecord newRecord preRecords
      
  in
    postRecords
      |> toString
      |> text


type alias Identifiable a = { a | id : Int } 

updateRecord : Identifiable a -> List (Identifiable a) -> List (Identifiable a)
updateRecord e es =
  case es of
    -- 配列のheadとtailでパターンマッチ
    h :: t ->
      if h.id == e.id 
        then
          e :: t
        else
          h :: (updateRecord e t)
    _ ->
      es ++ [e]

```
WordPressのユーザーに独自項目を追加

## 概要
古いバージョンのWordPressでwp_usersを利用して会員情報を運用しているケースがあり、
どうしてもユーザー情報に管理項目を追加したい要件があったので、調べた内容をメモしておきます。

## 追加方法
functions.phpに下記内容を追加することで対応できそうです。

```php:functions.php
<?php

  ...


// ユーザーの管理項目を追加
add_action('show_user_profile', 'Add_user_fields');
add_action('edit_user_profile', 'Add_user_fields');
function Add_user_fields($user) {
?>
    <h3>管理項目</h3>
    <table class="form-table">
        <tr>
            <th><label for="mail_magazine_stop">メルマガ配信停止</label></th>
            <td>
                <?php $selected = get_the_author_meta('mail_magazine_stop', $user->ID); ?>
                <select name="mail_magazine_stop" id="mail_magazine_stop">
                    <option value="yes" <?php echo ($selected == "yes")?  'selected="selected"' : '' ?>>停止する</option>
                    <option value="" <?php echo ($selected != "yes")?  'selected="selected"' : '' ?>>停止しない</option>
                </select>
            </td>
        </tr>
    </table>
<?php
}
add_action('personal_options_update', 'save_user_fields');
add_action('edit_user_profile_update', 'save_user_fields');
function save_user_fields($user_id) {
    if (! current_user_can('edit_user', $user_id))
        return false;

    update_usermeta($user_id, 'mail_magazine_stop', $_POST['mail_magazine_stop']);
}
```

追加した感じはこのようになります。
![キャプチャ.png](https://qiita-image-store.s3.amazonaws.com/0/142279/7dd33637-2f3d-de01-a9b6-4192fe1321b2.png)



## 参考サイト
* [Drop down list in user profile page](https://wordpress.stackexchange.com/questions/50125/drop-down-list-in-user-profile-page)
1秒間に60回"poi"をプリントするコード書いた

# 序文
現在Rustで弾幕ゲームをむちむち作っている。
そこで1秒間に60回の処理をするコードが必要になったから書いた。
このコードを使うことで、60FPSなゲームを作ることができる。

# 概要
特に目新しい事はない。

時間を計測開始
-> 何らかの処理
-> 経過した時間と1/60秒の差分だけsleepさせる。
-> 最初に戻る

また時間計測は標準ライブラリの`std::time`、sleepは標準ライブラリの`std::thread`を使った。

# コード

play rust-lang: https://play.rust-lang.org/?version=stable&mode=release

```
//#![feature(duration_extras)]
use std::time::*;
// Instant::now()
use std::thread::*;
// sleep()

const FPS: u64 = 60; //set frame per second

struct Fps {
    start: Instant,
    count: u64,
    fps: f64,
}

impl Fps {
    fn new() -> Fps {
        Fps {
            start: Instant::now(),
            count: 0,
            fps: 0.0,
        }
    }

    fn update(&mut self) {
        if self.count == FPS {
            let start_time = self.start.elapsed().subsec_nanos() as f64 * 1e-9;
            self.fps = 1.0 / start_time;
            self.count = 0;
        }
        self.start = Instant::now();
        self.count += 1;
    }

    fn wait(&self) {
        //let one_frame_sec: Duration = Duration::from_nanos(0_016_000_000);
        let one_frame_sec: Duration = Duration::from_millis(0_016);
        let sleep_time: Duration = one_frame_sec - self.start.elapsed();
        sleep(sleep_time);
    }
}
fn main() {
    let mut fps = Fps::new();

    for c in 0..3001 {
        &fps.update();
        //println!("fps: {}", fps.fps);
        //println!("count: {}", fps.count);
        //let start =
        //    fps.start.elapsed().as_secs() as f64 + fps.start.elapsed().subsec_nanos() as f64 * 1e-9;
        //println!("start time: {}\n", start);
        println!("poi");
        &fps.wait();
    }
}

```

- `Duration::from_nanos()`はstableでは動かず、nigtlyでも`#![feature(duration_extras)]`を書かないとエラーになる。

# 参考文献
- https://doc.rust-lang.org/std/time/index.html
- https://doc.rust-lang.org/std/thread/fn.sleep.html
ES6 記法で mysql connection を static property に持った class を export する

こんな感じ

```js:Hoge.js
const mysql = require('mysql');

let connection = mysql.createConnection({
    host: 'mysql',
    // 接続情報は環境変数に入れている想定
    user: process.env.MYSQL_USER,
    password: process.env.MYSQL_PASSWORD,
    database: process.env.MYSQL_DATABASE
});
connection.connect();

module.exports = class Hoge {
    static get connection() {
        return connection;
    }
}
```

こういった class を基底クラスとして、 ORM のようなものを実装できる。
ダ・ヴィンチ32U with Arduino  書き込みできないとき Da Vinci 32U

書き込みを押したあとに、リセットスイッチを押すとうまくいった。

参考元 http://matsup.blogspot.jp/2012/12/arduino-da-vinci-32u.html
>新たなスケッチの書き込みに失敗することがあった。
　　→ そんな時は，IDE で書き込みを選んだ後，進捗バーが 80% ぐらいになった時に
　　　 Da Vinci 32u のリセットスイッチを押すと書き込めた。
flutterでDateTimeとStringの変換方法とTimeZoneとLocale


# 概要

DateTime <=> String の変換方法を忘れるのでメモ。
あと、関係するだろうTimeZoneとLocaleについても書いときます。

# 設定

flutter_localizationsを設定します。
[intl](https://pub.dartlang.org/packages/intl)ライブラリを記述している例がありますが、不要です。
それはflutter_localizationsで含まれます。

```pubspec.yaml
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter
```

# 変換方法

例えば、apiの戻り値のString日付をyyyy/MM/dd(E) HH:mm形式にしたい場合。

```dart
import "package:intl/intl.dart";
import 'package:intl/date_symbol_data_local.dart';

・・・

  final String sentDateJst;

  get sentDateFormatted  {
    initializeDateFormatting("ja_JP");

    DateTime datetime = DateTime.parse(sentDateJst); // StringからDate
    
    var formatter = new DateFormat('yyyy/MM/dd(E) HH:mm', "ja_JP");
    var formatted = formatter.format(datetime); // DateからString
    return formatted;
  }

```

initializeDateFormattingの戻り値がFutureなので迷うと思うが、上記でできます。

# TimeZoneについて

dartのDateTimeはimmutableです。なので一度作成されたDateTimeのTimeZoneの変更はできません。
ios/androidで設定されているtimezoneでインスタンスされます。公式に以下と書かれています。

> A DateTime object is anchored either in the UTC time zone or in the local time zone of the current computer when the object is created.
>
>Once created, neither the value nor the time zone of a DateTime object may be changed.


例えば、JSTで設定されているOSの場合は、```timeZoneName```で取得できる文字列はJSTになります。
```toUTc()``` メソッドを使えば、UTCの ```DateTime``` が取得できます。
```timeZoneOffset``` の戻り値は、```Duration``` クラスで ```inHours``` を呼べばJSTの場合は9が帰ってきます。
DateTimeのaddメソッドでは、この ```Duration```を指定できます。

```dart
DateTime hoge = DateTime.now().add(duration);
```

もし、APIの戻り値で年月日を別々に保持している場合でもDateTime.utcでインスタンスできます。

```dart
import "package:intl/intl.dart";
import 'package:intl/date_symbol_data_local.dart';

・・・

  var utc = DateTime.utc(year, month, day);
  var local = utc.toLocal();
```

そして現在の端末のtimezoneで表示したい場合は ```toLocal()``` メソッドを呼び出し、```DateFormat```を使ってフォーマットします。

UTCで保持しているAPIにPOSTしたい場合は、普通に ```toUTc()``` の結果をAPI仕様に合わせてフォーマットすれば良いでしょう。

# Localeについて

MaterialAppインスタンス時に指定しておいて、

```main.dart

import 'package:flutter_localizations/flutter_localizations.dart';
・・・
  new MaterialApp(
          localizationsDelegates: [
            GlobalMaterialLocalizations.delegate,
            GlobalWidgetsLocalizations.delegate,
          ],
          supportedLocales: [
            const Locale("en", "US"),
            const Locale("ja", "JP")
          ]
```

以下で取得できます。

```
Locale locale = Localizations.localeOf(context);
```

Localeクラスはflutterでは、UIのものっぽいので、厳格なアーキテクチャを望む場合は、enum化するロジックを書いて違うレイヤーに渡すのがベターだと思われます。


以下は解決済みです。
~~ちなみに日本語設定した時に、Androidではja_JPが取得できましたが、iosでは、常にen_USが返ってきました。
そんな[バグ](https://github.com/flutter/flutter/issues/14128)があるようです。~~
docker 版OWASP ZAPを試してみる

# 概要

[OWASP ZAP](https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project) を使ってみたいプロジェクトがあったので、試してみた。

できれば、
チェックするプロジェクトも、OWASP ZAP もコンテナで利用できて、
コマンドラインで動くかをチェックしたい。

# まとめ

基本的には、以下のサイトを参考にすれば良い。

* [OWASP ZAP2\.7でzap\-cliを使ってScan実行 \- 備忘録／にわかエンジニアが好きなように書く](http://www.n-novice.com/entry/2017/12/21/072852)


ここにあったスクリプトに少し手を入れて、以下の２点を追加したものをつくってみました。

* コンテナを使ったプロジェクトに対するチェック
* 以下のエラーに関する対策
    * [Zap waiting for Spider endlessly when it crashed\. · Issue \#4428 · zaproxy/zaproxy](https://github.com/zaproxy/zaproxy/issues/4428)

```
dataFileCache CACHE SIZE limit reached 10000
```

作成したもの
* [manabuishii/owasp\-zap\-exec](https://github.com/manabuishii/owasp-zap-exec)
[小ネタ]1/4,294,967,297 の死角

#TL;DR

`List<T>`やら`Dictionary<TKey,TValue>`を`foreach`で回したり、`Enumerator`取得後に、内部状態を変えて、列挙を続行しても`InvalidOperationException`が飛んでこないレアケースが存在して、その確率が大体上記って話。

#EnumeratorはSourceの変更をどう検知しているか

`foreach`使うにせよ`Enumerator`使うにせよ、その取得した時点から元のコレクションに変更が発生した場合、列挙の続行は一般的に失敗して`InvalidOperationException`が発生する。これは列挙している最中にコレクションが変更されてしまうと、列挙操作の整合性がとれなくなる可能性があるためである。

この元コレクションが変更されているか否かをどのように検知しているかというと、
各々のコレクションに`private int _version`というフィールドがあり、`Add`、`Delete`それにアイテムのセットなどの変更が加わればこのフィールドをインクリメントしている。

他方、`foreach`等の列挙操作で、`GetEnumerator`メソッドが呼ばれた際は、返却する`Enumerator`に現在の`_version`を引数として渡しておき、`MoveNext`が呼ばれた時に、Ctorで受け取ったバージョン番号と、元コレクションのバージョン番号を照査して差異があれば`InvalidOperationException`が発生する形となる。

これはとても良い解決法で、例えばイベントの購読やRxの購読となると素朴な実装を行った場合元コレクションにEnumeratorの強参照が残る可能性があるし、また通知自体が結構重い処理となる。
なので、その辺の複雑性を回避しスマートに解決していると思う。

#全てが42になる

さて、変更検知がどのように為されているかざっと検証してきた。
ここで問題なのが、`_version`が32bitであり、ライブラリは`unchecked`でコンパイルされている。

なので、

```cs
private static void Main(string[] args)
{
	List<int> list = new List<int>();
	list.Add(42);
	foreach (var i in list)
	{
		Console.WriteLine(i);
		list.Add(42);
	}
}

```

こんなこと書いても最初42が出力されてその後`InvalidOperationException`が発生するのがオチとなる。


けれど、以下のように書き換えたとき

```cs

private static void Main(string[] args)
{
	List<int> list = new List<int>();
	list.Add(42);
	foreach (var i in list)
	{
		Console.WriteLine(i);
		list.Add(42);
		for (uint _ = 0; _ < uint.MaxValue; _++) list[0] = 42;
	}
}

```

このとき`Count`が`int.MaxValue`を超えるか、実行している環境のメモリを食い尽くすかどちらかで落ちるまでは延々42を出力し続ける。

#ネタばらしとまとめ

やってることは簡単で、`_version`が32bitなら2^32+1回の操作をすればWraparoundして、_versionは元に戻る。なので変更無しと誤認していると言うオチ。

列挙途中に32bitの空間食い尽くすような変更操作をすることなんてほぼないだろうし、それにもまして、以上でも以下でもなくJustである必要があるので、コリジョンが発生する可能性は表題通りとなるから、普通一般的には気にする必要も無いと思う。

ただ、何かしらのCriticalな話と絡むと酷くタチの悪いバグを生み出すこともなくはないので、一応まとめてみましたと言うことで一つ。

ご清聴有り難うございました。
PDFからコピーした英文をGoogle翻訳する

# はじめに

英語論文のPDFから英文をコピーしてGoogle翻訳に投げるときは、あちこちに入った改行を消さないとうまく翻訳してもらえない。
手作業でやるのに飽きたのでPythonの関数を用意しました。
自分用です。

# 準備

[googletrans](https://github.com/ssut/py-googletrans)を使うのでインストールしておきます。

```bash
$ pip install googletrans
```

# プログラム

```python
import re
from googletrans import Translator


def translate(text):
    comment_pattern = re.compile(r'//([^\n]*)')
    out = re.sub(comment_pattern, r'\1', text)

    out = re.sub(r'^\s*|\s*(?=\s)|\s*$', '', out)
    out = re.sub(r'[\r\n]', ' ', out)
    out = re.sub(r':\s+', r':\n', out)
    out = re.sub(r'\.\s+([A-Z])', r'.\n\1', out)

    out = ' '.join(
        '\n' + line if ' ' in line else line
        for line in out.splitlines())
    out = '\n'.join(
        re.sub(r' ([A-Z]\w+)', r' _\1_', line)
        for line in out.splitlines())

    for t in Translator().translate(out.strip().splitlines(), src='en', dest='ja'):
        print(t.origin)
        print()
        print(t.text)
        print()
```

# 実行例

```python
translate("""
The quick brown fox jumps over the 
lazy dog. The quick brown fox jumps 
over the lazy dog. The quick brown 
fox jumps over the lazy dog.
""")
```

```
The quick brown fox jumps over the lazy dog. 

クイックブラウンキツネは怠惰な犬の上を飛びます。

The quick brown fox jumps over the lazy dog. 

クイックブラウンキツネは怠惰な犬の上を飛びます。

The quick brown fox jumps over the lazy dog.

クイックブラウンキツネは怠惰な犬の上を飛びます。
```
AzureのVMのsudoersの編集でやらかしたときにパスワードをリセットする方法


「パスワードのリセット」というやつがマネコンからポチポチできて9死に1生を得たような気持ちになりました
https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/troubleshoot-ssh-connection
パスワードを更新するとsudo権限もつきました。
いろいろ自動的にやりたくて手動で検証する過程で起こったできごとでした。

以上ですが以下脳内の履歴です

管理者パスワード忘れたらシングルユーザモードで初期化するのは知ってたけどクラウドだとものによってむりそう
CentOS6までのシングルユーザモードになるtelinit 1ではなくCentOS7だとsystemctl isolate rescue.targetらしいがNetwork介さずにターミナル繋げられないとダメだしな～
https://thinkit.co.jp/story/2014/12/11/5388?nopaging=1
https://qiita.com/hilotech/items/4d830347085ca27e3ba1

あとすでにrootのcron登録されてるスクリプト編集すればいけるかなと思ったけど編集権限がだめだったり
（それはそれで穴が無いってことではありますが）

事前にrootパスワード設定してsu -できるようにしておく必要があるな
rootの状態のセッション一個のこしておいてから別窓でやらないとダメやな
それしかない唯一のユーザではなく別の新規ユーザで試さないとだめやな
visudoでいじればよかったな～

VMつくりなおさなくてよくてほんとうによかったなあ

まあそんなようなことを思いました
こういう恥ずかしいやらかしを書くのには抵抗があるけどまたやらかすであろう未来のわたしとだれかのために備忘録でした

その後シリアルコンソールつなげるやつとOSディスクいれかえるやつ教えていただいたのでさらにどうしようもなくなった場合に備えて貼っときますね。

▼OS Disk Swap for Managed Virtual Machines now available | Blog | Microsoft Azure
https://azure.microsoft.com/en-us/blog/os-disk-swap-managed-disks/
▼【お試し】Azureのシリアルコンソールをいじる - LinuxユーザーがイジるはじめてのAzure
http://akazure.hatenablog.com/entry/2018/03/30/172224


以上
Hyper-V の NATメモ

http://andreyzavadskiy.com/2017/01/11/set-up-nat-in-windows-10-hyper-v/

とりあえずこれでできた

##1. Create Virtual Switch

```powershell
PS C:\> New-VMSwitch -SwitchName "NAT" -SwitchType Internal
```


##2. Find the interface index

```powershell
PS C:\> Get-NetAdapter
```

##3. Configure the NAT gateway

```powershell
PS C:\> New-NetIPAddress -IPAddress 172.16.0.1 -PrefixLength 24 -InterfaceIndex 28
```

InterfaceIndex の数値は ２で確認した数値を指定


##4. Create NAT network

```powershell
PS C:\> New-NetNat -Name NatNetwork -InternalIPInterfaceAddressPrefix 172.16.0.0/24
```

##5. 仮想マシン上で固定IPを設定

Inside virtual machine you should set up TCP/IPv4 properties for network adapter manually like this:

IP Address：
	172.16.0.2 or any other IP up to 172.16.0.254

Subnet mask：
	255.255.255.0

Default gateway：
	172.16.0.1

DNS server：
	Place IP address of DNS server that is used on host network adapter, i.e. 192.168.1.1 or 8.8.8.8
	ホストマシンのDNSを指定してあげればOK

```bash
$ sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0
～～～～
ONBOOT=yes
DEVICE=eth0
IPADDR=172.16.0.123
PREFIX=24
GATEWAY=172.16.0.1
DNS1=1.2.3.4
ZONE=public
～～～～
```



・・やっぱしWindowsはあんまし好きくない
snmp_exporter(prometheus)でsnmpget

[snmp_exporter](https://github.com/prometheus/snmp_exporter "snmp_exporter")にsnmpgetが実装されました。
バージョン0.9.0で既に実装されていたっぽいのですが、自分の環境ではうまく動作せず・・・。
今回の0.10.0にてデータ取得がうまくいったので結果報告となります。

# 導入

(既に稼働している[Prometheus](https://prometheus.io/ "Prometheus")を前提に書いています)

- 実行ファイルをダウンロードしてくる&解凍する
- サービス止める
- 実行ファイルを上書きする
- サービス再稼働

簡単！(^ρ^)

# 設定ファイル

設定例はYamahaさんのルータです

``` snmp.yml
yamaha-rt:
  version: 1
  auth:
    community: public

  walk:
    - 1.3.6.1.2.1.1.1
    - 1.3.6.1.2.1.1.3
    - 1.3.6.1.4.1.1182.2.1.4
    - 1.3.6.1.4.1.1182.2.1.5
    - 1.3.6.1.4.1.1182.2.1.15

  get:
    - 1.3.6.1.2.1.2.2.1.10.1
    - 1.3.6.1.2.1.2.2.1.16.1

  metrics:
    - { name: sysDescr           , oid: 1.3.6.1.2.1.1.1         , type: DisplayString }
    - { name: sysUpTime          , oid: 1.3.6.1.2.1.1.3         , type: gauge }
    - { name: yamaha_cpu         , oid: 1.3.6.1.4.1.1182.2.1.5  , type: gauge }
    - { name: yamaha_memory      , oid: 1.3.6.1.4.1.1182.2.1.4  , type: gauge }
    - { name: yamaha_temperature , oid: 1.3.6.1.4.1.1182.2.1.15 , type: gauge }

    - { name: ifInOctets_LAN1    , oid: 1.3.6.1.2.1.2.2.1.10.1  , type: counter }
    - { name: ifOutOctets_LAN1   , oid: 1.3.6.1.2.1.2.2.1.16.1  , type: counter }
```

get部分を入れて、metricのところを好みでカスタマイズ

walkのところは前バージョンの名残です。
インターフェイス部分が大量のRTX3500とか、VLANのおかけで大量にインターフェイスができてしまったルータでwalkしたくなかったですもん・・・。
(応答が帰ってこないことも･･･)

これでタイムアウト値も絞れますし、
ますますprometheusが活躍しそうです♪
JavaScript 中 `!!` 的作用

簡單來說，
 `!!` 可以判斷跟在他後面式子的真/假 (true/false) ，並回傳判斷的結果。

式子是 falsy value 的話，也會回傳 false
像是 [上一篇](https://qiita.com/vc7/items/fda7837f8ad51fef6f16) 有提到的這幾個值

- `undefined`, `null`, `NaN`, `false`, `0` , `''` / `""`

![image](https://qiita-image-store.s3.amazonaws.com/0/41979/c344581b-8da3-b8c9-7fd3-767418d59aa0.png)

## 參考資料

- [Falsy - MDN](https://developer.mozilla.org/en-US/docs/Glossary/Falsy)
- https://stackoverflow.com/q/784929/1583560
Oracle Java 動向 2018 = 早見まとめ =（Oracle JDK 11 リリースを見据えて）

## 参考
- [Oracle Java SEサポート・ロードマップ](http://www.oracle.com/technetwork/jp/java/eol-135779-ja.html) (2018-03-05)
- [Java 10でぼくたちの生活はどう変わるの？](https://www.slideshare.net/YujiKubota/java10-92299853) (2018-03-29)
- [2018年にJavaを利用している人は全員理解すべきことを説明してみる（追記あり）](http://www.orangeitems.com/entry/2018/02/08/152022) (2018-02-08)
- [来月にはJava 10が登場し、9月にはJava 11が登場予定。新しいリリースモデルを採用した今後のJava、入手方法やサポート期間はこう変わる（OpenJDKに関する追記あり)](https://www.publickey1.jp/blog/18/java_109java_11java.html) (2018-02-08)


## 課題

- Oracle JDK 11 リリース後は、無償版はOpenJDK 11への移行をすることになる。
- 非推奨（Deprecated)がマークされたAPIの削除が Java 10 以降発生するようになる。
- 無償のOpenJDKを使い続けるには、サイクリックなJDKのバージョンアップとRegression Testの自動化が必要 => CI（継続的インテグレーション）ツールの活用


## リリース・サイクルの変更

- 2017年9月からLTS(Long Term Support)モデルに移行
- LTSバージョンが3年ごとのリリース
- 機能リリースが6か月サイクルになる（OpenJDKのリリース・サイクルも同じ）

## Oracle JDK 8 の公式アップデートの終了

- 2019年1月公式アップデート終了
- 有償サポートにより、延長可能
- AutoUpdateによるデスクトップのJRE更新はJava 8までで終了。後継バージョンへの移行計画ナシ
- アプリケーションとJREを一緒に配布することが推奨される

## JDKのライフサイクル

|version|initial release|last update|Premier Support|Extended Support|Sustaining Support|
|---|---|---|---|---|---|
|6|2006-12|2013-4|2015-12|2018-12|∞|
|7|2011-7|2015-4|2019-7|2022-77|∞|
|8|2014-3|2019-1 or 2020-12|2022-3|2025-3|∞|
|9 (non-LTS)|2017-9|2018-3|2018-3|-|∞|
|10 (18.3) (non-LTS)|2018-3|2018-9|2018-9|-|∞(予定)|
|11 (18.9) (LTS)|2018-9|TBA|2023-9|2026-9|∞(予定)|

## Java EE が Jakarta EE になる

- https://japan.zdnet.com/article/35115649/ (2018-3-6)
- https://blogs.oracle.com/theaquarium/opening-up-ee-update (2017-9-12)

「Java EE」 が Eclipse Foundation に移管され、「Jakarta EE」に名称変更される。

かつて、Apache Software Foundationのサブプロジェクトの名称として使われていた「Apache Jakarta Project」と混同してしまいそうになるが、「Jakarta EE」はEclipse Foundation である。

## Qiita関連記事

- [Javaのサポート期間](https://qiita.com/yukoba/items/69fe9468b719fa6e69c4)
- [Javaのサポートについてのまとめ](https://qiita.com/nowokay/items/edb5c5df4dbfc4a99ffb)
- [Oralce JDK 11 を 9月から利用したい場合](https://qiita.com/kouji-kojima/items/13354947cd8c2a6df556)
- [Java 10 で変わる Java のバージョン表記](https://qiita.com/YujiSoftware/items/2c5a9117a577700ea540)
jupyter「AttributeError: '_NamespacePath' object has no attribute 'sort'」

#問題
先日まで動いていたのに

```
jupyter notebook
```


すると

```
AttributeError: '_NamespacePath' object has no attribute 'sort'
```

というエラーを吐くようになった．何故．
#環境
ubuntu 16.04.4 LTS (Xenial Xerus)
#やったこと
```
pip install --upgrade pip
sudo pip3 install --upgrade setuptools 
```
#うごいた
うごいた
Cinema4dのショートカットメモ

初心者用メモ。

## 機能を検索する
Shift+C

## 切り替え

|用途|ショートカット|
|:-----------------|:-----------------|
|選択ツールと操作ツール切り替え　|SPACE|
|モデリングモード切り替え（ポイント/エッジ/ポリゴン）|ENTER|

## カメラ操作

|用途|ショートカット|
|:-----------------|:-----------------|
|カメラ操作　縦横|1|
|カメラ操作　ズーム|2|
|カメラ操作　回転|3|
|ビューをレンダリング　|CMD + R|
|選択オブジェクトへカメラを移動 |o |
|カメラの回転の中心を変える| オプションキーを押しながらドラッグ | 

## 移動　スケール　回転

|用途|ショートカット|
|:-----------------|:-----------------|
|移動　|E|
|スケール　|T|
|回転　|R|

## 選択ツール

|用途|ショートカット|
|:-----------------|:-----------------|
|ライブ選択ツール|9|
|投げ縄選択ツール|8|
|長方形選択ツール|0|

## ポリゴン
|用途|ショートカット|
|:-----------------|:-----------------|
|押し出し　|D|
|面内に押し出し　|I|
|ナイフツール　|K|

## スナップ
|用途|ショートカット|
|:-----------------|:-----------------|
|スナップツール|P|
|スナップツール|Shift+S|


## わかりやすい絵

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ショートカット一覧すごいです。“<a href="https://twitter.com/exemoss?ref_src=twsrc%5Etfw">@exemoss</a>: C4Dのショートカットをキーボードのアレに埋め込んでたら頭おかしいことになってきた <a href="http://t.co/juoSMDJJ">http://t.co/juoSMDJJ</a>”</p>&mdash; MAXONJapan-R19発売中 (@maxonjapan) <a href="https://twitter.com/maxonjapan/status/232783484253511680?ref_src=twsrc%5Etfw">2012年8月7日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17747/0cd819cc-f245-18b7-8648-0522006e99e9.png)


## 参考ページ

* http://cubelic3.jp/cinema4d-shortcut-2/
* https://www.kotsuxkotsu.work/cinema-4d-shortcutkey/
レスポンシブデザインにしたはずが実機だとPCと同じ表示だった

## やってたこと
CSSに`@media screen and (max-width: 600px)`みたいなことを書いて、スマホ用のデザインを組む。
開発中はウィンドウを小さくして確認しつつ進めて、良い感じになったらサーバにデプロイして実機確認。

…あれ、反映されないんですけどー、となった。

## 原因
CSSとかわかんねぇなぁ、なんて思いながらあれこれ試しても解決せず。
最終的に辿り着いた原因は、HTML側でした。

```
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
```

これが要る。
RHEL7でホスト名を変更

RHEL7でホスト名を変更する。

下記のコマンドで変更。
`# hostnamectl set-hostname ホスト名（yasudasv等) --static`

下記のコマンドでホスト名を確認。
`# hostnamectl status`


ちなみに、EC2の場合は、cloud-initの設定を変更しないと、再起動したときに変更されてしまう。

`/etc/cloud/cloud.cfg`に、下記の行を追加する。
`# vi /etc/cloud/cloud.cfg`

`preserve_hostname: true`

参考のURLは下記。
https://cloudpack.media/6914
MRキャプチャでオブジェクトが映らない人へ

# 概要
HoloLensのMRキャプチャをしたいけど、
公式サンプルをコピペしてもうまくいかなくて悩んでる人向けの記事です。
備忘録みたいなメモ。

# どうしてこの記事を書いたのか

Unityの提供しているMRキャプチャ用のAPIとして、
**UnityEngine.XR.WSA.WebCam.PhotoCapture** があります。
公式のリファレンスは[こちら](https://docs.unity3d.com/2017.4/Documentation/ScriptReference/XR.WSA.WebCam.PhotoCapture.html)
EmptyObjectとCameraを置いたシーンにこのサンプルをコピペすると
HoloLensのカメラで「普通の写真撮影」はできます。

ただ、このままだと「HoloLensで表示しているUnityのオブジェクトを入れた撮影（Mixed reality capture)」はできません。
せっかくのMR用撮影機能なのに、公式サンプルが撮影できないモードで、初心者さんに優しくないなーと思ったのでこの記事を書きました。


# 変更が必要な点

## 1.CreateAsyncの修正
サンプルコードの16行目で使われているこちら
> PhotoCapture.CreateAsync(false, delegate(PhotoCapture captureObject) {

最初の引数がfalseで渡されていますが、リファレンスを確認すると、Hologramと合成するかというフラグになっています。
こちらは当然trueを指定して、Hologramの表示フラグをオンにする必要があります。

> PhotoCapture.CreateAsync(true, delegate(PhotoCapture captureObject) {

## 2.hologramOpacity の修正
サンプルコード19行目も修正しましょう。

> cameraParameters.hologramOpacity = 0.0f;

Opacityは日本語だと不透明度のこと。
これが0.0fでは完全に透明なため表示できません。
リファレンスによると`This value must be within the range of 0.0 to 1.0.`つまり0.0から1.0の間で指定してねとのことなので、
とりあえず0.9fくらいを入れてからお好みで調整するとよいと思います。

# 補足

自分がコピペして首をひねることになったので、
他にも「さくっと試してみたい！」って人が引っかかったらかわいそうだなと、解説記事を書きました。
なにか突っ込みなどありましたらご指摘ください。
FreeBSDのWiFiドライバー

FreeBSDのWiFiドライバーは2015年にifnetのKernel Programming Interfaceの変更にともない修正が入りました。この修正はリリースバージョンでは11で反映されました。それまではifnetをそれぞれのデバイスが持っていた物をwlanに集約して、それぞれのドライバーからifnetを削除するという修正でした。すべてのWiFiドライバに修正が入っているのでかなり大規模な修正でした。

https://wiki.freebsd.org/projects/ifnet/net80211

この修正でifconfigでWiFiのデバイスが表示されなくなり、代わりにsysctlで確認できるようになりました。

```
# sysctl net.wlan.devices
net.wlan.devices: otus0
```

生のWiFiのデバイスはifではないという考えに基づく変更ではないかと思います。

ちなみにotusは11でサポートされた、AtherosのAR9系WiFiのドライバーです。

wlanを作りwpaコマンドを使うのは従来通りです。

```
# ifconfig wlan0 create wlandev otus0 country JP
# ifconfig wlan0 up scan
```

country JPは/etc/regdomain.xmlに書かれた国毎の設定が反映されます。これを付けなかったり、日本以外を設定すると、いくら技適マークが入ったモジュールを使っていても、電波法違反となりますので注意してください。

アクセスポイント(HOSTAP)に接続する場合(STA)は以下のようにします。

```
# kldload wlan_ccmp wlan_tkip wlan_wep
# wpa_passphrase ssid password > /tmp/wpa.conf
# wpa_supplicant -i wlan0 -c /tmp/wpa.conf
```

これでwlan0にdhclientをするかifconfigで固定アドレスを設定すれば通信できます。

wlan0がどのデバイスで動いているかはifconfigには出てこないので以下で確認できます。

```
# sysctl net.wlan.0.%parent
net.wlan.0.%parent: otus0
```

hostapdを使ったAPも試してみましたが、うまくいきません。以前試したときのようにMac OS X雪豹から接続すると、接続してすぐに切断されてしまいます。Mac OS X側にTimeoutとログが出ているので、なにかが足りないのかもしれません。

よく見かけるWiFiデバイスのリスト

|デバイス|接続|メーカー|チップ|タイプ|備考|
|:--|:--|:--|:--|:--|:--|
|otus|USB|Atheros|AR9170|n|HOSTAPのサポートは無いようです|
|ath|PCI,CardBus|Atheros|AR5212|g||
|uath|USB|Atheros|AR5005UG and AR5005UX|g||
|ral|PCI|Ralink|RT2500, RT2501, RT2600, RT2700, RT2800, RT3090 and RT3900E|g/n|nのサポートは無い|
|ural|USB|Ralink|RT2500USB|g||
|rum|USB|Ralink|RT2501USB and RT2601USB|g||
|run|USB|Ralink|RT2700U, RT2800U, RT3000U and RT3900E|n|対応チップのVersionは、2860, 2872, 3070, 3071, 3572, 3593, 5390, 5392, 5592。|
|bwi|PCI,CardBus|Broadcom|BCM43xx|g|CardBusのモジュールをいくつか持っていますが、エラーが出て使えませんでした|
|bwn|PCI,CardBus|Broadcom|BCM43xx|g||
|rsu|USB|REALTEK|RTL8188SU/RTL8192SU|n||
|rtwn|PCI|REALTEK|RTL8188CE-VAU/RTL8188CUS/RTL8188EU/RTL8188RU/RTL8192CU/RTL8812AU/RTL8821AU|n||
|urtwn|USB|REALTEK|RTL8188CU/RTL8188RU/RTL8188EU/RTL8192CU|n||
|urtw|USB|REALTEK|RTL8187B/L|g||
|zyd|USB|ZyDAS Technology(Atheros)|ZD1211/ZD1211B|b||

最初のFreeBSDのWiFiスタックはNetBSDのものをポートしたようです。オリジナルはWIDEの尾上淳(Atsushi Onoe)さんが作った物ようです。現在のスタックはそれをSam Lefflerさんが作り直した物との事です。

BroadcomのWiFiサポートを作り直す[bhnd](http://landonf.org/code/freebsd/Broadcom_WiFi_Improvements.20180122.html)というPJがあります。

参考

[kismetの使い方](https://qiita.com/yamori813/items/a34860f0bb7c5a344fe4)
∞と0の四則演算

∞と0の関係と四則演算を自己流で解釈します。

##　両者の関係
$$\infty = \frac{r}{0},r \in R, r > 0$$
$$-\infty = \frac{-r}{0},r \in R, r > 0$$

まず、すべての実数$r$に対し、上記の式が成立つ。$\infty * 0$の答えは唯一ではないので、定義できない。

##　四則演算
下記の式に対し、定義はできない。
1. $0/0$
2. $\infty * 0$
3. $\infty - \infty$
4. $\infty / \infty$

説明：
1．$\frac{0}{0} = \frac{0}{r_{1}} / \frac{0}{r_{2}}$
2. $\infty * 0 = \frac{r}{0} * {0}$
3．$\infty - \infty = \frac{r_{1}}{0} - \frac{r_{2}}{0} = \frac{r_{1}-r_{2}}{0}$
4．$\infty / \infty = \frac{r_{1}}{0} / \frac{r_{2}}{0}$

$\frac{a}{a}=1,a=0$のケースを考えよう。$a=0$のとき、$\frac{a}{a}=1$が成立つとしても、1~4の答えも唯一ではないので、定義できない。

ただし、下記の式が成立つ。
1．$\frac{\infty}{0} = \infty$, $\frac{0}{\infty} = 0$.
2．$\infty * \infty = \infty$, $0*0 = 0$.
3．$\infty + \infty = \infty$, $-\infty - \infty = -\infty$.

##冪乗
$\frac{0}{0}$を計算するとき、$\frac{0}{r_{1}} / \frac{0}{r_{2}}$の$\frac{r_{2}}{r_{1}}$が決まらない。
しかし、
${0}^{0} = {0}^{1} * {0}^{-1} = {\frac{0}{r}}^{1} * {\frac{0}{r}}^{-1}$のうち、${\frac{0}{r}}$が同じ$r$を持つことが保証されるので、${0}^{0} = 1$。
その性質を使い、下記の式が成立つ。
1．${\infty}^{0} = {(\frac{r}{0})}^{0} = \frac{{r}^{0}}{{0}^{0}} = 1$.
2．${0}^{\infty} = 0*0*0*\cdots = 0$.
3．${\infty}^{\infty} = \infty*\infty*\infty*\cdots = \infty$.
4．${\infty}^{-\infty} = {0}^{\infty} = 0$.
Xamarin.Forms 3.0 主な更新内容まとめ

# 概要
https://developer.xamarin.com/releases/xamarin-forms/xamarin-forms-3.0/3.0.0/
上記ページの内容をベースに簡単にまとめました  


# FlexLayout
新たに追加されたレイアウト
CSS Flexible Box Layout Module(一般にflex layout, flex-boxと呼ばれる)を基に作成
様々な画面サイズに対応することを優先したい場合に向いている
UIの階層を浅く保ちやすいためパフォーマンスの良い(動作がサクサクの)画面が作りやすい
上下・左右方向にレイアウトできる点に関してはStackLayoutと似ている
子要素の並べ方に多くのオプションがあり、例えば1行/1列に並べるには要素数が多すぎるような場合にWrapプロパティをFlexWrap.Wrapにすることで子要素をラップ表示(端に達したところで折り返して表示)できる点などが特徴
FlexLayoutはLayout\<View\>の派生で、ChildrenプロパティとしてIList\<View\>を持つ

参考：https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/flex-layout


# ResourceDictionaryの改善
ResourceDictionaryのインスタンスが自動生成されるようになったため<ResourceDictionary>タグを明示的に書く必要がなくなった
複数のResourceDictionaryを読み込む場合に<MergedDictionaries>タグが不要となり、ResourceDictionaryに新たに追加されたSourceプロパティでXAMLファイル名を指定したものを列挙するだけで同様のことが可能となった
この方法ではSourceで指定したResourceDictionaryクラスがインスタンス化されることはなくXAMLファイルを参照するのみとなり、従来必要であったコードビハインドファイル(.xaml.cs)が不要となる
同様にx:Class属性も不要となる

参考：https://docs.microsoft.com/en-US/xamarin/xamarin-forms/xaml/resource-dictionaries


# Right to Left対応
iOS:9以上、Android:API17以上である必要がある
右から左に表記する言語への対応がより簡単になる
FlowDirectionプロパティがレイアウト及びテキスト関連のコントロールに追加された
FlowDirectionプロパティはFlowDirection列挙型のLeftToRight, RightToLeft, MatchParentから指定
FlowDirectionプロパティのデフォルト値は親要素のない要素はLeftToRight、親要素のある要素はMatchParentとなるため、全体を一気に変更したい場合はPageか最上位のレイアウトのFlowDirectionのみ変更すればよい
FlowDirectionをRightToLeftにすればUI要素が右寄せになり、文字の方向やコントロールの並び順が右側からとなる
実行時にFlowDirectionを変更するのは負荷が大きいので避けるべき
端末の言語や地域設定に応じたFlowDirectionを取得したい場合はDevice.FlowDirectionを参照する

参考：https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/localization/right-to-left


# スタイルシート
StyleをCSSで指定できる
内部的には従来のXAML+C#での整形用のAPIと同じものを呼び出しているだけなので、従来の方法と全く別物というわけではない
別のCSSファイルからStyleSheetに読み込むか、各ページのResourcesでCSSを定義する
スタイルシートはルールのリストからなる
ルールは1つ以上のセレクタと1つの宣言ブロックからなる
宣言ブロックは中括弧"{}"内に書かれる宣言のリストからなる
宣言は"プロパティ:値"で表される
宣言ブロックが複数の宣言を含む場合、セミコロン";"で各宣言を分割する
スタイルシートはコンパイル時ではなく実行時に解析される
現在のところ、XAMLで指定可能な全てのスタイルがCSSで使用可能なわけではないが、CSSは従来のXAMLでのスタイル指定とも組み合わせて使用可能なので基本的にCSSで指定して未対応部分のみ従来の方法を用いるといったことも可能

参考：https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/styles/css/index


# Visual State Manager(VSM)対応
コードからUIの見た目を変化させる手段を提供する
コントロールが複数の状態を持つことへの対応
XAMLまたはC#内で宣言する
多くのアプリはXAMLでUIを定義しているので、XAML内にVSMがUIの見た目にどう影響を与えるのかを示す記述を加えることとなる場合が多い
例えばButtonなら使用不可・押されている・フォーカスが当たっている、などのvisual stateによってそれぞれ別の見た目を持っている
各状態は互いに排他的(同時に複数の状態が成立することはない)
状態は文字列で表される
Xamarin.FormsのVSMによってCommonStatesというvisual state groupが定義されており、"Normal", "Disabled", "Focused"の3つのvisual stateを含む
CommonStatesはVisualElement(View,Pageの基底)から派生した全クラスでサポートされている
CommonStatesの代わりに独自のvisual state groupやvisual stateの作成が可能

参考：https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/visual-state-manager
VBA学习笔记2


## 变量定义
虽然可以省略类型指定，但是容易造成变量类型前后不一的情况。
所以变量定义的时候要指定变量的类型。

```

例如：

Dim age as byte
Dim name as string

```

## 对象

VBA中主要有以下四种对象类型

|对象对应名          |       对象名 |
|:-----------------:|:-----------------:|
| 应用              |  Application |
| 文件所有单         |     Workbook |
| 单                |    Worksheet |
| 单元格             |       Range |

每个对象的包含关系如下：

```
Application
   └ Workbooks
       └ Worksheet
           └ Range

```
Oracle VirtualBox 二回目

※自分のメモ用に書いています

環境：Windows10

まずvimを最新にしておくために
sudo apt-get -y install vim
を入力しインストールする。

---

次に
sudo apt-get -y install apache2
と入力しapache2をインストール。

sudo /etc/init.d/apache2 start
でapacheを起動する。

---

次に
sudo apt-get -y install php php-mysql libapache2-mod-php libapache2-mpm-itk
でインストール、

sudo vi /etc/php/7.0/apache2/php.ini
で
:set numberで行番号を出し
「extension=msql.so」の前にある「;
」を消し:wqで終了。

後は
sudo /etc/init.d/apache2 restart
で再起動しておく。

---

次に
sudo apt-get -y install mysql-server
でMysqlをインストールする。

パスワードを設定して
mysql -u root -p
でログイン。

途中でEnter PassWordと出るので、先ほど設定したパスワードを入力する。

ログインしたら
create database データベースの名前;
を入力してデータベースを作った後に

exit;で切断、

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
で
:set numberで行番号を出し
bind-address = 127.0.0.1を探しコメントアウト（前に#を付ける）して:wqで終了
sudo /etc/init.d/mysql restart
で再起動する。

---

次に
sudo apt-get -y install samba
でsambaをインストール、

sudo chmod 777 /var/www/html/
で共有するフォルダのパーミッションを変更。

sudo vi /etc/samba/smb.conf
を入力後
:set numberで行番号を出し
[global]の下に
unix charset = UTF-8
dos charset = CP932
を追記、

次に50行目付近にある
interfaces = ...を探し、後ろを
127.0.0.0/8 192.168.0.0/24 192.168.11.0/24 192.168.22.0/24 eth0
に書き換え、

一番下に
[html]
path = /var/www/html
writable = yes
browseable = yes
guest ok = yes
guest only = yes
create mode = 0777
directory mode = 0777
を追記し、:wqで終了して
sudo service smbd restart
で再起動する。

---

次に
sudo apt-get -y install phpmyadmin
でphpMyadminをインストール
webサーバーを選択しMysqlで設定したパスワードを入力、こちらでもパスワード登録しないといけないので設定する。

次に
sudo vi /etc/phpmyadmin/apache.conf
と入力して:set numberで行番号を出し
8行目あたりに
Require ip 127.0.0.1 10.0.0.0/24 192.168.0.0/24 192.168.23.0/24
を追記して、アクセス権を設定。

Apacheからアクセスできるように
 sudo ln -s /etc/phpmyadmin/apache.conf /etc/apache2/conf-available/phpmyadmin.conf
と
sudo a2enconf phpmyadmin
でシンボリックリンクを作成。

sudo service apache2 reload
でリロードし、

sudo /etc/init.d/apache2 restart
再起動する。

その後ブラウザで
http://の後に、IPアドレス/phpmyadmin/
でアクセスして使えるか確認する。
Linuxの簡単なディレクトリ操作の用語　etc...

#はじめに
このブログは授業で受けた内容のまとめや感想などを書いています。

今回はLinuxに関しての記事になります。


#今日習ったもの


```
用語
・絶対パス
・相対パス
・ディレクトリ
・カレントディレクトリ

ディレクトリを操作するためのコマンド
　・pwd
　・ls
　・cd
　・cp
```

#用語
###**絶対パス**：パスをルートから順にたどっていく指定方法
####例　：　**/home/ユーザー名/フォルダ名**
---
###**相対パス**：カレントディレクトリから目的のファイルを相対的に指定する方法
####例：sample **(ディレクトリ名)** /sample.txt **(ファイル名)**
####一つ上のディレクトリを指す･･･**(../)**
####現在のディレクトリを指す･･･**(./)**
####例： **cd ../sample(ディレクトリ名)**
####　　 **cd ./work(ディレクトリ名)/ファイル名**

---

###**ディレクトリ**：簡単に言うとフォルダのことです。
　　　　　　　**ストレージのファイルシステムなどで、複数のファイルを格納できる保管場
　　　　　　　所のことをディレクトリといいます。**
　　　　　　　**※**ファイルやディレクトリ作成時、**スペースを使うのは好ましくない。**
　　　　　　　どうしても区切りをつけたい場合、アンダースコア→＿
　　　　　　　を使う

---
###**カレントディレクトリ**：現在自分がいるディレクトリのことを示す。

---
#ディレクトリを操作するためのコマンド

###**pwd**：現在のカレントディレクトリを表示するコマンド
###使用例

```
lightbox@pc27-VirtualBox:~$ pwd (入力後Enter)
/home/lightbox
```

現在どこにいるのか表示してくれるので、どこにいるかわからなくなった時に便利です

---

###**ls**：ディレクトリの一覧を表示するコマンド
###使用例

```
lightbox@pc27-VirtualBox:~/work$ ls (入力後Enter)
NEW  NEW Pics  sample2.txt  sample3.txt  sample4.txt  sample5.txt

```

このような感じでディレクトリの中身が見れます

---

###**cd**：ディレクトリを移動するコマンド
###使用例

```
lightbox@pc27-VirtualBox:~$ ls (入力後Enter)
Pics  sample  test  work  ダウンロード  テンプレート  デスクトップ  ドキュメント  ビデオ  ピクチャ  ミュージック  公開
lightbox@pc27-VirtualBox:~$ cd test (入力後Enter)
lightbox@pc27-VirtualBox:~/test$
```

説明通りで、ディレクトリの移動です。

---

###**cp**:ファイルをコピーする

###使用例

```
lightbox@pc27-VirtualBox:~/work$ cp  sample2.txt ../sample/test.txt(入力後Enter)
lightbox@pc27-VirtualBox:~/work$ cd(入力後Enter)
lightbox@pc27-VirtualBox:~$ cd sample(入力後Enter)
lightbox@pc27-VirtualBox:~/sample$ ls(入力後Enter)
sample.txt  sample2.txt  test.txt
```

ファイルの名前を変えることもできます。

---

#最後に
簡単な内容ばっかりですが、しっかり使いこなせるようにしたいので、勉強します( ﾟДﾟ)
なので温かい目で見守っていてください( ;∀;)
VirtualboxでUbuntuにGuest AdditionsをインストールしたらVBoxClient (seamless): failed to startエラーが...

<h1>VERR_INTERNAL_ERROR</h1>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249283/261925cf-e1cc-c95f-945f-23c2a1487cf3.png)
日本語訳したらVBoxClient（シームレス）：開始に失敗しました。ステージ：ゲストIRQフィルタの設定エラーってでました。
これの解決する方法だったんですけど必要なライブラリをインストールをしないといけなかったです。

・gcc
・make
・perl

$ sudo apt install gcc make perl -y

後はGuest Additionsを再インストールして再起動すれば終わりとのことです。